poppler/CairoOutputDev.cc | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
New commits: commit 0e8d7d11838dc16cdc6141c026def43710c8b326 Author: Adrian Johnson <ajohn...@redneon.com> Date: Mon Oct 4 07:42:38 2021 +1030 Fix de-duping of Flate images diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index 5f4780c7..3967bd94 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -2886,10 +2886,24 @@ void CairoOutputDev::setMimeData(GfxState *state, Stream *str, Object *ref, GfxI GfxColorSpace *colorSpace; StreamKind strKind = str->getKind(); const char *mime_type; + cairo_status_t status; if (!printing) return; +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) + // Since 1.5.10 the cairo PS backend stores images with UNIQUE_ID in PS memory so the + // image can be re-used multiple times. As we don't know how large the images are or + // how many times they are used, there is no benefit in enabling this. Issue #106 + if (cairo_surface_get_type(cairo_get_target(cairo)) != CAIRO_SURFACE_TYPE_PS) { + if (ref && ref->isRef()) { + status = setMimeIdFromRef(image, CAIRO_MIME_TYPE_UNIQUE_ID, "poppler-surface-", ref->getRef()); + if (status) + return; + } + } +#endif + switch (strKind) { case strDCT: mime_type = CAIRO_MIME_TYPE_JPEG; @@ -2908,7 +2922,8 @@ void CairoOutputDev::setMimeData(GfxState *state, Stream *str, Object *ref, GfxI break; #endif default: - return; + mime_type = nullptr; + break; } obj = str->getDict()->lookup("ColorSpace"); @@ -2954,22 +2969,9 @@ void CairoOutputDev::setMimeData(GfxState *state, Stream *str, Object *ref, GfxI return; #endif - if (getStreamData(str->getNextStream(), &strBuffer, &len)) { - cairo_status_t status = CAIRO_STATUS_SUCCESS; - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) - // Since 1.5.10 the cairo PS backend stores images with UNIQUE_ID in PS memory so the - // image can be re-used multiple times. As we don't know how large the images are or - // how many times they are used, there is no benefit in enabling this. Issue #106 - if (cairo_surface_get_type(cairo_get_target(cairo)) != CAIRO_SURFACE_TYPE_PS) { - if (ref && ref->isRef()) { - status = setMimeIdFromRef(image, CAIRO_MIME_TYPE_UNIQUE_ID, "poppler-surface-", ref->getRef()); - } - } -#endif - if (!status) { + if (mime_type) { + if (getStreamData(str->getNextStream(), &strBuffer, &len)) status = cairo_surface_set_mime_data(image, mime_type, (const unsigned char *)strBuffer, len, gfree, strBuffer); - } if (status) gfree(strBuffer);