| //======================================================================== |
| // |
| // SplashBitmap.cc |
| // |
| //======================================================================== |
| |
| #include <config.h> |
| |
| #ifdef USE_GCC_PRAGMAS |
| #pragma implementation |
| #endif |
| |
| #include <stdio.h> |
| #include "goo/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 splashModeRGB8Packed: |
| rowSize = (width * 3 + 3) & ~3; |
| data.rgb8p = (SplashRGB8P *) |
| gmalloc(rowSize * height * sizeof(SplashRGB8P)); |
| 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 splashModeRGB8Packed: |
| gfree(data.rgb8p); |
| break; |
| case splashModeBGR8Packed: |
| gfree(data.bgr8); |
| } |
| } |
| |
| SplashError SplashBitmap::writePNMFile(char *fileName) { |
| FILE *f; |
| SplashMono1P *mono1; |
| SplashMono8 *mono8; |
| SplashRGB8 *rgb8; |
| SplashRGB8P *rgb8pline, *rgb8p; |
| 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 splashModeRGB8Packed: |
| fprintf(f, "P6\n%d %d\n255\n", width, height); |
| rgb8pline = data.rgb8p; |
| for (y = 0; y < height; ++y) { |
| rgb8p = rgb8pline; |
| for (x = 0; x < width; ++x) { |
| fputc(rgb8p[0], f); |
| fputc(rgb8p[1], f); |
| fputc(rgb8p[2], f); |
| rgb8p += 3; |
| } |
| rgb8pline += rowSize; |
| } |
| 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; |
| } |