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