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