(*---------------------------------------------------------------------------
    :Program.    IFFLib
    :Author.     Volker Rudolph
    :Address.    Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
    :Version.    1.0
    :Date.       09-Sep-90
    :Copyright.  PD
    :Language.   Oberon
    :Translator. Amiga-Oberon V1.16
    :Imports.    iff.library - Christian A. Weber
    :Contents.   Oberon library-module for iff.library
    :Remark.     Needs iff.library in libs: directory
    :Remark.     This ist the Oberon-version of the
    :Remark.     IFFLib-Module for M2Amiga by Fridtjof Siebert
---------------------------------------------------------------------------*)

MODULE IFFLib;

IMPORT Exec,Graphics,i:Intuition,s:SYSTEM;

CONST
  iffName * = "iff.library";
  iffVersion * = 16;                  (* Current library version *)


(************** E R R O R - C O D E S ***********************************)

  iffBadTask            * = -1;       (* IffError() called by wrong task *)

  iffCantOpenFile       * = 16;       (* File not found *)
  iffReadError          * = 17;       (* Error reading file *)
  iffNoMem              * = 18;       (* Not enough memory *)
  iffNotIFF             * = 19;       (* File is not an IFF file *)
  iffWriteError         * = 20;       (* Error writing file *)

  iffNoILBM             * = 24;       (* IFF file is not of type ILBM *)
  iffNoBMHD             * = 25;       (* BMHD chunk not found *)
  iffNoBODY             * = 26;       (* BODY chunk not found *)
  iffTooManyPlanes      * = 27;       (* BODY has more planes than BitMap *)
  iffUnknownCompression * = 28;       (* Unknown compression type *)


(************** S T R U C T U R E S *************************************)

TYPE
  ADDRESS * = Exec.ADDRESS;

  ChunkPtr * = POINTER TO Chunk;
  Chunk * = RECORD
    ckID * : LONGINT;
    ckSize * : LONGINT;
    ckData * : ARRAY 1048576 OF SHORTINT; (* ARRAY ckSize OF SHORTINT *)
  END;

  BitMapHeaderPtr * = POINTER TO BitMapHeader;
  BitMapHeader * = RECORD
    w * :INTEGER;
    h * : INTEGER;
    x * : INTEGER;
    y * : INTEGER;
    nPlanes * : SHORTINT;
    masking * : SHORTINT;
    compression * : SHORTINT;
    pad1: SHORTINT;
    transparentColor * : INTEGER;
    xAspect * : SHORTINT;
    yAspect * : SHORTINT;
    pageWidth * : INTEGER;
    pageHeight * : INTEGER;
  END;

(************** F L A G S   F O R  S a v e B i t M a p ()  **************)

CONST
  cmpByteRun1 * = 0; (* create compressed file *)
  saveHAM * = 7;     (* save HAM-picture *)

(*********************** L I B R A R Y - B A S E ************************)

VAR
  base * :Exec.LibraryPtr;

(************** F U N C T I O N   D E C L A R A T I O N S ***************)

PROCEDURE OpenIFF * {base,-30}
          (fileName{8}: ARRAY OF CHAR): ADDRESS;

PROCEDURE CloseIFF * {base,-36}
          (iffFile{9}: ADDRESS);

PROCEDURE FindChunk * {base,-42}
          (iffFile{9}: ADDRESS;hunkName{0}: LONGINT): ChunkPtr;

PROCEDURE GetBMHD * {base,-48}
          (iffFile{9}: ADDRESS): BitMapHeaderPtr;

PROCEDURE GetColorMap * {base,-54}
          (iffFile{9}: ADDRESS;colorTable{8}: ADDRESS): LONGINT;

PROCEDURE DecodePic * {base,-60}
          (iffFile{9}: ADDRESS;bitmap{8}: Graphics.BitMapPtr): BOOLEAN;

PROCEDURE SaveBitMap * {base,-66}
          (fileName{8}: ARRAY OF CHAR;
           bitMap{9}: Graphics.BitMapPtr;
           colorTable{10}: ADDRESS;
           flags{0}: SET): BOOLEAN;

PROCEDURE SaveClip * {base,-72}
          (fileName{8}: ARRAY OF CHAR;
           bitmap{9}: Graphics.BitMapPtr;
           coltab{10}: ADDRESS;
           flags{0}: SET;
           xoff{1},yoff{2}: INTEGER;
           width{3},height{4}: INTEGER): BOOLEAN;

PROCEDURE IffError * {base,-78}
          (): INTEGER;

PROCEDURE GetViewModes * {base,-84}
          (iffFile{9}: ADDRESS): SET;

PROCEDURE NewOpenIFF * {base,-90}
          (name{8}: ADDRESS; memattr{0}: LONGSET): ADDRESS;

(* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)
BEGIN

 base :=  Exec.OpenLibrary(iffName,iffVersion);
 IF base = NIL THEN
   IF i.DisplayAlert(0,"\x00\x64\x14missing iff.library V16\o\o",50) THEN END;
   HALT(20)
 END; (* IF *)

CLOSE

  IF base # NIL THEN
    Exec.CloseLibrary(base)
  END; (* IF *)

END IFFLib.
