/***********************************************************/
/*      _  __ __                                           */
/*  /_//_)/_ (                                             */
/* / //( (_/__)|/STEM   written by H.Raaf © 1992-93        */
/*             /                                           */
/*                           ProDev / X-Pert               */
/*                                                         */
/***********************************************************/
/*                                                         */
/* Definitions for the HRBitMap V38                        */
/*                                                         */
/***********************************************************/

#ifndef HRG_BITMAP_H
#define HRG_BITMAP_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef EXEC_SEMAPHORES_H
#include <exec/semaphores.h>
#endif


/*
** Color Look Up Table Definition, wird fuer die GAMMA Korrektur
** bei hrWriteRect() und andere Funktionen mit GAMMA Faehigkeit, anstelle
** der Stukture HRColorMap() verwendet! Bitte beachten das der Aufbau sich
** stark von einer HRColorMap unterscheidet (aus Geschwindikeitsgruenden
** ist es guenstiger die RGB(A) Werte nicht als ULONGs sondern in 4
** Array's zu haben (Spart viel Rechenzeit pro Pixel). Eine CLUT ist immer
** fuer alle 256 Farben pro Farbanteil definiert (siehe HRGRender.library).
*/

struct HRCLUT
{
	UBYTE R[256];
	UBYTE G[256];
	UBYTE B[256];
	UBYTE A[256];
};

struct HRBitMap
{
	union LOCKTYPE
	{
		struct SignalSemaphore BLock;	/* Die Signal Semaphore, welche vor Auslager Problemen schuetzt...*/
		struct HRBitMap *LinkBMap;		
	}	LockType;							/* Damit wird die BitMap Struktur (und der durch sie belegte Speicher
												** vor einer Veraenderung waehrend des Auslagerns geschuetzt.) */

	UWORD BytesPerRow;	/* Anzahl der Bytes um von einem Pixel, den naechsten Pixel eine Zeile
								** tiefer zu erreichen (Width aus HRScreen kann kleiner sein!) */
	UWORD Rows;				/* Anzahl der Zeilen */
	UWORD BitMapType;		/* Art des Hardware-Farbmodus der BitMap */
	UBYTE	BitMapFlags;	/* Diese Flags geben Auskunft ueber die Art der BitMap */
	UBYTE PixelModulo;	/* Bits um von einem Pixel zum naechsten zu gelangen:
								** (PixelModulo/8) = BytePerPixel in der Zeile (kann Bruchteil sein!)
								** Breite in Pixel = (BytesPerRow/PixelModulo)*8 (geht immer)
								**
								** PLANE		:	1 (auf planes achten) (Nicht bei Merlin!)
								** PACKED	:	1,2,4,8 (Domino nur 8)
								** MIXED		:	4 (auf Byte Packed BitPlane Data achten,
								**             da dieser Modus ganz SPEZIELL arbeitet)
								** XGA		:	16 (R:5 G:6 B:5) (Nicht bei Domino)
								** TARGA		:	16 (R:5 G:5 B:5)
								** RGB24		:	24 (R:8 G:8 B:8) (Nicht bei Domino)	*/
	UBYTE	*MemPtr[8];		/* Maximal 8 (Plane) Pointer
								**
								** PLANE 		:	0 oder 0-3 : wie Amiga BitPlanes (Nur Domino)
								** PACKED		:	0-7 (Je nach BitsPerPixel / sind aber alle gleich ;)
								** MIXED			:	0-3 (Zeigen jeweils auf x Plane Byte)
								** XGA			:	0 (1 Alpha Channel Daten 8 Bit)
								** TARGA			:	0 (1 Alpha Channel Daten 8 Bit)
								** RGB24			:	0 (1 Alpha Channel Daten 8 Bit) */
	UBYTE *BaseMem;		/* Hier steht die Auslager Adresse fuer den Screen
								** Wenn diese nicht gesetzt ist, so gilt die BitMap
								** als nicht verlagerbar und je nach Flags ist sie
								** im Kartenspeicher oder halt nicht (USE WITH CARE!) */
	ULONG ByteSize;		/* Number of Bytes in this BitMap */
	union
	{
		struct HRColorMap *ColorMap;	/* Points to hrh->ColorMap in Palette Modi */
		struct HRCLUT *CLUT;
	} ColCLUT;

	UBYTE *BankAddress;	/* PRIVATE! Adresse des ersten Bytes in der naechsten Bank */
	UBYTE RenderFlags;	/* Aus diesen Bits berechnet sich die RenderFunc.. */
	UBYTE Bank;				/* PRIVATE! Aktual BANK (Bit 0 for ZorroII 4MB/2 Banking) */
	UWORD	BankedLine;		/* PRIVATE! Zeile in der gebankt werden muss */
	UWORD	BankedByte;		/* PRIVATE! Offset des Bytes bei dem gebankt werden muss */
	UWORD	WordReserved;	/* PRIVATE! */
};

#define BLock			LockType.BLock
#define LinkBitMap	LockType.LinkMap
#define LinkLock		LockType.LinkMap->BLock

/* Definitionen fuer HRBitMap Type */

/* Bits Per Pixel in der BitMap (und Depth bei Planes)
**
** PLANE		:	1 und 4 (Nicht bei Merlin!)
** PACKED	:	1-8 (Domino nur 8)
** MIXED		:	4	(Byte Packed BitPlane Data)
** XGA		:	16 (R:5 G:6 B:5) (Nicht bei Domino)
** TARGA		:	15 (R:5 G:5 B:5)
** RGB24		:	24 (R:8 G:8 B:8) (Nicht bei Domino)
*/

#define HRBM_MODEMASK	0xFF00
#define HRBM_BITMASK		0x00FF

#define HRBM_PLANE	0	/* Nicht bei Merlin */
#define HRBM_PACKED	1
#define HRBM_MIXED	2
#define HRBM_XGA		3	/* Nicht bei Domino */
#define HRBM_TARGA	4
#define HRBM_RGB24	5	/* Nicht bei Domino */
#define HRBM_RGBOVL	6	/* z.Z. nicht implementiert */

#define HRCOL_PLANE4		(HRBM_PLANE<<8|4)		/* Nicht bei Merlin */
#define HRCOL_MIXED4		(HRBM_MIXED<<8|4)
#define HRCOL_PACKED1	(HRBM_PACKED<<8|1)	/* z.Z. nicht implementiert */
#define HRCOL_PACKED2	(HRBM_PACKED<<8|2)	/* z.Z. nicht implementiert */
#define HRCOL_PACKED4	(HRBM_PACKED<<8|4)	/* z.Z. nicht implementiert */
#define HRCOL_PACKED8	(HRBM_PACKED<<8|8)
#define HRCOL_TARGA		(HRBM_TARGA<<8|15)
#define HRCOL_XGA			(HRBM_XGA<<8|16)		/* Nicht bei Domino */
#define HRCOL_RGB24		(HRBM_RGB24<<8|24)	/* Nicht bei Domino */
#define HRCOL_RGBOVL		(HRBM_RGBOVL<<8|32)	/* z.Z. nicht implementiert */

/* This Definitions are not fully Clear... but nice ;) */

#define HRCOL_16Col		HRCOL_PLANE4			/* Obsolete */
#define HRCOL_256Col		HRCOL_PACKED8			/* Obsolete */
#define HRCOL_HiCol		HRCOL_TARGA				/* Obsolete */


/* This Definitions for advanced BitMap prozessing */

#define HRBRF_ALL			0xFF
#define HRBRB_DITHER		0	/* Dither Modus aktive, wird nur bei TARGA, XGA
									** und PACKED8 unterstuetzt. */

#define HRBRB_USERGBA	1	/* Wenn dieses Flags gesetzt ist, wird bei PACKED8
									** ein Farbwert fuer die HRGRenderLibrary als 24 Bit
									** Wert interpretiert
									** Bei den Funktionen, welche RGBA DATEN erwarten,
									** bewirkt dieses Flag, das die SOURCE Daten als
									** RGBA (ULONG) Daten erwartet werden (spez. fuer
									** hrWriteRect() einzusetzten (HRBRB_QUICKRGBA) */

#define HRBRB_USECLUT	2	/* Wenn dieses Flags gesetzt ist, wird bei Palettenlosen
									** Modi der Eintrag aus hrbm->CLUT bzw. hrbm->ColorMap
									** als Pseudo-Palette benutzt (HRBRB_USECMAP).
									** Bei Funktionen, welche RGBA DATEN erwarten, wird
									** bei gesetztem Flags eine ColorLookUp Table (z.B.
									** fuer GAMMA Korrektur) benutzt */

#define HRBRB_BANKED		3  /* Flag, welches gebankte BitMaps kennzeichnet !! */

#define HRBRF_DITHER		(1<<HRBRB_DITHER)
#define HRBRF_USERGBA	(1<<HRBRB_USERGBA)
#define HRBRF_USECLUT	(1<<HRBRB_USECLUT)
#define HRBRF_BANKED		(1<<HRBRB_BANKED)

/* Defines fuer doppelt benutzte Flags */

#define HRBRB_QUICKRGBA	HRBRB_USERGBA
#define HRBRF_QUICKRGBA	HRBRF_USERGBA
#define HRBRB_USECMAP	HRBRB_USECLUT
#define HRBRF_USECMAP	HRBRF_USECLUT

/* Definitionen fuer HRBitMap : Flags */

#define HRBFF_ALL			0xFF
#define HRBFB_LINKMAP	0	/* Diese BitMap ist an eine andere BitMap gelinked */
									/* Bei solchen BitMaps ist der BLock keine Signal-Semaphore,
									** sondern ein Zeiger auf die "Grund" BitMap. */
#define HRBFB_BLITABLE	1	/* Bitmap ist BLITBAR */
#define HRBFB_ACCABLE	2	/* Bitmap kann Hardware-Masken benutzen */
#define HRBFB_FAKEMAP	3	/* Bitmap ist NIEMALS SICHTBAR */

#define HRBFF_LINKMAP	(1<<HRBFB_LINKMAP)
#define HRBFF_BLITABLE	(1<<HRBFB_BLITABLE)
#define HRBFF_ACCABLE	(1<<HRBFB_ACCABLE)
#define HRBFF_FAKEMAP	(1<<HRBFB_FAKEMAP)
#endif

