summaryrefslogtreecommitdiff
path: root/apps/gui
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-08-05 11:28:48 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-08-05 11:28:48 +0000
commit3f8e7fc26fdecde65fb78de84e4df31df8c0e750 (patch)
tree7f2c2d93d72d4f7a3dade4ccdd9a81433f5abe05 /apps/gui
parent145571d9b5c2b6b1028fbb95388f933a3675ebfa (diff)
New feature for the %xd() (display a preloaded image) skin tag.
It can now automatically load the correct subimage from a strip (assuming the strip is in the correct order) by giving a tag for the 2nd param. example: %xd(F, %mp) which is equivilant to %?mp<%xd(Fa)|%xd(Fb)|%xd(Fc)|%xd(Fd)|%xd(Fe)> You can also set the subimage offset.. i.e %xd(E, %mm, -1) which means "show nothing for the first value of %mm and use the bitmap strip for the remaining values" if a tag+offset is <0 or greater than the number of subimages in a strip he image is cleared (I'm open to changing this if someone has a better idea) cabbiev2.176x220x16.wps is an example of how to use this git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27717 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui')
-rw-r--r--apps/gui/skin_engine/skin_parser.c36
-rw-r--r--apps/gui/skin_engine/skin_render.c34
-rw-r--r--apps/gui/skin_engine/wps_internals.h9
3 files changed, 63 insertions, 16 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index a3cb68915b..c5acd1fd75 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -232,27 +232,39 @@ static int parse_image_display(struct skin_element *element,
char sublabel = text[1];
int subimage;
struct gui_img *img;
+ struct image_display *id = skin_buffer_alloc(sizeof(struct image_display));
/* sanity check */
img = find_image(label, wps_data);
- if (!img)
+ if (!img || !id)
{
token->value.i = label; /* so debug works */
return WPS_ERROR_INVALID_PARAM;
}
-
- if ((subimage = get_image_id(sublabel)) != -1)
+ id->label = label;
+ id->offset = 0;
+
+ if (element->params_count > 1)
{
- if (subimage >= img->num_subimages)
- return WPS_ERROR_INVALID_PARAM;
-
- /* Store sub-image number to display in high bits */
- token->value.i = label | (subimage << 8);
- return 4; /* We have consumed 2 bytes */
- } else {
- token->value.i = label;
- return 3; /* We have consumed 1 byte */
+ id->token = element->params[1].data.code->data;
+ if (element->params_count > 2)
+ id->offset = element->params[2].data.number;
}
+ else
+ {
+ id->token = NULL;
+ if ((subimage = get_image_id(sublabel)) != -1)
+ {
+ if (subimage >= img->num_subimages)
+ return WPS_ERROR_INVALID_PARAM;
+ id->subimage = subimage;
+ token->value.i = label | (subimage << 8);
+ } else {
+ id->subimage = 0;
+ }
+ }
+ token->value.data = id;
+ return 0;
}
static int parse_image_load(struct skin_element *element,
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 895746370e..e254c62cf9 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -144,11 +144,36 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
#ifdef HAVE_LCD_BITMAP
case SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY:
{
- char n = token->value.i & 0xFF;
- int subimage = token->value.i >> 8;
+ struct image_display *id = token->value.data;
+ char n = id->label;
struct gui_img *img = find_image(n, data);
if (img && img->loaded)
- img->display = subimage;
+ {
+ if (id->token == NULL)
+ {
+ img->display = id->subimage;
+ }
+ else
+ {
+ char buf[16];
+ const char *out;
+ int a = TOKEN_VALUE_ONLY;
+ out = get_token_value(gwps, id->token, buf, sizeof(buf), &a);
+ /* NOTE: get_token_value() returns values starting at 1! */
+ if (a == -1)
+ a = (out && *out) ? 1 : 2;
+ a--;
+ a += id->offset;
+ /* If the token returned a value which is higher than
+ * the amount of subimages clear the image. */
+ if (a<0 || a >= img->num_subimages)
+ {
+ clear_image_pos(gwps, img);
+ }
+ else
+ img->display = a;
+ }
+ }
break;
}
#ifdef HAVE_ALBUMART
@@ -230,7 +255,8 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
/* clear all pictures in the conditional and nested ones */
if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY)
{
- struct gui_img *img = find_image(token->value.i&0xFF, data);
+ struct image_display *id = token->value.data;
+ struct gui_img *img = find_image(id->label, data);
clear_image_pos(gwps, img);
}
else if (token->type == SKIN_TOKEN_PEAKMETER)
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 709dbc6ff7..e42fc5a53b 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -49,6 +49,9 @@
#define WPS_ALIGN_CENTER 64
#define WPS_ALIGN_LEFT 128
+
+#define TOKEN_VALUE_ONLY 0xDEADD0D0
+
#ifdef HAVE_ALBUMART
/* albumart definitions */
@@ -80,6 +83,12 @@ struct gui_img {
int display;
};
+struct image_display {
+ char label;
+ int subimage;
+ struct wps_token *token; /* the token to get the subimage number from */
+ int offset; /* offset into the bitmap strip to start */
+};
struct progressbar {
enum skin_token_type type;