Die Datenstruktur COLOR_RGB beschreibt den RGB-Farbraum:
typedef struct
{
uint16 reserved; /* auf 0 oder den Index des Eintrags setzen */
uint16 red; /* Rot: 0<->65535 */
uint16 green; /* Grün: 0<->65535 */
uint16 blue; /* Blau: 0<->65535 */
} COLOR_RGB;
Falls in einem Programm die Farbdaten bereits in einem vernünftigen Format (z.B. 8 Bit pro Kanal) vorliegen, kann man sich eine Umwandlung mit Multiplikation und Division ersparen. Die Shift- und OR-Funktion des Prozessors erledigt das dann schneller und eleganter.
Beispiel: Der Farbwert sei durch die Byte-Variablen r, g, b beschrieben. Die korrekte Umsetzung auf das 16-Bit-Format der COLOR_RGB-Struktur erfolgt dann so:
COLOR_RGB color; color.reserved = 0; color.red = r; color.red |= (color.red << 8); color.green = g; color.green |= (color.green << 8); color.blue = b; color.blue |= (color.blue << 8);
Das Strukturelement reserved sollte auf 0 gesetzt werden oder (beim Aufbau einer Farbtabelle) den Index des Eintrags enthalten. In jedem Fall müssen aber die oberen 8 Bits von reserved auf 0 gesetzt werden, da sie von den Farbroutinen ggf. für Flags verwendet werden.
Die Union COLOR_ENTRY enthält den Farbtabelleneintrag. Zukünftig sind auch andere Farbräume als RGB möglich:
typedef union
{
COLOR_RGB rgb;
COLOR_CMYK cmyk;
} COLOR_ENTRY;
Die Struktur COLOR_TAB beschreibt die Farbtabelle:
typedef struct /* Farbtabelle */
{
int32 magic; /* 'ctab' */
int32 length;
int32 format; /* Format (0) */
int32 reserved; /* reserviert, auf 0 setzen */
int32 map_id; /* Kennung der Farbtabelle */
int32 color_space; /* Farbraum (z.Zt. nur CSPACE_RGB) */
int32 flags; /* VDI-interne Flags, auf 0 setzen */
int32 no_colors; /* Anzahl der Farbeinträge */
int32 reserved1; /* reserviert, auf 0 setzen */
int32 reserved2; /* reserviert, auf 0 setzen */
int32 reserved3; /* reserviert, auf 0 setzen */
int32 reserved4; /* reserviert, auf 0 setzen */
COLOR_ENTRY colors[];
} COLOR_TAB;
Um Koordinaten für (Schnitt-) Rechtecke und Punkte anzugeben, können die Strukturen POINT16, POINT32, RECT16, RECT32 verwendet werden. Das VDI rechnet bei den 16-Bit-Koordinaten immer mit diskreten Werten, d.h. ein Rechteck mit den Koordinaten (10,20) (10,23) ist genau ein Pixel breit und 4 Pixel hoch.
typedef struct /* Punkt für 16-Bit-Koordinaten */
{
int16 x;
int16 y;
} POINT16;
typedef struct /* Punkt für 32-Bit-Koordinaten */
{
int32 x;
int32 y;
} POINT32;
typedef struct /* Rechteck für 16-Bit-Koordinaten */
{
int16 x1;
int16 y1;
int16 x2;
int16 y2;
} RECT16;
typedef struct /* Rechteck für 32-Bit-Koordinaten */
{
int32 x1;
int32 y1;
int32 x2;
int32 y2;
} RECT32;