overview.hlp (Table of Contents; Topic list)
About Color and Mix Modes (1.2)
Using Section  Function Group                     Up Next Previous
────────────────────────────────────────────────────────────────────────────
 
                         About Color and Mix Modes
 
This topic describes color and mix modes and their use in MS OS/2
applications. You should also be familiar with the following topics:
 
    Presentation spaces and device contexts
    Line and arc primitives
    Area primitives
    Fonts and character primitives
    Marker primitives
 
Color and mix modes are two primitive attributes. The color attribute
describes a line, arc, character, marker, area, or image color before it is
combined with the color on the drawing surface. The mix-mode attribute
describes how the system combines a primitive's color with the color of the
drawing surface. Some primitives have foreground and background color
attributes. For instance, the character primitive has a foreground color
attribute that specifies the color of the character and a background color
attribute that specifies the color surrounding the character. The primitives
that have foreground and background attributes also have foreground and
background mix modes.
 
To understand color, it is important to understand several principles of
color devices. Most color devices can generate three fundamental colors:
red, green, and blue. On some devices, each of these three colors
corresponds to a color plane──for example, a red pel is visible when a pel
in the red plane is on and the corresponding pels in the green and blue
planes are off. On other devices, there is only one color plane, and each
pel contains a red, a green, and a blue section──for example, a red pel is
visible when the red section of that pel is on and the green and blue
sections are off. By combining the three fundamental colors, a device can
obtain five additional colors, for a total of eight. These eight colors, and
the combinations that produce them, are as follows:
 
Resulting color  Combined colors
────────────────────────────────────────────────────────────────────────────
Black            Red, green, and blue are off.
Red              Red is on; green and blue are off.
Green            Green is on; red and blue are off.
Blue             Blue is on; red and green are off.
Pink             Red and blue are on; green is off.
Cyan             Blue and green are on; red is off.
Yellow           Red and green are on; blue is off.
White            Red, green, and blue are on.
 
Color and RGB Values
 
In MS OS/2, the red, green, and blue components of a color are either stored
in an RGB structure or stored as a long integer (32-bit) value. The RGB
structure has the following format:
 
typedef struct _RGB {     /* rgb */
    BYTE bBlue;
    BYTE bGreen;
    BYTE bRed;
} RGB;
 
The RGB value has the following format:
 
0x00RRGGBB.
 
Each field in the RGB structure and each of the last three bytes in the RGB
value specify a color intensity, in the range 0 through 255, 0 being the
lowest intensity, 255 the highest. If a field or byte contains 0, its
corresponding color is not visible; if a field or byte contains 128, the
color is pale; and if a field or byte contains 255, the color is as intense
as the device allows. If all the fields or bytes are set to 0, the
corresponding color is black. Similarly, if all the fields or bytes are set
to 255, the corresponding color is white.
 
The following list shows the RGB value associated with each of the eight
fundamental colors:
 
Color   Associated RGB value
────────────────────────────────────────────────────────────────────────────
White   0x00FFFFFF
Yellow  0x00FFFF00
Pink    0x00FF00FF
Cyan    0x0000FFFF
Blue    0x000000FF
Green   0x0000FF00
Red     0x00FF0000
Black   0x00000000
 
Color Tables
 
A color table is an array of RGB values. There are two kinds of color
tables: physical (used by device drivers) and logical (used by
applications). The physical color table contains RGB values representing the
available colors on a device. The logical color table contains RGB values
representing the colors that an application would prefer to use. You can
determine which colors are in the physical color table by calling the
GpiQueryRealColors function. You can determine which colors are in the
current logical color table by calling the GpiQueryLogColorTable function.
 
The following list contains the index values and colors found in a logical
color table:
 
Index  Color
────────────────────────────────────────────────────────────────────────────
0      Device's background color (white)
1      Blue
2      Red
3      Pink
4      Green
5      Cyan
6      Yellow
7      Neutral color (black)
8      Dark gray
9      Pale blue
10     Pale red
11     Pale pink
12     Dark green
13     Dark cyan
14     Brown
15     Pale gray
 
The value you place in the color field of a primitive-attribute structure
(by using GpiSetAttrs) is an index into the logical color table. When MS
OS/2 draws the primitive, it searches the physical color table for a color
that is the closest approximation to this color index. MS OS/2 then uses
this approximate color to draw with.
 
You can replace the default logical color table with a new color table by
calling the GpiCreateLogColorTable function. You can also use this function
to reset the logical color table to its original values. Either way, once
you create a new logical color table (or reset it to its original values),
it becomes part of the application's presentation space.
 
For a given device, you can determine the maximum size of the logical color
table by using the DevQueryCaps function. This function also returns the
maximum number of distinct colors available on a particular device.
 
Color Output and Mix Modes
 
When an application draws a line, arc, character, marker, area, or image, MS
OS/2 uses a mix mode to determine the color that appears on a video display,
printer, or plotter. A mix mode is a bitwise operation on the color indices
in a device's physical color table. For example, suppose an application has
set the lColor field in the LINEBUNDLE structure to CLR_BLUE and the
usMixMode field in the same structure to FM_OR. The current drawing-surface
color is CLR_BACKGROUND. The CLR_BLUE entry corresponds to the color blue in
both the presentation space's logical color table and the device's physical
color table. The CLR_BACKGROUND entry corresponds to the color white in both
the presentation space's logical color table and the device's physical color
table. The index value for blue in the device's table is 0x0001, and the
index value for white in the device's table is 0x0000. To determine the
color of a line, MS OS/2 performs a bitwise OR operation on the two index
values, as follows:
 
      0x0001
      0x0000
      ------
      0x0001  (Result of bitwise OR)
 
In this case, the result is 0x0001, the index value for blue in the device's
color table. This means that a blue line appears when the application calls
the GpiLine or GpiPolyLine function.
 
Some of the primitive bundles contain foreground and background colors and
mix modes. For instance, the AREABUNDLE structure contains a foreground
color that corresponds to the foreground color of the area fill pattern. The
AREABUNDLE structure also contains a background color that corresponds to
the background color that appears behind the area fill pattern. AREABUNDLE
also contains foreground and background mix modes that specify bitwise
operations on index values in the device's physical color table.
 
There are 16 foreground mix modes. For each mix mode, the index value for
the foreground and current drawing-surface colors (in the device's physical
color table) are combined by using one of the bitwise operators. The
different foreground mix modes are described in the following list:
 
Mix mode        Description
────────────────────────────────────────────────────────────────────────────
FM_AND          Final color's index value is determined by a bitwise AND
                operation on the foreground color's index value and the
                drawing surface's index value.
 
FM_INVERT       Final color's index value is always the inverse of the
                drawing surface's index value.
 
FM_LEAVEALONE   Final color's index value is that of the drawing-surface
                color.
 
FM_MASKSRCNOT   Final color's index value is determined by inverting the
                drawing surface's index value and performing a bitwise AND
                operation on this value and the foreground color's index
                value.
 
FM_MERGENOTSRC  Final color's index value is determined by performing a
                bitwise AND operation on the drawing surface's index value
                and the inverse of the foreground color's index value.
 
FM_MERGESRCNOT  Final color's index value is determined by performing a
                bitwise AND operation on the foreground color's index value
                and the inverse of the drawing-surface color's index value.
 
FM_NOTCOPYSRC   Final color's index value is the inverse of the foreground
                color's index value.
 
FM_NOTMASKSRC   Final color's index value is the inverse of the FM_AND
                result.
 
FM_NOTMERGESRC  Final color's index value is always the inverse of the FM_OR
                result.
 
FM_NOTXORSRC    Final color's index value is always the inverse of the
                FM_XOR result.
 
FM_ONE          Final color's index value is always 1.
 
FM_OR           Final color's index value is determined by a bitwise OR
                operation on the foreground color's index value and the
                drawing surface's index value.
 
FM_OVERPAINT    Final color's index value is that of the foreground color.
 
FM_SUBTRACT     Final color's index value is determined by inverting the
                foreground color's index value and performing a bitwise AND
                operation on this value and the drawing surface's index
                value.
 
FM_XOR          Final color's index value is determined by a bitwise XOR
                operation on the foreground color's index value and the
                drawing surface's index value.
 
FM_ZERO         Final color's index value is always zero.
 
There are four background mix modes. For each mix mode, the index value for
the background color and the current drawing-surface color (in the device's
physical color table) are combined using one of the bitwise operators. The
different background mix modes are described in the following list:
 
Mix mode       Description
────────────────────────────────────────────────────────────────────────────
BM_LEAVEALONE  Final color's index value is that of the drawing-surface
               color.
 
BM_OR          Final color's index value is determined by a bitwise OR
               operation on the background color's index value and the
               drawing surface's index value.
 
BM_OVERPAINT   Final color's index value is that of the background color.
 
BM_XOR         Final color's index value is determined by a bitwise XOR
               operation on the background color's index value and the
               drawing surface's index value.
 
Dithering
 
If you request a color that isn't available in the physical color table, MS
OS/2 obtains the closest match by a process called dithering. For example,
if the physical color table does not contain a certain shade of gray, MS
OS/2 can create what appears to be a gray by mixing black pels and white
pels. Similarly, if the physical color table does not contain a light green
color but does contain a yellow and a green, MS OS/2 can create what appears
to be light green by mixing yellow pels and green pels.
 
Dithering is especially important on monochrome devices. By combining
various combinations of black pels with white pels, MS OS/2 can create
numerous shades of gray.
 
 
                                      ♦