summaryrefslogtreecommitdiffstats
path: root/filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp')
-rw-r--r--filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp b/filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp
new file mode 100644
index 000000000..4a65ac041
--- /dev/null
+++ b/filters/kword/pdf/xpdf/xpdf/PBMOutputDev.cpp
@@ -0,0 +1,162 @@
+//========================================================================
+//
+// PBMOutputDev.cpp
+//
+// Copyright 1998-2002 Glyph & Cog, LLC
+//
+//========================================================================
+
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include "gmem.h"
+#include "GString.h"
+#include "Object.h"
+#include "Stream.h"
+#include "GfxState.h"
+#include "GfxFont.h"
+#include "Error.h"
+#include "PBMOutputDev.h"
+
+//------------------------------------------------------------------------
+
+PBMOutputDev *PBMOutputDev::makePBMOutputDev(char *displayName,
+ char *fileRootA) {
+ Display *displayA;
+ Pixmap pixmapA;
+ Window dummyWinA;
+ int screenA;
+ int invertA;
+ unsigned long black, white;
+ PBMOutputDev *out;
+
+ if (!(displayA = XOpenDisplay(displayName))) {
+ fprintf(stderr, "Couldn't open display '%s'\n", displayName);
+ exit(1);
+ }
+ screenA = DefaultScreen(displayA);
+
+ black = BlackPixel(displayA, screenA);
+ white = WhitePixel(displayA, screenA);
+ if ((black & 1) == (white & 1)) {
+ fprintf(stderr, "Weird black/white pixel colors\n");
+ XCloseDisplay(displayA);
+ return NULL;
+ }
+ invertA = (white & 1) == 1 ? 0xff : 0x00;
+
+ dummyWinA = XCreateSimpleWindow(displayA, RootWindow(displayA, screenA),
+ 0, 0, 1, 1, 0,
+ black, white);
+ pixmapA = XCreatePixmap(displayA, dummyWinA, 1, 1, 1);
+ out = new PBMOutputDev(displayA, screenA, pixmapA, dummyWinA,
+ invertA, fileRootA);
+ return out;
+}
+
+void PBMOutputDev::killPBMOutputDev(PBMOutputDev *out) {
+ Display *displayA;
+ Pixmap pixmapA;
+ Window dummyWinA;
+
+ displayA = out->display;
+ pixmapA = out->pixmap;
+ dummyWinA = out->dummyWin;
+
+ delete out;
+
+ // these have to be done *after* the XOutputDev (parent of the
+ // PBMOutputDev) is deleted, since XOutputDev::~XOutputDev() needs
+ // them
+ XFreePixmap(displayA, pixmapA);
+ XDestroyWindow(displayA, dummyWinA);
+ XCloseDisplay(displayA);
+}
+
+PBMOutputDev::PBMOutputDev(Display *displayA, int screenA,
+ Pixmap pixmapA, Window dummyWinA,
+ int invertA, char *fileRootA):
+ XOutputDev(displayA, screenA,
+ DefaultVisual(displayA, screenA),
+ DefaultColormap(displayA, screenA),
+ gFalse,
+ WhitePixel(displayA, DefaultScreen(displayA)),
+ gFalse, 1, 1)
+{
+ display = displayA;
+ screen = screenA;
+ pixmap = pixmapA;
+ dummyWin = dummyWinA;
+ invert = invertA;
+ fileRoot = fileRootA;
+ fileName = (char *)gmalloc(strlen(fileRoot) + 20);
+}
+
+PBMOutputDev::~PBMOutputDev() {
+ gfree(fileName);
+}
+
+void PBMOutputDev::startPage(int pageNum, GfxState *state) {
+ curPage = pageNum;
+ width = (int)(state->getPageWidth() + 0.5);
+ height = (int)(state->getPageHeight() + 0.5);
+ XFreePixmap(display, pixmap);
+ pixmap = XCreatePixmap(display, dummyWin, width, height, 1);
+ setPixmap(pixmap, width, height);
+ XOutputDev::startPage(pageNum, state);
+}
+
+void PBMOutputDev::endPage() {
+ XImage *image;
+ FILE *f;
+ int p;
+ int x, y, i;
+
+ image = XCreateImage(display, DefaultVisual(display, screen),
+ 1, ZPixmap, 0, NULL, width, height, 8, 0);
+ image->data = (char *)gmalloc(height * image->bytes_per_line);
+ XGetSubImage(display, pixmap, 0, 0, width, height, 1, ZPixmap,
+ image, 0, 0);
+
+ sprintf(fileName, "%s-%06d.pbm", fileRoot, curPage);
+ if (!(f = fopen(fileName, "wb"))) {
+ fprintf(stderr, "Couldn't open output file '%s'\n", fileName);
+ goto err;
+ }
+ fprintf(f, "P4\n");
+ fprintf(f, "%d %d\n", width, height);
+
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x+8 <= width; x += 8) {
+ p = 0;
+ for (i = 0; i < 8; ++i)
+ p = (p << 1) + (XGetPixel(image, x+i, y) & 1);
+ p ^= invert;
+ fputc((char)p, f);
+ }
+ if (width & 7) {
+ p = 0;
+ for (i = 0; i < (width & 7); ++i)
+ p = (p << 1) + (XGetPixel(image, x+i, y) & 1);
+ p <<= 8 - (width & 7);
+ p ^= invert;
+ fputc((char)p, f);
+ }
+ }
+
+ fclose(f);
+
+ err:
+ gfree(image->data);
+ image->data = NULL;
+ XDestroyImage(image);
+
+ XOutputDev::endPage();
+}