summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-04-09 22:57:27 +0100
committerAidan MacDonald <amachronic@protonmail.com>2022-04-09 23:15:48 +0100
commit8dbc0914f6a09bea395f801f948b7a993d379493 (patch)
tree41844d8f96eb57115272902b907e3d0a97b9db5b /apps
parent32f1418c5ad1becd829b65628f9f6ec32b6dda79 (diff)
downloadrockbox-8dbc0914f6a09bea395f801f948b7a993d379493.tar.gz
rockbox-8dbc0914f6a09bea395f801f948b7a993d379493.zip
imageviewer: limit progress bar LCD update rate
The progress callback doesn't rate limit LCD updates, which causes excessive slowdowns (up to 150x!) on some targets. Limiting updates to 20fps solves the problem and should boost load speed across the board, particularly for large images and animated GIFs that may run the progress callback thousands of times. Change-Id: Ia48924d4dcb24c1111509329581809be494d0165
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/imageviewer/imageviewer.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/apps/plugins/imageviewer/imageviewer.c b/apps/plugins/imageviewer/imageviewer.c
index f57dc7e3b3..4dc7b0a07a 100644
--- a/apps/plugins/imageviewer/imageviewer.c
+++ b/apps/plugins/imageviewer/imageviewer.c
@@ -127,6 +127,9 @@ static int curfile = -1, direction = DIR_NEXT, entries = 0;
127/* list of the supported image files */ 127/* list of the supported image files */
128static char **file_pt; 128static char **file_pt;
129 129
130/* progress update tick */
131static long next_progress_tick;
132
130static const struct image_decoder *imgdec = NULL; 133static const struct image_decoder *imgdec = NULL;
131static enum image_type image_type = IMAGE_UNKNOWN; 134static enum image_type image_type = IMAGE_UNKNOWN;
132 135
@@ -428,7 +431,14 @@ static int ask_and_get_audio_buffer(const char *filename)
428/* callback updating a progress meter while image decoding */ 431/* callback updating a progress meter while image decoding */
429static void cb_progress(int current, int total) 432static void cb_progress(int current, int total)
430{ 433{
431 rb->yield(); /* be nice to the other threads */ 434 /* do not yield or update the progress bar if we did so too recently */
435 long now = *rb->current_tick;
436 if(!TIME_AFTER(now, next_progress_tick))
437 return;
438
439 /* limit to 20fps */
440 next_progress_tick = now + HZ/20;
441
432#ifndef USEGSLIB 442#ifndef USEGSLIB
433 /* in slideshow mode, keep gui interference to a minimum */ 443 /* in slideshow mode, keep gui interference to a minimum */
434 const int size = (!iv_api.running_slideshow ? 8 : 4); 444 const int size = (!iv_api.running_slideshow ? 8 : 4);
@@ -442,6 +452,8 @@ static void cb_progress(int current, int total)
442 total, 0, current, HORIZONTAL); 452 total, 0, current, HORIZONTAL);
443 rb->lcd_update_rect(0, LCD_HEIGHT-size, LCD_WIDTH, size); 453 rb->lcd_update_rect(0, LCD_HEIGHT-size, LCD_WIDTH, size);
444 } 454 }
455
456 rb->yield(); /* be nice to the other threads */
445} 457}
446 458
447#define VSCROLL (LCD_HEIGHT/8) 459#define VSCROLL (LCD_HEIGHT/8)