1 /*
2  * gdiplusmetafile.h
3  *
4  * GDI+ Metafile class
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_METAFILE_H
24 #define __GDIPLUS_METAFILE_H
25 #if __GNUC__ >=3
26 #pragma GCC system_header
27 #endif
28 
29 #ifndef __cplusplus
30 #error "A C++ compiler is required to include gdiplusmetafile.h."
31 #endif
32 
33 class Metafile: public Image
34 {
35 public:
36 	static UINT EmfToWmfBits(HENHMETAFILE hEmf,
37 			UINT cbData16, LPBYTE pData16,
38 			INT iMapMode = MM_ANISOTROPIC,
39 			EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault)
40 	{
41 		return DllExports::GdipEmfToWmfBits(hEmf,
42 				cbData16, pData16, iMapMode, eFlags);
43 	}
GetMetafileHeader(const WCHAR * filename,MetafileHeader * header)44 	static Status GetMetafileHeader(const WCHAR *filename,
45 			MetafileHeader *header)
46 	{
47 		return DllExports::GdipGetMetafileHeaderFromFile(
48 				filename, header);
49 	}
GetMetafileHeader(IStream * stream,MetafileHeader * header)50 	static Status GetMetafileHeader(IStream *stream, MetafileHeader *header)
51 	{
52 		return DllExports::GdipGetMetafileHeaderFromStream(
53 				stream, header);
54 	}
55 	////TODO: Metafile::GetMetafileHeader
56 	//static Status GetMetafileHeader(HMETAFILE hWmf,
57 	//		const WmfPlaceableFileHeader *wmfPlaceableFileHeader,
58 	//		MetafileHeader *header)
59 	//{
60 	//	// WTF: No flat API to do this.
61 	//	return NotImplemented;
62 	//}
GetMetafileHeader(HENHMETAFILE hEmf,MetafileHeader * header)63 	static Status GetMetafileHeader(HENHMETAFILE hEmf,
64 			MetafileHeader *header)
65 	{
66 		return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
67 	}
68 
69 	Metafile(HMETAFILE hWmf,
70 			const WmfPlaceableFileHeader *wmfPlaceableFileHeader,
Image(NULL,Ok)71 			BOOL deleteWmf = FALSE): Image(NULL, Ok)
72 	{
73 		GpMetafile *nativeMetafile = NULL;
74 		lastStatus = DllExports::GdipCreateMetafileFromWmf(
75 				hWmf, deleteWmf, wmfPlaceableFileHeader,
76 				&nativeMetafile);
77 		nativeImage = nativeMetafile;
78 	}
Image(NULL,Ok)79 	Metafile(HENHMETAFILE hEmf, BOOL deleteEmf = FALSE): Image(NULL, Ok)
80 	{
81 		GpMetafile *nativeMetafile = NULL;
82 		lastStatus = DllExports::GdipCreateMetafileFromEmf(
83 				hEmf, deleteEmf, &nativeMetafile);
84 		nativeImage = nativeMetafile;
85 	}
Metafile(const WCHAR * filename)86 	Metafile(const WCHAR *filename): Image(NULL, Ok)
87 	{
88 		GpMetafile *nativeMetafile = NULL;
89 		lastStatus = DllExports::GdipCreateMetafileFromFile(
90 				filename, &nativeMetafile);
91 		nativeImage = nativeMetafile;
92 	}
Metafile(const WCHAR * filename,const WmfPlaceableFileHeader * wmfPlaceableFileHeader)93 	Metafile(const WCHAR *filename,
94 			const WmfPlaceableFileHeader *wmfPlaceableFileHeader):
95 			Image(NULL, Ok)
96 	{
97 		GpMetafile *nativeMetafile = NULL;
98 		lastStatus = DllExports::GdipCreateMetafileFromWmfFile(
99 				filename, wmfPlaceableFileHeader,
100 				&nativeMetafile);
101 		nativeImage = nativeMetafile;
102 	}
Metafile(IStream * stream)103 	Metafile(IStream *stream): Image(NULL, Ok)
104 	{
105 		GpMetafile *nativeMetafile = NULL;
106 		lastStatus = DllExports::GdipCreateMetafileFromStream(
107 				stream, &nativeMetafile);
108 		nativeImage = nativeMetafile;
109 	}
110 	Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)111 			const WCHAR *description = NULL): Image(NULL, Ok)
112 	{
113 		GpMetafile *nativeMetafile = NULL;
114 		lastStatus = DllExports::GdipRecordMetafile(
115 				referenceHdc, type, NULL, MetafileFrameUnitGdi,
116 				description, &nativeMetafile);
117 		nativeImage = nativeMetafile;
118 	}
119 	Metafile(HDC referenceHdc, const RectF& frameRect,
120 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
121 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)122 			const WCHAR *description = NULL): Image(NULL, Ok)
123 	{
124 		GpMetafile *nativeMetafile = NULL;
125 		lastStatus = DllExports::GdipRecordMetafile(
126 				referenceHdc, type, &frameRect, frameUnit,
127 				description, &nativeMetafile);
128 		nativeImage = nativeMetafile;
129 	}
130 	Metafile(HDC referenceHdc, const Rect& frameRect,
131 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
132 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)133 			const WCHAR *description = NULL): Image(NULL, Ok)
134 	{
135 		GpMetafile *nativeMetafile = NULL;
136 		lastStatus = DllExports::GdipRecordMetafileI(
137 				referenceHdc, type, &frameRect, frameUnit,
138 				description, &nativeMetafile);
139 		nativeImage = nativeMetafile;
140 	}
141 	Metafile(const WCHAR *filename, HDC referenceHdc,
142 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)143 			const WCHAR *description = NULL): Image(NULL, Ok)
144 	{
145 		GpMetafile *nativeMetafile = NULL;
146 		lastStatus = DllExports::GdipRecordMetafileFileName(
147 				filename, referenceHdc, type, NULL,
148 				MetafileFrameUnitGdi, description,
149 				&nativeMetafile);
150 		nativeImage = nativeMetafile;
151 	}
152 	Metafile(const WCHAR *filename, HDC referenceHdc,
153 			const RectF& frameRect,
154 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
155 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)156 			const WCHAR *description = NULL): Image(NULL, Ok)
157 	{
158 		GpMetafile *nativeMetafile = NULL;
159 		lastStatus = DllExports::GdipRecordMetafileFileName(
160 				filename, referenceHdc, type, &frameRect,
161 				frameUnit, description, &nativeMetafile);
162 		nativeImage = nativeMetafile;
163 	}
164 	Metafile(const WCHAR *filename, HDC referenceHdc,
165 			const Rect& frameRect,
166 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
167 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)168 			const WCHAR *description = NULL): Image(NULL, Ok)
169 	{
170 		GpMetafile *nativeMetafile = NULL;
171 		lastStatus = DllExports::GdipRecordMetafileFileNameI(
172 				filename, referenceHdc, type, &frameRect,
173 				frameUnit, description, &nativeMetafile);
174 		nativeImage = nativeMetafile;
175 	}
176 	Metafile(IStream *stream, HDC referenceHdc,
177 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)178 			const WCHAR *description = NULL): Image(NULL, Ok)
179 	{
180 		GpMetafile *nativeMetafile = NULL;
181 		lastStatus = DllExports::GdipRecordMetafileStream(
182 				stream, referenceHdc, type, NULL,
183 				MetafileFrameUnitGdi, description,
184 				&nativeMetafile);
185 		nativeImage = nativeMetafile;
186 	}
187 	Metafile(IStream *stream, HDC referenceHdc, const RectF& frameRect,
188 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
189 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)190 			const WCHAR *description = NULL): Image(NULL, Ok)
191 	{
192 		GpMetafile *nativeMetafile = NULL;
193 		lastStatus = DllExports::GdipRecordMetafileStream(
194 				stream, referenceHdc, type, &frameRect,
195 				frameUnit, description, &nativeMetafile);
196 		nativeImage = nativeMetafile;
197 	}
198 	Metafile(IStream *stream, HDC referenceHdc, const Rect& frameRect,
199 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
200 			EmfType type = EmfTypeEmfPlusDual,
Image(NULL,Ok)201 			const WCHAR *description = NULL): Image(NULL, Ok)
202 	{
203 		GpMetafile *nativeMetafile = NULL;
204 		lastStatus = DllExports::GdipRecordMetafileStreamI(
205 				stream, referenceHdc, type, &frameRect,
206 				frameUnit, description, &nativeMetafile);
207 		nativeImage = nativeMetafile;
208 	}
~Metafile()209 	virtual ~Metafile()
210 	{
211 	}
Clone()212 	virtual Metafile* Clone() const
213 	{
214 		GpImage *cloneImage = NULL;
215 		Status status = updateStatus(DllExports::GdipCloneImage(
216 				nativeImage, &cloneImage));
217 		if (status == Ok) {
218 			Metafile *result = new Metafile(cloneImage, lastStatus);
219 			if (!result) {
220 				DllExports::GdipDisposeImage(cloneImage);
221 				lastStatus = OutOfMemory;
222 			}
223 			return result;
224 		} else {
225 			return NULL;
226 		}
227 	}
228 
229 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
230 	//Status ConvertToEmfPlus(const Graphics *refGraphics,
231 	//		BOOL *conversionSuccess = NULL,
232 	//		EmfType emfType = EmfTypeEmfPlusOnly,
233 	//		const WCHAR *description = NULL)
234 	//{
235 	//	// FIXME: can't test GdipConvertToEmfPlus because it isn't exported in 1.0
236 	//	return updateStatus(DllExports::GdipConvertToEmfPlus(
237 	//			refGraphics ? refGraphics->nativeGraphics : NULL,
238 	//			(GpMetafile*) nativeImage,
239 	//			conversionSuccess, emfType, description, ???));
240 	//}
241 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
242 	//Status ConvertToEmfPlus(const Graphics *refGraphics,
243 	//		const WCHAR *filename,
244 	//		BOOL *conversionSuccess = NULL,
245 	//		EmfType emfType = EmfTypeEmfPlusOnly,
246 	//		const WCHAR *description = NULL)
247 	//{
248 	//	// FIXME: can't test GdipConvertToEmfPlusToFile because it isn't exported in 1.0
249 	//	return updateStatus(DllExports::GdipConvertToEmfPlusToFile(
250 	//			refGraphics ? refGraphics->nativeGraphics : NULL,
251 	//			(GpMetafile*) nativeImage, conversionSuccess,
252 	//			filename, emfType, description, ???));
253 	//}
254 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
255 	//Status ConvertToEmfPlus(const Graphics *refGraphics,
256 	//		IStream *stream,
257 	//		BOOL *conversionSuccess = NULL,
258 	//		EmfType emfType = EmfTypeEmfPlusOnly,
259 	//		const WCHAR *description = NULL)
260 	//{
261 	//	// FIXME: can't test GdipConvertToEmfPlusToStream because it isn't exported in 1.0
262 	//	return updateStatus(DllExports::GdipConvertToEmfPlusToStream(
263 	//			refGraphics ? refGraphics->nativeGraphics : NULL,
264 	//			(GpMetafile*) nativeImage, conversionSuccess,
265 	//			stream, emfType, description, ???));
266 	//}
GetDownLevelRasterizationLimit()267 	UINT GetDownLevelRasterizationLimit() const
268 	{
269 		UINT result = 0;
270 		updateStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
271 				(GpMetafile*) nativeImage, &result));
272 		return result;
273 	}
GetHENHMETAFILE()274 	HENHMETAFILE GetHENHMETAFILE()
275 	{
276 		HENHMETAFILE result = NULL;
277 		updateStatus(DllExports::GdipGetHemfFromMetafile(
278 				(GpMetafile*) nativeImage, &result));
279 		return result;
280 	}
GetMetafileHeader(MetafileHeader * header)281 	Status GetMetafileHeader(MetafileHeader *header) const
282 	{
283 		return updateStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
284 				(GpMetafile*) nativeImage, header));
285 	}
PlayRecord(EmfPlusRecordType recordType,UINT flags,UINT dataSize,const BYTE * data)286 	Status PlayRecord(EmfPlusRecordType recordType, UINT flags,
287 			UINT dataSize, const BYTE *data) const
288 	{
289 		return updateStatus(DllExports::GdipPlayMetafileRecord(
290 				(GpMetafile*) nativeImage,
291 				recordType, flags, dataSize, data));
292 	}
SetDownLevelRasterizationLimit(UINT limitDpi)293 	Status SetDownLevelRasterizationLimit(UINT limitDpi)
294 	{
295 		return updateStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
296 				(GpMetafile*) nativeImage, limitDpi));
297 	}
298 
299 private:
Metafile(GpImage * image,Status status)300 	Metafile(GpImage *image, Status status): Image(image, status) {}
301 	Metafile(const Metafile&);
302 	Metafile& operator=(const Metafile&);
303 };
304 
305 #endif /* __GDIPLUS_METAFILE_H */
306