[Top] [Prev] [Next]

rgbv - color map

Description

To solve problems of consistency and portability among Inferno applications, Inferno uses a fixed color map, called rgbv, on 8-bit-per-pixel displays. Although this avoids problems caused by multiplexing color maps between applications, it requires that the color map chosen be suitable for most purposes and usable for all.

Other systems that use fixed color maps may sample the color cube uniformly, which has advantages-mapping from a (red, green, blue) triple to the color map and back again is easy-but ignores an important property of the human visual system: eyes are much more sensitive to small changes in intensity than to changes in hue. Sampling the color cube uniformly gives a color map with many different hues, but only a few shades of each. Continuous tone images converted into such maps demonstrate conspicuous artifacts.

Inferno's rgbv color map uses a subdivision with 4 shades in each subcube. The idea is to reduce the color resolution by dicing the color cube into fewer cells, then to use the extra space to increase the intensity resolution. This results in 16 grey shades (4 grey subcubes with 4 samples in each), 13 shades of each primary and secondary color (3 subcubes with 4 samples plus black) and a reasonable selection of colors covering the rest of the color cube. The advantage is better representation of continuous tones.

The following function computes the 256 3-byte entries in the color map:

void
setmaprgbv(uchar cmap[256][3])
{
  uchar *c;
  int r, g, b, v;
  int num, den;
  int i, j;
  for(r=0,i=0; r!=4; r++)
   for(v=0; v!=4; v++,i+=16)
    for(g=0,j=v-r; g!=4; g++)
     for(b=0; b!=4; b++,j++){
      c = cmap[255-i-(j&15)];
      den = r;
      if(g > den)
        den = g;
      if(b > den)
        den = b;
      if(den == 0) /*would divide check; pick grey shades */
        c[0] = c[1] = c[2] = 17*v;
      else{
        num = 17*(4*den+v);
        c[0] = r*num/den;
        c[1] = g*num/den;
        c[2] = b*num/den;
      }
     }
}

There are 4 nested loops to pick the (red, green, blue) coordinates of the subcube, and the value (intensity) within the subcube, indexed by r, g, b, and v, whence the name rgbv. The order in which the color map is indexed distributes the grey shades uniformly through map-the i'th grey shade, has index with white going to 0 and black to 255. When a call to draw converts a 1, 2 or 4 bit-per-pixel picture to 8 bits per pixel by replicating the pixels' bits, the converted pixel values are the appropriate grey shades.

The rgbv map is not gamma-corrected for two reasons.

See Also

Draw Module in Chapter 11 and Image - pictures and drawing in Chapter 11



[Top] [Prev] [Next]

infernosupport@lucent.com
Copyright © 1996,Lucent Technologies, Inc. All rights reserved.