/*
 * Copyright (C) 2007 Google (Evan Stade)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef _GDIPLUSMETAHEADER_H
#define _GDIPLUSMETAHEADER_H

typedef struct
{
    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;

#include <pshpack2.h>

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

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

#include <poppack.h>

#define GDIP_EMFPLUSFLAGS_DISPLAY       0x00000001

#ifdef __cplusplus
class MetafileHeader
{
public:
    MetafileType        Type;
    UINT                Size;
    UINT                Version;
    UINT                EmfPlusFlags;
    REAL                DpiX;
    REAL                DpiY;
    INT                 X;
    INT                 Y;
    INT                 Width;
    INT                 Height;
    union
    {
        METAHEADER      WmfHeader;
        ENHMETAHEADER3  EmfHeader;
    };
    INT                 EmfPlusHeaderSize;
    INT                 LogicalDpiX;
    INT                 LogicalDpiY;

public:
    MetafileType GetType() const { return Type; }

    UINT GetMetafileSize() const { return Size; }

    UINT GetVersion() const { return Version; }

    UINT GetEmfPlusFlags() const { return EmfPlusFlags; }

    REAL GetDpiX() const { return DpiX; }

    REAL GetDpiY() const { return DpiY; }

    VOID GetBounds (OUT Rect *r) const
    {
        r->X = X;
        r->Y = Y;
        r->Width = Width;
        r->Height = Height;
    }

    BOOL IsWmf() const
    {
       return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfPlaceable));
    }

    BOOL IsWmfPlaceable() const { return (Type == MetafileTypeWmfPlaceable); }

    BOOL IsEmf() const { return (Type == MetafileTypeEmf); }

    BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }

    BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }

    BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }

    BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }

    BOOL IsDisplay() const
    {
        return IsEmfPlus() && ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0);
    }

    const METAHEADER * GetWmfHeader() const
    {
        return IsWmf() ? &WmfHeader : NULL;
    }

    const ENHMETAHEADER3 * GetEmfHeader() const
    {
        return IsEmfOrEmfPlus() ? &EmfHeader : NULL;
    }
};
#else /* end of c++ typedefs */

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

#endif /* end of c typedefs */

#endif /* _GDIPLUSMETAHEADER_H */