Update of /cvsroot/gc-linux/linux/drivers/video
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22063/drivers/video
Modified Files:
gamecubefb.c
Log Message:
- Fixed 5/6 to 8 bits scaling for RGB components
Used a fast (approximated) algorithm pointed by Masken. Thanks!
Index: gamecubefb.c
===================================================================
RCS file: /cvsroot/gc-linux/linux/drivers/video/gamecubefb.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- gamecubefb.c 8 Aug 2004 23:19:57 -0000 1.9
+++ gamecubefb.c 10 Aug 2004 20:12:02 -0000 1.10
@@ -111,15 +111,15 @@
return 0x00800080; /* black, black */
}
- /*
- * FIXME:
- * The current scaling from 5 or 6 bits to 8 bits is not correct.
- */
-
/* RGB565 */
- r1 = ((rgb1 >> 11) & 0x1f) << 3;
- g1 = ((rgb1 >> 5) & 0x3f) << 2;
- b1 = ((rgb1 >> 0) & 0x1f) << 3;
+ r1 = ((rgb1 >> 11) & 0x1f);
+ g1 = ((rgb1 >> 5) & 0x3f);
+ b1 = ((rgb1 >> 0) & 0x1f);
+
+ /* fast (approximated) scaling to 8 bits, thanks to Masken */
+ r1 = (r1 << 3) | (r1 >> 2);
+ g1 = (g1 << 2) | (g1 >> 4);
+ b1 = (b1 << 3) | (b1 >> 2);
Y1 = clamp(16, 235, ((Yr * r1 + Yg * g1 + Yb * b1) >> RGB2YUV_SHIFT)
+ RGB2YUV_LUMA);
@@ -130,10 +130,13 @@
g = g1;
b = b1;
} else {
- /* RGB565 */
- r2 = ((rgb2 >> 11) & 0x1f) << 3;
- g2 = ((rgb2 >> 5) & 0x3f) << 2;
- b2 = ((rgb2 >> 0) & 0x1f) << 3;
+ /* same as we did for r1 before */
+ r2 = ((rgb2 >> 11) & 0x1f);
+ g2 = ((rgb2 >> 5) & 0x3f);
+ b2 = ((rgb2 >> 0) & 0x1f);
+ r2 = (r2 << 3) | (r2 >> 2);
+ g2 = (g2 << 2) | (g2 >> 4);
+ b2 = (b2 << 3) | (b2 >> 2);
Y2 = clamp(16, 235,
((Yr * r2 + Yg * g2 + Yb * b2) >> RGB2YUV_SHIFT)
|