Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/splash/SplashBitmap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/splash/SplashBitmap.cc')
-rw-r--r--pdf/splash/SplashBitmap.cc134
1 files changed, 134 insertions, 0 deletions
diff --git a/pdf/splash/SplashBitmap.cc b/pdf/splash/SplashBitmap.cc
new file mode 100644
index 0000000..5ea304f
--- /dev/null
+++ b/pdf/splash/SplashBitmap.cc
@@ -0,0 +1,134 @@
+//========================================================================
+//
+// SplashBitmap.cc
+//
+//========================================================================
+
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <stdio.h>
+#include "gmem.h"
+#include "SplashErrorCodes.h"
+#include "SplashBitmap.h"
+
+//------------------------------------------------------------------------
+// SplashBitmap
+//------------------------------------------------------------------------
+
+SplashBitmap::SplashBitmap(int widthA, int heightA, SplashColorMode modeA) {
+ width = widthA;
+ height = heightA;
+ mode = modeA;
+ switch (mode) {
+ case splashModeMono1:
+ rowSize = (width + 7) >> 3;
+ data.mono1 = (SplashMono1P *)
+ gmalloc(rowSize * height * sizeof(SplashMono1P));
+ break;
+ case splashModeMono8:
+ rowSize = width;
+ data.mono8 = (SplashMono8 *)
+ gmalloc(width * height * sizeof(SplashMono8));
+ break;
+ case splashModeRGB8:
+ rowSize = width << 2;
+ data.rgb8 = (SplashRGB8 *)
+ gmalloc(width * height * sizeof(SplashRGB8));
+ break;
+ case splashModeBGR8Packed:
+ rowSize = (width * 3 + 3) & ~3;
+ data.bgr8 = (SplashBGR8P *)
+ gmalloc(rowSize * height * sizeof(SplashMono1P));
+ }
+}
+
+
+SplashBitmap::~SplashBitmap() {
+ switch (mode) {
+ case splashModeMono1:
+ gfree(data.mono1);
+ break;
+ case splashModeMono8:
+ gfree(data.mono8);
+ break;
+ case splashModeRGB8:
+ gfree(data.rgb8);
+ break;
+ case splashModeBGR8Packed:
+ gfree(data.bgr8);
+ break;
+ }
+}
+
+SplashError SplashBitmap::writePNMFile(char *fileName) {
+ FILE *f;
+ SplashMono1P *mono1;
+ SplashMono8 *mono8;
+ SplashRGB8 *rgb8;
+ SplashBGR8P *bgr8line, *bgr8;
+ int x, y;
+
+ if (!(f = fopen(fileName, "wb"))) {
+ return splashErrOpenFile;
+ }
+
+ switch (mode) {
+
+ case splashModeMono1:
+ fprintf(f, "P4\n%d %d\n", width, height);
+ mono1 = data.mono1;
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; x += 8) {
+ fputc(*mono1 ^ 0xff, f);
+ ++mono1;
+ }
+ }
+ break;
+
+ case splashModeMono8:
+ fprintf(f, "P5\n%d %d\n255\n", width, height);
+ mono8 = data.mono8;
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ fputc(*mono8, f);
+ ++mono8;
+ }
+ }
+ break;
+
+ case splashModeRGB8:
+ fprintf(f, "P6\n%d %d\n255\n", width, height);
+ rgb8 = data.rgb8;
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ fputc(splashRGB8R(*rgb8), f);
+ fputc(splashRGB8G(*rgb8), f);
+ fputc(splashRGB8B(*rgb8), f);
+ ++rgb8;
+ }
+ }
+ break;
+
+ case splashModeBGR8Packed:
+ fprintf(f, "P6\n%d %d\n255\n", width, height);
+ bgr8line = data.bgr8;
+ for (y = 0; y < height; ++y) {
+ bgr8 = bgr8line;
+ for (x = 0; x < width; ++x) {
+ fputc(bgr8[2], f);
+ fputc(bgr8[1], f);
+ fputc(bgr8[0], f);
+ bgr8 += 3;
+ }
+ bgr8line += rowSize;
+ }
+ break;
+ }
+
+ fclose(f);
+ return splashOk;
+}