123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- .TH COLOR 6
- .SH NAME
- color \- representation of pixels and colors
- .SH DESCRIPTION
- To address problems of consistency and portability among applications,
- Plan 9 uses a fixed color map, called
- .BR 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 tend to sample the color cube
- uniformly, which has advantages\(emmapping from a (red, green, blue) triple
- to the color map and back again is easy\(embut 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.
- .PP
- Rather than dice the color cube into subregions of
- size 6\(mu6\(mu6 (as in Netscape Navigator) or 8\(mu8\(mu4
- (as in previous releases of Plan 9), picking 1 color in each,
- the
- .B rgbv
- color map uses a 4\(mu4\(mu4 subdivision, with
- 4 shades in each subcube.
- The idea is to reduce the color resolution by dicing
- the color cube into fewer cells, and 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.
- .PP
- The following function computes the 256 3-byte entries in the color map:
- .IP
- .EX
- .ta 6n +6n +6n +6n
- 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[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;
- }
- }
- }
- .EE
- .PP
- There are 4 nested loops to pick the (red,green,blue) coordinates of the subcube,
- and the value (intensity) within the subcube, indexed by
- .BR r ,
- .BR g ,
- .BR b ,
- and
- .BR v ,
- whence
- the name
- .IR rgbv .
- The peculiar order in which the color map is indexed is designed to distribute the
- grey shades uniformly through the map\(emthe
- .IR i 'th
- grey shade,
- .RI 0<= i <=15
- has index
- .IR i ×17,
- with black going to 0 and white to 255.
- Therefore, when a call to
- .B draw
- converts a 1, 2 or 4 bit-per-pixel picture to 8 bits per pixel (which it does
- by replicating the pixels' bits), the converted pixel values are the appropriate
- grey shades.
- .PP
- The
- .B rgbv
- map is not gamma-corrected, for two reasons. First, photographic
- film and television are both normally under-corrected, the former by an
- accident of physics and the latter by NTSC's design.
- Second, we require extra color resolution at low intensities because of the
- non-linear response and adaptation of the human visual system.
- Properly
- gamma-corrected displays with adequate low-intensity resolution pack the
- high-intensity parts of the color cube with colors whose differences are
- almost imperceptible.
- Either reason suggests concentrating
- the available intensities at the low end of the range.
- .PP
- On `true-color' displays with separate values for the red, green, and blue
- components of a pixel, the values are chosen so 0 represents no intensity (black) and the
- maximum value (255 for an 8-bit-per-color display) represents full intensity (e.g., full red).
- Common display depths are 24 bits per pixel, with 8 bits per color in order
- red, green, blue, and 16 bits per pixel, with 5 bits of red, 6 bits of green, and 5 bits of blue.
- .PP
- Colors may also be created with an opacity factor called
- .BR alpha ,
- which is scaled so 0 represents fully transparent and 255 represents opaque color.
- The alpha is
- .I premultiplied
- into the other channels, as described in the paper by Porter and Duff cited in
- .IR draw (2).
- The function
- .B setalpha
- (see
- .IR allocimage (2))
- aids the initialization of color values with non-trivial alpha.
- .PP
- The packing of pixels into bytes and words is odd.
- For compatibility with VGA frame buffers, the bits within a
- pixel byte are in big-endian order (leftmost pixel is most
- significant bits in byte), while bytes within a pixel are packed in little-endian
- order. Pixels are stored in contiguous bytes. This results
- in unintuitive pixel formats. For example, for the RGB24 format,
- the byte ordering is blue, green, red.
- .PP
- To maintain a constant external representation,
- the
- .IR draw (3)
- interface
- as well as the
- various graphics libraries represent colors
- by 32-bit numbers, as described in
- .IR color (2).
- .SH "SEE ALSO"
- .IR color (2),
- .IR graphics (2),
- .IR draw (2)
|