summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/recorder/bmp.c5
-rw-r--r--firmware/drivers/lcd-16bit-common.c16
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);