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

#include <stddef.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.
// Note:
//     Once FPDF_GetDefaultTTFMapCount() and FPDF_GetDefaultTTFMapEntry() are no
//     longer experimental, this API will be marked as deprecated.
//     See https://crbug.com/348468114
FPDF_EXPORT const FPDF_CharsetFontMap* FPDF_CALLCONV FPDF_GetDefaultTTFMap();

// Experimental API.
//
// Function: FPDF_GetDefaultTTFMapCount
//    Returns the number of entries in the default character set to TT Font name
//    map.
// Parameters:
//    None.
// Return Value:
//    The number of entries in the map.
FPDF_EXPORT size_t FPDF_CALLCONV FPDF_GetDefaultTTFMapCount();

// Experimental API.
//
// Function: FPDF_GetDefaultTTFMapEntry
//    Returns an entry in the default character set to TT Font name map.
// Parameters:
//    index    -   The index to the entry in the map to retrieve.
// Return Value:
//     A pointer to the entry, if it is in the map, or NULL if the index is out
//     of bounds.
FPDF_EXPORT const FPDF_CharsetFontMap* FPDF_CALLCONV
FPDF_GetDefaultTTFMapEntry(size_t index);

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