Home | History | Annotate | Download | only in gdiplus
      1 /*
      2  * gdiplusmetaheader.h
      3  *
      4  * GDI+ metafile header structure
      5  *
      6  * This file is part of the w32api package.
      7  *
      8  * Contributors:
      9  *   Created by Markus Koenig <markus (at) stber-koenig.de>
     10  *
     11  * THIS SOFTWARE IS NOT COPYRIGHTED
     12  *
     13  * This source code is offered for use in the public domain. You may
     14  * use, modify or distribute it freely.
     15  *
     16  * This code is distributed in the hope that it will be useful but
     17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
     18  * DISCLAIMED. This includes but is not limited to warranties of
     19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     20  *
     21  */
     22 
     23 #ifndef __GDIPLUS_METAHEADER_H
     24 #define __GDIPLUS_METAHEADER_H
     25 #if __GNUC__ >=3
     26 #pragma GCC system_header
     27 #endif
     28 
     29 
     30 /*
     31  * FIXME: is 1 the correct value for GDIP_EMFPLUSFLAGS_DISPLAY? This number
     32  * has been determined by calling Metafile::GetMetafileHeader() on a EMF+
     33  * metafile which was recorded on a display device context (SampleMetafile.emf).
     34  */
     35 #ifdef __cplusplus
     36 const UINT GDIP_EMFPLUSFLAGS_DISPLAY = 1;
     37 #else
     38 #define GDIP_EMFPLUSFLAGS_DISPLAY ((UINT) 1)
     39 #endif
     40 
     41 typedef struct tagENHMETAHEADER3 {
     42 	DWORD iType;
     43 	DWORD nSize;
     44 	RECTL rclBounds;
     45 	RECTL rclFrame;
     46 	DWORD dSignature;
     47 	DWORD nVersion;
     48 	DWORD nBytes;
     49 	DWORD nRecords;
     50 	WORD nHandles;
     51 	WORD sReserved;
     52 	DWORD nDescription;
     53 	DWORD offDescription;
     54 	DWORD nPalEntries;
     55 	SIZEL szlDevice;
     56 	SIZEL szlMillimeters;
     57 } ENHMETAHEADER3,*LPENHMETAHEADER3;
     58 
     59 typedef struct PWMFRect16 {
     60 	INT16 Left;
     61 	INT16 Top;
     62 	INT16 Right;
     63 	INT16 Bottom;
     64 } PWMFRect16;
     65 
     66 typedef struct WmfPlaceableFileHeader {
     67 	UINT32 Key;
     68 	INT16 Hmf;
     69 	PWMFRect16 BoundingBox;
     70 	INT16 Inch;
     71 	UINT32 Reserved;
     72 	INT16 Checksum;
     73 } WmfPlaceableFileHeader;
     74 
     75 typedef struct MetafileHeader {
     76 	MetafileType Type;
     77 	UINT Size;
     78 	UINT Version;
     79 	UINT EmfPlusFlags;
     80 	REAL DpiX;
     81 	REAL DpiY;
     82 	INT X;
     83 	INT Y;
     84 	INT Width;
     85 	INT Height;
     86 	__extension__ union {
     87 		METAHEADER WmfHeader;
     88 		ENHMETAHEADER3 EmfHeader;
     89 	};
     90 	INT EmfPlusHeaderSize;
     91 	INT LogicalDpiX;
     92 	INT LogicalDpiY;
     93 
     94 	#ifdef __cplusplus
     95 	public:
     96 	void GetBounds(Rect *rect) const
     97 	{
     98 		if (rect)
     99 		{
    100 			rect->X = X;
    101 			rect->Y = Y;
    102 			rect->Width = Width;
    103 			rect->Height = Height;
    104 		}
    105 	}
    106 	REAL GetDpiX() const
    107 	{
    108 		return DpiX;
    109 	}
    110 	REAL GetDpiY() const
    111 	{
    112 		return DpiY;
    113 	}
    114 	const ENHMETAHEADER3* GetEmfHeader() const
    115 	{
    116 		if (Type == MetafileTypeEmf
    117 				|| Type == MetafileTypeEmfPlusOnly
    118 				|| Type == MetafileTypeEmfPlusDual)
    119 		{
    120 			return &EmfHeader;
    121 		}
    122 		else
    123 		{
    124 			return NULL;
    125 		}
    126 	}
    127 	UINT GetEmfPlusFlags() const
    128 	{
    129 		return EmfPlusFlags;
    130 	}
    131 	UINT GetMetafileSize() const
    132 	{
    133 		return Size;
    134 	}
    135 	MetafileType GetType() const
    136 	{
    137 		return Type;
    138 	}
    139 	UINT GetVersion() const
    140 	{
    141 		return Version;
    142 	}
    143 	const METAHEADER* GetWmfHeader() const
    144 	{
    145 		if (Type == MetafileTypeWmf || Type == MetafileTypeWmfPlaceable)
    146 		{
    147 			return &WmfHeader;
    148 		}
    149 		else
    150 		{
    151 			return NULL;
    152 		}
    153 	}
    154 	BOOL IsDisplay() const
    155 	{
    156 		return EmfPlusFlags == GDIP_EMFPLUSFLAGS_DISPLAY;
    157 	}
    158 	BOOL IsEmf() const
    159 	{
    160 		return Type == MetafileTypeEmf;
    161 	}
    162 	BOOL IsEmfOrEmfPlus() const
    163 	{
    164 		return Type == MetafileTypeEmf
    165 			|| Type == MetafileTypeEmfPlusOnly
    166 			|| Type == MetafileTypeEmfPlusDual;
    167 	}
    168 	BOOL IsEmfPlus() const
    169 	{
    170 		return Type == MetafileTypeEmfPlusOnly
    171 			|| Type == MetafileTypeEmfPlusDual;
    172 	}
    173 	BOOL IsEmfPlusDual() const
    174 	{
    175 		return Type == MetafileTypeEmfPlusDual;
    176 	}
    177 	BOOL IsEmfPlusOnly() const
    178 	{
    179 		return Type == MetafileTypeEmfPlusOnly;
    180 	}
    181 	BOOL IsWmf() const
    182 	{
    183 		return Type == MetafileTypeWmf
    184 			|| Type == MetafileTypeWmfPlaceable;
    185 	}
    186 	BOOL IsWmfPlaceable() const
    187 	{
    188 		return Type == MetafileTypeWmfPlaceable;
    189 	}
    190 	#endif
    191 } MetafileHeader;
    192 
    193 #endif /* __GDIPLUS_METAHEADER_H */
    194