Naveen Neel / shedskin_2
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers gdiplusmetaheader.h Source File

gdiplusmetaheader.h

/*
 * gdiplusmetaheader.h
 *
 * GDI+ metafile header structure
 *
 * 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_METAHEADER_H
#define __GDIPLUS_METAHEADER_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif


/*
 * FIXME: is 1 the correct value for GDIP_EMFPLUSFLAGS_DISPLAY? This number
 * has been determined by calling Metafile::GetMetafileHeader() on a EMF+
 * metafile which was recorded on a display device context (SampleMetafile.emf).
 */
#ifdef __cplusplus
const UINT GDIP_EMFPLUSFLAGS_DISPLAY = 1;
#else
#define GDIP_EMFPLUSFLAGS_DISPLAY ((UINT) 1)
#endif

typedef struct tagENHMETAHEADER3 {
    DWORD iType;
    DWORD nSize;
    RECTL rclBounds;
    RECTL rclFrame;
    DWORD dSignature;
    DWORD nVersion;
    DWORD nBytes;
    DWORD nRecords;
    WORD nHandles;
    WORD sReserved;
    DWORD nDescription;
    DWORD offDescription;
    DWORD nPalEntries;
    SIZEL szlDevice;
    SIZEL szlMillimeters;
} ENHMETAHEADER3,*LPENHMETAHEADER3;

typedef struct PWMFRect16 {
    INT16 Left;
    INT16 Top;
    INT16 Right;
    INT16 Bottom;
} PWMFRect16;

typedef struct WmfPlaceableFileHeader {
    UINT32 Key;
    INT16 Hmf;
    PWMFRect16 BoundingBox;
    INT16 Inch;
    UINT32 Reserved;
    INT16 Checksum;
} WmfPlaceableFileHeader;

typedef struct MetafileHeader {
    MetafileType Type;
    UINT Size;
    UINT Version;
    UINT EmfPlusFlags;
    REAL DpiX;
    REAL DpiY;
    INT X;
    INT Y;
    INT Width;
    INT Height;
    __extension__ union {
        METAHEADER WmfHeader;
        ENHMETAHEADER3 EmfHeader;
    };
    INT EmfPlusHeaderSize;
    INT LogicalDpiX;
    INT LogicalDpiY;

    #ifdef __cplusplus
    public:
    void GetBounds(Rect *rect) const
    {
        if (rect)
        {
            rect->X = X;
            rect->Y = Y;
            rect->Width = Width;
            rect->Height = Height;
        }
    }
    REAL GetDpiX() const
    {
        return DpiX;
    }
    REAL GetDpiY() const
    {
        return DpiY;
    }
    const ENHMETAHEADER3* GetEmfHeader() const
    {
        if (Type == MetafileTypeEmf
                || Type == MetafileTypeEmfPlusOnly
                || Type == MetafileTypeEmfPlusDual)
        {
            return &EmfHeader;
        }
        else
        {
            return NULL;
        }
    }
    UINT GetEmfPlusFlags() const
    {
        return EmfPlusFlags;
    }
    UINT GetMetafileSize() const
    {
        return Size;
    }
    MetafileType GetType() const
    {
        return Type;
    }
    UINT GetVersion() const
    {
        return Version;
    }
    const METAHEADER* GetWmfHeader() const
    {
        if (Type == MetafileTypeWmf || Type == MetafileTypeWmfPlaceable)
        {
            return &WmfHeader;
        }
        else
        {
            return NULL;
        }
    }
    BOOL IsDisplay() const
    {
        return EmfPlusFlags == GDIP_EMFPLUSFLAGS_DISPLAY;
    }
    BOOL IsEmf() const
    {
        return Type == MetafileTypeEmf;
    }
    BOOL IsEmfOrEmfPlus() const
    {
        return Type == MetafileTypeEmf
            || Type == MetafileTypeEmfPlusOnly
            || Type == MetafileTypeEmfPlusDual;
    }
    BOOL IsEmfPlus() const
    {
        return Type == MetafileTypeEmfPlusOnly
            || Type == MetafileTypeEmfPlusDual;
    }
    BOOL IsEmfPlusDual() const
    {
        return Type == MetafileTypeEmfPlusDual;
    }
    BOOL IsEmfPlusOnly() const
    {
        return Type == MetafileTypeEmfPlusOnly;
    }
    BOOL IsWmf() const
    {
        return Type == MetafileTypeWmf
            || Type == MetafileTypeWmfPlaceable;
    }
    BOOL IsWmfPlaceable() const
    {
        return Type == MetafileTypeWmfPlaceable;
    }
    #endif
} MetafileHeader;

#endif /* __GDIPLUS_METAHEADER_H */