HomeVDIKontrollfunktionenVDI-Funktionsliste

7.11 Rasterfunktionen

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

7.11.1 v_get_pixel

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:
Parameter Bedeutung
   
handle Kennung der Workstation
x x-Koordinate
y y-Koordinate des Pixels
pel Wert des Pixels
index Farbindex des Pixels


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

7.11.2 Bindings für v_get_pixel

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:

Adresse Feldelement Belegung
contrl contrl[0] 105 # Opcode der Funktion
contrl+2 contrl[1] 1 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 2 # Einträge in intout
contrl+12 contrl[6] handle
ptsin ptsin[0] x
ptsin+2 ptsin[1] y
intout intout[0] pel
intout+2 intout[1] index

7.11.3 vq_hilite_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
hilite_color COLOR_ENTRY der Hervorhebungsfarbe.
Ergebnis: eingestellter Farbraum
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.4 Bindings für vq_hilite_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 209 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 6 # Einträge in intout
contrl+10 contrl[5] 0 # Sub-Opcode
contrl+12 contrl[6] handle
intout intout[0..1] Rückgabewert
intout+4 intout[2..5] hilite_color

7.11.5 vq_max_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
max_color COLOR_ENTRY des maximalen Farbwerts für T_ADD.
Ergebnis: eingestellter Farbraum
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.6 Bindings für vq_max_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 209 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 6 # Einträge in intout
contrl+10 contrl[5] 2 # Sub-Opcode
contrl+12 contrl[6] handle
intout intout[0..1] Rückgabewert
intout+4 intout[2..5] max_color

7.11.7 vq_min_color

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).
Parameter Bedeutung
   
handle Kennung der Workstation
min_color COLOR_ENTRY des minimalen Farbwerts für T_SUB.
Ergebnis: eingestellter Farbraum
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.8 Bindings für vq_min_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 209 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 6 # Einträge in intout
contrl+10 contrl[5] 1 # Sub-Opcode
contrl+12 contrl[6] handle
intout intout[0..1] Rückgabewert
intout+4 intout[2..5] min_color

7.11.9 vq_weight_color

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).
Parameter Bedeutung
   
handle Kennung der Workstation
weight_color COLOR_ENTRY der Gewichtung für T_BLEND
Ergebnis: eingestellter Farbraum
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.10 Bindings für vq_weight_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 209 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 6 # Einträge in intout
contrl+10 contrl[5] 3 # Sub-Opcode
contrl+12 contrl[6] handle
intout intout[0..1] Rückgabewert
intout+4 intout[2..5] weight_color

7.11.11 vr_clip_rects32_by_dst

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.
Parameter Bedeutung
   
handle Kennung der Workstation
dst_clip_rect Clipping-Rechteck für das Ziel (kontinuierliche Koordinaten)
src_rect Quellrechteck (kontinuierliche Koordinaten)
dst_rect Zielrechteck (kontinuierliche Koordinaten)
clipped_src_rect geschnittenes Quellrechteck (kontinuierliche Koordinaten)
clipped_dst_rect geschnittenes Zielrechteck (kontinuierliche Koordinaten)
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

7.11.12 Bindings für vr_clip_rects32_by_dst

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:

Adresse Feldelement Belegung
contrl contrl[0] 171 # Opcode der Funktion
contrl+2 contrl[1] 12 # Einträge in ptsin
contrl+4 contrl[2] 8 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 2 # Sub-Opcode
contrl+12 contrl[6] handle
ptsin ptsin[0..7] dst_clip_rect
ptsin+16 ptsin[8..15] src_rect
ptsin+32 ptsin[16..23] dst_rect
ptsout ptsout[0..7] clipped_src_rect
ptsout+16 ptsout[8..15] clipped_dst_rect
intout intout[0] Rückgabewert

7.11.13 vr_clip_rects32_by_src

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).
Parameter Bedeutung
   
handle Kennung der Workstation
src_clip_rect Clipping-Rechteck für das Quelle (kontinuierliche Koordinaten)
src_rect Quellrechteck (kontinuierliche Koordinaten)
dst_rect Zielrechteck (kontinuierliche Koordinaten)
clipped_src_rect geschnittenes Quellrechteck (kontinuierliche Koordinaten)
clipped_dst_rect geschnittenes Zielrechteck (kontinuierliche Koordinaten)
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

7.11.14 Bindings für vr_clip_rects32_by_src

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:

Adresse Feldelement Belegung
contrl contrl[0] 171 # Opcode der Funktion
contrl+2 contrl[1] 12 # Einträge in ptsin
contrl+4 contrl[2] 8 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 3 # Sub-Opcode
contrl+12 contrl[6] handle
ptsin ptsin[0..7] src_clip_rect
ptsin+16 ptsin[8..15] src_rect
ptsin+32 ptsin[16..23] dst_rect
ptsout ptsout[0..7] clipped_src_rect
ptsout+16 ptsout[8..15] clipped_dst_rect
intout intout[0] Rückgabewert

7.11.15 vr_clip_rects_by_dst

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.
Parameter Bedeutung
   
handle Kennung der Workstation
dst_clip_rect Clipping-Rechteck für das Ziel (diskrete Koordinaten)
src_rect Quellrechteck (diskrete Koordinaten)
dst_rect Zielrechteck (diskrete Koordinaten)
clipped_src_rect geschnittenes Quellrechteck (diskrete Koordinaten)
clipped_dst_rect geschnittenes Zielrechteck (diskrete Koordinaten)
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

7.11.16 Bindings für vr_clip_rects_by_dst

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:

Adresse Feldelement Belegung
contrl contrl[0] 171 # Opcode der Funktion
contrl+2 contrl[1] 6 # Einträge in ptsin
contrl+4 contrl[2] 4 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 0 # Sub-Opcode
contrl+12 contrl[6] handle
ptsin ptsin[0..3] dst_clip_rect
ptsin+8 ptsin[4..7] src_rect
ptsin+16 ptsin[8..11] dst_rect
ptsout ptsout[0..3] clipped_src_rect
ptsout+8 ptsout[4..7] clipped_dst_rect
intout intout[0] Rückgabewert

7.11.17 vr_clip_rects_by_src

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).
Parameter Bedeutung
   
handle Kennung der Workstation
src_clip_rect Clipping-Rechteck für das Quelle (diskrete Koordinaten)
src_rect Quellrechteck (diskrete Koordinaten)
dst_rect Zielrechteck (diskrete Koordinaten)
clipped_src_rect geschnittenes Quellrechteck (diskrete Koordinaten)
clipped_dst_rect geschnittenes Zielrechteck (diskrete Koordinaten)
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

7.11.18 Bindings für vr_clip_rects_by_src

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:

Adresse Feldelement Belegung
contrl contrl[0] 171 # Opcode der Funktion
contrl+2 contrl[1] 6 # Einträge in ptsin
contrl+4 contrl[2] 4 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 1 # Sub-Opcode
contrl+12 contrl[6] handle
ptsin ptsin[0..3] src_clip_rect
ptsin+8 ptsin[4..7] src_rect
ptsin+16 ptsin[8..11] dst_rect
ptsout ptsout[0..3] clipped_src_rect
ptsout+8 ptsout[4..7] clipped_dst_rect
intout intout[0] Rückgabewert

7.11.19 vr_transfer_bits

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.
Parameter Bedeutung
   
handle Kennung der Workstation
src_bm Quellbitmap
dst_bm Zielbitmap
src_rect Quellrechteck
dst_rect Zielrechteck
mode Modus der Transferfunktion


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 */
#define T_LOGIC_COPY         0  /* dst = src;                      */
#define T_LOGIC_OR           1  /* dst = src OR dst;               */
#define T_LOGIC_XOR          2  /* dst = src XOR dst;              */
#define T_LOGIC_AND          3  /* dst = src AND dst;              */
#define T_LOGIC_NOT_COPY     4  /* dst = ( NOT src );              */
#define T_LOGIC_NOT_OR       5  /* dst = ( NOT src ) OR dst;       */
#define T_LOGIC_NOT_XOR      6  /* dst = ( NOT src ) XOR dst;      */
#define T_LOGIC_NOT_AND      7  /* dst = ( NOT src ) AND dst;      */

/* Zeichenmodi */
#define T_REPLACE            32 /* dst = src;                      */
#define T_TRANSPARENT        33 /* if ( src != bg_col ) dst = src; */
#define T_HILITE             34 /* if ( src != bg_col )            */
                                /* {                               */
                                /*    if ( dst == bg_col )         */
                                /*       dst = hilite_col;         */
                                /*    else if ( dst == hilite_col )*/
                                /*       dst = bg_col;             */
                                /* }                               */
#define T_REVERS_TRANSPARENT 35 /* if ( src == bg_col ) dst = src; */


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. ist ein maximaler RGB-Farbwert, ist ein minimaler RGB-Farbwert. ist ein Wert zwischen 0 und 1.0, der die Mischung von Quell- und Zielfarbe angibt.
/* arithmetische Transfermodi */
#define T_BLEND     64 /* Quell- und Zielfarbe mischen     */
                       /* rgb = RGB( src ) * Gewichtung ); */
                       /* rgb += RGB( dst ) * (1-Gewichtung));*/
                       /* dst = PIXELWERT( rgb );          */
#define T_ADD       65 /* Quell- und Zielfarbe addieren    */
                       /* rgb = RGB( src ) + RGB( dst )    */
                       /* if ( rgb > max_rgb )             */
                       /*    rgb = max_rgb;                */
                       /* dst = PIXELWERT( rgb );          */
#define T_ADD_OVER  66 /* Quell- und Zielfarbe addieren,   */
                       /* überlauf nicht abfangen          */
                       /* rgb = RGB( src ) + RGB( dst )    */
                       /* dst = PIXELWERT( rgb );          */
#define T_SUB       67 /* Quell- von Zielfarbe subtrahieren   */
                       /* rgb = RGB( dst ) - RGB( src )    */
                       /* if ( rgb < min_rgb )             */
                       /*    rgb = min_rgb;                */
                       /* dst = PIXELWERT( rgb );          */
#define T_MAX       69 /* maximale RGB-Komponenten         */
                       /* rgb = MAX(RGB( dst ), RGB( src ))*/
                       /* dst = PIXELWERT( rgb );          */
#define T_SUB_OVER  70 /* Quell- von Zielfarbe subtrahieren,  */
                       /* überlauf nicht abfangen          */
                       /* rgb = RGB( dst ) - RGB( src )    */
                       /* dst = PIXELWERT( rgb );          */
#define T_MIN       71 /* minimale RGB-Komponenten         */
                       /* rgb = MIN(RGB( dst ), RGB( src ))*/
                       /* dst = PIXELWERT( rgb );          */


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

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
  • Wenn ein logischer Modus mit aufgerufen wird, erfolgt die Art der Einfärbung abhängig vom Modus:

    T_LOGIC_COPY
    
    Blende bei allen gesetzen Bits im Farbwert die
    Hintergrundfarbe ein und bei allen gelöschten Bits
    die Vordergrundfarbe:
    rgb = (( NOT RGB( src )) & RGB( fg_col )) OR
          ( RGB( src ) AND RGB( bg_col ));
    dst = PIXELWERT( rgb );
    
    T_LOGIC_NOT_COPY
    
    Blende bei allen gesetzen Bits im Farbwert die
    Vordergrundfarbe ein und bei allen gelöschten Bits die
    Hintergrundfarbe:
    rgb = ( RGB( src ) & RGB( fg_col )) OR
          ((( NOT RGB( src )) AND RGB( bg_col ));
    dst = PIXELWERT( rgb );
    
    T_LOGIC_OR
    
    überall dort, wo Quellbits gesetzt sind, wird beim Ziel
    ( src AND fg_col) eingeblendet:
    dst = ( src AND fg_col ) OR (( NOT src ) AND dst );
    
    T_LOGIC_NOT_OR
    
    überall dort, wo Quellbits gelöscht sind, wird beim Ziel
    ((NOT src ) AND fg_col) eingeblendet:
    dst = (( NOT src ) AND fg_col ) OR ( src AND dst );
    
    T_LOGIC_XOR
    T_LOGIC_NOT_XOR
    
    Die XOR-Verknüpfung ignoriert die Einfärbung.
    
    T_LOGIC_AND
    
    überall dort, wo Quellbits gelöscht sind, wird beim Ziel
    ((NOT src ) AND bg_col) eingeblendet:
    dst = ((NOT src ) AND bg_col ) OR ( src AND dst );
    
    T_LOGIC_NOT_AND
    
    überall dort, wo Quellbits gesetzt sind, wird beim Ziel
    ( src AND bg_col) eingeblendet:
    dst = ( src AND bg_col ) OR ((NOT src ) AND dst );
    

  • Bei den Modi T_REPLACE, T_TRANSPARENT, T_HILITE und T_REVERS_TRANSPARENT wirkt die Einfärbung nicht binär auf die Farb- oder Pixelwerte, sondern die Farbwerte werden skaliert. Das folgende Beispiel zeigt, wie ein Farbwert eingefärbt wird; , , und sind RGB-Farbwerte (zwischen 0 und 65535):

    red_range = bg_col.red - fg_col.red;
    green_range = bg_col.green - fg_col.green;
    blue_range = bg_col.blue - fg_col.blue;
    
    dst.red = fg_col.red + ( src_color.red * red_range / 65535 );
    dst.green = fg_col.green + ( src_color.green * green_range / 65535 );
    dst.blue = fg_col.blue + ( src_color.blue * blue_range / 65535 );
    


    Hinweis: Momentan wird die Einfärbung in den Modi T_REPLACE, T_TRANSPARENT, T_HILITE und T_REVERS_TRANSPARENT nur für Quellbitmaps mit bis zu 256 Farben unterstützt. Für Quellbitmaps mit 16 oder 32 Bit wird in diesen Modi zur Zeit keine Einfärbung unterstützt.

  • Die arithmetischen Transfermodi unterstützen keine Einfärbung.



Bitmaps

Statt eines antiquierten MFDBs erwartet diese Funktion eine GCBITMAP-Struktur, um die Bitmaps zu beschreiben.

Wenn 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 ebenfalls auf 0L gesetzt werden).

Quellbitmaps benötigen keine inverse Farbtabelle, hier kann 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:
  • Wenn die Quelle keine Farbtabelle hat (0L), wird die Farbtabelle des Geräts genommen, wenn dieses die gleiche Bittiefe hat. Ist das nicht der Fall, wird die Systemfarbtabelle für die Bittiefe der Quelle benutzt.

  • Wenn das Ziel keine (inverse) Farbtabelle hat (0L), wird die (inverse) Farbtabelle des Geräts genommen, wenn dieses die gleiche Bittiefe hat. Ist das nicht der Fall, wird die Systemfarbtabelle für die Bittiefe des Ziels benutzt und für den Aufruf wird extra intern eine inverse Farbtabelle aufgebaut. D.h. Zielbitmaps sollten, wenn sie keine inverse Farbtabelle haben, umbedingt die gleiche Bittiefe wie das zum VDI-Handle gehörende Gerät haben.



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 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 */
#define  PX_1COMP    0x01000000L /* Pixel besteht aus einer benutzten Komponente: Farbindex */
#define  PX_3COMP    0x03000000L /* Pixel besteht aus drei benutzten Komponenten, z.B. RGB */
#define  PX_4COMP    0x04000000L /* Pixel besteht aus vier benutzten Komponenten, z.B. CMYK */
#define  PX_REVERSED 0x00800000L /* Pixel wird in umgekehrter Bytereihenfolge ausgegeben */
#define  PX_xFIRST   0x00400000L /* unbenutzte Bits liegen vor den benutzen (im Motorola-Format betrachtet) */
#define  PX_kFIRST   0x00200000L /* K liegt vor CMY (im Motorola-Format betrachtet) */
#define  PX_aFIRST   0x00100000L /* Alphakanal liegen vor den Farbbits (im Motorola-Format betrachtet) */
#define  PX_PACKED   0x00020000L /* Bits sind aufeinanderfolgend abgelegt */
#define  PX_PLANES   0x00010000L /* Bits sind auf mehrere Ebenen verteilt (Reihenfolge: 0, 1, ..., n) */
#define  PX_IPLANES  0x00000000L /* Bits sind auf mehrere Worte verteilt (Reihenfolge: 0, 1, ..., n) */
#define  PX_USES1    0x00000100L /* 1 Bit des Pixels wird benutzt */
#define  PX_USES2    0x00000200L /* 2 Bit des Pixels werden benutzt */
#define  PX_USES3    0x00000300L /* 3 Bit des Pixels werden benutzt */
#define  PX_USES4    0x00000400L /* 4 Bit des Pixels werden benutzt */
#define  PX_USES8    0x00000800L /* 8 Bit des Pixels werden benutzt */
#define  PX_USES15   0x00000f00L /* 15 Bit des Pixels werden benutzt */
#define  PX_USES16   0x00001000L /* 16 Bit des Pixels werden benutzt */
#define  PX_USES24   0x00001800L /* 24 Bit des Pixels werden benutzt */
#define  PX_USES32   0x00002000L /* 32 Bit des Pixels werden benutzt */
#define  PX_USES48   0x00003000L /* 48 Bit des Pixels werden benutzt */
#define  PX_1BIT     0x00000001L /* Pixel besteht aus 1 Bit */
#define  PX_2BIT     0x00000002L /* Pixel besteht aus 2 Bit */
#define  PX_3BIT     0x00000003L /* Pixel besteht aus 3 Bit */
#define  PX_4BIT     0x00000004L /* Pixel besteht aus 4 Bit */
#define  PX_8BIT     0x00000008L /* Pixel besteht aus 8 Bit */
#define  PX_16BIT    0x00000010L /* Pixel besteht aus 16 Bit */
#define  PX_24BIT    0x00000018L /* Pixel besteht aus 24 Bit */
#define  PX_32BIT    0x00000020L /* Pixel besteht aus 32 Bit */
#define  PX_48BIT    0x00000030L /* Pixel besteht aus 48 Bit */
#define  PX_CMPNTS   0x0f000000L /* Maske für Anzahl der Pixelkomponenten */
#define  PX_FLAGS    0x00f00000L /* Maske für diverse Flags */
#define  PX_PACKING  0x00030000L /* Maske für Pixelformat */
#define  PX_USED     0x00003f00L /* Maske für Anzahl der benutzten Bits */
#define  PX_BITS     0x0000003fL /* Maske für Anzahl der Bits pro Pixel */
/* 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 Bidlschirms 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

7.11.20 Bindings für vr_transfer_bits

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:

Adresse Feldelement Belegung
contrl contrl[0] 170 # Opcode der Funktion
contrl+2 contrl[1] 4 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 4 # Einträge in intin
contrl+8 contrl[4] 0 # Einträge in intout
contrl+10 contrl[5] 0 # Sub-Opcode
contrl+12 contrl[6] handle
contrl+14 contrl[7..8] src_bm
contrl+18 contrl[9..10] dst_bm
contrl+22 contrl[11..12] 0
intin intin[0] mode
intin+2 intin[1] 0
intin+4 intin[2] 0
ptsin ptsin[0..3] src_rect
ptsin+8 ptsin[4..7] dst_rect

7.11.21 vr_trnfm

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:
Parameter Bedeutung
   
handle Kennung der Workstation
psrcMFDB Zeiger auf MFDB des Quellrasters
pdesMFDB Zeiger auf MFDB des Zielrasters


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

7.11.22 Bindings für vr_trnfm

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:

Adresse Feldelement Belegung
contrl contrl[0] 110 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 0 # Einträge in intin
contrl+8 contrl[4] 0 # Einträge in intout
contrl+12 contrl[6] handle
contrl+14 contrl[7,8] psrcMFDB
contrl+18 contrl[9,10] pdesMFDB

7.11.23 vro_cpyfm

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:
Parameter Bedeutung
   
handle Kennung der Workstation
vr_mode eine von 16 logischen Verknüpfungen zwischen den Pixeln des Quell- und Zielraster
ALL_WHITE 0 D := 0
S_AND_D 1 D := S AND D
S_AND_NOTD 2 D := S AND (NOT D)
S_ONLY 3 D := S
NOTS_AND_D 4 D := (NOT S) AND D
D_ONLY 5 D := D
S_XOR_D 6 D := S XOR D
S_OR_D 7 D := S OR D
NOT_SORD 8 D := NOT (S OR D)
NOT_SXORD 9 D := NOT (S XOR D)
D_INVERT 10 D := NOT D
NOT_D 11 D := S OR (NOT D)
S_OR_NOTD 12 D := NOT S
NOTS_OR_D 13 D := (NOT S) OR D
NOT_SANDD 14 D := NOT (S AND D)
ALL_BLACK 15 D := 1
pxyarray[0] x-Koordinate
pxyarray[1] y-Koordinate eines Eckpunktes des Quellrasters
pxyarray[2] x-Koordinate
pxyarray[3] y-Koordinate des diagonal gegenüberliegenden Eckpunktes des Quellrasters
pxyarray[4] x-Koordinate
pxyarray[5] y-Koordinate eines Eckpunktes des Zielrasters
pxyarray[6] x-Koordinate
pxyarray[7] y-Koordinate des diagonal gegenüberliegenden Eckpunktes des Zielrasters
psrcMFDB Zeiger auf den MFDB der Quelle
pdesMFDB Zeiger auf den MFDB des Ziels


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.
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Supported by all screen drivers.
Gruppe: Rasterfunktionen
Querverweis: Binding   vrt_cpyfm   vr_trnfm   Rasterformate

7.11.24 Bindings für vro_cpyfm

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:

Adresse Feldelement Belegung
contrl contrl[0] 109 # Opcode der Funktion
contrl+2 contrl[1] 4 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 1 # Einträge in intin
contrl+8 contrl[4] 0 # Einträge in intout
contrl+12 contrl[6] handle
contrl+14 contrl[7,8] psrcMFDB
contrl+18 contrl[9,10] pdesMFDB
intin intin[0] vr_mode
ptsin ptsin[0..7] pxyarray[0..7]

7.11.25 vrt_cpyfm

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:
Parameter Bedeutung
   
handle Kennung der Workstation
vr_mode Schreibmodus
1 = Replace
2 = Transparent
3 = XOR
4 = Reverse Transparent
pxyarray[0] x-Koordinate
pxyarray[1] y-Koordinate des Eckpunktes des Quellrasters
pxyarray[2] x-Koordinate
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke des Quellrasters
pxyarray[4] x-Koordinate
pxyarray[5] y-Koordinate des Eckpunktes des Zielrasters
pxyarray[6] x-Koordinate
pxyarray[7] y-Koordinate der diagonal gegenüber liegenden Ecke des Zielrasters
psrcMFDB Zeiger auf den MFDB der Quelle
pdesMFDB Zeiger auf den MFDB des Ziels
color_index[0] Farbnummer der Farbe, die als gesetzt interpretiert werden soll
color_index[1] Farbnummer der Farbe, die als nicht gesetzt interpretiert werden soll


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.
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Supported by all screen drivers.
Gruppe: Rasterfunktionen
Querverweis: Binding   vro_cpyfm   vswr_mode   Rasterformate

7.11.26 Bindings für vrt_cpyfm

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:

Adresse Feldelement Belegung
contrl contrl[0] 121 # Opcode der Funktion
contrl+2 contrl[1] 4 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 3 # Einträge in intin
contrl+8 contrl[4] 0 # Einträge in intout
contrl+12 contrl[6] handle
contrl+14 contrl[7,8] psrcMFDB
contrl+18 contrl[9,10] pdesMFDB
intin intin[0] vr_mode
intin+2 intin[1..2] color_index[0..1]
ptsin ptsin[0..7] pxyarray[0..7]

7.11.27 vs_hilite_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder CSPACE_RGB)
hilite_color COLOR_ENTRY der Hervorhebungsfarbe
Ergebnis: -1 = falsche Unterfunktionsnummer
 0 = Funktion nicht vorhanden
 1 = alles in Ordnung
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.28 Bindings für vs_hilite_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 207 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 6 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 0 # Sub-Opcode
contrl+12 contrl[6] handle
intin intin[0..1] color_space
intin+4 intin[2..5] hilite_color
intout intout[0] Rückgabewert

7.11.29 vs_max_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder CSPACE_RGB)
max_color COLOR_ENTRY des maximalen Farbwerts für T_SUB.
Ergebnis: -1 = falsche Unterfunktionsnummer
 0 = Funktion nicht vorhanden
 1 = alles in Ordnung
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.30 Bindings für vs_max_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 207 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 6 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 2 # Sub-Opcode
contrl+12 contrl[6] handle
intin intin[0..1] color_space
intin+4 intin[2..5] max_color
intout intout[0] Rückgabewert

7.11.31 vs_min_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder CSPACE_RGB)
min_color COLOR_ENTRY des minimalen Farbwerts für T_SUB.
Ergebnis: -1 = falsche Unterfunktionsnummer
 0 = Funktion nicht vorhanden
 1 = alles in Ordnung
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.32 Bindings für vs_min_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 207 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 6 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 1 # Sub-Opcode
contrl+12 contrl[6] handle
intin intin[0..1] color_space
intin+4 intin[2..5] min_color
intout intout[0] Rückgabewert

7.11.33 vs_weight_color

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.
Parameter Bedeutung
   
handle Kennung der Workstation
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder CSPACE_RGB)
weight_color COLOR_ENTRY der Gewichtung für T_SUB.
Ergebnis: -1 = falsche Unterfunktionsnummer
 0 = Funktion nicht vorhanden
 1 = alles in Ordnung
Verfügbar: ab NVDI 5.00
Gruppe: Rasterfunktionen
Querverweis: Binding

7.11.34 Bindings für vs_weight_color

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:

Adresse Feldelement Belegung
contrl contrl[0] 207 # Opcode der Funktion
contrl+2 contrl[1] 0 # Einträge in ptsin
contrl+4 contrl[2] 0 # Einträge in ptsout
contrl+6 contrl[3] 6 # Einträge in intin
contrl+8 contrl[4] 1 # Einträge in intout
contrl+10 contrl[5] 3 # Sub-Opcode
contrl+12 contrl[6] handle
intin intin[0..1] color_space
intin+4 intin[2..5] weight_color
intout intout[0] Rückgabewert

HomeVDIKontrollfunktionenVDI-Funktionsliste