|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
3 commits - poppler/CairoOutputDev.cc poppler/CairoOutputDev.cc | 105 ++++++++++++++++++++++++++++------------------
1 file changed, 66 insertions(+), 39 deletions(-) New commits: commit 32ea667ec8f18311539123c7b80c7ab4767070cb Author: Chris Wilson <chris@...> Date: Tue Aug 11 19:17:52 2009 +0100 [cairo] Mark images dirty After directly manipulating the pixel values we need to mark the surface as dirty. This means that cairo will refresh any caches it may have taken of the surface will the new data. diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index b7a84cc..500583a 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -1262,6 +1262,7 @@ void CairoOutputDev::setSoftMask(GfxState * state, double * bbox, GBool alpha, } } + cairo_surface_mark_dirty (source); /* setup the new mask pattern */ mask = cairo_pattern_create_for_surface(source); @@ -1378,6 +1379,7 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * } } + cairo_surface_mark_dirty (image); pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); if (cairo_pattern_status (pattern)) @@ -1636,6 +1638,7 @@ void CairoOutputDev::drawImageMaskPrescaled(GfxState *state, Object *ref, Stream } free(pixBuf); + cairo_surface_mark_dirty (image); pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); if (cairo_pattern_status (pattern)) { @@ -1751,6 +1754,7 @@ void CairoOutputDev::drawMaskedImage(GfxState *state, Object *ref, maskImgStr->close(); delete maskImgStr; + cairo_surface_mark_dirty (maskImage); maskPattern = cairo_pattern_create_for_surface (maskImage); cairo_surface_destroy (maskImage); if (cairo_pattern_status (maskPattern)) @@ -1783,6 +1787,7 @@ void CairoOutputDev::drawMaskedImage(GfxState *state, Object *ref, colorMap->getRGBLine (pix, dest, width); } + cairo_surface_mark_dirty (image); pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); if (cairo_pattern_status (pattern)) @@ -1871,6 +1876,7 @@ void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *s maskImgStr->close(); delete maskImgStr; + cairo_surface_mark_dirty (maskImage); maskPattern = cairo_pattern_create_for_surface (maskImage); cairo_surface_destroy (maskImage); if (cairo_pattern_status (maskPattern)) @@ -1903,6 +1909,7 @@ void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *s colorMap->getRGBLine (pix, dest, width); } + cairo_surface_mark_dirty (image); pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); if (cairo_pattern_status (pattern)) @@ -2047,6 +2054,7 @@ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, } gfree(lookup); + cairo_surface_mark_dirty (image); pattern = cairo_pattern_create_for_surface (image); cairo_surface_destroy (image); if (cairo_pattern_status (pattern)) commit 10a41150c4067bb3ab85e25dae76e0968a6cd586 Author: Chris Wilson <chris@...> Date: Tue Aug 11 19:17:06 2009 +0100 [cairo] Use colToDbl() to avoid rounding error. diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index 772de15..b7a84cc 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -421,9 +421,9 @@ void CairoOutputDev::updateFillColor(GfxState *state) { color.b != fill_color.b) { cairo_pattern_destroy(fill_pattern); - fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, - fill_color.g / 65535.0, - fill_color.b / 65535.0, + fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), fill_opacity); LOG(printf ("fill color: %d %d %d\n", @@ -440,9 +440,9 @@ void CairoOutputDev::updateStrokeColor(GfxState *state) { color.b != stroke_color.b) { cairo_pattern_destroy(stroke_pattern); - stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, - stroke_color.g / 65535.0, - stroke_color.b / 65535.0, + stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r), + colToDbl(stroke_color.g), + colToDbl(stroke_color.b), stroke_opacity); LOG(printf ("stroke color: %d %d %d\n", @@ -456,9 +456,9 @@ void CairoOutputDev::updateFillOpacity(GfxState *state) { fill_opacity = state->getFillOpacity(); if (opacity != fill_opacity) { cairo_pattern_destroy(fill_pattern); - fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, - fill_color.g / 65535.0, - fill_color.b / 65535.0, + fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), fill_opacity); LOG(printf ("fill opacity: %f\n", fill_opacity)); @@ -471,9 +471,9 @@ void CairoOutputDev::updateStrokeOpacity(GfxState *state) { stroke_opacity = state->getStrokeOpacity(); if (opacity != stroke_opacity) { cairo_pattern_destroy(stroke_pattern); - stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, - stroke_color.g / 65535.0, - stroke_color.b / 65535.0, + stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r), + colToDbl(stroke_color.g), + colToDbl(stroke_color.b), stroke_opacity); LOG(printf ("stroke opacity: %f\n", stroke_opacity)); @@ -484,9 +484,9 @@ void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) { state->getFillRGB(&fill_color); cairo_pattern_add_color_stop_rgba(fill_pattern, offset, - fill_color.r / 65535.0, - fill_color.g / 65535.0, - fill_color.b / 65535.0, + colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), fill_opacity); LOG(printf ("fill color stop: %f (%d, %d, %d)\n", offset, fill_color.r, fill_color.g, fill_color.b)); @@ -1217,9 +1217,10 @@ void CairoOutputDev::setSoftMask(GfxState * state, double * bbox, GBool alpha, GfxRGB backdropColorRGB; groupColorSpaceStack->cs->getRGB(backdropColor, &backdropColorRGB); /* paint the backdrop */ - cairo_set_source_rgb(maskCtx, backdropColorRGB.r / 65535.0, - backdropColorRGB.g / 65535.0, - backdropColorRGB.b / 65535.0); + cairo_set_source_rgb(maskCtx, + colToDbl(backdropColorRGB.r), + colToDbl(backdropColorRGB.g), + colToDbl(backdropColorRGB.b)); cairo_matrix_t mat; commit c9491319689f04edd57adda7ee85f84f17fd1c47 Author: Chris Wilson <chris@...> Date: Tue Aug 11 18:07:17 2009 +0100 [cairo] Reduce the number of redundant pattern creations diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index 19d1245..772de15 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -222,10 +222,10 @@ void CairoOutputDev::startDoc(XRef *xrefA, Catalog *catalogA, void CairoOutputDev::startPage(int pageNum, GfxState *state) { /* set up some per page defaults */ cairo_pattern_destroy(fill_pattern); - fill_pattern = cairo_pattern_create_rgb(0., 0., 0.); - cairo_pattern_destroy(stroke_pattern); - stroke_pattern = cairo_pattern_create_rgb(0., 0., 0.); + + fill_pattern = cairo_pattern_create_rgb(0., 0., 0.); + stroke_pattern = cairo_pattern_reference(fill_pattern); if (text) text->startPage(state); @@ -413,53 +413,71 @@ void CairoOutputDev::updateLineWidth(GfxState *state) { } void CairoOutputDev::updateFillColor(GfxState *state) { - state->getFillRGB(&fill_color); + GfxRGB color = fill_color; - cairo_pattern_destroy(fill_pattern); - fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, - fill_color.g / 65535.0, - fill_color.b / 65535.0, - fill_opacity); + state->getFillRGB(&fill_color); + if (color.r != fill_color.r || + color.g != fill_color.g || + color.b != fill_color.b) + { + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, + fill_color.g / 65535.0, + fill_color.b / 65535.0, + fill_opacity); - LOG(printf ("fill color: %d %d %d\n", - fill_color.r, fill_color.g, fill_color.b)); + LOG(printf ("fill color: %d %d %d\n", + fill_color.r, fill_color.g, fill_color.b)); + } } void CairoOutputDev::updateStrokeColor(GfxState *state) { + GfxRGB color = stroke_color; + state->getStrokeRGB(&stroke_color); + if (color.r != stroke_color.r || + color.g != stroke_color.g || + color.b != stroke_color.b) + { + cairo_pattern_destroy(stroke_pattern); + stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, + stroke_color.g / 65535.0, + stroke_color.b / 65535.0, + stroke_opacity); - cairo_pattern_destroy(stroke_pattern); - stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, - stroke_color.g / 65535.0, - stroke_color.b / 65535.0, - stroke_opacity); - - LOG(printf ("stroke color: %d %d %d\n", - stroke_color.r, stroke_color.g, stroke_color.b)); + LOG(printf ("stroke color: %d %d %d\n", + stroke_color.r, stroke_color.g, stroke_color.b)); + } } void CairoOutputDev::updateFillOpacity(GfxState *state) { - fill_opacity = state->getFillOpacity(); + double opacity = fill_opacity; - cairo_pattern_destroy(fill_pattern); - fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, - fill_color.g / 65535.0, - fill_color.b / 65535.0, - fill_opacity); + fill_opacity = state->getFillOpacity(); + if (opacity != fill_opacity) { + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_rgba(fill_color.r / 65535.0, + fill_color.g / 65535.0, + fill_color.b / 65535.0, + fill_opacity); - LOG(printf ("fill opacity: %f\n", fill_opacity)); + LOG(printf ("fill opacity: %f\n", fill_opacity)); + } } void CairoOutputDev::updateStrokeOpacity(GfxState *state) { + double opacity = stroke_opacity; + stroke_opacity = state->getStrokeOpacity(); + if (opacity != stroke_opacity) { + cairo_pattern_destroy(stroke_pattern); + stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, + stroke_color.g / 65535.0, + stroke_color.b / 65535.0, + stroke_opacity); - cairo_pattern_destroy(stroke_pattern); - stroke_pattern = cairo_pattern_create_rgba(stroke_color.r / 65535.0, - stroke_color.g / 65535.0, - stroke_color.b / 65535.0, - stroke_opacity); - - LOG(printf ("stroke opacity: %f\n", stroke_opacity)); + LOG(printf ("stroke opacity: %f\n", stroke_opacity)); + } } void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) { _______________________________________________ poppler mailing list poppler@... http://lists.freedesktop.org/mailman/listinfo/poppler |
| Free embeddable forum powered by Nabble | Forum Help |