/*
 * gdiplusmetaheader.h
 *
 * GDI+ metafile header structure
 *
 * This file is part of the w32api package.
 *
 * Contributors:
 *   Created by Markus Koenig <markus@stber-koenig.de>
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef __GDIPLUS_METAHEADER_H
#define __GDIPLUS_METAHEADER_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif


/*
 * FIXME: is 1 the correct value for GDIP_EMFPLUSFLAGS_DISPLAY? This number
 * has been determined by calling Metafile::GetMetafileHeader() on a EMF+
 * metafile which was recorded on a display device context (SampleMetafile.emf).
 */
#ifdef __cplusplus
const UINT GDIP_EMFPLUSFLAGS_DISPLAY = 1;
#else
#define GDIP_EMFPLUSFLAGS_DISPLAY ((UINT) 1)
#endif

typedef struct tagENHMETAHEADER3 {
	DWORD iType;
	DWORD nSize;
	RECTL rclBounds;
	RECTL rclFrame;
	DWORD dSignature;
	DWORD nVersion;
	DWORD nBytes;
	DWORD nRecords;
	WORD nHandles;
	WORD sReserved;
	DWORD nDescription;
	DWORD offDescription;
	DWORD nPalEntries;
	SIZEL szlDevice;
	SIZEL szlMillimeters;
} ENHMETAHEADER3,*LPENHMETAHEADER3;

typedef struct PWMFRect16 {
	INT16 Left;
	INT16 Top;
	INT16 Right;
	INT16 Bottom;
} PWMFRect16;

typedef struct WmfPlaceableFileHeader {
	UINT32 Key;
	INT16 Hmf;
	PWMFRect16 BoundingBox;
	INT16 Inch;
	UINT32 Reserved;
	INT16 Checksum;
} WmfPlaceableFileHeader;

typedef struct MetafileHeader {
	MetafileType Type;
	UINT Size;
	UINT Version;
	UINT EmfPlusFlags;
	REAL DpiX;
	REAL DpiY;
	INT X;
	INT Y;
	INT Width;
	INT Height;
	__extension__ union {
		METAHEADER WmfHeader;
		ENHMETAHEADER3 EmfHeader;
	};
	INT EmfPlusHeaderSize;
	INT LogicalDpiX;
	INT LogicalDpiY;

	#ifdef __cplusplus
	public:
	void GetBounds(Rect *rect) const
	{
		if (rect)
		{
			rect->X = X;
			rect->Y = Y;
			rect->Width = Width;
			rect->Height = Height;
		}
	}
	REAL GetDpiX() const
	{
		return DpiX;
	}
	REAL GetDpiY() const
	{
		return DpiY;
	}
	const ENHMETAHEADER3* GetEmfHeader() const
	{
		if (Type == MetafileTypeEmf
				|| Type == MetafileTypeEmfPlusOnly
				|| Type == MetafileTypeEmfPlusDual)
		{
			return &EmfHeader;
		}
		else
		{
			return NULL;
		}
	}
	UINT GetEmfPlusFlags() const
	{
		return EmfPlusFlags;
	}
	UINT GetMetafileSize() const
	{
		return Size;
	}
	MetafileType GetType() const
	{
		return Type;
	}
	UINT GetVersion() const
	{
		return Version;
	}
	const METAHEADER* GetWmfHeader() const
	{
		if (Type == MetafileTypeWmf || Type == MetafileTypeWmfPlaceable)
		{
			return &WmfHeader;
		}
		else
		{
			return NULL;
		}
	}
	BOOL IsDisplay() const
	{
		return EmfPlusFlags == GDIP_EMFPLUSFLAGS_DISPLAY;
	}
	BOOL IsEmf() const
	{
		return Type == MetafileTypeEmf;
	}
	BOOL IsEmfOrEmfPlus() const
	{
		return Type == MetafileTypeEmf
			|| Type == MetafileTypeEmfPlusOnly
			|| Type == MetafileTypeEmfPlusDual;
	}
	BOOL IsEmfPlus() const
	{
		return Type == MetafileTypeEmfPlusOnly
			|| Type == MetafileTypeEmfPlusDual;
	}
	BOOL IsEmfPlusDual() const
	{
		return Type == MetafileTypeEmfPlusDual;
	}
	BOOL IsEmfPlusOnly() const
	{
		return Type == MetafileTypeEmfPlusOnly;
	}
	BOOL IsWmf() const
	{
		return Type == MetafileTypeWmf
			|| Type == MetafileTypeWmfPlaceable;
	}
	BOOL IsWmfPlaceable() const
	{
		return Type == MetafileTypeWmfPlaceable;
	}
	#endif
} MetafileHeader;

#endif /* __GDIPLUS_METAHEADER_H */