Merge pull request #12016 from Snuffleupagus/issue-8078

Tweak the `QueueOptimizer` to recognize `OPS.paintImageMaskXObject` operators as *repeated* when the "skew" transformation matrix elements are non-zero (issue 8078)
This commit is contained in:
Tim van der Meij 2020-06-21 19:38:27 +02:00 committed by GitHub
commit c1cb9ee9fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 10 deletions

View File

@ -229,13 +229,13 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
var isSameImage = false; var isSameImage = false;
var iTransform, transformArgs; var iTransform, transformArgs;
var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
if ( const firstTransformArg0 = argsArray[iFirstTransform][0],
argsArray[iFirstTransform][1] === 0 && firstTransformArg1 = argsArray[iFirstTransform][1],
argsArray[iFirstTransform][2] === 0 firstTransformArg2 = argsArray[iFirstTransform][2],
) { firstTransformArg3 = argsArray[iFirstTransform][3];
if (firstTransformArg1 === firstTransformArg2) {
isSameImage = true; isSameImage = true;
var firstTransformArg0 = argsArray[iFirstTransform][0];
var firstTransformArg3 = argsArray[iFirstTransform][3];
iTransform = iFirstTransform + 4; iTransform = iFirstTransform + 4;
var iPIMXO = iFirstPIMXO + 4; var iPIMXO = iFirstPIMXO + 4;
for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
@ -243,8 +243,8 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
if ( if (
argsArray[iPIMXO][0] !== firstPIMXOArg0 || argsArray[iPIMXO][0] !== firstPIMXOArg0 ||
transformArgs[0] !== firstTransformArg0 || transformArgs[0] !== firstTransformArg0 ||
transformArgs[1] !== 0 || transformArgs[1] !== firstTransformArg1 ||
transformArgs[2] !== 0 || transformArgs[2] !== firstTransformArg2 ||
transformArgs[3] !== firstTransformArg3 transformArgs[3] !== firstTransformArg3
) { ) {
if (q < MIN_IMAGES_IN_MASKS_BLOCK) { if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
@ -272,6 +272,8 @@ var QueueOptimizer = (function QueueOptimizerClosure() {
argsArray.splice(iFirstSave, count * 4, [ argsArray.splice(iFirstSave, count * 4, [
firstPIMXOArg0, firstPIMXOArg0,
firstTransformArg0, firstTransformArg0,
firstTransformArg1,
firstTransformArg2,
firstTransformArg3, firstTransformArg3,
positions, positions,
]); ]);

View File

@ -2157,9 +2157,11 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
this.paintInlineImageXObject(maskCanvas.canvas); this.paintInlineImageXObject(maskCanvas.canvas);
}, },
paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat( paintImageMaskXObjectRepeat(
imgData, imgData,
scaleX, scaleX,
skewX = 0,
skewY = 0,
scaleY, scaleY,
positions positions
) { ) {
@ -2190,7 +2192,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var ctx = this.ctx; var ctx = this.ctx;
for (var i = 0, ii = positions.length; i < ii; i += 2) { for (var i = 0, ii = positions.length; i < ii; i += 2) {
ctx.save(); ctx.save();
ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); ctx.transform(
scaleX,
skewX,
skewY,
scaleY,
positions[i],
positions[i + 1]
);
ctx.scale(1, -1); ctx.scale(1, -1);
ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
ctx.restore(); ctx.restore();

View File

@ -0,0 +1 @@
https://bugs.ghostscript.com/attachment.cgi?id=7455

View File

@ -711,6 +711,14 @@
"type": "eq", "type": "eq",
"about": "Type1 font with |Ref|s in the Differences array of the Encoding dictionary." "about": "Type1 font with |Ref|s in the Differences array of the Encoding dictionary."
}, },
{ "id": "issue8078",
"file": "pdfs/issue8078.pdf",
"md5": "8b7d74bc24b4157393e4e88a511c05f1",
"link": true,
"rounds": 1,
"lastPage": 1,
"type": "eq"
},
{ "id": "issue8092", { "id": "issue8092",
"file": "pdfs/issue8092.pdf", "file": "pdfs/issue8092.pdf",
"md5": "e4f3376b35fd132580246c3db1fbd738", "md5": "e4f3376b35fd132580246c3db1fbd738",