|  | /* | 
|  | * 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 */ |