//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Methods relating to saving + loading PSD files (photoshop)
//
// $NoKeywords: $
//===========================================================================//

#ifndef PSD_H
#define PSD_H

#ifdef _WIN32
#pragma once
#endif

#include "bitmap/imageformat.h" //ImageFormat enum definition

//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CUtlBuffer;
struct Bitmap_t;

class PSDImageResources
{
public:
	enum Resource {
		eResFileInfo = 0x0404
	};

	struct ResElement {
		Resource		m_eType;
		// unsigned char	m_pReserved[4];
		unsigned short	m_numBytes;
		unsigned char const *m_pvData;
	};

public:
	explicit PSDImageResources( unsigned int numBytes, unsigned char const *pvBuffer ) : m_numBytes( numBytes ), m_pvBuffer( pvBuffer ) {}

public:
	ResElement FindElement( Resource eType ) const;

protected:
	unsigned int			m_numBytes;
	unsigned char const *	m_pvBuffer;
};

class PSDResFileInfo
{
public:
	enum ResFileInfo {
		eTitle					= 0x05,
		eAuthor					= 0x50,
		eAuthorTitle			= 0x55,
		eDescription			= 0x78,
		eDescriptionWriter		= 0x7A,
		eKeywords				= 0x19,
		eCopyrightNotice		= 0x74
	};

	struct ResFileInfoElement {
		ResFileInfo			m_eType;
		unsigned short		m_numBytes;
		unsigned char const *m_pvData;
	};

public:
	explicit PSDResFileInfo( PSDImageResources::ResElement res ) : m_res( res ) {}

public:
	ResFileInfoElement FindElement( ResFileInfo eType ) const;

protected:
	PSDImageResources::ResElement m_res;
};


//-----------------------------------------------------------------------------
// Is a file a PSD file?
//-----------------------------------------------------------------------------
bool IsPSDFile( const char *pFileName, const char *pPathID );
bool IsPSDFile( CUtlBuffer &buf );


//-----------------------------------------------------------------------------
// Returns information about the PSD file
//-----------------------------------------------------------------------------
bool PSDGetInfo( const char *pFileName, const char *pPathID, int *pWidth, int *pHeight, ImageFormat *pImageFormat, float *pSourceGamma );
bool PSDGetInfo( CUtlBuffer &buf, int *pWidth, int *pHeight, ImageFormat *pImageFormat, float *pSourceGamma );


//-----------------------------------------------------------------------------
// Get PSD file image resources, pointers refer into the utlbuffer
//-----------------------------------------------------------------------------
PSDImageResources PSDGetImageResources( CUtlBuffer &buf );


//-----------------------------------------------------------------------------
// Reads the PSD file into the specified buffer
//-----------------------------------------------------------------------------
bool PSDReadFileRGBA8888( CUtlBuffer &buf, Bitmap_t &bitmap );
bool PSDReadFileRGBA8888( const char *pFileName, const char *pPathID, Bitmap_t &bitmap );


#endif // PSD_H