/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * Palette Allocator Definitions
 */

#ifndef TINSEL_PALETTE_H	// prevent multiple includes
#define TINSEL_PALETTE_H

#include "tinsel/dw.h"

namespace Tinsel {

typedef	uint32	COLORREF;

#define TINSEL_RGB(r,g,b)	((COLORREF)TO_32(((uint8)(r)|((uint16)(g)<<8))|(((uint32)(uint8)(b))<<16)))

#define TINSEL_GetRValue(rgb)	((uint8)(FROM_32(rgb)))
#define TINSEL_GetGValue(rgb)	((uint8)(((uint16)(FROM_32(rgb)))>>8))
#define TINSEL_GetBValue(rgb)	((uint8)((FROM_32(rgb))>>16))

#define TINSEL_PSX_RGB(r,g,b) ((uint16)(((uint8)(r))|((uint16)(g)<<5)|(((uint16)(b))<<10)))

enum {
	MAX_COLORS		= 256,	///< maximum number of colors - for VGA 256
	BITS_PER_PIXEL	= 8,	///< number of bits per pixel for VGA 256
	MAX_INTENSITY	= 255,	///< the biggest value R, G or B can have
	NUM_PALETTES	= 32,	///< number of palettes

	// Discworld has some fixed apportioned bits in the palette.
	BGND_DAC_INDEX	= 0,	///< index of background color in Video DAC
	FGND_DAC_INDEX	= 1,	///< index of first foreground color in Video DAC
	TBLUE1			= 228,	///< Blue used in translucent rectangles
	TBLUE2			= 229,	///< Blue used in translucent rectangles
	TBLUE3			= 230,	///< Blue used in translucent rectangles
	TBLUE4			= 231,	///< Blue used in translucent rectangles
	TALKFONT_COL	= 233
};

// some common colors

#define	BLACK	(TINSEL_RGB(0, 0, 0))
#define	WHITE	(TINSEL_RGB(MAX_INTENSITY, MAX_INTENSITY, MAX_INTENSITY))
#define	RED		(TINSEL_RGB(MAX_INTENSITY, 0, 0))
#define	GREEN	(TINSEL_RGB(0, MAX_INTENSITY, 0))
#define	BLUE	(TINSEL_RGB(0, 0, MAX_INTENSITY))
#define	YELLOW	(TINSEL_RGB(MAX_INTENSITY, MAX_INTENSITY, 0))
#define	MAGENTA	(TINSEL_RGB(MAX_INTENSITY, 0, MAX_INTENSITY))
#define	CYAN	(TINSEL_RGB(0, MAX_INTENSITY, MAX_INTENSITY))


#include "common/pack-start.h"	// START STRUCT PACKING

/** hardware palette structure */
struct PALETTE {
	int32 numColors;		///< number of colors in the palette
	COLORREF palRGB[MAX_COLORS];	///< actual palette colors
} PACKED_STRUCT;

#include "common/pack-end.h"	// END STRUCT PACKING


/** palette queue structure */
struct PALQ {
	SCNHANDLE hPal;		///< handle to palette data struct
	int objCount;		///< number of objects using this palette
	int posInDAC;		///< palette position in the video DAC
	int numColors;		///< number of colors in the palette
	// Discworld 2 fields
	bool bFading;		// Whether or not fading
	COLORREF palRGB[MAX_COLORS];	// actual palette colors
};

#define	PALETTE_MOVED	0x8000	// when this bit is set in the "posInDAC"
				// field - the palette entry has moved

// Translucent objects have NULL pPal
#define	HasPalMoved(pPal) (((pPal) != NULL) && ((pPal)->posInDAC & PALETTE_MOVED))


/*----------------------------------------------------------------------*\
|*			Palette Manager Function Prototypes		*|
\*----------------------------------------------------------------------*/

void ResetPalAllocator();	// wipe out all palettes

#ifdef	DEBUG
void PaletteStats();	// Shows the maximum number of palettes used at once
#endif

void psxPaletteMapper(PALQ *originalPal, uint8 *psxClut, byte *mapperTable); // Maps PSX CLUTs to original palette in resource file

void PalettesToVideoDAC();	// Update the video DAC with palettes currently in the DAC queue

void UpdateDACqueueHandle(
	int posInDAC,		// position in video DAC
	int numColors,		// number of colors in palette
	SCNHANDLE hPalette);	// handle to palette

void UpdateDACqueue(		// places a palette in the video DAC queue
	int posInDAC,		// position in video DAC
	int numColors,		// number of colors in palette
	COLORREF *pColors);	// list of RGB tripples

void UpdateDACqueue(int posInDAC, COLORREF color);

PALQ *AllocPalette(		// allocate a new palette
	SCNHANDLE hNewPal);	// palette to allocate

void FreePalette(		// free a palette allocated with "AllocPalette"
	PALQ *pFreePal);	// palette queue entry to free

PALQ *FindPalette(		// find a palette in the palette queue
	SCNHANDLE hSrchPal);	// palette to search for

void SwapPalette(		// swaps palettes at the specified palette queue position
	PALQ *pPalQ,		// palette queue position
	SCNHANDLE hNewPal);	// new palette

PALQ *GetNextPalette(		// returns the next palette in the queue
	PALQ *pStrtPal);	// queue position to start from - when NULL will start from beginning of queue

COLORREF GetBgndColor();	// returns current background color

void SetBgndColor(		// sets current background color
	COLORREF color);	// color to set the background to

void FadingPalette(PALQ *pPalQ, bool bFading);

void CreateTranslucentPalette(SCNHANDLE BackPal);

void NoFadingPalettes();	// All fading processes have just been killed

void DimPartPalette(
	SCNHANDLE hPal,
	int startColor,
	int length,
	int brightness);	// 0 = black, 10 == 100%


int TranslucentColor();

#define BoxColor TranslucentColor

int HighlightColor();

int TalkColor();

void SetTalkColorRef(COLORREF colRef);

COLORREF GetTalkColorRef();

void SetTagColorRef(COLORREF colRef);

COLORREF GetTagColorRef();

void SetTalkTextOffset(int offset);

void SetTranslucencyOffset(int offset);

} // End of namespace Tinsel

#endif	// TINSEL_PALETTE_H