Ensure that TilingPatterns have valid (non-zero) /BBox arrays (issue 8330)

Fixes 8330.
This commit is contained in:
Jonas Jenwald 2017-05-24 12:12:14 +02:00
parent 9342054502
commit e589834f13
5 changed files with 45 additions and 20 deletions

View File

@ -480,16 +480,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
stateManager.state.clone()); stateManager.state.clone());
}, },
handleTilingType: handleTilingType(fn, args, resources, pattern, patternDict, operatorList,
function PartialEvaluator_handleTilingType(fn, args, resources, task) {
pattern, patternDict,
operatorList, task) {
// Create an IR of the pattern code. // Create an IR of the pattern code.
var tilingOpList = new OperatorList(); let tilingOpList = new OperatorList();
// Merge the available resources, to prevent issues when the patternDict // Merge the available resources, to prevent issues when the patternDict
// is missing some /Resources entries (fixes issue6541.pdf). // is missing some /Resources entries (fixes issue6541.pdf).
var resourcesArray = [patternDict.get('Resources'), resources]; let resourcesArray = [patternDict.get('Resources'), resources];
var patternResources = Dict.merge(this.xref, resourcesArray); let patternResources = Dict.merge(this.xref, resourcesArray);
return this.getOperatorList({ return this.getOperatorList({
stream: pattern, stream: pattern,
@ -497,13 +495,25 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
resources: patternResources, resources: patternResources,
operatorList: tilingOpList, operatorList: tilingOpList,
}).then(function() { }).then(function() {
// Add the dependencies to the parent operator list so they are return getTilingPatternIR({
// resolved before sub operator list is executed synchronously.
operatorList.addDependencies(tilingOpList.dependencies);
operatorList.addOp(fn, getTilingPatternIR({
fnArray: tilingOpList.fnArray, fnArray: tilingOpList.fnArray,
argsArray: tilingOpList.argsArray, argsArray: tilingOpList.argsArray,
}, patternDict, args)); }, patternDict, args);
}).then(function(tilingPatternIR) {
// Add the dependencies to the parent operator list so they are
// resolved before the sub operator list is executed synchronously.
operatorList.addDependencies(tilingOpList.dependencies);
operatorList.addOp(fn, tilingPatternIR);
}, (reason) => {
if (this.options.ignoreErrors) {
// Error(s) in the TilingPattern -- sending unsupported feature
// notification and allow rendering to continue.
this.handler.send('UnsupportedFeature',
{ featureId: UNSUPPORTED_FEATURES.unknown, });
warn(`handleTilingType - ignoring pattern: "${reason}".`);
return;
}
throw reason;
}); });
}, },

View File

@ -795,12 +795,18 @@ Shadings.Dummy = (function DummyClosure() {
})(); })();
function getTilingPatternIR(operatorList, dict, args) { function getTilingPatternIR(operatorList, dict, args) {
var matrix = dict.getArray('Matrix'); let matrix = dict.getArray('Matrix');
var bbox = dict.getArray('BBox'); let bbox = Util.normalizeRect(dict.getArray('BBox'));
var xstep = dict.get('XStep'); let xstep = dict.get('XStep');
var ystep = dict.get('YStep'); let ystep = dict.get('YStep');
var paintType = dict.get('PaintType'); let paintType = dict.get('PaintType');
var tilingType = dict.get('TilingType'); let tilingType = dict.get('TilingType');
// Ensure that the pattern has a non-zero width and height, to prevent errors
// in `pattern_helper.js` (fixes issue8330.pdf).
if ((bbox[2] - bbox[0]) === 0 || (bbox[3] - bbox[1]) === 0) {
throw new Error(`getTilingPatternIR - invalid /BBox array: [${bbox}].`);
}
return [ return [
'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,

View File

@ -304,7 +304,7 @@ var TilingPattern = (function TilingPatternClosure() {
function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
this.operatorList = IR[2]; this.operatorList = IR[2];
this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
this.bbox = Util.normalizeRect(IR[4]); this.bbox = IR[4];
this.xstep = IR[5]; this.xstep = IR[5];
this.ystep = IR[6]; this.ystep = IR[6];
this.paintType = IR[7]; this.paintType = IR[7];

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/954710/FailingPDF.pdf

View File

@ -1269,6 +1269,14 @@
"rounds": 1, "rounds": 1,
"type": "eq" "type": "eq"
}, },
{ "id": "issue8330",
"file": "pdfs/issue8330.pdf",
"md5": "9010093d07dd62d3b49378fd48cf45f9",
"rounds": 1,
"lastPage": 1,
"link": true,
"type": "eq"
},
{ "id": "issue4573", { "id": "issue4573",
"file": "pdfs/issue4573.pdf", "file": "pdfs/issue4573.pdf",
"md5": "34b0c4fdee19e57033275b766c5f57a3", "md5": "34b0c4fdee19e57033275b766c5f57a3",