| /* | 
 |  * gdiplusmetafile.h | 
 |  * | 
 |  * GDI+ Metafile class | 
 |  * | 
 |  * 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_METAFILE_H | 
 | #define __GDIPLUS_METAFILE_H | 
 | #if __GNUC__ >=3 | 
 | #pragma GCC system_header | 
 | #endif | 
 |  | 
 | #ifndef __cplusplus | 
 | #error "A C++ compiler is required to include gdiplusmetafile.h." | 
 | #endif | 
 |  | 
 | class Metafile: public Image | 
 | { | 
 | public: | 
 | 	static UINT EmfToWmfBits(HENHMETAFILE hEmf, | 
 | 			UINT cbData16, LPBYTE pData16, | 
 | 			INT iMapMode = MM_ANISOTROPIC, | 
 | 			EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault) | 
 | 	{ | 
 | 		return DllExports::GdipEmfToWmfBits(hEmf, | 
 | 				cbData16, pData16, iMapMode, eFlags); | 
 | 	} | 
 | 	static Status GetMetafileHeader(const WCHAR *filename, | 
 | 			MetafileHeader *header) | 
 | 	{ | 
 | 		return DllExports::GdipGetMetafileHeaderFromFile( | 
 | 				filename, header); | 
 | 	} | 
 | 	static Status GetMetafileHeader(IStream *stream, MetafileHeader *header) | 
 | 	{ | 
 | 		return DllExports::GdipGetMetafileHeaderFromStream( | 
 | 				stream, header); | 
 | 	} | 
 | 	////TODO: Metafile::GetMetafileHeader | 
 | 	//static Status GetMetafileHeader(HMETAFILE hWmf, | 
 | 	//		const WmfPlaceableFileHeader *wmfPlaceableFileHeader, | 
 | 	//		MetafileHeader *header) | 
 | 	//{ | 
 | 	//	// WTF: No flat API to do this. | 
 | 	//	return NotImplemented; | 
 | 	//} | 
 | 	static Status GetMetafileHeader(HENHMETAFILE hEmf, | 
 | 			MetafileHeader *header) | 
 | 	{ | 
 | 		return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header); | 
 | 	} | 
 |  | 
 | 	Metafile(HMETAFILE hWmf, | 
 | 			const WmfPlaceableFileHeader *wmfPlaceableFileHeader, | 
 | 			BOOL deleteWmf = FALSE): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipCreateMetafileFromWmf( | 
 | 				hWmf, deleteWmf, wmfPlaceableFileHeader, | 
 | 				&nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(HENHMETAFILE hEmf, BOOL deleteEmf = FALSE): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipCreateMetafileFromEmf( | 
 | 				hEmf, deleteEmf, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(const WCHAR *filename): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipCreateMetafileFromFile( | 
 | 				filename, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(const WCHAR *filename, | 
 | 			const WmfPlaceableFileHeader *wmfPlaceableFileHeader): | 
 | 			Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipCreateMetafileFromWmfFile( | 
 | 				filename, wmfPlaceableFileHeader, | 
 | 				&nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(IStream *stream): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipCreateMetafileFromStream( | 
 | 				stream, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafile( | 
 | 				referenceHdc, type, NULL, MetafileFrameUnitGdi, | 
 | 				description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(HDC referenceHdc, const RectF& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafile( | 
 | 				referenceHdc, type, &frameRect, frameUnit, | 
 | 				description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(HDC referenceHdc, const Rect& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileI( | 
 | 				referenceHdc, type, &frameRect, frameUnit, | 
 | 				description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(const WCHAR *filename, HDC referenceHdc, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileFileName( | 
 | 				filename, referenceHdc, type, NULL, | 
 | 				MetafileFrameUnitGdi, description, | 
 | 				&nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(const WCHAR *filename, HDC referenceHdc, | 
 | 			const RectF& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileFileName( | 
 | 				filename, referenceHdc, type, &frameRect, | 
 | 				frameUnit, description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(const WCHAR *filename, HDC referenceHdc, | 
 | 			const Rect& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileFileNameI( | 
 | 				filename, referenceHdc, type, &frameRect, | 
 | 				frameUnit, description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(IStream *stream, HDC referenceHdc, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileStream( | 
 | 				stream, referenceHdc, type, NULL, | 
 | 				MetafileFrameUnitGdi, description, | 
 | 				&nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(IStream *stream, HDC referenceHdc, const RectF& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileStream( | 
 | 				stream, referenceHdc, type, &frameRect, | 
 | 				frameUnit, description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	Metafile(IStream *stream, HDC referenceHdc, const Rect& frameRect, | 
 | 			MetafileFrameUnit frameUnit = MetafileFrameUnitGdi, | 
 | 			EmfType type = EmfTypeEmfPlusDual, | 
 | 			const WCHAR *description = NULL): Image(NULL, Ok) | 
 | 	{ | 
 | 		GpMetafile *nativeMetafile = NULL; | 
 | 		lastStatus = DllExports::GdipRecordMetafileStreamI( | 
 | 				stream, referenceHdc, type, &frameRect, | 
 | 				frameUnit, description, &nativeMetafile); | 
 | 		nativeImage = nativeMetafile; | 
 | 	} | 
 | 	virtual ~Metafile() | 
 | 	{ | 
 | 	} | 
 | 	virtual Metafile* Clone() const | 
 | 	{ | 
 | 		GpImage *cloneImage = NULL; | 
 | 		Status status = updateStatus(DllExports::GdipCloneImage( | 
 | 				nativeImage, &cloneImage)); | 
 | 		if (status == Ok) { | 
 | 			Metafile *result = new Metafile(cloneImage, lastStatus); | 
 | 			if (!result) { | 
 | 				DllExports::GdipDisposeImage(cloneImage); | 
 | 				lastStatus = OutOfMemory; | 
 | 			} | 
 | 			return result; | 
 | 		} else { | 
 | 			return NULL; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus | 
 | 	//Status ConvertToEmfPlus(const Graphics *refGraphics, | 
 | 	//		BOOL *conversionSuccess = NULL, | 
 | 	//		EmfType emfType = EmfTypeEmfPlusOnly, | 
 | 	//		const WCHAR *description = NULL) | 
 | 	//{ | 
 | 	//	// FIXME: can't test GdipConvertToEmfPlus because it isn't exported in 1.0 | 
 | 	//	return updateStatus(DllExports::GdipConvertToEmfPlus( | 
 | 	//			refGraphics ? refGraphics->nativeGraphics : NULL, | 
 | 	//			(GpMetafile*) nativeImage, | 
 | 	//			conversionSuccess, emfType, description, ???)); | 
 | 	//} | 
 | 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus | 
 | 	//Status ConvertToEmfPlus(const Graphics *refGraphics, | 
 | 	//		const WCHAR *filename, | 
 | 	//		BOOL *conversionSuccess = NULL, | 
 | 	//		EmfType emfType = EmfTypeEmfPlusOnly, | 
 | 	//		const WCHAR *description = NULL) | 
 | 	//{ | 
 | 	//	// FIXME: can't test GdipConvertToEmfPlusToFile because it isn't exported in 1.0 | 
 | 	//	return updateStatus(DllExports::GdipConvertToEmfPlusToFile( | 
 | 	//			refGraphics ? refGraphics->nativeGraphics : NULL, | 
 | 	//			(GpMetafile*) nativeImage, conversionSuccess, | 
 | 	//			filename, emfType, description, ???)); | 
 | 	//} | 
 | 	////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus | 
 | 	//Status ConvertToEmfPlus(const Graphics *refGraphics, | 
 | 	//		IStream *stream, | 
 | 	//		BOOL *conversionSuccess = NULL, | 
 | 	//		EmfType emfType = EmfTypeEmfPlusOnly, | 
 | 	//		const WCHAR *description = NULL) | 
 | 	//{ | 
 | 	//	// FIXME: can't test GdipConvertToEmfPlusToStream because it isn't exported in 1.0 | 
 | 	//	return updateStatus(DllExports::GdipConvertToEmfPlusToStream( | 
 | 	//			refGraphics ? refGraphics->nativeGraphics : NULL, | 
 | 	//			(GpMetafile*) nativeImage, conversionSuccess, | 
 | 	//			stream, emfType, description, ???)); | 
 | 	//} | 
 | 	UINT GetDownLevelRasterizationLimit() const | 
 | 	{ | 
 | 		UINT result = 0; | 
 | 		updateStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit( | 
 | 				(GpMetafile*) nativeImage, &result)); | 
 | 		return result; | 
 | 	} | 
 | 	HENHMETAFILE GetHENHMETAFILE() | 
 | 	{ | 
 | 		HENHMETAFILE result = NULL; | 
 | 		updateStatus(DllExports::GdipGetHemfFromMetafile( | 
 | 				(GpMetafile*) nativeImage, &result)); | 
 | 		return result; | 
 | 	} | 
 | 	Status GetMetafileHeader(MetafileHeader *header) const | 
 | 	{ | 
 | 		return updateStatus(DllExports::GdipGetMetafileHeaderFromMetafile( | 
 | 				(GpMetafile*) nativeImage, header)); | 
 | 	} | 
 | 	Status PlayRecord(EmfPlusRecordType recordType, UINT flags, | 
 | 			UINT dataSize, const BYTE *data) const | 
 | 	{ | 
 | 		return updateStatus(DllExports::GdipPlayMetafileRecord( | 
 | 				(GpMetafile*) nativeImage, | 
 | 				recordType, flags, dataSize, data)); | 
 | 	} | 
 | 	Status SetDownLevelRasterizationLimit(UINT limitDpi) | 
 | 	{ | 
 | 		return updateStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit( | 
 | 				(GpMetafile*) nativeImage, limitDpi)); | 
 | 	} | 
 |  | 
 | private: | 
 | 	Metafile(GpImage *image, Status status): Image(image, status) {} | 
 | 	Metafile(const Metafile&); | 
 | 	Metafile& operator=(const Metafile&); | 
 | }; | 
 |  | 
 | #endif /* __GDIPLUS_METAFILE_H */ |