home *** CD-ROM | disk | FTP | other *** search
-
- =============================================================================
-
- = = = IFFSupport = = =
-
- © Copyright 1992 by
- Fridtjof Siebert
- Nobileweg 67
- 7000 Stuttgart 40
-
- =============================================================================
-
-
- Mit den von IFFSupport exportierten Prozeduren können IFFBilder geladen,
- gespeichert und Colorcycling-Bilder gezeigt werden.
-
- Anders als bei anderen IFF-Unterstützungsroutinen (Ich habe die des
- TDI-M2-Compilers angesehen) werden hier die geladenen Daten in bekannten
- Formaten (Screens, Windows und BitMaps) und nicht so, wie sie im IFF-File
- vorliegen, übergeben. Dadurch vereinfacht sich die Handhabung.
-
-
- ------ Dieses Paket umfaßt folgende Dateien: ------
-
-
- IFFSupport.dok : Diese Datei.
-
- txt/IFFSupport.mod : Der Oberon-Quelltext
- txt/LoadBody.asm : Der Assembler-Quelltext der Maschinenroutine.
- sym/IFFSupport.sym : Symbol-Datei.
- obj/IFFSupport.obj[s]: Objektdateien (mit Assemblerteil gejoint)
- obj/LoadBody.o : Der assemblierte Assemblerquelltext. Muß evtl.
- beim linken angegeben werden ('OBJ LoadBody.o')
-
-
- ShowIFF : ILBM-Ladeprogramm.
- txt/ShowIFF.mod : sein Quelltext.
- ShowCycle : ILBM-Lader für Colorcycling-Bilder.
- txt/ShowCycle.mod : Quellcode.
-
-
- ------------------------ Variablen & Typen: -----------------------------
-
-
- Von IFFSupport werden folgende Variablen und Typen exportiert:
-
- TYPE
- IFFInfoTypePtr = POINTER TO IFFInfoType;
- IFFInfoType = RECORD
- ... (* Mega-Record *)
- END;
-
- VAR
- IFFInfo: IFFInfoType;
-
- IFFInfo enthält Informationen über das zuletzt geladenen Bild oder
- Informationen über ein zu speicherndes Bild. Wenn mehrere Bilder verwendet
- werden, müssen eigene Variablen vom Typ IFFInfoType definiert werden, da
- bei jedem neuen Laden IFFInfo überschrieben wird.
-
-
- ------
-
-
- VAR
- NuScreen: NewScreen;
- NuWindow: NewWindow;
-
- Können importiert werden, um später einen Screen mit der Grafik oder ein
- Window in dem Screen zu öffnen. siehe auch ReadILBM();
-
-
- ------
-
-
- TYPE
- IFFErrors = SHORTINT;
-
- CONST
- iffNoErr * = 0;
- iffOutofMem * = 1;
- iffOpenScreenfailed * = 2;
- iffOpenWindowfailed * = 3;
- iffOpenfailed * = 4;
- iffWrongIFF * = 5;
- iffReadWritefailed * = 6;
-
- VAR
- IFFError: IFFErrors;
-
- IFFErrors enthält die Fehlerart, wenn das Laden oder Speichern eines Bildes
- erfolglos war.
-
- iffNoErr: Kein Fehler
- iffOutofMem: Nicht genügend Speicher
- iffOpenScreenfailed: OpenScreen ist fehlgeschlagen
- iffOpenWindowfailed: Es konnte kein Fenster geöffnet werden
- iffOpenfailed: File konnte nicht geöffnet werden
- iffWrongIFF: Kein IFF-File
- iffReadWritefailed: Schreib/LeseFehler
-
-
- --------------------------- Prozeduren: ---------------------------------
-
-
- ------ Laden von IFF-Bildern: ------
-
-
- CONST
- (* ReadILBMFlags: *)
- front * = 0;
- visible * = 1;
- dontopen * = 2;
- window * = 3;
-
- TYPE
- ReadILBMFlagSet * = SET;
-
- PROCEDURE ReadILBM(name: ARRAY OF CHAR; Flags: ReadILBMFlagSet;
- VAR Screen: I.ScreenPtr; VAR Window: I.WindowPtr): BOOLEAN;
-
- ReadILBM lädt ein IFFBild mit dem Namen name. Trat ein Fehler auf, wird
- FALSE zurückgegeben.
- Folgende Flags können gewählt werden:
-
- - front: Wenn gesetzt, wird der Screen, in den die Grafik geladen
- wird, vor allen anderen Screens geöffnet, sonst dahinter.
-
- - visible: Wenn visible nicht gesetzt ist, wird während dem Laden das
- Display mit GfxMacros.OffDisplay() ausgeschaltet. Das erhöht
- die Ladegeschwindigkeit, besonders bei Bildern mit hoher
- Auflösung und/oder vielen Farben.
-
- - dontopen: Wenn gesetzt wird kein Screen geöffnet. Der zurückgegebene
- ScreenPtr ist dann NIL. Die Grafik wird in eine BitMap
- geladen. Der Zeiger auf die BitMap steht in
- IFFSupport.NuScreen.customBitMap. Der Screen kann später mit
- OpenScreen geöffnet werden. Bei gewähltem dontopen muß der
- Speicher für die BitPlanes und die BitMap-Struktur später
- wieder freigegeben werden.
-
- - window: Wenn gesetzt wird vor dem Laden der GrafikDaten in den Screen
- ein Fenster mit der Größe der Grafik geöffnet. Dadurch können
- später Gadgets, Menüs etc. hinzugefügt werden, ohne die
- Grafik zu zerstören. Ist window gelöscht, ist der WindowPtr
- NIL.
-
- Die Laderoutine unterstützt alle Auflösungen: Lores, Hires, Interlace, Hold
- and Modify, ExtraHalfBrite. Gepackte Bilder werden entpackt. Da der
- Entpacker in Maschinensprache geschrieben ist, werden gepackte Bilder
- schneller geladen als ungepackte.
-
-
- ------ ColorCycling: ------
-
-
- PROCEDURE DoCycle(Info: IFFInfoTypePtr; Screen: I.ScreenPtr): BOOLEAN;
-
- PROCEDURE EndCycle(Info: IFFInfoTypePtr);
-
- Mit DoCycle kann das ColorCycling für eine Grafik eingeschaltet werden.
- Dazu wird ein VBlank-Interrupt initialisiert. Das Cycling läuft also im
- Hintergrund des eigenen Programms.
-
- DoCycle benötigt einen ScreenPtr und die Addresse einer IFFInfoType-
- Variablen. Werden mehrere Bilder gleichzeitig mit ColorCycling gezeigt,
- müssen auch verschieden Variablen verwendet werden ! DoCycle() gibt FALSE
- zurück, wenn ein Fehler auftrat, d.h. mehr als 32 ColorCycling-Bilder
- gleichzeitig eingeschaltet sind. Da dies gewöhnlich nicht der Fall ist,
- kann DoCycle mit `IF DoCycle(ADR(IFFInfo),Screen) THEN END;' aufgerufen
- werden.
-
- EndCycle() stoppt das ColorCycling wieder. Dazu wird der gleiche
- IFFInfoTypePtr benötigt wie bei DoCycle. EndCycle darf nicht vergessen
- werden, da die Interrupts sonst von IFFSupport nicht entfernt werden. Also
- spätenstens in der TermProcedure kurz vor dem Schließen des Screens
- aufrufen !!! Ich hätte die Interrupts auch in der Termprocedure von
- IFFSupport ausschalten können, doch gäbe es dann sicher Leute, die sich
- darauf verlassen würden und in ihrer Termprocedure lediglich den Screen
- schließen und das Cycling nicht ausschalten. Dies hätte zur Folge, daß die
- Farben eine kurze Zeit auf einem nicht mehr vorhandenen Screen cyclen, es
- gäbe also höchstwahrscheinlich einen Guru.
-
-
- ------ Speichern von IFF-Bildern: ------
-
-
- Zum Speichern gibt es 3 ähnliche Prozeduren:
-
-
- PROCEDURE WriteILBMScreen(Name: ARRAY OF CHAR;
- Screen: I.ScreenPtr;
- Rect: g.RectanglePtr;
- CompressIt: BOOLEAN): BOOLEAN;
-
- Speichert den Screen `Screen' mit dem Namen `Name'. Trat ein Fehler
- (iffOpenfailed oder iffReadWritefailed) auf, wird FALSE zurückgegeben.
- Ist CompressIt TRUE, wird ein gepacktes File erzeugt.
-
- Rect kann, wenn der ganze Screen gespeichert werden soll, NIL sein. Sonst
- enthält es einen Zeiger auf ein Graphics.Rectangle. Rect^.minX/minY ist
- dann die linke obere und Rect^.maxX/maxY die rechte untere Ecke des
- Ausschnitts. Dabei sollte man Ausschnitte größer als der Screen oder
- ähnliche Späße vermeiden. Rect^.minX und Rect^.maxX brauchen keine
- Vielfachen von 16 sein. Sind sie es wird jedoch schneller gespeichert.
-
-
- ------
-
-
- PROCEDURE WriteILBM(Name: ARRAY OF CHAR;
- RP: g.RastPortPtr;
- VP: g.ViewPortPtr;
- Rect: g.RectanglePtr;
- CompressIt: BOOLEAN): BOOLEAN;
-
- Speichert wie WriteILBMScreen ein IFF-File.
-
- Name, Rect, CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
-
- RP zeigt auf den RastPort, der die Grafikdaten enthält.
-
- VP zeigt auf den ViewPort. der die Farben und ViewModes etc. enthält.
-
- Mit WriteILBM kann folgendermaßen ein Fenster gespeichert werden (das Fenster
- muß vor allen anderen Fenstern liegen):
-
-
- VAR
- Window: Intuition.WindowPtr;
- Rect: Graphics.Rectangle;
- OK: BOOLEAN;
-
- ...
-
- WITH Window^ DO
- WITH Rect DO
- minX := leftEdge;
- minY := topEdge;
- maxX := minX + width - 1;
- maxY := minY + height - 1;
- END;
- Error := WriteILBM(Name,rPort,ADR(wScreen^.viewPort),ADR(Rect),TRUE);
- END;
-
-
- ------
-
-
- PROCEDURE InitIFFInfo(Info: IFFInfoTypePtr;
- RP: g.RastPortPtr;
- VP: g.ViewPortPtr;
- VAR Rect: g.RectanglePtr);
-
- PROCEDURE WriteILBMAll(Name: ARRAY OF CHAR;
- Info: IFFInfoTypePtr;
- BM: g.BitMapPtr;
- FirstLine, LeftOffset: INTEGER;
- CompressIt: BOOLEAN): BOOLEAN;
-
-
- WriteILBMAll kann auch Bilder mit Zusatzinformationen wie ColorCycling etc.
- speichern. Dazu wird die Addresse einer initialiesierten IFFInfoType-
- Variablen benötigt. Um die Initialisierung zu erleichtern, kann die
- Prozedur InitIFFInfo() aufgerufen werden. Ihre Parameter entsprechen denen
- von WriteILBM. Danach sind die Unterrecords BMDH, CMAP und CAMG
- initialisiert und deren Flags in Info^.IFFTitle gesetzt. Weitere
- Unterrecords können dann `von Hand' initialisiert und deren Flags gesetzt
- werden.
-
- BM zeigt auf die BitMap, die die zu speichernden Planes enthält. BM kann
- auch extra zum Speichern initialisiert werden, wenn man z.B. eine
- zusätzliche MaskPlane speichern möchte.
-
- FirstLine und LeftOffset entsprechen Rect^.minY und Rect^.minX.
-
- CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
-
-
- -------------------------- Demonstartionen: ----------------------------
-
-
- ------ ShowIFF: ------
-
-
- Das Programm ShowIFF lädt und zeigt ein IFF-Bild. Es lädt das vorher auf
- der Workbench angeklickte oder, beim Starten vom CLI, das hinter dem Namen
- angegebene Bild. Bilder, die ShowIFF als Default-Tool haben (Info), können
- durch einfachen Doppelklick angezeigt werden. An diesem kurzen Programm
- kann man leicht die Verwendung der Ladeprozedur studieren.
-
-
- ------ ShowCycle: ------
-
-
- Entspricht ShowIFF für Colorcycling-Bilder. Normallerweise kann es auch für
- nicht-Cycling Bilder verwendet werden, wenn die Cyclinginformationen korrekt
- ausgeschaltet sind.
-
-
- ---------------------------- Copyright: -----------------------------------
-
-
- Das Modul kann von jedem in nicht kommerziell genutzten Programmen frei
- verwendet werden.
-
- Bevor ein Programm, das dieses Modul benutzt, kommerziell genutzt oder
- vertrieben wird, muß sich der Autor mit mir in Verbindung setzten und eine
- eventuelle Vergütung aushandeln.
-
- --- Fridtjof.
-
- -----------------------------------------------------------------------------
-