diff options
author | Dave Chapman <dave@dchapman.com> | 2008-03-22 00:31:22 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2008-03-22 00:31:22 +0000 |
commit | 45b2d8802d1e8fcc47fd1148adb7b1173ad5b311 (patch) | |
tree | 849eea4153daaf7dfafd571ca6b93b6f985b1ff9 /apps/gui/wps_parser.c | |
parent | 7ee63e22c58f4a7017136871e7b55dd702c5f460 (diff) | |
download | rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.tar.gz rockbox-45b2d8802d1e8fcc47fd1148adb7b1173ad5b311.zip |
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.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c index c641f2c247..be3d2fb882 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) | |||
338 | /* Starts a new subline in the current line during parsing */ | 338 | /* Starts a new subline in the current line during parsing */ |
339 | static void wps_start_new_subline(struct wps_data *data) | 339 | static void wps_start_new_subline(struct wps_data *data) |
340 | { | 340 | { |
341 | struct wps_viewport* vp = &data->viewports[data->num_viewports]; | ||
342 | |||
343 | data->num_sublines++; | 341 | data->num_sublines++; |
344 | data->sublines[data->num_sublines].first_token_idx = data->num_tokens; | 342 | data->sublines[data->num_sublines].first_token_idx = data->num_tokens; |
345 | vp->lines[vp->num_lines].num_sublines++; | 343 | data->lines[data->num_lines].num_sublines++; |
346 | } | 344 | } |
347 | 345 | ||
348 | #ifdef HAVE_LCD_BITMAP | 346 | #ifdef HAVE_LCD_BITMAP |
@@ -585,12 +583,14 @@ static int parse_viewport(const char *wps_bufptr, | |||
585 | } | 583 | } |
586 | } | 584 | } |
587 | #endif | 585 | #endif |
588 | 586 | ||
589 | wps_data->viewports[wps_data->num_viewports].num_lines = 0; | 587 | wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1; |
588 | |||
589 | wps_data->viewports[wps_data->num_viewports].first_line = wps_data->num_lines; | ||
590 | 590 | ||
591 | if (wps_data->num_sublines < WPS_MAX_SUBLINES) | 591 | if (wps_data->num_sublines < WPS_MAX_SUBLINES) |
592 | { | 592 | { |
593 | wps_data->viewports[wps_data->num_viewports].lines[0].first_subline_idx = | 593 | wps_data->lines[wps_data->num_lines].first_subline_idx = |
594 | wps_data->num_sublines; | 594 | wps_data->num_sublines; |
595 | 595 | ||
596 | wps_data->sublines[wps_data->num_sublines].first_token_idx = | 596 | wps_data->sublines[wps_data->num_sublines].first_token_idx = |
@@ -599,7 +599,7 @@ static int parse_viewport(const char *wps_bufptr, | |||
599 | 599 | ||
600 | /* Skip the rest of the line */ | 600 | /* Skip the rest of the line */ |
601 | return skip_end_of_line(wps_bufptr); | 601 | return skip_end_of_line(wps_bufptr); |
602 | } | 602 | } |
603 | 603 | ||
604 | 604 | ||
605 | static int parse_image_special(const char *wps_bufptr, | 605 | 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) | |||
1072 | 1072 | ||
1073 | while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1 | 1073 | while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1 |
1074 | && data->num_viewports < WPS_MAX_VIEWPORTS | 1074 | && data->num_viewports < WPS_MAX_VIEWPORTS |
1075 | && data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) | 1075 | && data->num_lines < WPS_MAX_LINES) |
1076 | { | 1076 | { |
1077 | switch(*wps_bufptr++) | 1077 | switch(*wps_bufptr++) |
1078 | { | 1078 | { |
@@ -1180,12 +1180,12 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr) | |||
1180 | 1180 | ||
1181 | line++; | 1181 | line++; |
1182 | wps_start_new_subline(data); | 1182 | wps_start_new_subline(data); |
1183 | data->viewports[data->num_viewports].num_lines++; /* Start a new line */ | 1183 | data->num_lines++; /* Start a new line */ |
1184 | 1184 | ||
1185 | if ((data->viewports[data->num_viewports].num_lines < WPS_MAX_LINES) && | 1185 | if ((data->num_lines < WPS_MAX_LINES) && |
1186 | (data->num_sublines < WPS_MAX_SUBLINES)) | 1186 | (data->num_sublines < WPS_MAX_SUBLINES)) |
1187 | { | 1187 | { |
1188 | data->viewports[data->num_viewports].lines[data->viewports[data->num_viewports].num_lines].first_subline_idx = | 1188 | data->lines[data->num_lines].first_subline_idx = |
1189 | data->num_sublines; | 1189 | data->num_sublines; |
1190 | 1190 | ||
1191 | data->sublines[data->num_sublines].first_token_idx = | 1191 | data->sublines[data->num_sublines].first_token_idx = |
@@ -1262,6 +1262,8 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr) | |||
1262 | if (!fail && level >= 0) /* there are unclosed conditionals */ | 1262 | if (!fail && level >= 0) /* there are unclosed conditionals */ |
1263 | fail = PARSE_FAIL_UNCLOSED_COND; | 1263 | fail = PARSE_FAIL_UNCLOSED_COND; |
1264 | 1264 | ||
1265 | data->viewports[data->num_viewports].last_line = data->num_lines - 1; | ||
1266 | |||
1265 | /* We have finished with the last viewport, so increment count */ | 1267 | /* We have finished with the last viewport, so increment count */ |
1266 | data->num_viewports++; | 1268 | data->num_viewports++; |
1267 | 1269 | ||
@@ -1512,20 +1514,20 @@ bool wps_data_load(struct wps_data *wps_data, | |||
1512 | } | 1514 | } |
1513 | } | 1515 | } |
1514 | 1516 | ||
1515 | int wps_subline_index(struct wps_data *data, int v, int line, int subline) | 1517 | int wps_subline_index(struct wps_data *data, int line, int subline) |
1516 | { | 1518 | { |
1517 | return data->viewports[v].lines[line].first_subline_idx + subline; | 1519 | return data->lines[line].first_subline_idx + subline; |
1518 | } | 1520 | } |
1519 | 1521 | ||
1520 | int wps_first_token_index(struct wps_data *data, int v, int line, int subline) | 1522 | int wps_first_token_index(struct wps_data *data, int line, int subline) |
1521 | { | 1523 | { |
1522 | int first_subline_idx = data->viewports[v].lines[line].first_subline_idx; | 1524 | int first_subline_idx = data->lines[line].first_subline_idx; |
1523 | return data->sublines[first_subline_idx + subline].first_token_idx; | 1525 | return data->sublines[first_subline_idx + subline].first_token_idx; |
1524 | } | 1526 | } |
1525 | 1527 | ||
1526 | int wps_last_token_index(struct wps_data *data, int v, int line, int subline) | 1528 | int wps_last_token_index(struct wps_data *data, int line, int subline) |
1527 | { | 1529 | { |
1528 | int first_subline_idx = data->viewports[v].lines[line].first_subline_idx; | 1530 | int first_subline_idx = data->lines[line].first_subline_idx; |
1529 | int idx = first_subline_idx + subline; | 1531 | int idx = first_subline_idx + subline; |
1530 | if (idx < data->num_sublines - 1) | 1532 | if (idx < data->num_sublines - 1) |
1531 | { | 1533 | { |