diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index ccedea9..4b24527 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -234,6 +234,19 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) y += img->bm.height / 2; } } + + if (pb->backdrop) + { + int xoff = 0, yoff = 0; + int w = width, h = height; + struct gui_img *img = pb->backdrop; + display->transparent_bitmap_part((fb_data *)img->bm.data, + 0, 0, + STRIDE(display->screen_type, + img->bm.width, img->bm.height), + x, y, width, height); + } + if (!pb->nobar) { if (pb->image) diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index e23f842..5b9e9be 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -584,7 +584,7 @@ static int parse_progressbar_tag(struct skin_element* element, struct viewport *vp = &curr_vp->vp; struct skin_tag_parameter *param = element->params; int curr_param = 0; - char *image_filename = NULL; + char *image_filename = NULL, *backdrop_filename = NULL; if (element->params_count == 0 && element->tag->type != SKIN_TOKEN_PROGRESSBAR) @@ -601,6 +601,7 @@ static int parse_progressbar_tag(struct skin_element* element, pb->nobar = false; pb->image = NULL; pb->slider = NULL; + pb->backdrop = NULL; pb->invert_fill_direction = false; pb->horizontal = true; @@ -696,6 +697,18 @@ static int parse_progressbar_tag(struct skin_element* element, else /* option needs the next param */ return -1; } + else if (!strcmp(param->data.text, "backdrop")) + { + if (curr_param+1 < element->params_count) + { + curr_param++; + param++; + backdrop_filename = param->data.text; + + } + else /* option needs the next param */ + return -1; + } else if (!strcmp(param->data.text, "vertical")) { pb->horizontal = false; @@ -736,6 +749,33 @@ static int parse_progressbar_tag(struct skin_element* element, pb->image = img; } } + + if (backdrop_filename) + { + pb->backdrop = find_image(backdrop_filename, wps_data); + if (!pb->backdrop) /* load later */ + { + struct gui_img* img = (struct gui_img*)skin_buffer_alloc(sizeof(struct gui_img)); + if (!img) + return WPS_ERROR_INVALID_PARAM; + /* save a pointer to the filename */ + img->bm.data = (char*)backdrop_filename; + img->label = backdrop_filename; + img->x = 0; + img->y = 0; + img->num_subimages = 1; + img->always_display = false; + img->display = -1; + img->using_preloaded_icons = false; + img->vp = &curr_vp->vp; + struct skin_token_list *item = + (struct skin_token_list *)new_skin_token_list_item(NULL, img); + if (!item) + return WPS_ERROR_INVALID_PARAM; + add_to_ll_chain(&wps_data->images, item); + pb->backdrop = img; + } + } if (token->type == SKIN_TOKEN_VOLUME) diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 02585f2..2bf0ee9 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -111,6 +111,7 @@ struct progressbar { bool nobar; struct gui_img *slider; bool horizontal; + struct gui_img *backdrop; }; #endif