aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Korsgaard <jacmet@sunsite.dk>2011-10-17 04:35:23 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2011-10-17 04:35:23 +0200
commite4fa7b7965fd574cff2a6a9b877522d613804a38 (patch)
treec3d6377ae8cab7b0e7ab226f3c78a78eacc7e34e
parent4c77ad75b11caa824a82eb8a88e91d71c51cdd43 (diff)
downloadbusybox-e4fa7b7965fd574cff2a6a9b877522d613804a38.tar.gz
fbsplash: limit progress bar flicker
Progress bar updates flicker quite a bit on slow hw / high resolutions as the background is completely cleared before the new progress bar position is drawn on top. Improve it by first drawing the progress bar and then only fill the remaining rows with the background. function old new delta fb_drawprogressbar 444 429 -15 Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/fbsplash.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 51ba4729e..bc9ac8fe1 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -213,14 +213,15 @@ static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos,
*/
static void fb_drawprogressbar(unsigned percent)
{
- int i, left_x, top_y, width, height;
+ int left_x, top_y, pos_x;
+ unsigned width, height;
// outer box
left_x = G.nbar_posx;
top_y = G.nbar_posy;
width = G.nbar_width - 1;
height = G.nbar_height - 1;
- if ((height | width) < 0)
+ if ((int)(height | width) < 0)
return;
// NB: "width" of 1 actually makes rect with width of 2!
fb_drawrectangle();
@@ -230,30 +231,37 @@ static void fb_drawprogressbar(unsigned percent)
top_y++;
width -= 2;
height -= 2;
- if ((height | width) < 0)
+ if ((int)(height | width) < 0)
return;
- fb_drawfullrectangle(
- left_x, top_y,
- left_x + width, top_y + height,
- G.nbar_colr, G.nbar_colg, G.nbar_colb);
+ pos_x = left_x;
if (percent > 0) {
+ int y;
+ unsigned i;
+
// actual progress bar
- width = width * percent / 100;
+ pos_x += (unsigned)(width * percent) / 100;
+
+ y = top_y;
i = height;
if (height == 0)
height++; // divide by 0 is bad
while (i >= 0) {
// draw one-line thick "rectangle"
// top line will have gray lvl 200, bottom one 100
- unsigned gray_level = 100 + i*100/height;
+ unsigned gray_level = 100 + i*100 / height;
fb_drawfullrectangle(
- left_x, top_y, left_x + width, top_y,
+ left_x, y, pos_x, y,
gray_level, gray_level, gray_level);
- top_y++;
+ y++;
i--;
}
}
+
+ fb_drawfullrectangle(
+ pos_x, top_y,
+ left_x + width, top_y + height,
+ G.nbar_colr, G.nbar_colg, G.nbar_colb);
}