Add more operators, another test, and reorganize per Table 51 in the spec.
This commit is contained in:
		
							parent
							
								
									c46faf9e76
								
							
						
					
					
						commit
						229043c15d
					
				
							
								
								
									
										157
									
								
								pdf.js
									
									
									
									
									
								
							
							
						
						
									
										157
									
								
								pdf.js
									
									
									
									
									
								
							@ -658,22 +658,60 @@ var Interpreter = (function() {
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        dispatch: function(cmdObj, args) {
 | 
					        dispatch: function(cmdObj, args) {
 | 
				
			||||||
            this.getAndCheckCmd(cmdObj, args).apply(
 | 
					            var fnName = this.getAndCheckCmd(cmdObj, args);
 | 
				
			||||||
                this, args.map(function(o) o.value));
 | 
					            this.gfx[fnName].apply(this.gfx, args.map(function(o) o.value));
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        getAndCheckCmd: function(cmdObj, args) {
 | 
					        getAndCheckCmd: function(cmdObj, args) {
 | 
				
			||||||
            const CMD_TABLE = {
 | 
					            const CMD_TABLE = {
 | 
				
			||||||
                // Text commands
 | 
					                // Graphics state
 | 
				
			||||||
 | 
					                "w" : { fn: "setLineWidth",
 | 
				
			||||||
 | 
					                        params: [ "Num" ] },
 | 
				
			||||||
 | 
					                "d" : { fn: "setDash",
 | 
				
			||||||
 | 
					                        params: [ "Array", "Num" ] },
 | 
				
			||||||
 | 
					                "q" : { fn: "save",
 | 
				
			||||||
 | 
					                        params: [ ] },
 | 
				
			||||||
 | 
					                "Q" : { fn: "restore",
 | 
				
			||||||
 | 
					                        params: [ ] },
 | 
				
			||||||
 | 
					                // Path
 | 
				
			||||||
 | 
					                "m" : { fn: "moveTo",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num" ] },
 | 
				
			||||||
 | 
					                "l" : { fn: "lineTo",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num" ] },
 | 
				
			||||||
 | 
					                "c" : { fn: "curveTo",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num", "Num", "Num", "Num", "Num" ] },
 | 
				
			||||||
 | 
					                "re": { fn: "rectangle",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num", "Num", "Num" ] },
 | 
				
			||||||
 | 
					                "S" : { fn: "stroke",
 | 
				
			||||||
 | 
					                        params: [ ] },
 | 
				
			||||||
 | 
					                "B" : { fn: "fillStroke",
 | 
				
			||||||
 | 
					                        params: [ ] },
 | 
				
			||||||
 | 
					                "b" : { fn: "closeFillStroke",
 | 
				
			||||||
 | 
					                        params: [ ] },
 | 
				
			||||||
 | 
					                // Clipping
 | 
				
			||||||
 | 
					                // Text
 | 
				
			||||||
                "BT": { fn: "beginText",
 | 
					                "BT": { fn: "beginText",
 | 
				
			||||||
                        params: [ ] },
 | 
					                        params: [ ] },
 | 
				
			||||||
                "ET": { fn: "endText", 
 | 
					                "ET": { fn: "endText", 
 | 
				
			||||||
                        params: [ ] },
 | 
					                        params: [ ] },
 | 
				
			||||||
                "Td": { fn: "moveText",
 | 
					 | 
				
			||||||
                        params: [ "Num", "Num" ] },
 | 
					 | 
				
			||||||
                "Tf": { fn: "setFont",
 | 
					                "Tf": { fn: "setFont",
 | 
				
			||||||
                        params: [ "Name", "Num" ] },
 | 
					                        params: [ "Name", "Num" ] },
 | 
				
			||||||
 | 
					                "Td": { fn: "moveText",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num" ] },
 | 
				
			||||||
                "Tj": { fn: "showText",
 | 
					                "Tj": { fn: "showText",
 | 
				
			||||||
                        params: [ "String" ] },
 | 
					                        params: [ "String" ] },
 | 
				
			||||||
 | 
					                // Type3 fonts
 | 
				
			||||||
 | 
					                // Color
 | 
				
			||||||
 | 
					                "g" : { fn: "setFillGray",
 | 
				
			||||||
 | 
					                        params: [ "Num" ] },
 | 
				
			||||||
 | 
					                "RG": { fn: "setStrokeRGBColor",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num", "Num" ] },
 | 
				
			||||||
 | 
					                "rg": { fn: "setFillRGBColor",
 | 
				
			||||||
 | 
					                        params: [ "Num", "Num", "Num" ] },
 | 
				
			||||||
 | 
					                // Shading
 | 
				
			||||||
 | 
					                // Images
 | 
				
			||||||
 | 
					                // XObjects
 | 
				
			||||||
 | 
					                // Marked content
 | 
				
			||||||
 | 
					                // Compatibility
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var cmdName = cmdObj.value
 | 
					            var cmdName = cmdObj.value
 | 
				
			||||||
@ -684,29 +722,14 @@ var Interpreter = (function() {
 | 
				
			|||||||
                this.error("Wrong arguments for command '"+ cmdName +"'");
 | 
					                this.error("Wrong arguments for command '"+ cmdName +"'");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return this[cmd.fn];
 | 
					            return cmd.fn;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        typeCheck: function(cmd, args) {
 | 
					        typeCheck: function(cmd, args) {
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        error: function(what) {
 | 
				
			||||||
        // Text commands
 | 
					            throw new Error(what);
 | 
				
			||||||
        beginText: function() {
 | 
					 | 
				
			||||||
            this.gfx.beginText();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        endText: function() {
 | 
					 | 
				
			||||||
            this.gfx.endText();
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        moveText: function(x, y) {
 | 
					 | 
				
			||||||
            this.gfx.moveText(x, y);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        setFont: function(font, size) {
 | 
					 | 
				
			||||||
            // lookup font
 | 
					 | 
				
			||||||
            this.gfx.setFont(font, size);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        showText: function(text) {
 | 
					 | 
				
			||||||
            this.gfx.showText(text);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return constructor;
 | 
					    return constructor;
 | 
				
			||||||
@ -721,6 +744,12 @@ var EchoGraphics = (function() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    constructor.prototype = {
 | 
					    constructor.prototype = {
 | 
				
			||||||
        // Graphics state
 | 
					        // Graphics state
 | 
				
			||||||
 | 
					        setLineWidth: function(width) {
 | 
				
			||||||
 | 
					            this.printdentln(width +" w");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        setDash: function(dashArray, dashPhase) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ dashArray +" "+ dashPhase +" d");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        save: function() {
 | 
					        save: function() {
 | 
				
			||||||
            this.printdentln("q");
 | 
					            this.printdentln("q");
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@ -728,11 +757,42 @@ var EchoGraphics = (function() {
 | 
				
			|||||||
            this.printdentln("Q");
 | 
					            this.printdentln("Q");
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Path
 | 
				
			||||||
 | 
					        moveTo: function(x, y) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ x +" "+ y +" m");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        lineTo: function(x, y) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ x +" "+ y +" l");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        curveTo: function(x1, y1, x2, y2, x3, y3) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ x1 +" "+ y1 +
 | 
				
			||||||
 | 
					                             " "+ x2 +" "+ y2 +
 | 
				
			||||||
 | 
					                             " "+ x3 +" "+ y3 + " c");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        rectangle: function(x, y, width, height) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ x +" "+ y + " "+ width +" "+ height +" re");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        stroke: function() {
 | 
				
			||||||
 | 
					            this.printdentln("S");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        fillStroke: function() {
 | 
				
			||||||
 | 
					            this.printdentln("B");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        closeFillStroke: function() {
 | 
				
			||||||
 | 
					            this.printdentln("b");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clipping
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Text
 | 
					        // Text
 | 
				
			||||||
        beginText: function() {
 | 
					        beginText: function() {
 | 
				
			||||||
            this.printdentln("BT");
 | 
					            this.printdentln("BT");
 | 
				
			||||||
            this.indent();
 | 
					            this.indent();
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        endText: function() {
 | 
				
			||||||
 | 
					            this.dedent();
 | 
				
			||||||
 | 
					            this.printdentln("ET");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        setFont: function(font, sizePt) {
 | 
					        setFont: function(font, sizePt) {
 | 
				
			||||||
            this.printdentln("/"+ font +" "+ sizePt +" Tf");
 | 
					            this.printdentln("/"+ font +" "+ sizePt +" Tf");
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@ -742,10 +802,25 @@ var EchoGraphics = (function() {
 | 
				
			|||||||
        showText: function(text) {
 | 
					        showText: function(text) {
 | 
				
			||||||
            this.printdentln("( "+ text +" ) Tj");
 | 
					            this.printdentln("( "+ text +" ) Tj");
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        endText: function() {
 | 
					
 | 
				
			||||||
            this.dedent();
 | 
					        // Type3 fonts
 | 
				
			||||||
            this.printdentln("ET");
 | 
					
 | 
				
			||||||
 | 
					        // Color
 | 
				
			||||||
 | 
					        setFillGray: function(gray) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ gray +" g");
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        setStrokeRGBColor: function(r, g, b) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ r +" "+ g +" "+ b +" RG");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        setFillRGBColor: function(r, g, b) {
 | 
				
			||||||
 | 
					            this.printdentln(""+ r +" "+ g +" "+ b +" rg");
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Shading
 | 
				
			||||||
 | 
					        // Images
 | 
				
			||||||
 | 
					        // XObjects
 | 
				
			||||||
 | 
					        // Marked content
 | 
				
			||||||
 | 
					        // Compatibility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Output state
 | 
					        // Output state
 | 
				
			||||||
        print: function(str) {
 | 
					        print: function(str) {
 | 
				
			||||||
@ -818,6 +893,7 @@ var CanvasGraphics = (function() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor.prototype = {
 | 
					    constructor.prototype = {
 | 
				
			||||||
 | 
					        // Graphics state
 | 
				
			||||||
        save: function() {
 | 
					        save: function() {
 | 
				
			||||||
            this.ctx.save();
 | 
					            this.ctx.save();
 | 
				
			||||||
            this.stateStack.push(this.current);
 | 
					            this.stateStack.push(this.current);
 | 
				
			||||||
@ -858,6 +934,8 @@ function runEchoTests() {
 | 
				
			|||||||
    function int(i)     { return new Obj(Obj.Int, i); }
 | 
					    function int(i)     { return new Obj(Obj.Int, i); }
 | 
				
			||||||
    function string(s)  { return new Obj(Obj.String, s); }
 | 
					    function string(s)  { return new Obj(Obj.String, s); }
 | 
				
			||||||
    function eof()      { return new Obj(Obj.EOF); }
 | 
					    function eof()      { return new Obj(Obj.EOF); }
 | 
				
			||||||
 | 
					    function array(a)   { return new Obj(Obj.Array, a); }
 | 
				
			||||||
 | 
					    function real(r)    { return new Obj(Obj.Real, r); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var tests = [
 | 
					    var tests = [
 | 
				
			||||||
        { name: "Hello world",
 | 
					        { name: "Hello world",
 | 
				
			||||||
@ -870,6 +948,33 @@ function runEchoTests() {
 | 
				
			|||||||
              eof()
 | 
					              eof()
 | 
				
			||||||
          ]
 | 
					          ]
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        { name: "Simple graphics",
 | 
				
			||||||
 | 
					          objs: [
 | 
				
			||||||
 | 
					              int(150), int(250), cmd("m"),
 | 
				
			||||||
 | 
					              int(150), int(350), cmd("l"),
 | 
				
			||||||
 | 
					              cmd("S"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              int(4), cmd("w"),
 | 
				
			||||||
 | 
					              array([int(4), int(6)]), int(0), cmd("d"),
 | 
				
			||||||
 | 
					              int(150), int(250), cmd("m"),
 | 
				
			||||||
 | 
					              int(400), int(250), cmd("l"),
 | 
				
			||||||
 | 
					              cmd("S"),
 | 
				
			||||||
 | 
					              array([]), int(0), cmd("d"),
 | 
				
			||||||
 | 
					              int(1), cmd("w"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              real(1.0), real(0.0), real(0.0), cmd("RG"),
 | 
				
			||||||
 | 
					              real(0.5), real(0.75), real(1.0), cmd("rg"),
 | 
				
			||||||
 | 
					              int(200), int(300), int(50), int(75), cmd("re"),
 | 
				
			||||||
 | 
					              cmd("B"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              real(0.5), real(0.1), real(0.2), cmd("RG"),
 | 
				
			||||||
 | 
					              real(0.7), cmd("g"),
 | 
				
			||||||
 | 
					              int(300), int(300), cmd("m"),
 | 
				
			||||||
 | 
					              int(300), int(400), int(400), int(400), int(400), int(300), cmd("c"),
 | 
				
			||||||
 | 
					              cmd("b"),
 | 
				
			||||||
 | 
					              eof()
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tests.forEach(function(test) {
 | 
					    tests.forEach(function(test) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user