]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/ImageOutputDev.cc
sssshhh
[evince.git] / pdf / xpdf / ImageOutputDev.cc
index 93d1c31237d2e7d7ad243f0f8a0f0eb6f97f9288..29c7f0f956c137c4c1750de605b9a9dab427d744 100644 (file)
@@ -2,11 +2,13 @@
 //
 // ImageOutputDev.cc
 //
-// Copyright 1998 Derek B. Noonburg
+// Copyright 1998-2003 Glyph & Cog, LLC
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
 #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 +37,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 +63,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 +83,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;
+  Guchar *p;
+  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 +126,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() ^ 0xff, f);
+    }
+
+    str->close();
     fclose(f);
 
   // dump PPM file
@@ -140,12 +178,13 @@ void ImageOutputDev::drawImage(GfxState *state, Stream *str, int width,
     for (y = 0; y < height; ++y) {
 
       // write the line
+      p = imgStr->getLine();
       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(p, &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);
+       p += colorMap->getNumPixelComps();
       }
     }
     delete imgStr;