aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYin Kangkai <kangkai.yin@intel.com>2012-02-23 15:56:36 +0800
committerDenys Vlasenko <vda.linux@googlemail.com>2012-02-29 18:07:59 +0100
commit3ac066c25670ccf6a992c49340287379c9a342bc (patch)
tree6b770e7f114091be3883719fd9bc2f10d5dba5dd
parent62c006d508552a6ac547b807eb9ad0a32a76e1c9 (diff)
downloadbusybox-w32-3ac066c25670ccf6a992c49340287379c9a342bc.tar.gz
busybox-w32-3ac066c25670ccf6a992c49340287379c9a342bc.tar.bz2
busybox-w32-3ac066c25670ccf6a992c49340287379c9a342bc.zip
fbsplash: use line_length instead of xres * bytes_per_pixel
In some system (e.g. my "strange" device), line_length is not equal xres * bytes_per_pixel, so we need to use line_length in scr_fix to mmap and draw rectangle etc. My "strange" device output this: bytes_per_pixel: 4 xres: 600, yres: 1024 yoffset: 0, xoffset: 0, line_length: 2432 G.addr: b74da000 Signed-off-by: Yin Kangkai <kangkai.yin@intel.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/fbsplash.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 04d583df6..988439b25 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -143,7 +143,7 @@ static void fb_open(const char *strfb_device)
143 143
144 // map the device in memory 144 // map the device in memory
145 G.addr = mmap(NULL, 145 G.addr = mmap(NULL,
146 G.scr_var.xres * G.scr_var.yres * G.bytes_per_pixel, 146 G.scr_var.yres * G.scr_fix.line_length,
147 PROT_WRITE, MAP_SHARED, fbfd, 0); 147 PROT_WRITE, MAP_SHARED, fbfd, 0);
148 if (G.addr == MAP_FAILED) 148 if (G.addr == MAP_FAILED)
149 bb_perror_msg_and_die("mmap"); 149 bb_perror_msg_and_die("mmap");
@@ -213,8 +213,8 @@ static void fb_drawrectangle(void)
213 thispix = fb_pixel_value(nred, ngreen, nblue); 213 thispix = fb_pixel_value(nred, ngreen, nblue);
214 214
215 // horizontal lines 215 // horizontal lines
216 ptr1 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel; 216 ptr1 = G.addr + G.nbar_posy * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
217 ptr2 = G.addr + ((G.nbar_posy + G.nbar_height - 1) * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel; 217 ptr2 = G.addr + (G.nbar_posy + G.nbar_height - 1) * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
218 cnt = G.nbar_width - 1; 218 cnt = G.nbar_width - 1;
219 do { 219 do {
220 fb_write_pixel(ptr1, thispix); 220 fb_write_pixel(ptr1, thispix);
@@ -224,14 +224,14 @@ static void fb_drawrectangle(void)
224 } while (--cnt >= 0); 224 } while (--cnt >= 0);
225 225
226 // vertical lines 226 // vertical lines
227 ptr1 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel; 227 ptr1 = G.addr + G.nbar_posy * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
228 ptr2 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx + G.nbar_width - 1) * G.bytes_per_pixel; 228 ptr2 = G.addr + G.nbar_posy * G.scr_fix.line_length + (G.nbar_posx + G.nbar_width - 1) * G.bytes_per_pixel;
229 cnt = G.nbar_height - 1; 229 cnt = G.nbar_height - 1;
230 do { 230 do {
231 fb_write_pixel(ptr1, thispix); 231 fb_write_pixel(ptr1, thispix);
232 fb_write_pixel(ptr2, thispix); 232 fb_write_pixel(ptr2, thispix);
233 ptr1 += G.scr_var.xres * G.bytes_per_pixel; 233 ptr1 += G.scr_fix.line_length;
234 ptr2 += G.scr_var.xres * G.bytes_per_pixel; 234 ptr2 += G.scr_fix.line_length;
235 } while (--cnt >= 0); 235 } while (--cnt >= 0);
236} 236}
237 237
@@ -254,7 +254,7 @@ static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos,
254 cnt1 = ny2pos - ny1pos; 254 cnt1 = ny2pos - ny1pos;
255 nypos = ny1pos; 255 nypos = ny1pos;
256 do { 256 do {
257 ptr = G.addr + (nypos * G.scr_var.xres + nx1pos) * G.bytes_per_pixel; 257 ptr = G.addr + nypos * G.scr_fix.line_length + nx1pos * G.bytes_per_pixel;
258 cnt2 = nx2pos - nx1pos; 258 cnt2 = nx2pos - nx1pos;
259 do { 259 do {
260 fb_write_pixel(ptr, thispix); 260 fb_write_pixel(ptr, thispix);