Home | History | Annotate | Download | only in include
      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 
     18 class Metafile : public Image
     19 {
     20 public:
     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 
    367 private:
    368     Metafile(const Metafile &);
    369     Metafile& operator=(const Metafile &);
    370 
    371 #endif
    372 };
    373 
    374 #endif // !_METAFILE_H
    375