summaryrefslogtreecommitdiff
path: root/apps/recorder
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-11-11 22:03:29 +0000
committerThomas Martitz <kugel@rockbox.org>2011-11-11 22:03:29 +0000
commitcaec07be65b2e7197b539784c4fcd52ef4d4ba24 (patch)
treebf1ebd449c71ab4b362c5a7183ab3cba5c707b79 /apps/recorder
parentf1ee740f2b48c8a2da5fa1d33e033a9067fe3843 (diff)
downloadrockbox-caec07be65b2e7197b539784c4fcd52ef4d4ba24.tar.gz
rockbox-caec07be65b2e7197b539784c4fcd52ef4d4ba24.zip
Handle 32bit bitmaps with all-zero alpha channel as fully opaque.
This is what gimp does when opening such a file. Tt saves the alpha channel with all-0xff, but other programs might use 0x00. As a fully transparent image doesn't make sense this should be OK. Also split the 32bit and 24bit case in the bmp reader, they're sufficiently different. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30968 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/recorder')
-rw-r--r--apps/recorder/bmp.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/apps/recorder/bmp.c b/apps/recorder/bmp.c
index 75165528e7..43afcc5e98 100644
--- a/apps/recorder/bmp.c
+++ b/apps/recorder/bmp.c
@@ -191,8 +191,11 @@ struct bmp_args {
191 struct img_part part; 191 struct img_part part;
192#endif 192#endif
193 /* as read_part_line() goes through the rows it'll set this to true 193 /* as read_part_line() goes through the rows it'll set this to true
194 * if it finds transparency. Initialize to false before calling */ 194 * if it finds transparency. Initialize to 0 before calling */
195 bool alpha_detected; 195 int alpha_detected;
196 /* for checking transparency it checks the against the very first byte
197 * of the bitmap. Initalize to 0x80 before calling */
198 unsigned char first_alpha_byte;
196}; 199};
197 200
198static unsigned int read_part_line(struct bmp_args *ba) 201static unsigned int read_part_line(struct bmp_args *ba)
@@ -238,6 +241,15 @@ static unsigned int read_part_line(struct bmp_args *ba)
238 return 0; 241 return 0;
239 } 242 }
240 243
244 /* detect if the image has useful alpha information.
245 * if all alpha bits are 0xff or 0x00 discard the information.
246 * if it has other bits, or is mixed with 0x00 and 0xff then interpret
247 * as alpha. assume no alpha until the opposite is proven. as mixed
248 * is alpha, compare to the first byte instead of 0xff and 0x00 separately
249 */
250 if (depth == 32 && ba->first_alpha_byte == 0x80)
251 ba->first_alpha_byte = ibuf[3] ? 0xff : 0x0;
252
241 while (ibuf < ba->buf + (BM_MAX_WIDTH << 2)) 253 while (ibuf < ba->buf + (BM_MAX_WIDTH << 2))
242 { 254 {
243 switch (depth) 255 switch (depth)
@@ -283,13 +295,19 @@ static unsigned int read_part_line(struct bmp_args *ba)
283 buf++; 295 buf++;
284 ibuf += 2; 296 ibuf += 2;
285 break; 297 break;
286 case 32:
287 case 24: 298 case 24:
288 buf->blue = *ibuf++; 299 buf->blue = *ibuf++;
289 buf->green = *ibuf++; 300 buf->green = *ibuf++;
290 buf->red = *ibuf++; 301 buf->red = *ibuf++;
291 buf->alpha = (depth == 32) ? *ibuf++ : 0xff; 302 buf->alpha = 0xff;
292 if (buf->alpha != 0xff) ba->alpha_detected = true; 303 buf++;
304 break;
305 case 32:
306 buf->blue = *ibuf++;
307 buf->green = *ibuf++;
308 buf->red = *ibuf++;
309 buf->alpha = *ibuf++;
310 ba->alpha_detected |= (buf->alpha != ba->first_alpha_byte);
293 buf++; 311 buf++;
294 break; 312 break;
295 } 313 }
@@ -732,7 +750,7 @@ int read_bmp_fd(int fd,
732 defined(HAVE_BMP_SCALING) || defined(PLUGIN) 750 defined(HAVE_BMP_SCALING) || defined(PLUGIN)
733 .cur_row = 0, .cur_col = 0, .part = {0,0}, 751 .cur_row = 0, .cur_col = 0, .part = {0,0},
734#endif 752#endif
735 .alpha_detected = false, 753 .alpha_detected = false, .first_alpha_byte = 0x80,
736 }; 754 };
737 755
738#if (LCD_DEPTH > 1 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)) && \ 756#if (LCD_DEPTH > 1 || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)) && \