gdiplusmetafile.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /*
  2. * gdiplusmetafile.h
  3. *
  4. * GDI+ Metafile class
  5. *
  6. * This file is part of the w32api package.
  7. *
  8. * Contributors:
  9. * Created by Markus Koenig <markus@stber-koenig.de>
  10. *
  11. * THIS SOFTWARE IS NOT COPYRIGHTED
  12. *
  13. * This source code is offered for use in the public domain. You may
  14. * use, modify or distribute it freely.
  15. *
  16. * This code is distributed in the hope that it will be useful but
  17. * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
  18. * DISCLAIMED. This includes but is not limited to warranties of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  20. *
  21. */
  22. #ifndef __GDIPLUS_METAFILE_H
  23. #define __GDIPLUS_METAFILE_H
  24. #if __GNUC__ >=3
  25. #pragma GCC system_header
  26. #endif
  27. #ifndef __cplusplus
  28. #error "A C++ compiler is required to include gdiplusmetafile.h."
  29. #endif
  30. class Metafile: public Image
  31. {
  32. public:
  33. static UINT EmfToWmfBits(HENHMETAFILE hEmf,
  34. UINT cbData16, LPBYTE pData16,
  35. INT iMapMode = MM_ANISOTROPIC,
  36. EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault)
  37. {
  38. return DllExports::GdipEmfToWmfBits(hEmf,
  39. cbData16, pData16, iMapMode, eFlags);
  40. }
  41. static Status GetMetafileHeader(const WCHAR *filename,
  42. MetafileHeader *header)
  43. {
  44. return DllExports::GdipGetMetafileHeaderFromFile(
  45. filename, header);
  46. }
  47. static Status GetMetafileHeader(IStream *stream, MetafileHeader *header)
  48. {
  49. return DllExports::GdipGetMetafileHeaderFromStream(
  50. stream, header);
  51. }
  52. ////TODO: Metafile::GetMetafileHeader
  53. //static Status GetMetafileHeader(HMETAFILE hWmf,
  54. // const WmfPlaceableFileHeader *wmfPlaceableFileHeader,
  55. // MetafileHeader *header)
  56. //{
  57. // // WTF: No flat API to do this.
  58. // return NotImplemented;
  59. //}
  60. static Status GetMetafileHeader(HENHMETAFILE hEmf,
  61. MetafileHeader *header)
  62. {
  63. return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
  64. }
  65. Metafile(HMETAFILE hWmf,
  66. const WmfPlaceableFileHeader *wmfPlaceableFileHeader,
  67. BOOL deleteWmf = FALSE): Image(NULL, Ok)
  68. {
  69. GpMetafile *nativeMetafile = NULL;
  70. lastStatus = DllExports::GdipCreateMetafileFromWmf(
  71. hWmf, deleteWmf, wmfPlaceableFileHeader,
  72. &nativeMetafile);
  73. nativeImage = nativeMetafile;
  74. }
  75. Metafile(HENHMETAFILE hEmf, BOOL deleteEmf = FALSE): Image(NULL, Ok)
  76. {
  77. GpMetafile *nativeMetafile = NULL;
  78. lastStatus = DllExports::GdipCreateMetafileFromEmf(
  79. hEmf, deleteEmf, &nativeMetafile);
  80. nativeImage = nativeMetafile;
  81. }
  82. Metafile(const WCHAR *filename): Image(NULL, Ok)
  83. {
  84. GpMetafile *nativeMetafile = NULL;
  85. lastStatus = DllExports::GdipCreateMetafileFromFile(
  86. filename, &nativeMetafile);
  87. nativeImage = nativeMetafile;
  88. }
  89. Metafile(const WCHAR *filename,
  90. const WmfPlaceableFileHeader *wmfPlaceableFileHeader):
  91. Image(NULL, Ok)
  92. {
  93. GpMetafile *nativeMetafile = NULL;
  94. lastStatus = DllExports::GdipCreateMetafileFromWmfFile(
  95. filename, wmfPlaceableFileHeader,
  96. &nativeMetafile);
  97. nativeImage = nativeMetafile;
  98. }
  99. Metafile(IStream *stream): Image(NULL, Ok)
  100. {
  101. GpMetafile *nativeMetafile = NULL;
  102. lastStatus = DllExports::GdipCreateMetafileFromStream(
  103. stream, &nativeMetafile);
  104. nativeImage = nativeMetafile;
  105. }
  106. Metafile(HDC referenceHdc, EmfType type = EmfTypeEmfPlusDual,
  107. const WCHAR *description = NULL): Image(NULL, Ok)
  108. {
  109. GpMetafile *nativeMetafile = NULL;
  110. lastStatus = DllExports::GdipRecordMetafile(
  111. referenceHdc, type, NULL, MetafileFrameUnitGdi,
  112. description, &nativeMetafile);
  113. nativeImage = nativeMetafile;
  114. }
  115. Metafile(HDC referenceHdc, const RectF& frameRect,
  116. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  117. EmfType type = EmfTypeEmfPlusDual,
  118. const WCHAR *description = NULL): Image(NULL, Ok)
  119. {
  120. GpMetafile *nativeMetafile = NULL;
  121. lastStatus = DllExports::GdipRecordMetafile(
  122. referenceHdc, type, &frameRect, frameUnit,
  123. description, &nativeMetafile);
  124. nativeImage = nativeMetafile;
  125. }
  126. Metafile(HDC referenceHdc, const Rect& frameRect,
  127. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  128. EmfType type = EmfTypeEmfPlusDual,
  129. const WCHAR *description = NULL): Image(NULL, Ok)
  130. {
  131. GpMetafile *nativeMetafile = NULL;
  132. lastStatus = DllExports::GdipRecordMetafileI(
  133. referenceHdc, type, &frameRect, frameUnit,
  134. description, &nativeMetafile);
  135. nativeImage = nativeMetafile;
  136. }
  137. Metafile(const WCHAR *filename, HDC referenceHdc,
  138. EmfType type = EmfTypeEmfPlusDual,
  139. const WCHAR *description = NULL): Image(NULL, Ok)
  140. {
  141. GpMetafile *nativeMetafile = NULL;
  142. lastStatus = DllExports::GdipRecordMetafileFileName(
  143. filename, referenceHdc, type, NULL,
  144. MetafileFrameUnitGdi, description,
  145. &nativeMetafile);
  146. nativeImage = nativeMetafile;
  147. }
  148. Metafile(const WCHAR *filename, HDC referenceHdc,
  149. const RectF& frameRect,
  150. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  151. EmfType type = EmfTypeEmfPlusDual,
  152. const WCHAR *description = NULL): Image(NULL, Ok)
  153. {
  154. GpMetafile *nativeMetafile = NULL;
  155. lastStatus = DllExports::GdipRecordMetafileFileName(
  156. filename, referenceHdc, type, &frameRect,
  157. frameUnit, description, &nativeMetafile);
  158. nativeImage = nativeMetafile;
  159. }
  160. Metafile(const WCHAR *filename, HDC referenceHdc,
  161. const Rect& frameRect,
  162. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  163. EmfType type = EmfTypeEmfPlusDual,
  164. const WCHAR *description = NULL): Image(NULL, Ok)
  165. {
  166. GpMetafile *nativeMetafile = NULL;
  167. lastStatus = DllExports::GdipRecordMetafileFileNameI(
  168. filename, referenceHdc, type, &frameRect,
  169. frameUnit, description, &nativeMetafile);
  170. nativeImage = nativeMetafile;
  171. }
  172. Metafile(IStream *stream, HDC referenceHdc,
  173. EmfType type = EmfTypeEmfPlusDual,
  174. const WCHAR *description = NULL): Image(NULL, Ok)
  175. {
  176. GpMetafile *nativeMetafile = NULL;
  177. lastStatus = DllExports::GdipRecordMetafileStream(
  178. stream, referenceHdc, type, NULL,
  179. MetafileFrameUnitGdi, description,
  180. &nativeMetafile);
  181. nativeImage = nativeMetafile;
  182. }
  183. Metafile(IStream *stream, HDC referenceHdc, const RectF& frameRect,
  184. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  185. EmfType type = EmfTypeEmfPlusDual,
  186. const WCHAR *description = NULL): Image(NULL, Ok)
  187. {
  188. GpMetafile *nativeMetafile = NULL;
  189. lastStatus = DllExports::GdipRecordMetafileStream(
  190. stream, referenceHdc, type, &frameRect,
  191. frameUnit, description, &nativeMetafile);
  192. nativeImage = nativeMetafile;
  193. }
  194. Metafile(IStream *stream, HDC referenceHdc, const Rect& frameRect,
  195. MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
  196. EmfType type = EmfTypeEmfPlusDual,
  197. const WCHAR *description = NULL): Image(NULL, Ok)
  198. {
  199. GpMetafile *nativeMetafile = NULL;
  200. lastStatus = DllExports::GdipRecordMetafileStreamI(
  201. stream, referenceHdc, type, &frameRect,
  202. frameUnit, description, &nativeMetafile);
  203. nativeImage = nativeMetafile;
  204. }
  205. virtual ~Metafile()
  206. {
  207. }
  208. virtual Metafile* Clone() const
  209. {
  210. GpImage *cloneImage = NULL;
  211. Status status = updateStatus(DllExports::GdipCloneImage(
  212. nativeImage, &cloneImage));
  213. if (status == Ok) {
  214. Metafile *result = new Metafile(cloneImage, lastStatus);
  215. if (!result) {
  216. DllExports::GdipDisposeImage(cloneImage);
  217. lastStatus = OutOfMemory;
  218. }
  219. return result;
  220. } else {
  221. return NULL;
  222. }
  223. }
  224. ////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
  225. //Status ConvertToEmfPlus(const Graphics *refGraphics,
  226. // BOOL *conversionSuccess = NULL,
  227. // EmfType emfType = EmfTypeEmfPlusOnly,
  228. // const WCHAR *description = NULL)
  229. //{
  230. // // FIXME: can't test GdipConvertToEmfPlus because it isn't exported in 1.0
  231. // return updateStatus(DllExports::GdipConvertToEmfPlus(
  232. // refGraphics ? refGraphics->nativeGraphics : NULL,
  233. // (GpMetafile*) nativeImage,
  234. // conversionSuccess, emfType, description, ???));
  235. //}
  236. ////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
  237. //Status ConvertToEmfPlus(const Graphics *refGraphics,
  238. // const WCHAR *filename,
  239. // BOOL *conversionSuccess = NULL,
  240. // EmfType emfType = EmfTypeEmfPlusOnly,
  241. // const WCHAR *description = NULL)
  242. //{
  243. // // FIXME: can't test GdipConvertToEmfPlusToFile because it isn't exported in 1.0
  244. // return updateStatus(DllExports::GdipConvertToEmfPlusToFile(
  245. // refGraphics ? refGraphics->nativeGraphics : NULL,
  246. // (GpMetafile*) nativeImage, conversionSuccess,
  247. // filename, emfType, description, ???));
  248. //}
  249. ////TODO: [GDI+ 1.1] Metafile::ConvertToEmfPlus
  250. //Status ConvertToEmfPlus(const Graphics *refGraphics,
  251. // IStream *stream,
  252. // BOOL *conversionSuccess = NULL,
  253. // EmfType emfType = EmfTypeEmfPlusOnly,
  254. // const WCHAR *description = NULL)
  255. //{
  256. // // FIXME: can't test GdipConvertToEmfPlusToStream because it isn't exported in 1.0
  257. // return updateStatus(DllExports::GdipConvertToEmfPlusToStream(
  258. // refGraphics ? refGraphics->nativeGraphics : NULL,
  259. // (GpMetafile*) nativeImage, conversionSuccess,
  260. // stream, emfType, description, ???));
  261. //}
  262. UINT GetDownLevelRasterizationLimit() const
  263. {
  264. UINT result = 0;
  265. updateStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
  266. (GpMetafile*) nativeImage, &result));
  267. return result;
  268. }
  269. HENHMETAFILE GetHENHMETAFILE()
  270. {
  271. HENHMETAFILE result = NULL;
  272. updateStatus(DllExports::GdipGetHemfFromMetafile(
  273. (GpMetafile*) nativeImage, &result));
  274. return result;
  275. }
  276. Status GetMetafileHeader(MetafileHeader *header) const
  277. {
  278. return updateStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
  279. (GpMetafile*) nativeImage, header));
  280. }
  281. Status PlayRecord(EmfPlusRecordType recordType, UINT flags,
  282. UINT dataSize, const BYTE *data) const
  283. {
  284. return updateStatus(DllExports::GdipPlayMetafileRecord(
  285. (GpMetafile*) nativeImage,
  286. recordType, flags, dataSize, data));
  287. }
  288. Status SetDownLevelRasterizationLimit(UINT limitDpi)
  289. {
  290. return updateStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
  291. (GpMetafile*) nativeImage, limitDpi));
  292. }
  293. private:
  294. Metafile(GpImage *image, Status status): Image(image, status) {}
  295. Metafile(const Metafile&);
  296. Metafile& operator=(const Metafile&);
  297. };
  298. #endif /* __GDIPLUS_METAFILE_H */