// Copyright 2014 The PDFium Authors
// 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 PUBLIC_FPDF_SYSFONTINFO_H_
#define PUBLIC_FPDF_SYSFONTINFO_H_

// clang-format off
// NOLINTNEXTLINE(build/include)
#include "fpdfview.h"

// Character sets for the font
#define FXFONT_ANSI_CHARSET 0
#define FXFONT_DEFAULT_CHARSET 1
#define FXFONT_SYMBOL_CHARSET 2
#define FXFONT_SHIFTJIS_CHARSET 128
#define FXFONT_HANGEUL_CHARSET 129
#define FXFONT_GB2312_CHARSET 134
#define FXFONT_CHINESEBIG5_CHARSET 136
#define FXFONT_GREEK_CHARSET 161
#define FXFONT_VIETNAMESE_CHARSET 163
#define FXFONT_HEBREW_CHARSET 177
#define FXFONT_ARABIC_CHARSET 178
#define FXFONT_CYRILLIC_CHARSET 204
#define FXFONT_THAI_CHARSET 222
#define FXFONT_EASTERNEUROPEAN_CHARSET 238

// Font pitch and family flags
#define FXFONT_FF_FIXEDPITCH (1 << 0)
#define FXFONT_FF_ROMAN (1 << 4)
#define FXFONT_FF_SCRIPT (4 << 4)

// Typical weight values
#define FXFONT_FW_NORMAL 400
#define FXFONT_FW_BOLD 700

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

// Interface: FPDF_SYSFONTINFO
//          Interface for getting system font information and font mapping
typedef struct _FPDF_SYSFONTINFO {
  // Version number of the interface. Currently must be 1.
  int version;

  // Method: Release
  //          Give implementation a chance to release any data after the
  //          interface is no longer used.
  // Interface Version:
  //          1
  // Implementation Required:
  //          No
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  // Return Value:
  //          None
  // Comments:
  //          Called by PDFium during the final cleanup process.
  void (*Release)(struct _FPDF_SYSFONTINFO* pThis);

  // Method: EnumFonts
  //          Enumerate all fonts installed on the system
  // Interface Version:
  //          1
  // Implementation Required:
  //          No
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          pMapper     -   An opaque pointer to internal font mapper, used
  //                          when calling FPDF_AddInstalledFont().
  // Return Value:
  //          None
  // Comments:
  //          Implementations should call FPDF_AddInstalledFont() function for
  //          each font found. Only TrueType/OpenType and Type1 fonts are
  //          accepted by PDFium.
  void (*EnumFonts)(struct _FPDF_SYSFONTINFO* pThis, void* pMapper);

  // Method: MapFont
  //          Use the system font mapper to get a font handle from requested
  //          parameters.
  // Interface Version:
  //          1
  // Implementation Required:
  //          Required if GetFont method is not implemented.
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          weight      -   Weight of the requested font. 400 is normal and
  //                          700 is bold.
  //          bItalic     -   Italic option of the requested font, TRUE or
  //                          FALSE.
  //          charset     -   Character set identifier for the requested font.
  //                          See above defined constants.
  //          pitch_family -  A combination of flags. See above defined
  //                          constants.
  //          face        -   Typeface name. Currently use system local encoding
  //                          only.
  //          bExact      -   Obsolete: this parameter is now ignored.
  // Return Value:
  //          An opaque pointer for font handle, or NULL if system mapping is
  //          not supported.
  // Comments:
  //          If the system supports native font mapper (like Windows),
  //          implementation can implement this method to get a font handle.
  //          Otherwise, PDFium will do the mapping and then call GetFont
  //          method. Only TrueType/OpenType and Type1 fonts are accepted
  //          by PDFium.
  void* (*MapFont)(struct _FPDF_SYSFONTINFO* pThis,
                   int weight,
                   FPDF_BOOL bItalic,
                   int charset,
                   int pitch_family,
                   const char* face,
                   FPDF_BOOL* bExact);

  // Method: GetFont
  //          Get a handle to a particular font by its internal ID
  // Interface Version:
  //          1
  // Implementation Required:
  //          Required if MapFont method is not implemented.
  // Return Value:
  //          An opaque pointer for font handle.
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          face        -   Typeface name in system local encoding.
  // Comments:
  //          If the system mapping not supported, PDFium will do the font
  //          mapping and use this method to get a font handle.
  void* (*GetFont)(struct _FPDF_SYSFONTINFO* pThis, const char* face);

  // Method: GetFontData
  //          Get font data from a font
  // Interface Version:
  //          1
  // Implementation Required:
  //          Yes
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          hFont       -   Font handle returned by MapFont or GetFont method
  //          table       -   TrueType/OpenType table identifier (refer to
  //                          TrueType specification), or 0 for the whole file.
  //          buffer      -   The buffer receiving the font data. Can be NULL if
  //                          not provided.
  //          buf_size    -   Buffer size, can be zero if not provided.
  // Return Value:
  //          Number of bytes needed, if buffer not provided or not large
  //          enough, or number of bytes written into buffer otherwise.
  // Comments:
  //          Can read either the full font file, or a particular
  //          TrueType/OpenType table.
  unsigned long (*GetFontData)(struct _FPDF_SYSFONTINFO* pThis,
                               void* hFont,
                               unsigned int table,
                               unsigned char* buffer,
                               unsigned long buf_size);

  // Method: GetFaceName
  //          Get face name from a font handle
  // Interface Version:
  //          1
  // Implementation Required:
  //          No
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          hFont       -   Font handle returned by MapFont or GetFont method
  //          buffer      -   The buffer receiving the face name. Can be NULL if
  //                          not provided
  //          buf_size    -   Buffer size, can be zero if not provided
  // Return Value:
  //          Number of bytes needed, if buffer not provided or not large
  //          enough, or number of bytes written into buffer otherwise.
  unsigned long (*GetFaceName)(struct _FPDF_SYSFONTINFO* pThis,
                               void* hFont,
                               char* buffer,
                               unsigned long buf_size);

  // Method: GetFontCharset
  //          Get character set information for a font handle
  // Interface Version:
  //          1
  // Implementation Required:
  //          No
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          hFont       -   Font handle returned by MapFont or GetFont method
  // Return Value:
  //          Character set identifier. See defined constants above.
  int (*GetFontCharset)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);

  // Method: DeleteFont
  //          Delete a font handle
  // Interface Version:
  //          1
  // Implementation Required:
  //          Yes
  // Parameters:
  //          pThis       -   Pointer to the interface structure itself
  //          hFont       -   Font handle returned by MapFont or GetFont method
  // Return Value:
  //          None
  void (*DeleteFont)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);
} FPDF_SYSFONTINFO;

// Struct: FPDF_CharsetFontMap
//    Provides the name of a font to use for a given charset value.
typedef struct FPDF_CharsetFontMap_ {
  int charset;  // Character Set Enum value, see FXFONT_*_CHARSET above.
  const char* fontname;  // Name of default font to use with that charset.
} FPDF_CharsetFontMap;

// Function: FPDF_GetDefaultTTFMap
//    Returns a pointer to the default character set to TT Font name map. The
//    map is an array of FPDF_CharsetFontMap structs, with its end indicated
//    by a { -1, NULL } entry.
// Parameters:
//     None.
// Return Value:
//     Pointer to the Charset Font Map.
FPDF_EXPORT const FPDF_CharsetFontMap* FPDF_CALLCONV FPDF_GetDefaultTTFMap();

// Function: FPDF_AddInstalledFont
//          Add a system font to the list in PDFium.
// Comments:
//          This function is only called during the system font list building
//          process.
// Parameters:
//          mapper          -   Opaque pointer to Foxit font mapper
//          face            -   The font face name
//          charset         -   Font character set. See above defined constants.
// Return Value:
//          None.
FPDF_EXPORT void FPDF_CALLCONV FPDF_AddInstalledFont(void* mapper,
                                                     const char* face,
                                                     int charset);

// Function: FPDF_SetSystemFontInfo
//          Set the system font info interface into PDFium
// Parameters:
//          pFontInfo       -   Pointer to a FPDF_SYSFONTINFO structure
// Return Value:
//          None
// Comments:
//          Platform support implementation should implement required methods of
//          FFDF_SYSFONTINFO interface, then call this function during PDFium
//          initialization process.
//
//          Call this with NULL to tell PDFium to stop using a previously set
//          |FPDF_SYSFONTINFO|.
FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo);

// Function: FPDF_GetDefaultSystemFontInfo
//          Get default system font info interface for current platform
// Parameters:
//          None
// Return Value:
//          Pointer to a FPDF_SYSFONTINFO structure describing the default
//          interface, or NULL if the platform doesn't have a default interface.
//          Application should call FPDF_FreeDefaultSystemFontInfo to free the
//          returned pointer.
// Comments:
//          For some platforms, PDFium implements a default version of system
//          font info interface. The default implementation can be passed to
//          FPDF_SetSystemFontInfo().
FPDF_EXPORT FPDF_SYSFONTINFO* FPDF_CALLCONV FPDF_GetDefaultSystemFontInfo();

// Function: FPDF_FreeDefaultSystemFontInfo
//           Free a default system font info interface
// Parameters:
//           pFontInfo       -   Pointer to a FPDF_SYSFONTINFO structure
// Return Value:
//           None
// Comments:
//           This function should be called on the output from
//           FPDF_GetDefaultSystemFontInfo() once it is no longer needed.
FPDF_EXPORT void FPDF_CALLCONV
FPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_SYSFONTINFO_H_
