//
// 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;
}
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);
while ((c = str->getChar()) != EOF)
fputc(c, f);
+ str->close();
fclose(f);
// dump PBM file
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;
- Guchar pixBuf[4];
- GfxColor color;
+ ImageStream *imgStr;
+ 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);
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
fprintf(f, "255\n");
// initialize stream
- str->resetImage(width, colorMap->getNumPixelComps(), colorMap->getBits());
+ imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+ colorMap->getBits());
+ imgStr->reset();
// for each line...
for (y = 0; y < height; ++y) {
// write the line
+ p = imgStr->getLine();
for (x = 0; x < width; ++x) {
- str->getImagePixel(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;
fclose(f);
}