[poppler] poppler/CairoOutputDev.cc poppler/CairoOutputDev.h
Adrian Johnson
ajohnson at kemper.freedesktop.org
Mon Jan 28 12:58:29 PST 2013
poppler/CairoOutputDev.cc | 20 ++++++++++++++++++++
poppler/CairoOutputDev.h | 1 +
2 files changed, 21 insertions(+)
New commits:
commit fbcd64386c1b189db6e06234577261973bdc88cc
Author: Adrian Johnson <ajohnson at redneon.com>
Date: Fri Jan 25 22:24:50 2013 +1030
cairo: support uncolored tiling patterns
Bug 59179
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
index 10df30c..dfa3e0e 100644
--- a/poppler/CairoOutputDev.cc
+++ b/poppler/CairoOutputDev.cc
@@ -144,6 +144,7 @@ CairoOutputDev::CairoOutputDev() {
prescaleImages = gTrue;
printing = gTrue;
use_show_text_glyphs = gFalse;
+ inUncoloredPattern = gFalse;
inType3Char = gFalse;
t3_glyph_has_bbox = gFalse;
@@ -461,6 +462,9 @@ void CairoOutputDev::updateLineWidth(GfxState *state) {
void CairoOutputDev::updateFillColor(GfxState *state) {
GfxRGB color = fill_color;
+ if (inUncoloredPattern)
+ return;
+
state->getFillRGB(&fill_color);
if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID ||
color.r != fill_color.r ||
@@ -481,6 +485,9 @@ void CairoOutputDev::updateFillColor(GfxState *state) {
void CairoOutputDev::updateStrokeColor(GfxState *state) {
GfxRGB color = stroke_color;
+ if (inUncoloredPattern)
+ return;
+
state->getStrokeRGB(&stroke_color);
if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID ||
color.r != stroke_color.r ||
@@ -501,6 +508,9 @@ void CairoOutputDev::updateStrokeColor(GfxState *state) {
void CairoOutputDev::updateFillOpacity(GfxState *state) {
double opacity = fill_opacity;
+ if (inUncoloredPattern)
+ return;
+
fill_opacity = state->getFillOpacity();
if (opacity != fill_opacity) {
cairo_pattern_destroy(fill_pattern);
@@ -516,6 +526,9 @@ void CairoOutputDev::updateFillOpacity(GfxState *state) {
void CairoOutputDev::updateStrokeOpacity(GfxState *state) {
double opacity = stroke_opacity;
+ if (inUncoloredPattern)
+ return;
+
stroke_opacity = state->getStrokeOpacity();
if (opacity != stroke_opacity) {
cairo_pattern_destroy(stroke_pattern);
@@ -529,6 +542,9 @@ void CairoOutputDev::updateStrokeOpacity(GfxState *state) {
}
void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) {
+ if (inUncoloredPattern)
+ return;
+
state->getFillRGB(&fill_color);
cairo_pattern_add_color_stop_rgba(fill_pattern, offset,
@@ -852,7 +868,11 @@ GBool CairoOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, Catalog *cat
strokePathTmp = strokePathClip;
strokePathClip = NULL;
gfx = new Gfx(doc, this, resDict, &box, NULL, NULL, NULL, gfxA->getXRef());
+ if (paintType == 2)
+ inUncoloredPattern = gTrue;
gfx->display(str);
+ if (paintType == 2)
+ inUncoloredPattern = gFalse;
delete gfx;
strokePathClip = strokePathTmp;
diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h
index d35c899..483b161 100644
--- a/poppler/CairoOutputDev.h
+++ b/poppler/CairoOutputDev.h
@@ -319,6 +319,7 @@ protected:
int utf8Count;
int utf8Max;
cairo_path_t *textClipPath;
+ GBool inUncoloredPattern; // inside a uncolored pattern (PaintType = 2)
GBool inType3Char; // inside a Type 3 CharProc
double t3_glyph_wx, t3_glyph_wy;
GBool t3_glyph_has_bbox;
More information about the poppler
mailing list