diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-08-05 11:28:48 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-08-05 11:28:48 +0000 |
commit | 3f8e7fc26fdecde65fb78de84e4df31df8c0e750 (patch) | |
tree | 7f2c2d93d72d4f7a3dade4ccdd9a81433f5abe05 /apps/gui | |
parent | 145571d9b5c2b6b1028fbb95388f933a3675ebfa (diff) | |
download | rockbox-3f8e7fc26fdecde65fb78de84e4df31df8c0e750.tar.gz rockbox-3f8e7fc26fdecde65fb78de84e4df31df8c0e750.zip |
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.c | 36 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_render.c | 34 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 9 |
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, | |||
232 | char sublabel = text[1]; | 232 | char sublabel = text[1]; |
233 | int subimage; | 233 | int subimage; |
234 | struct gui_img *img; | 234 | struct gui_img *img; |
235 | struct image_display *id = skin_buffer_alloc(sizeof(struct image_display)); | ||
235 | 236 | ||
236 | /* sanity check */ | 237 | /* sanity check */ |
237 | img = find_image(label, wps_data); | 238 | img = find_image(label, wps_data); |
238 | if (!img) | 239 | if (!img || !id) |
239 | { | 240 | { |
240 | token->value.i = label; /* so debug works */ | 241 | token->value.i = label; /* so debug works */ |
241 | return WPS_ERROR_INVALID_PARAM; | 242 | return WPS_ERROR_INVALID_PARAM; |
242 | } | 243 | } |
243 | 244 | id->label = label; | |
244 | if ((subimage = get_image_id(sublabel)) != -1) | 245 | id->offset = 0; |
246 | |||
247 | if (element->params_count > 1) | ||
245 | { | 248 | { |
246 | if (subimage >= img->num_subimages) | 249 | id->token = element->params[1].data.code->data; |
247 | return WPS_ERROR_INVALID_PARAM; | 250 | if (element->params_count > 2) |
248 | 251 | id->offset = element->params[2].data.number; | |
249 | /* Store sub-image number to display in high bits */ | ||
250 | token->value.i = label | (subimage << 8); | ||
251 | return 4; /* We have consumed 2 bytes */ | ||
252 | } else { | ||
253 | token->value.i = label; | ||
254 | return 3; /* We have consumed 1 byte */ | ||
255 | } | 252 | } |
253 | else | ||
254 | { | ||
255 | id->token = NULL; | ||
256 | if ((subimage = get_image_id(sublabel)) != -1) | ||
257 | { | ||
258 | if (subimage >= img->num_subimages) | ||
259 | return WPS_ERROR_INVALID_PARAM; | ||
260 | id->subimage = subimage; | ||
261 | token->value.i = label | (subimage << 8); | ||
262 | } else { | ||
263 | id->subimage = 0; | ||
264 | } | ||
265 | } | ||
266 | token->value.data = id; | ||
267 | return 0; | ||
256 | } | 268 | } |
257 | 269 | ||
258 | static int parse_image_load(struct skin_element *element, | 270 | 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, | |||
144 | #ifdef HAVE_LCD_BITMAP | 144 | #ifdef HAVE_LCD_BITMAP |
145 | case SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY: | 145 | case SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY: |
146 | { | 146 | { |
147 | char n = token->value.i & 0xFF; | 147 | struct image_display *id = token->value.data; |
148 | int subimage = token->value.i >> 8; | 148 | char n = id->label; |
149 | struct gui_img *img = find_image(n, data); | 149 | struct gui_img *img = find_image(n, data); |
150 | if (img && img->loaded) | 150 | if (img && img->loaded) |
151 | img->display = subimage; | 151 | { |
152 | if (id->token == NULL) | ||
153 | { | ||
154 | img->display = id->subimage; | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | char buf[16]; | ||
159 | const char *out; | ||
160 | int a = TOKEN_VALUE_ONLY; | ||
161 | out = get_token_value(gwps, id->token, buf, sizeof(buf), &a); | ||
162 | /* NOTE: get_token_value() returns values starting at 1! */ | ||
163 | if (a == -1) | ||
164 | a = (out && *out) ? 1 : 2; | ||
165 | a--; | ||
166 | a += id->offset; | ||
167 | /* If the token returned a value which is higher than | ||
168 | * the amount of subimages clear the image. */ | ||
169 | if (a<0 || a >= img->num_subimages) | ||
170 | { | ||
171 | clear_image_pos(gwps, img); | ||
172 | } | ||
173 | else | ||
174 | img->display = a; | ||
175 | } | ||
176 | } | ||
152 | break; | 177 | break; |
153 | } | 178 | } |
154 | #ifdef HAVE_ALBUMART | 179 | #ifdef HAVE_ALBUMART |
@@ -230,7 +255,8 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch, | |||
230 | /* clear all pictures in the conditional and nested ones */ | 255 | /* clear all pictures in the conditional and nested ones */ |
231 | if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY) | 256 | if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY) |
232 | { | 257 | { |
233 | struct gui_img *img = find_image(token->value.i&0xFF, data); | 258 | struct image_display *id = token->value.data; |
259 | struct gui_img *img = find_image(id->label, data); | ||
234 | clear_image_pos(gwps, img); | 260 | clear_image_pos(gwps, img); |
235 | } | 261 | } |
236 | else if (token->type == SKIN_TOKEN_PEAKMETER) | 262 | 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 @@ | |||
49 | #define WPS_ALIGN_CENTER 64 | 49 | #define WPS_ALIGN_CENTER 64 |
50 | #define WPS_ALIGN_LEFT 128 | 50 | #define WPS_ALIGN_LEFT 128 |
51 | 51 | ||
52 | |||
53 | #define TOKEN_VALUE_ONLY 0xDEADD0D0 | ||
54 | |||
52 | #ifdef HAVE_ALBUMART | 55 | #ifdef HAVE_ALBUMART |
53 | 56 | ||
54 | /* albumart definitions */ | 57 | /* albumart definitions */ |
@@ -80,6 +83,12 @@ struct gui_img { | |||
80 | int display; | 83 | int display; |
81 | }; | 84 | }; |
82 | 85 | ||
86 | struct image_display { | ||
87 | char label; | ||
88 | int subimage; | ||
89 | struct wps_token *token; /* the token to get the subimage number from */ | ||
90 | int offset; /* offset into the bitmap strip to start */ | ||
91 | }; | ||
83 | 92 | ||
84 | struct progressbar { | 93 | struct progressbar { |
85 | enum skin_token_type type; | 94 | enum skin_token_type type; |