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