Home Programmierdokumentation Programmierdokumentation Neue Farbeinstellfunktionen erkennen

2.1 Datenstrukturen

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;

Home Programmierdokumentation Programmierdokumentation Neue Farbeinstellfunktionen erkennen