diff options
| author | Thomas Martitz <kugel@rockbox.org> | 2013-02-12 10:26:44 +0100 |
|---|---|---|
| committer | Thomas Martitz <kugel@rockbox.org> | 2013-02-12 10:29:25 +0100 |
| commit | ca634a0ac0877c60417182d6415f159fefd6ad9d (patch) | |
| tree | 99525e3648b2766d18990f3bf9b45d1d695cd4a9 | |
| parent | c66a66728c855456a465a57504344038b3224dd9 (diff) | |
| download | rockbox-ca634a0ac0877c60417182d6415f159fefd6ad9d.zip rockbox-ca634a0ac0877c60417182d6415f159fefd6ad9d.tar.gz rockbox-ca634a0ac0877c60417182d6415f159fefd6ad9d.tar.bz2 rockbox-ca634a0ac0877c60417182d6415f159fefd6ad9d.tar.xz | |
bitmap drawing: Negate alpha channel to match alpha information format of font files.
The comment about the format was actually incorrect. The alpha information
is now negated during conversion to native format, according to the
corrected comment.
Change-Id: Ifdb9ffdf9b55e39e64983eec2d9d60339e570bd9
| -rw-r--r-- | apps/recorder/bmp.c | 5 | ||||
| -rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 16 |
2 files changed, 11 insertions, 10 deletions
diff --git a/apps/recorder/bmp.c b/apps/recorder/bmp.c index 43afcc5..011a4d6 100644 --- a/apps/recorder/bmp.c +++ b/apps/recorder/bmp.c @@ -470,8 +470,9 @@ void output_row_8_native(uint32_t row, void * row_in, *dest = LCD_RGBPACK_LCD(r, g, b); dest += STRIDE_MAIN(1, ctx->bm->height); if (bm_alpha) { - /* pack alpha channel for 2 pixels into 1 byte */ - unsigned alpha = qp->alpha; + /* pack alpha channel for 2 pixels into 1 byte and negate + * according to the interal alpha channel format */ + uint8_t alpha = ~qp->alpha; if (col%2) *bm_alpha++ |= alpha&0xf0; else diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index 06bb0a2..86cb5ea 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c @@ -782,13 +782,14 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig /* About Rockbox' internal alpha channel format (for ALPHA_COLOR_FONT_DEPTH == 2) * - * For each pixel, 4bit of alpha information is stored in a byte-stream, + * For each pixel, 4bit of alpha information is stored in a byte-stream, * so two pixels are packed into one byte. * The lower nibble is the first pixel, the upper one the second. The stride is * horizontal. E.g row0: pixel0: byte0[0:3], pixel1: byte0[4:7], pixel2: byte1[0:3],... * The format is independant of the internal display orientation and color * representation, as to support the same font files on all displays. - * The values go linear from 0 (fully transparent) to 15 (fully opaque). + * The values go linear from 0 (fully opaque) to 15 (fully transparent) + * (note how this is the opposite of the alpha channel in the ARGB format). * * This might suggest that rows need to have an even number of pixels. * However this is generally not the case. lcd_alpha_bitmap_part_mix() can deal @@ -935,16 +936,15 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, dmask = 0xffffffff; drmode &= DRMODE_SOLID; /* mask out inversevid */ } - /* sourcing from an image ignore drawmode. - * Set to DRMODE_BG as we use its code path in the switch below */ - if (image != NULL) - { - drmode = DRMODE_BG; - } if (drmode == DRMODE_BG) { dmask = ~dmask; } + /* Set to DRMODE_BG as we use its code path in the switch below */ + if (image != NULL) + { + drmode = DRMODE_BG; + } dst_row = FBADDR(x, y); |