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

/* 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_AddIntalledFont() 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.
 */
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_SetSystemFontInfo() once it is no longer needed.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_SYSFONTINFO_H_
