Indirect ops so that they can access interpreter state
This commit is contained in:
parent
07119364fc
commit
e464d31d18
162
pdf.js
162
pdf.js
@ -655,55 +655,100 @@ var Interpreter = (function() {
|
|||||||
const MAX_ARGS = 33;
|
const MAX_ARGS = 33;
|
||||||
const CMD_TABLE = {
|
const CMD_TABLE = {
|
||||||
// Graphics state
|
// Graphics state
|
||||||
"w" : { fn: "setLineWidth",
|
w : { params: [ "Num" ],
|
||||||
params: [ "Num" ] },
|
op: function(args) {
|
||||||
"d" : { fn: "setDash",
|
this.gfx.setLineWidth(args[0]);
|
||||||
params: [ "Array", "Num" ] },
|
} },
|
||||||
"q" : { fn: "save",
|
d : { params: [ "Array", "Num" ],
|
||||||
params: [ ] },
|
op: function(args) {
|
||||||
"Q" : { fn: "restore",
|
this.gfx.setDash(args[0], args[1]);
|
||||||
params: [ ] },
|
} },
|
||||||
"cm": { fn: "transform",
|
q : { params: [ ],
|
||||||
params: [ "Num", "Num", "Num", "Num", "Num", "Num" ] },
|
op: function(args) {
|
||||||
|
this.gfx.save();
|
||||||
|
} },
|
||||||
|
Q : { params: [ ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.restore();
|
||||||
|
} },
|
||||||
|
cm: { params: [ "Num", "Num", "Num", "Num", "Num", "Num" ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.transform(args[0], args[1], args[2], args[3], args[4], args[5]);
|
||||||
|
} },
|
||||||
// Path
|
// Path
|
||||||
"m" : { fn: "moveTo",
|
m : { params: [ "Num", "Num" ],
|
||||||
params: [ "Num", "Num" ] },
|
op: function(args) {
|
||||||
"l" : { fn: "lineTo",
|
this.gfx.moveTo(args[0], args[1]);
|
||||||
params: [ "Num", "Num" ] },
|
} },
|
||||||
"c" : { fn: "curveTo",
|
l : { params: [ "Num", "Num" ],
|
||||||
params: [ "Num", "Num", "Num", "Num", "Num", "Num" ] },
|
op: function(args) {
|
||||||
"h" : { fn: "closePath",
|
this.gfx.lineTo(args[0], args[1]);
|
||||||
params: [ ] },
|
} },
|
||||||
"re": { fn: "rectangle",
|
c : { params: [ "Num", "Num", "Num", "Num", "Num", "Num" ],
|
||||||
params: [ "Num", "Num", "Num", "Num" ] },
|
op: function(args) {
|
||||||
"S" : { fn: "stroke",
|
this.gfx.curveTo(args[0], args[1], args[2], args[3], args[4], args[5]);
|
||||||
params: [ ] },
|
} },
|
||||||
"f" : { fn: "fill",
|
h : { params: [ ],
|
||||||
params: [ ] },
|
op: function(args) {
|
||||||
"B" : { fn: "fillStroke",
|
this.gfx.closePath();
|
||||||
params: [ ] },
|
} },
|
||||||
"b" : { fn: "closeFillStroke",
|
re: { params: [ "Num", "Num", "Num", "Num" ],
|
||||||
params: [ ] },
|
op: function(args) {
|
||||||
|
this.gfx.rectangle(args[0], args[1], args[2], args[3]);
|
||||||
|
} },
|
||||||
|
S : { params: [ ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.stroke();
|
||||||
|
} },
|
||||||
|
f : { params: [ ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.fill();
|
||||||
|
} },
|
||||||
|
B : { params: [ ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.fillStroke();
|
||||||
|
} },
|
||||||
|
b : { params: [ ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.closeFillStroke();
|
||||||
|
} },
|
||||||
// Clipping
|
// Clipping
|
||||||
// Text
|
// Text
|
||||||
"BT": { fn: "beginText",
|
BT: { params: [ ],
|
||||||
params: [ ] },
|
op: function(args) {
|
||||||
"ET": { fn: "endText",
|
this.gfx.beginText();
|
||||||
params: [ ] },
|
} },
|
||||||
"Tf": { fn: "setFont",
|
ET: { params: [ ],
|
||||||
params: [ "Name", "Num" ] },
|
op: function(args) {
|
||||||
"Td": { fn: "moveText",
|
this.gfx.endText();
|
||||||
params: [ "Num", "Num" ] },
|
} },
|
||||||
"Tj": { fn: "showText",
|
Tf: { params: [ "Name", "Num" ],
|
||||||
params: [ "String" ] },
|
op: function(args) {
|
||||||
|
var font = args[0] // XXX look up
|
||||||
|
this.gfx.setFont(font, args[1]);
|
||||||
|
} },
|
||||||
|
Td: { params: [ "Num", "Num" ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.moveText(args[0], args[1]);
|
||||||
|
} },
|
||||||
|
Tj: { params: [ "String" ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.showText(args[0]);
|
||||||
|
} },
|
||||||
// Type3 fonts
|
// Type3 fonts
|
||||||
// Color
|
// Color
|
||||||
"g" : { fn: "setFillGray",
|
g : { params: [ "Num" ],
|
||||||
params: [ "Num" ] },
|
op: function(args) {
|
||||||
"RG": { fn: "setStrokeRGBColor",
|
this.gfx.setFillGray(args[0]);
|
||||||
params: [ "Num", "Num", "Num" ] },
|
} },
|
||||||
"rg": { fn: "setFillRGBColor",
|
RG: { params: [ "Num", "Num", "Num" ],
|
||||||
params: [ "Num", "Num", "Num" ] },
|
op: function(args) {
|
||||||
|
this.gfx.setStrokeRGBColor(args[0], args[1], args[2]);
|
||||||
|
} },
|
||||||
|
rg: { params: [ "Num", "Num", "Num" ],
|
||||||
|
op: function(args) {
|
||||||
|
this.gfx.setFillRGBColor(args[0], args[1], args[2]);
|
||||||
|
} },
|
||||||
// Shading
|
// Shading
|
||||||
// Images
|
// Images
|
||||||
// XObjects
|
// XObjects
|
||||||
@ -720,7 +765,15 @@ var Interpreter = (function() {
|
|||||||
var obj;
|
var obj;
|
||||||
while (!((obj = parser.getObj()).isEOF())) {
|
while (!((obj = parser.getObj()).isEOF())) {
|
||||||
if (obj.isCmd()) {
|
if (obj.isCmd()) {
|
||||||
this.dispatch(obj, args);
|
var cmd = obj.value;
|
||||||
|
if (!(cmd in CMD_TABLE))
|
||||||
|
this.error("Unknown command '"+ cmd +"'");
|
||||||
|
|
||||||
|
var op = CMD_TABLE[cmd];
|
||||||
|
if (!this.typeCheck(op.params, args))
|
||||||
|
this.error("Wrong arguments for command '"+ cmd +"'");
|
||||||
|
|
||||||
|
op.op.call(this, args.map(function (a) a.lowerToJS()));
|
||||||
args.length = 0;
|
args.length = 0;
|
||||||
} else if (MAX_ARGS == args.length) {
|
} else if (MAX_ARGS == args.length) {
|
||||||
this.error("Too many arguments");
|
this.error("Too many arguments");
|
||||||
@ -729,25 +782,6 @@ var Interpreter = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
dispatch: function(cmdObj, args) {
|
|
||||||
var fnName = this.getAndCheckCmd(cmdObj, args);
|
|
||||||
if (!(fnName in this.gfx))
|
|
||||||
this.error("Unimplemented function '"+ fnName +"'");
|
|
||||||
this.gfx[fnName].apply(this.gfx,
|
|
||||||
args.map(function(o) o.lowerToJS()));
|
|
||||||
},
|
|
||||||
getAndCheckCmd: function(cmdObj, args) {
|
|
||||||
var cmdName = cmdObj.value
|
|
||||||
var cmd = CMD_TABLE[cmdName];
|
|
||||||
if (!cmd) {
|
|
||||||
this.error("Unknown command '"+ cmdName +"'");
|
|
||||||
} else if (!this.typeCheck(cmd.params, args)) {
|
|
||||||
this.error("Wrong arguments for command '"+ cmdName +"'");
|
|
||||||
}
|
|
||||||
|
|
||||||
return cmd.fn;
|
|
||||||
},
|
|
||||||
typeCheck: function(params, args) {
|
typeCheck: function(params, args) {
|
||||||
if (params.length != args.length)
|
if (params.length != args.length)
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user