/*
**	Command & Conquer Generals Zero Hour(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	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 3 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, see <http://www.gnu.org/licenses/>.
*/

#ifndef _TARGA_H_
#define _TARGA_H_
/****************************************************************************
*
*         C O N F I D E N T I A L --- W E S T W O O D   S T U D I O S
*
*----------------------------------------------------------------------------
*
* FILE
*     Targa.h
* 
* DESCRIPTION
*     Targa image file class definitions.
*
* PROGRAMMER
*     Denzil E. Long, Jr.
*
* DATE
*     July 15, 1998
*
****************************************************************************/

#pragma pack(push, 1)

// If you wish to display loading error messages call targa functions inside of
// the following macro - for example TARGA_ERROR_HANDLER(targa.Open(filename, TGA_READMODE));
// The error code is returned back from the handler so it can be used in an expression.
long Targa_Error_Handler(long error_code,const char* filename);
#define TARGA_ERROR_HANDLER(call,filename) Targa_Error_Handler(call,filename)

/*---------------------------------------------------------------------------
 * STRUCTURES AND RELATED DEFINITIONS
 *-------------------------------------------------------------------------*/

/* TGAHeader - Targa Image File header.
 *
 * IDLength        - Size of Image ID field
 * ColorMapType    - Color map type.
 * ImageType       - Image type code.
 * CMapStart       - Color map origin.
 * CMapLength      - Color map length.
 * CMapDepth       - Depth of color map entries.
 * XOffset         - X origin of image.
 * YOffset         - Y origin of image.
 * Width           - Width of image.
 * Height          - Height of image.
 * PixelDepth      - Image pixel size
 * ImageDescriptor - Image descriptor byte.
 */
typedef struct _TGAHeader
	{
	char  IDLength;
	char  ColorMapType;
	char  ImageType;
	short CMapStart;
	short CMapLength;
	char  CMapDepth;
	short XOffset;
	short YOffset;
	short Width;
	short Height;
	char  PixelDepth;
	char  ImageDescriptor;
	} TGAHeader;

/* ImageType definiton */
#define TGA_NOIMAGE           0  /* No image data included in file */
#define TGA_CMAPPED           1  /* Color-mapped image data */
#define TGA_TRUECOLOR         2  /* Truecolor image data */
#define TGA_MONO              3  /* Monochrome image data */
#define TGA_CMAPPED_ENCODED   9  /* Color-mapped image data (Encoded) */
#define TGA_TRUECOLOR_ENCODED 10 /* Truecolor image data (Encoded) */
#define TGA_MONO_ENCODED      11 /* Monochrome image data (Encoded) */

/* ImageDescriptor definition */
#define TGAIDF_ATTRIB_BITS (0x0F<<0) /* Number of attribute bits per pixel */
#define TGAIDF_XORIGIN     (1<<4)
#define TGAIDF_YORIGIN     (1<<5)

/* Access modes. */
#define TGA_READMODE  0
#define TGA_WRITEMODE 1
#define TGA_RDWRMODE  2

/* Error codes */
#define TGAERR_OPEN         -1
#define TGAERR_READ         -2
#define TGAERR_WRITE        -3
#define TGAERR_SYNTAX       -4
#define TGAERR_NOMEM        -5
#define TGAERR_NOTSUPPORTED -6

/* Flags definitions */
#define TGAF_IMAGE    (1<<0)
#define TGAF_PAL      (1<<1)
#define TGAF_COMPRESS (1<<2)
#define TGAF_TGA2     (1<<3)

/* Macro definitions */
#define TGA_BytesPerPixel(a) ((a+7) >> 3)

/*---------------------------------------------------------------------------
 * TARGA 2.0 DEFINITIONS
 *-------------------------------------------------------------------------*/

#define TGA2_SIGNATURE "TRUEVISION-XFILE"

/* TGA2Footer - Targa 2.0 footer
 *
 * Extension - Offset to the Extension area from start of file.
 * Developer - Offset to the Developer area from start of file.
 * Signature - 16 byte Targa 2.0 signature "TRUEVISION-XFILE"
 * RsvdChar  - Reserved character, must be ASCII "." (period)
 * BZST      - Binary Zero String Terminator.
 */
typedef struct _TGA2Footer
	{
	long Extension;
	long Developer;
	char Signature[16];
	char RsvdChar;
	char BZST;
	_TGA2Footer() {}
	} TGA2Footer;

/* TGA2DateStamp - A series of 3 WORD values which define the integer value
 *                 for the date the image was saved.
 *
 * Month - Month number (1 - 12)
 * Day   - Day number (1 - 31)
 * Year  - Year number (4 digit, ie. 1989)
 */
typedef struct _TGA2DateStamp
	{
	short Month;
	short Day;
	short Year;
	} TGA2DateStamp;

/* TGA2TimeStamp - A series of 3 WORD values which define the integer value
 *                 for the time the image was saved.
 *
 * Hour   - Hour number, military time (0 - 23)
 * Minute - Minute number (0 - 59)
 * Second - Second number (0 - 59)
 */
typedef struct _TGA2TimeStamp
	{
	short Hour;
	short Minute;
	short Second;
	} TGA2TimeStamp;

/* TGA2SoftVer - Define the version of the software used to generate file.
 *
 * Number - Version number * 100
 * Letter - Version letter
 */
typedef struct _TGA2SoftVer
	{
	short Number;
	char  Letter;
	} TGA2SoftVer;

/* TGA2Ratio - Numerator and denominator which when taken together specify
 *             a ratio.
 *
 * Numer - Numerator
 * Denom - Denominator (a value of zero indicates no ratio specified)
 */
typedef struct _TGA2Ratio
	{
	short Numer;
	short Denom;
	} TGA2Ratio;

/* TGA2Extension - Extension area, provided for additional file information.
 *                 This data is pointed to by the Extension offset in the
 *                 TGA2Footer.
 *
 * ExtSize     - Extension area size. (495 bytes for 2.0)
 * AuthName    - Name of the person who created image (NULL terminated ASCII)
 * AuthComment - Comments of the author (NULL terminated ASCII)
 * DateStamp   - Date the file was created. (See TGA2DateStamp)
 * TimeStamp   - Time the file was created. (See TGA2TimeStamp)
 * JobName     - Name of job image belongs to (NULL terminated ASCII)
 * JobTime     - Elapsed time of the job.
 * SoftID      - ID of software used to create image (NULL terminated ASCII)
 * SoftVer     - Version number of software used.
 * KeyColor    - Tranparent color value.
 * Aspect      - Pixel aspect ratio.
 * Gamma       - Fractional gamma value.
 * ColorCor    - Color correction table offset.
 * PostStamp   - Postage stamp image offset.
 * ScanLine    - Scan line table offset.
 * Attributes  - Alpha channel attributes. (Set defines below)
 */
typedef struct _TGA2Extension
	{
	short         ExtSize;
	char          AuthName[41];
	char          AuthComment[324];
	TGA2DateStamp Date;
	TGA2TimeStamp Time;
	char          JobName[41];
	TGA2TimeStamp JobTime;
	char          SoftID[41];
	TGA2SoftVer   SoftVer;
	long          KeyColor;
	TGA2Ratio     Aspect;
	TGA2Ratio     Gamma;
	long          ColorCor;
	long          PostStamp;
	long          ScanLine;
	char          Attributes;
	} TGA2Extension;

/* Alpha channel attributes (Extension Area) */
#define EXTA_NOALPHA 0  /* No alpha data included */
#define EXTA_IGNORE  1  /* Undefined alpha data, can ignore */
#define EXTA_RETAIN  2  /* Undefined alpha data, should retain */
#define EXTA_USEFUL  3  /* Useful alpha channel */
#define EXTA_PREMULT 4  /* Pre-Multiplied alpha data */

#pragma pack(pop)

/*
** This define changes this code from code that works with standard IO calls,
** to code that uses FileClass and FileFactoryClass.
*/
//#define TGA_USES_WWLIB_FILE_CLASSES

#ifdef TGA_USES_WWLIB_FILE_CLASSES
class FileClass;
#endif

/*---------------------------------------------------------------------------
 * CLASS DEFINITION
 *-------------------------------------------------------------------------*/

class Targa
	{
	public:
		/* Constructor/destructor */
		Targa(void);
		~Targa();

		/* Function prototypes. */
		long Open(const char* name, long mode);
		void Close(void);

		long Load(const char* name, char* palette, char* image,bool invert_image=true);
		long Load(const char* name, long flags, bool invert_image=true);
		long Save(const char* name, long flags, bool addextension = false);
		
		void XFlip(void);
		void YFlip(void);

		char* SetImage(char* buffer);
		char* GetImage(void) const {return (mImage);}
		
		char* SetPalette(char* buffer);
		char* GetPalette(void) const {return (mPalette);}
		
		bool IsCompressed(void);

		TGA2Extension* GetExtension(void);

		TGAHeader Header;

	protected:
#ifdef TGA_USES_WWLIB_FILE_CLASSES
		FileClass *TGAFile;
#else
		long mFH;
#endif
		long mAccess;
		long mFlags;
		char* mImage;
		char* mPalette;
		TGA2Extension mExtension;

	private:
		// Utility functions
		long DecodeImage(void);
		long EncodeImage(void);
		void InvertImage(void);

		// These functions are for ease of ifdef'ing between standard io calls
		// and FileClass.
		void Clear_File(void);
		bool Is_File_Open(void);
		bool File_Open_Read(const char* name);
		bool File_Open_Write(const char* name);
		bool File_Open_ReadWrite(const char* name);
		int File_Seek(int pos, int dir);
		int File_Read(void *buffer, int size);
		int File_Write(void *buffer, int size);
	};

#endif /* _TARGA_H_ */