1/**************************************************************************\
2*
3* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
4*
5* Module Name:
6*
7*   GdiplusMetafile.h
8*
9* Abstract:
10*
11*   Metafile related declarations
12*
13\**************************************************************************/
14
15#ifndef _GDIPLUSMETAFILE_H
16#define _GDIPLUSMETAFILE_H
17
18class Metafile : public Image
19{
20public:
21    friend class Image;
22
23    // Read a metafile
24    Metafile()
25    {
26        SetNativeImage(NULL);
27        lastResult = Ok;
28    }
29
30    // Playback a metafile from a HMETAFILE
31    // If deleteWmf is TRUE, then when the metafile is deleted,
32    // the hWmf will also be deleted.  Otherwise, it won't be.
33    Metafile(IN HMETAFILE hWmf,
34             IN const APMFileHeader * apmFileHeader,
35             IN BOOL deleteWmf = FALSE)
36    {
37        GpMetafile *    metafile = NULL;
38
39        lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);
40
41        SetNativeImage(metafile);
42    }
43
44    // Playback a metafile from a HENHMETAFILE
45    // If deleteEmf is TRUE, then when the metafile is deleted,
46    // the hEmf will also be deleted.  Otherwise, it won't be.
47    Metafile(IN HENHMETAFILE hEmf,
48             IN BOOL deleteEmf = FALSE)
49    {
50        GpMetafile *    metafile = NULL;
51
52        lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);
53
54        SetNativeImage(metafile);
55    }
56
57    // Playback a metafile from a file
58    Metafile(IN const WCHAR* filename)
59    {
60        GpMetafile *    metafile = NULL;
61
62        lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);
63
64        SetNativeImage(metafile);
65    }
66
67    // Playback a WMF metafile from a file
68    Metafile(IN const WCHAR* filename,
69             IN const APMFileHeader * apmFileHeader
70            )
71    {
72        GpMetafile *    metafile = NULL;
73
74        lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);
75
76        SetNativeImage(metafile);
77    }
78
79    // Playback a metafile from a stream
80    Metafile(IN IStream* stream)
81    {
82        GpMetafile *    metafile = NULL;
83
84        lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);
85
86        SetNativeImage(metafile);
87    }
88
89    // Record a metafile to memory
90    Metafile(
91        IN HDC                 referenceHdc,
92        IN EmfType             type        = EmfTypeEmfPlusDual,
93        IN const WCHAR *       description = NULL
94        )
95    {
96        GpMetafile *    metafile = NULL;
97
98        lastResult = DllExports::GdipRecordMetafile(
99                        referenceHdc, type, NULL, MetafileFrameUnitGdi,
100                        description, &metafile);
101
102        SetNativeImage(metafile);
103    }
104
105    // Record a metafile to memory
106    Metafile(
107        IN HDC                 referenceHdc,
108        IN const RectF &       frameRect,
109        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
110        IN EmfType             type        = EmfTypeEmfPlusDual,
111        IN const WCHAR *       description = NULL
112        )
113    {
114        GpMetafile *    metafile = NULL;
115
116        lastResult = DllExports::GdipRecordMetafile(
117                        referenceHdc, type, &frameRect, frameUnit,
118                        description, &metafile);
119
120        SetNativeImage(metafile);
121    }
122
123    // Record a metafile to memory
124    Metafile(
125        IN HDC                 referenceHdc,
126        IN const Rect &        frameRect,
127        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
128        IN EmfType             type        = EmfTypeEmfPlusDual,
129        IN const WCHAR *       description = NULL
130        )
131    {
132        GpMetafile *    metafile = NULL;
133
134        lastResult = DllExports::GdipRecordMetafileI(
135                        referenceHdc, type, &frameRect, frameUnit,
136                        description, &metafile);
137
138        SetNativeImage(metafile);
139    }
140
141    // Record a metafile to a file
142    Metafile(
143        IN const WCHAR*        fileName,
144        IN HDC                 referenceHdc,
145        IN EmfType             type        = EmfTypeEmfPlusDual,
146        IN const WCHAR *       description = NULL
147        )
148    {
149        GpMetafile *    metafile = NULL;
150
151        lastResult = DllExports::GdipRecordMetafileFileName(fileName,
152                        referenceHdc, type, NULL, MetafileFrameUnitGdi,
153                        description, &metafile);
154
155        SetNativeImage(metafile);
156    }
157
158    // Record a metafile to a file
159    Metafile(
160        IN const WCHAR*        fileName,
161        IN HDC                 referenceHdc,
162        IN const RectF &       frameRect,
163        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
164        IN EmfType             type        = EmfTypeEmfPlusDual,
165        IN const WCHAR *       description = NULL
166        )
167    {
168        GpMetafile *    metafile = NULL;
169
170        lastResult = DllExports::GdipRecordMetafileFileName(fileName,
171                        referenceHdc, type, &frameRect, frameUnit,
172                        description, &metafile);
173
174        SetNativeImage(metafile);
175    }
176
177    // Record a metafile to a file
178    Metafile(
179        IN const WCHAR*        fileName,
180        IN HDC                 referenceHdc,
181        IN const Rect &        frameRect,
182        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
183        IN EmfType             type        = EmfTypeEmfPlusDual,
184        IN const WCHAR *       description = NULL
185        )
186    {
187        GpMetafile *    metafile = NULL;
188
189        lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,
190                        referenceHdc, type, &frameRect, frameUnit,
191                        description, &metafile);
192
193        SetNativeImage(metafile);
194    }
195
196    // Record a metafile to a stream
197    Metafile(
198        IN IStream *           stream,
199        IN HDC                 referenceHdc,
200        IN EmfType             type        = EmfTypeEmfPlusDual,
201        IN const WCHAR *       description = NULL
202        )
203    {
204        GpMetafile *    metafile = NULL;
205
206        lastResult = DllExports::GdipRecordMetafileStream(stream,
207                        referenceHdc, type, NULL, MetafileFrameUnitGdi,
208                        description, &metafile);
209
210        SetNativeImage(metafile);
211    }
212
213    // Record a metafile to a stream
214    Metafile(
215        IN IStream *           stream,
216        IN HDC                 referenceHdc,
217        IN const RectF &       frameRect,
218        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
219        IN EmfType             type        = EmfTypeEmfPlusDual,
220        IN const WCHAR *       description = NULL
221        )
222    {
223        GpMetafile *    metafile = NULL;
224
225        lastResult = DllExports::GdipRecordMetafileStream(stream,
226                        referenceHdc, type, &frameRect, frameUnit,
227                        description, &metafile);
228
229        SetNativeImage(metafile);
230    }
231
232    // Write a metafile to a stream with down-level GDI records
233    Metafile(
234        IN IStream *           stream,
235        IN HDC                 referenceHdc,
236        IN const Rect &        frameRect,
237        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,
238        IN EmfType             type        = EmfTypeEmfPlusDual,
239        IN const WCHAR *       description = NULL
240        )
241    {
242        GpMetafile *    metafile = NULL;
243
244        lastResult = DllExports::GdipRecordMetafileStreamI(stream,
245                        referenceHdc, type, &frameRect, frameUnit,
246                        description, &metafile);
247
248        SetNativeImage(metafile);
249    }
250
251    static Status GetMetafileHeader(
252        IN HMETAFILE           hWmf,
253        IN const APMFileHeader *     apmFileHeader,
254        OUT MetafileHeader *   header
255        )
256    {
257        return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);
258    }
259
260    static Status GetMetafileHeader(
261        IN HENHMETAFILE        hEmf,
262        OUT MetafileHeader *   header
263        )
264    {
265        return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
266    }
267
268    static Status GetMetafileHeader(
269        IN const WCHAR*        filename,
270        OUT MetafileHeader *   header
271        )
272    {
273        return DllExports::GdipGetMetafileHeaderFromFile(filename, header);
274    }
275
276    static Status GetMetafileHeader(
277        IN IStream *           stream,
278        OUT MetafileHeader *   header
279        )
280    {
281        return DllExports::GdipGetMetafileHeaderFromStream(stream, header);
282    }
283
284    Status GetMetafileHeader(
285        OUT MetafileHeader *    header
286        ) const
287    {
288        return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
289                                              (GpMetafile *)nativeImage,
290                                              header));
291    }
292
293    // Once this method is called, the Metafile object is in an invalid state
294    // and can no longer be used.  It is the responsiblity of the caller to
295    // invoke DeleteEnhMetaFile to delete this hEmf.
296
297    HENHMETAFILE GetHENHMETAFILE()
298    {
299        HENHMETAFILE hEmf;
300
301        SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));
302
303        return hEmf;
304    }
305
306    // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+
307    // The data must be DWORD aligned if it's an EMF or EMF+.  It must be
308    // WORD aligned if it's a WMF.
309    Status
310    PlayRecord(
311        IN EmfPlusRecordType   recordType,
312        IN UINT                flags,
313        IN UINT                dataSize,
314        IN const BYTE *        data
315        ) const
316    {
317        return SetStatus(DllExports::GdipPlayMetafileRecord(
318                                (GpMetafile *)nativeImage,
319                                recordType,
320                                flags,
321                                dataSize,
322                                data));
323    }
324
325    // If you're using a printer HDC for the metafile, but you want the
326    // metafile rasterized at screen resolution, then use this API to set
327    // the rasterization dpi of the metafile to the screen resolution,
328    // e.g. 96 dpi or 120 dpi.
329    Status SetDownLevelRasterizationLimit(
330        IN UINT     metafileRasterizationLimitDpi
331        )
332    {
333        return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
334                                (GpMetafile *)nativeImage,
335                                metafileRasterizationLimitDpi));
336    }
337
338    UINT GetDownLevelRasterizationLimit() const
339    {
340        UINT    metafileRasterizationLimitDpi = 0;
341
342        SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
343                                (GpMetafile *)nativeImage,
344                                &metafileRasterizationLimitDpi));
345
346        return metafileRasterizationLimitDpi;
347    }
348
349    static UINT Metafile::EmfToWmfBits(
350        IN HENHMETAFILE       hemf,
351        IN UINT               cbData16,
352        IN LPBYTE             pData16,
353        IN INT                iMapMode = MM_ANISOTROPIC,
354        IN EmfToWmfBitsFlags  eFlags = EmfToWmfBitsFlagsDefault
355    )
356    {
357        return DllExports::GdipEmfToWmfBits(
358            hemf,
359            cbData16,
360            pData16,
361            iMapMode,
362            eFlags);
363    }
364
365#ifdef DCR_USE_NEW_250932
366
367private:
368    Metafile(const Metafile &);
369    Metafile& operator=(const Metafile &);
370
371#endif
372};
373
374#endif // !_METAFILE_H
375