summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2011-12-14 12:53:19 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2011-12-14 12:53:19 +0000
commit13f1b08388fa2896ebdc0e52920b23a1e9703c40 (patch)
tree7ad05812359467916ea6d66a3afa98f5b49f265d /firmware/drivers
parentb3caa010624248930eaf487b5e151bbe2b9b9f27 (diff)
Allow scrolling lines to have their content changed without restarting the scroll line. This means skin lines with dynamic tags can be updated in realtime instead of delayed
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31247 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/lcd-bitmap-common.c69
1 files changed, 51 insertions, 18 deletions
diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c
index 3806bb024d..37c6bdaad7 100644
--- a/firmware/drivers/lcd-bitmap-common.c
+++ b/firmware/drivers/lcd-bitmap-common.c
@@ -365,6 +365,20 @@ void LCDFN(puts_offset)(int x, int y, const unsigned char *str, int offset)
/*** scrolling ***/
+static struct scrollinfo* find_scrolling_line(int line)
+{
+ struct scrollinfo* s = NULL;
+ int i;
+
+ for(i=0; i<LCDFN(scroll_info).lines; i++)
+ {
+ s = &LCDFN(scroll_info).scroll[i];
+ if (s->y == line && s->vp == current_vp)
+ return s;
+ }
+ return NULL;
+}
+
void LCDFN(puts_scroll_style_xyoffset)(int x, int y, const unsigned char *string,
int style, int x_offset, int y_offset)
{
@@ -372,32 +386,47 @@ void LCDFN(puts_scroll_style_xyoffset)(int x, int y, const unsigned char *string
char *end;
int w, h;
int len;
+ bool restart = false;
+ int space_width;
- if ((unsigned)y >= (unsigned)current_vp->height)
+ if (!string || ((unsigned)y >= (unsigned)current_vp->height))
return;
- /* remove any previously scrolling line at the same location */
- LCDFN(scroll_stop_line)(current_vp, y);
+ s = find_scrolling_line(y);
+ if (!s)
+ restart = true;
- if (LCDFN(scroll_info).lines >= LCDM(SCROLLABLE_LINES)) return;
- if (!string)
- return;
- LCDFN(puts_style_xyoffset)(x, y, string, style, x_offset, y_offset);
+ if (restart)
+ {
+ /* remove any previously scrolling line at the same location */
+ LCDFN(scroll_stop_line)(current_vp, y);
+
+ if (LCDFN(scroll_info).lines >= LCDM(SCROLLABLE_LINES)) return;
+ LCDFN(puts_style_xyoffset)(x, y, string, style, x_offset, y_offset);
+ }
LCDFN(getstringsize)(string, &w, &h);
if (current_vp->width - x * 8 >= w)
return;
- /* prepare scroll line */
- s = &LCDFN(scroll_info).scroll[LCDFN(scroll_info).lines];
- s->start_tick = current_tick + LCDFN(scroll_info).delay;
- s->style = style;
-
+ if (restart)
+ {
+ /* prepare scroll line */
+ s = &LCDFN(scroll_info).scroll[LCDFN(scroll_info).lines];
+ s->start_tick = current_tick + LCDFN(scroll_info).delay;
+ }
strlcpy(s->line, string, sizeof s->line);
+ space_width = LCDFN(getstringsize)(" ", NULL, NULL);
/* get width */
- s->width = LCDFN(getstringsize)(s->line, &w, &h);
+ LCDFN(getstringsize)(s->line, &w, &h);
+ if (!restart && s->width > w)
+ {
+ if (s->startx > w)
+ s->startx = w;
+ }
+ s->width = w;
/* scroll bidirectional or forward only depending on the string
width */
@@ -411,7 +440,7 @@ void LCDFN(puts_scroll_style_xyoffset)(int x, int y, const unsigned char *string
if (!s->bidir) { /* add spaces if scrolling in the round */
strlcat(s->line, " ", sizeof s->line);
/* get new width incl. spaces */
- s->width = LCDFN(getstringsize)(s->line, &w, &h);
+ s->width += space_width * 3;
}
end = strchr(s->line, '\0');
@@ -420,12 +449,16 @@ void LCDFN(puts_scroll_style_xyoffset)(int x, int y, const unsigned char *string
s->vp = current_vp;
s->y = y;
- s->offset = x_offset;
- s->startx = x * LCDFN(getstringsize)(" ", NULL, NULL);
+ if (restart)
+ {
+ s->offset = x_offset;
+ s->startx = x * space_width;
+ s->backward = false;
+ }
s->y_offset = y_offset;
- s->backward = false;
- LCDFN(scroll_info).lines++;
+ if (restart)
+ LCDFN(scroll_info).lines++;
}
void LCDFN(puts_scroll)(int x, int y, const unsigned char *string)