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