
=============================================================================

                    =   =   =   IFFSupport   =   =   =

                           © Copyright  1988 by
                             Fridtjof Siebert
                               Nobileweg 67
                       7000 Stuttgart 40 (Stammheim)
                            Tel: (0)711/822509

=============================================================================


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-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.


Dies ist die neuste Version. Sie ist nun endlich mit M2Amiga v3.2
compiliert.

Außerdem sind ein paar Fehler behoben:

 - Speichern mit NIL-RectanglePtr funktioniert nun
 - ExtraHB-Bilder werden nun korrekt geladen
 - ein paar kleinere Unsauberkeiten entfernt
 - Vor AddIntServer & RemIntServer wurde SETREG(0,0) eingefügt, um einen Absturz
   durch einen Fehler im neuen Exec.def zu umgehen


------  Dieses Paket umfaßt folgende Dateien:  ------


  IFFSupport.doc   : Diese Datei.

  IFFSupport.def   : Definition der IFF-Unterstützung.
  IFFSupport.mod   : Ihre Implementation.
  IFFSupport.sym   : Symbol-Datei.
  IFFSupport.obj   : Fertig compiliertes IFFSupport.
  LoadBody.asm     : Der Assembler-Quelltext der Maschinenroutine.
  LoadBody.prg     : Die PC-relativ assemblierte Maschinenroutine.
  LoadBody.code    : File, das mit EXECUTE aufgerufen wird, und aus
                     LoadBody.prg die Dateien -.def und -.mod erzeugt. Dazu
                     muß sich das Tool M2ACode (Amok#2) in einem mit Path
                     angegebenem Directory befinden.
  LoadBody.def     : Die Definition von LoadBody.
  LoadBody.mod     : Die Implementation.
  LoadBody.sym     : Symbol-Datei.
  LoadBody.obj     : Und compiliert.


  ShowIFF          : ILBM-Ladeprogramm.
  ShowIFF.mod      : sein Quelltext.
  ShowCycling      : ILBM-Lader für Colorcycling-Bilder.
  ShowCycling.mod  : Quellcode.
  ShowOVSC         : Demoprogramm zum Anzeigen von Overscan-Bildern
  ShowOVSC.mod     : Source
  DiaShow          : Lader für mehrere Bilder. Enthält Prozeduren zum Ein-
                     und Ausblenden von Screens.
  DiaShow.mod      : Sourcecode.
  SaveIFF          : Speichert Screens und Windows als IFF-Bild. (wie GrabIt)
  SaveIFF.mod      : Source.


------------------------  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 = (iffNoErr,iffOutofMem,iffOpenScreenfailed,iffOpenWindowfailed,
               iffOpenfailed,iffWrongIFF,iffReadWritefailed);
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:  ------


TYPE
  ReadILBMFlags = (front,visible,dontopen,window);
  ReadILBMFlagSet = SET OF ReadILBMFlags;

PROCEDURE ReadILBM(name: ARRAY OF CHAR; Flags: ReadILBMFlagSet;
                   VAR Screen: ScreenPtr; VAR Window: 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: 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: ScreenPtr;
                          Rect: 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: RastPortPtr;
                    VP: ViewPortPtr;
                    Rect: 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: RastPortPtr;
                      VP: ViewPortPtr;
                  VAR Rect: RectanglePtr);

PROCEDURE WriteILBMAll(Name: ARRAY OF CHAR;
                       Info: IFFInfoTypePtr;
                       BM: 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.


------  ShowOvsc:  ------


Zeigt Overscan-Colorcycling-Bilder bildschirmfüllend an. Bilder die kleiner
als die aktuelle Workbenchgröße sind, werden zentriert dargestellt. Dies
sieht besonders bei NTSC Bildern auf PAL-Amigas besser aus. Umgekehrt
werden auf NTSC-Rechnern PAL Bilder wie Overscan-Bilder angezeigt (nicht
getestet).


------  DiaShow:  ------


Das Programm DiaShow zeigt mehrere Bilder nacheinander an. Alle Bilder, die
gezeigt werden sollen, müssen vorher mit gedrückter SHIFT-Taste ausgewählt
werden. Danach kann man DiaShow mit Doppelklick starten (SHIFT nicht
vergessen). Die Bilder werden nacheinander ein- und ausgeblendet. Der
Zeitabstand zwischen 2 Bildern beträgt 20 Sekunden. Vorher kann man mit der
rechten Maustaste das nächste Bild ansehen, wenn dieses bereits geladen
ist.

Wenn man DiaShow vom CLI aus startet, kann man die Bilder auch
unterschiedlich lang zeigen lassen. Die Anzeigedauer gibt man jeweils nach
dem Bildnamen an. Sie gilt auch für die dahinter folgenden Bilder.

Beispiel: DiaShow Bild1 10 Bild2 30 Bild3 Bild4 20

Bild1 wird 10, Bild2 und Bild3 30 und Bild4 20 Sekunden lang gezeigt.


------  SaveIFF:  ------


Speichert den Inhalt eines beliebigen Fensters oder Screens als IFF-File.

Der Screen kann im Kasten links oben und das Fenster rechts daneben
ausgewählt werden. Die Angezeigten Fenster sind immer die, die im
angewählten Screen geöffnet wurden.

`Save Screen' speichert den ausgewählten Screen mit dem Namen im TextGadget.

`Save Window' macht das gleiche mit einem Fenster. Das Fenster darf
dabei von keinem anderen Überdeckt sein.

`Save GimmeZZ' speichert den Inhalt eines Fensters, also den Bereich, in den
man bei GimmeZeroZero-Fenstern zeichnen kann. Damit kann man Fenster ohne
Rahmen und Titelzeile speichern.

`Show IFF' zeigt das IFF-Bild mit dem Namen im TextGadget.

Bei diesem Programm muß man aufpassen, daß der Screen oder das Fenster sich
während dem Speichern nicht verabschiedet.


----------------------------  Copyright:  -----------------------------------


Das Modul kann von jedem in nicht kommerziell genutzten Programmen frei
verwendet werden. Wer genügend Geld hat, kann mir auch eine Sharewaregebühr
zukommen lassen. Mein ewiger Dank ist Ihm/Ihr dann gewiß!

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.

-----------------------------------------------------------------------------
