360 lines
15 KiB
Plaintext
360 lines
15 KiB
Plaintext
Neue Funktionen in NVDI 2.50
|
||
============================
|
||
|
||
Nachfolgend werden in dieser Datei die neuen Funktionen aufgef<65>hrt, die
|
||
NVDI f<>r Bildschirmausgaben anbietet.
|
||
|
||
1. Off-Screen Bitmaps
|
||
=====================
|
||
|
||
F<>r viele Anwendungen ist es sehr n<>tzlich, wenn Zeichenfunktionen nicht
|
||
direkt auf den Bildschirm, sondern auf einen nicht sichtbaren Bildschirm
|
||
angewendet werden k”nnen. Einen derartigen "versteckten" Bildschirm
|
||
nennt man Off-Screen-Bitmap.
|
||
Zur Erzeugung von Off-Screen-Bitmaps dient die Funktion OPEN BITMAP.
|
||
Man kann ihr entweder die Gr”že eines Bitmap angeben, die Sie allozieren
|
||
soll, oder ihr eine Bitmap <20>bergeben. Die Bitmap wird im gleichen Format
|
||
wie die des Bildschirms verwaltet, wodurch schnelles Kopieren zwischen
|
||
beiden m”glich ist.
|
||
Die Funktion CLOSE BITMAP schliežt eine mit OPEN BITMAP erzeugte Bitmap
|
||
und gibt gegebenenfalls deren Speicher zur<75>ck.
|
||
|
||
|
||
OPEN BITMAP (VDI 100, 1)
|
||
|
||
void v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out )
|
||
{
|
||
pb[1] = work_in;
|
||
pb[3] = work_out;
|
||
pb[4] = work_out + 45;
|
||
|
||
contrl[0] = 100;
|
||
contrl[1] = 0;
|
||
contrl[3] = 20;
|
||
contrl[5] = 1;
|
||
*(MFDB *)&contrl[7] = bitmap;
|
||
|
||
vdi();
|
||
|
||
*handle = contrl[6];
|
||
pb[1] = intin;
|
||
pb[3] = intout;
|
||
pb[4] = ptsout;
|
||
}
|
||
|
||
Best<73>ckung der VDI-Arrays:
|
||
|
||
Feldelement | Belegung
|
||
------------------|-------------------------------------------
|
||
contrl[0] | 100 Funktionsnummer f<>r v_opnbm()
|
||
contrl[1] | 0 Anzahl der Eintr„ge in ptsin
|
||
contrl[2] | 6 Anzahl der Eintr„ge in ptsout
|
||
contrl[3] | 20 Anzahl der Eintr„ge in intin
|
||
contrl[4] | 45 Anzahl der Eintr„ge in intout
|
||
contrl[5] | 1 Unterfunktionsnummer f<>r v_opnbm()
|
||
contrl[6] | handle
|
||
contrl[7..8] | bitmap Zeiger auf einen MFDB der Bitmap
|
||
|
|
||
intin[0..19] | work_in[0..19]
|
||
|
|
||
intout[0..44] | work_out[0..44]
|
||
|
|
||
ptsout[0..11] | work_out[45..56]
|
||
|
||
|
||
handle: graf_handle()
|
||
|
||
work_in[0..10]: wie bei v_opnwk()/v_opnvwk() definiert
|
||
work_in[0]: Getrez() + 2
|
||
work_in[11]: Breite -1 (z.B. 1279)
|
||
work_in[12]: H”he -1 (z.B. 959)
|
||
work_in[13]: Breite eines Pixels in Mikrometern
|
||
work_in[14]: H”he eines Pixels in Mikrometern
|
||
work_in[15..19]: reserviert, sollte 0 enthalten
|
||
|
||
Achtung: Der Eintrag work_in[11] sollte bei Addition von 1 ohne Rest
|
||
durch 16 teilbar sein. Andernfalls rundet der VDI-Treiber
|
||
auf den n„chsth”heren ohne Rest teilbaren Wert.
|
||
|
||
Hinweis: Wird f<>r Pixelbreite und -H”he 0 angegeben, so werden die
|
||
Werte des Bildschirms benutzt.
|
||
|
||
work_out[0..1]: wie bei v_opnwk()/v_opnvwk() definiert
|
||
work_out[2]: 0
|
||
work_out[3..38]: wie bei v_opnwk()/v_opnvwk() definiert
|
||
work_out[39] 0 (keine Hardware-Palette vorhanden, da Bitmap)
|
||
work_out[39..56]: wie beiv_opnwk()/v_opnvwk() definiert
|
||
|
||
bitmap: Zeiger auf einen MFDB
|
||
|
||
Falls bitmap->fd_addr gleich NULL ist, so wird anhand der Gr”žen-
|
||
angaben in work_in Speicher f<>r die Bitmap angefordert (die Bitmap
|
||
wird im Gegensatz zu v_opnvwk() gel”scht).
|
||
|
||
Um eine Bitmap im ger„tespezifischen Format zu ”ffnen, muž
|
||
bitmap->fd_nplanes eine Null oder die Ebenenanzahl des Schirms
|
||
enthalten (work_out[4] bei vq_extnd()). Ist bitmap->fd_nplanes 1,
|
||
wird eine monochrome Bitmap angelegt.
|
||
|
||
Die Eintr„ge des MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, fd_stand,
|
||
fd_nplanes) werden vom VDI-Treiber gesetzt und an die aufrufende
|
||
Applikation zur<75>ckgegeben. Wenn nicht nicht gen<65>gend Speicher
|
||
vorhanden ist, wird der Inhalt des MFDBs nicht ver„ndert; ein
|
||
Null-Handle wird zur<75>ckgegeben.
|
||
|
||
Wenn bitmap->fd_addr ungleich NULL ist, wird dieser Eintrag als
|
||
Zeiger auf eine Bitmap interpretiert. Wenn die Bitmap im
|
||
Standardformat vorliegt, wird sie ins ger„tespezifische Format
|
||
umgewandelt. Liegt sie schon im ger„tespezifischen Format vor, so
|
||
wird sie nicht umgewandelt. Falls die Aufl”sung der Bitmap (d.h.
|
||
die Anzahl der Farben und Planes) nicht unterst<73>tzt wird, gibt
|
||
v_opnbm() ein Null-Handle zur<75>ck.
|
||
|
||
|
||
CLOSE BITMAP (VDI 101, 1)
|
||
|
||
void v_clsbm( WORD handle )
|
||
{
|
||
contrl[0] = 101;
|
||
contrl[1] = 0;
|
||
contrl[3] = 0;
|
||
contrl[5] = 1;
|
||
contrl[6] = handle;
|
||
vdi();
|
||
}
|
||
|
||
Best<73>ckung der VDI-Arrays:
|
||
|
||
Feldelement | Belegung
|
||
------------------|-------------------------------------------
|
||
contrl[0] | 101 Funktionsnummer f<>r v_clsbm()
|
||
contrl[1] | 0 Anzahl der Eintr„ge in ptsin
|
||
contrl[2] | 0 Anzahl der Eintr„ge in ptsout
|
||
contrl[3] | 0 Anzahl der Eintr„ge in intin
|
||
contrl[4] | 0 Anzahl der Eintr„ge in intout
|
||
contrl[5] | 1 Unterfunktionsnummer f<>r v_clsbm()
|
||
contrl[6] | handle
|
||
|
||
Die Funktion v_clsbm() schliežt die mit handle bezeichnete Bitmap.
|
||
Wenn der Speicher beim v_opnbm() vom VDI alloziert wurde, gibt sie
|
||
diesen Speicher wieder frei.
|
||
|
||
|
||
Rasteroperationen bei Off-Screen-Bitmaps:
|
||
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
|
||
Rasteroperationen zwischen Bildschirm und Off-Screen-Bitmap sollten
|
||
grunds„tzlich im ger„tespezifischen Format erfolgen.
|
||
Wenn als Ziel einer Rasteroperation eine Off-Screen-Bitmap mit ihrem
|
||
MFDB angegeben wird und wenn das zu dieser Bitmap geh”rende Handle
|
||
benutzt wird, so wird beim Blitten anhand der <20>ber vs_clip() auf dieser
|
||
Workstation eingestellten Koordinaten geclippt. F<>r das Kopieren eines
|
||
Rasters vom Bildschirm in eine Off-Screen-Bitmap sollte man also das
|
||
VDI-Handle dieser Bitmap benutzen.
|
||
Ist die Bitmap dagegen Quelle und der Bildschirm Ziel, so sollte man das
|
||
Handle der Bildschirm-Workstaion benutzen, da dann das Raster anhand der
|
||
Bildschirm-Koordinaten abgeclippt wird.
|
||
Wenn man das von v_opnbm() zur<75>ckgelieferte Handle einer Bitmap benutzt
|
||
und in fd_addr in einem MFDB 0 enth„lt, so werden die Daten der Bitmap
|
||
statt dessen benutzt.
|
||
|
||
ESCAPES
|
||
-------
|
||
Die VDI-Escape-Funktionen (VT52) k”nnen nicht auf einer Bitmap benutzt
|
||
werden. Ihr Aufruf wid ignoriert.
|
||
|
||
vs_color()/vq_color()
|
||
---------------------
|
||
Wenn die Funktion vs_color() mit dem Handle einer Off-Screen-Bitmap
|
||
aufgerufen wird, werden die Farben nur dann gesetzt, wenn es sich um
|
||
High- oder True-Color handelt. Vq_color() ist ebenfalls nur in High-
|
||
oder True-Color sinnvoll - andernfalls ist der Parameter valid -1.
|
||
|
||
vst_point()
|
||
-----------
|
||
Die Funktion vst_point() und alle anderen Funktionen, die Texth”hen in
|
||
Punkten einstellen, reagieren bisher nur dann sinnvoll, wenn die Bitmap
|
||
die Ausmaáe des Bildschirms hat.
|
||
|
||
v_show_c()/v_hide_c()
|
||
---------------------
|
||
Beide Funktionen werden ignoriert, falls sie mit dem Handle einer
|
||
Off-Screen-Bitmap aufgerufen werden. Sie beziehen sich nur auf den
|
||
Bildschirm und sollten nur vom AES aufgerufen werden.
|
||
|
||
2. vq_scrninfo()
|
||
=================
|
||
|
||
Genauere Angaben <20>ber das Bildschirmformat liefert die Funktion INQUIRE
|
||
SCREEN INFORMATION implementiert. Im workout-Array wird angeben, wie das
|
||
ger„tespezifische Format aufgebaut ist.
|
||
Diese Informationen sind in erster Linie interessant f<>r Programme, die
|
||
- schnell Raster aufbauen (auch in TrueColor) und diese mit vro_cpyfm()
|
||
auf den Schirm kopieren m”chten.
|
||
- Raster speichern (z.B. XIMGs).
|
||
- Raster anzeigen.
|
||
|
||
VQ_SCRNINFO( 102, 1 )
|
||
|
||
void vq_scrninfo( WORD handle, WORD *work_out )
|
||
{
|
||
pb[3] = work_out;
|
||
|
||
intin[0] = 2;
|
||
contrl[0] = 102;
|
||
contrl[1] = 0;
|
||
contrl[3] = 1;
|
||
contrl[5] = 1;
|
||
contrl[6] = handle;
|
||
|
||
vdi();
|
||
|
||
pb[3] = intout;
|
||
}
|
||
|
||
Best<73>ckung der VDI-Arrays:
|
||
|
||
Feldelement | Belegung
|
||
------------------|-------------------------------------------
|
||
contrl[0] | 102 Funktionsnummer von vq_scrninfo()
|
||
contrl[1] | 0 Anzahl der Eintr„ge in ptsin
|
||
contrl[2] | 0 Anzahl der Eintr„ge in ptsout
|
||
contrl[3] | 1 Anzahl der Eintr„ge in intin
|
||
contrl[4] | 272 Anzahl der Eintr„ge in intout
|
||
contrl[5] | 1 Unterfunktionsnummer von vq_scrninfo()
|
||
contrl[6] | handle
|
||
|
|
||
intin[0] | 2 erweiterte Informationen ausgeben
|
||
|
|
||
intout[0..272] | work_out[0..272]
|
||
|
||
|
||
intout[0]: Formatangabe:
|
||
0: Interleaved Planes, wortweise (ATARI Grafik)
|
||
1: Standardformat (komplette Planes)
|
||
2: Packed Pixels
|
||
-1: unbekanntes Format; nicht direkt beschreibbar
|
||
intout[1]: Verf<72>gbarkeit einer CLUT:
|
||
0: keine CLUT (z.B. TTM 194)
|
||
1: Hardware-CLUT
|
||
2: Software-CLUT (HiColor oder TrueColor)
|
||
intout[2]: Anzahl der Ebenen (Bits) pro Pixel
|
||
intout[3/4]:Farbanzahl oder 0L (mehr als 2*10^31 Farben)
|
||
intout[8]: Anzahl der Bits f<>r die Rot-Intensit„t
|
||
intout[9]: Anzahl der Bits f<>r die Gr<47>n-Intensit„t
|
||
intout[10]: Anzahl der Bits f<>r die Blau-Intensit„t
|
||
intout[11]: Anzahl der Bits f<>r den Alpha-Channel oder „hnliches
|
||
intout[12]: Anzahl der Bits f<>r Genlock
|
||
intout[13]: Anzahl der nicht benutzen Bits
|
||
|
||
Falls eine Hardware-CLUT (intout[1] == 1) vorhanden ist:
|
||
intout[16-271]: Pixelwert des zugeh”rigen VDI-Farbindexes
|
||
|
||
Falls HiColor, TrueColor oder „hnliches vorhanden ist:
|
||
intout[16..31]: Zuordnung von Bitnummer im Pixel zum Bit der Rotintensit„t
|
||
intout[32..47]: Zuordnung von Bitnummer im Pixel zum Bit der Gr<47>nintens.
|
||
intout[48..63]: Zuordnung von Bitnummer im Pixel zum Bit der Blauintensit„t
|
||
intout[64..79]: Zuordnung der Bitnummer f<>r Alpha-Channel
|
||
intout[80..95]: Zuordnung der Bitnummer f<>r Genlock
|
||
intout[96..127]: unbenutzte Bits
|
||
intout[128..271]: reserviert (0)
|
||
|
||
Beispiele:
|
||
----------
|
||
|
||
In 256 Farben auf dem Falcon w<>rden folgende Ausgaben erfolgen:
|
||
|
||
intout | Wert | Bedeutung
|
||
---------|--------|-----------------------------------------------------
|
||
0 | 0 | Interleaved Planes, wortweise
|
||
1 | 1 | Hardware-CLUT vorhanden
|
||
2 | 8 | 8 Bit pro Pixel
|
||
3/4 | 256 | 256 verschiedene Farben gleichzeitig m”glich
|
||
8 | 6 | 6 Bits f<>r die Rot-Intensit„t
|
||
9 | 6 | 6 Bits f<>r die Gr<47>n-Intensit„t
|
||
10 | 6 | 6 Bits f<>r die Blau-Intensit„t
|
||
11 | 0 | kein Bit f<>r Alpha-Channel
|
||
12 | 0 | kein Bit f<>r Genlock
|
||
13 | 0 | kein unbenutzes Bit
|
||
| |
|
||
| |
|
||
16 | 0 | Pixelwert f<>r VDI-Farbindex 0
|
||
17 | 255 | Pixelwert f<>r VDI-Farbindex 1
|
||
18 | 2 | Pixelwert f<>r VDI-Farbindex 2
|
||
... | ... |
|
||
271 | 15 | Pixelwert f<>r VDI-Farbindex 255
|
||
|
||
In HiColor auf dem Falcon w<>rden folgende Ausgaben erfolgen:
|
||
|
||
intout | Wert | Bedeutung
|
||
---------|--------|-----------------------------------------------------
|
||
0 | 2 | Packed Pixels
|
||
1 | 2 | HiColor bzw. TrueColor
|
||
2 | 16 | 16 Bit pro Pixel
|
||
3/4 | 32768 | 32768 verschiedene Farben gleichzeitig m”glich
|
||
8 | 5 | 5 Bits f<>r die Rot-Intensit„t
|
||
9 | 5 | 5 Bits f<>r die Gr<47>n-Intensit„t
|
||
10 | 5 | 5 Bits f<>r die Blau-Intensit„t
|
||
11 | 0 | kein Bit f<>r Alpha-Channel
|
||
12 | 1 | ein Bit f<>r Genlock
|
||
13 | 0 | kein unbenutzes Bit
|
||
| |
|
||
| |
|
||
16 | 11 | Bit 0 der Rot-Intensit„t (niederwertigstes Bit)
|
||
| | befindet sich in Bit 11 des Pixels
|
||
17 | 12 | Bit 1 befindet sich in Bit 12 des Pixels
|
||
18 | 13 | ...
|
||
19 | 14 | ...
|
||
20 | 15 | Bit 4 der Rot-Intensit„t (h”chstwertigstes Bit)
|
||
| | befindet sich in Bit 15 des Pixels
|
||
21..31 | -1 | Bits werden nicht f<>r Rot-Intensit„t benutzt
|
||
| |
|
||
| |
|
||
32 | 6 | Bit 0 der Gr<47>n-Intensit„t (niederwertigstes Bit)
|
||
| | befindet sich in Bit 6 des Pixels
|
||
33 | 7 | Bit 1 befindet sich in Bit 7 des Pixels
|
||
34 | 8 | ...
|
||
35 | 9 | ...
|
||
36 | 10 | Bit 4 der Gr<47>n-Intensit„t (h”chstwertigstes Bit)
|
||
| | befindet sich in Bit 10 des Pixels
|
||
37..37 | -1 | Bits werden nicht f<>r Gr<47>n-Intensit„t benutzt
|
||
| |
|
||
| |
|
||
48 | 0 | Bit 0 der Blau-Intensit„t (niederwertigstes Bit)
|
||
| | befindet sich in Bit 0 des Pixels
|
||
49 | 1 | Bit 1 befindet sich in Bit 1 des Pixels
|
||
50 | 2 | ...
|
||
51 | 3 | ...
|
||
52 | 4 | Bit 4 der Blau-Intensit„t (h”chstwertigstes Bit)
|
||
| | befindet sich in Bit 4 des Pixels
|
||
53..63 | -1 | Bits werden nicht f<>r Blau-Intensit„t benutzt
|
||
| |
|
||
| |
|
||
64..79 | -1 | kein Alpha-Channel
|
||
| |
|
||
| |
|
||
80 | 5 | Bit f<>r Genlock
|
||
81..95 | -1 | nicht f<>r Genlock benutzt
|
||
| |
|
||
| |
|
||
96..127| -1 | keine unbenutzten Bits
|
||
| |
|
||
| |
|
||
|
||
3. Wie erkennt man, ob die neuen Funktionen vorhanden sind?
|
||
===========================================================
|
||
|
||
NVDI installiert (ebenso wie der nur f<>rs ATARI-VDI gedachte Enhancer)
|
||
einen Cookie mit der Kennung 'EdDI'. Das auf diese Kennung folgende
|
||
Langwort ist die Adresse eines Funktionsdispatchers, der mit der
|
||
Funktionsnummer in Register d0 aufgerufen wird. Der Aufruf erfolgt nach
|
||
den Pure C-Konventionen (Register d0-d2/a0-a1 und der Stack werden zur
|
||
Parameter<65>bergabe benutzt).
|
||
|
||
Bisher existiert nur die Funktion 0, die als Funktionsresultat eine
|
||
Versionsnummer zur<75>ckliefert, anhand er man auf die unterst<73>tzten
|
||
Funktionen schlieáen kann.
|
||
|
||
Ab Version 1.00 ($100 wird zur<75>ckgeliefert) sind die Funktionen
|
||
v_opnbm(), v_clsbm() und vq_scrninfo() vorhanden.
|
||
|