class Origami::PDF::Instruction
def get_operands(operator)
def get_operands(operator) @insns[operator][:operands] end
def get_render_proc(operator)
def get_render_proc(operator) @insns[operator][:render] end
def has_op?(operator)
def has_op?(operator) @insns.has_key? operator end
def initialize(operator, *operands)
def initialize(operator, *operands) @operator = operator @operands = operands.map!{|arg| arg.is_a?(Origami::Object) ? arg.value : arg} if self.class.has_op?(operator) opdef = self.class.get_operands(operator) if not opdef.include?('*') and opdef.size != operands.size raise InvalidPDFInstructionError, "Numbers of operands mismatch for #{operator}: #{operands.inspect}" end end end
def insn(operator, *operands, &render_proc)
def insn(operator, *operands, &render_proc) @insns[operator] = {} @insns[operator][:operands] = operands @insns[operator][:render] = render_proc || lambda{} end
def parse(stream)
def parse(stream) operands = [] while type = Object.typeof(stream, true) operands.push type.parse(stream) end if not stream.eos? if stream.scan(/(?<operator>[[:graph:]&&[^\[\]<>()%\/]]+)/).nil? raise InvalidPDFInstructionError, "Operator: #{(stream.peek(10) + '...').inspect}" end operator = stream['operator'] PDF::Instruction.new(operator, *operands) else unless operands.empty? raise InvalidPDFInstructionError, "No operator given for operands: #{operands.map(&:to_s).join(' ')}" end end end
def render(canvas)
def render(canvas) self.class.get_render_proc(@operator)[canvas, *@operands] self end
def to_s
def to_s "#{operands.map{|op| op.to_o.to_s}.join(' ')}#{' ' unless operands.empty?}#{operator}\n" end