/*
 * 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 */