poppler/Stream.cc | 4 +-- utils/ImageOutputDev.cc | 54 +++++++++++------------------------------------- 2 files changed, 15 insertions(+), 43 deletions(-)
New commits: commit c4cbb4fd5e062544bf34109140266d0b027a512b Author: Adrian Johnson <ajohn...@redneon.com> Date: Mon Oct 30 19:21:41 2017 +1030 Fix pdfimages with flate encoded inline images - Remove advance strem pos to end of image code from listImage(). getInlineImageLength() already does this. - Always EmbedStream in getInlineImageLength() to get size of stored image. The type of encoding does not matter. - Use same record EmbeddeStream code for all image types in writeImage() - Fix some memory leaks Bug #103446 diff --git a/utils/ImageOutputDev.cc b/utils/ImageOutputDev.cc index 41bbcdb4..64505421 100644 --- a/utils/ImageOutputDev.cc +++ b/utils/ImageOutputDev.cc @@ -20,7 +20,7 @@ // Copyright (C) 2009 Carlos Garcia Campos <carlo...@gnome.org> // Copyright (C) 2009 William Bader <williamba...@hotmail.com> // Copyright (C) 2010 Jakob Voss <jakob.v...@gbv.de> -// Copyright (C) 2012, 2013, 2017 Adrian Johnson <ajohn...@redneon.com> +// Copyright (C) 2012, 2013, 2017, 2018 Adrian Johnson <ajohn...@redneon.com> // Copyright (C) 2013 Thomas Fischer <fisc...@unix-ag.uni-kl.de> // Copyright (C) 2013 Hib Eris <h...@hiberis.nl> // Copyright (C) 2017 Caolán McNamara <caol...@redhat.com> @@ -292,25 +292,6 @@ void ImageOutputDev::listImage(GfxState *state, Object *ref, Stream *str, ++imgNum; - if (inlineImg) { - // For inline images we need to advance the stream position to the end of the image - // as Gfx needs to continue reading content after the image data. - ImageFormat format; - if (!colorMap || (colorMap->getNumPixelComps() == 1 && colorMap->getBits() == 1)) { - format = imgMonochrome; - } else if (colorMap->getColorSpace()->getMode() == csDeviceGray || - colorMap->getColorSpace()->getMode() == csCalGray) { - format = imgGray; - } else if ((colorMap->getColorSpace()->getMode() == csDeviceRGB || - colorMap->getColorSpace()->getMode() == csCalRGB || - (colorMap->getColorSpace()->getMode() == csICCBased && colorMap->getNumPixelComps() == 3)) && - colorMap->getBits() > 8) { - format = imgRGB48; - } else { - format = imgRGB; - } - writeImageFile(NULL, format, "", str, width, height, colorMap); - } } long ImageOutputDev::getInlineImageLength(Stream *str, int width, int height, @@ -337,16 +318,12 @@ long ImageOutputDev::getInlineImageLength(Stream *str, int width, int height, EmbedStream *embedStr = (EmbedStream *) (str->getBaseStream()); embedStr->rewind(); - if (str->getKind() == strDCT || str->getKind() == strCCITTFax) - str = str->getNextStream(); len = 0; - str->reset(); - while (str->getChar() != EOF) + while (embedStr->getChar() != EOF) len++; embedStr->restore(); - return len; } @@ -539,19 +516,18 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, ImageFormat format; EmbedStream *embedStr; - if (dumpJPEG && str->getKind() == strDCT) { - if (inlineImg) { + if (inlineImg) { embedStr = (EmbedStream *) (str->getBaseStream()); - getInlineImageLength(str, width, height, colorMap); // record the strean + // Record the stream. This determines the size. + getInlineImageLength(str, width, height, colorMap); + // Reading the stream again will return EOF at end of recording. embedStr->rewind(); - } + } + if (dumpJPEG && str->getKind() == strDCT) { // dump JPEG file writeRawImage(str, "jpg"); - if (inlineImg) - embedStr->restore(); - } else if (dumpJP2 && str->getKind() == strJPX && !inlineImg) { // dump JPEG2000 file writeRawImage(str, "jp2"); @@ -612,18 +588,9 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, fclose(f); - if (inlineImg) { - embedStr = (EmbedStream *) (str->getBaseStream()); - getInlineImageLength(str, width, height, colorMap); // record the strean - embedStr->rewind(); - } - // dump CCITT file writeRawImage(str, "ccitt"); - if (inlineImg) - embedStr->restore(); - } else if (outputPNG && !(outputTiff && colorMap && (colorMap->getColorSpace()->getMode() == csDeviceCMYK || (colorMap->getColorSpace()->getMode() == csICCBased && @@ -653,6 +620,7 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, writeImageFile(writer, format, "png", str, width, height, colorMap); #endif + delete writer; } else if (outputTiff) { // output in TIFF format @@ -684,6 +652,7 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, writeImageFile(writer, format, "tif", str, width, height, colorMap); #endif + delete writer; } else { // output in PPM/PBM format @@ -703,6 +672,9 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, delete writer; } + + if (inlineImg) + embedStr->restore(); } GBool ImageOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, commit f87238296f7a81f131f2525c4ea3a26d14e8a7ff Author: Adrian Johnson <ajohn...@redneon.com> Date: Wed Jan 3 08:36:58 2018 +1030 Fix EmbedStream replay Bug #103446 diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 2dbd6c82..32288221 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -27,7 +27,7 @@ // Copyright (C) 2012 Oliver Sander <san...@mi.fu-berlin.de> // Copyright (C) 2012 Fabio D'Urso <fabiodu...@hotmail.it> // Copyright (C) 2012 Even Rouault <even.roua...@mines-paris.org> -// Copyright (C) 2013, 2017 Adrian Johnson <ajohn...@redneon.com> +// Copyright (C) 2013, 2017, 2018 Adrian Johnson <ajohn...@redneon.com> // Copyright (C) 2013 Adam Reichold <adamreich...@myopera.com> // Copyright (C) 2013 Pino Toscano <p...@kde.org> // Copyright (C) 2015 Suzuki Toshiya <mpsuz...@hiroshima-u.ac.jp> @@ -1137,7 +1137,7 @@ int EmbedStream::getChars(int nChars, Guchar *buffer) { len = bufLen - bufPos; if (nChars > len) nChars = len; - memcpy(buffer, bufData, len); + memcpy(buffer, bufData, nChars); return len; } else { if (limited && length < nChars) {
_______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler