• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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:
GetBoundsMetafileHeader96 	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 	}
GetDpiXMetafileHeader106 	REAL GetDpiX() const
107 	{
108 		return DpiX;
109 	}
GetDpiYMetafileHeader110 	REAL GetDpiY() const
111 	{
112 		return DpiY;
113 	}
GetEmfHeaderMetafileHeader114 	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 	}
GetEmfPlusFlagsMetafileHeader127 	UINT GetEmfPlusFlags() const
128 	{
129 		return EmfPlusFlags;
130 	}
GetMetafileSizeMetafileHeader131 	UINT GetMetafileSize() const
132 	{
133 		return Size;
134 	}
GetTypeMetafileHeader135 	MetafileType GetType() const
136 	{
137 		return Type;
138 	}
GetVersionMetafileHeader139 	UINT GetVersion() const
140 	{
141 		return Version;
142 	}
GetWmfHeaderMetafileHeader143 	const METAHEADER* GetWmfHeader() const
144 	{
145 		if (Type == MetafileTypeWmf || Type == MetafileTypeWmfPlaceable)
146 		{
147 			return &WmfHeader;
148 		}
149 		else
150 		{
151 			return NULL;
152 		}
153 	}
IsDisplayMetafileHeader154 	BOOL IsDisplay() const
155 	{
156 		return EmfPlusFlags == GDIP_EMFPLUSFLAGS_DISPLAY;
157 	}
IsEmfMetafileHeader158 	BOOL IsEmf() const
159 	{
160 		return Type == MetafileTypeEmf;
161 	}
IsEmfOrEmfPlusMetafileHeader162 	BOOL IsEmfOrEmfPlus() const
163 	{
164 		return Type == MetafileTypeEmf
165 			|| Type == MetafileTypeEmfPlusOnly
166 			|| Type == MetafileTypeEmfPlusDual;
167 	}
IsEmfPlusMetafileHeader168 	BOOL IsEmfPlus() const
169 	{
170 		return Type == MetafileTypeEmfPlusOnly
171 			|| Type == MetafileTypeEmfPlusDual;
172 	}
IsEmfPlusDualMetafileHeader173 	BOOL IsEmfPlusDual() const
174 	{
175 		return Type == MetafileTypeEmfPlusDual;
176 	}
IsEmfPlusOnlyMetafileHeader177 	BOOL IsEmfPlusOnly() const
178 	{
179 		return Type == MetafileTypeEmfPlusOnly;
180 	}
IsWmfMetafileHeader181 	BOOL IsWmf() const
182 	{
183 		return Type == MetafileTypeWmf
184 			|| Type == MetafileTypeWmfPlaceable;
185 	}
IsWmfPlaceableMetafileHeader186 	BOOL IsWmfPlaceable() const
187 	{
188 		return Type == MetafileTypeWmfPlaceable;
189 	}
190 	#endif
191 } MetafileHeader;
192 
193 #endif /* __GDIPLUS_METAHEADER_H */
194