X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pdf%2Fxpdf%2FImageOutputDev.cc;h=d6c2eb3e7fc8284393ff554c84e39e5edb58c48c;hb=refs%2Ftags%2FGPDF_FOR_GNOME_1_4;hp=93d1c31237d2e7d7ad243f0f8a0f0eb6f97f9288;hpb=50e9d31c05e9ca11ad43cc570556094782c1b956;p=evince.git diff --git a/pdf/xpdf/ImageOutputDev.cc b/pdf/xpdf/ImageOutputDev.cc index 93d1c312..d6c2eb3e 100644 --- a/pdf/xpdf/ImageOutputDev.cc +++ b/pdf/xpdf/ImageOutputDev.cc @@ -2,7 +2,7 @@ // // ImageOutputDev.cc // -// Copyright 1998 Derek B. Noonburg +// Copyright 1998-2002 Glyph & Cog, LLC // //======================================================================== @@ -10,6 +10,7 @@ #pragma implementation #endif +#include #include #include #include @@ -22,10 +23,10 @@ #include "Stream.h" #include "ImageOutputDev.h" -ImageOutputDev::ImageOutputDev(char *fileRoot1, GBool dumpJPEG1) { - fileRoot = copyString(fileRoot1); +ImageOutputDev::ImageOutputDev(char *fileRootA, GBool dumpJPEGA) { + fileRoot = copyString(fileRootA); fileName = (char *)gmalloc(strlen(fileRoot) + 20); - dumpJPEG = dumpJPEG1; + dumpJPEG = dumpJPEGA; imgNum = 0; ok = gTrue; } @@ -35,14 +36,15 @@ ImageOutputDev::~ImageOutputDev() { gfree(fileRoot); } -void ImageOutputDev::drawImageMask(GfxState *state, Stream *str, +void ImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) { FILE *f; int c; + int size, i; // dump JPEG file - if (dumpJPEG && str->getKind() == strDCT) { + if (dumpJPEG && str->getKind() == strDCT && !inlineImg) { // open the image file sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); @@ -60,6 +62,7 @@ void ImageOutputDev::drawImageMask(GfxState *state, Stream *str, while ((c = str->getChar()) != EOF) fputc(c, f); + str->close(); fclose(f); // dump PBM file @@ -79,25 +82,32 @@ void ImageOutputDev::drawImageMask(GfxState *state, Stream *str, str->reset(); // copy the stream - while ((c = str->getChar()) != EOF) - fputc(c, f); + size = height * ((width + 7) / 8); + for (i = 0; i < size; ++i) { + fputc(str->getChar(), f); + } + str->close(); fclose(f); } } -void ImageOutputDev::drawImage(GfxState *state, Stream *str, int width, - int height, GfxImageColorMap *colorMap, - GBool inlineImg) { +void ImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) { FILE *f; ImageStream *imgStr; Guchar pixBuf[4]; - GfxColor color; + GfxRGB rgb; int x, y; int c; + int size, i; // dump JPEG file - if (dumpJPEG && str->getKind() == strDCT) { + if (dumpJPEG && str->getKind() == strDCT && + colorMap->getNumPixelComps() == 3 && + !inlineImg) { // open the image file sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); @@ -115,6 +125,33 @@ void ImageOutputDev::drawImage(GfxState *state, Stream *str, int width, while ((c = str->getChar()) != EOF) fputc(c, f); + str->close(); + fclose(f); + + // dump PBM file + } else if (colorMap->getNumPixelComps() == 1 && + colorMap->getBits() == 1) { + + // open the image file and write the PBM header + sprintf(fileName, "%s-%03d.pbm", fileRoot, imgNum); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(-1, "Couldn't open image file '%s'", fileName); + return; + } + fprintf(f, "P4\n"); + fprintf(f, "%d %d\n", width, height); + + // initialize stream + str->reset(); + + // copy the stream + size = height * ((width + 7) / 8); + for (i = 0; i < size; ++i) { + fputc(str->getChar(), f); + } + + str->close(); fclose(f); // dump PPM file @@ -142,10 +179,10 @@ void ImageOutputDev::drawImage(GfxState *state, Stream *str, int width, // write the line for (x = 0; x < width; ++x) { imgStr->getPixel(pixBuf); - colorMap->getColor(pixBuf, &color); - fputc((int)(color.getR() * 255 + 0.5), f); - fputc((int)(color.getG() * 255 + 0.5), f); - fputc((int)(color.getB() * 255 + 0.5), f); + colorMap->getRGB(pixBuf, &rgb); + fputc((int)(rgb.r * 255 + 0.5), f); + fputc((int)(rgb.g * 255 + 0.5), f); + fputc((int)(rgb.b * 255 + 0.5), f); } } delete imgStr;