Diese Bibliothek enthält Funktionen, um rechteckige Blöcke von Bits im Speicher zu manipulieren. Für diesen Zweck stehen die folgenden Routinen zur Verfügung:
• v_get_pixel | Pixelstatus ermitteln (gesetzt oder gelöscht). |
• vq_hilite_color | Hervorhebungsfarbe ermitteln. |
• vq_max_color | maximalen Farbwert für eine additive Rasteroperation ermitteln. |
• vq_min_color | minimalen Farbwert für eine subtraktive Rasteroperation ermitteln. |
• vq_weight_color | Gewichtung für die Blend-Funktion ermitteln. |
• vr_clip_rects_by_dst | Zielrechteck mit einem Clipping-Rechteck schneiden. |
• vr_clip_rects_by_src | Quellrechteck mit einem Clipping-Rechteck schneiden. |
• vr_clip_rects32_by_dst | Zielrechteck mit einem Clipping-Rechteck schneiden. |
• vr_clip_rects32_by_src | Quellrechteck mit einem Clipping-Rechteck schneiden. |
• vr_transfer_bits | Verknüpft zweier Bitmaps |
• vr_trnfm | Raster in gerätespezifische Formate transformieren. |
• vro_cpyfm | Bildschirmbereich pixelweise kopieren (opaque). |
• vrt_cpyfm | Bildschirmbereich pixelweise kopieren (transparent). |
• vs_hilite_color | Hervorhebungsfarbe setzen. |
• vs_max_color | maximalen Farbwert für eine additive Rasteroperation setzen. |
• vs_min_color | minimalen Farbwert für eine subtraktive Rasteroperation setzen. |
• vs_weight_color | Gewichtung für die Blend-Funktion setzen. |
Hinweis: Mit diesen Funktionen ist es insbesondere möglich, einen Bildschirmbereich in einen anderen zu kopieren oder zu verschieben; auf diese Weise läßt sich z.B. ein sauberes Scrolling in GEM-Programmen realisieren.
Querverweis: Rasterformate Off-Screen-Bitmaps Workstations des VDI
Name: | »Get Pixel« - liefert den Farbwert eines Pixels.
| ||||||||||||||
VDI-Nummer: | 105
| ||||||||||||||
Deklaration: | void v_get_pixel ( int16_t handle, int16_t x, int16_t y,
int16_t *pel, int16_t *index );
| ||||||||||||||
Beschreibung: | Die Funktion ermittelt den Pixelwert und den Farbindex eines
Pixels bei Auflösungen bis zu 256 Farben (8 Planes). Es gilt:
Hinweis: Unter dem Farbindex versteht man die Nummer, die man bei den Attributfunktionen des VDI angeben kann. Der Pixelwert gibt hingegen den tatsächlichen Inhalt des Bildspeichers wieder. Bei HiColor (15- oder 16-Bit) enthält pel den Pixelwert und index ist (meistens) -1, da er nicht einwandfrei zuzuordnen ist. Bei TrueColor enthält pel das Low-Word des Pixelwerts und index das High-Word. | ||||||||||||||
Ergebnis: | Die Funktion liefert kein Ergebnis.
| ||||||||||||||
Verfügbar: | Supported by all screen drivers.
| ||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||
Querverweis: | Binding Rasterformate
|
C: | void v_get_pixel ( int16_t handle, int16_t x, int16_t y,
int16_t *pel, int16_t *index );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
void v_get_pixel (int16_t handle, int16_t x, int16_t y, int16_t *pel, int16_t *index) { ptsin[0] = x; ptsin[1] = y; contrl[0] = 105; contrl[1] = 1; contrl[3] = 0; contrl[6] = handle; vdi (); *pel = intout[0]; *index = intout[1]; } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Inquire Hilite Color« - Hervorhebungsfarbe ermitteln.
| ||||||||
VDI-Nummer: | 209 (Unterfunktion 0)
| ||||||||
Deklaration: | int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY
*hilite_color );
| ||||||||
Beschreibung: | Diese Funktion erfragt die Hervorhebungsfarbe.
| ||||||||
Ergebnis: | eingestellter Farbraum
| ||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||
Gruppe: | Rasterfunktionen
| ||||||||
Querverweis: | Binding
|
C: | int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY
*hilite_color );
| ||||||||||||||||||||||||||||||
Umsetzung: |
int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY *hilite_color ) { contrl[0] = 209; contrl[1] = 0; contrl[3] = 0; contrl[5] = 0; contrl[6] = handle; vdi (); hilite_color = intout[2..5]; return ( intout[0..1] ); } | ||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Inquire Maximum Color« -
| ||||||||
VDI-Nummer: | 209 (Unterfunktion 2)
| ||||||||
Deklaration: | int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color );
| ||||||||
Beschreibung: | Diese Funktion erfragt den maximalen Farbwert für eine
additive Rasteroperation.
| ||||||||
Ergebnis: | eingestellter Farbraum
| ||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||
Gruppe: | Rasterfunktionen
| ||||||||
Querverweis: | Binding
|
C: | int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color );
| ||||||||||||||||||||||||||||||
Umsetzung: |
int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color ) { contrl[0] = 209; contrl[1] = 0; contrl[3] = 0; contrl[5] = 2; contrl[6] = handle; vdi (); max_color = intout[2..5]; return ( intout[0..1] ); } | ||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Inquire Minimum Color« -
| ||||||||
VDI-Nummer: | 209 (Unterfunktion 1)
| ||||||||
Deklaration: | int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color );
| ||||||||
Beschreibung: | Diese Funktion erfragt den minimalen Farbwert für die
Subtraktionsfunktion (T_SUB).
| ||||||||
Ergebnis: | eingestellter Farbraum
| ||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||
Gruppe: | Rasterfunktionen
| ||||||||
Querverweis: | Binding
|
C: | int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color );
| ||||||||||||||||||||||||||||||
Umsetzung: |
int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color ) { contrl[0] = 209; contrl[1] = 0; contrl[3] = 0; contrl[5] = 1; contrl[6] = handle; vdi (); min_color = intout[2..5]; return ( intout[0..1] ); } | ||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Inquire Weight Color« -
| ||||||||
VDI-Nummer: | 209 (Unterfunktion 3)
| ||||||||
Deklaration: | int32_t vq_weight_color( int16_t handle, COLOR_ENTRY
*weight_color );
| ||||||||
Beschreibung: | Diese Funktion erfragt die Gewichtung für die Blendfunktion
(T_BLEND).
| ||||||||
Ergebnis: | eingestellter Farbraum
| ||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||
Gruppe: | Rasterfunktionen
| ||||||||
Querverweis: | Binding
|
C: | int32_t vq_weight_color( int16_t handle, COLOR_ENTRY
*weight_color );
| ||||||||||||||||||||||||||||||
Umsetzung: |
int32_t vq_weight_color( int16_t handle, COLOR_ENTRY *weight_color ) { contrl[0] = 209; contrl[1] = 0; contrl[3] = 0; contrl[5] = 3; contrl[6] = handle; vdi (); weight_color = intout[2..5]; return ( intout[0..1] ); } | ||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Clip Rects By Destination Rectangle«
| ||||||||||||||||
VDI-Nummer: | 171 (Unterfunktion 2)
| ||||||||||||||||
Deklaration: | int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32
*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32
*clipped_src_rect, RECT32 *clipped_dst_rect );
| ||||||||||||||||
Beschreibung: | Zielrechteck mit einem Clipping-Rechteck schneiden und das
Quellrechteck anpassen.
| ||||||||||||||||
Ergebnis: | 0: kein Schnitt der Rechtecke
1: alles in Ordnung | ||||||||||||||||
Verfügbar: | ab NVDI 5.02
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. | ||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||
Querverweis: | Binding
|
C: | int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32
*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32
*clipped_src_rect, RECT32 *clipped_dst_rect );
| ||||||||||||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32 *dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 *clipped_src_rect, RECT32 *clipped_dst_rect ) { ptsin[0..7] = dst_clip_rect; ptsin[8..15] = src_rect; ptsin[16..23] = dst_rect; contrl[0] = 171; contrl[1] = 12; contrl[3] = 0; contrl[5] = 2; contrl[6] = handle; vdi (); clipped_src_rect = ptsout[0..7]; clipped_dst_rect = ptsout[8..15]; return ( intout[0] ); } | ||||||||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Clip Rects By Source Rectangle«
| ||||||||||||||||
VDI-Nummer: | 171 (Unterfunktion 3)
| ||||||||||||||||
Deklaration: | int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32
*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32
*clipped_src_rect, RECT32 *clipped_dst_rect );
| ||||||||||||||||
Beschreibung: | Quellrechteck mit einem Clipping-Rechteck schneiden und das
Zielrechteck anpassen (die Funktion berücksichtigt das
Rundungsverhalten von vr_transfer_bits).
| ||||||||||||||||
Ergebnis: | 0: kein Schnitt der Rechtecke
1: alles in Ordnung | ||||||||||||||||
Verfügbar: | ab NVDI 5.02
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. | ||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||
Querverweis: | Binding vr_transfer_bits
|
C: | int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32
*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32
*clipped_src_rect, RECT32 *clipped_dst_rect );
| ||||||||||||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32 *src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 *clipped_src_rect, RECT32 *clipped_dst_rect ) { ptsin[0..7] = src_clip_rect; ptsin[8..15] = src_rect; ptsin[16..23] = dst_rect; contrl[0] = 171; contrl[1] = 12; contrl[3] = 0; contrl[5] = 3; contrl[6] = handle; vdi (); clipped_src_rect = ptsout[0..7]; clipped_dst_rect = ptsout[8..15]; return ( intout[0] ); } | ||||||||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Clip Rects By Destination Rectangle«
| ||||||||||||||||
VDI-Nummer: | 171 (Unterfunktion 0)
| ||||||||||||||||
Deklaration: | int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16
*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16
*clipped_src_rect, RECT16 *clipped_dst_rect );
| ||||||||||||||||
Beschreibung: | Zielrechteck mit einem Clipping-Rechteck schneiden und das
Quellrechteck anpassen.
| ||||||||||||||||
Ergebnis: | 0: kein Schnitt der Rechtecke
1: alles in Ordnung | ||||||||||||||||
Verfügbar: | ab NVDI 5.02
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. | ||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||
Querverweis: | Binding
|
C: | int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16
*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16
*clipped_src_rect, RECT16 *clipped_dst_rect );
| ||||||||||||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16 *dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 *clipped_src_rect, RECT16 *clipped_dst_rect ) { ptsin[0..3] = dst_clip_rect; ptsin[4..7] = src_rect; ptsin[8..11] = dst_rect; contrl[0] = 171; contrl[1] = 6; contrl[3] = 0; contrl[5] = 0; contrl[6] = handle; vdi (); clipped_src_rect = ptsout[0..3]; clipped_dst_rect = ptsout[4..7]; return ( intout[0] ); } | ||||||||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Clip Rects By Source Rectangle«
| ||||||||||||||||
VDI-Nummer: | 171 (Unterfunktion 1)
| ||||||||||||||||
Deklaration: | int16_t vr_clip_rects_by_src ( int16_t handle, RECT16
*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16
*clipped_src_rect, RECT16 *clipped_dst_rect );
| ||||||||||||||||
Beschreibung: | Quellrechteck mit einem Clipping-Rechteck schneiden und das
Zielrechteck anpassen (die Funktion berücksichtigt das
Rundungsverhalten von vr_transfer_bits).
| ||||||||||||||||
Ergebnis: | 0: kein Schnitt der Rechtecke
1: alles in Ordnung | ||||||||||||||||
Verfügbar: | ab NVDI 5.02
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. | ||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||
Querverweis: | Binding vr_transfer_bits
|
C: | int16_t vr_clip_rects_by_src ( int16_t handle, RECT16
*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16
*clipped_src_rect, RECT16 *clipped_dst_rect );
| ||||||||||||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vr_clip_rects_by_src ( int16_t handle, RECT16 *src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 *clipped_src_rect, RECT16 *clipped_dst_rect ) { ptsin[0..3] = src_clip_rect; ptsin[4..7] = src_rect; ptsin[8..11] = dst_rect; contrl[0] = 171; contrl[1] = 6; contrl[3] = 0; contrl[5] = 1; contrl[6] = handle; vdi (); clipped_src_rect = ptsout[0..3]; clipped_dst_rect = ptsout[4..7]; return ( intout[0] ); } | ||||||||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Transfer Bitmap« - Verknüpft zweier Bitmaps
| ||||||||||||||||
VDI-Nummer: | 170 (Unterfunktion 0)
| ||||||||||||||||
Deklaration: | void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm,
GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode );
| ||||||||||||||||
Beschreibung: | The call vr_transfer_bit combines two bitmaps, using scaling if
required.
Die Funktion TRANSFER BITMAP verknüpft die Quellbitmap src_bm mit der Zielbitmap dst_bm, wobei mode die Transferfunktion angibt. Das Quellrechteck wird in src_rect und das Zielrechteck in dst_rect übergeben. Die Koordinaten werden dabei (wie bei allen anderen VDI-Funktionen) als diskrete Werte angegeben. Wenn das Quell- und das Zielrechteck nicht die gleichen Ausmaße haben, skaliert TRANSFER BITMAP die Quellbitmap. Bei Verkleinerungen werden die Bitmapdaten interpoliert, wenn die Quelle direkte Farbwerte enthält (16 oder 32 Bit) oder wenn die Ausgabe mit Dithern erfolgt. Falls die Quell- und die Zielbitmap nicht das gleiche Pixelformat oder die gleiche Farbtiefe haben, werden die Quelldaten automatisch in das Zielformat umgesetzt (die Quellbitmap bleibt dabei natürlich unverändert). Wenn src_bm oder dst_bm 0 ist, wird als Quelle bzw. Ziel der Operation die Bitmap der Workstationhandle benutzt. Bei Ausgaben auf dem Bildschirm sollte ein Programm auf jeden Fall 0 fürdst_bm übergeben und nicht versuchen, eine eigene Bitmapbeschreibung aufzubauen. Clipping erfolgt nur für die Zielbitmap (und das nur, wenn die Zielbitmap die Bitmap der Workstation ist). Transfermodi In der folgenden Liste sind die Konstanten für die in mode übergebenen Transfermodi definiert. In den Kommentaren ist dabei die Art der Operation in symbolischer Schreibweise aufgeführt (src ist das Quellpixel, dst ist das Zielpixel, bg_col ist der Pixelwert der Hintergrundfarbe, hilite_col ist der Pixelwert der Farbe für Hervorhebungen): /* logische Transfermodi */ /* dst = src; */ #define T_LOGIC_COPY 0 /* dst = src OR dst; */ #define T_LOGIC_OR 1 /* dst = src XOR dst; */ #define T_LOGIC_XOR 2 /* dst = src AND dst; */ #define T_LOGIC_AND 3 /* dst = ( NOT src ); */ #define T_LOGIC_NOT_COPY 4 /* dst = ( NOT src ) OR dst; */ #define T_LOGIC_NOT_OR 5 /* dst = ( NOT src ) XOR dst; */ #define T_LOGIC_NOT_XOR 6 /* dst = ( NOT src ) AND dst; */ #define T_LOGIC_NOT_AND 7 /* Zeichenmodi */ /* dst = src; */ #define T_REPLACE 32 /* if ( src != bg_col ) dst = src; */ #define T_TRANSPARENT 33 /* if ( src != bg_col ) */ /* { */ /* if ( dst == bg_col ) */ /* dst = hilite_col; */ /* else if ( dst == hilite_col )*/ /* dst = bg_col; */ /* } */ #define T_HILITE 34 /* if ( src == bg_col ) dst = src; */ #define T_REVERS_TRANSPARENT 35 Hinweis: Bei den arithmetischen Transfermodi werden Quelle und Ziel nicht anhand ihres Pixelwerts verknüpft, sondern ihre (RGB-) Farbwerte werden je nach Verknüpfung addiert oder subtrahiert, ... In der symbolischen Beschreibung ist RGB( x ) der RGB-Farbwert eines Pixels und PIXELWERT( rgb ) ist der Pixelwert eines RGB-Farbwerts. MAX( rgb_a, rgb_b ) liefert die maximalen Komponenten zweier RGB- Farbwerte; MIN( rgb_a, rgb_b ) liefert dementsprechend die minimalen Komponenten zurück. <max_rgb> ist ein maximaler RGB-Farbwert, <min_rgb> ist ein minimaler RGB-Farbwert. <Gewichtung> ist ein Wert zwischen 0 und 1.0, der die Mischung von Quell- und Zielfarbe angibt. /* arithmetische Transfermodi */ /* Quell- und Zielfarbe mischen */ /* rgb = RGB( src ) * Gewichtung ); */ /* rgb += RGB( dst ) * (1-Gewichtung));*/ /* dst = PIXELWERT( rgb ); */ #define T_BLEND 64 /* Quell- und Zielfarbe addieren */ /* rgb = RGB( src ) + RGB( dst ) */ /* if ( rgb > max_rgb ) */ /* rgb = max_rgb; */ /* dst = PIXELWERT( rgb ); */ #define T_ADD 65 /* Quell- und Zielfarbe addieren, */ /* überlauf nicht abfangen */ /* rgb = RGB( src ) + RGB( dst ) */ /* dst = PIXELWERT( rgb ); */ #define T_ADD_OVER 66 /* Quell- von Zielfarbe subtrahieren */ /* rgb = RGB( dst ) - RGB( src ) */ /* if ( rgb < min_rgb ) */ /* rgb = min_rgb; */ /* dst = PIXELWERT( rgb ); */ #define T_SUB 67 /* maximale RGB-Komponenten */ /* rgb = MAX(RGB( dst ), RGB( src ))*/ /* dst = PIXELWERT( rgb ); */ #define T_MAX 69 /* Quell- von Zielfarbe subtrahieren, */ /* überlauf nicht abfangen */ /* rgb = RGB( dst ) - RGB( src ) */ /* dst = PIXELWERT( rgb ); */ #define T_SUB_OVER 70 /* minimale RGB-Komponenten */ /* rgb = MIN(RGB( dst ), RGB( src ))*/ /* dst = PIXELWERT( rgb ); */ #define T_MIN 71 Für alle Transfermodi kann man außerdem durch Addition einer der beiden folgenden Konstanten die Art der Verknüpfung beeinflussen. #define T_COLORIZE 16 /* Quelle einfärben */ #define T_DITHER_MODE 128 /* Quelldaten dithern */ Dithern <T_DITHER_MODE> führt dazu, daß eine Fehlerverteilungsfunktion benutzt wird, wenn die Zielbitmap 256 oder weniger Farben hat (außerdem wird bei Verkleinerungen in diesem Fall interpoliert, damit die Details in der Verkleinerung nicht vollkommen verloren gehen). Falls die Quell- und Zielpalette gleich sind (oder die Quellpalette eine Untermenge der Systemfarbpalette ist), verwendet NVDI intern (automatisch) eine schnellere Transferfunktion ohne Dither. Einfärbung
Bitmaps Statt eines antiquierten MFDBs erwartet diese Funktion eine GCBITMAP-Struktur, um die Bitmaps zu beschreiben. Wenn <ctab> 0L ist, wird die der Bittiefe entsprechende Systemfarbtabelle für den Aufruf benutzt (wenn die Bitmap mehr als 8 Bit pro Pixel hat, d.h. direkte Farbwerte benutzt, kann <ctab> ebenfalls auf 0L gesetzt werden). Quellbitmaps benötigen keine inverse Farbtabelle, hier kann <itab> auf 0L gesetzt werden. Bei einer selbst verwalteten Zielbitmap muß man vom VDI eine Referenz auf eine inverse Farbtabelle anfordern (und irgendwann später auch wieder freigeben). Vereinfachte Sonderfälle Damit Bitmaps im Format des Bildschirms auch ohne Anforderung einer Farbtabelle und einer Referenz auf eine inverse Farbtabelle ähnlich unkompliziert wie bei vro_cpyfm kopiert werden können, gibt es einige vereinfachte Sonderfälle bei vr_transfer_bits:
Hinweis: Es empfiehlt sich, für Bitmaps außerhalb des Bildschirms mit v_open_bm oder v_opnbm eine Bitmap vom VDI erzeugen zu lassen, da man sich in diesem Fall nicht um die Verwaltung von Farbtabellen und inversen Farbtabellen kümmern muß. Pixelformate Um Bitmaps zwischen verschiedenen Bittiefen und Pixelformaten wandeln zu können, benötigt TRANSFER BITMAP eine Beschreibung des Pixelformats, die im Strukturelement <px_format> enthalten ist. Der Aufbau dieses Bitvektors wird in der folgenden Liste beschrieben; für Programmierer dürften aber vor allem die vordefinierten Formate interessant sein: /* Konstanten für Pixelformate */ /* Pixel besteht aus einer benutzten Komponente: Farbindex */ #define PX_1COMP 0x01000000L /* Pixel besteht aus drei benutzten Komponenten, z.B. RGB */ #define PX_3COMP 0x03000000L /* Pixel besteht aus vier benutzten Komponenten, z.B. CMYK */ #define PX_4COMP 0x04000000L /* Pixel wird in umgekehrter Bytereihenfolge ausgegeben */ #define PX_REVERSED 0x00800000L /* unbenutzte Bits liegen vor den benutzen (im Motorola-Format betrachtet) */ #define PX_xFIRST 0x00400000L /* K liegt vor CMY (im Motorola-Format betrachtet) */ #define PX_kFIRST 0x00200000L /* Alphakanal liegen vor den Farbbits (im Motorola-Format betrachtet) */ #define PX_aFIRST 0x00100000L /* Bits sind aufeinanderfolgend abgelegt */ #define PX_PACKED 0x00020000L /* Bits sind auf mehrere Ebenen verteilt (Reihenfolge: 0, 1, ..., n) */ #define PX_PLANES 0x00010000L /* Bits sind auf mehrere Worte verteilt (Reihenfolge: 0, 1, ..., n) */ #define PX_IPLANES 0x00000000L /* 1 Bit des Pixels wird benutzt */ #define PX_USES1 0x00000100L /* 2 Bit des Pixels werden benutzt */ #define PX_USES2 0x00000200L /* 3 Bit des Pixels werden benutzt */ #define PX_USES3 0x00000300L /* 4 Bit des Pixels werden benutzt */ #define PX_USES4 0x00000400L /* 8 Bit des Pixels werden benutzt */ #define PX_USES8 0x00000800L /* 15 Bit des Pixels werden benutzt */ #define PX_USES15 0x00000f00L /* 16 Bit des Pixels werden benutzt */ #define PX_USES16 0x00001000L /* 24 Bit des Pixels werden benutzt */ #define PX_USES24 0x00001800L /* 32 Bit des Pixels werden benutzt */ #define PX_USES32 0x00002000L /* 48 Bit des Pixels werden benutzt */ #define PX_USES48 0x00003000L /* Pixel besteht aus 1 Bit */ #define PX_1BIT 0x00000001L /* Pixel besteht aus 2 Bit */ #define PX_2BIT 0x00000002L /* Pixel besteht aus 3 Bit */ #define PX_3BIT 0x00000003L /* Pixel besteht aus 4 Bit */ #define PX_4BIT 0x00000004L /* Pixel besteht aus 8 Bit */ #define PX_8BIT 0x00000008L /* Pixel besteht aus 16 Bit */ #define PX_16BIT 0x00000010L /* Pixel besteht aus 24 Bit */ #define PX_24BIT 0x00000018L /* Pixel besteht aus 32 Bit */ #define PX_32BIT 0x00000020L /* Pixel besteht aus 48 Bit */ #define PX_48BIT 0x00000030L /* Maske für Anzahl der Pixelkomponenten */ #define PX_CMPNTS 0x0f000000L /* Maske für diverse Flags */ #define PX_FLAGS 0x00f00000L /* Maske für Pixelformat */ #define PX_PACKING 0x00030000L /* Maske für Anzahl der benutzten Bits */ #define PX_USED 0x00003f00L /* Maske für Anzahl der Bits pro Pixel */ #define PX_BITS 0x0000003fL /* Pixelformate für ATARI-Grafik */ #define PX_ATARI1 ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT ) #define PX_ATARI2 ( PX_IPLANES + PX_1COMP + PX_USES2 + PX_2BIT ) #define PX_ATARI4 ( PX_IPLANES + PX_1COMP + PX_USES4 + PX_4BIT ) #define PX_ATARI8 ( PX_IPLANES + PX_1COMP + PX_USES8 + PX_8BIT ) #define PX_FALCON15 ( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT ) /* Pixelformate für Mac */ #define PX_MAC1 ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT ) #define PX_MAC4 ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT ) #define PX_MAC8 ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT ) #define PX_MAC15 ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT ) #define PX_MAC32 ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT ) /* Pixelformate für Grafikkarten */ #define PX_VGA1 ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT ) #define PX_VGA4 ( PX_PLANES + PX_1COMP + PX_USES4 + PX_4BIT ) #define PX_VGA8 ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT ) #define PX_VGA15 ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT ) #define PX_VGA16 ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT ) #define PX_VGA24 ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES24 + PX_24BIT ) #define PX_VGA32 ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT ) #define PX_MATRIX16 ( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT ) #define PX_NOVA32 ( PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT ) /* Pixelformate für Drucker */ #define PX_PRN1 ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT ) #define PX_PRN8 ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT ) #define PX_PRN32 ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT ) /* bevorzugte (schnelle) Pixelformate für Bitmaps */ #define PX_PREF1 ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT ) #define PX_PREF2 ( PX_PACKED + PX_1COMP + PX_USES2 + PX_2BIT ) #define PX_PREF4 ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT ) #define PX_PREF8 ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT ) #define PX_PREF15 ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT ) #define PX_PREF32 ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT ) Für Programme, die selber Bitmaps erzeugen (oder laden) und anschließend auf dem Bildschirm ausgeben wollen, sind besonders die zuletzte angegeben Formate PX_PREFx zu empfehlen, da sie bei einem anderen Pixelformat des Bildschirms mit geringerem Aufwand als einige andere Formate gewandelt werden können. | ||||||||||||||||
Ergebnis: | Die Funktion liefert kein Ergebnis.
| ||||||||||||||||
Verfügbar: | ab NVDI 5.00
Wenn der Treiber die neuen Rasterfunktionen anbietet, ist bei den erweiterten Parametern von vq_extnd in work_out[30] Bit 1 gesetzt. | ||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||
Querverweis: | Binding
|
C: | void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm,
GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode );
| ||||||||||||||||||||||||||||||||||||||||||||||||
Umsetzung: |
void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm, GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode ) { intin[o] = mode; intin[1] = 0; intin[2] = 0; intin[3] = 0; ptsin[0..3] = src_rect; ptsin[4..7] = dst_rect; contrl[0] = 170; contrl[1] = 4; contrl[3] = 4; contrl[5] = 0; contrl[6] = handle; contrl[7..8] = src_bm; contrl[9..10] = dst_bm; contrl[11..12] = 0; vdi (); } | ||||||||||||||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Transform Form« - wandelt ein Rasterbild um.
| ||||||||||
VDI-Nummer: | 110
| ||||||||||
Deklaration: | void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB
*pdesMFDB );
| ||||||||||
Beschreibung: | Die Funktion transformiert ein Raster vom Standardformat in das
gerätespezifische Format oder umgekehrt. Es gilt:
Beim Standardformat handelt es sich um ein plattformunabhängiges Datenformat, welches daher zum Austausch von Dateien zwischen verschiedenen GEM-Systemen benutzt werden kann. Hinweis: Man kann dem VDI die Arbeit erleichtern, indem in Quell/Ziel-MFDB unterschiedliche Rasteradressen angegeben werden; anderenfalls kann eine Transformation durchaus mehrere Minuten in Anspruch nehmen. | ||||||||||
Ergebnis: | Die Funktion liefert kein Ergebnis.
| ||||||||||
Verfügbar: | Supported by all drivers.
| ||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||
Querverweis: | Binding vro_cpyfm vrt_cpyfm Rasterformate
|
C: | void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB
);
| |||||||||||||||||||||||||||
Umsetzung: |
void vr_trnfm (int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB) { iptr (psrcMFDB); iptr_2 (pdesMFDB); contrl[0] = 110; contrl[1] = 0; contrl[3] = 0; contrl[6] = handle; vdi (); } | |||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Copy Raster, Opaque« - kopiert einen Speicherbereich.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VDI-Nummer: | 109
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Deklaration: | void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t
*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB );
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beschreibung: | Die Funktion kopiert einen Quellspeicherbereich an ein Ziel und
verknüpft dabei die Quelle und das Ziel durch die in vr_mode
decodierte logische Verknüpfung. Es gilt:
Hinweis: Falls die Größen beider Raster nicht übereinstimmen, wird die Größe des Quellrasters benutzt. Die Adresse des Zielrasters dient in diesem Fall lediglich als Zeiger. Stimmen die Adressen von Quell- und Zielbereich überein (und sind diese ungleich 0), und überlappen sich die beiden Bereiche, so wird das Quellrechteck nicht verändert bis das Zielrechteck fertig kopiert ist. Normalerweise ignoriert die Funktion die Breite und Höhe des Zielrasters und geht von den Maßen des Quellrasters aus. Wenn ein Raster skaliert werden soll, muss daher das oberste Bit im Verknüpfungsmodus gesetzt werden (vr_mode|0x8000). Die Funktion beachtet dann unterschiedliche Ausmaße und skaliert das Raster. Ob der jeweilige Treiber Raster skalieren kann, sollte per vq_extnd (work_out[30]) ermittelt werden; das oberste Bit im Verknüpfungsmodus darf nur gesetzt werden, wenn der Treiber über diese Fähigkeit verfügt. Wichtig: Raster im Standardformat können und dürfen nicht kopiert werden, da man im allgemeinen keine Informationen über das gerätespezifische Format hat. Daher sollte ggfs. die Funktion vr_trnfm benutzt werden. Hinweis zu NVDI: In älteren Druckertreibern hat diese Funktion leider einen Fehler, der dazu führt, daß Bitmaps, die nur eine Zeile hoch sind, evtl. nicht ausgegeben werden. Aus diesem Grund sollte die übergebene Bitmap mindestens zwei Zeilen hoch sein. Hinweis zu TC-VDI: vr_mode from 16 to 27 are supported only by MATRIX graphic boards. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ergebnis: | Die Funktion liefert kein Ergebnis.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Verfügbar: | Supported by all screen drivers.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Querverweis: | Binding vrt_cpyfm vr_trnfm Rasterformate
|
C: | void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t
*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
void vro_cpyfm (int16_t handle, int16_t vr_mode, int16_t *pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB) { intin[0] = vr_mode; ptsin[0..7] = pxyarray[0..7]; iptr (psrcMFDB); iptr2 (pdesMFDB); contrl[0] = 109; contrl[1] = 4; contrl[3] = 1; contrl[6] = handle; vdi (); } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Copy Raster, Transparent« - kopiert ein Monochromraster auf
ein Farbraster.
| ||||||||||||||||||||||||||||||||||||||||
VDI-Nummer: | 121
| ||||||||||||||||||||||||||||||||||||||||
Deklaration: | void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t
*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index );
| ||||||||||||||||||||||||||||||||||||||||
Beschreibung: | Die Funktion kopiert ein monochromes, rechteckiges Raster unter
Beachtung der Schreibmodi auf ein anderes (auch farbiges) rechteckiges
Raster. Es gilt:
Hinweis: Sollten die Größen beider Raster nicht übereinstimmen, so werden die Größe des Quellrasters und die obere linke Ecke des Zielrasters als Startpunkt benutzt. Der Bildschirm darf niemals als Quellraster angegeben werden. Normalerweise ignoriert die Funktion die Breite und Höhe des Zielrasters und geht von den Maßen des Quellrasters aus. Wenn ein Raster skaliert werden soll, muss daher das oberste Bit im Schreibmodus gesetzt werden (vr_mode|0x8000). Die Funktion beachtet dann unterschiedliche Ausmaße und skaliert das Raster. Ob der jeweilige Treiber Raster skalieren kann, sollte per vq_extnd (work_out[30]) ermittelt werden; das oberste Bit im Schreibmodus darf nur gesetzt werden, wenn der Treiber über diese Fähigkeit verfügt. Achtung: In älteren NVDI-Druckertreibern hat diese Funktion leider einen Fehler, der dazu führt, daß Bitmaps, die nur eine Zeile hoch sind, evtl. nicht ausgegeben werden. Aus diesem Grund sollte die übergebene Bitmap mindestens zwei Zeilen hoch sein. Note for TC-VDI: TC-VDI has two new modes: 1 - Copy multi color raster to screen Copy psrcMFDB (8bpp, packed pixels) to pdesMFDB (8 or 32bpp, device-specific format). Convert VDI color numbers to pixel values, in 32bpp expand pixel through the software palette. Valid modes are: REPLACE, color_index is not used, and TRANSPARENT, color_index[0] is the transparent color (source pixels with this color are not copied, destination is unchanged). Others modes have no action. 2 - Expand packed 24bpp raster to screen Copy psrcMFDB (24bpp, packed pixels) to pdesMFDB (32bpp, device-specific format). Expand 24bpp source to 32bpp destination. Valid mode is REPLACE, color_index is not used. Others modes have no action. | ||||||||||||||||||||||||||||||||||||||||
Ergebnis: | Die Funktion liefert kein Ergebnis.
| ||||||||||||||||||||||||||||||||||||||||
Verfügbar: | Supported by all screen drivers.
| ||||||||||||||||||||||||||||||||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||||||||||||||||||||||||||||||||
Querverweis: | Binding vro_cpyfm vswr_mode Rasterformate
|
C: | void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t
*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index );
| ||||||||||||||||||||||||||||||||||||
Umsetzung: |
void vrt_cpyfm (int16_t handle, int16_t vr_mode, int16_t *pxyarray,MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index) { intin[0] = vr_mode; intin[1] = *color_index++; intin[2] = *color_index; ptsin[0..7] = pxyarray[0..7]; iptr (psrcMFDB); iptr_2 (pdesMFDB); contrl[0] = 121; contrl[1] = 4; contrl[3] = 3; contrl[6] = handle; vdi (); } | ||||||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Set Hilite Color« - setzt die Hervorhebungsfarbe.
| ||||||||||
VDI-Nummer: | 207 (Unterfunktion 0)
| ||||||||||
Deklaration: | int16_t vs_hilite_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *hilite_color );
| ||||||||||
Beschreibung: | Diese Funktion setzt die Hervorhebungsfarbe.
| ||||||||||
Ergebnis: | -1 = falsche Unterfunktionsnummer
0 = Funktion nicht vorhanden 1 = alles in Ordnung | ||||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||
Querverweis: | Binding
|
C: | int16_t vs_hilite_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *hilite_color );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vs_hilite_color( int16_t handle, int32_t color_space, COLOR_ENTRY *hilite_color ) { intin[0..1] = color_space; intin[2..5] = hilite_color; contrl[0] = 207; contrl[1] = 0; contrl[3] = 6; contrl[5] = 0; contrl[6] = handle; vdi (); return ( intout[0] ); } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Set Maximum Color« - maximalen Farbwert für eine additive
Rasteroperation.
| ||||||||||
VDI-Nummer: | 207 (Unterfunktion 2)
| ||||||||||
Deklaration: | int16_t vs_max_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *max_color );
| ||||||||||
Beschreibung: | Diese Funktion setzt den maximalen Farbwert für eine additive
Rasteroperation.
| ||||||||||
Ergebnis: | -1 = falsche Unterfunktionsnummer
0 = Funktion nicht vorhanden 1 = alles in Ordnung | ||||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||
Querverweis: | Binding
|
C: | int16_t vs_max_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *max_color );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vs_max_color( int16_t handle, int32_t color_space, COLOR_ENTRY *max_color ) { intin[0..1] = color_space; intin[2..5] = max_color; contrl[0] = 207; contrl[1] = 0; contrl[3] = 6; contrl[5] = 2; contrl[6] = handle; vdi (); return ( intout[0] ); } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Set Minimum Color« - minimalen Farbwert für eine
subtraktive Rasteroperation.
| ||||||||||
VDI-Nummer: | 207 (Unterfunktion 1)
| ||||||||||
Deklaration: | int16_t vs_min_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *min_color );
| ||||||||||
Beschreibung: | Diese Funktion setzt den minimalen Farbwert für eine
subtraktive Rasteroperation.
| ||||||||||
Ergebnis: | -1 = falsche Unterfunktionsnummer
0 = Funktion nicht vorhanden 1 = alles in Ordnung | ||||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||
Querverweis: | Binding
|
C: | int16_t vs_min_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *min_color );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vs_min_color( int16_t handle, int32_t color_space, COLOR_ENTRY *min_color ) { intin[0..1] = color_space; intin[2..5] = min_color; contrl[0] = 207; contrl[1] = 0; contrl[3] = 6; contrl[5] = 1; contrl[6] = handle; vdi (); return ( intout[0] ); } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|
Name: | »Set Weight Color« - Gewichtung für die Blend-Funktion.
| ||||||||||
VDI-Nummer: | 207 (Unterfunktion 3)
| ||||||||||
Deklaration: | int16_t vs_weight_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *weight_color );
| ||||||||||
Beschreibung: | Diese Funktion setzt die Gewichtung für die Blend-Funktion.
| ||||||||||
Ergebnis: | -1 = falsche Unterfunktionsnummer
0 = Funktion nicht vorhanden 1 = alles in Ordnung | ||||||||||
Verfügbar: | ab NVDI 5.00
| ||||||||||
Gruppe: | Rasterfunktionen
| ||||||||||
Querverweis: | Binding
|
C: | int16_t vs_weight_color( int16_t handle, int32_t color_space,
COLOR_ENTRY *weight_color );
| |||||||||||||||||||||||||||||||||
Umsetzung: |
int16_t vs_weight_color( int16_t handle, int32_t color_space, COLOR_ENTRY *weight_color ) { intin[0..1] = color_space; intin[2..5] = weight_color; contrl[0] = 207; contrl[1] = 0; contrl[3] = 6; contrl[5] = 3; contrl[6] = handle; vdi (); return ( intout[0] ); } | |||||||||||||||||||||||||||||||||
GEM-Arrays: |
|