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