|
Dieser Kursteil soll Ihnen eine Übersicht der Möglichkeiten bieten und aufzeigen, welche Teile anzupassen sind.
Da die Dokumentationen zu Picasso96 noch sehr »löchrig« sind, werden Sie hier hauptsächlich den Umgang mit dem verbreiteten CyberGraphX-System finden. Beginnen wir mit einem theoretischen Überblick der notwendigen Änderungen bzw. Anforderungen. Alle wichtigen Grafik-Funktionen werden automatisch von CyberGraphX und Picasso96 gepatcht, so daß hier erst einmal keine Änderungen notwendig sind.
|
Planar oder Chunky?
Bevor wir loslegen, wollen wir uns kurz den verschiedenen Farbmodellen bzw. Bitmap-Modi widmen: Planar und Chunky. Bei den Amiga-Bitmaps kommen je nach Farbtiefe eine bis acht Bitplanes zum Einsatz. Der Farbwert für einen Pixel wird indirekt durch das verwendete Farbregister festgelegt, welches in der Bitmap eingetragen ist. Wird der Farbwert in einem der Farbregister verändert, werden dadurch automatisch alle anderen Pixel auf dem Bildschirm angepaßt, die ebenfalls dieses Farbregister verwenden. Anders verhält es sich bei den Grafikkartenauflösungen diese arbeiten mit dem Chunky-Format. Dabei erfolgt der Bildaufbau in quasi einer Bitmap, wobei jeweils ein Byte (acht aufeinanderfolgende Bits) das Farbregister festlegen. Vom Speicherverbrauch her besteht kein Unterschied, allerdings ist der Zugriff einfacher. Den Inhalt eines Registers kann man direkt als Bytewert auslesen und muß ihn nicht anhand acht einzelner Bits aus den Bitplanes zusammensetzen. Dadurch erhöht sich automatisch die Verarbeitungsgeschwindigkeit.
Bei den höheren Farbtiefen, mit mehr acht Planes, existieren keine Farbregister mehr. Bei einem 16-Bit-Bild würden 65536 Farbregister benötigt, die je vier Byte belegen. Das ergibt eine 256 KByte große Farbtabelle. Hierbei werden die Farbwerte direkt für jeden Pixel definiert. Damit besteht keine Möglichkeit mehr, alle gleichfarbigen Pixel auf dem Bildschirm auf einmal zu ändern. Wird diese Funktion benötigt, muß eine entsprechende Routine alle Pixel des Bildes durchlaufen und dabei jeweils bei Bedarf den neuen Farbwert eintragen. 24-Bit-Modi arbeiten nach einem ähnlichen Schema. Hierbei werden die Bilddaten aber wieder byteweise abgelegt. Dabei kommen drei Planes zum Einsatz: eine für den Rot-, eine für den Grün- und eine für den Blauanteil der Farbe. Es stehen 256 Farbabstufungen (entspricht acht Bit) je Grundfarbe zur Verfügung, die zusammen 24 Bit ergeben und ein Farbspektrum von 16.8 Millionen Farbwerten ermöglichen.
Beachten Sie: Oft sind die Daten für Rot und Blau vertauscht die Plane-Daten liegen also in der Reihenfolge Blau/Grün/Rot vor. Es stehen aber meist auch hier Formate zur Verfügung, die die Bilddaten in einem Stück verwalten und jeweils für ein ULONG pro Bildpunkt verantwortlich ist. Je nach Formataufbau werden meist die obersten acht Bit für den Alpha-Kanal verwendet, der aber selten benutzt bzw. beachtet wird. Beide Grafikkartensysteme bieten eine Menge an unterschiedlicher Bitmap-Formaten und Farbtiefen an. Es empfiehlt sich auf alle Fälle die jeweilige Einleitung der Autodocs bzw. die Include-Files zu lesen.
| |||||||||||||||||||||||||||||||||||||||||||||||
Start und Bibliotheken nutzen
|
Beachten Sie bitte die
unterschiedlichen Include-Pfade von CyberGraphics
(bis V3) und CyberGraphX (ab V4)! Das
Picasso-Include wird im libraries-Verzeichnis
abgelegt. Für die Prototypen muß
clib/cybergraphics_protos.h bzw. clib/picasso96_
protos.h includiert werden.
Sie können Ihr Programm natürlich für beide Systeme auslegen,
wobei dadurch allerdings ein erhöhter
Entwicklungs- und Wartungsaufwand notwendig ist.
Vorteilhaft ist vor allem die Entwicklung von
CyberGraphX-kompatibler Software, da dieses
System zur Zeit am meisten verbreitet ist.
Darüber hinaus kann man auch unter installierter
Picasso96-Umgebung auf die cybergraphics.library
zurückgreifen, da diese vom Picasso96-System
emuliert wird (Version 41.4 von CyberGraphX). Die
Entwicklung von »nur Picasso96-Software« ist zur
Zeit nur dann sinnvoll, wenn die zusätzlichen
Möglichkeiten der PicassoIV-Grafikkarte benötigt
werden. Momentan existieren allerdings keine
Dokumentationen, wie die
PabloIV/PalomaIV/Concertio-Erweiterungen der
PicassoIV-Karte anzusprechen sind!
|
|
http://www.meicky-soft.de/gfxcards/gfxcards.html
Wollen Sie für beide Systeme Software entwickeln, ist die gleichzeitige Installation beider Systeme zu empfehlen. Eine Alternative besteht nur darin, eine eigene Partition für jedes Grafikkartensystem zu verwenden und per Boot-Manager zu entscheiden, welches benutzt werden soll.
Minimal kann man aber die cybergraphics.library V41 voraussetzen, was der Paketversion 3 entspricht. Diese Version läßt sich bei Bedarf kostenlos aus dem Internet laden. Anders verhält es sich mit der Version 4 (Library-Version 42.x). Diese Version wird kommerziell von Ossowskis Schatztruhe vertrieben, wobei es auch günstige Up-date-Preise für registrierte »Aufsteiger« gibt. Lediglich wenn Ihr Programm auf Funktionen zurückgreift, die in V41 fehlerhaft sind, sollte eine V42-Library vom Programm verlangt werden.
Beim Picasso-System kann der Programmierer die aktuelle Version verlangen (z.Z. V2), da diese kostenlos im Internet verfügbar ist.
Den Bildschirmmodus ermitteln
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Es besteht zwar die Möglichkeit, die Mode-ID per Shellargument bzw. Tooltype zu übergeben, vorteilhafter ist jedoch die automatische Ermittlung. Zusätzlich sollte wahlweise ein Screenmode-Requester zur komfortablen Auswahl angeboten werden. Wie das einfach zu bewerkstelligen ist, finden Sie im Kasten »Mode-ID ermitteln« und in den Beispielsourcen.
Screenmode-Daten bestimmen
Die ermittelte ModeID kann allerdings in Breite und Höhe von der gewünschten Anforderung abweichen! Zusätzlich zu beachten: Bei Verwendung von BestModeID() der graphics.library, kann diese Funktion auch eine PAL- (bzw. andere Amiga) Auflösung zurückliefern, wenn die Auflösung oder Farbtiefe dies erlauben! Wollen Sie »unbedingt« eine Grafikkartenauflösung, sollten Sie auf die Funktion BestCModeIDTags() der cybergraphics.library zurückgreifen. Dabei kann es jedoch passieren, daß INVALID_ID zurückgeliefert wird, wenn keine passende Auflösung existiert. Es wird keinesfalls eine passende Amiga-Auflösung zurückgegeben! Sollen Attribute zu einem Bildschirmmodus ermittelt werden (z.B. in welcher Breite oder Höhe ein entsprechender Bildschirm zu öffnen ist), so stehen die Funktionen aus Kasten »Attribute auslesen« hierfür bereit.
Zurückgeliefert wird der ermittelte Wert entsprechend dem attribut-Tag. Bei ungültigen Tags wird -1 zurückgegeben. Die Funktionen dürfen nur bei den jeweils eigenen Mode-IDs verwendet werden. Wie sich die Moduszugehörigkeit prüfen läßt, erfahren Sie im Abschnitt »Grafikkartenmodus«.
Achtung: Die Funktion GetCyberIDAttr() liefert sowohl bei Benutzung unter CyberGraphX, als auch bei der Picasso96-Emulation für alle drei Tags den Wert -1 zurück! Die Picasso-Funktion hingegen liefert die erwarteten Werte. Zur Sicherheit sollte daher die Amiga-Funktion GetDisplayInfoData() zum Einsatz kommen (s. Listing 2).
Der Grafikkartenmodus
Soll im Programm festgestellt werden, ob es sich beim gewählten/übergebenen Bildschirmmodus um einen CyberGraphX-, einen Picasso96- oder einen Amiga-Bildschirm handelt, nutzen Sie die folgenden Funktionen:
CyberGraphX:
BOOL res = IsCyberModeID ( ULONG modeid );
Picasso96:
ULONG res = p96GetMode IDAttr( ULONG modeid, ULONG attribut );
wobei als attribut P96IDA_ISP96 übergeben werden
muß.
|
Wie kann jedoch ermittelt werden, ob die Mode-ID gültig ist? Am einfachsten könnte ein Bildschirm mit der angegebenen Mode-ID (Tag SA_DisplayID) geöffnet werden. Schlägt dies fehl, ist die Mode-ID wahrscheinlich ungültig, wobei allerdings auch andere Fehlerquellen existieren (z.B. Speichermangel). Aber auch die graphics.library bietet hierfür eine passende Funktion an:
ULONG res = ModeNotAvailable( ULONG modeid );
Liefert die Funktion 0 zurück, so handelt es sich um einen gültigen Modus, der auf dem aktuellen Rechner dargestellt werden kann. Vor allen bei der Darstellung von Bilddateien, kann es oftmals vorkommen, daß der Modus, der beim Erstellen verwendet wurde, nicht beim Betrachter verfügbar ist. In diesem Fall sollte man zur Lösung aus Listing 3 greifen, um automatisch den passenden Modus zu verwenden.
Anhand der oben gezeigten Funktion GetDisplayInfoData(...,DTAG_DIMS,modeid) kann auf die tatsächliche Größe des Bildschirmmoduses geschlossen werden. Diese Werte werden zum Öffnen des Screens benötigt.
Um von der ModeID auf den zugehörigen Namen zu kommen, läßt sich ebenfalls die Funktion GetDisplayInfoData() der graphics.library nutzen (s. Listing 4). Die genaue Nutzung läßt sich kann im Beispielprogramm GfxSystem.c (Funktion GetDisplayIDName()) nachvollziehen.
Bitmap-Daten ermitteln
Mit einer gültigen Mode-ID können Sie nun den Bildschirm wie gewohnt mit OpenScreenTags() öffnen. Dabei wird automatisch Speicher für die Bitmaps reserviert, um die Ausgabedaten aufzunehmen. Bevor nun direkt in eine Bitmap geschrieben wird, muß unbedingt festgestellt werden, um welches Format es sich handelt. Auch hierfür stehen wieder zwei ähnliche Funktionen zur Verfügung (s. Kasten »Bitmap-Formate erkennen«)
Vor allem die Breite des Bildschirms kann sich von der Breite der Bitmap unterscheiden, da letztere normalerweise auf ein Vielfaches aufgerundet wird (bei den Amiga-AGA-Bitmaps z.B. auf ein 64faches). Nur wenn man mit Hilfe der graphics.library die Werte ermittelt, kann man über die Blitterfunktionen auf die Bitmap (mit Ausnahmen) zugreifen!
Arbeitet Ihr Programm nur mit maximal 256 Farben, können Sie auf die Formatermittlung verzichten und wie bisher mit den normalen Amiga-Graphics-Funktionen in die Bitmaps bzw. RastPort zeichnen. Wollen Sie hingegen mehr Farben verwenden, so sollten Sie bereits beim Öffnen des Bildschirms das gewünschte Bitmap-RGB-Format übergeben. Ansonsten müssen Sie für jedes, von CyberGraphX unterstütztes Format, eine eigene Bearbeitungsfunktion erstellen. Durch das vorgegebene Format können Sie einfach »von Hand« die Bitmaps bearbeiten, was aber nur im »geschützten« Zustand erfolgen darf. Mehr dazu lesen in einem folgenden Abschnitt.
Weitere Funktionen
CyberGraphX stellt aber auch Funktionen bereit, um die Bitmaps zu bearbeiten. Hier eine kurze Aufzählung (ohne Gewähr auf Vollständigkeit). Zuerst ist sicherzustellen, daß es sich bei den jeweiligen Bitmaps auch tatsächlich um eine CyberGraphX-Bitmap handelt (prüfbar per GetCyberMapAttr(bitmap,CYBRMATTR_ISCYBERGFX)).
Außerdem sollten die Funktionen nur bei Bitmaps mit mehr als 8 Bit Tiefe zum Einsatz kommen. Dieser Wert läßt sich mit GetCyberMapAttr(bitmap,CYBRMATTR_DEPTH) feststellen. Bei acht oder weniger Bitmaps, finden die Funktionen der graphics.library Verwendung. Viele Funktionen sind erst ab cybergraphics.library V41 verfügbar (Paket V3). Daher sollte die entsprechende Library bereits beim Programmstart angefordert werden. Die Funktionsliste finden Sie in »Zeichenfunktionen von CyberGraphX«. Zur genauen Funktionsweise bzw. Parametererklärung lesen Sie unbedingt in den Autodocs zu CyberGraphX nach.
Die meist gleichnamigen Funktionen der Picasso96 API.library haben ein »p96« dem Funktionsnamen vorausgestellt:
p96LockBitMap() /
p96UnlockBitMap(), p96ReadPixel() /
p96WritePixel(), p96ReadPixelArray() /
p96WritePixelArray(), p96RectFill(),
p96ReadTrueColorData() /
p96WriteTrueColorData()
Während CyberGraphX viele der Amiga-Funktionen patcht, verlangt das Picasso96-System teilweise den Aufruf der eigenen Funktionen. Hier eine kurze Gegenüberstellung: Bitmaps dürfen Sie auf keinen Fall von Hand erzeugen, auch wenn sie nur für interne Berechnungen/Rendering benutzt werden. AmigaOS bietet seit der Version 3 die beiden Funktion AllocBitmap() bzw. FreeBitmap() hierfür an. Bei Picasso96 hingegen müssen die bei-den Funktionen p96AllocBitMap() und p96FreeBitMap() zum Einsatz kommen.
Etwas unverständlich sind die beiden Funktionen p96OpenScreenTags() und p96CloseScreen() - sie sind zum Öffnen und Schließen von Bildschirmen. Während zwar weitere Picasso96-eigene Tags zur Verfügung gestellt werden, sind auch statt der normalen SA-Tags eigene Definitionen vorhanden. Daß es besser geht, zeigt CyberGraphX. Hier werden alle Daten transparent im normalen OpenScreenTags()-Aufruf verarbeitet.
|
Für Picasso96-Entwickler, die Grafiken über das Pablo-Modul auf Video ausgeben möchten, ist noch interessant, daß auch hier eine transparente Farbe möglich ist, die dann das eingespielte Paloma-Signal anzeigt. Bei Amiga-Grafiken ersetzt das Genlock das Farbregister 0 durch das zugespielte Videosignal. Picasso96 hingegen verwendet das Farbregister 255 als transparent! Das heißt in der Praxis: Nachbearbeitung vorhandener Grafiken oder eine interne Routine kümmert sich um das Ummappen von Farbregister 0 auf 255. Zu diesem Thema werden Sie leider ebenfalls keine Informationen in den Picasso96-Autodocs finden.
Die Beispiel-Programme
Viele der angesprochenen Funktionen finden Sie in den beiden Beispielprogrammen GfxSystem.c und GfxWindow.c. Das erste Programm liegt als reine Shell-Version vor. Es zeigt, wie automatisch ein passender Bildschirmmodus ermittelt wird, entsprechend vorgegebener Werte für Breite, Höhe und Farbtiefe (WIDTH, HEIGHT, DEPTH). Sie finden auch eine Universalroutine, um von der Mode-ID auf den Namen zu kommen. Auch die Gültigkeitsprüfung der Mode-ID wird gezeigt. Die Mode-ID läßt sich dabei direkt übergeben (MODEID), wobei auch die hexadezimale Angabe möglich ist (z.B. MODEID=0x21004). Je nach übergebenem Parameter wird außerdem ein Screenmode-Requester zur Auswahl geöffnet (MODEREQ) oder die komplette Liste der verfügbaren Modi ausgegeben (MODELIST).
Das zweite Programm, GfxWindow.c, ist ein vollständiges Anwendungsprogramm. Bei der Definition eines beliebigen Bildschirms hilft ein Screenmode-Requester, den das Programm bereitstellt. Den zu verwendenden Zeichensatz kann man auch einstellen. Per File-Requester wird eine Grafik-Datei gewählt, die dann auf dem Bildschirm (in einem »unsichtbaren« Fenster) angezeigt wird.
|
Bei ungünstiger Farbgebung setzt die Space-Taste die ersten vier Farbregister auf (meine) Default-Werte zurück. Dadurch werden die Bildschirmelemente und Menüs wieder wählbar.
Der eingestellte Screenmode und Font läßt sich speichern, wodurch die Abfrage beim Programmstart entfällt. Die mitgegebenen Shell-Argumente werden aber trotzdem noch beachtet, wodurch einfach abweichende Screenmode-Parameter übergeben werden können.
Der Sourcecode sollte ausreichend dokumentiert sein und weist bei gegebenem Anlaß auf die Besonderheiten der einzelnen Routinen oder Funktionen hin. Die Aufgaben wurden in einzelne Routinen zerlegt, welche hierdurch auch in den eigenen Programmen zum Einsatz kommen können.
|
Für Fragen stehe ich gerne zur Verfügung am einfachsten per E-Mail:
Michael Christoph.
Die Beispielprogramme und Compilerarchive können direkt von der Homepage des Programmierers geladen werden:
http://www.meicky-soft.de/gfxcards/amgfxkurs.html
© 1999 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 04. Mai 1999, Michael Christoph.