Diffstat (limited to 'noncore/apps/opie-reader/Palm2QImage.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/Palm2QImage.cpp | 134 |
1 files changed, 57 insertions, 77 deletions
diff --git a/noncore/apps/opie-reader/Palm2QImage.cpp b/noncore/apps/opie-reader/Palm2QImage.cpp index b0d4e00..c1b7b7a 100644 --- a/noncore/apps/opie-reader/Palm2QImage.cpp +++ b/noncore/apps/opie-reader/Palm2QImage.cpp | |||
@@ -1,13 +1,6 @@ | |||
1 | /* -*- mode: c; indent-tabs-mode: nil; -*- */ | 1 | /* -*- mode: c; indent-tabs-mode: nil; -*- */ |
2 | 2 | #include "useqpe.h" | |
3 | /* OPIE */ | ||
4 | #include <opie2/odebug.h> | ||
5 | |||
6 | /* QT */ | ||
7 | #include <qimage.h> | ||
8 | |||
9 | /* STD */ | ||
10 | #include <stdio.h> | 3 | #include <stdio.h> |
11 | #include <stdlib.h> | 4 | #include <stdlib.h> |
12 | #include <string.h> | 5 | #include <string.h> |
13 | #ifndef _WINDOWS | 6 | #ifndef _WINDOWS |
@@ -16,8 +9,9 @@ | |||
16 | #include <sys/types.h> | 9 | #include <sys/types.h> |
17 | #include <sys/stat.h> | 10 | #include <sys/stat.h> |
18 | #include <stdarg.h> | 11 | #include <stdarg.h> |
19 | 12 | ||
13 | #include <qimage.h> | ||
20 | 14 | ||
21 | /***********************************************************************/ | 15 | /***********************************************************************/ |
22 | /***********************************************************************/ | 16 | /***********************************************************************/ |
23 | /***** *****/ | 17 | /***** *****/ |
@@ -48,12 +42,12 @@ typedef struct { | |||
48 | unsigned char blue; | 42 | unsigned char blue; |
49 | } ColorMapEntry; | 43 | } ColorMapEntry; |
50 | 44 | ||
51 | static ColorMapEntry Palm8BitColormap[] = { | 45 | static ColorMapEntry Palm8BitColormap[] = { |
52 | { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, | 46 | { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, |
53 | { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, | 47 | { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, |
54 | { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, | 48 | { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, |
55 | { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, | 49 | { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, |
56 | { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, | 50 | { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, |
57 | { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, | 51 | { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, |
58 | { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, | 52 | { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, |
59 | { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, | 53 | { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, |
@@ -145,40 +139,38 @@ QImage* Palm2QImage | |||
145 | next_depth_offset = READ_BIGENDIAN_SHORT(palmimage + 10); | 139 | next_depth_offset = READ_BIGENDIAN_SHORT(palmimage + 10); |
146 | transparent_index = palmimage[12]; | 140 | transparent_index = palmimage[12]; |
147 | compression_type = palmimage[13]; | 141 | compression_type = palmimage[13]; |
148 | /* bytes 14 and 15 are reserved by Palm and always 0 */ | 142 | /* bytes 14 and 15 are reserved by Palm and always 0 */ |
149 | 143 | ||
150 | #if 0 | 144 | #if 0 |
151 | // odebug << "Palm image is " << width << "x" << height | 145 | // qDebug ("Palm image is %dx%d, %d bpp, version %d, flags 0x%x, compression %d", width, height, bits_per_pixel, version, flags, compression_type); |
152 | // << ", " << bits_per_pixel << " bpp, version " << version | ||
153 | // << ", flags 0x" << flags << ", compression " << compression_type << oendl; | ||
154 | #endif | 146 | #endif |
155 | 147 | ||
156 | if (compression_type == PALM_COMPRESSION_PACKBITS) { | 148 | if (compression_type == PALM_COMPRESSION_PACKBITS) { |
157 | // odebug << "Image uses packbits compression; not yet supported" << oendl; | 149 | // qDebug ("Image uses packbits compression; not yet supported"); |
158 | return NULL; | 150 | return NULL; |
159 | } else if ((compression_type != PALM_COMPRESSION_NONE) && | 151 | } else if ((compression_type != PALM_COMPRESSION_NONE) && |
160 | (compression_type != PALM_COMPRESSION_RLE) && | 152 | (compression_type != PALM_COMPRESSION_RLE) && |
161 | (compression_type != PALM_COMPRESSION_SCANLINE)) { | 153 | (compression_type != PALM_COMPRESSION_SCANLINE)) { |
162 | // odebug << "Image uses unknown compression, code 0x" << compression_type << oendl; | 154 | // qDebug ("Image uses unknown compression, code 0x%x", compression_type); |
163 | return NULL; | 155 | return NULL; |
164 | } | 156 | } |
165 | 157 | ||
166 | /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: | 158 | /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: |
167 | 159 | ||
168 | 1, 2, or 4 bit grayscale | 160 | 1, 2, or 4 bit grayscale |
169 | 8-bit StaticColor using the Palm standard colormap | 161 | 8-bit StaticColor using the Palm standard colormap |
170 | 8-bit PseudoColor using a user-specified colormap | 162 | 8-bit PseudoColor using a user-specified colormap |
171 | 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue | 163 | 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue |
172 | 164 | ||
173 | Each of these can be compressed with one of four compression schemes, | 165 | Each of these can be compressed with one of four compression schemes, |
174 | "RLE", "Scanline", "PackBits", or none. | 166 | "RLE", "Scanline", "PackBits", or none. |
175 | 167 | ||
176 | We begin by constructing the colormap. | 168 | We begin by constructing the colormap. |
177 | */ | 169 | */ |
178 | 170 | ||
179 | if (flags & PALM_HAS_COLORMAP_FLAG) { | 171 | if (flags & PALM_HAS_COLORMAP_FLAG) { |
180 | // odebug << "Palm images with custom colormaps are not currently supported." << oendl; | 172 | // qDebug("Palm images with custom colormaps are not currently supported.\n"); |
181 | return NULL; | 173 | return NULL; |
182 | } else if (bits_per_pixel == 1) { | 174 | } else if (bits_per_pixel == 1) { |
183 | colormap = Palm1BitColormap; | 175 | colormap = Palm1BitColormap; |
184 | imagedatastart = palmimage + 16; | 176 | imagedatastart = palmimage + 16; |
@@ -195,22 +187,20 @@ QImage* Palm2QImage | |||
195 | colormap = NULL; | 187 | colormap = NULL; |
196 | palm_red_bits = palmimage[16]; | 188 | palm_red_bits = palmimage[16]; |
197 | palm_green_bits = palmimage[17]; | 189 | palm_green_bits = palmimage[17]; |
198 | palm_blue_bits = palmimage[18]; | 190 | palm_blue_bits = palmimage[18]; |
199 | // odebug << "Bits:" << palm_red_bits << ", " << palm_green_bits << ", " << palm_blue_bits << oendl; | 191 | // qDebug("Bits:%d, %d, %d", palm_red_bits, palm_green_bits, palm_blue_bits); |
200 | if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { | 192 | if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { |
201 | // odebug << "Can't handle this format DirectColor image -- too wide in some color (" | 193 | // qDebug("Can't handle this format DirectColor image -- too wide in some color (%d:%d:%d)\n", palm_red_bits, palm_green_bits, palm_blue_bits); |
202 | // << palm_red_bits << ":" << palm_green_bits << ":" << palm_blue_bits << oendl; | ||
203 | return NULL; | 194 | return NULL; |
204 | } | 195 | } |
205 | if (bits_per_pixel > (8 * sizeof(unsigned long))) { | 196 | if (bits_per_pixel > (8 * sizeof(unsigned long))) { |
206 | // odebug << "Can't handle this format DirectColor image -- too many bits per pixel (" | 197 | // qDebug ("Can't handle this format DirectColor image -- too many bits per pixel (%d)\n", bits_per_pixel); |
207 | // << bits_per_pixel << ")" << oendl; | ||
208 | return NULL; | 198 | return NULL; |
209 | } | 199 | } |
210 | imagedatastart = palmimage + 24; | 200 | imagedatastart = palmimage + 24; |
211 | } else { | 201 | } else { |
212 | // odebug << "Unknown bits-per-pixel of " << bits_per_pixel << " encountered" << oendl; | 202 | // qDebug("Unknown bits-per-pixel of %d encountered.\n", bits_per_pixel); |
213 | return NULL; | 203 | return NULL; |
214 | } | 204 | } |
215 | 205 | ||
216 | #ifndef USEQPE | 206 | #ifndef USEQPE |
@@ -223,29 +213,28 @@ QImage* Palm2QImage | |||
223 | rowbuf = new unsigned char[bytes_per_row * width]; | 213 | rowbuf = new unsigned char[bytes_per_row * width]; |
224 | lastrow = new unsigned char[bytes_per_row * width]; | 214 | lastrow = new unsigned char[bytes_per_row * width]; |
225 | 215 | ||
226 | for (i=0, palm_ptr = imagedatastart , x_ptr = imagedata; i < height; ++i) { | 216 | for (i=0, palm_ptr = imagedatastart , x_ptr = imagedata; i < height; ++i) { |
227 | // odebug << "inval:" << inval << " palm_ptr:" << palm_ptr << " x_ptr:" << x_ptr | 217 | // qDebug("inval:%x palm_ptr:%x x_ptr:%x bpr:%x", inval, palm_ptr, x_ptr, bytes_per_row); |
228 | // << " bpr:" << bytes_per_row << oendl; | ||
229 | 218 | ||
230 | /* first, uncompress the Palm image */ | 219 | /* first, uncompress the Palm image */ |
231 | if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { | 220 | if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { |
232 | for (j = 0; j < bytes_per_row; ) { | 221 | for (j = 0; j < bytes_per_row; ) { |
233 | incount = *palm_ptr++; | 222 | incount = *palm_ptr++; |
234 | inval = *palm_ptr++; | 223 | inval = *palm_ptr++; |
235 | memset(rowbuf + j, inval, incount); | 224 | memset(rowbuf + j, inval, incount); |
236 | j += incount; | 225 | j += incount; |
237 | } | 226 | } |
238 | } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { | 227 | } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { |
239 | for (j = 0; j < bytes_per_row; j += 8) { | 228 | for (j = 0; j < bytes_per_row; j += 8) { |
240 | incount = *palm_ptr++; | 229 | incount = *palm_ptr++; |
241 | inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; | 230 | inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; |
242 | for (inbit = 0; inbit < inval; inbit += 1) { | 231 | for (inbit = 0; inbit < inval; inbit += 1) { |
243 | if (incount & (1 << (7 - inbit))) | 232 | if (incount & (1 << (7 - inbit))) |
244 | rowbuf[j + inbit] = *palm_ptr++; | 233 | rowbuf[j + inbit] = *palm_ptr++; |
245 | else | 234 | else |
246 | rowbuf[j + inbit] = lastrow[j + inbit]; | 235 | rowbuf[j + inbit] = lastrow[j + inbit]; |
247 | } | 236 | } |
248 | } | 237 | } |
249 | memcpy (lastrow, rowbuf, bytes_per_row); | 238 | memcpy (lastrow, rowbuf, bytes_per_row); |
250 | } else if (((flags & PALM_IS_COMPRESSED_FLAG) && | 239 | } else if (((flags & PALM_IS_COMPRESSED_FLAG) && |
251 | (compression_type == PALM_COMPRESSION_NONE)) || | 240 | (compression_type == PALM_COMPRESSION_NONE)) || |
@@ -254,51 +243,52 @@ QImage* Palm2QImage | |||
254 | memcpy (rowbuf, palm_ptr, bytes_per_row); | 243 | memcpy (rowbuf, palm_ptr, bytes_per_row); |
255 | palm_ptr += bytes_per_row; | 244 | palm_ptr += bytes_per_row; |
256 | } | 245 | } |
257 | else { | 246 | else { |
258 | odebug << "Case 4" << oendl; | 247 | qDebug("Case 4"); |
259 | odebug << "Is compressed:" << (((flags & PALM_IS_COMPRESSED_FLAG) == 0) ? "false" : "true") << oendl; | 248 | qDebug("Is compressed:%s", ((flags & PALM_IS_COMPRESSED_FLAG) == 0) ? "false" : "true"); |
260 | odebug << "Has colourmap:" << (((flags & PALM_HAS_COLORMAP_FLAG) == 0) ? "false" : "true") << oendl; | 249 | qDebug("Has colourmap:%s", ((flags & PALM_HAS_COLORMAP_FLAG) == 0) ? "false" : "true"); |
261 | odebug << "Has transparency:" << (((flags & PALM_HAS_TRANSPARENCY_FLAG) == 0) ? "false" : "true") << oendl; | 250 | qDebug("Has transparency:%s", ((flags & PALM_HAS_TRANSPARENCY_FLAG) == 0) ? "false" : "true"); |
262 | odebug << "Direct colour:" << (((flags & PALM_DIRECT_COLOR_FLAG) == 0) ? "false" : "true") << oendl; | 251 | qDebug("Direct colour:%s", ((flags & PALM_DIRECT_COLOR_FLAG) == 0) ? "false" : "true"); |
263 | odebug << "four byte field:" << (((flags & PALM_4_BYTE_FIELD_FLAG) == 0) ? "false" : "true") << oendl; | 252 | qDebug("four byte field:%s", ((flags & PALM_4_BYTE_FIELD_FLAG) == 0) ? "false" : "true"); |
264 | memcpy (rowbuf, palm_ptr, bytes_per_row); | 253 | memcpy (rowbuf, palm_ptr, bytes_per_row); |
265 | palm_ptr += bytes_per_row; | 254 | palm_ptr += bytes_per_row; |
266 | } | 255 | } |
267 | /* next, write it to the GDK bitmap */ | 256 | /* next, write it to the GDK bitmap */ |
268 | if (colormap) { | 257 | if (colormap) { |
269 | mask = (1 << bits_per_pixel) - 1; | 258 | mask = (1 << bits_per_pixel) - 1; |
270 | for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { | 259 | for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { |
271 | inval = ((*inbyte) & (mask << inbit)) >> inbit; | 260 | inval = ((*inbyte) & (mask << inbit)) >> inbit; |
272 | /* correct for oddity of the 8-bit color Palm pixmap... */ | 261 | /* correct for oddity of the 8-bit color Palm pixmap... */ |
273 | if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; | 262 | if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; |
274 | /* now lookup the correct color and set the pixel in the GTK bitmap */ | 263 | /* now lookup the correct color and set the pixel in the GTK bitmap */ |
275 | QRgb colour = qRgb(colormap[inval].red, colormap[inval].green, colormap[inval].blue); | 264 | QRgb colour = qRgb(colormap[inval].red, colormap[inval].green, colormap[inval].blue); |
276 | qimage->setPixel(j, i, colour); | 265 | qimage->setPixel(j, i, colour); |
277 | if (!inbit) { | 266 | if (!inbit) { |
278 | ++inbyte; | 267 | ++inbyte; |
279 | inbit = 8 - bits_per_pixel; | 268 | inbit = 8 - bits_per_pixel; |
280 | } else { | 269 | } else { |
281 | inbit -= bits_per_pixel; | 270 | inbit -= bits_per_pixel; |
282 | } | 271 | } |
283 | } | 272 | } |
284 | } else if (!colormap && | 273 | } else if (!colormap && |
285 | bits_per_pixel == 16) { | 274 | bits_per_pixel == 16) { |
286 | for (inbyte = rowbuf, j = 0; j < width; ++j) { | 275 | for (inbyte = rowbuf, j = 0; j < width; ++j) { |
287 | inval = ((unsigned short)inbyte[0] << (unsigned short)8) | inbyte[1]; | 276 | inval = ((unsigned short)inbyte[0] << (unsigned short)8) | inbyte[1]; |
288 | 277 | ||
289 | /* | 278 | /* |
290 | odebug << "pixel is " << j << "," << i << " (" | 279 | qDebug ("pixel is %d,%d (%d:%d:%d)", |
291 | << (((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits)) << ":" | 280 | j, i, |
292 | << (((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits)) << ":" | 281 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), |
293 | << (((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)) << ")" << oendl; | 282 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), |
283 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); | ||
294 | */ | 284 | */ |
295 | QRgb colour = qRgb( | 285 | QRgb colour = qRgb( |
296 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), | 286 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), |
297 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), | 287 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), |
298 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); | 288 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); |
299 | qimage->setPixel(j, i, colour); | 289 | qimage->setPixel(j, i, colour); |
300 | inbyte += 2; | 290 | inbyte += 2; |
301 | } | 291 | } |
302 | } | 292 | } |
303 | } | 293 | } |
304 | 294 | ||
@@ -306,14 +296,4 @@ QImage* Palm2QImage | |||
306 | delete [] lastrow; | 296 | delete [] lastrow; |
307 | 297 | ||
308 | return qimage; | 298 | return qimage; |
309 | } | 299 | } |
310 | |||
311 | QImage* hRule(int w, int h, unsigned char r, unsigned char g, unsigned char b) | ||
312 | { | ||
313 | // odebug << "hrule [" << w << ", " << h << "]" << oendl; | ||
314 | QPixmap* qimage = new QPixmap(w, h); | ||
315 | qimage->fill(QColor(r,g,b)); | ||
316 | QImage* ret = new QImage(qimage->convertToImage()); | ||
317 | delete qimage; | ||
318 | return ret; | ||
319 | } | ||