The colormap code is now simpler, 15bpp works where it did not before.
[mesa.git] / src / glut / fbdev / colormap.c
index 9a6dea20dc9f446caccd0bd9e027eae0cd8c2418..89556ef4a5c75ba73ac009f73d7982d595e1880e 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/fb.h>
 
 #include <GL/gl.h>
-#include <GL/glfbdev.h>
 #include <GL/glut.h>
 
 #include "internal.h"
@@ -53,9 +52,9 @@ static void FindReverseMap(int r, int g, int b)
    unsigned int minv = -1, mini = 0;
    for(i=0; i<256; i++) {
       int val = 0;
-      val += abs(r-(ColorMap.red[i]>>shift));
-      val += abs(g-(ColorMap.green[i]>>shift));
-      val += abs(b-(ColorMap.blue[i]>>shift));
+      val += abs(r-(RedColorMap[i]>>shift));
+      val += abs(g-(GreenColorMap[i]>>shift));
+      val += abs(b-(BlueColorMap[i]>>shift));
       if(val < minv) {
         minv = val;
         mini = i;
@@ -98,41 +97,39 @@ void RestoreColorMap(void)
 
 void LoadColorMap(void)
 {
-   /* we're assuming 256 entries here */
-   int i;
-
    ColorMap.start = 0;
-   ColorMap.len = 256;
    ColorMap.red   = RedColorMap;
    ColorMap.green = GreenColorMap;
    ColorMap.blue  = BlueColorMap;
    ColorMap.transp = NULL;
 
-   if (ioctl(FrameBufferFD, FBIOGETCMAP, (void *) &ColorMap) < 0)
-      sprintf(exiterror, "ioctl(FBIOGETCMAP) failed!\n");
-
-   switch(VarInfo.bits_per_pixel) {
-   case 15:
-      for(i=0; i<32; i++)
-        RedColorMap[i] = GreenColorMap[i] = BlueColorMap[i] = i*65535/31;
-      break;
-   case 16:
-      for(i=0; i<32; i++) 
-        RedColorMap[i] = BlueColorMap[i] = i*65535/31;
-      for(i=0; i<64; i++) 
-        GreenColorMap[i] = i*65535/63;
-      break;
-   case 24:
-   case 32:
-      for(i=0; i<256; i++)
-        RedColorMap[i] = GreenColorMap[i] = BlueColorMap[i] = i*257;
-      break;
-   }
+   if(DisplayMode & GLUT_INDEX) {
+      ColorMap.len = 256;
 
-   RestoreColorMap();
+      if (ioctl(FrameBufferFD, FBIOGETCMAP, (void *) &ColorMap) < 0)
+        sprintf(exiterror, "ioctl(FBIOGETCMAP) failed!\n");
 
-   if(DisplayMode & GLUT_INDEX)
       FillReverseColorMap();
+   } else {
+      int rcols = 1 << VarInfo.red.length;
+      int gcols = 1 << VarInfo.green.length;
+      int bcols = 1 << VarInfo.blue.length;
+
+      int i;
+
+      ColorMap.len = gcols;
+
+      for (i = 0; i < rcols ; i++) 
+        RedColorMap[i] = (65536/(rcols-1)) * i;
+      
+      for (i = 0; i < gcols ; i++) 
+        GreenColorMap[i] = (65536/(gcols-1)) * i;
+      
+      for (i = 0; i < bcols ; i++) 
+        BlueColorMap[i] = (65536/(bcols-1)) * i;  
+
+      RestoreColorMap();
+   }
 }
 
 void glutSetColor(int cell, GLfloat red, GLfloat green, GLfloat blue)