source: trunk/poppler/mypoppler/splash/SplashBitmap.cc @ 44

Last change on this file since 44 was 44, checked in by Eugene Romanenko, 15 years ago

poppler updated to version 0.5.3, related changes

File size: 5.3 KB
Line 
1//========================================================================
2//
3// SplashBitmap.cc
4//
5//========================================================================
6
7#include <config.h>
8
9#ifdef USE_GCC_PRAGMAS
10#pragma implementation
11#endif
12
13#include <stdio.h>
14#include "goo/gmem.h"
15#include "SplashErrorCodes.h"
16#include "SplashBitmap.h"
17
18//------------------------------------------------------------------------
19// SplashBitmap
20//------------------------------------------------------------------------
21
22SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPad,
23                           SplashColorMode modeA, GBool topDown) {
24  width = widthA;
25  height = heightA;
26  mode = modeA;
27  switch (mode) {
28  case splashModeMono1:
29    rowSize = (width + 7) >> 3;
30    break;
31  case splashModeMono8:
32    rowSize = width;
33    break;
34  case splashModeAMono8:
35    rowSize = width * 2;
36    break;
37  case splashModeRGB8:
38  case splashModeBGR8:
39    rowSize = width * 3;
40    break;
41  case splashModeRGB8Qt:
42  case splashModeARGB8:
43  case splashModeBGRA8:
44#if SPLASH_CMYK
45  case splashModeCMYK8:
46#endif
47    rowSize = width * 4;
48    break;
49#if SPLASH_CMYK
50  case splashModeACMYK8:
51    rowSize = width * 5;
52    break;
53#endif
54  }
55  rowSize += rowPad - 1;
56  rowSize -= rowSize % rowPad;
57  data = (SplashColorPtr)gmalloc(rowSize * height);
58  if (!topDown) {
59    data += (height - 1) * rowSize;
60    rowSize = -rowSize;
61  }
62}
63
64
65SplashBitmap::~SplashBitmap() {
66  if (rowSize < 0) {
67    gfree(data + (height - 1) * rowSize);
68  } else {
69    gfree(data);
70  }
71}
72
73SplashError SplashBitmap::writePNMFile(char *fileName) {
74  FILE *f;
75  SplashColorPtr row, p;
76  int x, y;
77
78  if (!(f = fopen(fileName, "wb"))) {
79    return splashErrOpenFile;
80  }
81
82  switch (mode) {
83
84  case splashModeMono1:
85    fprintf(f, "P4\n%d %d\n", width, height);
86    row = data;
87    for (y = 0; y < height; ++y) {
88      p = row;
89      for (x = 0; x < width; x += 8) {
90        fputc(*p ^ 0xff, f);
91        ++p;
92      }
93      row += rowSize;
94    }
95    break;
96
97  case splashModeMono8:
98    fprintf(f, "P5\n%d %d\n255\n", width, height);
99    row = data;
100    for (y = 0; y < height; ++y) {
101      p = row;
102      for (x = 0; x < width; ++x) {
103        fputc(*p, f);
104        ++p;
105      }
106      row += rowSize;
107    }
108    break;
109
110  case splashModeAMono8:
111    fprintf(f, "P5\n%d %d\n255\n", width, height);
112    row = data;
113    for (y = 0; y < height; ++y) {
114      p = row;
115      for (x = 0; x < width; ++x) {
116        fputc(splashAMono8M(p), f);
117        p += 2;
118      }
119      row += rowSize;
120    }
121    break;
122
123  case splashModeRGB8:
124    fprintf(f, "P6\n%d %d\n255\n", width, height);
125    row = data;
126    for (y = 0; y < height; ++y) {
127      p = row;
128      for (x = 0; x < width; ++x) {
129        fputc(splashRGB8R(p), f);
130        fputc(splashRGB8G(p), f);
131        fputc(splashRGB8B(p), f);
132        p += 3;
133      }
134      row += rowSize;
135    }
136    break;
137
138  case splashModeBGR8:
139    fprintf(f, "P6\n%d %d\n255\n", width, height);
140    row = data;
141    for (y = 0; y < height; ++y) {
142      p = row;
143      for (x = 0; x < width; ++x) {
144        fputc(splashBGR8R(p), f);
145        fputc(splashBGR8G(p), f);
146        fputc(splashBGR8B(p), f);
147        p += 3;
148      }
149      row += rowSize;
150    }
151    break;
152
153 case splashModeRGB8Qt:
154    fprintf(f, "P6\n%d %d\n255\n", width, height);
155    row = data;
156    for (y = 0; y < height; ++y) {
157      p = row;
158      for (x = 0; x < width; ++x) {
159        fputc(splashRGB8R(p), f);
160        fputc(splashRGB8G(p), f);
161        fputc(splashRGB8B(p), f);
162        p += 4;
163      }
164      row += rowSize;
165    }
166    break;
167
168  case splashModeARGB8:
169    fprintf(f, "P6\n%d %d\n255\n", width, height);
170    row = data;
171    for (y = 0; y < height; ++y) {
172      p = row;
173      for (x = 0; x < width; ++x) {
174        fputc(splashARGB8R(p), f);
175        fputc(splashARGB8G(p), f);
176        fputc(splashARGB8B(p), f);
177        p += 4;
178      }
179      row += rowSize;
180    }
181    break;
182
183  case splashModeBGRA8:
184    fprintf(f, "P6\n%d %d\n255\n", width, height);
185    row = data;
186    for (y = 0; y < height; ++y) {
187      p = row;
188      for (x = 0; x < width; ++x) {
189        fputc(splashBGRA8R(p), f);
190        fputc(splashBGRA8G(p), f);
191        fputc(splashBGRA8B(p), f);
192        p += 4;
193      }
194      row += rowSize;
195    }
196    break;
197
198#if SPLASH_CMYK
199  case splashModeCMYK8:
200  case splashModeACMYK8:
201    // PNM doesn't support CMYK
202    break;
203#endif
204  }
205
206  fclose(f);
207  return splashOk;
208}
209
210void SplashBitmap::getPixel(int x, int y, SplashColorPtr pixel) {
211  SplashColorPtr p;
212
213  if (y < 0 || y >= height || x < 0 || x >= width) {
214    return;
215  }
216  switch (mode) {
217  case splashModeMono1:
218    p = &data[y * rowSize + (x >> 3)];
219    pixel[0] = (p[0] >> (7 - (x & 7))) & 1;
220    break;
221  case splashModeMono8:
222    p = &data[y * rowSize + x];
223    pixel[0] = p[0];
224    break;
225  case splashModeAMono8:
226    p = &data[y * rowSize + 2 * x];
227    pixel[0] = p[0];
228    pixel[1] = p[1];
229    break;
230  case splashModeRGB8:
231  case splashModeBGR8:
232    p = &data[y * rowSize + 3 * x];
233    pixel[0] = p[0];
234    pixel[1] = p[1];
235    pixel[2] = p[2];
236    break;
237  case splashModeRGB8Qt:
238    p = &data[y * rowSize + 4 * x];
239    pixel[0] = p[2];
240    pixel[1] = p[1];
241    pixel[2] = p[0];
242    break;
243  case splashModeARGB8:
244  case splashModeBGRA8:
245#if SPLASH_CMYK
246  case splashModeCMYK8:
247#endif
248    p = &data[y * rowSize + 4 * x];
249    pixel[0] = p[0];
250    pixel[1] = p[1];
251    pixel[2] = p[2];
252    pixel[3] = p[3];
253    break;
254#if SPLASH_CMYK
255  case splashModeACMYK8:
256    p = &data[y * rowSize + 5 * x];
257    pixel[0] = p[0];
258    pixel[1] = p[1];
259    pixel[2] = p[2];
260    pixel[3] = p[3];
261    pixel[4] = p[4];
262    break;
263#endif
264  }
265}
Note: See TracBrowser for help on using the repository browser.