|
 |
db2a8b |
From 718d428984e3a84fda521c0f5e6d975c7390af2b Mon Sep 17 00:00:00 2001
|
|
 |
db2a8b |
From: Marek Kasik <mkasik@redhat.com>
|
|
 |
db2a8b |
Date: Fri, 6 Apr 2018 15:06:46 +0200
|
|
 |
db2a8b |
Subject: [PATCH] cairo: Fix tiling patterns when pattern cell is too far
|
|
 |
db2a8b |
|
|
 |
db2a8b |
Rendering of tiling pattern which has pattern matrix moving pattern cell
|
|
 |
db2a8b |
far away can fail on allocation of memory. This commit solves the issue by
|
|
 |
db2a8b |
modifying of cairo pattern matrix so that its offset is closer to the path
|
|
 |
db2a8b |
filled by the pattern.
|
|
 |
db2a8b |
|
|
 |
db2a8b |
https://bugs.freedesktop.org/show_bug.cgi?id=105905
|
|
 |
db2a8b |
---
|
|
 |
db2a8b |
poppler/CairoOutputDev.cc | 11 +++++++++++
|
|
 |
db2a8b |
1 file changed, 11 insertions(+)
|
|
 |
db2a8b |
|
|
 |
db2a8b |
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
|
|
 |
db2a8b |
index 631ab27b..b2e730bf 100644
|
|
 |
db2a8b |
--- a/poppler/CairoOutputDev.cc
|
|
 |
db2a8b |
+++ b/poppler/CairoOutputDev.cc
|
|
 |
db2a8b |
@@ -915,6 +915,8 @@ GBool CairoOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, Catalog *cat
|
|
 |
db2a8b |
StrokePathClip *strokePathTmp;
|
|
 |
db2a8b |
GBool adjusted_stroke_width_tmp;
|
|
 |
db2a8b |
cairo_pattern_t *maskTmp;
|
|
 |
db2a8b |
+ double xoffset, yoffset;
|
|
 |
db2a8b |
+ double det;
|
|
 |
db2a8b |
|
|
 |
db2a8b |
width = bbox[2] - bbox[0];
|
|
 |
db2a8b |
height = bbox[3] - bbox[1];
|
|
 |
db2a8b |
@@ -976,6 +978,15 @@ GBool CairoOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, Catalog *cat
|
|
 |
db2a8b |
if (cairo_pattern_status (pattern))
|
|
 |
db2a8b |
return gFalse;
|
|
 |
db2a8b |
|
|
 |
db2a8b |
+ det = pmat[0] * pmat[3] - pmat[1] * pmat[2];
|
|
 |
db2a8b |
+ if (fabs(det) < 0.000001)
|
|
 |
db2a8b |
+ return gFalse;
|
|
 |
db2a8b |
+
|
|
 |
db2a8b |
+ xoffset = round ((pmat[3] * pmat[4] - pmat[2] * pmat[5]) / (xStep * det));
|
|
 |
db2a8b |
+ yoffset = - round ((pmat[1] * pmat[4] - pmat[0] * pmat[5]) / (yStep * det));
|
|
 |
db2a8b |
+ pattern_matrix.x0 -= xoffset * pattern_matrix.xx * xStep + yoffset * pattern_matrix.xy * yStep;
|
|
 |
db2a8b |
+ pattern_matrix.y0 -= xoffset * pattern_matrix.yx * xStep + yoffset * pattern_matrix.yy * yStep;
|
|
 |
db2a8b |
+
|
|
 |
db2a8b |
state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
|
|
 |
db2a8b |
cairo_rectangle (cairo, xMin, yMin, xMax - xMin, yMax - yMin);
|
|
 |
db2a8b |
|
|
 |
db2a8b |
--
|
|
 |
db2a8b |
2.14.3
|
|
 |
db2a8b |
|