From e2c9fcf09dea6a71636d72c4d81476eb62a08544 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Tue, 14 Dec 2010 09:06:57 +1030 Subject: [PATCH] cairo: Use A1 instead of A8 for imagemask The cairo PDF surface now optimizes the case of cairo_mask() with solid source and A1 mask to use a PDF stencil mask. Fixes https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/680628 where a 65K PDF printed to PDF using poppler-cairo turns into an 8MB PDF. --- CMakeLists.txt | 2 ++ configure.ac | 1 + poppler/CairoOutputDev.cc | 25 ++++++++++++++++++------- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 758c8c9..4043722 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,8 @@ find_package(PkgConfig) include(MacroEnsureVersion) include(MacroBoolTo01) find_package(Threads) +include(TestBigEndian) +test_big_endian(WORDS_BIGENDIAN) set(POPPLER_MAJOR_VERSION "0") set(POPPLER_MINOR_VERSION "15") diff --git a/configure.ac b/configure.ac index 1249a7d..088aac5 100644 --- a/configure.ac +++ b/configure.ac @@ -10,6 +10,7 @@ AM_INIT_AUTOMAKE([foreign]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(poppler/poppler-config.h) +AC_C_BIGENDIAN dnl ##### Initialize libtool. AC_LIBTOOL_WIN32_DLL diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index e7c9dc5..0507f8c 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -1550,7 +1550,7 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * unsigned char *dest; cairo_surface_t *image; cairo_pattern_t *pattern; - int x, y; + int x, y, i, bit; ImageStream *imgStr; Guchar *pix; cairo_matrix_t matrix; @@ -1562,7 +1562,7 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * imgStr = new ImageStream(str, width, 1, 1); imgStr->reset(); - image = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height); if (cairo_surface_status (image)) goto cleanup; @@ -1574,12 +1574,23 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * for (y = 0; y < height; y++) { pix = imgStr->getLine(); dest = buffer + y * row_stride; + i = 0; + bit = 0; for (x = 0; x < width; x++) { - - if (pix[x] ^ invert_bit) - *dest++ = 0; - else - *dest++ = 255; + if (bit == 0) + dest[i] = 0; + if (!(pix[x] ^ invert_bit)) { +#ifdef WORDS_BIGENDIAN + dest[i] |= (1 << (7 - bit)); +#else + dest[i] |= (1 << bit); +#endif + } + bit++; + if (bit > 7) { + bit = 0; + i++; + } } } -- 1.5.6.5