summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2008-07-02 09:42:36 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2008-07-02 09:42:36 +0000
commit88055b2f2e8059fdf6e146efcd8ebe8939eeea79 (patch)
treec8e95ab58125a2b4606ee2f9cd3eca541b14a72d
parentf48cf6255893db537d76752c2161773e7b927a51 (diff)
downloadrockbox-88055b2f2e8059fdf6e146efcd8ebe8939eeea79.tar.gz
rockbox-88055b2f2e8059fdf6e146efcd8ebe8939eeea79.zip
fix FS#9140 by changing stop_scroll so it stops scrolling lines which would overlap the current viewport. This shouldnt cause any problems because when this happens the vp owning the line should redraw when the new vp's screen is exited.
Also fix a potential bug where only one scrolling line in a viewport was stopped git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17913 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/scroll_engine.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/firmware/scroll_engine.c b/firmware/scroll_engine.c
index 200695b5d6..9607c90448 100644
--- a/firmware/scroll_engine.c
+++ b/firmware/scroll_engine.c
@@ -84,6 +84,18 @@ void lcd_stop_scroll(void)
84 lcd_scroll_info.lines = 0; 84 lcd_scroll_info.lines = 0;
85} 85}
86 86
87/* returns true if the 'line' in 'lines_vp' would scroll into 'othervp' */
88static bool line_overlaps_viewport(struct viewport *lines_vp, int line,
89 struct viewport *othervp)
90{
91 int y = (font_get(lines_vp->font)->height*line) + lines_vp->y;
92 if (y < othervp->y || y > othervp->y + othervp->height)
93 return false;
94 else if ((lines_vp->x + lines_vp->width < othervp->x) ||
95 (othervp->x + othervp->width < lines_vp->x))
96 return false;
97 return true;
98}
87/* Stop scrolling line y in the specified viewport, or all lines if y < 0 */ 99/* Stop scrolling line y in the specified viewport, or all lines if y < 0 */
88void lcd_scroll_stop_line(struct viewport* current_vp, int y) 100void lcd_scroll_stop_line(struct viewport* current_vp, int y)
89{ 101{
@@ -91,8 +103,11 @@ void lcd_scroll_stop_line(struct viewport* current_vp, int y)
91 103
92 while (i < lcd_scroll_info.lines) 104 while (i < lcd_scroll_info.lines)
93 { 105 {
94 if ((lcd_scroll_info.scroll[i].vp == current_vp) && 106 if (((lcd_scroll_info.scroll[i].vp == current_vp) &&
95 ((y < 0) || (lcd_scroll_info.scroll[i].y == y))) 107 ((y < 0) || (lcd_scroll_info.scroll[i].y == y))) ||
108 ((lcd_scroll_info.scroll[i].vp != current_vp) &&
109 line_overlaps_viewport(lcd_scroll_info.scroll[i].vp,
110 lcd_scroll_info.scroll[i].y, current_vp)))
96 { 111 {
97 /* If i is not the last active line in the array, then move 112 /* If i is not the last active line in the array, then move
98 the last item to position i */ 113 the last item to position i */
@@ -102,8 +117,10 @@ void lcd_scroll_stop_line(struct viewport* current_vp, int y)
102 } 117 }
103 lcd_scroll_info.lines--; 118 lcd_scroll_info.lines--;
104 119
105 /* A line can only appear once, so we're done. */ 120 /* A line can only appear once, so we're done,
106 return ; 121 * unless we are clearing the whole viewport */
122 if (y >= 0)
123 return ;
107 } 124 }
108 else 125 else
109 { 126 {
@@ -165,8 +182,11 @@ void lcd_remote_scroll_stop_line(struct viewport* current_vp, int y)
165 182
166 while (i < lcd_remote_scroll_info.lines) 183 while (i < lcd_remote_scroll_info.lines)
167 { 184 {
168 if ((lcd_remote_scroll_info.scroll[i].vp == current_vp) && 185 if (((lcd_remote_scroll_info.scroll[i].vp == current_vp) &&
169 ((y < 0) || (lcd_remote_scroll_info.scroll[i].y == y))) 186 ((y < 0) || (lcd_remote_scroll_info.scroll[i].y == y))) ||
187 (((lcd_remote_scroll_info.scroll[i].vp != current_vp) &&
188 line_overlaps_viewport(lcd_scroll_info.scroll[i].vp,
189 lcd_scroll_info.scroll[i].y, current_vp))))
170 { 190 {
171 /* If i is not the last active line in the array, then move 191 /* If i is not the last active line in the array, then move
172 the last item to position i */ 192 the last item to position i */
@@ -176,8 +196,10 @@ void lcd_remote_scroll_stop_line(struct viewport* current_vp, int y)
176 } 196 }
177 lcd_remote_scroll_info.lines--; 197 lcd_remote_scroll_info.lines--;
178 198
179 /* A line can only appear once, so we're done. */ 199 /* A line can only appear once, so we're done,
180 return ; 200 * unless we are clearing the whole viewport */
201 if (y >= 0)
202 return ;
181 } 203 }
182 else 204 else
183 { 205 {