// 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_FXGE_INCLUDE_FX_GE_WIN32_H_
#define CORE_FXGE_INCLUDE_FX_GE_WIN32_H_

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

class IFX_RenderDeviceDriver;

#if defined(PDFIUM_PRINT_TEXT_WITH_GDI)
typedef void (*PDFiumEnsureTypefaceCharactersAccessible)(const LOGFONT* font,
                                                         const wchar_t* text,
                                                         size_t text_length);

extern bool g_pdfium_print_text_with_gdi;
extern PDFiumEnsureTypefaceCharactersAccessible
    g_pdfium_typeface_accessible_func;
#endif

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:
  CFX_WindowsDIB(HDC hDC, int width, int height);
  ~CFX_WindowsDIB() override;

  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* LoadFromFile(const FX_WCHAR* filename);
  static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename);
  static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);

  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);

  explicit CFX_WindowsDevice(HDC hDC);
  ~CFX_WindowsDevice() override;

  HDC GetDC() const;
};

class CFX_WinBitmapDevice : public CFX_RenderDevice {
 public:
  CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);
  ~CFX_WinBitmapDevice() override;

  HDC GetDC() { return m_hDC; }

 protected:
  HBITMAP m_hBitmap;

  HBITMAP m_hOldBitmap;

  HDC m_hDC;
};
#endif

#endif  // CORE_FXGE_INCLUDE_FX_GE_WIN32_H_
