//======================================================================== // // ImageOutputDev.cc // // Copyright 1998 Derek B. Noonburg // //======================================================================== #ifdef __GNUC__ #pragma implementation #endif #include #include #include #include #include "gmem.h" #include "config.h" #include "Error.h" #include "GfxState.h" #include "Object.h" #include "Stream.h" #include "ImageOutputDev.h" ImageOutputDev::ImageOutputDev(char *fileRoot1, GBool dumpJPEG1) { fileRoot = copyString(fileRoot1); fileName = (char *)gmalloc(strlen(fileRoot) + 20); dumpJPEG = dumpJPEG1; imgNum = 0; ok = gTrue; } ImageOutputDev::~ImageOutputDev() { gfree(fileName); gfree(fileRoot); } void ImageOutputDev::drawImageMask(GfxState *state, Stream *str, int width, int height, GBool invert, GBool inlineImg) { FILE *f; int c; // dump JPEG file if (dumpJPEG && str->getKind() == strDCT) { // open the image file sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); ++imgNum; if (!(f = fopen(fileName, "wb"))) { error(-1, "Couldn't open image file '%s'", fileName); return; } // initialize stream str = ((DCTStream *)str)->getRawStream(); str->reset(); // copy the stream while ((c = str->getChar()) != EOF) fputc(c, f); fclose(f); // dump PBM file } else { // 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 while ((c = str->getChar()) != EOF) fputc(c, f); fclose(f); } } void ImageOutputDev::drawImage(GfxState *state, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) { FILE *f; Guchar pixBuf[4]; GfxColor color; int x, y; int c; // dump JPEG file if (dumpJPEG && str->getKind() == strDCT) { // open the image file sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); ++imgNum; if (!(f = fopen(fileName, "wb"))) { error(-1, "Couldn't open image file '%s'", fileName); return; } // initialize stream str = ((DCTStream *)str)->getRawStream(); str->reset(); // copy the stream while ((c = str->getChar()) != EOF) fputc(c, f); fclose(f); // dump PPM file } else { // open the image file and write the PPM header sprintf(fileName, "%s-%03d.ppm", fileRoot, imgNum); ++imgNum; if (!(f = fopen(fileName, "wb"))) { error(-1, "Couldn't open image file '%s'", fileName); return; } fprintf(f, "P6\n"); fprintf(f, "%d %d\n", width, height); fprintf(f, "255\n"); // initialize stream str->resetImage(width, colorMap->getNumPixelComps(), colorMap->getBits()); // for each line... for (y = 0; y < height; ++y) { // write the line 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); } } fclose(f); } }