Paint patterns relative to content base transformation.
This commit is contained in:
parent
c682c25bcf
commit
2aecbe874e
@ -407,6 +407,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
this.imageLayer = imageLayer;
|
this.imageLayer = imageLayer;
|
||||||
this.groupStack = [];
|
this.groupStack = [];
|
||||||
this.processingType3 = null;
|
this.processingType3 = null;
|
||||||
|
// Patterns are painted relative to the initial page/form transform, see pdf
|
||||||
|
// spec 8.7.2 NOTE 1.
|
||||||
|
this.baseTransform = null;
|
||||||
|
this.baseTransformStack = [];
|
||||||
if (canvasCtx) {
|
if (canvasCtx) {
|
||||||
addContextCurrentTransform(canvasCtx);
|
addContextCurrentTransform(canvasCtx);
|
||||||
}
|
}
|
||||||
@ -509,6 +513,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var transform = viewport.transform;
|
var transform = viewport.transform;
|
||||||
|
this.baseTransform = transform.slice();
|
||||||
this.ctx.save();
|
this.ctx.save();
|
||||||
this.ctx.transform.apply(this.ctx, transform);
|
this.ctx.transform.apply(this.ctx, transform);
|
||||||
|
|
||||||
@ -1318,7 +1323,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
color = base.getRgb(args, 0);
|
color = base.getRgb(args, 0);
|
||||||
}
|
}
|
||||||
var pattern = new TilingPattern(IR, color, this.ctx, this.objs,
|
var pattern = new TilingPattern(IR, color, this.ctx, this.objs,
|
||||||
this.commonObjs);
|
this.commonObjs, this.baseTransform);
|
||||||
} else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
|
} else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
|
||||||
var pattern = Pattern.shadingFromIR(IR);
|
var pattern = Pattern.shadingFromIR(IR);
|
||||||
} else {
|
} else {
|
||||||
@ -1453,10 +1458,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
bbox) {
|
bbox) {
|
||||||
this.save();
|
this.save();
|
||||||
this.current.paintFormXObjectDepth++;
|
this.current.paintFormXObjectDepth++;
|
||||||
|
this.baseTransformStack.push(this.baseTransform);
|
||||||
|
|
||||||
if (matrix && isArray(matrix) && 6 == matrix.length)
|
if (matrix && isArray(matrix) && 6 == matrix.length)
|
||||||
this.transform.apply(this, matrix);
|
this.transform.apply(this, matrix);
|
||||||
|
|
||||||
|
this.baseTransform = this.ctx.mozCurrentTransform;
|
||||||
|
|
||||||
if (bbox && isArray(bbox) && 4 == bbox.length) {
|
if (bbox && isArray(bbox) && 4 == bbox.length) {
|
||||||
var width = bbox[2] - bbox[0];
|
var width = bbox[2] - bbox[0];
|
||||||
var height = bbox[3] - bbox[1];
|
var height = bbox[3] - bbox[1];
|
||||||
@ -1473,6 +1481,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
// some pdf don't close all restores inside object
|
// some pdf don't close all restores inside object
|
||||||
// closing those for them
|
// closing those for them
|
||||||
} while (this.current.paintFormXObjectDepth >= depth);
|
} while (this.current.paintFormXObjectDepth >= depth);
|
||||||
|
this.baseTransform = this.baseTransformStack.pop();
|
||||||
},
|
},
|
||||||
|
|
||||||
beginGroup: function CanvasGraphics_beginGroup(group) {
|
beginGroup: function CanvasGraphics_beginGroup(group) {
|
||||||
|
@ -271,7 +271,7 @@ var TilingPattern = (function TilingPatternClosure() {
|
|||||||
|
|
||||||
var MAX_PATTERN_SIZE = 8192;
|
var MAX_PATTERN_SIZE = 8192;
|
||||||
|
|
||||||
function TilingPattern(IR, color, ctx, objs, commonObjs) {
|
function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {
|
||||||
this.name = IR[1][0].name;
|
this.name = IR[1][0].name;
|
||||||
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];
|
||||||
@ -283,7 +283,7 @@ var TilingPattern = (function TilingPatternClosure() {
|
|||||||
this.color = color;
|
this.color = color;
|
||||||
this.objs = objs;
|
this.objs = objs;
|
||||||
this.commonObjs = commonObjs;
|
this.commonObjs = commonObjs;
|
||||||
this.curMatrix = ctx.mozCurrentTransform;
|
this.baseTransform = baseTransform;
|
||||||
this.type = 'Pattern';
|
this.type = 'Pattern';
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
}
|
}
|
||||||
@ -328,7 +328,8 @@ var TilingPattern = (function TilingPatternClosure() {
|
|||||||
|
|
||||||
// Obtain scale from matrix and current transformation matrix.
|
// Obtain scale from matrix and current transformation matrix.
|
||||||
var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
|
var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
|
||||||
var curMatrixScale = Util.singularValueDecompose2dScale(this.curMatrix);
|
var curMatrixScale = Util.singularValueDecompose2dScale(
|
||||||
|
this.baseTransform);
|
||||||
var combinedScale = [matrixScale[0] * curMatrixScale[0],
|
var combinedScale = [matrixScale[0] * curMatrixScale[0],
|
||||||
matrixScale[1] * curMatrixScale[1]];
|
matrixScale[1] * curMatrixScale[1]];
|
||||||
|
|
||||||
@ -412,7 +413,7 @@ var TilingPattern = (function TilingPatternClosure() {
|
|||||||
this.createPatternCanvas(temporaryPatternCanvas);
|
this.createPatternCanvas(temporaryPatternCanvas);
|
||||||
|
|
||||||
var ctx = this.ctx;
|
var ctx = this.ctx;
|
||||||
ctx.setTransform.apply(ctx, this.curMatrix);
|
ctx.setTransform.apply(ctx, this.baseTransform);
|
||||||
ctx.transform.apply(ctx, this.matrix);
|
ctx.transform.apply(ctx, this.matrix);
|
||||||
this.scaleToContext();
|
this.scaleToContext();
|
||||||
|
|
||||||
|
BIN
test/pdfs/issue3458.pdf
Normal file
BIN
test/pdfs/issue3458.pdf
Normal file
Binary file not shown.
@ -935,6 +935,13 @@
|
|||||||
"type": "eq",
|
"type": "eq",
|
||||||
"about": "Rotated transparency group with blend mode."
|
"about": "Rotated transparency group with blend mode."
|
||||||
},
|
},
|
||||||
|
{ "id": "issue3458.pdf",
|
||||||
|
"file": "pdfs/issue3458.pdf",
|
||||||
|
"md5": "dab8bd3ad1acfc8dc82a8381a3c8ff94",
|
||||||
|
"rounds": 1,
|
||||||
|
"type": "eq",
|
||||||
|
"about": "Pattern with current transform different than base transform."
|
||||||
|
},
|
||||||
{ "id": "issue2462",
|
{ "id": "issue2462",
|
||||||
"file": "pdfs/issue2462.pdf",
|
"file": "pdfs/issue2462.pdf",
|
||||||
"md5": "d4e3dddfdd35464c71cf0310bff29b42",
|
"md5": "d4e3dddfdd35464c71cf0310bff29b42",
|
||||||
|
Loading…
Reference in New Issue
Block a user