summaryrefslogtreecommitdiff
path: root/apps/gui/wps_parser.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2008-03-22 00:31:22 +0000
committerDave Chapman <dave@dchapman.com>2008-03-22 00:31:22 +0000
commit45b2d8802d1e8fcc47fd1148adb7b1173ad5b311 (patch)
tree849eea4153daaf7dfafd571ca6b93b6f985b1ff9 /apps/gui/wps_parser.c
parent7ee63e22c58f4a7017136871e7b55dd702c5f460 (diff)
downloadrockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.zip
rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.tar.gz
rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.tar.bz2
rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.tar.xz
Reduce the shocking amount of RAM my viewports implementation was using. The first version stored an array of lines for each of the 16 possible viewports (MAX_VIEWPORTS * the number of lines on the LCD with a 5-pixel high font). This version reverts back to a single global array of lines, with each viewport specifying the first and last lines as indexes into that array. This also turns out to be simpler, reducing binsize a little as well.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16735 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/wps_parser.c')
-rw-r--r--apps/gui/wps_parser.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c
index c641f2c..be3d2fb 100644
--- a/apps/gui/wps_parser.c
+++ b/apps/gui/wps_parser.c
@@ -338,11 +338,9 @@ 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;
- vp->lines[vp->num_lines].num_sublines++;
+ data->lines[data->num_lines].num_sublines++;
}
#ifdef HAVE_LCD_BITMAP
@@ -585,12 +583,14 @@ static int parse_viewport(const char *wps_bufptr,
}
}
#endif
-
- wps_data->viewports[wps_data->num_viewports].num_lines = 0;
+
+ wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1;
+
+ wps_data->viewports[wps_data->num_viewports].first_line = wps_data->num_lines;
if (wps_data->num_sublines < WPS_MAX_SUBLINES)
{
- wps_data->viewports[wps_data->num_viewports].lines[0].first_subline_idx =
+ wps_data->lines[wps_data->num_lines].first_subline_idx =
wps_data->num_sublines;
wps_data->sublines[wps_data->num_sublines].first_token_idx =
@@ -599,7 +599,7 @@ static int parse_viewport(const char *wps_bufptr,
/* Skip the rest of the line */
return skip_end_of_line(wps_bufptr);
- }
+}
static int parse_image_special(const char *wps_bufptr,
@@ -1072,7 +1072,7 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1
&& data->num_viewports < WPS_MAX_VIEWPORTS
- && data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES)
+ && data->num_lines < WPS_MAX_LINES)
{
switch(*wps_bufptr++)
{
@@ -1180,12 +1180,12 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
line++;
wps_start_new_subline(data);
- data->viewports[data->num_viewports].num_lines++; /* Start a new line */
+ data->num_lines++; /* Start a new line */
- if ((data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) &&
+ if ((data->num_lines < WPS_MAX_LINES) &&
(data->num_sublines < WPS_MAX_SUBLINES))
{
- data->viewports[data->num_viewports].lines[data->viewports[data->num_viewports].num_lines].first_subline_idx =
+ data->lines[data->num_lines].first_subline_idx =
data->num_sublines;
data->sublines[data->num_sublines].first_token_idx =
@@ -1262,6 +1262,8 @@ 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;
+ data->viewports[data->num_viewports].last_line = data->num_lines - 1;
+
/* We have finished with the last viewport, so increment count */
data->num_viewports++;
@@ -1512,20 +1514,20 @@ bool wps_data_load(struct wps_data *wps_data,
}
}
-int wps_subline_index(struct wps_data *data, int v, int line, int subline)
+int wps_subline_index(struct wps_data *data, int line, int subline)
{
- return data->viewports[v].lines[line].first_subline_idx + subline;
+ return data->lines[line].first_subline_idx + subline;
}
-int wps_first_token_index(struct wps_data *data, int v, int line, int subline)
+int wps_first_token_index(struct wps_data *data, int line, int subline)
{
- int first_subline_idx = data->viewports[v].lines[line].first_subline_idx;
+ int first_subline_idx = data->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 v, int line, int subline)
+int wps_last_token_index(struct wps_data *data, int line, int subline)
{
- int first_subline_idx = data->viewports[v].lines[line].first_subline_idx;
+ int first_subline_idx = data->lines[line].first_subline_idx;
int idx = first_subline_idx + subline;
if (idx < data->num_sublines - 1)
{