'****************************************************************************
'**                                                                        **
'**       ILBM-Support mittels der IFF-Library von Christian A. Weber      **
'**                   für MaxonBASIC 3 / HiSoftBASIC 2                     **
'**                     © Steffen Leistner 1993 - 96                       **
'**                                                                        **
'**       verwendbar ab Kickstart-Version 34 (Workbench 1.3)               **
'**       Version:    1.1 vom 14. Januar 1996                              **
'**       Status:     Freeware, Benutzung auf eigenes Risiko               **
'**       Includes:   exec.bh, graphics.bh, iff.bh                         **
'**       Libraries:  exec-, graphics-, iff.library                        **
'**                                                                        **
'****************************************************************************

'** $VER: ILBMSupport34.bas 1.1 [14.01.96]

CONST PicDims% 		= 7%	'Anzahl der zu übermittelnden Bildwerte
CONST PicWidth% 	= 0%	'Index für die Bildbreite
CONST PicHeight% 	= 1%	'Index für die Bildhöhe
CONST PicDepth% 	= 2%	'Index für die Farbtiefe (Anz. d. Bitplanes)
CONST PicColW%		= 3%	'Index für den Zeiger auf die Farbtabelle
CONST PicColN% 		= 4%	'Index für die Anzahl der Farben in der Tabelle
CONST PicDMode% 	= 5%	'Index für den Anzeigemodus
CONST PicPWidth%	= 6%	'Index für die Seitenbreite
CONST PicPHeight%	= 7%	'Index für die Seitenhöhe
CONST PERR_NOFILE&	= -1&	'Fehler: Datei nicht gefunden
CONST PERR_NOTYP&	= -2&	'Fehler: ..nicht vom geforderten Typ, hier: kein IFF
CONST PERR_NOPIC&	= -3&	'Fehler: kein Bild, hier: kein Bitmapheader
CONST PERR_NOMEM&	= -4&	'Fehler: nicht genug Speicher für Bitmap frei
CONST PERR_DECODE&	= -5&	'Fehler beim Entpacken
CONST PERR_NOCOL&	= -6&	'Fehler: keine Farbtabelle


'** Die nachfolgende Routine gibt eine mit "MakeBitMap" erzeugte Bitmap
'** wieder frei. Zu übergeben sind Bitmapadresse, Breite und Höhe.

SUB RemoveBitMap (bm&, b%, h%)
	LOCAL planesoffset&, plane&
	planesoffset& = bm& + Planes%
	FOR z% = 0% TO 7%
		plane& = PEEKL (planesoffset& + (z% * 4%))
		IF plane& THEN
			FreeRaster plane&, b%, h%
		END IF
	NEXT z%
	xFreeVec bm&
END SUB	

'** Die nachfolgende Funktion alloziert eine komplette BitMap anhand der
'** übergebenen Parameter Breite, Höhe und Farbtiefe (Anzahl der Bitplanes).
'** Ist nicht genügend ChipRAM frei, werden bereits allozierte Planes wieder
'** freigegeben und NULL als Adresse zurückgegeben.

FUNCTION MakeBitMap& (b%, h%, d%)
	LOCAL bmadr&, planesoffset&, plane&
	bmadr& = xAllocVec& (BitMap_sizeof%, MEMF_CHIP& OR MEMF_CLEAR&)
	IF bmadr& THEN
		InitBitMap bmadr&, d%, b%, h%
		planesoffset& = bmadr& + Planes%
		FOR z% = 0% TO (d% - 1%)
			plane& = AllocRaster (b%, h%)
			IF plane& THEN
				POKEL planesoffset& + (z% * 4%), plane&
			ELSE
				RemoveBitMap bmadr&, b%, h%
				bmadr& = NULL&
				EXIT FOR
			END IF
		NEXT z%
	END IF
	MakeBitMap& = bmadr&
END FUNCTION

'** Die nun folgende Funktion ist die eigentliche Laderoutine.
'** Zu übergeben sind der Name (inkl. Pfad) der zu ladenden Datei und eine
'** Feldvariable, in der die Funktion die Parameter des geladenen Bildes
'** zur weiteren Verwendung im Hauptprogramm ablegt. Das Feld ist als Lang-
'** wertfeld mit der Größe PicDims% und als SHARED zu dimensionieren.
'** War das Laden des Bildes erfolgreich, so liefert »LoadILBM&« die Adresse
'** der erzeugten Bitmap, andernfalls einen negativen Fehlercode zurück.
'** Die erzeugte Bitmap muß mit der Routine »RemoveBitMap« wieder freigegeben
'** werden, sobald sie nicht mehr benötigt wird, ebenso die Farbtabelle mit
'** der Exec-Routine »FreeVec«.
'** Zur Bedeutung der Fehlercodes und Feldindizes siehe Konstantendefinition.

FUNCTION LoadILBM& (pn$, pd&())
	LOCAL ifffilenm&, iffhandle&, bmhadr&, tempbm&
	IF FEXISTS(pn$) THEN
		ifffilenm& = SADD(pn$ + CHR$(0))
		iffhandle& = IFFLOpenIFF& (ifffilenm&, IFFL_MODE_READ&)	'Standardladeroutine...
		IF iffhandle& THEN
			bmhadr& = IFFLGetBMHD& (iffhandle&)
			IF bmhadr& THEN
				pd&(PicWidth%)	= PEEKW(bmhadr& + iff_bmh_Width%)		'Breite des Bildes
				pd&(PicHeight%)	= PEEKW(bmhadr& + iff_bmh_Height%)		'Höhe des Bildes
				pd&(PicDepth%)	= PEEKB(bmhadr& + iff_bmh_nPlanes%)		'Anzahl d. Bitplanes
				pd&(PicColN%)	= 2^pd&(PicDepth%)					'Anzahl der Farben
				pd&(PicPWidth%)	= PEEKW(bmhadr& + iff_bmh_PageWidth%)	'Seitenbreite
				pd&(PicPHeight%)= PEEKW(bmhadr& + iff_bmh_PageHeight%)	'Seitenhöhe
				pd&(PicDMode%)	= IFFLGetViewModes& (iffhandle&)	'Viewmode auslesen
				tempbm& = MakeBitMap& (pd&(PicWidth%), pd&(PicHeight%), pd&(PicDepth%))
				IF tempbm& THEN
					IF IFFLDecodePic& (iffhandle&, tempbm&) THEN
						pd&(PicColW%) = xAllocVec& (pd&(PicColN%) * 2%, MEMF_PUBLIC&)
						IF pd&(PicColW%) THEN
							IF IFFLGetColorTab& (iffhandle&, pd&(PicColW%)) THEN
								IFFLCloseIFF iffhandle&
								LoadILBM& = tempbm&
							ELSE
								RemoveBitMap tempbm&, pd&(PicWidth%), pd&(PicHeight%)
								IFFLCloseIFF iffhandle&
								LoadILBM& = PERR_NOCOL&		'keine Farbtabelle
							END IF
						ELSE
							RemoveBitMap tempbm&, pd&(PicWidth%), pd&(PicHeight%)
							IFFLCloseIFF iffhandle&
							LoadILBM& = PERR_NOMEM&			'kein Speicher
						END IF
					ELSE
						RemoveBitMap tempbm&, pd&(PicWidth%), pd&(PicHeight%)
						IFFLCloseIFF iffhandle&
						LoadILBM& = PERR_DECODE&			'Fehler in der Struktur
					END IF
				ELSE
					IFFLCloseIFF iffhandle&
					LoadILBM& = PERR_NOMEM&					'kein Speicher
				END IF
			ELSE
				IFFLCloseIFF iffhandle&
				LoadILBM& = PERR_NOPIC&						'kein Bild
			END IF
		ELSE
			LoadILBM& = PERR_NOTYP&							'kein IFF-Format
		END IF
	ELSE
		LoadILBM& = PERR_NOFILE&							'Datei nicht gefunden
	END IF
END FUNCTION