DOS updates (Daniel Borca)
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 30 Jun 2003 21:51:31 +0000 (21:51 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 30 Jun 2003 21:51:31 +0000 (21:51 +0000)
docs/README.DJ
src/mesa/drivers/dos/video.c

index 785125876611bfca6c5d516b336c836f1f43bba1..08ebd90cfc7a1609b98bddcd2fe3a7ab0ca246a1 100644 (file)
@@ -67,7 +67,7 @@ Available options:
 
 
 Tested on:
-       CPU:            AMD Duron @800 MHz
+       CPU:            AMD Athlon XP 1800+
        Mainboard:      EP-8KTA3 w/ 128 MB SDRAM
        Video card:     Voodoo5 5500 AGP w/ 64 MB SDRAM
        DJGPP:          djdev 2.04 + gcc v3.2.2 + make v3.79.1
index a2524e052c2e78eed330f998be3d20168ff00100..6c0f56f629d2bc253b69eb807cc1ecb147f696f2 100644 (file)
@@ -54,6 +54,17 @@ int vl_current_offset, vl_current_delta;
 
 
 
+#if HUGE_LOOKUP
+/* These lookup tables are used to extract RGB values in [0,255]
+ * from 15/16-bit pixel values.
+ */
+static unsigned char pix15r[0x10000];
+static unsigned char pix15g[0x10000];
+static unsigned char pix15b[0x10000];
+static unsigned char pix16r[0x10000];
+static unsigned char pix16g[0x10000];
+static unsigned char pix16b[0x10000];
+#else
 /* lookup table for scaling 5 bit colors up to 8 bits */
 static int _rgb_scale_5[32] = {
    0,   8,   16,  25,  33,  41,  49,  58,
@@ -61,6 +72,7 @@ static int _rgb_scale_5[32] = {
    132, 140, 148, 156, 165, 173, 181, 189,
    197, 206, 214, 222, 230, 239, 247, 255
 };
+#endif
 
 /* lookup table for scaling 6 bit colors up to 8 bits */
 static int _rgb_scale_6[64] = {
@@ -213,17 +225,29 @@ static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[])
 static void v_getrgba15 (unsigned int offset, unsigned char rgba[4])
 {
  word32 c = ((word16 *)vl_current_read_buffer)[offset];
+#if HUGE_LOOKUP
+ rgba[0] = pix15r[c];
+ rgba[1] = pix15g[c];
+ rgba[2] = pix15b[c];
+#else
  rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F];
  rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F];
  rgba[2] = _rgb_scale_5[c & 0x1F];
+#endif
  rgba[3] = 255;
 }
 static void v_getrgba16 (unsigned int offset, unsigned char rgba[4])
 {
  word32 c = ((word16 *)vl_current_read_buffer)[offset];
+#if HUGE_LOOKUP
+ rgba[0] = pix16r[c];
+ rgba[1] = pix16g[c];
+ rgba[2] = pix16b[c];
+#else
  rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F];
  rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F];
  rgba[2] = _rgb_scale_5[c & 0x1F];
+#endif
  rgba[3] = 255;
 }
 static void v_getrgba24 (unsigned int offset, unsigned char rgba[4])
@@ -339,6 +363,52 @@ static void fake_buildpalette (int bits)
 
 
 
+#if HUGE_LOOKUP
+/* Desc: initialize lookup arrays
+ *
+ * In  : -
+ * Out : -
+ *
+ * Note: -
+ */
+void v_init_pixeltables (void)
+{
+ unsigned int pixel;
+
+ for (pixel = 0; pixel <= 0xffff; pixel++) {
+     unsigned int r, g, b;
+
+     /* 15bit */
+     r = (pixel & 0x7c00) >> 8;
+     g = (pixel & 0x03E0) >> 3;
+     b = (pixel & 0x001F) << 2;
+
+     r = (unsigned int)(((double)r * 255. / 0x7c) + 0.5);
+     g = (unsigned int)(((double)g * 255. / 0x7c) + 0.5);
+     b = (unsigned int)(((double)b * 255. / 0x7c) + 0.5);
+
+     pix15r[pixel] = r;
+     pix15g[pixel] = g;
+     pix15b[pixel] = b;
+
+     /* 16bit */
+     r = (pixel & 0xF800) >> 8;
+     g = (pixel & 0x07E0) >> 3;
+     b = (pixel & 0x001F) << 3;
+
+     r = (unsigned int)(((double)r * 255. / 0xF8) + 0.5);
+     g = (unsigned int)(((double)g * 255. / 0xFC) + 0.5);
+     b = (unsigned int)(((double)b * 255. / 0xF8) + 0.5);
+
+     pix16r[pixel] = r;
+     pix16g[pixel] = g;
+     pix16b[pixel] = b;
+ }
+}
+#endif
+
+
+
 /* Desc: sync buffer with video hardware
  *
  * In  : ptr to old buffer, position, size
@@ -487,6 +557,11 @@ int vl_video_init (int width, int height, int bpp, int rgb, int refresh)
  } else if (bpp == 8) {
     fake = 1;
  }
+#if HUGE_LOOKUP
+ else if (bpp < 24) {
+    v_init_pixeltables();
+ }
+#endif
 
  /* initialize hardware */
  drv = &VESA;