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