diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 53ceb7e..dc1611d 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -1057,6 +1057,7 @@ static int parse_albumart_load(struct skin_element* element,
aa->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp);
aa->draw_handle = -1;
+ aa->alpha_data_handle = -1;
/* if we got here, we parsed everything ok .. ! */
if (aa->width < 0)
@@ -1127,6 +1128,24 @@ static int parse_albumart_load(struct skin_element* element,
}
return 0;
}
+static int parse_albumart_display(struct skin_element* element,
+ struct wps_token *token,
+ struct wps_data *wps_data)
+{
+ struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
+ size_t alpha_size;
+ if (!aa)
+ return -1;
+ alpha_size = aa->width * aa->height / 2;
+ aa->alpha_data_handle = core_alloc("aa alpha", alpha_size);
+ if (aa->alpha_data_handle >= 0)
+ {
+ int alpha_val = get_param(element, 0)->data.number * 16 / 100;
+ alpha_val |= (alpha_val << 4);
+ memset(core_get_data(aa->alpha_data_handle), alpha_val, alpha_size);
+ }
+ return 0;
+}
#endif /* HAVE_ALBUMART */
#ifdef HAVE_SKIN_VARIABLES
@@ -2050,6 +2069,7 @@ static int skin_element_callback(struct skin_element* element, void* data)
{
struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
aa->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp);
+ function = parse_albumart_display;
}
break;
case SKIN_TOKEN_ALBUMART_LOAD:
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 60b9163..00d9d21 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -251,6 +251,7 @@ struct skin_albumart {
OFFSETTYPE(struct viewport *) vp;
int draw_handle;
+ int alpha_data_handle;
};
#endif
diff --git a/apps/recorder/albumart.c b/apps/recorder/albumart.c
index 4cbabbc..4413763 100644
--- a/apps/recorder/albumart.c
+++ b/apps/recorder/albumart.c
@@ -346,10 +346,17 @@ void draw_album_art(struct gui_wps *gwps, int handle_id, bool clear)
if (!clear)
{
/* Draw the bitmap */
- gwps->display->bitmap_part((fb_data*)bmp->data, 0, 0,
- STRIDE(gwps->display->screen_type,
- bmp->width, bmp->height),
- x, y, width, height);
+ if (aa->alpha_data_handle >= 0)
+ {
+ bmp->alpha_offset = core_get_data(aa->alpha_data_handle) - (void*)bmp->data;
+ bmp->format |= FORMAT_TRANSPARENT;
+ }
+ gwps->display->bmp_part(bmp, 0, 0, x, y, width, height);
+ if (aa->alpha_data_handle >= 0)
+ {
+ bmp->alpha_offset = 0;
+ bmp->format &= ~FORMAT_TRANSPARENT;
+ }
#ifdef HAVE_LCD_INVERT
if (global_settings.invert) {
gwps->display->set_drawmode(DRMODE_COMPLEMENT);
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c
index 47f5968..ffe0d11 100644
--- a/firmware/drivers/lcd-16bit-common.c
+++ b/firmware/drivers/lcd-16bit-common.c
@@ -575,7 +575,7 @@ void ICODE_ATTR lcd_bmp_part(const struct bitmap* bm, int src_x, int src_y,
int bitmap_stride = STRIDE_MAIN(bm->width, bm->height);
if (bm->format == FORMAT_MONO)
lcd_mono_bitmap_part(bm->data, src_x, src_y, bitmap_stride, x, y, width, height);
- else if (bm->alpha_offset > 0)
+ else if (bm->alpha_offset != 0)
lcd_alpha_bitmap_part_mix((fb_data*)bm->data, bm->data+bm->alpha_offset,
src_x, src_y, x, y, width, height,
bitmap_stride, ALIGN_UP(bm->width, 2));
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index a5db475..648d02e 100644
--- a/lib/skin_parser/tag_table.c
+++ b/lib/skin_parser/tag_table.c
@@ -180,7 +180,7 @@ static const struct tag_info legal_tags[] =
{ SKIN_TOKEN_LOAD_FONT, "Fl" , "IF|I", 0|NOBREAK },
{ SKIN_TOKEN_ALBUMART_LOAD, "Cl" , "IIII|ss", 0|NOBREAK },
- { SKIN_TOKEN_ALBUMART_DISPLAY, "Cd" , "", SKIN_REFRESH_STATIC },
+ { SKIN_TOKEN_ALBUMART_DISPLAY, "Cd" , "|I", SKIN_REFRESH_STATIC },
{ SKIN_TOKEN_ALBUMART_FOUND, "C" , "", SKIN_REFRESH_STATIC },
{ SKIN_TOKEN_VIEWPORT_ENABLE, "Vd" , "S", SKIN_REFRESH_STATIC },