diff --git a/apps/recorder/bmp.c b/apps/recorder/bmp.c index 43afcc5e98..011a4d60fe 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 06bb0a25fd..86cb5eadd1 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);