// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_INCLUDE_FXGE_FX_GE_WIN32_H_
#define CORE_INCLUDE_FXGE_FX_GE_WIN32_H_

#ifdef _WIN32
#ifndef _WINDOWS_
#include <windows.h>
#endif
#define WINDIB_OPEN_MEMORY    0x1
#define WINDIB_OPEN_PATHNAME  0x2
typedef struct  WINDIB_Open_Args_ {

    int         flags;

    const uint8_t*  memory_base;

    size_t    memory_size;

    const FX_WCHAR*  path_name;
} WINDIB_Open_Args_;
class CFX_WindowsDIB : public CFX_DIBitmap
{
public:

    static CFX_ByteString	GetBitmapInfo(const CFX_DIBitmap* pBitmap);

    static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);

    static HBITMAP		GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);

    static CFX_DIBitmap* LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette = NULL, FX_DWORD size = 256);

    static CFX_DIBitmap* LoadFromFile(const FX_WCHAR* filename);

    static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename)
    {
        return LoadFromFile(CFX_WideString::FromLocal(filename).c_str());
    }

    static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);

    CFX_WindowsDIB(HDC hDC, int width, int height);

    ~CFX_WindowsDIB();

    HDC					GetDC() const
    {
        return m_hMemDC;
    }

    HBITMAP				GetWindowsBitmap() const
    {
        return m_hBitmap;
    }

    void				LoadFromDevice(HDC hDC, int left, int top);

    void				SetToDevice(HDC hDC, int left, int top);
protected:

    HDC					m_hMemDC;

    HBITMAP				m_hBitmap;

    HBITMAP				m_hOldBitmap;
};
class CFX_WindowsDevice : public CFX_RenderDevice
{
public:
    static IFX_RenderDeviceDriver*	CreateDriver(HDC hDC, FX_BOOL bCmykOutput = FALSE);

    CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput = FALSE, FX_BOOL bForcePSOutput = FALSE, int psLevel = 2);

    HDC		GetDC() const;

    FX_BOOL m_bForcePSOutput;

    static int m_psLevel;
};
class CFX_WinBitmapDevice : public CFX_RenderDevice
{
public:

    CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);

    ~CFX_WinBitmapDevice();

    HDC		GetDC()
    {
        return m_hDC;
    }
protected:

    HBITMAP	m_hBitmap;

    HBITMAP m_hOldBitmap;

    HDC		m_hDC;
};
#endif

#endif  // CORE_INCLUDE_FXGE_FX_GE_WIN32_H_
