Lazify OP_MAP.

This commit is contained in:
Yury Delendik 2016-01-21 16:43:27 -06:00
parent 1de90454b7
commit d6adf84159

View File

@ -61,6 +61,7 @@ var info = sharedUtil.info;
var isArray = sharedUtil.isArray; var isArray = sharedUtil.isArray;
var isNum = sharedUtil.isNum; var isNum = sharedUtil.isNum;
var isString = sharedUtil.isString; var isString = sharedUtil.isString;
var getLookupTableFactory = sharedUtil.getLookupTableFactory;
var warn = sharedUtil.warn; var warn = sharedUtil.warn;
var Dict = corePrimitives.Dict; var Dict = corePrimitives.Dict;
var Name = corePrimitives.Name; var Name = corePrimitives.Name;
@ -2336,119 +2337,121 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
// //
// If variableArgs === true: [0, `numArgs`] expected // If variableArgs === true: [0, `numArgs`] expected
// If variableArgs === false: exactly `numArgs` expected // If variableArgs === false: exactly `numArgs` expected
var OP_MAP = { var getOPMap = getLookupTableFactory(function (t) {
// Graphic state // Graphic state
w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }, t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false };
J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false }, t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false };
j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }, t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false };
M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }, t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false };
d: { id: OPS.setDash, numArgs: 2, variableArgs: false }, t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false };
ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }, t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false };
i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false }, t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false };
gs: { id: OPS.setGState, numArgs: 1, variableArgs: false }, t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false };
q: { id: OPS.save, numArgs: 0, variableArgs: false }, t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false };
Q: { id: OPS.restore, numArgs: 0, variableArgs: false }, t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false };
cm: { id: OPS.transform, numArgs: 6, variableArgs: false }, t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false };
// Path // Path
m: { id: OPS.moveTo, numArgs: 2, variableArgs: false }, t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false };
l: { id: OPS.lineTo, numArgs: 2, variableArgs: false }, t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false };
c: { id: OPS.curveTo, numArgs: 6, variableArgs: false }, t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false };
v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false }, t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false };
y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false }, t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false };
h: { id: OPS.closePath, numArgs: 0, variableArgs: false }, t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false };
re: { id: OPS.rectangle, numArgs: 4, variableArgs: false }, t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false };
S: { id: OPS.stroke, numArgs: 0, variableArgs: false }, t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false };
s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false }, t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false };
f: { id: OPS.fill, numArgs: 0, variableArgs: false }, t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false };
F: { id: OPS.fill, numArgs: 0, variableArgs: false }, t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false };
'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false }, t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false };
B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false }, t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false };
'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }, t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false };
b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }, t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false };
'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }, t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false };
n: { id: OPS.endPath, numArgs: 0, variableArgs: false }, t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false };
// Clipping // Clipping
W: { id: OPS.clip, numArgs: 0, variableArgs: false }, t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false };
'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false }, t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false };
// Text // Text
BT: { id: OPS.beginText, numArgs: 0, variableArgs: false }, t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false };
ET: { id: OPS.endText, numArgs: 0, variableArgs: false }, t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false };
Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }, t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false };
Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }, t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false };
Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false }, t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false };
TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false }, t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false };
Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false }, t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false };
Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }, t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false };
Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false }, t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false };
Td: { id: OPS.moveText, numArgs: 2, variableArgs: false }, t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false };
TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }, t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false };
Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }, t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false };
'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false }, t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false };
Tj: { id: OPS.showText, numArgs: 1, variableArgs: false }, t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false };
TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }, t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false };
'\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }, t['\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false };
'"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3, t['"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3,
variableArgs: false }, variableArgs: false };
// Type3 fonts // Type3 fonts
d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }, t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false };
d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false }, t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6,
variableArgs: false };
// Color // Color
CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }, t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false };
cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }, t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false };
SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }, t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true };
SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }, t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true };
sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true }, t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true };
scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }, t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true };
G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }, t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false };
g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false }, t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false };
RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }, t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false };
rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }, t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false };
K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }, t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false };
k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }, t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false };
// Shading // Shading
sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false }, t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false };
// Images // Images
BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }, t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false };
ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false }, t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false };
EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }, t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false };
// XObjects // XObjects
Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false }, t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false };
MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false }, t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false };
DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false }, t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false };
BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }, t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false };
BDC: { id: OPS.beginMarkedContentProps, numArgs: 2, t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2,
variableArgs: false }, variableArgs: false };
EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }, t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false };
// Compatibility // Compatibility
BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false }, t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false };
EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false }, t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false };
// (reserved partial commands for the lexer) // (reserved partial commands for the lexer)
BM: null, t['BM'] = null;
BD: null, t['BD'] = null;
'true': null, t['true'] = null;
fa: null, t['fa'] = null;
fal: null, t['fal'] = null;
fals: null, t['fals'] = null;
'false': null, t['false'] = null;
nu: null, t['nu'] = null;
nul: null, t['nul'] = null;
'null': null t['null'] = null;
}; });
function EvaluatorPreprocessor(stream, xref, stateManager) { function EvaluatorPreprocessor(stream, xref, stateManager) {
// TODO(mduan): pass array of knownCommands rather than OP_MAP this.opMap = getOPMap();
// TODO(mduan): pass array of knownCommands rather than this.opMap
// dictionary // dictionary
this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref); this.parser = new Parser(new Lexer(stream, this.opMap), false, xref);
this.stateManager = stateManager; this.stateManager = stateManager;
this.nonProcessedArgs = []; this.nonProcessedArgs = [];
} }
@ -2486,7 +2489,7 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
if (isCmd(obj)) { if (isCmd(obj)) {
var cmd = obj.cmd; var cmd = obj.cmd;
// Check that the command is valid // Check that the command is valid
var opSpec = OP_MAP[cmd]; var opSpec = this.opMap[cmd];
if (!opSpec) { if (!opSpec) {
warn('Unknown command "' + cmd + '"'); warn('Unknown command "' + cmd + '"');
continue; continue;