Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/xpdf/PBMOutputDev.cc
diff options
context:
space:
mode:
authorArturo Espinosa <unammx@src.gnome.org>1999-04-17 02:59:58 (GMT)
committer Arturo Espinosa <unammx@src.gnome.org>1999-04-17 02:59:58 (GMT)
commitd9f9a6449f377b4c933b75d57541b19c6d088994 (patch)
tree04f7f0c54447ef792fbf83bc5039174f4681b3bb /pdf/xpdf/PBMOutputDev.cc
Initial revision
Diffstat (limited to 'pdf/xpdf/PBMOutputDev.cc')
-rw-r--r--pdf/xpdf/PBMOutputDev.cc141
1 files changed, 141 insertions, 0 deletions
diff --git a/pdf/xpdf/PBMOutputDev.cc b/pdf/xpdf/PBMOutputDev.cc
new file mode 100644
index 0000000..e21c0ef
--- /dev/null
+++ b/pdf/xpdf/PBMOutputDev.cc
@@ -0,0 +1,141 @@
+//========================================================================
+//
+// PBMOutputDev.cc
+//
+// Copyright 1998 Derek B. Noonburg
+//
+//========================================================================
+
+#ifdef __GNUC__
+#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 "Params.h"
+#include "PBMOutputDev.h"
+
+//------------------------------------------------------------------------
+
+PBMOutputDev *PBMOutputDev::makePBMOutputDev(char *displayName,
+ char *fileRoot1) {
+ Display *display;
+ Pixmap pixmap;
+ Window dummyWin;
+ int screen;
+ int invert;
+ unsigned long black, white;
+
+ if (!(display = XOpenDisplay(displayName))) {
+ fprintf(stderr, "Couldn't open display '%s'\n", displayName);
+ exit(1);
+ }
+ screen = DefaultScreen(display);
+
+ black = BlackPixel(display, screen);
+ white = WhitePixel(display, screen);
+ if ((black & 1) == (white & 1)) {
+ fprintf(stderr, "Weird black/white pixel colors\n");
+ XCloseDisplay(display);
+ return NULL;
+ }
+ invert = (white & 1) == 1 ? 0xff : 0x00;
+
+ dummyWin = XCreateSimpleWindow(display, RootWindow(display, screen),
+ 0, 0, 1, 1, 0,
+ black, white);
+ pixmap = XCreatePixmap(display, dummyWin, 1, 1, 1);
+ return new PBMOutputDev(display, screen, pixmap, dummyWin,
+ invert, fileRoot1);
+}
+
+PBMOutputDev::PBMOutputDev(Display *display1, int screen1,
+ Pixmap pixmap1, Window dummyWin1,
+ int invert1, char *fileRoot1):
+ XOutputDev(display1, pixmap1, 1,
+ DefaultColormap(display1, screen1),
+ WhitePixel(display1, DefaultScreen(display1)))
+{
+ display = display1;
+ screen = screen1;
+ pixmap = pixmap1;
+ dummyWin = dummyWin1;
+ invert = invert1;
+ fileRoot = fileRoot1;
+ fileName = (char *)gmalloc(strlen(fileRoot) + 20);
+}
+
+PBMOutputDev::~PBMOutputDev() {
+ XFreePixmap(display, pixmap);
+ XDestroyWindow(display, dummyWin);
+ XCloseDisplay(display);
+ 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();
+}