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