|
|
@ -540,7 +540,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
|
|
|
|
|
|
|
|
var promise = new Promise(); |
|
|
|
var promise = new Promise(); |
|
|
|
var args = []; |
|
|
|
var args = []; |
|
|
|
nextOp: |
|
|
|
|
|
|
|
while (true) { |
|
|
|
while (true) { |
|
|
|
|
|
|
|
|
|
|
|
var obj = parser.getObj(); |
|
|
|
var obj = parser.getObj(); |
|
|
@ -584,98 +583,113 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
|
|
|
|
|
|
|
|
// TODO figure out how to type-check vararg functions
|
|
|
|
// TODO figure out how to type-check vararg functions
|
|
|
|
|
|
|
|
|
|
|
|
if ((cmd == 'SCN' || cmd == 'scn') && |
|
|
|
switch (fn) { |
|
|
|
!args[args.length - 1].code) { |
|
|
|
case OPS.setStrokeColorN: |
|
|
|
// compile tiling patterns
|
|
|
|
case OPS.setFillColorN: |
|
|
|
var patternName = args[args.length - 1]; |
|
|
|
if (args[args.length - 1].code) { |
|
|
|
// SCN/scn applies patterns along with normal colors
|
|
|
|
break; |
|
|
|
var pattern; |
|
|
|
|
|
|
|
if (isName(patternName) && |
|
|
|
|
|
|
|
(pattern = patterns.get(patternName.name))) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var dict = isStream(pattern) ? pattern.dict : pattern; |
|
|
|
|
|
|
|
var typeNum = dict.get('PatternType'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (typeNum == TILING_PATTERN) { |
|
|
|
|
|
|
|
self.handleTilingType(fn, args, resources, pattern, dict, |
|
|
|
|
|
|
|
operatorList); |
|
|
|
|
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} else if (typeNum == SHADING_PATTERN) { |
|
|
|
|
|
|
|
var shading = dict.get('Shading'); |
|
|
|
|
|
|
|
var matrix = dict.get('Matrix'); |
|
|
|
|
|
|
|
var pattern = Pattern.parseShading(shading, matrix, xref, |
|
|
|
|
|
|
|
resources); |
|
|
|
|
|
|
|
args = pattern.getIR(); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
error('Unkown PatternType ' + typeNum); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// compile tiling patterns
|
|
|
|
} else if (cmd == 'Do' && !args[0].code) { |
|
|
|
var patternName = args[args.length - 1]; |
|
|
|
// eagerly compile XForm objects
|
|
|
|
// SCN/scn applies patterns along with normal colors
|
|
|
|
var name = args[0].name; |
|
|
|
var pattern; |
|
|
|
var xobj = xobjs.get(name); |
|
|
|
if (isName(patternName) && |
|
|
|
if (xobj) { |
|
|
|
(pattern = patterns.get(patternName.name))) { |
|
|
|
assertWellFormed( |
|
|
|
|
|
|
|
isStream(xobj), 'XObject should be a stream'); |
|
|
|
var dict = isStream(pattern) ? pattern.dict : pattern; |
|
|
|
|
|
|
|
var typeNum = dict.get('PatternType'); |
|
|
|
var type = xobj.dict.get('Subtype'); |
|
|
|
|
|
|
|
assertWellFormed( |
|
|
|
if (typeNum == TILING_PATTERN) { |
|
|
|
isName(type), |
|
|
|
self.handleTilingType(fn, args, resources, pattern, dict, |
|
|
|
'XObject should have a Name subtype' |
|
|
|
operatorList); |
|
|
|
); |
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
if ('Form' == type.name) { |
|
|
|
} else if (typeNum == SHADING_PATTERN) { |
|
|
|
self.buildFormXObject(resources, xobj, null, operatorList); |
|
|
|
var shading = dict.get('Shading'); |
|
|
|
args = []; |
|
|
|
var matrix = dict.get('Matrix'); |
|
|
|
continue; |
|
|
|
var pattern = Pattern.parseShading(shading, matrix, xref, |
|
|
|
} else if ('Image' == type.name) { |
|
|
|
resources); |
|
|
|
self.buildPaintImageXObject(resources, xobj, false, |
|
|
|
args = pattern.getIR(); |
|
|
|
operatorList); |
|
|
|
} else { |
|
|
|
args = []; |
|
|
|
error('Unkown PatternType ' + typeNum); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} else { |
|
|
|
|
|
|
|
error('Unhandled XObject subtype ' + type.name); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
} else if (cmd == 'Tf') { // eagerly collect all fonts
|
|
|
|
case OPS.paintXObject: |
|
|
|
var loadedName = self.handleSetFont(resources, args, null, |
|
|
|
if (args[0].code) { |
|
|
|
operatorList); |
|
|
|
break; |
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
|
|
|
|
fn = OPS.setFont; |
|
|
|
|
|
|
|
args[0] = loadedName; |
|
|
|
|
|
|
|
} else if (cmd == 'EI') { |
|
|
|
|
|
|
|
self.buildPaintImageXObject(resources, args[0], true, operatorList); |
|
|
|
|
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} else if (cmd === 'q') { // save
|
|
|
|
|
|
|
|
var old = this.state; |
|
|
|
|
|
|
|
this.stateStack.push(this.state); |
|
|
|
|
|
|
|
this.state = old.clone(); |
|
|
|
|
|
|
|
} else if (cmd === 'Q') { // restore
|
|
|
|
|
|
|
|
var prev = this.stateStack.pop(); |
|
|
|
|
|
|
|
if (prev) { |
|
|
|
|
|
|
|
this.state = prev; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (cmd === 'Tj') { // showText
|
|
|
|
|
|
|
|
args[0] = this.handleText(args[0]); |
|
|
|
|
|
|
|
} else if (cmd === 'TJ') { // showSpacedText
|
|
|
|
|
|
|
|
var arr = args[0]; |
|
|
|
|
|
|
|
var arrLength = arr.length; |
|
|
|
|
|
|
|
for (var i = 0; i < arrLength; ++i) { |
|
|
|
|
|
|
|
if (isString(arr[i])) { |
|
|
|
|
|
|
|
arr[i] = this.handleText(arr[i]); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// eagerly compile XForm objects
|
|
|
|
} else if (cmd === '\'') { // nextLineShowText
|
|
|
|
var name = args[0].name; |
|
|
|
args[0] = this.handleText(args[0]); |
|
|
|
var xobj = xobjs.get(name); |
|
|
|
} else if (cmd === '"') { // nextLineSetSpacingShowText
|
|
|
|
if (xobj) { |
|
|
|
args[2] = this.handleText(args[2]); |
|
|
|
assertWellFormed( |
|
|
|
} else if (cmd === 'Tr') { // setTextRenderingMode
|
|
|
|
isStream(xobj), 'XObject should be a stream'); |
|
|
|
this.state.textRenderingMode = args[0]; |
|
|
|
|
|
|
|
} |
|
|
|
var type = xobj.dict.get('Subtype'); |
|
|
|
|
|
|
|
assertWellFormed( |
|
|
|
switch (fn) { |
|
|
|
isName(type), |
|
|
|
|
|
|
|
'XObject should have a Name subtype' |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ('Form' == type.name) { |
|
|
|
|
|
|
|
self.buildFormXObject(resources, xobj, null, operatorList); |
|
|
|
|
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} else if ('Image' == type.name) { |
|
|
|
|
|
|
|
self.buildPaintImageXObject(resources, xobj, false, |
|
|
|
|
|
|
|
operatorList); |
|
|
|
|
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
error('Unhandled XObject subtype ' + type.name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.setFont: |
|
|
|
|
|
|
|
// eagerly collect all fonts
|
|
|
|
|
|
|
|
var loadedName = self.handleSetFont(resources, args, null, |
|
|
|
|
|
|
|
operatorList); |
|
|
|
|
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
|
|
|
|
args[0] = loadedName; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.endInlineImage: |
|
|
|
|
|
|
|
self.buildPaintImageXObject(resources, args[0], true, |
|
|
|
|
|
|
|
operatorList); |
|
|
|
|
|
|
|
args = []; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
case OPS.save: |
|
|
|
|
|
|
|
var old = this.state; |
|
|
|
|
|
|
|
this.stateStack.push(this.state); |
|
|
|
|
|
|
|
this.state = old.clone(); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.restore: |
|
|
|
|
|
|
|
var prev = this.stateStack.pop(); |
|
|
|
|
|
|
|
if (prev) { |
|
|
|
|
|
|
|
this.state = prev; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.showText: |
|
|
|
|
|
|
|
args[0] = this.handleText(args[0]); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.showSpacedText: |
|
|
|
|
|
|
|
var arr = args[0]; |
|
|
|
|
|
|
|
var arrLength = arr.length; |
|
|
|
|
|
|
|
for (var i = 0; i < arrLength; ++i) { |
|
|
|
|
|
|
|
if (isString(arr[i])) { |
|
|
|
|
|
|
|
arr[i] = this.handleText(arr[i]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.nextLineShowText: |
|
|
|
|
|
|
|
args[0] = this.handleText(args[0]); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.nextLineSetSpacingShowText: |
|
|
|
|
|
|
|
args[2] = this.handleText(args[2]); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case OPS.setTextRenderingMode: |
|
|
|
|
|
|
|
this.state.textRenderingMode = args[0]; |
|
|
|
|
|
|
|
break; |
|
|
|
// Parse the ColorSpace data to a raw format.
|
|
|
|
// Parse the ColorSpace data to a raw format.
|
|
|
|
case OPS.setFillColorSpace: |
|
|
|
case OPS.setFillColorSpace: |
|
|
|
case OPS.setStrokeColorSpace: |
|
|
|
case OPS.setStrokeColorSpace: |
|
|
@ -706,7 +720,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
var gState = extGState.get(dictName.name); |
|
|
|
var gState = extGState.get(dictName.name); |
|
|
|
self.setGState(resources, gState, operatorList); |
|
|
|
self.setGState(resources, gState, operatorList); |
|
|
|
args = []; |
|
|
|
args = []; |
|
|
|
continue nextOp; |
|
|
|
continue; |
|
|
|
} // switch
|
|
|
|
} // switch
|
|
|
|
|
|
|
|
|
|
|
|
operatorList.addOp(fn, args); |
|
|
|
operatorList.addOp(fn, args); |
|
|
|