summaryrefslogtreecommitdiff
path: root/apps/gui/wps_parser.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2008-03-21 19:38:00 +0000
committerDave Chapman <dave@dchapman.com>2008-03-21 19:38:00 +0000
commitd02c79c03fed154e8cdf4cbef8670221dfe922aa (patch)
treeae519730d242d0b9daadcf9daa10154beab682d5 /apps/gui/wps_parser.c
parent1544b36966c692e20d711b920eade06487996eb6 (diff)
downloadrockbox-d02c79c03fed154e8cdf4cbef8670221dfe922aa.zip
rockbox-d02c79c03fed154e8cdf4cbef8670221dfe922aa.tar.gz
rockbox-d02c79c03fed154e8cdf4cbef8670221dfe922aa.tar.bz2
rockbox-d02c79c03fed154e8cdf4cbef8670221dfe922aa.tar.xz
Commit viewports-in-WPS patch (FS#8385). This adds the %V tag - see the CustomWPS page for details (shortly...). There is still some work to do - decide how to handle font references, decide how to handle conditionals. Plus checkwps is broken - I'll fix that in a separate commit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16733 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/wps_parser.c')
-rw-r--r--apps/gui/wps_parser.c179
1 files changed, 153 insertions, 26 deletions
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c
index 307fa2a..c641f2c 100644
--- a/apps/gui/wps_parser.c
+++ b/apps/gui/wps_parser.c
@@ -69,13 +69,13 @@ static int line;
#ifdef HAVE_LCD_BITMAP
#if LCD_DEPTH > 1
-#define MAX_BITMAPS MAX_IMAGES+2 /* WPS images + pbar bitmap + backdrop */
+#define MAX_BITMAPS (MAX_IMAGES+2) /* WPS images + pbar bitmap + backdrop */
#else
-#define MAX_BITMAPS MAX_IMAGES+1 /* WPS images + pbar bitmap */
+#define MAX_BITMAPS (MAX_IMAGES+1) /* WPS images + pbar bitmap */
#endif
#define PROGRESSBAR_BMP MAX_IMAGES
-#define BACKDROP_BMP MAX_IMAGES+1
+#define BACKDROP_BMP (MAX_IMAGES+1)
/* pointers to the bitmap filenames in the WPS source */
static const char *bmp_names[MAX_BITMAPS];
@@ -118,6 +118,8 @@ static int parse_dir_level(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
#ifdef HAVE_LCD_BITMAP
+static int parse_viewport(const char *wps_bufptr,
+ struct wps_token *token, struct wps_data *wps_data);
static int parse_leftmargin(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
static int parse_image_special(const char *wps_bufptr,
@@ -131,7 +133,6 @@ static int parse_image_display(const char *wps_bufptr,
static int parse_image_load(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
#endif /*HAVE_LCD_BITMAP */
-
#ifdef HAVE_ALBUMART
static int parse_albumart_load(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
@@ -311,6 +312,9 @@ static const struct wps_tag all_tags[] = {
{ WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_STATIC,
parse_albumart_conditional },
#endif
+
+ { WPS_NO_TOKEN, "V", 0, parse_viewport },
+
#if (LCD_DEPTH > 1) || (defined(HAVE_LCD_REMOTE) && (LCD_REMOTE_DEPTH > 1))
{ WPS_TOKEN_IMAGE_BACKDROP, "X", 0, parse_image_special },
#endif
@@ -334,9 +338,11 @@ static int skip_end_of_line(const char *wps_bufptr)
/* Starts a new subline in the current line during parsing */
static void wps_start_new_subline(struct wps_data *data)
{
+ struct wps_viewport* vp = &data->viewports[data->num_viewports];
+
data->num_sublines++;
data->sublines[data->num_sublines].first_token_idx = data->num_tokens;
- data->lines[data->num_lines].num_sublines++;
+ vp->lines[vp->num_lines].num_sublines++;
}
#ifdef HAVE_LCD_BITMAP
@@ -482,6 +488,9 @@ static int parse_image_load(const char *wps_bufptr,
wps_data->img[n].x = x;
wps_data->img[n].y = y;
+ /* save current viewport */
+ wps_data->img[n].vp = &wps_data->viewports[wps_data->num_viewports].vp;
+
if (token->type == WPS_TOKEN_IMAGE_DISPLAY)
wps_data->img[n].always_display = true;
@@ -489,6 +498,110 @@ static int parse_image_load(const char *wps_bufptr,
return skip_end_of_line(wps_bufptr);
}
+static int parse_viewport(const char *wps_bufptr,
+ struct wps_token *token,
+ struct wps_data *wps_data)
+{
+ const char *ptr = wps_bufptr;
+ struct viewport* vp;
+ int depth;
+
+ (void)token; /* Kill warnings */
+
+ if (*wps_bufptr != '|')
+ return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */
+
+ ptr = wps_bufptr + 1;
+ /* format: %V|x|y|width|height|fg_pattern|bg_pattern| */
+
+ if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS)
+ return WPS_ERROR_INVALID_PARAM;
+
+ wps_data->num_viewports++;
+ vp = &wps_data->viewports[wps_data->num_viewports].vp;
+
+ /* Set the defaults for fields not user-specified */
+ vp->drawmode = DRMODE_SOLID;
+ vp->xmargin = 0;
+ vp->ymargin = 0;
+
+ /* Work out the depth of this display */
+#ifdef HAVE_REMOTE_LCD
+ depth = (wps_data->remote_wps ? LCD_REMOTE_DEPTH : LCD_DEPTH);
+#else
+ depth = LCD_DEPTH;
+#endif
+
+#ifdef HAVE_LCD_COLOR
+ if (depth == 16)
+ {
+ parse_list("dddddcc", '|', ptr, &vp->x, &vp->y, &vp->width,
+ &vp->height, &vp->font, &vp->fg_pattern,&vp->bg_pattern);
+ }
+ else
+#endif
+#if (LCD_DEPTH == 2) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 2)
+ if (depth == 2) {
+ parse_list("dddddgg", '|', ptr, &vp->x, &vp->y, &vp->width,
+ &vp->height, &vp->font, &vp->fg_pattern, &vp->bg_pattern);
+ }
+ else
+#endif
+#if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
+ if (depth == 1)
+ {
+ parse_list("ddddd", '|', ptr, &vp->x, &vp->y, &vp->width, &vp->height,
+ &vp->font);
+ }
+ else
+#endif
+ {}
+
+ /* Default to using the user font if the font was an invalid number */
+ if ((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI))
+ vp->font = FONT_UI;
+
+ /* Validate the viewport dimensions - we know that the numbers are
+ non-negative integers */
+#ifdef HAVE_REMOTE_LCD
+ if (wps_data->remote_wps)
+ {
+ if ((vp->x >= LCD_REMOTE_WIDTH) ||
+ ((vp->x + vp->width) >= LCD_REMOTE_WIDTH) ||
+ (vp->y >= LCD_REMOTE_HEIGHT) ||
+ ((vp->y + vp->height) >= LCD_REMOTE_HEIGHT))
+ {
+ return WPS_ERROR_INVALID_PARAM;
+ }
+ }
+ else
+#else
+ {
+ if ((vp->x >= LCD_WIDTH) ||
+ (vp->y >= LCD_HEIGHT) ||
+ ((vp->y + vp->height) >= LCD_HEIGHT))
+ {
+ return WPS_ERROR_INVALID_PARAM;
+ }
+ }
+#endif
+
+ wps_data->viewports[wps_data->num_viewports].num_lines = 0;
+
+ if (wps_data->num_sublines < WPS_MAX_SUBLINES)
+ {
+ wps_data->viewports[wps_data->num_viewports].lines[0].first_subline_idx =
+ wps_data->num_sublines;
+
+ wps_data->sublines[wps_data->num_sublines].first_token_idx =
+ wps_data->num_tokens;
+ }
+
+ /* Skip the rest of the line */
+ return skip_end_of_line(wps_bufptr);
+ }
+
+
static int parse_image_special(const char *wps_bufptr,
struct wps_token *token,
struct wps_data *wps_data)
@@ -958,7 +1071,8 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
level = -1;
while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1
- && data->num_lines < WPS_MAX_LINES)
+ && data->num_viewports < WPS_MAX_VIEWPORTS
+ && data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES)
{
switch(*wps_bufptr++)
{
@@ -1066,12 +1180,12 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
line++;
wps_start_new_subline(data);
- data->num_lines++; /* Start a new line */
+ data->viewports[data->num_viewports].num_lines++; /* Start a new line */
- if ((data->num_lines < WPS_MAX_LINES) &&
+ if ((data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) &&
(data->num_sublines < WPS_MAX_SUBLINES))
{
- data->lines[data->num_lines].first_subline_idx =
+ data->viewports[data->num_viewports].lines[data->viewports[data->num_viewports].num_lines].first_subline_idx =
data->num_sublines;
data->sublines[data->num_sublines].first_token_idx =
@@ -1148,6 +1262,9 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
if (!fail && level >= 0) /* there are unclosed conditionals */
fail = PARSE_FAIL_UNCLOSED_COND;
+ /* We have finished with the last viewport, so increment count */
+ data->num_viewports++;
+
#ifdef DEBUG
print_debug_info(data, fail, line);
#endif
@@ -1212,16 +1329,6 @@ static void wps_reset(struct wps_data *data)
#ifdef HAVE_LCD_BITMAP
-
-static void clear_bmp_names(void)
-{
- int n;
- for (n = 0; n < MAX_BITMAPS; n++)
- {
- bmp_names[n] = NULL;
- }
-}
-
static void load_wps_bitmaps(struct wps_data *wps_data, char *bmpdir)
{
char img_path[MAX_PATH];
@@ -1291,6 +1398,7 @@ static char *skip_utf8_bom(char *buf)
/* to setup up the wps-data from a format-buffer (isfile = false)
from a (wps-)file (isfile = true)*/
bool wps_data_load(struct wps_data *wps_data,
+ struct screen *display,
const char *buf,
bool isfile)
{
@@ -1299,6 +1407,24 @@ bool wps_data_load(struct wps_data *wps_data,
wps_reset(wps_data);
+ /* Initialise the first (default) viewport */
+ wps_data->viewports[0].vp.x = 0;
+ wps_data->viewports[0].vp.y = 0;
+ wps_data->viewports[0].vp.width = display->width;
+ wps_data->viewports[0].vp.height = display->height;
+#ifdef HAVE_LCD_BITMAP
+ wps_data->viewports[0].vp.font = FONT_UI;
+ wps_data->viewports[0].vp.drawmode = DRMODE_SOLID;
+#endif
+ wps_data->viewports[0].vp.xmargin = display->getxmargin();
+ wps_data->viewports[0].vp.ymargin = display->getymargin();
+#if LCD_DEPTH > 1
+ if (display->depth > 1)
+ {
+ wps_data->viewports[0].vp.fg_pattern = display->get_foreground();
+ wps_data->viewports[0].vp.bg_pattern = display->get_background();
+ }
+#endif
if (!isfile)
{
return wps_parse(wps_data, buf);
@@ -1357,7 +1483,8 @@ bool wps_data_load(struct wps_data *wps_data,
return false;
#ifdef HAVE_LCD_BITMAP
- clear_bmp_names();
+ /* Set all filename pointers to NULL */
+ memset(bmp_names, sizeof(bmp_names), 0);
#endif
/* Skip leading UTF-8 BOM, if present. */
@@ -1385,20 +1512,20 @@ bool wps_data_load(struct wps_data *wps_data,
}
}
-int wps_subline_index(struct wps_data *data, int line, int subline)
+int wps_subline_index(struct wps_data *data, int v, int line, int subline)
{
- return data->lines[line].first_subline_idx + subline;
+ return data->viewports[v].lines[line].first_subline_idx + subline;
}
-int wps_first_token_index(struct wps_data *data, int line, int subline)
+int wps_first_token_index(struct wps_data *data, int v, int line, int subline)
{
- int first_subline_idx = data->lines[line].first_subline_idx;
+ int first_subline_idx = data->viewports[v].lines[line].first_subline_idx;
return data->sublines[first_subline_idx + subline].first_token_idx;
}
-int wps_last_token_index(struct wps_data *data, int line, int subline)
+int wps_last_token_index(struct wps_data *data, int v, int line, int subline)
{
- int first_subline_idx = data->lines[line].first_subline_idx;
+ int first_subline_idx = data->viewports[v].lines[line].first_subline_idx;
int idx = first_subline_idx + subline;
if (idx < data->num_sublines - 1)
{