[PATCH] fbsplash: use line_length instead of xres * bytes_per_pixel

Yin Kangkai kangkai.yin at intel.com
Thu Feb 23 07:56:36 UTC 2012


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 at intel.com>
---
 miscutils/fbsplash.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 51ba472..78c9d52 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -93,7 +93,7 @@ static void fb_open(const char *strfb_device)
 
 	// map the device in memory
 	G.addr = mmap(NULL,
-			G.scr_var.xres * G.scr_var.yres * G.bytes_per_pixel,
+		        G.scr_var.yres * G.scr_fix.line_length,
 			PROT_WRITE, MAP_SHARED, fbfd, 0);
 	if (G.addr == MAP_FAILED)
 		bb_perror_msg_and_die("mmap");
@@ -154,8 +154,8 @@ static void fb_drawrectangle(void)
 	thispix = fb_pixel_value(nred, ngreen, nblue);
 
 	// horizontal lines
-	ptr1 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel;
-	ptr2 = G.addr + ((G.nbar_posy + G.nbar_height - 1) * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel;
+	ptr1 = G.addr + G.nbar_posy * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
+	ptr2 = G.addr + (G.nbar_posy + G.nbar_height - 1) * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
 	cnt = G.nbar_width - 1;
 	do {
 		fb_write_pixel(ptr1, thispix);
@@ -165,14 +165,14 @@ static void fb_drawrectangle(void)
 	} while (--cnt >= 0);
 
 	// vertical lines
-	ptr1 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx) * G.bytes_per_pixel;
-	ptr2 = G.addr + (G.nbar_posy * G.scr_var.xres + G.nbar_posx + G.nbar_width - 1) * G.bytes_per_pixel;
+	ptr1 = G.addr + G.nbar_posy * G.scr_fix.line_length + G.nbar_posx * G.bytes_per_pixel;
+	ptr2 = G.addr + G.nbar_posy * G.scr_fix.line_length + (G.nbar_posx + G.nbar_width - 1) * G.bytes_per_pixel;
 	cnt = G.nbar_height - 1;
 	do {
 		fb_write_pixel(ptr1, thispix);
 		fb_write_pixel(ptr2, thispix);
-		ptr1 += G.scr_var.xres * G.bytes_per_pixel;
-		ptr2 += G.scr_var.xres * G.bytes_per_pixel;
+		ptr1 += G.scr_fix.line_length;
+		ptr2 += G.scr_fix.line_length;
 	} while (--cnt >= 0);
 }
 
@@ -195,7 +195,7 @@ static void fb_drawfullrectangle(int nx1pos, int ny1pos, int nx2pos, int ny2pos,
 	cnt1 = ny2pos - ny1pos;
 	nypos = ny1pos;
 	do {
-		ptr = G.addr + (nypos * G.scr_var.xres + nx1pos) * G.bytes_per_pixel;
+		ptr = G.addr + nypos * G.scr_fix.line_length + nx1pos * G.bytes_per_pixel;
 		cnt2 = nx2pos - nx1pos;
 		do {
 			fb_write_pixel(ptr, thispix);
-- 
1.7.3.4



More information about the busybox mailing list