From e563e48224e98ba51b42bb2178264ff3ded9b678 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 14 Jun 2020 12:17:26 +0300 Subject: [PATCH] add freetype 2.10.1 --- .../include/freetype/config/ftconfig.h | 604 ++ .../include/freetype/config/ftheader.h | 814 +++ .../include/freetype/config/ftmodule.h | 20 + .../include/freetype/config/ftoption.h | 982 ++++ .../include/freetype/config/ftstdlib.h | 175 + deps/freetype/include/freetype/freetype.h | 4887 +++++++++++++++++ deps/freetype/include/freetype/ftadvanc.h | 188 + deps/freetype/include/freetype/ftbbox.h | 102 + deps/freetype/include/freetype/ftbdf.h | 213 + deps/freetype/include/freetype/ftbitmap.h | 330 ++ deps/freetype/include/freetype/ftbzip2.h | 102 + deps/freetype/include/freetype/ftcache.h | 1088 ++++ deps/freetype/include/freetype/ftchapters.h | 145 + deps/freetype/include/freetype/ftcid.h | 168 + deps/freetype/include/freetype/ftcolor.h | 311 ++ deps/freetype/include/freetype/ftdriver.h | 1232 +++++ deps/freetype/include/freetype/fterrdef.h | 279 + deps/freetype/include/freetype/fterrors.h | 289 + deps/freetype/include/freetype/ftfntfmt.h | 94 + deps/freetype/include/freetype/ftgasp.h | 144 + deps/freetype/include/freetype/ftglyph.h | 665 +++ deps/freetype/include/freetype/ftgxval.h | 355 ++ deps/freetype/include/freetype/ftgzip.h | 151 + deps/freetype/include/freetype/ftimage.h | 1238 +++++ deps/freetype/include/freetype/ftincrem.h | 344 ++ deps/freetype/include/freetype/ftlcdfil.h | 328 ++ deps/freetype/include/freetype/ftlist.h | 297 + deps/freetype/include/freetype/ftlzw.h | 100 + deps/freetype/include/freetype/ftmac.h | 290 + deps/freetype/include/freetype/ftmm.h | 753 +++ deps/freetype/include/freetype/ftmodapi.h | 785 +++ deps/freetype/include/freetype/ftmoderr.h | 203 + deps/freetype/include/freetype/ftotval.h | 207 + deps/freetype/include/freetype/ftoutln.h | 593 ++ deps/freetype/include/freetype/ftparams.h | 204 + deps/freetype/include/freetype/ftpfr.h | 180 + deps/freetype/include/freetype/ftrender.h | 245 + deps/freetype/include/freetype/ftsizes.h | 160 + deps/freetype/include/freetype/ftsnames.h | 273 + deps/freetype/include/freetype/ftstroke.h | 772 +++ deps/freetype/include/freetype/ftsynth.h | 84 + deps/freetype/include/freetype/ftsystem.h | 353 ++ deps/freetype/include/freetype/fttrigon.h | 350 ++ deps/freetype/include/freetype/fttypes.h | 615 +++ deps/freetype/include/freetype/ftwinfnt.h | 277 + deps/freetype/include/freetype/t1tables.h | 774 +++ deps/freetype/include/freetype/ttnameid.h | 1236 +++++ deps/freetype/include/freetype/tttables.h | 856 +++ deps/freetype/include/freetype/tttags.h | 123 + deps/freetype/include/ft2build.h | 44 + deps/freetype/lib/libfreetype.a | Bin 0 -> 1253504 bytes 51 files changed, 25022 insertions(+) create mode 100644 deps/freetype/include/freetype/config/ftconfig.h create mode 100644 deps/freetype/include/freetype/config/ftheader.h create mode 100644 deps/freetype/include/freetype/config/ftmodule.h create mode 100644 deps/freetype/include/freetype/config/ftoption.h create mode 100644 deps/freetype/include/freetype/config/ftstdlib.h create mode 100644 deps/freetype/include/freetype/freetype.h create mode 100644 deps/freetype/include/freetype/ftadvanc.h create mode 100644 deps/freetype/include/freetype/ftbbox.h create mode 100644 deps/freetype/include/freetype/ftbdf.h create mode 100644 deps/freetype/include/freetype/ftbitmap.h create mode 100644 deps/freetype/include/freetype/ftbzip2.h create mode 100644 deps/freetype/include/freetype/ftcache.h create mode 100644 deps/freetype/include/freetype/ftchapters.h create mode 100644 deps/freetype/include/freetype/ftcid.h create mode 100644 deps/freetype/include/freetype/ftcolor.h create mode 100644 deps/freetype/include/freetype/ftdriver.h create mode 100644 deps/freetype/include/freetype/fterrdef.h create mode 100644 deps/freetype/include/freetype/fterrors.h create mode 100644 deps/freetype/include/freetype/ftfntfmt.h create mode 100644 deps/freetype/include/freetype/ftgasp.h create mode 100644 deps/freetype/include/freetype/ftglyph.h create mode 100644 deps/freetype/include/freetype/ftgxval.h create mode 100644 deps/freetype/include/freetype/ftgzip.h create mode 100644 deps/freetype/include/freetype/ftimage.h create mode 100644 deps/freetype/include/freetype/ftincrem.h create mode 100644 deps/freetype/include/freetype/ftlcdfil.h create mode 100644 deps/freetype/include/freetype/ftlist.h create mode 100644 deps/freetype/include/freetype/ftlzw.h create mode 100644 deps/freetype/include/freetype/ftmac.h create mode 100644 deps/freetype/include/freetype/ftmm.h create mode 100644 deps/freetype/include/freetype/ftmodapi.h create mode 100644 deps/freetype/include/freetype/ftmoderr.h create mode 100644 deps/freetype/include/freetype/ftotval.h create mode 100644 deps/freetype/include/freetype/ftoutln.h create mode 100644 deps/freetype/include/freetype/ftparams.h create mode 100644 deps/freetype/include/freetype/ftpfr.h create mode 100644 deps/freetype/include/freetype/ftrender.h create mode 100644 deps/freetype/include/freetype/ftsizes.h create mode 100644 deps/freetype/include/freetype/ftsnames.h create mode 100644 deps/freetype/include/freetype/ftstroke.h create mode 100644 deps/freetype/include/freetype/ftsynth.h create mode 100644 deps/freetype/include/freetype/ftsystem.h create mode 100644 deps/freetype/include/freetype/fttrigon.h create mode 100644 deps/freetype/include/freetype/fttypes.h create mode 100644 deps/freetype/include/freetype/ftwinfnt.h create mode 100644 deps/freetype/include/freetype/t1tables.h create mode 100644 deps/freetype/include/freetype/ttnameid.h create mode 100644 deps/freetype/include/freetype/tttables.h create mode 100644 deps/freetype/include/freetype/tttags.h create mode 100644 deps/freetype/include/ft2build.h create mode 100644 deps/freetype/lib/libfreetype.a diff --git a/deps/freetype/include/freetype/config/ftconfig.h b/deps/freetype/include/freetype/config/ftconfig.h new file mode 100644 index 00000000..e8c37704 --- /dev/null +++ b/deps/freetype/include/freetype/config/ftconfig.h @@ -0,0 +1,604 @@ +/* ftconfig.h. Generated from ftconfig.in by configure. */ +/**************************************************************************** + * + * ftconfig.in + * + * UNIX-specific configuration file (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + */ + +#ifndef FTCONFIG_H_ +#define FTCONFIG_H_ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * PLATFORM-SPECIFIC CONFIGURATION MACROS + * + * These macros can be toggled to suit a specific system. The current ones + * are defaults used to compile FreeType in an ANSI C environment (16bit + * compilers are also supported). Copy this file to your own + * `builds/` directory, and edit it to port the engine. + * + */ + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_STDINT_H 1 + + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + +/* #undef FT_USE_AUTOCONF_SIZEOF_TYPES */ +#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES + +#define SIZEOF_INT 4 +#define SIZEOF_LONG 8 +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* Following cpp computation of the bit length of `int` and `long` */ + /* is copied from default `include/freetype/config/ftconfig.h`. */ + /* If any improvement is required for this file, it should be */ + /* applied to the original header file for the builders that do */ + /* not use configure script. */ + + /* The size of an `int` type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* `FT_UNUSED` indicates that a given parameter is not used -- */ + /* this is only used to get rid of unpleasant compiler warnings. */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /************************************************************************** + * + * AUTOMATIC CONFIGURATION MACROS + * + * These macros are computed from the ones defined above. Don't touch + * their definition, unless you know precisely what you are doing. No + * porter should need to mess with them. + * + */ + + + /************************************************************************** + * + * Mac support + * + * This is the only necessary change, so it is defined here instead + * providing a new configuration file. + */ +#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ +#include +#ifdef ECANCELED /* defined since 10.2 */ +#include "AvailabilityMacros.h" +#endif +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#undef FT_MACINTOSH +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ + typedef signed short FT_Int16; + + + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on the + * configuration. + */ + typedef signed XXX FT_Int32; + + + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on the + * configuration. + */ + typedef unsigned XXX FT_UInt32; + + + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef signed XXX FT_Int64; + + + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef unsigned XXX FT_UInt64; + + /* */ + +#endif + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32~bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit `int` type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* `FT_LONG64` must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long +#define FT_UINT64 unsigned long + + /* we handle the LLP64 scheme separately for GCC and clang, */ + /* suppressing the `long long` warning */ +#elif ( FT_SIZEOF_LONG == 4 ) && \ + defined( HAVE_LONG_LONG_INT ) && \ + defined( __GNUC__ ) +#pragma GCC diagnostic ignored "-Wlong-long" +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + + /************************************************************************** + * + * A 64-bit data type may create compilation problems if you compile in + * strict ANSI mode. To avoid them, we disable other 64-bit data types if + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. + */ +#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long` type */ +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#endif /* __STDC_VERSION__ >= 199901L */ + +#endif /* FT_SIZEOF_LONG == 8 */ + +#ifdef FT_LONG64 + typedef FT_INT64 FT_Int64; + typedef FT_UINT64 FT_UInt64; +#endif + + +#ifdef _WIN64 + /* only 64bit Windows uses the LLP64 data model, i.e., */ + /* 32bit integers, 64bit pointers */ +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x) +#else +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x) +#endif + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + + /* `typeof` condition taken from gnulib's `intprops.h` header file */ +#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ + ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ + defined( __IBM__TYPEOF__ ) ) || \ + ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) +#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) +#else +#define FT_TYPEOF( type ) /* empty */ +#endif + + + /* Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, */ + /* respectively, a function that gets used only within the scope of a */ + /* module. Normally, both the header and source code files for such a */ + /* function are within a single module directory. */ + /* */ + /* Intra-module arrays should be tagged with `FT_LOCAL_ARRAY` and */ + /* `FT_LOCAL_ARRAY_DEF`. */ + /* */ +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + +#define FT_LOCAL_ARRAY( x ) extern const x +#define FT_LOCAL_ARRAY_DEF( x ) const x + + + /* Use `FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, */ + /* functions that are used in more than a single module. In the */ + /* current setup this implies that the declaration is in a header file */ + /* in the `include/freetype/internal` directory, and the function body */ + /* is in a file in `src/base`. */ + /* */ +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + + /* When compiling FreeType as a DLL or DSO with hidden visibility */ + /* some systems/compilers need a special attribute in front OR after */ + /* the return type of function declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ + /* */ + /* - `FT_EXPORT( return_type )` */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* ``` */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* ``` */ + /* */ + /* - `FT_EXPORT_DEF( return_type )` */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* ``` */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* ``` */ + /* */ + /* You can provide your own implementation of `FT_EXPORT` and */ + /* `FT_EXPORT_DEF` here if you want. */ + /* */ + /* To export a variable, use `FT_EXPORT_VAR`. */ + /* */ +#ifndef FT_EXPORT + +#ifdef FT2_BUILD_LIBRARY + +#if defined( _WIN32 ) && defined( DLL_EXPORT ) +#define FT_EXPORT( x ) __declspec( dllexport ) x +#elif defined( __GNUC__ ) && __GNUC__ >= 4 +#define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_EXPORT( x ) __global x +#elif defined( __cplusplus ) +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#else + +#if defined( _WIN32 ) && defined( DLL_IMPORT ) +#define FT_EXPORT( x ) __declspec( dllimport ) x +#elif defined( __cplusplus ) +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"` for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function, */ + /* located in the same source code file as the structure that uses */ + /* it. */ + /* */ + /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare */ + /* and define a callback function, respectively, in a similar way */ + /* as FT_BASE and FT_BASE_DEF work. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl` or `__fastcall` declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_BASE_CALLBACK +#ifdef __cplusplus +#define FT_BASE_CALLBACK( x ) extern "C" x +#define FT_BASE_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_BASE_CALLBACK( x ) extern x +#define FT_BASE_CALLBACK_DEF( x ) x +#endif +#endif /* FT_BASE_CALLBACK */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* FTCONFIG_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/config/ftheader.h b/deps/freetype/include/freetype/config/ftheader.h new file mode 100644 index 00000000..696d6ba9 --- /dev/null +++ b/deps/freetype/include/freetype/config/ftheader.h @@ -0,0 +1,814 @@ +/**************************************************************************** + * + * ftheader.h + * + * Build macros of the FreeType 2 library. + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTHEADER_H_ +#define FTHEADER_H_ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /************************************************************************** + * + * Aliases for the FreeType 2 public and configuration files. + * + */ + + /************************************************************************** + * + * @section: + * header_file_macros + * + * @title: + * Header File Macros + * + * @abstract: + * Macro definitions used to `#include` specific header files. + * + * @description: + * The following macros are defined to the name of specific FreeType~2 + * header files. They can be used directly in `#include` statements as + * in: + * + * ``` + * #include FT_FREETYPE_H + * #include FT_MULTIPLE_MASTERS_H + * #include FT_GLYPH_H + * ``` + * + * There are several reasons why we are now using macros to name public + * header files. The first one is that such macros are not limited to + * the infamous 8.3~naming rule required by DOS (and + * `FT_MULTIPLE_MASTERS_H` is a lot more meaningful than `ftmm.h`). + * + * The second reason is that it allows for more flexibility in the way + * FreeType~2 is installed on a given system. + * + */ + + + /* configuration files */ + + /************************************************************************** + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H +#endif + + /* */ + + /* public headers */ + + /************************************************************************** + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H + + + /************************************************************************** + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in `#include` statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H + + + /************************************************************************** + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H + + + /************************************************************************** + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H + + + /************************************************************************** + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H + + + /************************************************************************** + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H + + + /************************************************************************** + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H + + + /************************************************************************** + * + * @macro: + * FT_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the driver modules. + * + */ +#define FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_AUTOHINTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the auto-hinting module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_AUTOHINTER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_CFF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the CFF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_CFF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the TrueType driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_TRUETYPE_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_PCF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the PCF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_PCF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of TrueType four-byte 'tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H + + + /************************************************************************** + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a face. + * + */ +#define FT_BDF_H + + + /************************************************************************** + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which access CID font information from a face. + * + */ +#define FT_CID_H + + + /************************************************************************** + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H + + + /************************************************************************** + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H + + + /************************************************************************** + * + * @macro: + * FT_BZIP2_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports bzip2-compressed files. + * + */ +#define FT_BZIP2_H + + + /************************************************************************** + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H + + + /************************************************************************** + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H + + + /************************************************************************** + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H + + + /************************************************************************** + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H + + + /************************************************************************** + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H + + + /************************************************************************** + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access fonts + * embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H + + + /************************************************************************** + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H + + + /************************************************************************** + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which accesses embedded 'name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H + + + /************************************************************************** + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables ('BASE', + * 'GDEF', 'GPOS', 'GSUB', 'JSTF'). + * + */ +#define FT_OPENTYPE_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables ('feat', + * 'mort', 'morx', 'bsln', 'just', 'kern', 'opbd', 'trak', 'prop'). + * + */ +#define FT_GX_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H + + + /************************************************************************** + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H + + + /************************************************************************** + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H + + + /************************************************************************** + * + * @macro: + * FT_FONT_FORMATS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions specific to font formats. + */ +#define FT_FONT_FORMATS_H + + /* deprecated */ +#define FT_XFREE86_H FT_FONT_FORMATS_H + + + /************************************************************************** + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H + + + /************************************************************************** + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H + + + /************************************************************************** + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs incremental glyph loading. + */ +#define FT_INCREMENTAL_H + + + /************************************************************************** + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H + + + /************************************************************************** + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H + + + /************************************************************************** + * + * @macro: + * FT_COLOR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which handles the OpenType 'CPAL' table. + */ +#define FT_COLOR_H + + + /* */ + + /* These header files don't need to be included by the user. */ +#define FT_ERROR_DEFINITIONS_H +#define FT_PARAMETER_TAGS_H + + /* Deprecated macros. */ +#define FT_UNPATENTED_HINTING_H +#define FT_TRUETYPE_UNPATENTED_H + + /* `FT_CACHE_H` is the only header file needed for the cache subsystem. */ +#define FT_CACHE_IMAGE_H FT_CACHE_H +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to `FT_CACHE_H` at the moment just in case, but we know */ + /* of no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MRU_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_CACHE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_GLYPH_H FT_CACHE_H +#define FT_CACHE_INTERNAL_IMAGE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_SBITS_H FT_CACHE_H + + + /* + * Include internal headers definitions from `` only when + * building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* FTHEADER_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/config/ftmodule.h b/deps/freetype/include/freetype/config/ftmodule.h new file mode 100644 index 00000000..b7299779 --- /dev/null +++ b/deps/freetype/include/freetype/config/ftmodule.h @@ -0,0 +1,20 @@ +/* This is a generated file. */ +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +/* EOF */ diff --git a/deps/freetype/include/freetype/config/ftoption.h b/deps/freetype/include/freetype/config/ftoption.h new file mode 100644 index 00000000..a49d2f66 --- /dev/null +++ b/deps/freetype/include/freetype/config/ftoption.h @@ -0,0 +1,982 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + + +#include + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles and Jamfiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 \ + * autofitter:warping=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + + /************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * Note that this feature is covered by several Microsoft patents and + * should not be activated in any default build of the library. When this + * macro is not defined, FreeType offers alternative LCD rendering + * technology that produces excellent output without LCD filtering. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + + + /************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_SYSTEM_ZLIB + + + /************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_USE_BZIP2 + + + /************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + + + /************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_USE_PNG + + + /************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #undef FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + /************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + + + /************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + + + /************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * _af_debug_disable_horz_hints + * _af_debug_disable_vert_hints + * _af_debug_disable_blue_hints + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * _af_debug_hints + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + + + /************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + + + /************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +/* #define FT_CONFIG_OPTION_ERROR_STRINGS */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support coloured + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. + * + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on the LEAN option. + * + * There are three possible values. + * + * Value 1: + * This value is associated with the 'Infinality' moniker, contributed by + * an individual nicknamed Infinality with the goal of making TrueType + * fonts render better than on Windows. A high amount of configurability + * and flexibility, down to rules for single glyphs in fonts, but also + * very slow. Its experimental and slow nature and the original + * developer losing interest meant that this option was never enabled in + * default builds. + * + * The corresponding interpreter version is v38. + * + * Value 2: + * The new default mode for the TrueType driver. The Infinality code + * base was stripped to the bare minimum and all configurability removed + * in the name of speed and simplicity. The configurability was mainly + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean + * black-and-white bitmaps. The new mode focuses on applying a minimal + * set of rules to all fonts indiscriminately so that modern and web + * fonts render well while legacy fonts render okay. + * + * The corresponding interpreter version is v40. + * + * Value 3: + * Compile both, making both v38 and v40 available (the latter is the + * default). + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + + + /************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES +#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + + + /************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + + + /************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** C F F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + + + /************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + + + /************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. + */ +#define AF_CONFIG_OPTION_INDIC + + + /************************************************************************** + * + * Compile 'autofit' module with warp hinting. The idea of the warping + * code is to slightly scale and shift a glyph within a single dimension so + * that as much of its segments are aligned (more or less) on the grid. To + * find out the optimal scaling and shifting value, various parameter + * combinations are tried and scored. + * + * You can switch warping on and off with the `warping` property of the + * auto-hinter (see file `ftdriver.h` for more information; by default it + * is switched off). + * + * This experimental option is not active if the rendering mode is + * `FT_RENDER_MODE_LIGHT`. + */ +#define AF_CONFIG_OPTION_USE_WARPER + + + /************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + + /* */ + + + /* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 +#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#endif + +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 +#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#endif +#endif +#endif + + + /* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 +#error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + + +#endif /* FTOPTION_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/config/ftstdlib.h b/deps/freetype/include/freetype/config/ftstdlib.h new file mode 100644 index 00000000..438b6145 --- /dev/null +++ b/deps/freetype/include/freetype/config/ftstdlib.h @@ -0,0 +1,175 @@ +/**************************************************************************** + * + * ftstdlib.h + * + * ANSI-specific library and header configuration file (specification + * only). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to group all `#includes` to the ANSI~C library that + * FreeType normally requires. It also defines macros to rename the + * standard functions within the FreeType source code. + * + * Load a file which defines `FTSTDLIB_H_` before this one to override it. + * + */ + + +#ifndef FTSTDLIB_H_ +#define FTSTDLIB_H_ + + +#include + +#define ft_ptrdiff_t ptrdiff_t + + + /************************************************************************** + * + * integer limits + * + * `UINT_MAX` and `ULONG_MAX` are used to automatically compute the size of + * `int` and `long` in bytes at compile-time. So far, this works for all + * platforms the library has been tested on. + * + * Note that on the extremely rare platforms that do not provide integer + * types that are _exactly_ 16 and 32~bits wide (e.g., some old Crays where + * `int` is 36~bits), we do not make any guarantee about the correct + * behaviour of FreeType~2 with all fonts. + * + * In these cases, `ftconfig.h` will refuse to compile anyway with a + * message like 'couldn't find 32-bit type' or something similar. + * + */ + + +#include + +#define FT_CHAR_BIT CHAR_BIT +#define FT_USHORT_MAX USHRT_MAX +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_LONG_MIN LONG_MIN +#define FT_LONG_MAX LONG_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /************************************************************************** + * + * character and string processing + * + */ + + +#include + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /************************************************************************** + * + * file handling + * + */ + + +#include + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /************************************************************************** + * + * sorting + * + */ + + +#include + +#define ft_qsort qsort + + + /************************************************************************** + * + * memory allocation + * + */ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define ft_strtol strtol +#define ft_getenv getenv + + + /************************************************************************** + * + * execution control + * + */ + + +#include + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* `jmp_buf` is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ + + + /* The following is only used for debugging purposes, i.e., if */ + /* `FT_DEBUG_LEVEL_ERROR` or `FT_DEBUG_LEVEL_TRACE` are defined. */ + +#include + + +#endif /* FTSTDLIB_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/freetype.h b/deps/freetype/include/freetype/freetype.h new file mode 100644 index 00000000..a6bb667e --- /dev/null +++ b/deps/freetype/include/freetype/freetype.h @@ -0,0 +1,4887 @@ +/**************************************************************************** + * + * freetype.h + * + * FreeType high-level API and common types (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FREETYPE_H_ +#define FREETYPE_H_ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include " +#error " #include FT_FREETYPE_H" +#endif + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H +#include FT_ERRORS_H + + +FT_BEGIN_HEADER + + + + /************************************************************************** + * + * @section: + * header_inclusion + * + * @title: + * FreeType's header inclusion scheme + * + * @abstract: + * How client applications should include FreeType header files. + * + * @description: + * To be as flexible as possible (and for historical reasons), FreeType + * uses a very special inclusion scheme to load header files, for example + * + * ``` + * #include + * + * #include FT_FREETYPE_H + * #include FT_OUTLINE_H + * ``` + * + * A compiler and its preprocessor only needs an include path to find the + * file `ft2build.h`; the exact locations and names of the other FreeType + * header files are hidden by @header_file_macros, loaded by + * `ft2build.h`. The API documentation always gives the header macro + * name needed for a particular function. + * + */ + + + /************************************************************************** + * + * @section: + * user_allocation + * + * @title: + * User allocation + * + * @abstract: + * How client applications should allocate FreeType data structures. + * + * @description: + * FreeType assumes that structures allocated by the user and passed as + * arguments are zeroed out except for the actual data. In other words, + * it is recommended to use `calloc` (or variants of it) instead of + * `malloc` for allocation. + * + */ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * base_interface + * + * @title: + * Base Interface + * + * @abstract: + * The FreeType~2 base font interface. + * + * @description: + * This section describes the most important public high-level API + * functions of FreeType~2. + * + * @order: + * FT_Library + * FT_Face + * FT_Size + * FT_GlyphSlot + * FT_CharMap + * FT_Encoding + * FT_ENC_TAG + * + * FT_FaceRec + * + * FT_FACE_FLAG_SCALABLE + * FT_FACE_FLAG_FIXED_SIZES + * FT_FACE_FLAG_FIXED_WIDTH + * FT_FACE_FLAG_HORIZONTAL + * FT_FACE_FLAG_VERTICAL + * FT_FACE_FLAG_COLOR + * FT_FACE_FLAG_SFNT + * FT_FACE_FLAG_CID_KEYED + * FT_FACE_FLAG_TRICKY + * FT_FACE_FLAG_KERNING + * FT_FACE_FLAG_MULTIPLE_MASTERS + * FT_FACE_FLAG_VARIATION + * FT_FACE_FLAG_GLYPH_NAMES + * FT_FACE_FLAG_EXTERNAL_STREAM + * FT_FACE_FLAG_HINTER + * + * FT_HAS_HORIZONTAL + * FT_HAS_VERTICAL + * FT_HAS_KERNING + * FT_HAS_FIXED_SIZES + * FT_HAS_GLYPH_NAMES + * FT_HAS_COLOR + * FT_HAS_MULTIPLE_MASTERS + * + * FT_IS_SFNT + * FT_IS_SCALABLE + * FT_IS_FIXED_WIDTH + * FT_IS_CID_KEYED + * FT_IS_TRICKY + * FT_IS_NAMED_INSTANCE + * FT_IS_VARIATION + * + * FT_STYLE_FLAG_BOLD + * FT_STYLE_FLAG_ITALIC + * + * FT_SizeRec + * FT_Size_Metrics + * + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * FT_SubGlyph + * + * FT_Bitmap_Size + * + * FT_Init_FreeType + * FT_Done_FreeType + * + * FT_New_Face + * FT_Done_Face + * FT_Reference_Face + * FT_New_Memory_Face + * FT_Face_Properties + * FT_Open_Face + * FT_Open_Args + * FT_Parameter + * FT_Attach_File + * FT_Attach_Stream + * + * FT_Set_Char_Size + * FT_Set_Pixel_Sizes + * FT_Request_Size + * FT_Select_Size + * FT_Size_Request_Type + * FT_Size_RequestRec + * FT_Size_Request + * FT_Set_Transform + * FT_Load_Glyph + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Get_Name_Index + * FT_Load_Char + * + * FT_OPEN_MEMORY + * FT_OPEN_STREAM + * FT_OPEN_PATHNAME + * FT_OPEN_DRIVER + * FT_OPEN_PARAMS + * + * FT_LOAD_DEFAULT + * FT_LOAD_RENDER + * FT_LOAD_MONOCHROME + * FT_LOAD_LINEAR_DESIGN + * FT_LOAD_NO_SCALE + * FT_LOAD_NO_HINTING + * FT_LOAD_NO_BITMAP + * FT_LOAD_NO_AUTOHINT + * FT_LOAD_COLOR + * + * FT_LOAD_VERTICAL_LAYOUT + * FT_LOAD_IGNORE_TRANSFORM + * FT_LOAD_FORCE_AUTOHINT + * FT_LOAD_NO_RECURSE + * FT_LOAD_PEDANTIC + * + * FT_LOAD_TARGET_NORMAL + * FT_LOAD_TARGET_LIGHT + * FT_LOAD_TARGET_MONO + * FT_LOAD_TARGET_LCD + * FT_LOAD_TARGET_LCD_V + * + * FT_LOAD_TARGET_MODE + * + * FT_Render_Glyph + * FT_Render_Mode + * FT_Get_Kerning + * FT_Kerning_Mode + * FT_Get_Track_Kerning + * FT_Get_Glyph_Name + * FT_Get_Postscript_Name + * + * FT_CharMapRec + * FT_Select_Charmap + * FT_Set_Charmap + * FT_Get_Charmap_Index + * + * FT_Get_FSType_Flags + * FT_Get_SubGlyph_Info + * + * FT_Face_Internal + * FT_Size_Internal + * FT_Slot_Internal + * + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * FT_OPEN_XXX + * FT_LOAD_XXX + * FT_LOAD_TARGET_XXX + * FT_SUBGLYPH_FLAG_XXX + * FT_FSTYPE_XXX + * + * FT_HAS_FAST_GLYPHS + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Glyph_Metrics + * + * @description: + * A structure to model the metrics of a single glyph. The values are + * expressed in 26.6 fractional pixel format; if the flag + * @FT_LOAD_NO_SCALE has been used while loading the glyph, values are + * expressed in font units instead. + * + * @fields: + * width :: + * The glyph's width. + * + * height :: + * The glyph's height. + * + * horiBearingX :: + * Left side bearing for horizontal layout. + * + * horiBearingY :: + * Top side bearing for horizontal layout. + * + * horiAdvance :: + * Advance width for horizontal layout. + * + * vertBearingX :: + * Left side bearing for vertical layout. + * + * vertBearingY :: + * Top side bearing for vertical layout. Larger positive values mean + * further below the vertical glyph origin. + * + * vertAdvance :: + * Advance height for vertical layout. Positive values mean the glyph + * has a positive advance downward. + * + * @note: + * If not disabled with @FT_LOAD_NO_HINTING, the values represent + * dimensions of the hinted glyph (in case hinting is applicable). + * + * Stroking a glyph with an outside border does not increase + * `horiAdvance` or `vertAdvance`; you have to manually adjust these + * values to account for the added width and height. + * + * FreeType doesn't use the 'VORG' table data for CFF fonts because it + * doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as + * `vertBearingY + height` after loading a glyph. + */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_Bitmap_Size + * + * @description: + * This structure models the metrics of a bitmap strike (i.e., a set of + * glyphs for a given point size and resolution) in a bitmap font. It is + * used for the `available_sizes` field of @FT_Face. + * + * @fields: + * height :: + * The vertical distance, in pixels, between two consecutive baselines. + * It is always positive. + * + * width :: + * The average width, in pixels, of all glyphs in the strike. + * + * size :: + * The nominal size of the strike in 26.6 fractional points. This + * field is not very useful. + * + * x_ppem :: + * The horizontal ppem (nominal width) in 26.6 fractional pixels. + * + * y_ppem :: + * The vertical ppem (nominal height) in 26.6 fractional pixels. + * + * @note: + * Windows FNT: + * The nominal size given in a FNT font is not reliable. If the driver + * finds it incorrect, it sets `size` to some calculated values, and + * `x_ppem` and `y_ppem` to the pixel width and height given in the + * font, respectively. + * + * TrueType embedded bitmaps: + * `size`, `width`, and `height` values are not contained in the bitmap + * strike itself. They are computed from the global font parameters. + */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * FT_Library + * + * @description: + * A handle to a FreeType library instance. Each 'library' is completely + * independent from the others; it is the 'root' of a set of objects like + * fonts, faces, sizes, etc. + * + * It also embeds a memory manager (see @FT_Memory), as well as a + * scan-line converter object (see @FT_Raster). + * + * [Since 2.5.6] In multi-threaded applications it is easiest to use one + * `FT_Library` object per thread. In case this is too cumbersome, a + * single `FT_Library` object across threads is possible also, as long as + * a mutex lock is used around @FT_New_Face and @FT_Done_Face. + * + * @note: + * Library objects are normally created by @FT_Init_FreeType, and + * destroyed with @FT_Done_FreeType. If you need reference-counting + * (cf. @FT_Reference_Library), use @FT_New_Library and @FT_Done_Library. + */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + /************************************************************************** + * + * @type: + * FT_Module + * + * @description: + * A handle to a given FreeType module object. A module can be a font + * driver, a renderer, or anything else that provides services to the + * former. + */ + typedef struct FT_ModuleRec_* FT_Module; + + + /************************************************************************** + * + * @type: + * FT_Driver + * + * @description: + * A handle to a given FreeType font driver object. A font driver is a + * module capable of creating faces from font files. + */ + typedef struct FT_DriverRec_* FT_Driver; + + + /************************************************************************** + * + * @type: + * FT_Renderer + * + * @description: + * A handle to a given FreeType renderer. A renderer is a module in + * charge of converting a glyph's outline image to a bitmap. It supports + * a single glyph image format, and one or more target surface depths. + */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @type: + * FT_Face + * + * @description: + * A handle to a typographic face object. A face object models a given + * typeface, in a given style. + * + * @note: + * A face object also owns a single @FT_GlyphSlot object, as well as one + * or more @FT_Size objects. + * + * Use @FT_New_Face or @FT_Open_Face to create a new face object from a + * given filepath or a custom input stream. + * + * Use @FT_Done_Face to destroy it (along with its slot and sizes). + * + * An `FT_Face` object can only be safely used from one thread at a time. + * Similarly, creation and destruction of `FT_Face` with the same + * @FT_Library object can only be done from one thread at a time. On the + * other hand, functions like @FT_Load_Glyph and its siblings are + * thread-safe and do not need the lock to be held as long as the same + * `FT_Face` object is not used from multiple threads at the same time. + * + * @also: + * See @FT_FaceRec for the publicly accessible fields of a given face + * object. + */ + typedef struct FT_FaceRec_* FT_Face; + + + /************************************************************************** + * + * @type: + * FT_Size + * + * @description: + * A handle to an object that models a face scaled to a given character + * size. + * + * @note: + * An @FT_Face has one _active_ @FT_Size object that is used by functions + * like @FT_Load_Glyph to determine the scaling transformation that in + * turn is used to load and hint glyphs and metrics. + * + * You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, @FT_Request_Size + * or even @FT_Select_Size to change the content (i.e., the scaling + * values) of the active @FT_Size. + * + * You can use @FT_New_Size to create additional size objects for a given + * @FT_Face, but they won't be used by other functions until you activate + * it through @FT_Activate_Size. Only one size can be activated at any + * given time per face. + * + * @also: + * See @FT_SizeRec for the publicly accessible fields of a given size + * object. + */ + typedef struct FT_SizeRec_* FT_Size; + + + /************************************************************************** + * + * @type: + * FT_GlyphSlot + * + * @description: + * A handle to a given 'glyph slot'. A slot is a container that can hold + * any of the glyphs contained in its parent face. + * + * In other words, each time you call @FT_Load_Glyph or @FT_Load_Char, + * the slot's content is erased by the new glyph data, i.e., the glyph's + * metrics, its image (bitmap or outline), and other control information. + * + * @also: + * See @FT_GlyphSlotRec for the publicly accessible glyph fields. + */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /************************************************************************** + * + * @type: + * FT_CharMap + * + * @description: + * A handle to a character map (usually abbreviated to 'charmap'). A + * charmap is used to translate character codes in a given encoding into + * glyph indexes for its parent's face. Some font formats may provide + * several charmaps per font. + * + * Each face object owns zero or more charmaps, but only one of them can + * be 'active', providing the data used by @FT_Get_Char_Index or + * @FT_Load_Char. + * + * The list of available charmaps in a face is available through the + * `face->num_charmaps` and `face->charmaps` fields of @FT_FaceRec. + * + * The currently active charmap is available as `face->charmap`. You + * should call @FT_Set_Charmap to change it. + * + * @note: + * When a new face is created (either through @FT_New_Face or + * @FT_Open_Face), the library looks for a Unicode charmap within the + * list and automatically activates it. If there is no Unicode charmap, + * FreeType doesn't set an 'active' charmap. + * + * @also: + * See @FT_CharMapRec for the publicly accessible fields of a given + * character map. + */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /************************************************************************** + * + * @macro: + * FT_ENC_TAG + * + * @description: + * This macro converts four-letter tags into an unsigned long. It is + * used to define 'encoding' identifiers (see @FT_Encoding). + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_ENC_TAG( value, a, b, c, d ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Encoding + * + * @description: + * An enumeration to specify character sets supported by charmaps. Used + * in the @FT_Select_Charmap API function. + * + * @note: + * Despite the name, this enumeration lists specific character + * repertories (i.e., charsets), and not text encoding methods (e.g., + * UTF-8, UTF-16, etc.). + * + * Other encodings might be defined in the future. + * + * @values: + * FT_ENCODING_NONE :: + * The encoding value~0 is reserved for all formats except BDF, PCF, + * and Windows FNT; see below for more information. + * + * FT_ENCODING_UNICODE :: + * The Unicode character set. This value covers all versions of the + * Unicode repertoire, including ASCII and Latin-1. Most fonts include + * a Unicode charmap, but not all of them. + * + * For example, if you want to access Unicode value U+1F028 (and the + * font contains it), use value 0x1F028 as the input value for + * @FT_Get_Char_Index. + * + * FT_ENCODING_MS_SYMBOL :: + * Microsoft Symbol encoding, used to encode mathematical symbols and + * wingdings. For more information, see + * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts', + * 'http://www.kostis.net/charsets/symbol.htm', and + * 'http://www.kostis.net/charsets/wingding.htm'. + * + * This encoding uses character codes from the PUA (Private Unicode + * Area) in the range U+F020-U+F0FF. + * + * FT_ENCODING_SJIS :: + * Shift JIS encoding for Japanese. More info at + * 'https://en.wikipedia.org/wiki/Shift_JIS'. See note on multi-byte + * encodings below. + * + * FT_ENCODING_PRC :: + * Corresponds to encoding systems mainly for Simplified Chinese as + * used in People's Republic of China (PRC). The encoding layout is + * based on GB~2312 and its supersets GBK and GB~18030. + * + * FT_ENCODING_BIG5 :: + * Corresponds to an encoding system for Traditional Chinese as used in + * Taiwan and Hong Kong. + * + * FT_ENCODING_WANSUNG :: + * Corresponds to the Korean encoding system known as Extended Wansung + * (MS Windows code page 949). For more information see + * 'https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. + * + * FT_ENCODING_JOHAB :: + * The Korean standard character set (KS~C 5601-1992), which + * corresponds to MS Windows code page 1361. This character set + * includes all possible Hangul character combinations. + * + * FT_ENCODING_ADOBE_LATIN_1 :: + * Corresponds to a Latin-1 encoding as defined in a Type~1 PostScript + * font. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_STANDARD :: + * Adobe Standard encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_EXPERT :: + * Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_CUSTOM :: + * Corresponds to a custom encoding, as found in Type~1, CFF, and + * OpenType/CFF fonts. It is limited to 256 character codes. + * + * FT_ENCODING_APPLE_ROMAN :: + * Apple roman encoding. Many TrueType and OpenType fonts contain a + * charmap for this 8-bit encoding, since older versions of Mac OS are + * able to use it. + * + * FT_ENCODING_OLD_LATIN_2 :: + * This value is deprecated and was neither used nor reported by + * FreeType. Don't use or test for it. + * + * FT_ENCODING_MS_SJIS :: + * Same as FT_ENCODING_SJIS. Deprecated. + * + * FT_ENCODING_MS_GB2312 :: + * Same as FT_ENCODING_PRC. Deprecated. + * + * FT_ENCODING_MS_BIG5 :: + * Same as FT_ENCODING_BIG5. Deprecated. + * + * FT_ENCODING_MS_WANSUNG :: + * Same as FT_ENCODING_WANSUNG. Deprecated. + * + * FT_ENCODING_MS_JOHAB :: + * Same as FT_ENCODING_JOHAB. Deprecated. + * + * @note: + * By default, FreeType enables a Unicode charmap and tags it with + * `FT_ENCODING_UNICODE` when it is either provided or can be generated + * from PostScript glyph name dictionaries in the font file. All other + * encodings are considered legacy and tagged only if explicitly defined + * in the font file. Otherwise, `FT_ENCODING_NONE` is used. + * + * `FT_ENCODING_NONE` is set by the BDF and PCF drivers if the charmap is + * neither Unicode nor ISO-8859-1 (otherwise it is set to + * `FT_ENCODING_UNICODE`). Use @FT_Get_BDF_Charset_ID to find out which + * encoding is really present. If, for example, the `cs_registry` field + * is 'KOI8' and the `cs_encoding` field is 'R', the font is encoded in + * KOI8-R. + * + * `FT_ENCODING_NONE` is always set (with a single exception) by the + * winfonts driver. Use @FT_Get_WinFNT_Header and examine the `charset` + * field of the @FT_WinFNT_HeaderRec structure to find out which encoding + * is really present. For example, @FT_WinFNT_ID_CP1251 (204) means + * Windows code page 1251 (for Russian). + * + * `FT_ENCODING_NONE` is set if `platform_id` is @TT_PLATFORM_MACINTOSH + * and `encoding_id` is not `TT_MAC_ID_ROMAN` (otherwise it is set to + * `FT_ENCODING_APPLE_ROMAN`). + * + * If `platform_id` is @TT_PLATFORM_MACINTOSH, use the function + * @FT_Get_CMap_Language_ID to query the Mac language ID that may be + * needed to be able to distinguish Apple encoding variants. See + * + * https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + * + * to get an idea how to do that. Basically, if the language ID is~0, + * don't use it, otherwise subtract 1 from the language ID. Then examine + * `encoding_id`. If, for example, `encoding_id` is `TT_MAC_ID_ROMAN` + * and the language ID (minus~1) is `TT_MAC_LANGID_GREEK`, it is the + * Greek encoding, not Roman. `TT_MAC_ID_ARABIC` with + * `TT_MAC_LANGID_FARSI` means the Farsi variant the Arabic encoding. + */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /* these constants are deprecated; use the corresponding `FT_Encoding` */ + /* values instead */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_PRC +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /************************************************************************** + * + * @struct: + * FT_CharMapRec + * + * @description: + * The base charmap structure. + * + * @fields: + * face :: + * A handle to the parent face object. + * + * encoding :: + * An @FT_Encoding tag identifying the charmap. Use this with + * @FT_Select_Charmap. + * + * platform_id :: + * An ID number describing the platform for the following encoding ID. + * This comes directly from the TrueType specification and gets + * emulated for other formats. + * + * encoding_id :: + * A platform-specific encoding number. This also comes from the + * TrueType specification and gets emulated similarly. + */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FT_Face_Internal + * + * @description: + * An opaque handle to an `FT_Face_InternalRec` structure that models the + * private data of a given @FT_Face object. + * + * This structure might change between releases of FreeType~2 and is not + * generally available to client applications. + */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /************************************************************************** + * + * @struct: + * FT_FaceRec + * + * @description: + * FreeType root face class structure. A face object models a typeface + * in a font file. + * + * @fields: + * num_faces :: + * The number of faces in the font file. Some font formats can have + * multiple faces in a single font file. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). They are set + * to~0 if there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, holding the named instance index for the current face + * index (starting with value~1; value~0 indicates font access without + * a named instance). For non-variation fonts, bits 16-30 are ignored. + * If we have the third named instance of face~4, say, `face_index` is + * set to 0x00030004. + * + * Bit 31 is always zero (this is, `face_index` is always a positive + * value). + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the named instance index value (only + * @FT_Set_Named_Instance does that). + * + * face_flags :: + * A set of bit flags that give important information about the face; + * see @FT_FACE_FLAG_XXX for the details. + * + * style_flags :: + * The lower 16~bits contain a set of bit flags indicating the style of + * the face; see @FT_STYLE_FLAG_XXX for the details. + * + * [Since 2.6.1] Bits 16-30 hold the number of named instances + * available for the current face if we have a GX or OpenType variation + * (sub)font. Bit 31 is always zero (this is, `style_flags` is always + * a positive value). Note that a variation font has always at least + * one named instance, namely the default instance. + * + * num_glyphs :: + * The number of glyphs in the face. If the face is scalable and has + * sbits (see `num_fixed_sizes`), it is set to the number of outline + * glyphs. + * + * For CID-keyed fonts (not in an SFNT wrapper) this value gives the + * highest CID used in the font. + * + * family_name :: + * The face's family name. This is an ASCII string, usually in + * English, that describes the typeface's family (like 'Times New + * Roman', 'Bodoni', 'Garamond', etc). This is a least common + * denominator used to list fonts. Some formats (TrueType & OpenType) + * provide localized and Unicode versions of this string. Applications + * should use the format-specific interface to access them. Can be + * `NULL` (e.g., in fonts embedded in a PDF file). + * + * In case the font doesn't provide a specific family name entry, + * FreeType tries to synthesize one, deriving it from other name + * entries. + * + * style_name :: + * The face's style name. This is an ASCII string, usually in English, + * that describes the typeface's style (like 'Italic', 'Bold', + * 'Condensed', etc). Not all font formats provide a style name, so + * this field is optional, and can be set to `NULL`. As for + * `family_name`, some formats provide localized and Unicode versions + * of this string. Applications should use the format-specific + * interface to access them. + * + * num_fixed_sizes :: + * The number of bitmap strikes in the face. Even if the face is + * scalable, there might still be bitmap strikes, which are called + * 'sbits' in that case. + * + * available_sizes :: + * An array of @FT_Bitmap_Size for all bitmap strikes in the face. It + * is set to `NULL` if there is no bitmap strike. + * + * Note that FreeType tries to sanitize the strike data since they are + * sometimes sloppy or incorrect, but this can easily fail. + * + * num_charmaps :: + * The number of charmaps in the face. + * + * charmaps :: + * An array of the charmaps of the face. + * + * generic :: + * A field reserved for client uses. See the @FT_Generic type + * description. + * + * bbox :: + * The font bounding box. Coordinates are expressed in font units (see + * `units_per_EM`). The box is large enough to contain any glyph from + * the font. Thus, `bbox.yMax` can be seen as the 'maximum ascender', + * and `bbox.yMin` as the 'minimum descender'. Only relevant for + * scalable formats. + * + * Note that the bounding box might be off by (at least) one pixel for + * hinted fonts. See @FT_Size_Metrics for further discussion. + * + * units_per_EM :: + * The number of font units per EM square for this face. This is + * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only + * relevant for scalable formats. + * + * ascender :: + * The typographic ascender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMax`. + * Only relevant for scalable formats. + * + * descender :: + * The typographic descender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMin`. + * Note that this field is negative for values below the baseline. + * Only relevant for scalable formats. + * + * height :: + * This value is the vertical distance between two consecutive + * baselines, expressed in font units. It is always positive. Only + * relevant for scalable formats. + * + * If you want the global glyph height, use `ascender - descender`. + * + * max_advance_width :: + * The maximum advance width, in font units, for all glyphs in this + * face. This can be used to make word wrapping computations faster. + * Only relevant for scalable formats. + * + * max_advance_height :: + * The maximum advance height, in font units, for all glyphs in this + * face. This is only relevant for vertical layouts, and is set to + * `height` for fonts that do not provide vertical metrics. Only + * relevant for scalable formats. + * + * underline_position :: + * The position, in font units, of the underline line for this face. + * It is the center of the underlining stem. Only relevant for + * scalable formats. + * + * underline_thickness :: + * The thickness, in font units, of the underline for this face. Only + * relevant for scalable formats. + * + * glyph :: + * The face's associated glyph slot(s). + * + * size :: + * The current active size for this face. + * + * charmap :: + * The current active charmap for this face. + * + * @note: + * Fields may be changed after a call to @FT_Attach_File or + * @FT_Attach_Stream. + * + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `ascender`, `descender`, `height`, + * `underline_position`, and `underline_thickness`. + * + * Especially for TrueType fonts see also the documentation for + * @FT_Size_Metrics. + */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness`) */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; /* face-specific auto-hinter data */ + void* extensions; /* unused */ + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /************************************************************************** + * + * @enum: + * FT_FACE_FLAG_XXX + * + * @description: + * A list of bit flags used in the `face_flags` field of the @FT_FaceRec + * structure. They inform client applications of properties of the + * corresponding face. + * + * @values: + * FT_FACE_FLAG_SCALABLE :: + * The face contains outline glyphs. Note that a face can contain + * bitmap strikes also, i.e., a face can have both this flag and + * @FT_FACE_FLAG_FIXED_SIZES set. + * + * FT_FACE_FLAG_FIXED_SIZES :: + * The face contains bitmap strikes. See also the `num_fixed_sizes` + * and `available_sizes` fields of @FT_FaceRec. + * + * FT_FACE_FLAG_FIXED_WIDTH :: + * The face contains fixed-width characters (like Courier, Lucida, + * MonoType, etc.). + * + * FT_FACE_FLAG_SFNT :: + * The face uses the SFNT storage scheme. For now, this means TrueType + * and OpenType. + * + * FT_FACE_FLAG_HORIZONTAL :: + * The face contains horizontal glyph metrics. This should be set for + * all common formats. + * + * FT_FACE_FLAG_VERTICAL :: + * The face contains vertical glyph metrics. This is only available in + * some formats, not all of them. + * + * FT_FACE_FLAG_KERNING :: + * The face contains kerning information. If set, the kerning distance + * can be retrieved using the function @FT_Get_Kerning. Otherwise the + * function always return the vector (0,0). Note that FreeType doesn't + * handle kerning data from the SFNT 'GPOS' table (as present in many + * OpenType fonts). + * + * FT_FACE_FLAG_FAST_GLYPHS :: + * THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + * + * FT_FACE_FLAG_MULTIPLE_MASTERS :: + * The face contains multiple masters and is capable of interpolating + * between them. Supported formats are Adobe MM, TrueType GX, and + * OpenType variation fonts. + * + * See section @multiple_masters for API details. + * + * FT_FACE_FLAG_GLYPH_NAMES :: + * The face contains glyph names, which can be retrieved using + * @FT_Get_Glyph_Name. Note that some TrueType fonts contain broken + * glyph name tables. Use the function @FT_Has_PS_Glyph_Names when + * needed. + * + * FT_FACE_FLAG_EXTERNAL_STREAM :: + * Used internally by FreeType to indicate that a face's stream was + * provided by the client application and should not be destroyed when + * @FT_Done_Face is called. Don't read or test this flag. + * + * FT_FACE_FLAG_HINTER :: + * The font driver has a hinting machine of its own. For example, with + * TrueType fonts, it makes sense to use data from the SFNT 'gasp' + * table only if the native TrueType hinting engine (with the bytecode + * interpreter) is available and active. + * + * FT_FACE_FLAG_CID_KEYED :: + * The face is CID-keyed. In that case, the face is not accessed by + * glyph indices but by CID values. For subsetted CID-keyed fonts this + * has the consequence that not all index values are a valid argument + * to @FT_Load_Glyph. Only the CID values for which corresponding + * glyphs in the subsetted font exist make `FT_Load_Glyph` return + * successfully; in all other cases you get an + * `FT_Err_Invalid_Argument` error. + * + * Note that CID-keyed fonts that are in an SFNT wrapper (this is, all + * OpenType/CFF fonts) don't have this flag set since the glyphs are + * accessed in the normal way (using contiguous indices); the + * 'CID-ness' isn't visible to the application. + * + * FT_FACE_FLAG_TRICKY :: + * The face is 'tricky', this is, it always needs the font format's + * native hinting engine to get a reasonable result. A typical example + * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that + * uses TrueType bytecode instructions to move and scale all of its + * subglyphs. + * + * It is not possible to auto-hint such fonts using + * @FT_LOAD_FORCE_AUTOHINT; it will also ignore @FT_LOAD_NO_HINTING. + * You have to set both @FT_LOAD_NO_HINTING and @FT_LOAD_NO_AUTOHINT to + * really disable hinting; however, you probably never want this except + * for demonstration purposes. + * + * Currently, there are about a dozen TrueType fonts in the list of + * tricky fonts; they are hard-coded in file `ttobjs.c`. + * + * FT_FACE_FLAG_COLOR :: + * [Since 2.5.1] The face has color glyph tables. See @FT_LOAD_COLOR + * for more information. + * + * FT_FACE_FLAG_VARIATION :: + * [Since 2.9] Set if the current face (or named instance) has been + * altered with @FT_Set_MM_Design_Coordinates, + * @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates. + * This flag is unset by a call to @FT_Set_Named_Instance. + */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) +#define FT_FACE_FLAG_COLOR ( 1L << 14 ) +#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_HORIZONTAL + * + * @description: + * A macro that returns true whenever a face object contains horizontal + * metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_VERTICAL + * + * @description: + * A macro that returns true whenever a face object contains real + * vertical metrics (and not only synthesized ones). + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_KERNING + * + * @description: + * A macro that returns true whenever a face object contains kerning data + * that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SCALABLE + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, and + * PFR font formats). + * + */ +#define FT_IS_SCALABLE( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SFNT + * + * @description: + * A macro that returns true whenever a face object contains a font whose + * format is based on the SFNT storage scheme. This usually means: + * TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap + * fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************** + * + * @macro: + * FT_IS_FIXED_WIDTH + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or 'monospace', 'fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FIXED_SIZES + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes` field of the @FT_FaceRec + * structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FAST_GLYPHS + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************** + * + * @macro: + * FT_HAS_GLYPH_NAMES + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************** + * + * @macro: + * FT_IS_NAMED_INSTANCE + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the return value of this macro (only + * @FT_Set_Named_Instance does that). + * + * @since: + * 2.7 + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( (face)->face_index & 0x7FFF0000L ) + + + /************************************************************************** + * + * @macro: + * FT_IS_VARIATION + * + * @description: + * A macro that returns true whenever a face object has been altered by + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or + * @FT_Set_Var_Blend_Coordinates. + * + * @since: + * 2.9 + * + */ +#define FT_IS_VARIATION( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_VARIATION ) + + + /************************************************************************** + * + * @macro: + * FT_IS_CID_KEYED + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************** + * + * @macro: + * FT_IS_TRICKY + * + * @description: + * A macro that returns true whenever a face represents a 'tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_TRICKY ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_COLOR + * + * @description: + * A macro that returns true whenever a face object contains tables for + * color glyphs. + * + * @since: + * 2.5.1 + * + */ +#define FT_HAS_COLOR( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_COLOR ) + + + /************************************************************************** + * + * @enum: + * FT_STYLE_FLAG_XXX + * + * @description: + * A list of bit flags to indicate the style of a given face. These are + * used in the `style_flags` field of @FT_FaceRec. + * + * @values: + * FT_STYLE_FLAG_ITALIC :: + * The face style is italic or oblique. + * + * FT_STYLE_FLAG_BOLD :: + * The face is bold. + * + * @note: + * The style information as provided by FreeType is very basic. More + * details are beyond the scope and should be done on a higher level (for + * example, by analyzing various fields of the 'OS/2' table in SFNT based + * fonts). + */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /************************************************************************** + * + * @type: + * FT_Size_Internal + * + * @description: + * An opaque handle to an `FT_Size_InternalRec` structure, used to model + * private data of a given @FT_Size object. + */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /************************************************************************** + * + * @struct: + * FT_Size_Metrics + * + * @description: + * The size metrics structure gives the metrics of a size object. + * + * @fields: + * x_ppem :: + * The width of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal width'. + * + * y_ppem :: + * The height of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal height'. + * + * x_scale :: + * A 16.16 fractional scaling value to convert horizontal metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * y_scale :: + * A 16.16 fractional scaling value to convert vertical metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * ascender :: + * The ascender in 26.6 fractional pixels, rounded up to an integer + * value. See @FT_FaceRec for the details. + * + * descender :: + * The descender in 26.6 fractional pixels, rounded down to an integer + * value. See @FT_FaceRec for the details. + * + * height :: + * The height in 26.6 fractional pixels, rounded to an integer value. + * See @FT_FaceRec for the details. + * + * max_advance :: + * The maximum advance width in 26.6 fractional pixels, rounded to an + * integer value. See @FT_FaceRec for the details. + * + * @note: + * The scaling values, if relevant, are determined first during a size + * changing operation. The remaining fields are then set by the driver. + * For scalable formats, they are usually set to scaled values of the + * corresponding fields in @FT_FaceRec. Some values like ascender or + * descender are rounded for historical reasons; more precise values (for + * outline fonts) can be derived by scaling the corresponding @FT_FaceRec + * values manually, with code similar to the following. + * + * ``` + * scaled_ascender = FT_MulFix( face->ascender, + * size_metrics->y_scale ); + * ``` + * + * Note that due to glyph hinting and the selected rendering mode these + * values are usually not exact; consequently, they must be treated as + * unreliable with an error margin of at least one pixel! + * + * Indeed, the only way to get the exact metrics is to render _all_ + * glyphs. As this would be a definite performance hit, it is up to + * client applications to perform such computations. + * + * The `FT_Size_Metrics` structure is valid for bitmap fonts also. + * + * + * **TrueType fonts with native bytecode hinting** + * + * All applications that handle TrueType fonts with native hinting must + * be aware that TTFs expect different rounding of vertical font + * dimensions. The application has to cater for this, especially if it + * wants to rely on a TTF's vertical data (for example, to properly align + * box characters vertically). + * + * Only the application knows _in advance_ that it is going to use native + * hinting for TTFs! FreeType, on the other hand, selects the hinting + * mode not at the time of creating an @FT_Size object but much later, + * namely while calling @FT_Load_Glyph. + * + * Here is some pseudo code that illustrates a possible solution. + * + * ``` + * font_format = FT_Get_Font_Format( face ); + * + * if ( !strcmp( font_format, "TrueType" ) && + * do_native_bytecode_hinting ) + * { + * ascender = ROUND( FT_MulFix( face->ascender, + * size_metrics->y_scale ) ); + * descender = ROUND( FT_MulFix( face->descender, + * size_metrics->y_scale ) ); + * } + * else + * { + * ascender = size_metrics->ascender; + * descender = size_metrics->descender; + * } + * + * height = size_metrics->height; + * max_advance = size_metrics->max_advance; + * ``` + */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_SizeRec + * + * @description: + * FreeType root size class structure. A size object models a face + * object at a given size. + * + * @fields: + * face :: + * Handle to the parent face object. + * + * generic :: + * A typeless pointer, unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each size object. + * + * metrics :: + * Metrics for this size object. This field is read-only. + */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /************************************************************************** + * + * @struct: + * FT_SubGlyph + * + * @description: + * The subglyph structure is an internal object used to describe + * subglyphs (for example, in the case of composites). + * + * @note: + * The subglyph implementation is not part of the high-level API, hence + * the forward structure declaration. + * + * You can however retrieve subglyph information with + * @FT_Get_SubGlyph_Info. + */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /************************************************************************** + * + * @type: + * FT_Slot_Internal + * + * @description: + * An opaque handle to an `FT_Slot_InternalRec` structure, used to model + * private data of a given @FT_GlyphSlot object. + */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /************************************************************************** + * + * @struct: + * FT_GlyphSlotRec + * + * @description: + * FreeType root glyph slot class structure. A glyph slot is a container + * where individual glyphs can be loaded, be they in outline or bitmap + * format. + * + * @fields: + * library :: + * A handle to the FreeType library instance this slot belongs to. + * + * face :: + * A handle to the parent face object. + * + * next :: + * In some cases (like some font tools), several glyph slots per face + * object can be a good thing. As this is rare, the glyph slots are + * listed through a direct, single-linked list using its `next` field. + * + * glyph_index :: + * [Since 2.10] The glyph index passed as an argument to @FT_Load_Glyph + * while initializing the glyph slot. + * + * generic :: + * A typeless pointer unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each glyph slot object. + * + * metrics :: + * The metrics of the last loaded glyph in the slot. The returned + * values depend on the last load flags (see the @FT_Load_Glyph API + * function) and can be expressed either in 26.6 fractional pixels or + * font units. + * + * Note that even when the glyph image is transformed, the metrics are + * not. + * + * linearHoriAdvance :: + * The advance width of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * linearVertAdvance :: + * The advance height of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * advance :: + * This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the + * transformed (hinted) advance width for the glyph, in 26.6 fractional + * pixel format. As specified with @FT_LOAD_VERTICAL_LAYOUT, it uses + * either the `horiAdvance` or the `vertAdvance` value of `metrics` + * field. + * + * format :: + * This field indicates the format of the image contained in the glyph + * slot. Typically @FT_GLYPH_FORMAT_BITMAP, @FT_GLYPH_FORMAT_OUTLINE, + * or @FT_GLYPH_FORMAT_COMPOSITE, but other values are possible. + * + * bitmap :: + * This field is used as a bitmap descriptor. Note that the address + * and content of the bitmap buffer can change between calls of + * @FT_Load_Glyph and a few other functions. + * + * bitmap_left :: + * The bitmap's left bearing expressed in integer pixels. + * + * bitmap_top :: + * The bitmap's top bearing expressed in integer pixels. This is the + * distance from the baseline to the top-most glyph scanline, upwards + * y~coordinates being **positive**. + * + * outline :: + * The outline descriptor for the current glyph image if its format is + * @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, `outline` can be + * transformed, distorted, emboldened, etc. However, it must not be + * freed. + * + * [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of + * OpenType variation fonts for a selected instance are internally + * handled as 26.6 fractional font units but returned as (rounded) + * integers, as expected. To get unrounded font units, don't use + * @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and + * scale it, using the font's `units_per_EM` value as the ppem. + * + * num_subglyphs :: + * The number of subglyphs in a composite glyph. This field is only + * valid for the composite glyph format that should normally only be + * loaded with the @FT_LOAD_NO_RECURSE flag. + * + * subglyphs :: + * An array of subglyph descriptors for composite glyphs. There are + * `num_subglyphs` elements in there. Currently internal to FreeType. + * + * control_data :: + * Certain font drivers can also return the control data for a given + * glyph image (e.g. TrueType bytecode, Type~1 charstrings, etc.). + * This field is a pointer to such data; it is currently internal to + * FreeType. + * + * control_len :: + * This is the length in bytes of the control data. Currently internal + * to FreeType. + * + * other :: + * Reserved. + * + * lsb_delta :: + * The difference between hinted and unhinted left side bearing while + * auto-hinting is active. Zero otherwise. + * + * rsb_delta :: + * The difference between hinted and unhinted right side bearing while + * auto-hinting is active. Zero otherwise. + * + * @note: + * If @FT_Load_Glyph is called with default flags (see @FT_LOAD_DEFAULT) + * the glyph image is loaded in the glyph slot in its native format + * (e.g., an outline glyph for TrueType and Type~1 formats). [Since 2.9] + * The prospective bitmap metrics are calculated according to + * @FT_LOAD_TARGET_XXX and other flags even for the outline glyph, even + * if @FT_LOAD_RENDER is not set. + * + * This image can later be converted into a bitmap by calling + * @FT_Render_Glyph. This function searches the current renderer for the + * native image's format, then invokes it. + * + * The renderer is in charge of transforming the native image through the + * slot's face transformation fields, then converting it into a bitmap + * that is returned in `slot->bitmap`. + * + * Note that `slot->bitmap_left` and `slot->bitmap_top` are also used to + * specify the position of the bitmap relative to the current pen + * position (e.g., coordinates (0,0) on the baseline). Of course, + * `slot->format` is also changed to @FT_GLYPH_FORMAT_BITMAP. + * + * Here is a small pseudo code fragment that shows how to use `lsb_delta` + * and `rsb_delta` to do fractional positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * + * + * for all glyphs do + * + * + * FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); + * + * + * + * + * + * origin_x += slot->advance.x; + * origin_x += slot->lsb_delta - slot->rsb_delta; + * endfor + * ``` + * + * Here is another small pseudo code fragment that shows how to use + * `lsb_delta` and `rsb_delta` to improve integer positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * FT_Pos prev_rsb_delta = 0; + * + * + * for all glyphs do + * + * + * + * + * if ( prev_rsb_delta - slot->lsb_delta > 32 ) + * origin_x -= 64; + * else if ( prev_rsb_delta - slot->lsb_delta < -31 ) + * origin_x += 64; + * + * prev_rsb_delta = slot->rsb_delta; + * + * + * + * origin_x += slot->advance.x; + * endfor + * ``` + * + * If you use strong auto-hinting, you **must** apply these delta values! + * Otherwise you will experience far too large inter-glyph spacing at + * small rendering sizes in most cases. Note that it doesn't harm to use + * the above code for other hinting modes also, since the delta values + * are zero then. + */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt glyph_index; /* new in 2.10; was reserved previously */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @function: + * FT_Init_FreeType + * + * @description: + * Initialize a new FreeType library object. The set of modules that are + * registered by this function is determined at build time. + * + * @output: + * alibrary :: + * A handle to a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case you want to provide your own memory allocating routines, use + * @FT_New_Library instead, followed by a call to @FT_Add_Default_Modules + * (or a series of calls to @FT_Add_Module) and + * @FT_Set_Default_Properties. + * + * See the documentation of @FT_Library and @FT_Face for multi-threading + * issues. + * + * If you need reference-counting (cf. @FT_Reference_Library), use + * @FT_New_Library and @FT_Done_Library. + * + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_FreeType + * + * @description: + * Destroy a given FreeType library object and all of its children, + * including resources, drivers, faces, sizes, etc. + * + * @input: + * library :: + * A handle to the target library object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /************************************************************************** + * + * @enum: + * FT_OPEN_XXX + * + * @description: + * A list of bit field constants used within the `flags` field of the + * @FT_Open_Args structure. + * + * @values: + * FT_OPEN_MEMORY :: + * This is a memory-based stream. + * + * FT_OPEN_STREAM :: + * Copy the stream from the `stream` field. + * + * FT_OPEN_PATHNAME :: + * Create a new input stream from a C~path name. + * + * FT_OPEN_DRIVER :: + * Use the `driver` field. + * + * FT_OPEN_PARAMS :: + * Use the `num_params` and `params` fields. + * + * @note: + * The `FT_OPEN_MEMORY`, `FT_OPEN_STREAM`, and `FT_OPEN_PATHNAME` flags + * are mutually exclusive. + */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + + + /* these constants are deprecated; use the corresponding `FT_OPEN_XXX` */ + /* values instead */ +#define ft_open_memory FT_OPEN_MEMORY +#define ft_open_stream FT_OPEN_STREAM +#define ft_open_pathname FT_OPEN_PATHNAME +#define ft_open_driver FT_OPEN_DRIVER +#define ft_open_params FT_OPEN_PARAMS + + + /************************************************************************** + * + * @struct: + * FT_Parameter + * + * @description: + * A simple structure to pass more or less generic parameters to + * @FT_Open_Face and @FT_Face_Properties. + * + * @fields: + * tag :: + * A four-byte identification tag. + * + * data :: + * A pointer to the parameter data. + * + * @note: + * The ID and function of parameters are driver-specific. See section + * @parameter_tags for more information. + */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /************************************************************************** + * + * @struct: + * FT_Open_Args + * + * @description: + * A structure to indicate how to open a new font file or stream. A + * pointer to such a structure can be used as a parameter for the + * functions @FT_Open_Face and @FT_Attach_Stream. + * + * @fields: + * flags :: + * A set of bit flags indicating how to use the structure. + * + * memory_base :: + * The first byte of the file in memory. + * + * memory_size :: + * The size in bytes of the file in memory. + * + * pathname :: + * A pointer to an 8-bit file pathname. + * + * stream :: + * A handle to a source stream object. + * + * driver :: + * This field is exclusively used by @FT_Open_Face; it simply specifies + * the font driver to use for opening the face. If set to `NULL`, + * FreeType tries to load the face with each one of the drivers in its + * list. + * + * num_params :: + * The number of extra parameters. + * + * params :: + * Extra parameters passed to the font driver when opening a new face. + * + * @note: + * The stream type is determined by the contents of `flags` that are + * tested in the following order by @FT_Open_Face: + * + * If the @FT_OPEN_MEMORY bit is set, assume that this is a memory file + * of `memory_size` bytes, located at `memory_address`. The data are not + * copied, and the client is responsible for releasing and destroying + * them _after_ the corresponding call to @FT_Done_Face. + * + * Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a custom + * input stream `stream` is used. + * + * Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this is a + * normal file and use `pathname` to open it. + * + * If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to open + * the file with the driver whose handler is in `driver`. + * + * If the @FT_OPEN_PARAMS bit is set, the parameters given by + * `num_params` and `params` is used. They are ignored otherwise. + * + * Ideally, both the `pathname` and `params` fields should be tagged as + * 'const'; this is missing for API backward compatibility. In other + * words, applications should treat them as read-only. + */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /************************************************************************** + * + * @function: + * FT_New_Face + * + * @description: + * Call @FT_Open_Face to open a font by its pathname. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * pathname :: + * A path to the font file. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Use @FT_Done_Face to destroy the created @FT_Face object (along with + * its slot and sizes). + */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_New_Memory_Face + * + * @description: + * Call @FT_Open_Face to open a font that has been loaded into memory. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * file_base :: + * A pointer to the beginning of the font data. + * + * file_size :: + * The size of the memory chunk used by the font data. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You must not deallocate the memory before calling @FT_Done_Face. + */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Open_Face + * + * @description: + * Create a face object from a given resource described by @FT_Open_Args. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * args :: + * A pointer to an `FT_Open_Args` structure that must be filled by the + * caller. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). Set it to~0 if + * there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, specifying the named instance index for the current face + * index (starting with value~1; value~0 makes FreeType ignore named + * instances). For non-variation fonts, bits 16-30 are ignored. + * Assuming that you want to access the third named instance in face~4, + * `face_index` should be set to 0x00030004. If you want to access + * face~4 without variation handling, simply set `face_index` to + * value~4. + * + * `FT_Open_Face` and its siblings can be used to quickly check whether + * the font format of a given font resource is supported by FreeType. + * In general, if the `face_index` argument is negative, the function's + * return value is~0 if the font format is recognized, or non-zero + * otherwise. The function allocates a more or less empty face handle + * in `*aface` (if `aface` isn't `NULL`); the only two useful fields in + * this special case are `face->num_faces` and `face->style_flags`. + * For any negative value of `face_index`, `face->num_faces` gives the + * number of faces within the font file. For the negative value + * '-(N+1)' (with 'N' a non-negative 16-bit value), bits 16-30 in + * `face->style_flags` give the number of named instances in face 'N' + * if we have a variation font (or zero otherwise). After examination, + * the returned @FT_Face structure should be deallocated with a call to + * @FT_Done_Face. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Unlike FreeType 1.x, this function automatically creates a glyph slot + * for the face object that can be accessed directly through + * `face->glyph`. + * + * Each new face object created with this function also owns a default + * @FT_Size object, accessible as `face->size`. + * + * One @FT_Library instance can have multiple face objects, this is, + * @FT_Open_Face and its siblings can be called multiple times using the + * same `library` argument. + * + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + * + * @example: + * To loop over all faces, use code similar to the following snippet + * (omitting the error handling). + * + * ``` + * ... + * FT_Face face; + * FT_Long i, num_faces; + * + * + * error = FT_Open_Face( library, args, -1, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * FT_Done_Face( face ); + * + * for ( i = 0; i < num_faces; i++ ) + * { + * ... + * error = FT_Open_Face( library, args, i, &face ); + * ... + * FT_Done_Face( face ); + * ... + * } + * ``` + * + * To loop over all valid values for `face_index`, use something similar + * to the following snippet, again without error handling. The code + * accesses all faces immediately (thus only a single call of + * `FT_Open_Face` within the do-loop), with and without named instances. + * + * ``` + * ... + * FT_Face face; + * + * FT_Long num_faces = 0; + * FT_Long num_instances = 0; + * + * FT_Long face_idx = 0; + * FT_Long instance_idx = 0; + * + * + * do + * { + * FT_Long id = ( instance_idx << 16 ) + face_idx; + * + * + * error = FT_Open_Face( library, args, id, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * num_instances = face->style_flags >> 16; + * + * ... + * + * FT_Done_Face( face ); + * + * if ( instance_idx < num_instances ) + * instance_idx++; + * else + * { + * face_idx++; + * instance_idx = 0; + * } + * + * } while ( face_idx < num_faces ) + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Attach_File + * + * @description: + * Call @FT_Attach_Stream to attach a file. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * filepathname :: + * The pathname. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /************************************************************************** + * + * @function: + * FT_Attach_Stream + * + * @description: + * 'Attach' data to a face object. Normally, this is used to read + * additional information for the face object. For example, you can + * attach an AFM file that comes with a Type~1 font to get the kerning + * values and other metrics. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * parameters :: + * A pointer to @FT_Open_Args that must be filled by the caller. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The meaning of the 'attach' (i.e., what really happens when the new + * file is read) is not fixed by FreeType itself. It really depends on + * the font format (and thus the font driver). + * + * Client applications are expected to know what they are doing when + * invoking this function. Most drivers simply do not implement file or + * stream attachments. + */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Face + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Face structure is + * created. This function increments the counter. @FT_Done_Face then + * only destroys a face if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Face objects. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Done_Face + * + * @description: + * Discard a given face object, as well as all of its child slots and + * sizes. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Size + * + * @description: + * Select a bitmap strike. To be more precise, this function sets the + * scaling factors of the active @FT_Size object in a face so that + * bitmaps from this particular strike are taken by @FT_Load_Glyph and + * friends. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * strike_index :: + * The index of the bitmap strike in the `available_sizes` field of + * @FT_FaceRec structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For bitmaps embedded in outline fonts it is common that only a subset + * of the available glyphs at a given ppem value is available. FreeType + * silently uses outlines if there is no bitmap for a given glyph index. + * + * For GX and OpenType variation fonts, a bitmap strike makes sense only + * if the default instance is active (this is, no glyph variation takes + * place); otherwise, FreeType simply ignores bitmap strikes. The same + * is true for all named instances that are different from the default + * instance. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /************************************************************************** + * + * @enum: + * FT_Size_Request_Type + * + * @description: + * An enumeration type that lists the supported size request types, i.e., + * what input size (in font units) maps to the requested output size (in + * pixels, as computed from the arguments of @FT_Size_Request). + * + * @values: + * FT_SIZE_REQUEST_TYPE_NOMINAL :: + * The nominal size. The `units_per_EM` field of @FT_FaceRec is used + * to determine both scaling values. + * + * This is the standard scaling found in most applications. In + * particular, use this size request type for TrueType fonts if they + * provide optical scaling or something similar. Note, however, that + * `units_per_EM` is a rather abstract value which bears no relation to + * the actual size of the glyphs in a font. + * + * FT_SIZE_REQUEST_TYPE_REAL_DIM :: + * The real dimension. The sum of the `ascender` and (minus of) the + * `descender` fields of @FT_FaceRec is used to determine both scaling + * values. + * + * FT_SIZE_REQUEST_TYPE_BBOX :: + * The font bounding box. The width and height of the `bbox` field of + * @FT_FaceRec are used to determine the horizontal and vertical + * scaling value, respectively. + * + * FT_SIZE_REQUEST_TYPE_CELL :: + * The `max_advance_width` field of @FT_FaceRec is used to determine + * the horizontal scaling value; the vertical scaling value is + * determined the same way as @FT_SIZE_REQUEST_TYPE_REAL_DIM does. + * Finally, both scaling values are set to the smaller one. This type + * is useful if you want to specify the font size for, say, a window of + * a given dimension and 80x24 cells. + * + * FT_SIZE_REQUEST_TYPE_SCALES :: + * Specify the scaling values directly. + * + * @note: + * The above descriptions only apply to scalable formats. For bitmap + * formats, the behaviour is up to the driver. + * + * See the note section of @FT_Size_Metrics if you wonder how size + * requesting relates to scaling values. + */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /************************************************************************** + * + * @struct: + * FT_Size_RequestRec + * + * @description: + * A structure to model a size request. + * + * @fields: + * type :: + * See @FT_Size_Request_Type. + * + * width :: + * The desired width, given as a 26.6 fractional point value (with 72pt + * = 1in). + * + * height :: + * The desired height, given as a 26.6 fractional point value (with + * 72pt = 1in). + * + * horiResolution :: + * The horizontal resolution (dpi, i.e., pixels per inch). If set to + * zero, `width` is treated as a 26.6 fractional **pixel** value, which + * gets internally rounded to an integer. + * + * vertResolution :: + * The vertical resolution (dpi, i.e., pixels per inch). If set to + * zero, `height` is treated as a 26.6 fractional **pixel** value, + * which gets internally rounded to an integer. + * + * @note: + * If `width` is zero, the horizontal scaling value is set equal to the + * vertical scaling value, and vice versa. + * + * If `type` is `FT_SIZE_REQUEST_TYPE_SCALES`, `width` and `height` are + * interpreted directly as 16.16 fractional scaling values, without any + * further modification, and both `horiResolution` and `vertResolution` + * are ignored. + */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_Request + * + * @description: + * A handle to a size request structure. + */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /************************************************************************** + * + * @function: + * FT_Request_Size + * + * @description: + * Resize the scale of the active @FT_Size object in a face. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * req :: + * A pointer to a @FT_Size_RequestRec. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Although drivers may select the bitmap strike matching the request, + * you should not rely on this if you intend to select a particular + * bitmap strike. Use @FT_Select_Size instead in that case. + * + * The relation between the requested size and the resulting glyph size + * is dependent entirely on how the size is defined in the source face. + * The font designer chooses the final size of each glyph relative to + * this size. For more information refer to + * 'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'. + * + * Contrary to @FT_Set_Char_Size, this function doesn't have special code + * to normalize zero-valued widths, heights, or resolutions (which lead + * to errors in most cases). + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /************************************************************************** + * + * @function: + * FT_Set_Char_Size + * + * @description: + * Call @FT_Request_Size to request the nominal size (in points). + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * char_width :: + * The nominal width, in 26.6 fractional points. + * + * char_height :: + * The nominal height, in 26.6 fractional points. + * + * horz_resolution :: + * The horizontal resolution in dpi. + * + * vert_resolution :: + * The vertical resolution in dpi. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While this function allows fractional points as input values, the + * resulting ppem value for the given resolution is always rounded to the + * nearest integer. + * + * If either the character width or height is zero, it is set equal to + * the other value. + * + * If either the horizontal or vertical resolution is zero, it is set + * equal to the other value. + * + * A character width or height smaller than 1pt is set to 1pt; if both + * resolution values are zero, they are set to 72dpi. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /************************************************************************** + * + * @function: + * FT_Set_Pixel_Sizes + * + * @description: + * Call @FT_Request_Size to request the nominal size (in pixels). + * + * @inout: + * face :: + * A handle to the target face object. + * + * @input: + * pixel_width :: + * The nominal width, in pixels. + * + * pixel_height :: + * The nominal height, in pixels. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should not rely on the resulting glyphs matching or being + * constrained to this pixel size. Refer to @FT_Request_Size to + * understand how requested sizes relate to actual sizes. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /************************************************************************** + * + * @function: + * FT_Load_Glyph + * + * @description: + * Load a glyph into the glyph slot of a face object. + * + * @inout: + * face :: + * A handle to the target face object where the glyph is loaded. + * + * @input: + * glyph_index :: + * The index of the glyph in the font file. For CID-keyed fonts + * (either in PS or in CFF format) this argument specifies the CID + * value. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The loaded glyph may be transformed. See @FT_Set_Transform for the + * details. + * + * For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned + * for invalid CID values (this is, for CID values that don't have a + * corresponding glyph in the font). See the discussion of the + * @FT_FACE_FLAG_CID_KEYED flag for more details. + * + * If you receive `FT_Err_Glyph_Too_Big`, try getting the glyph outline + * at EM size, then scale it manually and fill it as a graphics + * operation. + */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @function: + * FT_Load_Char + * + * @description: + * Load a glyph into the glyph slot of a face object, accessed by its + * character code. + * + * @inout: + * face :: + * A handle to a target face object where the glyph is loaded. + * + * @input: + * char_code :: + * The glyph's character code, according to the current charmap used in + * the face. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. + * + * Many fonts contain glyphs that can't be loaded by this function since + * its glyph indices are not listed in any of the font's charmaps. + * + * If no active cmap is set up (i.e., `face->charmap` is zero), the call + * to @FT_Get_Char_Index is omitted, and the function behaves identically + * to @FT_Load_Glyph. + */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit field constants for @FT_Load_Glyph to indicate what kind + * of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. The + * bitmap data can be accessed from the glyph slot (see note below). + * + * 2. If no embedded bitmap is searched for or found, FreeType looks + * for a scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then 'hinted' to the pixel grid in + * order to optimize it. The outline data can be accessed from the + * glyph slot (see note below). + * + * Note that by default the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the loaded outline glyph but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * If the font is 'tricky' (see @FT_FACE_FLAG_TRICKY for more), using + * `FT_LOAD_NO_SCALE` usually yields meaningless outlines because the + * subglyphs must be scaled and positioned with hinting instructions. + * This can be solved by loading the font without `FT_LOAD_NO_SCALE` + * and setting the character size to `font->units_per_EM`. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates 'blurrier' bitmap glyphs + * when the glyph are rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. In particular, the + * `advance` value in the @FT_GlyphSlotRec structure is set to the + * `vertAdvance` value of the `metrics` field. + * + * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use this + * flag currently. Reason is that in this case vertical metrics get + * synthesized, and those values are not always consistent across + * various font formats. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Prefer the auto-hinter over the font's native hinter. See also the + * note below. + * + * FT_LOAD_PEDANTIC :: + * Make the font driver perform pedantic verifications during glyph + * loading and hinting. This is mostly used to detect broken glyphs in + * fonts. By default, FreeType tries to handle broken fonts also. + * + * In particular, errors from the TrueType bytecode engine are not + * passed to the application if this flag is not set; this might result + * in partially hinted or distorted glyphs in case a glyph's bytecode + * is buggy. + * + * FT_LOAD_NO_RECURSE :: + * Don't load composite glyphs recursively. Instead, the font driver + * fills the `num_subglyph` and `subglyphs` values of the glyph slot; + * it also sets `glyph->format` to @FT_GLYPH_FORMAT_COMPOSITE. The + * description of subglyphs can then be accessed with + * @FT_Get_SubGlyph_Info. + * + * Don't use this flag for retrieving metrics information since some + * font drivers only return rudimentary data. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Ignore the transform matrix set by @FT_Set_Transform. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Keep `linearHoriAdvance` and `linearVertAdvance` fields of + * @FT_GlyphSlotRec in font units. See @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable the auto-hinter. See also the note below. + * + * FT_LOAD_COLOR :: + * Load colored glyphs. There are slight differences depending on the + * font format. + * + * [Since 2.5] Load embedded color bitmap images. The resulting color + * bitmaps, if available, will have the @FT_PIXEL_MODE_BGRA format, + * with pre-multiplied color channels. If the flag is not set and + * color bitmaps are found, they are converted to 256-level gray + * bitmaps, using the @FT_PIXEL_MODE_GRAY format. + * + * [Since 2.10, experimental] If the glyph index contains an entry in + * the face's 'COLR' table with a 'CPAL' palette table (as defined in + * the OpenType specification), make @FT_Render_Glyph provide a default + * blending of the color glyph layers associated with the glyph index, + * using the same bitmap format as embedded color bitmap images. This + * is mainly for convenience; for full control of color layers use + * @FT_Get_Color_Glyph_Layer and FreeType's color functions like + * @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering + * so that the client application can handle blending by itself. + * + * FT_LOAD_COMPUTE_METRICS :: + * [Since 2.6.1] Compute glyph metrics from the glyph data, without the + * use of bundled metrics tables (for example, the 'hdmx' table in + * TrueType fonts). This flag is mainly used by font validating or + * font editing applications, which need to ignore, verify, or edit + * those tables. + * + * Currently, this flag is only implemented for TrueType fonts. + * + * FT_LOAD_BITMAP_METRICS_ONLY :: + * [Since 2.7.1] Request loading of the metrics and bitmap image + * information of a (possibly embedded) bitmap glyph without allocating + * or copying the bitmap image data itself. No effect if the target + * glyph is not a bitmap image. + * + * This flag unsets @FT_LOAD_RENDER. + * + * FT_LOAD_CROP_BITMAP :: + * Ignored. Deprecated. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Ignored. Deprecated. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be used + * at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + * Note that the auto-hinter needs a valid Unicode cmap (either a native + * one or synthesized by FreeType) for producing correct results. If a + * font provides an incorrect mapping (for example, assigning the + * character code U+005A, LATIN CAPITAL LETTER~Z, to a glyph depicting a + * mathematical integral sign), the auto-hinter might produce useless + * results. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE ( 1L << 0 ) +#define FT_LOAD_NO_HINTING ( 1L << 1 ) +#define FT_LOAD_RENDER ( 1L << 2 ) +#define FT_LOAD_NO_BITMAP ( 1L << 3 ) +#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 ) +#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 ) +#define FT_LOAD_CROP_BITMAP ( 1L << 6 ) +#define FT_LOAD_PEDANTIC ( 1L << 7 ) +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 ) +#define FT_LOAD_NO_RECURSE ( 1L << 10 ) +#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) +#define FT_LOAD_MONOCHROME ( 1L << 12 ) +#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) +#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) + /* Bits 16-19 are used by `FT_LOAD_TARGET_` */ +#define FT_LOAD_COLOR ( 1L << 20 ) +#define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) +#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) + + /* */ + + /* used internally only by certain font drivers */ +#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) +#define FT_LOAD_SBITS_ONLY ( 1L << 14 ) + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values to select a specific hinting algorithm for the + * hinter. You should OR one of these values to your `load_flags` when + * calling @FT_Load_Glyph. + * + * Note that a font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * The default hinting algorithm, optimized for standard gray-level + * rendering. For monochrome output, use @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for gray-level modes. Many generated + * glyphs are fuzzier but better resemble their original shape. This + * is achieved by snapping glyphs to the pixel grid only vertically + * (Y-axis), as is done by FreeType's new CFF engine or Microsoft's + * ClearType font renderer. This preserves inter-glyph spacing in + * horizontal text. The snapping is done either by the native font + * driver, if the driver itself and the font support it, or by the + * auto-hinter. + * + * Advance widths are rounded to integer values; however, using the + * `lsb_delta` and `rsb_delta` fields of @FT_GlyphSlotRec, it is + * possible to get fractional advance widths for subpixel positioning + * (which is recommended to use). + * + * If configuration option `AF_CONFIG_OPTION_TT_SIZE_METRICS` is + * active, TrueType-like metrics are used to make this mode behave + * similarly as in unpatched FreeType versions between 2.4.6 and 2.7.1 + * (inclusive). + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * Note that for outline fonts only the TrueType font driver has proper + * monochrome hinting support, provided the TTFs contain hints for B/W + * rendering (which most fonts no longer provide). If these conditions + * are not met it is very likely that you get ugly results at smaller + * sizes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the `FT_LOAD_TARGET_XXX` values in your + * `load_flags`. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode that matches the used algorithm + * best). An exception is `FT_LOAD_TARGET_MONO` since it implies + * @FT_LOAD_MONOCHROME. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the 'light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * ``` + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * ``` + * + * In general, you should stick with one rendering mode. For example, + * switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO + * enforces a lot of recomputation for TrueType fonts, which is slow. + * Another reason is caching: Selecting a different mode usually causes + * changes in both the outlines and the rasterized bitmaps; it is thus + * necessary to empty the cache after a mode switch to avoid false hits. + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /************************************************************************** + * + * @function: + * FT_Set_Transform + * + * @description: + * Set the transformation that is applied to glyph images when they are + * loaded into a glyph slot through @FT_Load_Glyph. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * matrix :: + * A pointer to the transformation's 2x2 matrix. Use `NULL` for the + * identity matrix. + * delta :: + * A pointer to the translation vector. Use `NULL` for the null vector. + * + * @note: + * The transformation is only applied to scalable image formats after the + * glyph has been loaded. It means that hinting is unaltered by the + * transformation and is performed on the character size given in the + * last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. + * + * Note that this also transforms the `face.glyph.advance` field, but + * **not** the values in `face.glyph.metrics`. + */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Render_Mode + * + * @description: + * Render modes supported by FreeType~2. Each mode corresponds to a + * specific type of scanline conversion performed on the outline. + * + * For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode` field + * in the @FT_GlyphSlotRec structure gives the format of the returned + * bitmap. + * + * All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity, + * indicating pixel coverage. Use linear alpha blending and gamma + * correction to correctly render non-monochrome glyph bitmaps onto a + * surface; see @FT_Render_Glyph. + * + * @values: + * FT_RENDER_MODE_NORMAL :: + * Default render mode; it corresponds to 8-bit anti-aliased bitmaps. + * + * FT_RENDER_MODE_LIGHT :: + * This is equivalent to @FT_RENDER_MODE_NORMAL. It is only defined as + * a separate value because render modes are also used indirectly to + * define hinting algorithm selectors. See @FT_LOAD_TARGET_XXX for + * details. + * + * FT_RENDER_MODE_MONO :: + * This mode corresponds to 1-bit bitmaps (with 2~levels of opacity). + * + * FT_RENDER_MODE_LCD :: + * This mode corresponds to horizontal RGB and BGR subpixel displays + * like LCD screens. It produces 8-bit bitmaps that are 3~times the + * width of the original glyph outline in pixels, and which use the + * @FT_PIXEL_MODE_LCD mode. + * + * FT_RENDER_MODE_LCD_V :: + * This mode corresponds to vertical RGB and BGR subpixel displays + * (like PDA screens, rotated LCD displays, etc.). It produces 8-bit + * bitmaps that are 3~times the height of the original glyph outline in + * pixels and use the @FT_PIXEL_MODE_LCD_V mode. + * + * @note: + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h`, which enables patented ClearType-style rendering, the + * LCD-optimized glyph bitmaps should be filtered to reduce color fringes + * inherent to this technology. You can either set up LCD filtering with + * @FT_Library_SetLcdFilter or @FT_Face_Properties, or do the filtering + * yourself. The default FreeType LCD rendering technology does not + * require filtering. + * + * The selected render mode only affects vector glyphs of a font. + * Embedded bitmaps often have a different pixel mode like + * @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform them + * into 8-bit pixmaps. + */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Render_Mode` values instead */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /************************************************************************** + * + * @function: + * FT_Render_Glyph + * + * @description: + * Convert a given glyph image to a bitmap. It does so by inspecting the + * glyph image format, finding the relevant renderer, and invoking it. + * + * @inout: + * slot :: + * A handle to the glyph slot containing the image to convert. + * + * @input: + * render_mode :: + * The render mode used to render the glyph image into a bitmap. See + * @FT_Render_Mode for a list of possible values. + * + * If @FT_RENDER_MODE_NORMAL is used, a previous call of @FT_Load_Glyph + * with flag @FT_LOAD_COLOR makes FT_Render_Glyph provide a default + * blending of colored glyph layers associated with the current glyph + * slot (provided the font contains such layers) instead of rendering + * the glyph slot's outline. This is an experimental feature; see + * @FT_LOAD_COLOR for more information. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling `FT_Render_Glyph`. + * + * When FreeType outputs a bitmap of a glyph, it really outputs an alpha + * coverage map. If a pixel is completely covered by a filled-in + * outline, the bitmap contains 0xFF at that pixel, meaning that + * 0xFF/0xFF fraction of that pixel is covered, meaning the pixel is 100% + * black (or 0% bright). If a pixel is only 50% covered (value 0x80), + * the pixel is made 50% black (50% bright or a middle shade of grey). + * 0% covered means 0% black (100% bright or white). + * + * On high-DPI screens like on smartphones and tablets, the pixels are so + * small that their chance of being completely covered and therefore + * completely black are fairly good. On the low-DPI screens, however, + * the situation is different. The pixels are too large for most of the + * details of a glyph and shades of gray are the norm rather than the + * exception. + * + * This is relevant because all our screens have a second problem: they + * are not linear. 1~+~1 is not~2. Twice the value does not result in + * twice the brightness. When a pixel is only 50% covered, the coverage + * map says 50% black, and this translates to a pixel value of 128 when + * you use 8~bits per channel (0-255). However, this does not translate + * to 50% brightness for that pixel on our sRGB and gamma~2.2 screens. + * Due to their non-linearity, they dwell longer in the darks and only a + * pixel value of about 186 results in 50% brightness -- 128 ends up too + * dark on both bright and dark backgrounds. The net result is that dark + * text looks burnt-out, pixely and blotchy on bright background, bright + * text too frail on dark backgrounds, and colored text on colored + * background (for example, red on green) seems to have dark halos or + * 'dirt' around it. The situation is especially ugly for diagonal stems + * like in 'w' glyph shapes where the quality of FreeType's anti-aliasing + * depends on the correct display of grays. On high-DPI screens where + * smaller, fully black pixels reign supreme, this doesn't matter, but on + * our low-DPI screens with all the gray shades, it does. 0% and 100% + * brightness are the same things in linear and non-linear space, just + * all the shades in-between aren't. + * + * The blending function for placing text over a background is + * + * ``` + * dst = alpha * src + (1 - alpha) * dst , + * ``` + * + * which is known as the OVER operator. + * + * To correctly composite an antialiased pixel of a glyph onto a surface, + * + * 1. take the foreground and background colors (e.g., in sRGB space) + * and apply gamma to get them in a linear space, + * + * 2. use OVER to blend the two linear colors using the glyph pixel + * as the alpha value (remember, the glyph bitmap is an alpha coverage + * bitmap), and + * + * 3. apply inverse gamma to the blended pixel and write it back to + * the image. + * + * Internal testing at Adobe found that a target inverse gamma of~1.8 for + * step~3 gives good results across a wide range of displays with an sRGB + * gamma curve or a similar one. + * + * This process can cost performance. There is an approximation that + * does not need to know about the background color; see + * https://bel.fi/alankila/lcd/ and + * https://bel.fi/alankila/lcd/alpcor.html for details. + * + * **ATTENTION**: Linear blending is even more important when dealing + * with subpixel-rendered glyphs to prevent color-fringing! A + * subpixel-rendered glyph must first be filtered with a filter that + * gives equal weight to the three color primaries and does not exceed a + * sum of 0x100, see section @lcd_rendering. Then the only difference to + * gray linear blending is that subpixel-rendered linear blending is done + * 3~times per pixel: red foreground subpixel to red background subpixel + * and so on for green and blue. + */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /************************************************************************** + * + * @enum: + * FT_Kerning_Mode + * + * @description: + * An enumeration to specify the format of kerning values returned by + * @FT_Get_Kerning. + * + * @values: + * FT_KERNING_DEFAULT :: + * Return grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNFITTED :: + * Return un-grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNSCALED :: + * Return the kerning vector in original font units. + * + * @note: + * `FT_KERNING_DEFAULT` returns full pixel values; it also makes FreeType + * heuristically scale down kerning distances at small ppem values so + * that they don't become too big. + * + * Both `FT_KERNING_DEFAULT` and `FT_KERNING_UNFITTED` use the current + * horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to + * convert font units to pixels. + */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Kerning_Mode` values instead */ +#define ft_kerning_default FT_KERNING_DEFAULT +#define ft_kerning_unfitted FT_KERNING_UNFITTED +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /************************************************************************** + * + * @function: + * FT_Get_Kerning + * + * @description: + * Return the kerning vector between two glyphs of the same face. + * + * @input: + * face :: + * A handle to a source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * kern_mode :: + * See @FT_Kerning_Mode for more information. Determines the scale and + * dimension of the returned kerning vector. + * + * @output: + * akerning :: + * The kerning vector. This is either in font units, fractional pixels + * (26.6 format), or pixels for scalable formats, and in pixels for + * fixed-sizes formats. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Only horizontal layouts (left-to-right & right-to-left) are supported + * by this method. Other layouts, or more sophisticated kernings, are + * out of the scope of this API function -- they can be implemented + * through format-specific interfaces. + * + * Kerning for OpenType fonts implemented in a 'GPOS' table is not + * supported; use @FT_HAS_KERNING to find out whether a font has data + * that can be extracted with `FT_Get_Kerning`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Track_Kerning + * + * @description: + * Return the track kerning for a given face object at a given size. + * + * @input: + * face :: + * A handle to a source face object. + * + * point_size :: + * The point size in 16.16 fractional points. + * + * degree :: + * The degree of tightness. Increasingly negative values represent + * tighter track kerning, while increasingly positive values represent + * looser track kerning. Value zero means no track kerning. + * + * @output: + * akerning :: + * The kerning in 16.16 fractional points, to be uniformly applied + * between all glyphs. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Currently, only the Type~1 font driver supports track kerning, using + * data from AFM files (if attached with @FT_Attach_File or + * @FT_Attach_Stream). + * + * Only very few AFM files come with track kerning data; please refer to + * Adobe's AFM specification for more details. + */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph_Name + * + * @description: + * Retrieve the ASCII name of a given glyph in a face. This only works + * for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. + * + * @input: + * face :: + * A handle to a source face object. + * + * glyph_index :: + * The glyph index. + * + * buffer_max :: + * The maximum number of bytes available in the buffer. + * + * @output: + * buffer :: + * A pointer to a target buffer where the name is copied to. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error is returned if the face doesn't provide glyph names or if the + * glyph index is invalid. In all cases of failure, the first byte of + * `buffer` is set to~0 to indicate an empty name. + * + * The glyph name is truncated to fit within the buffer if it is too + * long. The returned string is always zero-terminated. + * + * Be aware that FreeType reorders glyph indices internally so that glyph + * index~0 always corresponds to the 'missing glyph' (called '.notdef'). + * + * This function always returns an error if the config macro + * `FT_CONFIG_OPTION_NO_GLYPH_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /************************************************************************** + * + * @function: + * FT_Get_Postscript_Name + * + * @description: + * Retrieve the ASCII PostScript name of a given face, if available. + * This only works with PostScript, TrueType, and OpenType fonts. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to the face's PostScript name. `NULL` if unavailable. + * + * @note: + * The returned pointer is owned by the face and is destroyed with it. + * + * For variation fonts, this string changes if you select a different + * instance, and you have to call `FT_Get_PostScript_Name` again to + * retrieve it. FreeType follows Adobe TechNote #5902, 'Generating + * PostScript Names for Fonts Using OpenType Font Variations'. + * + * https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html + * + * [Since 2.9] Special PostScript names for named instances are only + * returned if the named instance is set with @FT_Set_Named_Instance (and + * the font has corresponding entries in its 'fvar' table). If + * @FT_IS_VARIATION returns true, the algorithmically derived PostScript + * name is provided, not looking up special entries for named instances. + */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Charmap + * + * @description: + * Select a given charmap by its encoding tag (as listed in + * `freetype.h`). + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * encoding :: + * A handle to the selected encoding. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if no charmap in the face corresponds + * to the encoding queried here. + * + * Because many fonts contain more than a single cmap for Unicode + * encoding, this function has some special code to select the one that + * covers Unicode best ('best' in the sense that a UCS-4 cmap is + * preferred to a UCS-2 cmap). It is thus preferable to @FT_Set_Charmap + * in this case. + */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /************************************************************************** + * + * @function: + * FT_Set_Charmap + * + * @description: + * Select a given charmap for character code to glyph index mapping. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * charmap :: + * A handle to the selected charmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if the charmap is not part of the face + * (i.e., if it is not listed in the `face->charmaps` table). + * + * It also fails if an OpenType type~14 charmap is selected (which + * doesn't map character codes to glyph indices at all). + */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap` belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Char_Index + * + * @description: + * Return the glyph index of a given character code. This function uses + * the currently selected charmap to do the mapping. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. If + * the first glyph is not named '.notdef', then for Type~1 and Type~42 + * fonts, '.notdef' will be moved into the glyph ID~0 position, and + * whatever was there will be moved to the position '.notdef' had. For + * Type~1 fonts, if there is no '.notdef' glyph at all, then one will be + * created at index~0 and whatever was there will be moved to the last + * index -- Type~42 fonts are considered invalid under this condition. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Get_First_Char + * + * @description: + * Return the first character code in the current charmap of a given + * face, together with its corresponding glyph index. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * agindex :: + * Glyph index of first character code. 0~if charmap is empty. + * + * @return: + * The charmap's first character code. + * + * @note: + * You should use this function together with @FT_Get_Next_Char to parse + * all character codes available in a given charmap. The code should + * look like this: + * + * ``` + * FT_ULong charcode; + * FT_UInt gindex; + * + * + * charcode = FT_Get_First_Char( face, &gindex ); + * while ( gindex != 0 ) + * { + * ... do something with (charcode,gindex) pair ... + * + * charcode = FT_Get_Next_Char( face, charcode, &gindex ); + * } + * ``` + * + * Be aware that character codes can have values up to 0xFFFFFFFF; this + * might happen for non-Unicode or malformed cmaps. However, even with + * regular Unicode encoding, so-called 'last resort fonts' (using SFNT + * cmap format 13, see function @FT_Get_CMap_Format) normally have + * entries for all Unicode characters up to 0x1FFFFF, which can cause *a + * lot* of iterations. + * + * Note that `*agindex` is set to~0 if the charmap is empty. The result + * itself can be~0 in two cases: if the charmap is empty or if the + * value~0 is the first valid character code. + */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Get_Next_Char + * + * @description: + * Return the next character code in the current charmap of a given face + * following the value `char_code`, as well as the corresponding glyph + * index. + * + * @input: + * face :: + * A handle to the source face object. + * + * char_code :: + * The starting character code. + * + * @output: + * agindex :: + * Glyph index of next character code. 0~if charmap is empty. + * + * @return: + * The charmap's next character code. + * + * @note: + * You should use this function with @FT_Get_First_Char to walk over all + * character codes available in a given charmap. See the note for that + * function for a simple code example. + * + * Note that `*agindex` is set to~0 when there are no more codes in the + * charmap. + */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Face_Properties + * + * @description: + * Set or override certain (library or module-wide) properties on a + * face-by-face basis. Useful for finer-grained control and avoiding + * locks on shared structures (threads can modify their own faces as they + * see fit). + * + * Contrary to @FT_Property_Set, this function uses @FT_Parameter so that + * you can pass multiple properties to the target face in one call. Note + * that only a subset of the available properties can be controlled. + * + * * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the + * property `no-stem-darkening` provided by the 'autofit', 'cff', + * 'type1', and 't1cid' modules; see @no-stem-darkening). + * + * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding + * to function @FT_Library_SetLcdFilterWeights). + * + * * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID + * 'random' operator, corresponding to the `random-seed` property + * provided by the 'cff', 'type1', and 't1cid' modules; see + * @random-seed). + * + * Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the + * option and use the library or module default again. + * + * @input: + * face :: + * A handle to the source face object. + * + * num_properties :: + * The number of properties that follow. + * + * properties :: + * A handle to an @FT_Parameter array with `num_properties` elements. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * Here is an example that sets three properties. You must define + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` to make the LCD filter examples + * work. + * + * ``` + * FT_Parameter property1; + * FT_Bool darken_stems = 1; + * + * FT_Parameter property2; + * FT_LcdFiveTapFilter custom_weight = + * { 0x11, 0x44, 0x56, 0x44, 0x11 }; + * + * FT_Parameter property3; + * FT_Int32 random_seed = 314159265; + * + * FT_Parameter properties[3] = { property1, + * property2, + * property3 }; + * + * + * property1.tag = FT_PARAM_TAG_STEM_DARKENING; + * property1.data = &darken_stems; + * + * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property2.data = custom_weight; + * + * property3.tag = FT_PARAM_TAG_RANDOM_SEED; + * property3.data = &random_seed; + * + * FT_Face_Properties( face, 3, properties ); + * ``` + * + * The next example resets a single property to its default value. + * + * ``` + * FT_Parameter property; + * + * + * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.data = NULL; + * + * FT_Face_Properties( face, 1, &property ); + * ``` + * + * @since: + * 2.8 + * + */ + FT_EXPORT( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ); + + + /************************************************************************** + * + * @function: + * FT_Get_Name_Index + * + * @description: + * Return the glyph index of a given glyph name. + * + * @input: + * face :: + * A handle to the source face object. + * + * glyph_name :: + * The glyph name. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ); + + + /************************************************************************** + * + * @enum: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants describing subglyphs. Please refer to the 'glyf' + * table description in the OpenType specification for the meaning of the + * various flags (which get synthesized for non-OpenType subglyphs). + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************** + * + * @function: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format` is @FT_GLYPH_FORMAT_COMPOSITE; an error is returned + * otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs`. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1`, `*p_arg2`, and `*p_transform` must be + * interpreted depending on the flags returned in `*p_flags`. See the + * OpenType specification for details. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /************************************************************************** + * + * @section: + * layer_management + * + * @title: + * Glyph Layer Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'COLR' table data. + * + * @description: + * The functions described here allow access of colored glyph layer data + * in OpenType's 'COLR' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_LayerIterator + * + * @description: + * This iterator object is needed for @FT_Get_Color_Glyph_Layer. + * + * @fields: + * num_layers :: + * The number of glyph layers for the requested glyph index. Will be + * set by @FT_Get_Color_Glyph_Layer. + * + * layer :: + * The current layer. Will be set by @FT_Get_Color_Glyph_Layer. + * + * p :: + * An opaque pointer into 'COLR' table data. The caller must set this + * to `NULL` before the first call of @FT_Get_Color_Glyph_Layer. + */ + typedef struct FT_LayerIterator_ + { + FT_UInt num_layers; + FT_UInt layer; + FT_Byte* p; + + } FT_LayerIterator; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Layer + * + * @description: + * This is an interface to the 'COLR' table in OpenType fonts to + * iteratively retrieve the colored glyph layers associated with the + * current glyph slot. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/colr + * + * The glyph layer data for a given glyph index, if present, provides an + * alternative, multi-colour glyph representation: Instead of rendering + * the outline or bitmap with the given glyph index, glyphs with the + * indices and colors returned by this function are rendered layer by + * layer. + * + * The returned elements are ordered in the z~direction from bottom to + * top; the 'n'th element should be rendered with the associated palette + * color and blended on top of the already rendered layers (elements 0, + * 1, ..., n-1). + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @inout: + * iterator :: + * An @FT_LayerIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * aglyph_index :: + * The glyph index of the current layer. + * + * acolor_index :: + * The color index into the font face's color palette of the current + * layer. The value 0xFFFF is special; it doesn't reference a palette + * entry but indicates that the text foreground color should be used + * instead (to be set up by the application outside of FreeType). + * + * The color palette can be retrieved with @FT_Palette_Select. + * + * @return: + * Value~1 if everything is OK. If there are no more layers (or if there + * are no layers at all), value~0 gets returned. In case of an error, + * value~0 is returned also. + * + * @note: + * This function is necessary if you want to handle glyph layers by + * yourself. In particular, functions that operate with @FT_GlyphRec + * objects (like @FT_Get_Glyph or @FT_Glyph_To_Bitmap) don't have access + * to this information. + * + * Note that @FT_Render_Glyph is able to handle colored glyph layers + * automatically if the @FT_LOAD_COLOR flag is passed to a previous call + * to @FT_Load_Glyph. [This is an experimental feature.] + * + * @example: + * ``` + * FT_Color* palette; + * FT_LayerIterator iterator; + * + * FT_Bool have_layers; + * FT_UInt layer_glyph_index; + * FT_UInt layer_color_index; + * + * + * error = FT_Palette_Select( face, palette_index, &palette ); + * if ( error ) + * palette = NULL; + * + * iterator.p = NULL; + * have_layers = FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ); + * + * if ( palette && have_layers ) + * { + * do + * { + * FT_Color layer_color; + * + * + * if ( layer_color_index == 0xFFFF ) + * layer_color = text_foreground_color; + * else + * layer_color = palette[layer_color_index]; + * + * // Load and render glyph `layer_glyph_index', then + * // blend resulting pixmap (using color `layer_color') + * // with previously created pixmaps. + * + * } while ( FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ) ); + * } + * ``` + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Layer( FT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @enum: + * FT_FSTYPE_XXX + * + * @description: + * A list of bit flags used in the `fsType` field of the OS/2 table in a + * TrueType or OpenType font and the `FSType` entry in a PostScript font. + * These bit flags are returned by @FT_Get_FSType_Flags; they inform + * client applications of embedding and subsetting restrictions + * associated with a font. + * + * See + * https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf + * for more details. + * + * @values: + * FT_FSTYPE_INSTALLABLE_EMBEDDING :: + * Fonts with no fsType bit set may be embedded and permanently + * installed on the remote system by an application. + * + * FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: + * Fonts that have only this bit set must not be modified, embedded or + * exchanged in any manner without first obtaining permission of the + * font software copyright owner. + * + * FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: + * The font may be embedded and temporarily loaded on the remote + * system. Documents containing Preview & Print fonts must be opened + * 'read-only'; no edits can be applied to the document. + * + * FT_FSTYPE_EDITABLE_EMBEDDING :: + * The font may be embedded but must only be installed temporarily on + * other systems. In contrast to Preview & Print fonts, documents + * containing editable fonts may be opened for reading, editing is + * permitted, and changes may be saved. + * + * FT_FSTYPE_NO_SUBSETTING :: + * The font may not be subsetted prior to embedding. + * + * FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: + * Only bitmaps contained in the font may be embedded; no outline data + * may be embedded. If there are no bitmaps available in the font, + * then the font is unembeddable. + * + * @note: + * The flags are ORed together, thus more than a single value can be + * returned. + * + * While the `fsType` flags can indicate that a font may be embedded, a + * license with the font vendor may be separately required to use the + * font in this way. + */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /************************************************************************** + * + * @function: + * FT_Get_FSType_Flags + * + * @description: + * Return the `fsType` flags for a font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * The `fsType` flags, see @FT_FSTYPE_XXX. + * + * @note: + * Use this function rather than directly reading the `fs_type` field in + * the @PS_FontInfoRec structure, which is only guaranteed to return the + * correct results for Type~1 fonts. + * + * @since: + * 2.3.8 + */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /************************************************************************** + * + * @section: + * glyph_variants + * + * @title: + * Unicode Variation Sequences + * + * @abstract: + * The FreeType~2 interface to Unicode Variation Sequences (UVS), using + * the SFNT cmap format~14. + * + * @description: + * Many characters, especially for CJK scripts, have variant forms. They + * are a sort of grey area somewhere between being totally irrelevant and + * semantically distinct; for this reason, the Unicode consortium decided + * to introduce Variation Sequences (VS), consisting of a Unicode base + * character and a variation selector instead of further extending the + * already huge number of characters. + * + * Unicode maintains two different sets, namely 'Standardized Variation + * Sequences' and registered 'Ideographic Variation Sequences' (IVS), + * collected in the 'Ideographic Variation Database' (IVD). + * + * https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt + * https://unicode.org/reports/tr37/ https://unicode.org/ivd/ + * + * To date (January 2017), the character with the most ideographic + * variations is U+9089, having 32 such IVS. + * + * Three Mongolian Variation Selectors have the values U+180B-U+180D; 256 + * generic Variation Selectors are encoded in the ranges U+FE00-U+FE0F + * and U+E0100-U+E01EF. IVS currently use Variation Selectors from the + * range U+E0100-U+E01EF only. + * + * A VS consists of the base character value followed by a single + * Variation Selector. For example, to get the first variation of + * U+9089, you have to write the character sequence `U+9089 U+E0100`. + * + * Adobe and MS decided to support both standardized and ideographic VS + * with a new cmap subtable (format~14). It is an odd subtable because + * it is not a mapping of input code points to glyphs, but contains lists + * of all variations supported by the font. + * + * A variation may be either 'default' or 'non-default' for a given font. + * A default variation is the one you will get for that code point if you + * look it up in the standard Unicode cmap. A non-default variation is a + * different glyph. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIndex + * + * @description: + * Return the glyph index of a given character code as modified by the + * variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code point in Unicode. + * + * variantSelector :: + * The Unicode code point of the variation selector. + * + * @return: + * The glyph index. 0~means either 'undefined character code', or + * 'undefined selector code', or 'no variation selector cmap subtable', + * or 'current CharMap is not Unicode'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. + * + * This function is only meaningful if + * a) the font has a variation selector cmap sub table, and + * b) the current charmap has a Unicode encoding. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIsDefault + * + * @description: + * Check whether this variation of this Unicode character is the one to + * be found in the charmap. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * variantSelector :: + * The Unicode codepoint of the variation selector. + * + * @return: + * 1~if found in the standard (Unicode) cmap, 0~if found in the variation + * selector cmap, or -1 if it is not a variation. + * + * @note: + * This function is only meaningful if the font has a variation selector + * cmap subtable. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantSelectors + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found in + * the font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to an array of selector code points, or `NULL` if there is + * no valid variation selector cmap subtable. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantsOfChar + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found for + * the specified character code. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * @return: + * A pointer to an array of variation selector code points that are + * active for the given character, or `NULL` if the corresponding list is + * empty. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharsOfVariant + * + * @description: + * Return a zero-terminated list of Unicode character codes found for the + * specified variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * variantSelector :: + * The variation selector code point in Unicode. + * + * @return: + * A list of all the code points that are specified by this selector + * (both default and non-default codes are returned) or `NULL` if there + * is no valid cmap or the variation selector is invalid. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @section: + * computations + * + * @title: + * Computations + * + * @abstract: + * Crunching fixed numbers and vectors. + * + * @description: + * This section contains various functions used to perform computations + * on 16.16 fixed-float numbers or 2d vectors. + * + * **Attention**: Most arithmetic functions take `FT_Long` as arguments. + * For historical reasons, FreeType was designed under the assumption + * that `FT_Long` is a 32-bit integer; results can thus be undefined if + * the arguments don't fit into 32 bits. + * + * @order: + * FT_MulDiv + * FT_MulFix + * FT_DivFix + * FT_RoundFix + * FT_CeilFix + * FT_FloorFix + * FT_Vector_Transform + * FT_Matrix_Multiply + * FT_Matrix_Invert + * + */ + + + /************************************************************************** + * + * @function: + * FT_MulDiv + * + * @description: + * Compute `(a*b)/c` with maximum accuracy, using a 64-bit intermediate + * integer whenever necessary. + * + * This function isn't necessarily as fast as some processor-specific + * operations, but is at least completely portable. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. + * + * c :: + * The divisor. + * + * @return: + * The result of `(a*b)/c`. This function never traps when trying to + * divide by zero; it simply returns 'MaxInt' or 'MinInt' depending on + * the signs of `a` and `b`. + */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /************************************************************************** + * + * @function: + * FT_MulFix + * + * @description: + * Compute `(a*b)/0x10000` with maximum accuracy. Its main use is to + * multiply a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. Use a 16.16 factor here whenever possible + * (see note below). + * + * @return: + * The result of `(a*b)/0x10000`. + * + * @note: + * This function has been optimized for the case where the absolute value + * of `a` is less than 2048, and `b` is a 16.16 scaling factor. As this + * happens mainly when scaling from notional units to fractional pixels + * in FreeType, it resulted in noticeable speed improvements between + * versions 2.x and 1.x. + * + * As a conclusion, always try to place a 16.16 factor as the _second_ + * argument of this function; this can make a great difference. + */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_DivFix + * + * @description: + * Compute `(a*0x10000)/b` with maximum accuracy. Its main use is to + * divide a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The numerator. + * + * b :: + * The denominator. Use a 16.16 factor here. + * + * @return: + * The result of `(a*0x10000)/b`. + */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_RoundFix + * + * @description: + * Round a 16.16 fixed number. + * + * @input: + * a :: + * The number to be rounded. + * + * @return: + * `a` rounded to the nearest 16.16 fixed integer, halfway cases away + * from zero. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_CeilFix + * + * @description: + * Compute the smallest following integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the ceiling function is to be computed. + * + * @return: + * `a` rounded towards plus infinity. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_FloorFix + * + * @description: + * Compute the largest previous integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the floor function is to be computed. + * + * @return: + * `a` rounded towards minus infinity. + */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Transform + * + * @description: + * Transform a single vector through a 2x2 matrix. + * + * @inout: + * vector :: + * The target vector to transform. + * + * @input: + * matrix :: + * A pointer to the source 2x2 matrix. + * + * @note: + * The result is undefined if either `vector` or `matrix` is invalid. + */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @section: + * version + * + * @title: + * FreeType Version + * + * @abstract: + * Functions and macros related to FreeType versions. + * + * @description: + * Note that those functions and macros are of limited use because even a + * new release of FreeType with only documentation changes increases the + * version number. + * + * @order: + * FT_Library_Version + * + * FREETYPE_MAJOR + * FREETYPE_MINOR + * FREETYPE_PATCH + * + * FT_Face_CheckTrueTypePatents + * FT_Face_SetUnpatentedHinting + * + */ + + + /************************************************************************** + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. Use + * @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: + * The major version number. + * FREETYPE_MINOR :: + * The minor version number. + * FREETYPE_PATCH :: + * The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library with + * the 'libtool' package is _not_ controlled by these three macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 10 +#define FREETYPE_PATCH 1 + + + /************************************************************************** + * + * @function: + * FT_Library_Version + * + * @description: + * Return the version of the FreeType library being used. This is useful + * when dynamically linking to the library, since one cannot use the + * macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and @FREETYPE_PATCH. + * + * @input: + * library :: + * A source library handle. + * + * @output: + * amajor :: + * The major version number. + * + * aminor :: + * The minor version number. + * + * apatch :: + * The patch version number. + * + * @note: + * The reason why this function takes a `library` argument is because + * certain programs implement library initialization in a custom way that + * doesn't use @FT_Init_FreeType. + * + * In such cases, the library version might not be available before the + * library object has been created. + */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /************************************************************************** + * + * @function: + * FT_Face_CheckTrueTypePatents + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_SetUnpatentedHinting + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * value :: + * New boolean setting. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* FREETYPE_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftadvanc.h b/deps/freetype/include/freetype/ftadvanc.h new file mode 100644 index 00000000..95c38f92 --- /dev/null +++ b/deps/freetype/include/freetype/ftadvanc.h @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * ftadvanc.h + * + * Quick computation of advance widths (specification only). + * + * Copyright (C) 2008-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTADVANC_H_ +#define FTADVANC_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + * + * @order: + * FT_Get_Advance + * FT_Get_Advances + * + */ + + + /************************************************************************** + * + * @enum: + * FT_ADVANCE_FLAG_FAST_ONLY + * + * @description: + * A bit-flag to be OR-ed with the `flags` parameter of the + * @FT_Get_Advance and @FT_Get_Advances functions. + * + * If set, it indicates that you want these functions to fail if the + * corresponding hinting mode or font driver doesn't allow for very quick + * advance computation. + * + * Typically, glyphs that are either unscaled, unhinted, bitmapped, or + * light-hinted can have their advance width computed very quickly. + * + * Normal and bytecode hinted modes that require loading, scaling, and + * hinting of the glyph outline, are extremely slow by comparison. + */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000L + + + /************************************************************************** + * + * @function: + * FT_Get_Advance + * + * @description: + * Retrieve the advance value of a given glyph outline in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * gindex :: + * The glyph index. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph, used to determine what kind of advances you need. + * @output: + * padvance :: + * The advance value. If scaling is performed (based on the value of + * `load_flags`), the advance value is in 16.16 format. Otherwise, it + * is in font units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, this is the vertical advance + * corresponding to a vertical layout. Otherwise, it is the horizontal + * advance in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * A scaled advance is returned in 16.16 format but isn't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /************************************************************************** + * + * @function: + * FT_Get_Advances + * + * @description: + * Retrieve the advance values of several glyph outlines in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * start :: + * The first glyph index. + * + * count :: + * The number of advance values you want to retrieve. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph. + * + * @output: + * padvance :: + * The advance values. This array, to be provided by the caller, must + * contain at least `count` elements. + * + * If scaling is performed (based on the value of `load_flags`), the + * advance values are in 16.16 format. Otherwise, they are in font + * units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, these are the vertical advances + * corresponding to a vertical layout. Otherwise, they are the + * horizontal advances in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * Scaled advances are returned in 16.16 format but aren't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + + /* */ + + +FT_END_HEADER + +#endif /* FTADVANC_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftbbox.h b/deps/freetype/include/freetype/ftbbox.h new file mode 100644 index 00000000..22da70c0 --- /dev/null +++ b/deps/freetype/include/freetype/ftbbox.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbbox.h + * + * FreeType exact bbox computation (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component has a _single_ role: to compute exact outline bounding + * boxes. + * + * It is separated from the rest of the engine for various technical + * reasons. It may well be integrated in 'ftoutln' later. + * + */ + + +#ifndef FTBBOX_H_ +#define FTBBOX_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_BBox + * + * @description: + * Compute the exact bounding box of an outline. This is slower than + * computing the control box. However, it uses an advanced algorithm + * that returns _very_ quickly when the two boxes coincide. Otherwise, + * the outline Bezier arcs are traversed to extract their extrema. + * + * @input: + * outline :: + * A pointer to the source outline. + * + * @output: + * abbox :: + * The outline's exact bounding box. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get + * reasonable values for the BBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the BBox, which can be + * eventually converted back to font units. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBBOX_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/ftbdf.h b/deps/freetype/include/freetype/ftbdf.h new file mode 100644 index 00000000..1c46da59 --- /dev/null +++ b/deps/freetype/include/freetype/ftbdf.h @@ -0,0 +1,213 @@ +/**************************************************************************** + * + * ftbdf.h + * + * FreeType API for accessing BDF-specific strings (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBDF_H_ +#define FTBDF_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bdf_fonts + * + * @title: + * BDF and PCF Files + * + * @abstract: + * BDF and PCF specific API. + * + * @description: + * This section contains the declaration of functions specific to BDF and + * PCF fonts. + * + */ + + + /************************************************************************** + * + * @enum: + * BDF_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /************************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given BDF/PCF + * property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /************************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. May be + * `NULL`, indicating an empty string. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to the BDF + * specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: + * A handle to the input face. + * + * name :: + * The property name. + * + * @output: + * aproperty :: + * The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A 'property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props` array within a `FontRec` structure of a PCF font. + * + * Integer properties are always stored as 'signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type` is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* FTBDF_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftbitmap.h b/deps/freetype/include/freetype/ftbitmap.h new file mode 100644 index 00000000..a6acdb96 --- /dev/null +++ b/deps/freetype/include/freetype/ftbitmap.h @@ -0,0 +1,330 @@ +/**************************************************************************** + * + * ftbitmap.h + * + * FreeType utility functions for bitmaps (specification). + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBITMAP_H_ +#define FTBITMAP_H_ + + +#include +#include FT_FREETYPE_H +#include FT_COLOR_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bitmap_handling + * + * @title: + * Bitmap Handling + * + * @abstract: + * Handling FT_Bitmap objects. + * + * @description: + * This section contains functions for handling @FT_Bitmap objects, + * automatically adjusting the target's bitmap buffer size as needed. + * + * Note that none of the functions changes the bitmap's 'flow' (as + * indicated by the sign of the `pitch` field in @FT_Bitmap). + * + * To set the flow, assign an appropriate positive or negative value to + * the `pitch` field of the target @FT_Bitmap object after calling + * @FT_Bitmap_Init but before calling any of the other functions + * described here. + */ + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Init + * + * @description: + * Initialize a pointer to an @FT_Bitmap structure. + * + * @inout: + * abitmap :: + * A pointer to the bitmap structure. + * + * @note: + * A deprecated name for the same function is `FT_Bitmap_New`. + */ + FT_EXPORT( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ); + + + /* deprecated */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Copy + * + * @description: + * Copy a bitmap into another one. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * A handle to the source bitmap. + * + * @output: + * target :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Embolden + * + * @description: + * Embolden a bitmap. The new bitmap will be about `xStrength` pixels + * wider and `yStrength` pixels higher. The left and bottom borders are + * kept unchanged. + * + * @input: + * library :: + * A handle to a library object. + * + * xStrength :: + * How strong the glyph is emboldened horizontally. Expressed in 26.6 + * pixel format. + * + * yStrength :: + * How strong the glyph is emboldened vertically. Expressed in 26.6 + * pixel format. + * + * @inout: + * bitmap :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The current implementation restricts `xStrength` to be less than or + * equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. + * + * If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, you + * should call @FT_GlyphSlot_Own_Bitmap on the slot first. + * + * Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format are + * converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp). + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Convert + * + * @description: + * Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp to + * a bitmap object with depth 8bpp, making the number of used bytes per + * line (a.k.a. the 'pitch') a multiple of `alignment`. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap. + * + * alignment :: + * The pitch of the bitmap is a multiple of this argument. Common + * values are 1, 2, or 4. + * + * @output: + * target :: + * The target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * It is possible to call @FT_Bitmap_Convert multiple times without + * calling @FT_Bitmap_Done (the memory is simply reallocated). + * + * Use @FT_Bitmap_Done to finally remove the bitmap object. + * + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Blend + * + * @description: + * Blend a bitmap onto another bitmap, using a given color. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap, which can have any @FT_Pixel_Mode format. + * + * source_offset :: + * The offset vector to the upper left corner of the source bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * color :: + * The color used to draw `source` onto `target`. + * + * @inout: + * target :: + * A handle to an `FT_Bitmap` object. It should be either initialized + * as empty with a call to @FT_Bitmap_Init, or it should be of type + * @FT_PIXEL_MODE_BGRA. + * + * atarget_offset :: + * The offset vector to the upper left corner of the target bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function doesn't perform clipping. + * + * The bitmap in `target` gets allocated or reallocated as needed; the + * vector `atarget_offset` is updated accordingly. + * + * In case of allocation or reallocation, the bitmap's pitch is set to + * `4 * width`. Both `source` and `target` must have the same bitmap + * flow (as indicated by the sign of the `pitch` field). + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Blend( FT_Library library, + const FT_Bitmap* source, + const FT_Vector source_offset, + FT_Bitmap* target, + FT_Vector *atarget_offset, + FT_Color color ); + + + /************************************************************************** + * + * @function: + * FT_GlyphSlot_Own_Bitmap + * + * @description: + * Make sure that a glyph slot owns `slot->bitmap`. + * + * @input: + * slot :: + * The glyph slot. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is to be used in combination with @FT_Bitmap_Embolden. + */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Done + * + * @description: + * Destroy a bitmap object initialized with @FT_Bitmap_Init. + * + * @input: + * library :: + * A handle to a library object. + * + * bitmap :: + * The bitmap object to be freed. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTBITMAP_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftbzip2.h b/deps/freetype/include/freetype/ftbzip2.h new file mode 100644 index 00000000..ae88cfdb --- /dev/null +++ b/deps/freetype/include/freetype/ftbzip2.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbzip2.h + * + * Bzip2-compressed stream support. + * + * Copyright (C) 2010-2019 by + * Joel Klinghed. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBZIP2_H_ +#define FTBZIP2_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * bzip2 + * + * @title: + * BZIP2 Streams + * + * @abstract: + * Using bzip2-compressed font files. + * + * @description: + * This section contains the declaration of Bzip2-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenBzip2 + * + * @description: + * Open a new stream to parse bzip2-compressed font files. This is + * mainly used to support the compressed `*.pcf.bz2` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, bzip2 compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a bzip2 compressed + * stream from it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with bzip2 support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBZIP2_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftcache.h b/deps/freetype/include/freetype/ftcache.h new file mode 100644 index 00000000..0d589d0b --- /dev/null +++ b/deps/freetype/include/freetype/ftcache.h @@ -0,0 +1,1088 @@ +/**************************************************************************** + * + * ftcache.h + * + * FreeType Cache subsystem (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCACHE_H_ +#define FTCACHE_H_ + + +#include +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @abstract: + * How to cache face, size, and glyph data with FreeType~2. + * + * @description: + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_` prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert an @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. To monitor termination of face objects, the + * finalizer callback in the `generic` field of the @FT_Face object can + * be used, which might also be used to store the @FTC_FaceID of the + * face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * **persistent**, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may keep + * internally. Failure to do so will lead to incorrect behaviour or even + * crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient to + * call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small bitmaps + * directly. (A small bitmap is one whose metrics and dimensions all fit + * into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * @order: + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined structure + * containing a font file path, and face index. + * + * @note: + * Never use `NULL` as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager that calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even memory + * leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************** + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * @input: + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * @output: + * aface :: + * A new @FT_Face handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The third parameter `req_data` is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer req_data, + FT_Face* aface ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_Manager + * + * @description: + * This object corresponds to one instance of the cache-subsystem. It is + * used to cache one or more @FT_Face objects, along with corresponding + * @FT_Size objects. + * + * The manager intentionally limits the total number of opened @FT_Face + * and @FT_Size objects to control memory usage. See the `max_faces` and + * `max_sizes` parameters of @FTC_Manager_New. + * + * The manager is also used to cache 'nodes' of various types while + * limiting their total memory usage. + * + * All limitations are enforced by keeping lists of managed objects in + * most-recently-used order, and flushing old nodes to make room for new + * ones. + */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /************************************************************************** + * + * @type: + * FTC_Node + * + * @description: + * An opaque handle to a cache node object. Each cache node is + * reference-counted. A node with a count of~0 might be flushed out of a + * full cache whenever a lookup request is performed. + * + * If you look up nodes, you have the ability to 'acquire' them, i.e., to + * increment their reference count. This will prevent the node from + * being flushed out of the cache until you explicitly 'release' it (see + * @FTC_Node_Unref). + * + * See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. + */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /************************************************************************** + * + * @function: + * FTC_Manager_New + * + * @description: + * Create a new cache manager. + * + * @input: + * library :: + * The parent FreeType library handle to use. + * + * max_faces :: + * Maximum number of opened @FT_Face objects managed by this cache + * instance. Use~0 for defaults. + * + * max_sizes :: + * Maximum number of opened @FT_Size objects managed by this cache + * instance. Use~0 for defaults. + * + * max_bytes :: + * Maximum number of bytes to use for cached data nodes. Use~0 for + * defaults. Note that this value does not account for managed + * @FT_Face and @FT_Size objects. + * + * requester :: + * An application-provided callback used to translate face IDs into + * real @FT_Face objects. + * + * req_data :: + * A generic pointer that is passed to the requester each time it is + * called (see @FTC_Face_Requester). + * + * @output: + * amanager :: + * A handle to a new manager object. 0~in case of failure. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Reset + * + * @description: + * Empty a given cache manager. This simply gets rid of all the + * currently cached @FT_Face and @FT_Size objects within the manager. + * + * @inout: + * manager :: + * A handle to the manager. + */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Done + * + * @description: + * Destroy a given manager after emptying it. + * + * @input: + * manager :: + * A handle to the target cache manager object. + */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupFace + * + * @description: + * Retrieve the @FT_Face object that corresponds to a given face ID + * through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * face_id :: + * The ID of the face object. + * + * @output: + * aface :: + * A handle to the face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Face object is always owned by the manager. You + * should never try to discard it yourself. + * + * The @FT_Face object doesn't necessarily have a current size object + * (i.e., face->size can be~0). If you need a specific 'font size', use + * @FTC_Manager_LookupSize instead. + * + * Never change the face's transformation matrix (i.e., never call the + * @FT_Set_Transform function) on a returned face! If you need to + * transform glyphs, do it yourself after glyph loading. + * + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory was available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /************************************************************************** + * + * @struct: + * FTC_ScalerRec + * + * @description: + * A structure used to describe a given character size in either pixels + * or points to the cache manager. See @FTC_Manager_LookupSize. + * + * @fields: + * face_id :: + * The source face ID. + * + * width :: + * The character width. + * + * height :: + * The character height. + * + * pixel :: + * A Boolean. If 1, the `width` and `height` fields are interpreted as + * integer pixel character sizes. Otherwise, they are expressed as + * 1/64th of points. + * + * x_res :: + * Only used when `pixel` is value~0 to indicate the horizontal + * resolution in dpi. + * + * y_res :: + * Only used when `pixel` is value~0 to indicate the vertical + * resolution in dpi. + * + * @note: + * This type is mainly used to retrieve @FT_Size objects through the + * cache manager. + */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /************************************************************************** + * + * @struct: + * FTC_Scaler + * + * @description: + * A handle to an @FTC_ScalerRec structure. + */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupSize + * + * @description: + * Retrieve the @FT_Size object that corresponds to a given + * @FTC_ScalerRec pointer through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * scaler :: + * A scaler handle. + * + * @output: + * asize :: + * A handle to the size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Size object is always owned by the manager. You + * should never try to discard it by yourself. + * + * You can access the parent @FT_Face object simply as `size->face` if + * you need it. Note that this object is also owned by the manager. + * + * @note: + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory is available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /************************************************************************** + * + * @function: + * FTC_Node_Unref + * + * @description: + * Decrement a cache node's internal reference count. When the count + * reaches 0, it is not destroyed but becomes eligible for subsequent + * cache flushes. + * + * @input: + * node :: + * The cache node handle. + * + * manager :: + * The cache manager handle. + */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that a given + * @FTC_FaceID is no longer valid, either because its content changed, or + * because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id`, with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear in + * later lookups with the same `face_id` value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /************************************************************************** + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to hold + * character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means 'no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************** + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + + + /************************************************************************** + * + * @type: + * FTC_ImageCache + * + * @description: + * A handle to a glyph image cache object. They are designed to hold + * many distinct glyph images while not exceeding a certain memory + * threshold. + */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_New + * + * @description: + * Create a new glyph image cache. + * + * @input: + * manager :: + * The parent manager for the image cache. + * + * @output: + * acache :: + * A handle to the new glyph image cache object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_Lookup + * + * @description: + * Retrieve a given glyph image from a glyph image cache. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * type :: + * A pointer to a glyph image type descriptor. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_LookupScaler + * + * @description: + * A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * scaler :: + * A pointer to a scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + * + * Calls to @FT_Set_Char_Size and friends have no effect on cached + * glyphs; you should always use the FreeType cache API instead. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @type: + * FTC_SBit + * + * @description: + * A handle to a small bitmap descriptor. See the @FTC_SBitRec structure + * for details. + */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /************************************************************************** + * + * @struct: + * FTC_SBitRec + * + * @description: + * A very compact structure used to describe a small glyph bitmap. + * + * @fields: + * width :: + * The bitmap width in pixels. + * + * height :: + * The bitmap height in pixels. + * + * left :: + * The horizontal distance from the pen position to the left bitmap + * border (a.k.a. 'left side bearing', or 'lsb'). + * + * top :: + * The vertical distance from the pen position (on the baseline) to the + * upper bitmap border (a.k.a. 'top side bearing'). The distance is + * positive for upwards y~coordinates. + * + * format :: + * The format of the glyph bitmap (monochrome or gray). + * + * max_grays :: + * Maximum gray level value (in the range 1 to~255). + * + * pitch :: + * The number of bytes per bitmap line. May be positive or negative. + * + * xadvance :: + * The horizontal advance width in pixels. + * + * yadvance :: + * The vertical advance height in pixels. + * + * buffer :: + * A pointer to the bitmap pixels. + */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /************************************************************************** + * + * @type: + * FTC_SBitCache + * + * @description: + * A handle to a small bitmap cache. These are special cache objects + * used to store small glyph bitmaps (and anti-aliased pixmaps) in a much + * more efficient way than the traditional glyph image cache implemented + * by @FTC_ImageCache. + */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_New + * + * @description: + * Create a new cache to store small glyph bitmaps. + * + * @input: + * manager :: + * A handle to the source cache manager. + * + * @output: + * acache :: + * A handle to the new sbit cache. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_Lookup + * + * @description: + * Look up a given small glyph bitmap in a given sbit cache and 'lock' it + * to prevent its flushing from the cache until needed. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * type :: + * A pointer to the glyph image type descriptor. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_LookupScaler + * + * @description: + * A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * scaler :: + * A pointer to the scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCACHE_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftchapters.h b/deps/freetype/include/freetype/ftchapters.h new file mode 100644 index 00000000..2ee26973 --- /dev/null +++ b/deps/freetype/include/freetype/ftchapters.h @@ -0,0 +1,145 @@ +/**************************************************************************** + * + * This file defines the structure of the FreeType reference. + * It is used by the python script that generates the HTML files. + * + */ + + + /************************************************************************** + * + * @chapter: + * general_remarks + * + * @title: + * General Remarks + * + * @sections: + * header_inclusion + * user_allocation + * + */ + + + /************************************************************************** + * + * @chapter: + * core_api + * + * @title: + * Core API + * + * @sections: + * version + * basic_types + * base_interface + * glyph_variants + * color_management + * layer_management + * glyph_management + * mac_specific + * sizes_management + * header_file_macros + * + */ + + + /************************************************************************** + * + * @chapter: + * format_specific + * + * @title: + * Format-Specific API + * + * @sections: + * multiple_masters + * truetype_tables + * type1_tables + * sfnt_names + * bdf_fonts + * cid_fonts + * pfr_fonts + * winfnt_fonts + * font_formats + * gasp_table + * + */ + + + /************************************************************************** + * + * @chapter: + * module_specific + * + * @title: + * Controlling FreeType Modules + * + * @sections: + * auto_hinter + * cff_driver + * t1_cid_driver + * tt_driver + * pcf_driver + * properties + * parameter_tags + * lcd_rendering + * + */ + + + /************************************************************************** + * + * @chapter: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @sections: + * cache_subsystem + * + */ + + + /************************************************************************** + * + * @chapter: + * support_api + * + * @title: + * Support API + * + * @sections: + * computations + * list_processing + * outline_processing + * quick_advance + * bitmap_handling + * raster + * glyph_stroker + * system_interface + * module_management + * gzip + * lzw + * bzip2 + * + */ + + + /************************************************************************** + * + * @chapter: + * error_codes + * + * @title: + * Error Codes + * + * @sections: + * error_enumerations + * error_code_values + * + */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftcid.h b/deps/freetype/include/freetype/ftcid.h new file mode 100644 index 00000000..8eafc1c7 --- /dev/null +++ b/deps/freetype/include/freetype/ftcid.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * ftcid.h + * + * FreeType API for accessing CID font information (specification). + * + * Copyright (C) 2007-2019 by + * Dereg Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCID_H_ +#define FTCID_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cid_fonts + * + * @title: + * CID Fonts + * + * @abstract: + * CID-keyed font-specific API. + * + * @description: + * This section contains the declaration of CID-keyed font-specific + * functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In contrast + * to the @FT_IS_CID_KEYED macro this function returns successfully also + * for CID-keyed fonts in an SFNT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCID_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftcolor.h b/deps/freetype/include/freetype/ftcolor.h new file mode 100644 index 00000000..cf180219 --- /dev/null +++ b/deps/freetype/include/freetype/ftcolor.h @@ -0,0 +1,311 @@ +/**************************************************************************** + * + * ftcolor.h + * + * FreeType's glyph color management (specification). + * + * Copyright (C) 2018-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCOLOR_H_ +#define FTCOLOR_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * color_management + * + * @title: + * Glyph Color Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'CPAL' table data. + * + * @description: + * The functions described here allow access and manipulation of color + * palette entries in OpenType's 'CPAL' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_Color + * + * @description: + * This structure models a BGRA color value of a 'CPAL' palette entry. + * + * The used color space is sRGB; the colors are not pre-multiplied, and + * alpha values must be explicitly set. + * + * @fields: + * blue :: + * Blue value. + * + * green :: + * Green value. + * + * red :: + * Red value. + * + * alpha :: + * Alpha value, giving the red, green, and blue color's opacity. + * + * @since: + * 2.10 + */ + typedef struct FT_Color_ + { + FT_Byte blue; + FT_Byte green; + FT_Byte red; + FT_Byte alpha; + + } FT_Color; + + + /************************************************************************** + * + * @enum: + * FT_PALETTE_XXX + * + * @description: + * A list of bit field constants used in the `palette_flags` array of the + * @FT_Palette_Data structure to indicate for which background a palette + * with a given index is usable. + * + * @values: + * FT_PALETTE_FOR_LIGHT_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a + * light background such as white. + * + * FT_PALETTE_FOR_DARK_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a dark + * background such as black. + * + * @since: + * 2.10 + */ +#define FT_PALETTE_FOR_LIGHT_BACKGROUND 0x01 +#define FT_PALETTE_FOR_DARK_BACKGROUND 0x02 + + + /************************************************************************** + * + * @struct: + * FT_Palette_Data + * + * @description: + * This structure holds the data of the 'CPAL' table. + * + * @fields: + * num_palettes :: + * The number of palettes. + * + * palette_name_ids :: + * A read-only array of palette name IDs with `num_palettes` elements, + * corresponding to entries like 'dark' or 'light' in the font's 'name' + * table. + * + * An empty name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * palette_flags :: + * A read-only array of palette flags with `num_palettes` elements. + * Possible values are an ORed combination of + * @FT_PALETTE_FOR_LIGHT_BACKGROUND and + * @FT_PALETTE_FOR_DARK_BACKGROUND. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * num_palette_entries :: + * The number of entries in a single palette. All palettes have the + * same size. + * + * palette_entry_name_ids :: + * A read-only array of palette entry name IDs with + * `num_palette_entries`. In each palette, entries with the same index + * have the same function. For example, index~0 might correspond to + * string 'outline' in the font's 'name' table to indicate that this + * palette entry is used for outlines, index~1 might correspond to + * 'fill' to indicate the filling color palette entry, etc. + * + * An empty entry name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * @note: + * Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to + * name strings. + * + * @since: + * 2.10 + */ + typedef struct FT_Palette_Data_ { + FT_UShort num_palettes; + const FT_UShort* palette_name_ids; + const FT_UShort* palette_flags; + + FT_UShort num_palette_entries; + const FT_UShort* palette_entry_name_ids; + + } FT_Palette_Data; + + + /************************************************************************** + * + * @function: + * FT_Palette_Data_Get + * + * @description: + * Retrieve the face's color palette data. + * + * @input: + * face :: + * The source face handle. + * + * @output: + * apalette :: + * A pointer to an @FT_Palette_Data structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * All arrays in the returned @FT_Palette_Data structure are read-only. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Select + * + * @description: + * This function has two purposes. + * + * (1) It activates a palette for rendering color glyphs, and + * + * (2) it retrieves all (unmodified) color entries of this palette. This + * function returns a read-write array, which means that a calling + * application can modify the palette entries on demand. + * + * A corollary of (2) is that calling the function, then modifying some + * values, then calling the function again with the same arguments resets + * all color entries to the original 'CPAL' values; all user modifications + * are lost. + * + * @input: + * face :: + * The source face handle. + * + * palette_index :: + * The palette index. + * + * @output: + * apalette :: + * An array of color entries for a palette with index `palette_index`, + * having `num_palette_entries` elements (as found in the + * `FT_Palette_Data` structure). If `apalette` is set to `NULL`, no + * array gets returned (and no color entries can be modified). + * + * In case the font doesn't support color palettes, `NULL` is returned. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The array pointed to by `apalette_entries` is owned and managed by + * FreeType. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Set_Foreground_Color + * + * @description: + * 'COLR' uses palette index 0xFFFF to indicate a 'text foreground + * color'. This function sets this value. + * + * @input: + * face :: + * The source face handle. + * + * foreground_color :: + * An `FT_Color` structure to define the text foreground color. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function isn't called, the text foreground color is set to + * white opaque (BGRA value 0xFFFFFFFF) if + * @FT_PALETTE_FOR_DARK_BACKGROUND is present for the current palette, + * and black opaque (BGRA value 0x000000FF) otherwise, including the case + * that no palette types are available in the 'CPAL' table. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCOLOR_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftdriver.h b/deps/freetype/include/freetype/ftdriver.h new file mode 100644 index 00000000..497bde9f --- /dev/null +++ b/deps/freetype/include/freetype/ftdriver.h @@ -0,0 +1,1232 @@ +/**************************************************************************** + * + * ftdriver.h + * + * FreeType API for controlling driver modules (specification only). + * + * Copyright (C) 2017-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTDRIVER_H_ +#define FTDRIVER_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * auto_hinter + * + * @title: + * The auto-hinter + * + * @abstract: + * Controlling the auto-hinting module. + * + * @description: + * While FreeType's auto-hinter doesn't expose API functions by itself, + * it is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * Note that the auto-hinter's module name is 'autofitter' for historical + * reasons. + * + * Available properties are @increase-x-height, @no-stem-darkening + * (experimental), @darkening-parameters (experimental), @warping + * (experimental), @glyph-to-script-map (experimental), @fallback-script + * (experimental), and @default-script (experimental), as documented in + * the @properties section. + * + */ + + + /************************************************************************** + * + * @section: + * cff_driver + * + * @title: + * The CFF driver + * + * @abstract: + * Controlling the CFF driver module. + * + * @description: + * While FreeType's CFF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. + * + * The CFF driver's module name is 'cff'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * + * **Hinting and antialiasing principles of the new engine** + * + * The rasterizer is positioning horizontal features (e.g., ascender + * height & x-height, or crossbars) on the pixel grid and minimizing the + * amount of antialiasing applied to them, while placing vertical + * features (vertical stems) on the pixel grid without hinting, thus + * representing the stem position and weight accurately. Sometimes the + * vertical stems may be only partially black. In this context, + * 'antialiasing' means that stems are not positioned exactly on pixel + * borders, causing a fuzzy appearance. + * + * There are two principles behind this approach. + * + * 1) No hinting in the horizontal direction: Unlike 'superhinted' + * TrueType, which changes glyph widths to accommodate regular + * inter-glyph spacing, Adobe's approach is 'faithful to the design' in + * representing both the glyph width and the inter-glyph spacing designed + * for the font. This makes the screen display as close as it can be to + * the result one would get with infinite resolution, while preserving + * what is considered the key characteristics of each glyph. Note that + * the distances between unhinted and grid-fitted positions at small + * sizes are comparable to kerning values and thus would be noticeable + * (and distracting) while reading if hinting were applied. + * + * One of the reasons to not hint horizontally is antialiasing for LCD + * screens: The pixel geometry of modern displays supplies three vertical + * subpixels as the eye moves horizontally across each visible pixel. On + * devices where we can be certain this characteristic is present a + * rasterizer can take advantage of the subpixels to add increments of + * weight. In Western writing systems this turns out to be the more + * critical direction anyway; the weights and spacing of vertical stems + * (see above) are central to Armenian, Cyrillic, Greek, and Latin type + * designs. Even when the rasterizer uses greyscale antialiasing instead + * of color (a necessary compromise when one doesn't know the screen + * characteristics), the unhinted vertical features preserve the design's + * weight and spacing much better than aliased type would. + * + * 2) Alignment in the vertical direction: Weights and spacing along the + * y~axis are less critical; what is much more important is the visual + * alignment of related features (like cap-height and x-height). The + * sense of alignment for these is enhanced by the sharpness of grid-fit + * edges, while the cruder vertical resolution (full pixels instead of + * 1/3 pixels) is less of a problem. + * + * On the technical side, horizontal alignment zones for ascender, + * x-height, and other important height values (traditionally called + * 'blue zones') as defined in the font are positioned independently, + * each being rounded to the nearest pixel edge, taking care of overshoot + * suppression at small sizes, stem darkening, and scaling. + * + * Hstems (this is, hint values defined in the font to help align + * horizontal features) that fall within a blue zone are said to be + * 'captured' and are aligned to that zone. Uncaptured stems are moved + * in one of four ways, top edge up or down, bottom edge up or down. + * Unless there are conflicting hstems, the smallest movement is taken to + * minimize distortion. + * + */ + + + /************************************************************************** + * + * @section: + * pcf_driver + * + * @title: + * The PCF driver + * + * @abstract: + * Controlling the PCF driver module. + * + * @description: + * While FreeType's PCF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. Right now, there is a single property + * @no-long-family-names available if FreeType is compiled with + * PCF_CONFIG_OPTION_LONG_FAMILY_NAMES. + * + * The PCF driver's module name is 'pcf'. + * + */ + + + /************************************************************************** + * + * @section: + * t1_cid_driver + * + * @title: + * The Type 1 and CID drivers + * + * @abstract: + * Controlling the Type~1 and CID driver modules. + * + * @description: + * It is possible to control the behaviour of FreeType's Type~1 and + * Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get. + * + * Behind the scenes, both drivers use the Adobe CFF engine for hinting; + * however, the used properties must be specified separately. + * + * The Type~1 driver's module name is 'type1'; the CID driver's module + * name is 't1cid'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * Please see the @cff_driver section for more details on the new hinting + * engine. + * + */ + + + /************************************************************************** + * + * @section: + * tt_driver + * + * @title: + * The TrueType driver + * + * @abstract: + * Controlling the TrueType driver module. + * + * @description: + * While FreeType's TrueType driver doesn't expose API functions by + * itself, it is possible to control its behaviour with @FT_Property_Set + * and @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * The TrueType driver's module name is 'truetype'. + * + * A single property @interpreter-version is available, as documented in + * the @properties section. + * + * We start with a list of definitions, kindly provided by Greg + * Hitchcock. + * + * _Bi-Level Rendering_ + * + * Monochromatic rendering, exclusively used in the early days of + * TrueType by both Apple and Microsoft. Microsoft's GDI interface + * supported hinting of the right-side bearing point, such that the + * advance width could be non-linear. Most often this was done to + * achieve some level of glyph symmetry. To enable reasonable + * performance (e.g., not having to run hinting on all glyphs just to get + * the widths) there was a bit in the head table indicating if the side + * bearing was hinted, and additional tables, 'hdmx' and 'LTSH', to cache + * hinting widths across multiple sizes and device aspect ratios. + * + * _Font Smoothing_ + * + * Microsoft's GDI implementation of anti-aliasing. Not traditional + * anti-aliasing as the outlines were hinted before the sampling. The + * widths matched the bi-level rendering. + * + * _ClearType Rendering_ + * + * Technique that uses physical subpixels to improve rendering on LCD + * (and other) displays. Because of the higher resolution, many methods + * of improving symmetry in glyphs through hinting the right-side bearing + * were no longer necessary. This lead to what GDI calls 'natural + * widths' ClearType, see + * http://rastertragedy.com/RTRCh4.htm#Sec21. Since hinting + * has extra resolution, most non-linearity went away, but it is still + * possible for hints to change the advance widths in this mode. + * + * _ClearType Compatible Widths_ + * + * One of the earliest challenges with ClearType was allowing the + * implementation in GDI to be selected without requiring all UI and + * documents to reflow. To address this, a compatible method of + * rendering ClearType was added where the font hints are executed once + * to determine the width in bi-level rendering, and then re-run in + * ClearType, with the difference in widths being absorbed in the font + * hints for ClearType (mostly in the white space of hints); see + * http://rastertragedy.com/RTRCh4.htm#Sec20. Somewhat by + * definition, compatible width ClearType allows for non-linear widths, + * but only when the bi-level version has non-linear widths. + * + * _ClearType Subpixel Positioning_ + * + * One of the nice benefits of ClearType is the ability to more crisply + * display fractional widths; unfortunately, the GDI model of integer + * bitmaps did not support this. However, the WPF and Direct Write + * frameworks do support fractional widths. DWrite calls this 'natural + * mode', not to be confused with GDI's 'natural widths'. Subpixel + * positioning, in the current implementation of Direct Write, + * unfortunately does not support hinted advance widths, see + * http://rastertragedy.com/RTRCh4.htm#Sec22. Note that the + * TrueType interpreter fully allows the advance width to be adjusted in + * this mode, just the DWrite client will ignore those changes. + * + * _ClearType Backward Compatibility_ + * + * This is a set of exceptions made in the TrueType interpreter to + * minimize hinting techniques that were problematic with the extra + * resolution of ClearType; see + * http://rastertragedy.com/RTRCh4.htm#Sec1 and + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. + * This technique is not to be confused with ClearType compatible widths. + * ClearType backward compatibility has no direct impact on changing + * advance widths, but there might be an indirect impact on disabling + * some deltas. This could be worked around in backward compatibility + * mode. + * + * _Native ClearType Mode_ + * + * (Not to be confused with 'natural widths'.) This mode removes all the + * exceptions in the TrueType interpreter when running with ClearType. + * Any issues on widths would still apply, though. + * + */ + + + /************************************************************************** + * + * @section: + * properties + * + * @title: + * Driver properties + * + * @abstract: + * Controlling driver modules. + * + * @description: + * Driver modules can be controlled by setting and unsetting properties, + * using the functions @FT_Property_Set and @FT_Property_Get. This + * section documents the available properties, together with auxiliary + * macros and structures. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_HINTING_XXX + * + * @description: + * A list of constants used for the @hinting-engine property to select + * the hinting engine for CFF, Type~1, and CID fonts. + * + * @values: + * FT_HINTING_FREETYPE :: + * Use the old FreeType hinting engine. + * + * FT_HINTING_ADOBE :: + * Use the hinting engine contributed by Adobe. + * + * @since: + * 2.9 + * + */ +#define FT_HINTING_FREETYPE 0 +#define FT_HINTING_ADOBE 1 + + /* these constants (introduced in 2.4.12) are deprecated */ +#define FT_CFF_HINTING_FREETYPE FT_HINTING_FREETYPE +#define FT_CFF_HINTING_ADOBE FT_HINTING_ADOBE + + + /************************************************************************** + * + * @property: + * hinting-engine + * + * @description: + * Thanks to Adobe, which contributed a new hinting (and parsing) engine, + * an application can select between 'freetype' and 'adobe' if compiled + * with `CFF_CONFIG_OPTION_OLD_ENGINE`. If this configuration macro + * isn't defined, 'hinting-engine' does nothing. + * + * The same holds for the Type~1 and CID modules if compiled with + * `T1_CONFIG_OPTION_OLD_ENGINE`. + * + * For the 'cff' module, the default engine is 'freetype' if + * `CFF_CONFIG_OPTION_OLD_ENGINE` is defined, and 'adobe' otherwise. + * + * For both the 'type1' and 't1cid' modules, the default engine is + * 'freetype' if `T1_CONFIG_OPTION_OLD_ENGINE` is defined, and 'adobe' + * otherwise. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 'adobe' or 'freetype'). + * + * @example: + * The following example code demonstrates how to select Adobe's hinting + * engine for the 'cff' module (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_UInt hinting_engine = FT_HINTING_ADOBE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "hinting-engine", &hinting_engine ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-stem-darkening + * + * @description: + * All glyphs that pass through the auto-hinter will be emboldened unless + * this property is set to TRUE. The same is true for the CFF, Type~1, + * and CID font modules if the 'Adobe' engine is selected (which is the + * default). + * + * Stem darkening emboldens glyphs at smaller sizes to make them more + * readable on common low-DPI screens when using linear alpha blending + * and gamma correction, see @FT_Render_Glyph. When not using linear + * alpha blending and gamma correction, glyphs will appear heavy and + * fuzzy! + * + * Gamma correction essentially lightens fonts since shades of grey are + * shifted to higher pixel values (=~higher brightness) to match the + * original intention to the reality of our screens. The side-effect is + * that glyphs 'thin out'. Mac OS~X and Adobe's proprietary font + * rendering library implement a counter-measure: stem darkening at + * smaller sizes where shades of gray dominate. By emboldening a glyph + * slightly in relation to its pixel size, individual pixels get higher + * coverage of filled-in outlines and are therefore 'blacker'. This + * counteracts the 'thinning out' of glyphs, making text remain readable + * at smaller sizes. + * + * By default, the Adobe engines for CFF, Type~1, and CID fonts darken + * stems at smaller sizes, regardless of hinting, to enhance contrast. + * Setting this property, stem darkening gets switched off. + * + * For the auto-hinter, stem-darkening is experimental currently and thus + * switched off by default (this is, `no-stem-darkening` is set to TRUE + * by default). Total consistency with the CFF driver is not achieved + * right now because the emboldening method differs and glyphs must be + * scaled down on the Y-axis to keep outline points inside their + * precomputed blue zones. The smaller the size (especially 9ppem and + * down), the higher the loss of emboldening versus the CFF driver. + * + * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). It + * can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_STEM_DARKENING. + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_stem_darkening = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "no-stem-darkening", &no_stem_darkening ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * darkening-parameters + * + * @description: + * By default, the Adobe hinting engine, as used by the CFF, Type~1, and + * CID font drivers, darkens stems as follows (if the `no-stem-darkening` + * property isn't set): + * + * ``` + * stem width <= 0.5px: darkening amount = 0.4px + * stem width = 1px: darkening amount = 0.275px + * stem width = 1.667px: darkening amount = 0.275px + * stem width >= 2.333px: darkening amount = 0px + * ``` + * + * and piecewise linear in-between. At configuration time, these four + * control points can be set with the macro + * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS`; the CFF, Type~1, and CID + * drivers share these values. At runtime, the control points can be + * changed using the `darkening-parameters` property (see the example + * below that demonstrates this for the Type~1 driver). + * + * The x~values give the stem width, and the y~values the darkening + * amount. The unit is 1000th of pixels. All coordinate values must be + * positive; the x~values must be monotonically increasing; the y~values + * must be monotonically decreasing and smaller than or equal to 500 + * (corresponding to half a pixel); the slope of each linear piece must + * be shallower than -1 (e.g., -.4). + * + * The auto-hinter provides this property, too, as an experimental + * feature. See @no-stem-darkening for more. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable, using eight comma-separated integers without spaces. Here + * the above example, using `\` to break the line for readability. + * + * ``` + * FREETYPE_PROPERTIES=\ + * type1:darkening-parameters=500,300,1000,200,1500,100,2000,0 + * ``` + * + * @example: + * ``` + * FT_Library library; + * FT_Int darken_params[8] = { 500, 300, // x1, y1 + * 1000, 200, // x2, y2 + * 1500, 100, // x3, y3 + * 2000, 0 }; // x4, y4 + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "type1", + * "darkening-parameters", darken_params ); + * ``` + * + * @since: + * 2.5.1 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * random-seed + * + * @description: + * By default, the seed value for the CFF 'random' operator and the + * similar '0 28 callothersubr pop' command for the Type~1 and CID + * drivers is set to a random value. However, mainly for debugging + * purposes, it is often necessary to use a known value as a seed so that + * the pseudo-random number sequences generated by 'random' are + * repeatable. + * + * The `random-seed` property does that. Its argument is a signed 32bit + * integer; if the value is zero or negative, the seed given by the + * `intitialRandomSeed` private DICT operator in a CFF file gets used (or + * a default value if there is no such operator). If the value is + * positive, use it instead of `initialRandomSeed`, which is consequently + * ignored. + * + * @note: + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable. It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_RANDOM_SEED. + * + * @since: + * 2.8 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-long-family-names + * + * @description: + * If `PCF_CONFIG_OPTION_LONG_FAMILY_NAMES` is active while compiling + * FreeType, the PCF driver constructs long family names. + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When + * selecting 'Fixed' in KDE or Gnome one gets results that appear rather + * random, the style changes often if one changes the size and one cannot + * select some fonts at all. The improve this situation, the PCF module + * prepends the foundry name (plus a space) to the family name. It also + * checks whether there are 'wide' characters; all put together, family + * names like 'Sony Fixed' or 'Misc Fixed Wide' are constructed. + * + * If `no-long-family-names` is set, this feature gets switched off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_long_family_names = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "pcf", + * "no-long-family-names", + * &no_long_family_names ); + * ``` + * + * @since: + * 2.8 + */ + + + /************************************************************************** + * + * @enum: + * TT_INTERPRETER_VERSION_XXX + * + * @description: + * A list of constants used for the @interpreter-version property to + * select the hinting engine for Truetype fonts. + * + * The numeric value in the constant names represents the version number + * as returned by the 'GETINFO' bytecode instruction. + * + * @values: + * TT_INTERPRETER_VERSION_35 :: + * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in + * Windows~98; only grayscale and B/W rasterizing is supported. + * + * TT_INTERPRETER_VERSION_38 :: + * Version~38 corresponds to MS rasterizer v.1.9; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in the Internet Explorer~9 running on + * Windows~7). It is used in FreeType to select the 'Infinality' + * subpixel hinting code. The code may be removed in a future version. + * + * TT_INTERPRETER_VERSION_40 :: + * Version~40 corresponds to MS rasterizer v.2.1; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in Microsoft's Edge Browser on Windows~10). + * It is used in FreeType to select the 'minimal' subpixel hinting + * code, a stripped-down and higher performance version of the + * 'Infinality' code. + * + * @note: + * This property controls the behaviour of the bytecode interpreter and + * thus how outlines get hinted. It does **not** control how glyph get + * rasterized! In particular, it does not control subpixel color + * filtering. + * + * If FreeType has not been compiled with the configuration option + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING`, selecting version~38 or~40 causes + * an `FT_Err_Unimplemented_Feature` error. + * + * Depending on the graphics framework, Microsoft uses different bytecode + * and rendering engines. As a consequence, the version numbers returned + * by a call to the 'GETINFO' bytecode instruction are more convoluted + * than desired. + * + * Here are two tables that try to shed some light on the possible values + * for the MS rasterizer engine, together with the additional features + * introduced by it. + * + * ``` + * GETINFO framework version feature + * ------------------------------------------------------------------- + * 3 GDI (Win 3.1), v1.0 16-bit, first version + * TrueImage + * 33 GDI (Win NT 3.1), v1.5 32-bit + * HP Laserjet + * 34 GDI (Win 95) v1.6 font smoothing, + * new SCANTYPE opcode + * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET + * bits in composite glyphs + * 36 MGDI (Win CE 2) v1.6+ classic ClearType + * 37 GDI (XP and later), v1.8 ClearType + * GDI+ old (before Vista) + * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, + * WPF Y-direction ClearType, + * additional error checking + * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags + * in GETINFO opcode, + * bug fixes + * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag + * DWrite (Win 8) in GETINFO opcode, + * Gray ClearType + * ``` + * + * The 'version' field gives a rough orientation only, since some + * applications provided certain features much earlier (as an example, + * Microsoft Reader used subpixel and Y-direction ClearType already in + * Windows 2000). Similarly, updates to a given framework might include + * improved hinting support. + * + * ``` + * version sampling rendering comment + * x y x y + * -------------------------------------------------------------- + * v1.0 normal normal B/W B/W bi-level + * v1.6 high high gray gray grayscale + * v1.8 high normal color-filter B/W (GDI) ClearType + * v1.9 high high color-filter gray Color ClearType + * v2.1 high normal gray B/W Gray ClearType + * v2.1 high high gray gray Gray ClearType + * ``` + * + * Color and Gray ClearType are the two available variants of + * 'Y-direction ClearType', meaning grayscale rasterization along the + * Y-direction; the name used in the TrueType specification for this + * feature is 'symmetric smoothing'. 'Classic ClearType' is the original + * algorithm used before introducing a modified version in Win~XP. + * Another name for v1.6's grayscale rendering is 'font smoothing', and + * 'Color ClearType' is sometimes also called 'DWrite ClearType'. To + * differentiate between today's Color ClearType and the earlier + * ClearType variant with B/W rendering along the vertical axis, the + * latter is sometimes called 'GDI ClearType'. + * + * 'Normal' and 'high' sampling describe the (virtual) resolution to + * access the rasterized outline after the hinting process. 'Normal' + * means 1 sample per grid line (i.e., B/W). In the current Microsoft + * implementation, 'high' means an extra virtual resolution of 16x16 (or + * 16x1) grid lines per pixel for bytecode instructions like 'MIRP'. + * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid + * lines for color filtering if Color ClearType is activated. + * + * Note that 'Gray ClearType' is essentially the same as v1.6's grayscale + * rendering. However, the GETINFO instruction handles it differently: + * v1.6 returns bit~12 (hinting for grayscale), while v2.1 returns + * bits~13 (hinting for ClearType), 18 (symmetrical smoothing), and~19 + * (Gray ClearType). Also, this mode respects bits 2 and~3 for the + * version~1 gasp table exclusively (like Color ClearType), while v1.6 + * only respects the values of version~0 (bits 0 and~1). + * + * Keep in mind that the features of the above interpreter versions might + * not map exactly to FreeType features or behavior because it is a + * fundamentally different library with different internals. + * + */ +#define TT_INTERPRETER_VERSION_35 35 +#define TT_INTERPRETER_VERSION_38 38 +#define TT_INTERPRETER_VERSION_40 40 + + + /************************************************************************** + * + * @property: + * interpreter-version + * + * @description: + * Currently, three versions are available, two representing the bytecode + * interpreter with subpixel hinting support (old 'Infinality' code and + * new stripped-down and higher performance 'minimal' code) and one + * without, respectively. The default is subpixel support if + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING` is defined, and no subpixel + * support otherwise (since it isn't available then). + * + * If subpixel hinting is on, many TrueType bytecode instructions behave + * differently compared to B/W or grayscale rendering (except if 'native + * ClearType' is selected by the font). Microsoft's main idea is to + * render at a much increased horizontal resolution, then sampling down + * the created output to subpixel precision. However, many older fonts + * are not suited to this and must be specially taken care of by applying + * (hardcoded) tweaks in Microsoft's interpreter. + * + * Details on subpixel hinting and some of the necessary tweaks can be + * found in Greg Hitchcock's whitepaper at + * 'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. + * Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2, + * or 6x5 supersampling) like discussed in the paper. Depending on the + * chosen interpreter, it simply ignores instructions on vertical stems + * to arrive at very similar results. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values '35', '38', or '40'). + * + * @example: + * The following example code demonstrates how to deactivate subpixel + * hinting (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "truetype", + * "interpreter-version", + * &interpreter_version ); + * ``` + * + * @since: + * 2.5 + */ + + + /************************************************************************** + * + * @property: + * glyph-to-script-map + * + * @description: + * **Experimental only** + * + * The auto-hinter provides various script modules to hint glyphs. + * Examples of supported scripts are Latin or CJK. Before a glyph is + * auto-hinted, the Unicode character map of the font gets examined, and + * the script is then determined based on Unicode character ranges, see + * below. + * + * OpenType fonts, however, often provide much more glyphs than character + * codes (small caps, superscripts, ligatures, swashes, etc.), to be + * controlled by so-called 'features'. Handling OpenType features can be + * quite complicated and thus needs a separate library on top of + * FreeType. + * + * The mapping between glyph indices and scripts (in the auto-hinter + * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an array + * with `num_glyphs` elements, as found in the font's @FT_Face structure. + * The `glyph-to-script-map` property returns a pointer to this array, + * which can be modified as needed. Note that the modification should + * happen before the first glyph gets processed by the auto-hinter so + * that the global analysis of the font shapes actually uses the modified + * mapping. + * + * @example: + * The following example code demonstrates how to access it (omitting the + * error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_GlyphToScriptMap prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * + * prop.face = face; + * + * FT_Property_Get( library, "autofitter", + * "glyph-to-script-map", &prop ); + * + * // adjust `prop.map' as needed right here + * + * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @enum: + * FT_AUTOHINTER_SCRIPT_XXX + * + * @description: + * **Experimental only** + * + * A list of constants used for the @glyph-to-script-map property to + * specify the script submodule the auto-hinter should use for hinting a + * particular glyph. + * + * @values: + * FT_AUTOHINTER_SCRIPT_NONE :: + * Don't auto-hint this glyph. + * + * FT_AUTOHINTER_SCRIPT_LATIN :: + * Apply the latin auto-hinter. For the auto-hinter, 'latin' is a very + * broad term, including Cyrillic and Greek also since characters from + * those scripts share the same design constraints. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0020 - U+007F // Basic Latin (no control characters) + * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) + * U+0100 - U+017F // Latin Extended-A + * U+0180 - U+024F // Latin Extended-B + * U+0250 - U+02AF // IPA Extensions + * U+02B0 - U+02FF // Spacing Modifier Letters + * U+0300 - U+036F // Combining Diacritical Marks + * U+0370 - U+03FF // Greek and Coptic + * U+0400 - U+04FF // Cyrillic + * U+0500 - U+052F // Cyrillic Supplement + * U+1D00 - U+1D7F // Phonetic Extensions + * U+1D80 - U+1DBF // Phonetic Extensions Supplement + * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement + * U+1E00 - U+1EFF // Latin Extended Additional + * U+1F00 - U+1FFF // Greek Extended + * U+2000 - U+206F // General Punctuation + * U+2070 - U+209F // Superscripts and Subscripts + * U+20A0 - U+20CF // Currency Symbols + * U+2150 - U+218F // Number Forms + * U+2460 - U+24FF // Enclosed Alphanumerics + * U+2C60 - U+2C7F // Latin Extended-C + * U+2DE0 - U+2DFF // Cyrillic Extended-A + * U+2E00 - U+2E7F // Supplemental Punctuation + * U+A640 - U+A69F // Cyrillic Extended-B + * U+A720 - U+A7FF // Latin Extended-D + * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) + * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols + * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_CJK :: + * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old + * Vietnamese, and some other scripts. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+1100 - U+11FF // Hangul Jamo + * U+2E80 - U+2EFF // CJK Radicals Supplement + * U+2F00 - U+2FDF // Kangxi Radicals + * U+2FF0 - U+2FFF // Ideographic Description Characters + * U+3000 - U+303F // CJK Symbols and Punctuation + * U+3040 - U+309F // Hiragana + * U+30A0 - U+30FF // Katakana + * U+3100 - U+312F // Bopomofo + * U+3130 - U+318F // Hangul Compatibility Jamo + * U+3190 - U+319F // Kanbun + * U+31A0 - U+31BF // Bopomofo Extended + * U+31C0 - U+31EF // CJK Strokes + * U+31F0 - U+31FF // Katakana Phonetic Extensions + * U+3200 - U+32FF // Enclosed CJK Letters and Months + * U+3300 - U+33FF // CJK Compatibility + * U+3400 - U+4DBF // CJK Unified Ideographs Extension A + * U+4DC0 - U+4DFF // Yijing Hexagram Symbols + * U+4E00 - U+9FFF // CJK Unified Ideographs + * U+A960 - U+A97F // Hangul Jamo Extended-A + * U+AC00 - U+D7AF // Hangul Syllables + * U+D7B0 - U+D7FF // Hangul Jamo Extended-B + * U+F900 - U+FAFF // CJK Compatibility Ideographs + * U+FE10 - U+FE1F // Vertical forms + * U+FE30 - U+FE4F // CJK Compatibility Forms + * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms + * U+1B000 - U+1B0FF // Kana Supplement + * U+1D300 - U+1D35F // Tai Xuan Hing Symbols + * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement + * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B + * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C + * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D + * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_INDIC :: + * Apply the indic auto-hinter, covering all major scripts from the + * Indian sub-continent and some other related scripts like Thai, Lao, + * or Tibetan. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0900 - U+0DFF // Indic Range + * U+0F00 - U+0FFF // Tibetan + * U+1900 - U+194F // Limbu + * U+1B80 - U+1BBF // Sundanese + * U+A800 - U+A82F // Syloti Nagri + * U+ABC0 - U+ABFF // Meetei Mayek + * U+11800 - U+118DF // Sharada + * ``` + * + * Note that currently Indic support is rudimentary only, missing blue + * zone support. + * + * @since: + * 2.4.11 + * + */ +#define FT_AUTOHINTER_SCRIPT_NONE 0 +#define FT_AUTOHINTER_SCRIPT_LATIN 1 +#define FT_AUTOHINTER_SCRIPT_CJK 2 +#define FT_AUTOHINTER_SCRIPT_INDIC 3 + + + /************************************************************************** + * + * @struct: + * FT_Prop_GlyphToScriptMap + * + * @description: + * **Experimental only** + * + * The data exchange structure for the @glyph-to-script-map property. + * + * @since: + * 2.4.11 + * + */ + typedef struct FT_Prop_GlyphToScriptMap_ + { + FT_Face face; + FT_UShort* map; + + } FT_Prop_GlyphToScriptMap; + + + /************************************************************************** + * + * @property: + * fallback-script + * + * @description: + * **Experimental only** + * + * If no auto-hinter script module can be assigned to a glyph, a fallback + * script gets assigned to it (see also the @glyph-to-script-map + * property). By default, this is @FT_AUTOHINTER_SCRIPT_CJK. Using the + * `fallback-script` property, this fallback value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the fallback + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the fallback script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "fallback-script", &fallback_script ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @property: + * default-script + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with `FT_CONFIG_OPTION_USE_HARFBUZZ` to make + * the HarfBuzz library access OpenType features for getting better glyph + * coverages, this property sets the (auto-fitter) script to be used for + * the default (OpenType) script data of a font's GSUB table. Features + * for the default script are intended for all scripts not explicitly + * handled in GSUB; an example is a 'dlig' feature, containing the + * combination of the characters 'T', 'E', and 'L' to form a 'TEL' + * ligature. + * + * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the + * `default-script` property, this default value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the default + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the default script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "default-script", &default_script ); + * ``` + * + * @since: + * 2.5.3 + * + */ + + + /************************************************************************** + * + * @property: + * increase-x-height + * + * @description: + * For ppem values in the range 6~<= ppem <= `increase-x-height`, round + * up the font's x~height much more often than normally. If the value is + * set to~0, which is the default, this feature is switched off. Use + * this property to improve the legibility of small font sizes if + * necessary. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * Set this value right after calling @FT_Set_Char_Size, but before + * loading any glyph (using the auto-hinter). + * + * @example: + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_IncreaseXHeight prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); + * + * prop.face = face; + * prop.limit = 14; + * + * FT_Property_Set( library, "autofitter", + * "increase-x-height", &prop ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Prop_IncreaseXHeight + * + * @description: + * The data exchange structure for the @increase-x-height property. + * + */ + typedef struct FT_Prop_IncreaseXHeight_ + { + FT_Face face; + FT_UInt limit; + + } FT_Prop_IncreaseXHeight; + + + /************************************************************************** + * + * @property: + * warping + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with option `AF_CONFIG_OPTION_USE_WARPER` to + * activate the warp hinting code in the auto-hinter, this property + * switches warping on and off. + * + * Warping only works in 'normal' auto-hinting mode replacing it. The + * idea of the code is to slightly scale and shift a glyph along the + * non-hinted dimension (which is usually the horizontal axis) so that as + * much of its segments are aligned (more or less) to the grid. To find + * out a glyph's optimal scaling and shifting value, various parameter + * combinations are tried and scored. + * + * By default, warping is off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * The warping code can also change advance widths. Have a look at the + * `lsb_delta` and `rsb_delta` fields in the @FT_GlyphSlotRec structure + * for details on improving inter-glyph distances while rendering. + * + * Since warping is a global property of the auto-hinter it is best to + * change its value before rendering any face. Otherwise, you should + * reload all faces that get auto-hinted in 'normal' hinting mode. + * + * @example: + * This example shows how to switch on warping (omitting the error + * handling). + * + * ``` + * FT_Library library; + * FT_Bool warping = 1; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", "warping", &warping ); + * ``` + * + * @since: + * 2.6 + * + */ + + + /* */ + + +FT_END_HEADER + + +#endif /* FTDRIVER_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/fterrdef.h b/deps/freetype/include/freetype/fterrdef.h new file mode 100644 index 00000000..9bc7dc65 --- /dev/null +++ b/deps/freetype/include/freetype/fterrdef.h @@ -0,0 +1,279 @@ +/**************************************************************************** + * + * fterrdef.h + * + * FreeType error codes (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_code_values + * + * @title: + * Error Code Values + * + * @abstract: + * All possible error codes returned by FreeType functions. + * + * @description: + * The list below is taken verbatim from the file `fterrdef.h` (loaded + * automatically by including `FT_FREETYPE_H`). The first argument of the + * `FT_ERROR_DEF_` macro is the error label; by default, the prefix + * `FT_Err_` gets added so that you get error names like + * `FT_Err_Cannot_Open_Resource`. The second argument is the error code, + * and the last argument an error string, which is not used by FreeType. + * + * Within your application you should **only** use error names and + * **never** its numeric values! The latter might (and actually do) + * change in forthcoming FreeType versions. + * + * Macro `FT_NOERRORDEF_` defines `FT_Err_Ok`, which is always zero. See + * the 'Error Enumerations' subsection how to automatically generate a + * list of error strings. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_Err_XXX + * + */ + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, + "array allocation size too large" ) + FT_ERRORDEF_( Missing_Module, 0x0B, + "missing module" ) + FT_ERRORDEF_( Missing_Property, 0x0C, + "missing property" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, + "invalid PostScript (post) table" ) + FT_ERRORDEF_( DEF_In_Glyf_Bytecode, 0x9C, + "found FDEF or IDEF opcode in glyf bytecode" ) + FT_ERRORDEF_( Missing_Bitmap, 0x9D, + "missing bitmap in strike" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, + "no Unicode glyph name found" ) + FT_ERRORDEF_( Glyph_Too_Big, 0xA4, + "glyph too big for hinting" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, + "Font glyphs corrupted or missing fields" ) + + /* */ + + +/* END */ diff --git a/deps/freetype/include/freetype/fterrors.h b/deps/freetype/include/freetype/fterrors.h new file mode 100644 index 00000000..2b47eb20 --- /dev/null +++ b/deps/freetype/include/freetype/fterrors.h @@ -0,0 +1,289 @@ +/**************************************************************************** + * + * fterrors.h + * + * FreeType error code handling (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_enumerations + * + * @title: + * Error Enumerations + * + * @abstract: + * How to handle errors and error strings. + * + * @description: + * The header file `fterrors.h` (which is automatically included by + * `freetype.h` defines the handling of FreeType's enumeration + * constants. It can also be used to generate error message strings + * with a small macro trick explained below. + * + * **Error Formats** + * + * The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be + * defined in `ftoption.h` in order to make the higher byte indicate the + * module where the error has happened (this is not compatible with + * standard builds of FreeType~2, however). See the file `ftmoderr.h` + * for more details. + * + * **Error Message Strings** + * + * Error definitions are set up with special macros that allow client + * applications to build a table of error message strings. The strings + * are not included in a normal build of FreeType~2 to save space (most + * client applications do not use them). + * + * To do so, you have to define the following macros before including + * this file. + * + * ``` + * FT_ERROR_START_LIST + * ``` + * + * This macro is called before anything else to define the start of the + * error list. It is followed by several `FT_ERROR_DEF` calls. + * + * ``` + * FT_ERROR_DEF( e, v, s ) + * ``` + * + * This macro is called to define one single error. 'e' is the error + * code identifier (e.g., `Invalid_Argument`), 'v' is the error's + * numerical value, and 's' is the corresponding error string. + * + * ``` + * FT_ERROR_END_LIST + * ``` + * + * This macro ends the list. + * + * Additionally, you have to undefine `FTERRORS_H_` before #including + * this file. + * + * Here is a simple example. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERRORDEF( e, v, s ) { e, s }, + * #define FT_ERROR_START_LIST { + * #define FT_ERROR_END_LIST { 0, NULL } }; + * + * const struct + * { + * int err_code; + * const char* err_msg; + * } ft_errors[] = + * + * #include FT_ERRORS_H + * ``` + * + * An alternative to using an array is a switch statement. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERROR_START_LIST switch ( error_code ) { + * #define FT_ERRORDEF( e, v, s ) case v: return s; + * #define FT_ERROR_END_LIST } + * ``` + * + * If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should + * be replaced with `FT_ERROR_BASE(error_code)` in the last example. + */ + + /* */ + + /* In previous FreeType versions we used `__FTERRORS_H__`. However, */ + /* using two successive underscores in a non-system symbol name */ + /* violates the C (and C++) standard, so it was changed to the */ + /* current form. In spite of this, we have to make */ + /* */ + /* ``` */ + /* #undefine __FTERRORS_H__ */ + /* ``` */ + /* */ + /* work for backward compatibility. */ + /* */ +#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) +#define FTERRORS_H_ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_`. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_INCLUDE_ERR_PROTOS + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for _Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_BASE + + /* FT_ERR_PREFIX is needed internally */ +#ifndef FT2_BUILD_LIBRARY +#undef FT_ERR_PREFIX +#endif + + /* FT_INCLUDE_ERR_PROTOS: Control if function prototypes should be */ + /* included with `#include FT_ERRORS_H'. This is */ + /* only true where `FT_ERRORDEF` is undefined. */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ +#ifdef FT_INCLUDE_ERR_PROTOS +#undef FT_INCLUDE_ERR_PROTOS + +#ifndef FT_ERR_PROTOS_DEFINED +#define FT_ERR_PROTOS_DEFINED + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @function: + * FT_Error_String + * + * @description: + * Retrieve the description of a valid FreeType error code. + * + * @input: + * error_code :: + * A valid FreeType error code. + * + * @return: + * A C~string or `NULL`, if any error occurred. + * + * @note: + * FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or + * `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. + * 'error_string' will be `NULL` otherwise. + * + * Module identification will be ignored: + * + * ```c + * strcmp( FT_Error_String( FT_Err_Unknown_File_Format ), + * FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; + * ``` + */ + FT_EXPORT( const char* ) + FT_Error_String( FT_Error error_code ); + +FT_END_HEADER + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftfntfmt.h b/deps/freetype/include/freetype/ftfntfmt.h new file mode 100644 index 00000000..aae0b132 --- /dev/null +++ b/deps/freetype/include/freetype/ftfntfmt.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * + * ftfntfmt.h + * + * Support functions for font formats. + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTFNTFMT_H_ +#define FTFNTFMT_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * font_formats + * + * @title: + * Font Formats + * + * @abstract: + * Getting the font format. + * + * @description: + * The single function in this section can be used to get the font format. + * Note that this information is not needed normally; however, there are + * special cases (like in PDF devices) where it is important to + * differentiate, in spite of FreeType's uniform API. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_Font_Format + * + * @description: + * Return a string describing the format of a given face. Possible values + * are 'TrueType', 'Type~1', 'BDF', 'PCF', 'Type~42', 'CID~Type~1', 'CFF', + * 'PFR', and 'Windows~FNT'. + * + * The return value is suitable to be used as an X11 FONT_PROPERTY. + * + * @input: + * face :: + * Input face handle. + * + * @return: + * Font format string. `NULL` in case of error. + * + * @note: + * A deprecated name for the same function is `FT_Get_X11_Font_Format`. + */ + FT_EXPORT( const char* ) + FT_Get_Font_Format( FT_Face face ); + + + /* deprecated */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTFNTFMT_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftgasp.h b/deps/freetype/include/freetype/ftgasp.h new file mode 100644 index 00000000..24673d8c --- /dev/null +++ b/deps/freetype/include/freetype/ftgasp.h @@ -0,0 +1,144 @@ +/**************************************************************************** + * + * ftgasp.h + * + * Access of TrueType's 'gasp' table (specification). + * + * Copyright (C) 2007-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGASP_H_ +#define FTGASP_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType 'gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its 'gasp' table, if any. This is mainly + * useful when implementing native TrueType hinting with the bytecode + * interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************** + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This **really** means TrueType bytecode interpretation. If this bit + * is not set, no hinting gets applied. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * If not set, do monochrome rendering. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * If set, smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * The bit-flags `FT_GASP_DO_GRIDFIT` and `FT_GASP_DO_GRAY` are to be + * used for standard font rasterization only. Independently of that, + * `FT_GASP_SYMMETRIC_SMOOTHING` and `FT_GASP_SYMMETRIC_GRIDFIT` are to + * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT` and + * `FT_GASP_DO_GRAY` are consequently ignored). + * + * 'ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x04 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 + + + /************************************************************************** + * + * @function: + * FT_Get_Gasp + * + * @description: + * For a TrueType or OpenType font file, return the rasterizer behaviour + * flags from the font's 'gasp' table corresponding to a given character + * pixel size. + * + * @input: + * face :: + * The source face handle. + * + * ppem :: + * The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * 'gasp' table in the face. + * + * @note: + * If you want to use the MM functionality of OpenType variation fonts + * (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this + * function **after** setting an instance since the return values can + * change. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGASP_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftglyph.h b/deps/freetype/include/freetype/ftglyph.h new file mode 100644 index 00000000..fedab849 --- /dev/null +++ b/deps/freetype/include/freetype/ftglyph.h @@ -0,0 +1,665 @@ +/**************************************************************************** + * + * ftglyph.h + * + * FreeType convenience functions to handle glyphs (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file contains the definition of several convenience functions that + * can be used by client applications to easily retrieve glyph bitmaps and + * outlines from a given face. + * + * These functions should be optional if you are writing a font server or + * text layout engine on top of FreeType. However, they are pretty handy + * for many other simple uses of the library. + * + */ + + +#ifndef FTGLYPH_H_ +#define FTGLYPH_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_management + * + * @title: + * Glyph Management + * + * @abstract: + * Generic interface to manage individual glyph data. + * + * @description: + * This section contains definitions used to manage glyph data through + * generic @FT_Glyph objects. Each of them can contain a bitmap, + * a vector outline, or even images in other formats. These objects are + * detached from @FT_Face, contrary to @FT_GlyphSlot. + * + */ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /************************************************************************** + * + * @type: + * FT_Glyph + * + * @description: + * Handle to an object used to model generic glyph images. It is a + * pointer to the @FT_GlyphRec structure and can contain a glyph bitmap + * or pointer. + * + * @note: + * Glyph objects are not owned by the library. You must thus release + * them manually (through @FT_Done_Glyph) _before_ calling + * @FT_Done_FreeType. + */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /************************************************************************** + * + * @struct: + * FT_GlyphRec + * + * @description: + * The root glyph structure contains a given glyph image plus its advance + * width in 16.16 fixed-point format. + * + * @fields: + * library :: + * A handle to the FreeType library object. + * + * clazz :: + * A pointer to the glyph's class. Private. + * + * format :: + * The format of the glyph's image. + * + * advance :: + * A 16.16 vector that gives the glyph's advance width. + */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /************************************************************************** + * + * @type: + * FT_BitmapGlyph + * + * @description: + * A handle to an object used to model a bitmap glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. + */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /************************************************************************** + * + * @struct: + * FT_BitmapGlyphRec + * + * @description: + * A structure used for bitmap glyph images. This really is a + * 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * left :: + * The left-side bearing, i.e., the horizontal distance from the + * current pen position to the left border of the glyph bitmap. + * + * top :: + * The top-side bearing, i.e., the vertical distance from the current + * pen position to the top border of the glyph bitmap. This distance + * is positive for upwards~y! + * + * bitmap :: + * A descriptor for the bitmap. + * + * @note: + * You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_BITMAP`. This lets you access the + * bitmap's contents easily. + * + * The corresponding pixel buffer is always owned by @FT_BitmapGlyph and + * is thus created and destroyed with it. + */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /************************************************************************** + * + * @type: + * FT_OutlineGlyph + * + * @description: + * A handle to an object used to model an outline glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. + */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /************************************************************************** + * + * @struct: + * FT_OutlineGlyphRec + * + * @description: + * A structure used for outline (vectorial) glyph images. This really is + * a 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * outline :: + * A descriptor for the outline. + * + * @note: + * You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_OUTLINE`. This lets you access the + * outline's content easily. + * + * As the outline is extracted from a glyph slot, its coordinates are + * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE + * was used in @FT_Load_Glyph or @FT_Load_Char. + * + * The outline's tables are always owned by the object and are destroyed + * with it. + */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /************************************************************************** + * + * @function: + * FT_New_Glyph + * + * @description: + * A function used to create a new empty glyph image. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * library :: + * A handle to the FreeType library object. + * + * format :: + * The format of the glyph's image. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_New_Glyph( FT_Library library, + FT_Glyph_Format format, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph + * + * @description: + * A function used to extract a glyph image from a slot. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * slot :: + * A handle to the source glyph slot. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Because `*aglyph->advance.x` and `*aglyph->advance.y` are 16.16 + * fixed-point numbers, `slot->advance.x` and `slot->advance.y` (which + * are in 26.6 fixed-point format) must be in the range ]-32768;32768[. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Copy + * + * @description: + * A function used to copy a glyph image. Note that the created + * @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * source :: + * A handle to the source glyph object. + * + * @output: + * target :: + * A handle to the target glyph object. 0~in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Transform + * + * @description: + * Transform a glyph image if its format is scalable. + * + * @inout: + * glyph :: + * A handle to the target glyph object. + * + * @input: + * matrix :: + * A pointer to a 2x2 matrix to apply. + * + * delta :: + * A pointer to a 2d vector to apply. Coordinates are expressed in + * 1/64th of a pixel. + * + * @return: + * FreeType error code (if not 0, the glyph format is not scalable). + * + * @note: + * The 2x2 transformation matrix is also applied to the glyph's advance + * vector. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Glyph_BBox_Mode + * + * @description: + * The mode how the values of @FT_Glyph_Get_CBox are returned. + * + * @values: + * FT_GLYPH_BBOX_UNSCALED :: + * Return unscaled font units. + * + * FT_GLYPH_BBOX_SUBPIXELS :: + * Return unfitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_GRIDFIT :: + * Return grid-fitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_TRUNCATE :: + * Return coordinates in integer pixels. + * + * FT_GLYPH_BBOX_PIXELS :: + * Return grid-fitted pixel coordinates. + */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_BBox_Mode` values instead */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /************************************************************************** + * + * @function: + * FT_Glyph_Get_CBox + * + * @description: + * Return a glyph's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * glyph :: + * A handle to the source glyph object. + * + * mode :: + * The mode that indicates how to interpret the returned bounding box + * values. + * + * @output: + * acbox :: + * The glyph coordinate bounding box. Coordinates are expressed in + * 1/64th of pixels if it is grid-fitted. + * + * @note: + * Coordinates are relative to the glyph origin, using the y~upwards + * convention. + * + * If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode` must + * be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 + * pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS is another name for + * this constant. + * + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get + * reasonable values for the CBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the CBox, which can be + * eventually converted back to font units. + * + * Note that the maximum coordinates are exclusive, which means that one + * can compute the width and height of the glyph image (be it in integer + * or 26.6 pixels) as: + * + * ``` + * width = bbox.xMax - bbox.xMin; + * height = bbox.yMax - bbox.yMin; + * ``` + * + * Note also that for 26.6 coordinates, if `bbox_mode` is set to + * @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, + * which corresponds to: + * + * ``` + * bbox.xMin = FLOOR(bbox.xMin); + * bbox.yMin = FLOOR(bbox.yMin); + * bbox.xMax = CEILING(bbox.xMax); + * bbox.yMax = CEILING(bbox.yMax); + * ``` + * + * To get the bbox in pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_TRUNCATE. + * + * To get the bbox in grid-fitted pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_PIXELS. + */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_To_Bitmap + * + * @description: + * Convert a given glyph object to a bitmap glyph object. + * + * @inout: + * the_glyph :: + * A pointer to a handle to the target glyph. + * + * @input: + * render_mode :: + * An enumeration that describes how the data is rendered. + * + * origin :: + * A pointer to a vector used to translate the glyph image before + * rendering. Can be~0 (if no translation). The origin is expressed + * in 26.6 pixels. + * + * destroy :: + * A boolean that indicates that the original glyph image should be + * destroyed by this function. It is never destroyed in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing if the glyph format isn't scalable. + * + * The glyph image is translated with the `origin` vector before + * rendering. + * + * The first parameter is a pointer to an @FT_Glyph handle, that will be + * _replaced_ by this function (with newly allocated data). Typically, + * you would use (omitting error handling): + * + * ``` + * FT_Glyph glyph; + * FT_BitmapGlyph glyph_bitmap; + * + * + * // load glyph + * error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); + * + * // extract glyph image + * error = FT_Get_Glyph( face->glyph, &glyph ); + * + * // convert to a bitmap (default render mode + destroying old) + * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) + * { + * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, + * 0, 1 ); + * if ( error ) // `glyph' unchanged + * ... + * } + * + * // access bitmap content by typecasting + * glyph_bitmap = (FT_BitmapGlyph)glyph; + * + * // do funny stuff with it, like blitting/drawing + * ... + * + * // discard glyph image (bitmap or not) + * FT_Done_Glyph( glyph ); + * ``` + * + * Here is another example, again without error handling: + * + * ``` + * FT_Glyph glyphs[MAX_GLYPHS] + * + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || + * FT_Get_Glyph ( face->glyph, &glyphs[idx] ); + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * { + * FT_Glyph bitmap = glyphs[idx]; + * + * + * ... + * + * // after this call, `bitmap' no longer points into + * // the `glyphs' array (and the old value isn't destroyed) + * FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); + * + * ... + * + * FT_Done_Glyph( bitmap ); + * } + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * FT_Done_Glyph( glyphs[idx] ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Done_Glyph + * + * @description: + * Destroy a given glyph. + * + * @input: + * glyph :: + * A handle to the target glyph object. + */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @function: + * FT_Matrix_Multiply + * + * @description: + * Perform the matrix operation `b = a*b`. + * + * @input: + * a :: + * A pointer to matrix `a`. + * + * @inout: + * b :: + * A pointer to matrix `b`. + * + * @note: + * The result is undefined if either `a` or `b` is zero. + * + * Since the function uses wrap-around arithmetic, results become + * meaningless if the arguments are very large. + */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /************************************************************************** + * + * @function: + * FT_Matrix_Invert + * + * @description: + * Invert a 2x2 matrix. Return an error if it can't be inverted. + * + * @inout: + * matrix :: + * A pointer to the target matrix. Remains untouched in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGLYPH_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/ftgxval.h b/deps/freetype/include/freetype/ftgxval.h new file mode 100644 index 00000000..b14f637c --- /dev/null +++ b/deps/freetype/include/freetype/ftgxval.h @@ -0,0 +1,355 @@ +/**************************************************************************** + * + * ftgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2019 by + * Masatake YAMATO, Redhat K.K, + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef FTGXVAL_H_ +#define FTGXVAL_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gx_validation + * + * @title: + * TrueTypeGX/AAT Validation + * + * @abstract: + * An API to validate TrueTypeGX/AAT tables. + * + * @description: + * This section contains the declaration of functions to validate some + * TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, + * prop, lcar). + * + * @order: + * FT_TrueTypeGX_Validate + * FT_TrueTypeGX_Free + * + * FT_ClassicKern_Validate + * FT_ClassicKern_Free + * + * FT_VALIDATE_GX_LENGTH + * FT_VALIDATE_GXXXX + * FT_VALIDATE_CKERNXXX + * + */ + + /************************************************************************** + * + * + * Warning: Use `FT_VALIDATE_XXX` to validate a table. + * Following definitions are for gxvalid developers. + * + * + */ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************** + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length` argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH ( FT_VALIDATE_GX_LAST_INDEX + 1 ) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate 'feat' table. + * + * FT_VALIDATE_mort :: + * Validate 'mort' table. + * + * FT_VALIDATE_morx :: + * Validate 'morx' table. + * + * FT_VALIDATE_bsln :: + * Validate 'bsln' table. + * + * FT_VALIDATE_just :: + * Validate 'just' table. + * + * FT_VALIDATE_kern :: + * Validate 'kern' table. + * + * FT_VALIDATE_opbd :: + * Validate 'opbd' table. + * + * FT_VALIDATE_trak :: + * Validate 'trak' table. + * + * FT_VALIDATE_prop :: + * Validate 'prop' table. + * + * FT_VALIDATE_lcar :: + * Validate 'lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables` array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. The array + * itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables` element, by calling @FT_TrueTypeGX_Free. A `NULL` value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate to + * indicate the classic kern dialect or dialects. If the selected type + * doesn't fit, @FT_ClassicKern_Validate regards the table as invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the 'kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the 'kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the 'kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the + * offsets and indices are valid. The idea is that a higher-level + * library that actually does the text layout can access those tables + * without error checking (which can be quite time consuming). + * + * The 'kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table`, by calling @FT_ClassicKern_Free. A `NULL` value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGXVAL_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftgzip.h b/deps/freetype/include/freetype/ftgzip.h new file mode 100644 index 00000000..418c6122 --- /dev/null +++ b/deps/freetype/include/freetype/ftgzip.h @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * ftgzip.h + * + * Gzip-compressed stream support. + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGZIP_H_ +#define FTGZIP_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * gzip + * + * @title: + * GZIP Streams + * + * @abstract: + * Using gzip-compressed font files. + * + * @description: + * This section contains the declaration of Gzip-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is mainly + * used to support the compressed `*.pcf.gz` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + + /************************************************************************** + * + * @function: + * FT_Gzip_Uncompress + * + * @description: + * Decompress a zipped input buffer into an output buffer. This function + * is modeled after zlib's `uncompress` function. + * + * @input: + * memory :: + * A FreeType memory handle. + * + * input :: + * The input buffer. + * + * input_len :: + * The length of the input buffer. + * + * @output: + * output :: + * The output buffer. + * + * @inout: + * output_len :: + * Before calling the function, this is the total size of the output + * buffer, which must be large enough to hold the entire uncompressed + * data (so the size of the uncompressed data must be known in + * advance). After calling the function, `output_len` is the size of + * the used data in `output`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + * + * @since: + * 2.5.1 + */ + FT_EXPORT( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGZIP_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftimage.h b/deps/freetype/include/freetype/ftimage.h new file mode 100644 index 00000000..face34fe --- /dev/null +++ b/deps/freetype/include/freetype/ftimage.h @@ -0,0 +1,1238 @@ +/**************************************************************************** + * + * ftimage.h + * + * FreeType glyph image formats and default raster interface + * (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Note: A 'raster' is simply a scan-line converter, used to render + * FT_Outlines into FT_Bitmaps. + * + */ + + +#ifndef FTIMAGE_H_ +#define FTIMAGE_H_ + + + /* STANDALONE_ is from ftgrays.c */ +#ifndef STANDALONE_ +#include +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Pos + * + * @description: + * The type FT_Pos is used to store vectorial coordinates. Depending on + * the context, these can represent distances in integer font units, or + * 16.16, or 26.6 fixed-point pixel coordinates. + */ + typedef signed long FT_Pos; + + + /************************************************************************** + * + * @struct: + * FT_Vector + * + * @description: + * A simple structure used to store a 2D vector; coordinates are of the + * FT_Pos type. + * + * @fields: + * x :: + * The horizontal coordinate. + * y :: + * The vertical coordinate. + */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /************************************************************************** + * + * @struct: + * FT_BBox + * + * @description: + * A structure used to hold an outline's bounding box, i.e., the + * coordinates of its extrema in the horizontal and vertical directions. + * + * @fields: + * xMin :: + * The horizontal minimum (left-most). + * + * yMin :: + * The vertical minimum (bottom-most). + * + * xMax :: + * The horizontal maximum (right-most). + * + * yMax :: + * The vertical maximum (top-most). + * + * @note: + * The bounding box is specified with the coordinates of the lower left + * and the upper right corner. In PostScript, those values are often + * called (llx,lly) and (urx,ury), respectively. + * + * If `yMin` is negative, this value gives the glyph's descender. + * Otherwise, the glyph doesn't descend below the baseline. Similarly, + * if `ymax` is positive, this value gives the glyph's ascender. + * + * `xMin` gives the horizontal distance from the glyph's origin to the + * left edge of the glyph's bounding box. If `xMin` is negative, the + * glyph extends to the left of the origin. + */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /************************************************************************** + * + * @enum: + * FT_Pixel_Mode + * + * @description: + * An enumeration type used to describe the format of pixels in a given + * bitmap. Note that additional formats may be added in the future. + * + * @values: + * FT_PIXEL_MODE_NONE :: + * Value~0 is reserved. + * + * FT_PIXEL_MODE_MONO :: + * A monochrome bitmap, using 1~bit per pixel. Note that pixels are + * stored in most-significant order (MSB), which means that the + * left-most pixel in a byte has value 128. + * + * FT_PIXEL_MODE_GRAY :: + * An 8-bit bitmap, generally used to represent anti-aliased glyph + * images. Each pixel is stored in one byte. Note that the number of + * 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap + * structure (it generally is 256). + * + * FT_PIXEL_MODE_GRAY2 :: + * A 2-bit per pixel bitmap, used to represent embedded anti-aliased + * bitmaps in font files according to the OpenType specification. We + * haven't found a single font using this format, however. + * + * FT_PIXEL_MODE_GRAY4 :: + * A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps + * in font files according to the OpenType specification. We haven't + * found a single font using this format, however. + * + * FT_PIXEL_MODE_LCD :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on LCD displays; the bitmap is three times wider than + * the original glyph image. See also @FT_RENDER_MODE_LCD. + * + * FT_PIXEL_MODE_LCD_V :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on rotated LCD displays; the bitmap is three times + * taller than the original glyph image. See also + * @FT_RENDER_MODE_LCD_V. + * + * FT_PIXEL_MODE_BGRA :: + * [Since 2.5] An image with four 8-bit channels per pixel, + * representing a color image (such as emoticons) with alpha channel. + * For each pixel, the format is BGRA, which means, the blue channel + * comes first in memory. The color channels are pre-multiplied and in + * the sRGB colorspace. For example, full red at half-translucent + * opacity will be represented as '00,00,80,80', not '00,00,FF,80'. + * See also @FT_LOAD_COLOR. + */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + FT_PIXEL_MODE_BGRA, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */ + /* values instead. */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + + /************************************************************************** + * + * @struct: + * FT_Bitmap + * + * @description: + * A structure used to describe a bitmap or pixmap to the raster. Note + * that we now manage pixmaps of various depths through the `pixel_mode` + * field. + * + * @fields: + * rows :: + * The number of bitmap rows. + * + * width :: + * The number of pixels in bitmap row. + * + * pitch :: + * The pitch's absolute value is the number of bytes taken by one + * bitmap row, including padding. However, the pitch is positive when + * the bitmap has a 'down' flow, and negative when it has an 'up' flow. + * In all cases, the pitch is an offset to add to a bitmap pointer in + * order to go down one row. + * + * Note that 'padding' means the alignment of a bitmap to a byte + * border, and FreeType functions normally align to the smallest + * possible integer value. + * + * For the B/W rasterizer, `pitch` is always an even number. + * + * To change the pitch of a bitmap (say, to make it a multiple of 4), + * use @FT_Bitmap_Convert. Alternatively, you might use callback + * functions to directly render to the application's surface; see the + * file `example2.cpp` in the tutorial for a demonstration. + * + * buffer :: + * A typeless pointer to the bitmap buffer. This value should be + * aligned on 32-bit boundaries in most cases. + * + * num_grays :: + * This field is only used with @FT_PIXEL_MODE_GRAY; it gives the + * number of gray levels used in the bitmap. + * + * pixel_mode :: + * The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode + * for possible values. + * + * palette_mode :: + * This field is intended for paletted pixel modes; it indicates how + * the palette is stored. Not used currently. + * + * palette :: + * A typeless pointer to the bitmap palette; this field is intended for + * paletted pixel modes. Not used currently. + */ + typedef struct FT_Bitmap_ + { + unsigned int rows; + unsigned int width; + int pitch; + unsigned char* buffer; + unsigned short num_grays; + unsigned char pixel_mode; + unsigned char palette_mode; + void* palette; + + } FT_Bitmap; + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Outline + * + * @description: + * This structure is used to describe an outline to the scan-line + * converter. + * + * @fields: + * n_contours :: + * The number of contours in the outline. + * + * n_points :: + * The number of points in the outline. + * + * points :: + * A pointer to an array of `n_points` @FT_Vector elements, giving the + * outline's point coordinates. + * + * tags :: + * A pointer to an array of `n_points` chars, giving each outline + * point's type. + * + * If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier + * control point, while it is 'on' if set. + * + * Bit~1 is meaningful for 'off' points only. If set, it indicates a + * third-order Bezier arc control point; and a second-order control + * point if unset. + * + * If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in + * the OpenType specification; the value is the same as the argument to + * the 'SCANMODE' instruction). + * + * Bits 3 and~4 are reserved for internal purposes. + * + * contours :: + * An array of `n_contours` shorts, giving the end point of each + * contour within the outline. For example, the first contour is + * defined by the points '0' to `contours[0]`, the second one is + * defined by the points `contours[0]+1` to `contours[1]`, etc. + * + * flags :: + * A set of bit flags used to characterize the outline and give hints + * to the scan-converter and hinter on how to convert/grid-fit it. See + * @FT_OUTLINE_XXX. + * + * @note: + * The B/W rasterizer only checks bit~2 in the `tags` array for the first + * point of each contour. The drop-out mode as given with + * @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden. + */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* */ + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /************************************************************************** + * + * @enum: + * FT_OUTLINE_XXX + * + * @description: + * A list of bit-field constants used for the flags in an outline's + * `flags` field. + * + * @values: + * FT_OUTLINE_NONE :: + * Value~0 is reserved. + * + * FT_OUTLINE_OWNER :: + * If set, this flag indicates that the outline's field arrays (i.e., + * `points`, `flags`, and `contours`) are 'owned' by the outline + * object, and should thus be freed when it is destroyed. + * + * FT_OUTLINE_EVEN_ODD_FILL :: + * By default, outlines are filled using the non-zero winding rule. If + * set to 1, the outline will be filled using the even-odd fill rule + * (only works with the smooth rasterizer). + * + * FT_OUTLINE_REVERSE_FILL :: + * By default, outside contours of an outline are oriented in + * clock-wise direction, as defined in the TrueType specification. + * This flag is set if the outline uses the opposite direction + * (typically for Type~1 fonts). This flag is ignored by the scan + * converter. + * + * FT_OUTLINE_IGNORE_DROPOUTS :: + * By default, the scan converter will try to detect drop-outs in an + * outline and correct the glyph bitmap to ensure consistent shape + * continuity. If set, this flag hints the scan-line converter to + * ignore such cases. See below for more information. + * + * FT_OUTLINE_SMART_DROPOUTS :: + * Select smart dropout control. If unset, use simple dropout control. + * Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_INCLUDE_STUBS :: + * If set, turn pixels on for 'stubs', otherwise exclude them. Ignored + * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_HIGH_PRECISION :: + * This flag indicates that the scan-line converter should try to + * convert this outline to bitmaps with the highest possible quality. + * It is typically set for small character sizes. Note that this is + * only a hint that might be completely ignored by a given + * scan-converter. + * + * FT_OUTLINE_SINGLE_PASS :: + * This flag is set to force a given scan-converter to only use a + * single pass over the outline to render a bitmap glyph image. + * Normally, it is set for very large character sizes. It is only a + * hint that might be completely ignored by a given scan-converter. + * + * @note: + * The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer. + * + * There exists a second mechanism to pass the drop-out mode to the B/W + * rasterizer; see the `tags` field in @FT_Outline. + * + * Please refer to the description of the 'SCANTYPE' instruction in the + * OpenType specification (in file `ttinst1.doc`) how simple drop-outs, + * smart drop-outs, and stubs are defined. + */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /* these constants are deprecated; use the corresponding */ + /* `FT_OUTLINE_XXX` values instead */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 0x03 ) + + /* see the `tags` field in `FT_Outline` for a description of the values */ +#define FT_CURVE_TAG_ON 0x01 +#define FT_CURVE_TAG_CONIC 0x00 +#define FT_CURVE_TAG_CUBIC 0x02 + +#define FT_CURVE_TAG_HAS_SCANMODE 0x04 + +#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + /* values 0x20, 0x40, and 0x80 are reserved */ + + + /* these constants are deprecated; use the corresponding */ + /* `FT_CURVE_TAG_XXX` values instead */ +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /************************************************************************** + * + * @functype: + * FT_Outline_MoveToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'move to' + * function during outline walking/decomposition. + * + * A 'move to' is emitted to start a new contour in an outline. + * + * @input: + * to :: + * A pointer to the target point of the 'move to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_LineToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'line to' + * function during outline walking/decomposition. + * + * A 'line to' is emitted to indicate a segment in the outline. + * + * @input: + * to :: + * A pointer to the target point of the 'line to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_ConicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'conic to' + * function during outline walking or decomposition. + * + * A 'conic to' is emitted to indicate a second-order Bezier arc in the + * outline. + * + * @input: + * control :: + * An intermediate control point between the last position and the new + * target in `to`. + * + * to :: + * A pointer to the target end point of the conic arc. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_CubicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'cubic to' + * function during outline walking or decomposition. + * + * A 'cubic to' is emitted to indicate a third-order Bezier arc. + * + * @input: + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to the second Bezier control point. + * + * to :: + * A pointer to the target end point. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /************************************************************************** + * + * @struct: + * FT_Outline_Funcs + * + * @description: + * A structure to hold various function pointers used during outline + * decomposition in order to emit segments, conic, and cubic Beziers. + * + * @fields: + * move_to :: + * The 'move to' emitter. + * + * line_to :: + * The segment emitter. + * + * conic_to :: + * The second-order Bezier arc emitter. + * + * cubic_to :: + * The third-order Bezier arc emitter. + * + * shift :: + * The shift that is applied to coordinates before they are sent to the + * emitter. + * + * delta :: + * The delta that is applied to coordinates before they are sent to the + * emitter, but after the shift. + * + * @note: + * The point coordinates sent to the emitters are the transformed version + * of the original coordinates (this is important for high accuracy + * during scan-conversion). The transformation is simple: + * + * ``` + * x' = (x << shift) - delta + * y' = (y << shift) - delta + * ``` + * + * Set the values of `shift` and `delta` to~0 to get the original point + * coordinates. + */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_TAG + * + * @description: + * This macro converts four-letter tags to an unsigned long type. + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Glyph_Format + * + * @description: + * An enumeration type used to describe the format of a given glyph + * image. Note that this version of FreeType only supports two image + * formats, even though future font drivers will be able to register + * their own format. + * + * @values: + * FT_GLYPH_FORMAT_NONE :: + * The value~0 is reserved. + * + * FT_GLYPH_FORMAT_COMPOSITE :: + * The glyph image is a composite of several other images. This format + * is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report + * compound glyphs (like accented characters). + * + * FT_GLYPH_FORMAT_BITMAP :: + * The glyph image is a bitmap, and can be described as an @FT_Bitmap. + * You generally need to access the `bitmap` field of the + * @FT_GlyphSlotRec structure to read it. + * + * FT_GLYPH_FORMAT_OUTLINE :: + * The glyph image is a vectorial outline made of line segments and + * Bezier arcs; it can be described as an @FT_Outline; you generally + * want to access the `outline` field of the @FT_GlyphSlotRec structure + * to read it. + * + * FT_GLYPH_FORMAT_PLOTTER :: + * The glyph image is a vectorial path with no inside and outside + * contours. Some Type~1 fonts, like those in the Hershey family, + * contain glyphs in this format. These are described as @FT_Outline, + * but FreeType isn't currently capable of rendering them correctly. + */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_Format` values instead. */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * A raster is a scan converter, in charge of rendering an outline into a + * bitmap. This section contains the public API for rasters. + * + * Note that in FreeType 2, all rasters are now encapsulated within + * specific modules called 'renderers'. See `ftrender.h` for more details + * on renderers. + * + */ + + + /************************************************************************** + * + * @section: + * raster + * + * @title: + * Scanline Converter + * + * @abstract: + * How vectorial outlines are converted into bitmaps and pixmaps. + * + * @description: + * This section contains technical definitions. + * + * @order: + * FT_Raster + * FT_Span + * FT_SpanFunc + * + * FT_Raster_Params + * FT_RASTER_FLAG_XXX + * + * FT_Raster_NewFunc + * FT_Raster_DoneFunc + * FT_Raster_ResetFunc + * FT_Raster_SetModeFunc + * FT_Raster_RenderFunc + * FT_Raster_Funcs + * + */ + + + /************************************************************************** + * + * @type: + * FT_Raster + * + * @description: + * An opaque handle (pointer) to a raster object. Each object can be + * used independently to convert an outline into a bitmap or pixmap. + */ + typedef struct FT_RasterRec_* FT_Raster; + + + /************************************************************************** + * + * @struct: + * FT_Span + * + * @description: + * A structure used to model a single span of gray pixels when rendering + * an anti-aliased bitmap. + * + * @fields: + * x :: + * The span's horizontal start position. + * + * len :: + * The span's length in pixels. + * + * coverage :: + * The span color/coverage, ranging from 0 (background) to 255 + * (foreground). + * + * @note: + * This structure is used by the span drawing callback type named + * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. + * + * The coverage value is always between 0 and 255. If you want less gray + * values, the callback function has to reduce them. + */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /************************************************************************** + * + * @functype: + * FT_SpanFunc + * + * @description: + * A function used as a call-back by the anti-aliased renderer in order + * to let client applications draw themselves the gray pixel spans on + * each scan line. + * + * @input: + * y :: + * The scanline's upward y~coordinate. + * + * count :: + * The number of spans to draw on this scanline. + * + * spans :: + * A table of `count` spans to draw on the scanline. + * + * user :: + * User-supplied data that is passed to the callback. + * + * @note: + * This callback allows client applications to directly render the gray + * spans of the anti-aliased bitmap to any kind of surfaces. + * + * This can be used to write anti-aliased outlines directly to a given + * background bitmap, and even perform translucency. + */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitTest_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitSet_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @enum: + * FT_RASTER_FLAG_XXX + * + * @description: + * A list of bit flag constants as used in the `flags` field of a + * @FT_Raster_Params structure. + * + * @values: + * FT_RASTER_FLAG_DEFAULT :: + * This value is 0. + * + * FT_RASTER_FLAG_AA :: + * This flag is set to indicate that an anti-aliased glyph image should + * be generated. Otherwise, it will be monochrome (1-bit). + * + * FT_RASTER_FLAG_DIRECT :: + * This flag is set to indicate direct rendering. In this mode, client + * applications must provide their own span callback. This lets them + * directly draw or compose over an existing bitmap. If this bit is + * _not_ set, the target pixmap's buffer _must_ be zeroed before + * rendering and the output will be clipped to its size. + * + * Direct rendering is only possible with anti-aliased glyphs. + * + * FT_RASTER_FLAG_CLIP :: + * This flag is only used in direct rendering mode. If set, the output + * will be clipped to a box specified in the `clip_box` field of the + * @FT_Raster_Params structure. Otherwise, the `clip_box` is + * effectively set to the bounding box and all spans are generated. + */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* these constants are deprecated; use the corresponding */ + /* `FT_RASTER_FLAG_XXX` values instead */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /************************************************************************** + * + * @struct: + * FT_Raster_Params + * + * @description: + * A structure to hold the parameters used by a raster's render function, + * passed as an argument to @FT_Outline_Render. + * + * @fields: + * target :: + * The target bitmap. + * + * source :: + * A pointer to the source glyph image (e.g., an @FT_Outline). + * + * flags :: + * The rendering flags. + * + * gray_spans :: + * The gray span drawing callback. + * + * black_spans :: + * Unused. + * + * bit_test :: + * Unused. + * + * bit_set :: + * Unused. + * + * user :: + * User-supplied data that is passed to each drawing callback. + * + * clip_box :: + * An optional clipping box. It is only used in direct rendering mode. + * Note that coordinates here should be expressed in _integer_ pixels + * (and not in 26.6 fixed-point units). + * + * @note: + * An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA bit + * flag is set in the `flags` field, otherwise a monochrome bitmap is + * generated. + * + * If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags`, the raster + * will call the `gray_spans` callback to draw gray pixel spans. This + * allows direct composition over a pre-existing bitmap through + * user-provided callbacks to perform the span drawing and composition. + * Not supported by the monochrome rasterizer. + */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* unused */ + FT_Raster_BitTest_Func bit_test; /* unused */ + FT_Raster_BitSet_Func bit_set; /* unused */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /************************************************************************** + * + * @functype: + * FT_Raster_NewFunc + * + * @description: + * A function used to create a new raster object. + * + * @input: + * memory :: + * A handle to the memory allocator. + * + * @output: + * raster :: + * A handle to the new raster object. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The `memory` parameter is a typeless pointer in order to avoid + * un-wanted dependencies on the rest of the FreeType code. In practice, + * it is an @FT_Memory object, i.e., a handle to the standard FreeType + * memory allocator. However, this field can be completely ignored by a + * given raster implementation. + */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_DoneFunc + * + * @description: + * A function used to destroy a given raster object. + * + * @input: + * raster :: + * A handle to the raster object. + */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_ResetFunc + * + * @description: + * FreeType used to provide an area of memory called the 'render pool' + * available to all registered rasterizers. This was not thread safe, + * however, and now FreeType never allocates this pool. + * + * This function is called after a new raster object is created. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * pool_base :: + * Previously, the address in memory of the render pool. Set this to + * `NULL`. + * + * pool_size :: + * Previously, the size in bytes of the render pool. Set this to 0. + * + * @note: + * Rasterizers should rely on dynamic or stack allocation if they want to + * (a handle to the memory allocator is passed to the rasterizer + * constructor). + */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_SetModeFunc + * + * @description: + * This function is a generic facility to change modes or attributes in a + * given raster. This can be used for debugging purposes, or simply to + * allow implementation-specific 'features' in a given raster module. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * mode :: + * A 4-byte tag used to name the mode or property. + * + * args :: + * A pointer to the new mode/property to use. + */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_RenderFunc + * + * @description: + * Invoke a given raster to scan-convert a given glyph image into a + * target bitmap. + * + * @input: + * raster :: + * A handle to the raster object. + * + * params :: + * A pointer to an @FT_Raster_Params structure used to store the + * rendering parameters. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The exact format of the source image depends on the raster's glyph + * format defined in its @FT_Raster_Funcs structure. It can be an + * @FT_Outline or anything else in order to support a large array of + * glyph formats. + * + * Note also that the render function can fail and return a + * `FT_Err_Unimplemented_Feature` error code if the raster used does not + * support direct composition. + */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /************************************************************************** + * + * @struct: + * FT_Raster_Funcs + * + * @description: + * A structure used to describe a given raster class to the library. + * + * @fields: + * glyph_format :: + * The supported glyph format for this raster. + * + * raster_new :: + * The raster constructor. + * + * raster_reset :: + * Used to reset the render pool within the raster. + * + * raster_render :: + * A function to render a glyph into a given bitmap. + * + * raster_done :: + * The raster destructor. + */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + /* */ + + +FT_END_HEADER + +#endif /* FTIMAGE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/ftincrem.h b/deps/freetype/include/freetype/ftincrem.h new file mode 100644 index 00000000..a4db02b5 --- /dev/null +++ b/deps/freetype/include/freetype/ftincrem.h @@ -0,0 +1,344 @@ +/**************************************************************************** + * + * ftincrem.h + * + * FreeType incremental loading (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTINCREM_H_ +#define FTINCREM_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * 'incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application. + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * 'incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript + * interpreters), where the glyph data isn't in the font file, or must be + * overridden by different values. + * + * @note: + * It is up to client applications to create and implement + * @FT_Incremental objects, as long as they provide implementations for + * the methods @FT_Incremental_GetGlyphDataFunc, + * @FT_Incremental_FreeGlyphDataFunc and + * @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned by + * the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical` argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the 'glyf' table. For PostScript formats, it must correspond to the + * **unencrypted** charstring bytes, without any `lenIV` header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release the + * data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place + * from the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. The original + * glyph metrics, if any, in font units. If metrics are not available + * all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data incrementally. + * Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does not + * provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * ``` + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * ``` + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /* */ + + +FT_END_HEADER + +#endif /* FTINCREM_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftlcdfil.h b/deps/freetype/include/freetype/ftlcdfil.h new file mode 100644 index 00000000..3a19d043 --- /dev/null +++ b/deps/freetype/include/freetype/ftlcdfil.h @@ -0,0 +1,328 @@ +/**************************************************************************** + * + * ftlcdfil.h + * + * FreeType API for color filtering of subpixel bitmap glyphs + * (specification). + * + * Copyright (C) 2006-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLCDFIL_H_ +#define FTLCDFIL_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lcd_rendering + * + * @title: + * Subpixel Rendering + * + * @abstract: + * API to control subpixel rendering. + * + * @description: + * FreeType provides two alternative subpixel rendering technologies. + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h` file, this enables patented ClearType-style rendering. + * Otherwise, Harmony LCD rendering is enabled. These technologies are + * controlled differently and API described below, although always + * available, performs its function when appropriate method is enabled + * and does nothing otherwise. + * + * ClearType-style LCD rendering exploits the color-striped structure of + * LCD pixels, increasing the available resolution in the direction of + * the stripe (usually horizontal RGB) by a factor of~3. Using the + * subpixels coverages unfiltered can create severe color fringes + * especially when rendering thin features. Indeed, to produce + * black-on-white text, the nearby color subpixels must be dimmed + * equally. + * + * A good 5-tap FIR filter should be applied to subpixel coverages + * regardless of pixel boundaries and should have these properties: + * + * 1. It should be symmetrical, like {~a, b, c, b, a~}, to avoid + * any shifts in appearance. + * + * 2. It should be color-balanced, meaning a~+ b~=~c, to reduce color + * fringes by distributing the computed coverage for one subpixel to + * all subpixels equally. + * + * 3. It should be normalized, meaning 2a~+ 2b~+ c~=~1.0 to maintain + * overall brightness. + * + * Boxy 3-tap filter {0, 1/3, 1/3, 1/3, 0} is sharper but is less + * forgiving of non-ideal gamma curves of a screen (and viewing angles), + * beveled filters are fuzzier but more tolerant. + * + * Use the @FT_Library_SetLcdFilter or @FT_Library_SetLcdFilterWeights + * API to specify a low-pass filter, which is then applied to + * subpixel-rendered bitmaps generated through @FT_Render_Glyph. + * + * Harmony LCD rendering is suitable to panels with any regular subpixel + * structure, not just monitors with 3 color striped subpixels, as long + * as the color subpixels have fixed positions relative to the pixel + * center. In this case, each color channel is then rendered separately + * after shifting the outline opposite to the subpixel shift so that the + * coverage maps are aligned. This method is immune to color fringes + * because the shifts do not change integral coverage. + * + * The subpixel geometry must be specified by xy-coordinates for each + * subpixel. By convention they may come in the RGB order: {{-1/3, 0}, + * {0, 0}, {1/3, 0}} for standard RGB striped panel or {{-1/6, 1/4}, + * {-1/6, -1/4}, {1/3, 0}} for a certain PenTile panel. + * + * Use the @FT_Library_SetLcdGeometry API to specify subpixel positions. + * If one follows the RGB order convention, the same order applies to the + * resulting @FT_PIXEL_MODE_LCD and @FT_PIXEL_MODE_LCD_V bitmaps. Note, + * however, that the coordinate frame for the latter must be rotated + * clockwise. Harmony with default LCD geometry is equivalent to + * ClearType with light filter. + * + * As a result of ClearType filtering or Harmony rendering, the + * dimensions of LCD bitmaps can be either wider or taller than the + * dimensions of the corresponding outline with regard to the pixel grid. + * For example, for @FT_RENDER_MODE_LCD, the filter adds 2~subpixels to + * the left, and 2~subpixels to the right. The bitmap offset values are + * adjusted accordingly, so clients shouldn't need to modify their layout + * and glyph positioning code when enabling the filter. + * + * The ClearType and Harmony rendering is applicable to glyph bitmaps + * rendered through @FT_Render_Glyph, @FT_Load_Glyph, @FT_Load_Char, and + * @FT_Glyph_To_Bitmap, when @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V + * is specified. This API does not control @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * The described algorithms can completely remove color artefacts when + * combined with gamma-corrected alpha blending in linear space. Each of + * the 3~alpha values (subpixels) must by independently used to blend one + * color channel. That is, red alpha blends the red channel of the text + * color with the red channel of the background pixel. + */ + + + /************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * This is a beveled, normalized, and color-balanced five-tap filter + * with weights of [0x08 0x4D 0x56 0x4D 0x08] in 1/256th units. + * + * FT_LCD_FILTER_LIGHT :: + * this is a boxy, normalized, and color-balanced three-tap filter with + * weights of [0x00 0x55 0x56 0x55 0x00] in 1/256th units. + * + * FT_LCD_FILTER_LEGACY :: + * FT_LCD_FILTER_LEGACY1 :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. The second value is + * provided for compatibility with FontConfig, which historically used + * different enumeration, sometimes incorrectly forwarded to FreeType. + * + * @since: + * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2) + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY1 = 3, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work well + * on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter` value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to **PATENTS** covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature` if the + * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilterWeights + * + * @description: + * This function can be used to enable LCD filter with custom weights, + * instead of using presets in @FT_Library_SetLcdFilter. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights in 1/256th units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Due to **PATENTS** covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature` if the + * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * LCD filter weights can also be set per face using @FT_Face_Properties + * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + + /************************************************************************** + * + * @type: + * FT_LcdFiveTapFilter + * + * @description: + * A typedef for passing the five LCD filter weights to + * @FT_Face_Properties within an @FT_Parameter structure. + * + * @since: + * 2.8 + * + */ +#define FT_LCD_FILTER_FIVE_TAPS 5 + + typedef FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdGeometry + * + * @description: + * This function can be used to modify default positions of color + * subpixels, which controls Harmony LCD rendering. + * + * @input: + * library :: + * A handle to the target library instance. + * + * sub :: + * A pointer to an array of 3 vectors in 26.6 fractional pixel format; + * the function modifies the default values, see the note below. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Subpixel geometry examples: + * + * - {{-21, 0}, {0, 0}, {21, 0}} is the default, corresponding to 3 color + * stripes shifted by a third of a pixel. This could be an RGB panel. + * + * - {{21, 0}, {0, 0}, {-21, 0}} looks the same as the default but can + * specify a BGR panel instead, while keeping the bitmap in the same + * RGB888 format. + * + * - {{0, 21}, {0, 0}, {0, -21}} is the vertical RGB, but the bitmap + * stays RGB888 as a result. + * + * - {{-11, 16}, {-11, -16}, {22, 0}} is a certain PenTile arrangement. + * + * This function does nothing and returns `FT_Err_Unimplemented_Feature` + * in the context of ClearType-style subpixel rendering when + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is defined in your build of the + * library. + * + * @since: + * 2.10.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLCDFIL_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftlist.h b/deps/freetype/include/freetype/ftlist.h new file mode 100644 index 00000000..4782892d --- /dev/null +++ b/deps/freetype/include/freetype/ftlist.h @@ -0,0 +1,297 @@ +/**************************************************************************** + * + * ftlist.h + * + * Generic list support for FreeType (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file implements functions relative to list processing. Its data + * structures are defined in `freetype.h`. + * + */ + + +#ifndef FTLIST_H_ +#define FTLIST_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * list_processing + * + * @title: + * List Processing + * + * @abstract: + * Simple management of lists. + * + * @description: + * This section contains various definitions related to list processing + * using doubly-linked nodes. + * + * @order: + * FT_List + * FT_ListNode + * FT_ListRec + * FT_ListNodeRec + * + * FT_List_Add + * FT_List_Insert + * FT_List_Find + * FT_List_Remove + * FT_List_Up + * FT_List_Iterate + * FT_List_Iterator + * FT_List_Finalize + * FT_List_Destructor + * + */ + + + /************************************************************************** + * + * @function: + * FT_List_Find + * + * @description: + * Find the list node for a given listed object. + * + * @input: + * list :: + * A pointer to the parent list. + * data :: + * The address of the listed object. + * + * @return: + * List node. `NULL` if it wasn't found. + */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /************************************************************************** + * + * @function: + * FT_List_Add + * + * @description: + * Append an element to the end of a list. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to append. + */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Insert + * + * @description: + * Insert an element at the head of a list. + * + * @inout: + * list :: + * A pointer to parent list. + * node :: + * The node to insert. + */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Remove + * + * @description: + * Remove a node from a list. This function doesn't check whether the + * node is in the list! + * + * @input: + * node :: + * The node to remove. + * + * @inout: + * list :: + * A pointer to the parent list. + */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Up + * + * @description: + * Move a node to the head/top of a list. Used to maintain LRU lists. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to move. + */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @functype: + * FT_List_Iterator + * + * @description: + * An FT_List iterator function that is called during a list parse by + * @FT_List_Iterate. + * + * @input: + * node :: + * The current iteration list node. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. Can be used to point + * to the iteration's state. + */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Iterate + * + * @description: + * Parse a list and calls a given iterator function on each element. + * Note that parsing is stopped as soon as one of the iterator calls + * returns a non-zero value. + * + * @input: + * list :: + * A handle to the list. + * iterator :: + * An iterator function, called on each node of the list. + * user :: + * A user-supplied field that is passed as the second argument to the + * iterator. + * + * @return: + * The result (a FreeType error code) of the last iterator call. + */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_List_Destructor + * + * @description: + * An @FT_List iterator function that is called during a list + * finalization by @FT_List_Finalize to destroy all elements in a given + * list. + * + * @input: + * system :: + * The current system object. + * + * data :: + * The current object to destroy. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. It can be used to + * point to the iteration's state. + */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Finalize + * + * @description: + * Destroy all elements in the list as well as the list itself. + * + * @input: + * list :: + * A handle to the list. + * + * destroy :: + * A list destructor that will be applied to each element of the list. + * Set this to `NULL` if not needed. + * + * memory :: + * The current memory object that handles deallocation. + * + * user :: + * A user-supplied field that is passed as the last argument to the + * destructor. + * + * @note: + * This function expects that all nodes added by @FT_List_Add or + * @FT_List_Insert have been dynamically allocated. + */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLIST_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftlzw.h b/deps/freetype/include/freetype/ftlzw.h new file mode 100644 index 00000000..fd22968f --- /dev/null +++ b/deps/freetype/include/freetype/ftlzw.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * ftlzw.h + * + * LZW-compressed stream support. + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLZW_H_ +#define FTLZW_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lzw + * + * @title: + * LZW Streams + * + * @abstract: + * Using LZW-compressed font files. + * + * @description: + * This section contains the declaration of LZW-specific functions. + * + */ + + /************************************************************************** + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is mainly + * used to support the compressed `*.pcf.Z` fonts that come with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it and + * re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLZW_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftmac.h b/deps/freetype/include/freetype/ftmac.h new file mode 100644 index 00000000..92b9f3dc --- /dev/null +++ b/deps/freetype/include/freetype/ftmac.h @@ -0,0 +1,290 @@ +/**************************************************************************** + * + * ftmac.h + * + * Additional Mac-specific API. + * + * Copyright (C) 1996-2019 by + * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * NOTE: Include this file after `FT_FREETYPE_H` and after any + * Mac-specific headers (because this header uses Mac types such as + * 'Handle', 'FSSpec', 'FSRef', etc.) + * + */ + + +#ifndef FTMAC_H_ +#define FTMAC_H_ + + +#include + + +FT_BEGIN_HEADER + + + /* gcc-3.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 4 ) || \ + ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) ) +#define FT_DEPRECATED_ATTRIBUTE __attribute__(( deprecated )) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /************************************************************************** + * + * @section: + * mac_specific + * + * @title: + * Mac Specific Interface + * + * @abstract: + * Only available on the Macintosh. + * + * @description: + * The following definitions are only available if FreeType is compiled + * on a Macintosh. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FOND + * + * @description: + * Create a new face object from a FOND resource. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * fond :: + * A FOND resource. + * + * face_index :: + * Only supported for the -1 'sanity check' special case. + * + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * This function can be used to create @FT_Face objects from fonts that + * are installed in the system as follows. + * + * ``` + * fond = GetResource( 'FOND', fontName ); + * error = FT_New_Face_From_FOND( library, fond, 0, &face ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font (e.g., Times New Roman Bold). + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_ATS_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFilePath_From_Mac_ATS_Name + * + * @description: + * Return a pathname of the disk file and face index for given font name + * that is handled by ATS framework. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * path :: + * Buffer to store pathname of the file. For passing to @FT_New_Face. + * The client must allocate this buffer before calling this function. + * + * maxPathSize :: + * Lengths of the buffer `path` that client allocated. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSSpec + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSSpec to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSSpec to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSSpec is identical to @FT_New_Face except it + * accepts an FSSpec instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSRef + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSRef to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSRef to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSRef is identical to @FT_New_Face except it accepts + * an FSRef instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* FTMAC_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftmm.h b/deps/freetype/include/freetype/ftmm.h new file mode 100644 index 00000000..f2e16b64 --- /dev/null +++ b/deps/freetype/include/freetype/ftmm.h @@ -0,0 +1,753 @@ +/**************************************************************************** + * + * ftmm.h + * + * FreeType Multiple Master font interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMM_H_ +#define FTMM_H_ + + +#include +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * multiple_masters + * + * @title: + * Multiple Masters + * + * @abstract: + * How to manage Multiple Masters fonts. + * + * @description: + * The following types and functions are used to manage Multiple Master + * fonts, i.e., the selection of specific design instances by setting + * design axis coordinates. + * + * Besides Adobe MM fonts, the interface supports Apple's TrueType GX and + * OpenType variation fonts. Some of the routines only work with Adobe + * MM fonts, others will work with all three types. They are similar + * enough that a consistent interface makes sense. + * + */ + + + /************************************************************************** + * + * @struct: + * FT_MM_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple Masters + * fonts. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * name :: + * The axis's name. + * + * minimum :: + * The axis's minimum design coordinate. + * + * maximum :: + * The axis's maximum design coordinate. + */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Multi_Master + * + * @description: + * A structure to model the axes and space of a Multiple Masters font. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * num_axis :: + * Number of axes. Cannot exceed~4. + * + * num_designs :: + * Number of designs; should be normally 2^num_axis even though the + * Type~1 specification strangely allows for intermediate designs to be + * present. This number cannot exceed~16. + * + * axis :: + * A table of axis descriptors. + */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /************************************************************************** + * + * @struct: + * FT_Var_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple + * Masters, TrueType GX, and OpenType variation fonts. + * + * @fields: + * name :: + * The axis's name. Not always meaningful for TrueType GX or OpenType + * variation fonts. + * + * minimum :: + * The axis's minimum design coordinate. + * + * def :: + * The axis's default design coordinate. FreeType computes meaningful + * default values for Adobe MM fonts. + * + * maximum :: + * The axis's maximum design coordinate. + * + * tag :: + * The axis's tag (the equivalent to 'name' for TrueType GX and + * OpenType variation fonts). FreeType provides default values for + * Adobe MM fonts if possible. + * + * strid :: + * The axis name entry in the font's 'name' table. This is another + * (and often better) version of the 'name' field for TrueType GX or + * OpenType variation fonts. Not meaningful for Adobe MM fonts. + * + * @note: + * The fields `minimum`, `def`, and `maximum` are 16.16 fractional values + * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the + * values are integers. + */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Var_Named_Style + * + * @description: + * A structure to model a named instance in a TrueType GX or OpenType + * variation font. + * + * This structure can't be used for Adobe MM fonts. + * + * @fields: + * coords :: + * The design coordinates for this instance. This is an array with one + * entry for each axis. + * + * strid :: + * The entry in 'name' table identifying this instance. + * + * psid :: + * The entry in 'name' table identifying a PostScript name for this + * instance. Value 0xFFFF indicates a missing entry. + */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + FT_UInt psid; /* since 2.7.1 */ + + } FT_Var_Named_Style; + + + /************************************************************************** + * + * @struct: + * FT_MM_Var + * + * @description: + * A structure to model the axes and space of an Adobe MM, TrueType GX, + * or OpenType variation font. + * + * Some fields are specific to one format and not to the others. + * + * @fields: + * num_axis :: + * The number of axes. The maximum value is~4 for Adobe MM fonts; no + * limit in TrueType GX or OpenType variation fonts. + * + * num_designs :: + * The number of designs; should be normally 2^num_axis for Adobe MM + * fonts. Not meaningful for TrueType GX or OpenType variation fonts + * (where every glyph could have a different number of designs). + * + * num_namedstyles :: + * The number of named styles; a 'named style' is a tuple of design + * coordinates that has a string ID (in the 'name' table) associated + * with it. The font can tell the user that, for example, + * [Weight=1.5,Width=1.1] is 'Bold'. Another name for 'named style' is + * 'named instance'. + * + * For Adobe Multiple Masters fonts, this value is always zero because + * the format does not support named styles. + * + * axis :: + * An axis descriptor table. TrueType GX and OpenType variation fonts + * contain slightly more data than Adobe MM fonts. Memory management + * of this pointer is done internally by FreeType. + * + * namedstyle :: + * A named style (instance) table. Only meaningful for TrueType GX and + * OpenType variation fonts. Memory management of this pointer is done + * internally by FreeType. + */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /************************************************************************** + * + * @function: + * FT_Get_Multi_Master + * + * @description: + * Retrieve a variation descriptor of a given Adobe MM font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The Multiple Masters descriptor. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Var + * + * @description: + * Retrieve a variation descriptor for a given font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The variation descriptor. Allocates a data structure, which the + * user must deallocate with a call to @FT_Done_MM_Var after use. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Done_MM_Var + * + * @description: + * Free the memory allocated by @FT_Get_MM_Var. + * + * @input: + * library :: + * A handle of the face's parent library object that was used in the + * call to @FT_Get_MM_Var to create `amaster`. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Design_Coordinates + * + * @description: + * For Adobe MM fonts, choose an interpolated font design through design + * coordinates. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Design_Coordinates + * + * @description: + * Choose an interpolated font design through design coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Design_Coordinates + * + * @description: + * Get the design coordinates of the currently selected interpolated + * font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of design coordinates to retrieve. If it is larger than + * the number of axes, set the excess values to~0. + * + * @output: + * coords :: + * The design coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Blend_Coordinates + * + * @description: + * Choose an interpolated font design through normalized blend + * coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * The design coordinates array (each element must be between 0 and 1.0 + * for Adobe MM fonts, and between -1.0 and 1.0 for TrueType GX and + * OpenType variation fonts). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Blend_Coordinates + * + * @description: + * Get the normalized blend coordinates of the currently selected + * interpolated font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of normalized blend coordinates to retrieve. If it is + * larger than the number of axes, set the excess values to~0.5 for + * Adobe MM fonts, and to~0 for TrueType GX and OpenType variation + * fonts. + * + * @output: + * coords :: + * The normalized blend coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Set_MM_Blend_Coordinates. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Get_MM_Blend_Coordinates. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_WeightVector + * + * @description: + * For Adobe MM fonts, choose an interpolated font design by directly + * setting the weight vector. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * len :: + * The length of the weight vector array. If it is larger than the + * number of designs, the extra values are ignored. If it is less than + * the number of designs, the remaining values are set to zero. + * + * weightvector :: + * An array representing the weight vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the weight vector to~16. + * + * If `len` is zero and `weightvector` is `NULL`, the weight vector array + * is reset to the default values. + * + * The Adobe documentation also states that the values in the + * WeightVector array must total 1.0 +/-~0.001. In practice this does + * not seem to be enforced, so is not enforced here, either. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_WeightVector + * + * @description: + * For Adobe MM fonts, retrieve the current weight vector of the font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * len :: + * A pointer to the size of the array to be filled. If the size of the + * array is less than the number of designs, `FT_Err_Invalid_Argument` + * is returned, and `len` is set to the required size (the number of + * designs). If the size of the array is greater than the number of + * designs, the remaining entries are set to~0. On successful + * completion, `len` is set to the number of designs (i.e., the number + * of values written to the array). + * + * @output: + * weightvector :: + * An array to be filled. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the WeightVector to~16. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @enum: + * FT_VAR_AXIS_FLAG_XXX + * + * @description: + * A list of bit flags used in the return value of + * @FT_Get_Var_Axis_Flags. + * + * @values: + * FT_VAR_AXIS_FLAG_HIDDEN :: + * The variation axis should not be exposed to user interfaces. + * + * @since: + * 2.8.1 + */ +#define FT_VAR_AXIS_FLAG_HIDDEN 1 + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Axis_Flags + * + * @description: + * Get the 'flags' field of an OpenType Variation Axis Record. + * + * Not meaningful for Adobe MM fonts (`*flags` is always zero). + * + * @input: + * master :: + * The variation descriptor. + * + * axis_index :: + * The index of the requested variation axis. + * + * @output: + * flags :: + * The 'flags' field. See @FT_VAR_AXIS_FLAG_XXX for possible values. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.8.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ); + + + /************************************************************************** + * + * @function: + * FT_Set_Named_Instance + * + * @description: + * Set or change the current named instance. + * + * @input: + * face :: + * A handle to the source face. + * + * instance_index :: + * The index of the requested instance, starting with value 1. If set + * to value 0, FreeType switches to font access without a named + * instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The function uses the value of `instance_index` to set bits 16-30 of + * the face's `face_index` field. It also resets any variation applied + * to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's + * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will + * return false). + * + * For Adobe MM fonts (which don't have named instances) this function + * simply resets the current face to the default instance. + * + * @since: + * 2.9 + */ + FT_EXPORT( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMM_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftmodapi.h b/deps/freetype/include/freetype/ftmodapi.h new file mode 100644 index 00000000..8d039c4f --- /dev/null +++ b/deps/freetype/include/freetype/ftmodapi.h @@ -0,0 +1,785 @@ +/**************************************************************************** + * + * ftmodapi.h + * + * FreeType modules public interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMODAPI_H_ +#define FTMODAPI_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + * @title: + * Module Management + * + * @abstract: + * How to add, upgrade, remove, and control modules from FreeType. + * + * @description: + * The definitions below are used to manage modules within FreeType. + * Modules can be added, upgraded, and removed at runtime. Additionally, + * some module properties can be controlled also. + * + * Here is a list of possible values of the `module_name` field in the + * @FT_Module_Class structure. + * + * ``` + * autofitter + * bdf + * cff + * gxvalid + * otvalid + * pcf + * pfr + * psaux + * pshinter + * psnames + * raster1 + * sfnt + * smooth, smooth-lcd, smooth-lcdv + * truetype + * type1 + * type42 + * t1cid + * winfonts + * ``` + * + * Note that the FreeType Cache sub-system is not a FreeType module. + * + * @order: + * FT_Module + * FT_Module_Constructor + * FT_Module_Destructor + * FT_Module_Requester + * FT_Module_Class + * + * FT_Add_Module + * FT_Get_Module + * FT_Remove_Module + * FT_Add_Default_Modules + * + * FT_Property_Set + * FT_Property_Get + * FT_Set_Default_Properties + * + * FT_New_Library + * FT_Done_Library + * FT_Reference_Library + * + * FT_Renderer + * FT_Renderer_Class + * + * FT_Get_Renderer + * FT_Set_Renderer + * + * FT_Set_Debug_Hook + * + */ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ +#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */ + /* produces LIGHT hints */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER +#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY + + + typedef FT_Pointer FT_Module_Interface; + + + /************************************************************************** + * + * @functype: + * FT_Module_Constructor + * + * @description: + * A function used to initialize (not create) a new module object. + * + * @input: + * module :: + * The module to initialize. + */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Destructor + * + * @description: + * A function used to finalize (not destroy) a given module object. + * + * @input: + * module :: + * The module to finalize. + */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Requester + * + * @description: + * A function used to query a given module for a specific interface. + * + * @input: + * module :: + * The module to be searched. + * + * name :: + * The name of the interface in the module. + */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /************************************************************************** + * + * @struct: + * FT_Module_Class + * + * @description: + * The module class descriptor. While being a public structure necessary + * for FreeType's module bookkeeping, most of the fields are essentially + * internal, not to be used directly by an application. + * + * @fields: + * module_flags :: + * Bit flags describing the module. + * + * module_size :: + * The size of one module object/instance in bytes. + * + * module_name :: + * The name of the module. + * + * module_version :: + * The version, as a 16.16 fixed number (major.minor). + * + * module_requires :: + * The version of FreeType this module requires, as a 16.16 fixed + * number (major.minor). Starts at version 2.0, i.e., 0x20000. + * + * module_interface :: + * A typeless pointer to a structure (which varies between different + * modules) that holds the module's interface functions. This is + * essentially what `get_interface` returns. + * + * module_init :: + * The initializing function. + * + * module_done :: + * The finalizing function. + * + * get_interface :: + * The interface requesting function. + */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /************************************************************************** + * + * @function: + * FT_Add_Module + * + * @description: + * Add a new module to a given library instance. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * clazz :: + * A pointer to class descriptor for the module. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /************************************************************************** + * + * @function: + * FT_Get_Module + * + * @description: + * Find a module by its name. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module handle. 0~if none was found. + * + * @note: + * FreeType's internal modules aren't documented very well, and you + * should look up the source code for details. + */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /************************************************************************** + * + * @function: + * FT_Remove_Module + * + * @description: + * Remove a given module from a library instance. + * + * @inout: + * library :: + * A handle to a library object. + * + * @input: + * module :: + * A handle to a module object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The module object is destroyed by the function in case of success. + */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /************************************************************************** + * + * @function: + * FT_Property_Set + * + * @description: + * Set a property for a given module. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * Note that only a few modules have properties. + * + * value :: + * A generic pointer to a variable or structure that gives the new + * value of the property. The exact definition of `value` is + * dependent on the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example sets property 'bar' (a simple integer) in + * module 'foo' to value~1. + * + * ``` + * FT_UInt bar; + * + * + * bar = 1; + * FT_Property_Set( library, "foo", "bar", &bar ); + * ``` + * + * Note that the FreeType Cache sub-system doesn't recognize module + * property changes. To avoid glyph lookup confusion within the cache + * you should call @FTC_Manager_Reset to completely flush the cache if a + * module property gets changed after @FTC_Manager_New has been called. + * + * It is not possible to set properties of the FreeType Cache sub-system + * itself with FT_Property_Set; use @FTC_Property_Set instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ); + + + /************************************************************************** + * + * @function: + * FT_Property_Get + * + * @description: + * Get a module's property value. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * @inout: + * value :: + * A generic pointer to a variable or structure that gives the value + * of the property. The exact definition of `value` is dependent on + * the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example gets property 'baz' (a range) in module 'foo'. + * + * ``` + * typedef range_ + * { + * FT_Int32 min; + * FT_Int32 max; + * + * } range; + * + * range baz; + * + * + * FT_Property_Get( library, "foo", "baz", &baz ); + * ``` + * + * It is not possible to retrieve properties of the FreeType Cache + * sub-system with FT_Property_Get; use @FTC_Property_Get instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Properties + * + * @description: + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + * + * If the compilation option is not set, this function does nothing. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 \ + * autofitter:warping=1 + * ``` + * + * @inout: + * library :: + * A handle to a new library object. + * + * @since: + * 2.8 + */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Library + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Library structure + * is created. This function increments the counter. @FT_Done_Library + * then only destroys a library if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Library objects. + * + * @input: + * library :: + * A handle to a target library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_New_Library + * + * @description: + * This function is used to create a new FreeType library instance from a + * given memory object. It is thus possible to use libraries with + * distinct memory allocators within the same program. Note, however, + * that the used @FT_Memory structure is expected to remain valid for the + * life of the @FT_Library object. + * + * Normally, you would call this function (followed by a call to + * @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a + * call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to + * initialize the FreeType library. + * + * Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library + * instance. + * + * @input: + * memory :: + * A handle to the original memory object. + * + * @output: + * alibrary :: + * A pointer to handle of a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_Library + * + * @description: + * Discard a given library object. This closes all drivers and discards + * all resource objects. + * + * @input: + * library :: + * A handle to the target library. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + + + /************************************************************************** + * + * @functype: + * FT_DebugHook_Func + * + * @description: + * A drop-in replacement (or rather a wrapper) for the bytecode or + * charstring interpreter's main loop function. + * + * Its job is essentially + * + * - to activate debug mode to enforce single-stepping, + * + * - to call the main loop function to interpret the next opcode, and + * + * - to show the changed context to the user. + * + * An example for such a main loop function is `TT_RunIns` (declared in + * FreeType's internal header file `src/truetype/ttinterp.h`). + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of a drop-in replacement. + * + * @inout: + * arg :: + * A typeless pointer, to be cast to the main loop function's data + * structure (which depends on the font module). For TrueType fonts + * it is bytecode interpreter's execution context, `TT_ExecContext`, + * which is declared in FreeType's internal header file `tttypes.h`. + */ + typedef FT_Error + (*FT_DebugHook_Func)( void* arg ); + + + /************************************************************************** + * + * @enum: + * FT_DEBUG_HOOK_XXX + * + * @description: + * A list of named debug hook indices. + * + * @values: + * FT_DEBUG_HOOK_TRUETYPE:: + * This hook index identifies the TrueType bytecode debugger. + */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /************************************************************************** + * + * @function: + * FT_Set_Debug_Hook + * + * @description: + * Set a debug hook function for debugging the interpreter of a font + * format. + * + * While this is a public API function, an application needs access to + * FreeType's internal header files to do something useful. + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of its usage. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * hook_index :: + * The index of the debug hook. You should use defined enumeration + * macros like @FT_DEBUG_HOOK_TRUETYPE. + * + * debug_hook :: + * The function used to debug the interpreter. + * + * @note: + * Currently, four debug hook slots are available, but only one (for the + * TrueType interpreter) is defined. + */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /************************************************************************** + * + * @function: + * FT_Add_Default_Modules + * + * @description: + * Add the set of default drivers to a given library object. This is + * only useful when you create a library object with @FT_New_Library + * (usually to plug a custom memory manager). + * + * @inout: + * library :: + * A handle to a new library object. + */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode engine is + * implemented in a given FT_Library instance. It is used by the + * @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * Deprecated and removed. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers the full + * instruction set of the TrueType virtual machine (this was governed + * by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @function: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of the + * TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMODAPI_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftmoderr.h b/deps/freetype/include/freetype/ftmoderr.h new file mode 100644 index 00000000..e1699357 --- /dev/null +++ b/deps/freetype/include/freetype/ftmoderr.h @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * ftmoderr.h + * + * FreeType module error offsets (specification). + * + * Copyright (C) 2001-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the FreeType module error codes. + * + * If the macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` in `ftoption.h` is + * set, the lower byte of an error value identifies the error code as + * usual. In addition, the higher byte identifies the module. For + * example, the error `FT_Err_Invalid_File_Format` has value 0x0003, the + * error `TT_Err_Invalid_File_Format` has value 0x1303, the error + * `T1_Err_Invalid_File_Format` has value 0x1403, etc. + * + * Note that `FT_Err_Ok`, `TT_Err_Ok`, etc. are always equal to zero, + * including the high byte. + * + * If `FT_CONFIG_OPTION_USE_MODULE_ERRORS` isn't set, the higher byte of an + * error value is set to zero. + * + * To hide the various `XXX_Err_` prefixes in the source code, FreeType + * provides some macros in `fttypes.h`. + * + * FT_ERR( err ) + * + * Add current error module prefix (as defined with the `FT_ERR_PREFIX` + * macro) to `err`. For example, in the BDF module the line + * + * ``` + * error = FT_ERR( Invalid_Outline ); + * ``` + * + * expands to + * + * ``` + * error = BDF_Err_Invalid_Outline; + * ``` + * + * For simplicity, you can always use `FT_Err_Ok` directly instead of + * `FT_ERR( Ok )`. + * + * FT_ERR_EQ( errcode, err ) + * FT_ERR_NEQ( errcode, err ) + * + * Compare error code `errcode` with the error `err` for equality and + * inequality, respectively. Example: + * + * ``` + * if ( FT_ERR_EQ( error, Invalid_Outline ) ) + * ... + * ``` + * + * Using this macro you don't have to think about error prefixes. Of + * course, if module errors are not active, the above example is the + * same as + * + * ``` + * if ( error == FT_Err_Invalid_Outline ) + * ... + * ``` + * + * FT_ERROR_BASE( errcode ) + * FT_ERROR_MODULE( errcode ) + * + * Get base error and module error code, respectively. + * + * It can also be used to create a module error message table easily with + * something like + * + * ``` + * #undef FTMODERR_H_ + * #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, + * #define FT_MODERR_START_LIST { + * #define FT_MODERR_END_LIST { 0, 0 } }; + * + * const struct + * { + * int mod_err_offset; + * const char* mod_err_msg + * } ft_mod_errors[] = + * + * #include FT_MODULE_ERRORS_H + * ``` + * + */ + + +#ifndef FTMODERR_H_ +#define FTMODERR_H_ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" ) + FT_MODERRDEF( Cache, 0x400, "cache module" ) + FT_MODERRDEF( CFF, 0x500, "CFF module" ) + FT_MODERRDEF( CID, 0x600, "CID module" ) + FT_MODERRDEF( Gzip, 0x700, "Gzip module" ) + FT_MODERRDEF( LZW, 0x800, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0xA00, "PCF module" ) + FT_MODERRDEF( PFR, 0xB00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xE00, "PS names module" ) + FT_MODERRDEF( Raster, 0xF00, "raster module" ) + FT_MODERRDEF( SFNT, 0x1000, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1200, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1300, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1400, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" ) + FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* FTMODERR_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftotval.h b/deps/freetype/include/freetype/ftotval.h new file mode 100644 index 00000000..c034f489 --- /dev/null +++ b/deps/freetype/include/freetype/ftotval.h @@ -0,0 +1,207 @@ +/**************************************************************************** + * + * ftotval.h + * + * FreeType API for validating OpenType tables (specification). + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * + * Warning: This module might be moved to a different library in the + * future to avoid a tight dependency between FreeType and the + * OpenType specification. + * + * + */ + + +#ifndef FTOTVAL_H_ +#define FTOTVAL_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * ot_validation + * + * @title: + * OpenType Validation + * + * @abstract: + * An API to validate OpenType tables. + * + * @description: + * This section contains the declaration of functions to validate some + * OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + * @order: + * FT_OpenType_Validate + * FT_OpenType_Free + * + * FT_VALIDATE_OTXXX + * + */ + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT ( FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH ) + + + /************************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A `NULL` value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + + /************************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOTVAL_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftoutln.h b/deps/freetype/include/freetype/ftoutln.h new file mode 100644 index 00000000..b72327b7 --- /dev/null +++ b/deps/freetype/include/freetype/ftoutln.h @@ -0,0 +1,593 @@ +/**************************************************************************** + * + * ftoutln.h + * + * Support for the FT_Outline type used to store glyph shapes of + * most scalable font formats (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOUTLN_H_ +#define FTOUTLN_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + * @title: + * Outline Processing + * + * @abstract: + * Functions to create, transform, and render vectorial glyph images. + * + * @description: + * This section contains routines used to create and destroy scalable + * glyph images known as 'outlines'. These can also be measured, + * transformed, and converted into bitmaps and pixmaps. + * + * @order: + * FT_Outline + * FT_Outline_New + * FT_Outline_Done + * FT_Outline_Copy + * FT_Outline_Translate + * FT_Outline_Transform + * FT_Outline_Embolden + * FT_Outline_EmboldenXY + * FT_Outline_Reverse + * FT_Outline_Check + * + * FT_Outline_Get_CBox + * FT_Outline_Get_BBox + * + * FT_Outline_Get_Bitmap + * FT_Outline_Render + * FT_Outline_Decompose + * FT_Outline_Funcs + * FT_Outline_MoveToFunc + * FT_Outline_LineToFunc + * FT_Outline_ConicToFunc + * FT_Outline_CubicToFunc + * + * FT_Orientation + * FT_Outline_Get_Orientation + * + * FT_OUTLINE_XXX + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Decompose + * + * @description: + * Walk over an outline's structure to decompose it into individual + * segments and Bezier arcs. This function also emits 'move to' + * operations to indicate the start of new contours in the outline. + * + * @input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of 'emitters', i.e., function pointers called during + * decomposition to indicate path operations. + * + * @inout: + * user :: + * A typeless pointer that is passed to each emitter during the + * decomposition. It can be used to store the state during the + * decomposition. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * A contour that contains a single point only is represented by a 'move + * to' operation followed by 'line to' to the same point. In most cases, + * it is best to filter this out before using the outline for stroking + * purposes (otherwise it would result in a visible dot when round caps + * are used). + * + * Similarly, the function returns success for an empty outline also + * (doing nothing, this is, not calling any emitter); if necessary, you + * should filter this out, too. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_Outline_New + * + * @description: + * Create a new outline of a given size. + * + * @input: + * library :: + * A handle to the library object from where the outline is allocated. + * Note however that the new outline will **not** necessarily be + * **freed**, when destroying the library, by @FT_Done_FreeType. + * + * numPoints :: + * The maximum number of points within the outline. Must be smaller + * than or equal to 0xFFFF (65535). + * + * numContours :: + * The maximum number of contours within the outline. This value must + * be in the range 0 to `numPoints`. + * + * @output: + * anoutline :: + * A handle to the new outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The reason why this function takes a `library` parameter is simply to + * use the library's memory allocator. + */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Done + * + * @description: + * Destroy an outline created with @FT_Outline_New. + * + * @input: + * library :: + * A handle of the library object used to allocate the outline. + * + * outline :: + * A pointer to the outline object to be discarded. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the outline's 'owner' field is not set, only the outline descriptor + * will be released. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Check + * + * @description: + * Check the contents of an outline descriptor. + * + * @input: + * outline :: + * A handle to a source outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An empty outline, or an outline with a single point only is also + * valid. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_CBox + * + * @description: + * Return an outline's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * outline :: + * A pointer to the source outline descriptor. + * + * @output: + * acbox :: + * The outline's control box. + * + * @note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Translate + * + * @description: + * Apply a simple translation to the points of an outline. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * xOffset :: + * The horizontal offset. + * + * yOffset :: + * The vertical offset. + */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Copy + * + * @description: + * Copy an outline into another one. Both objects must have the same + * sizes (number of points & number of contours) when this function is + * called. + * + * @input: + * source :: + * A handle to the source outline. + * + * @output: + * target :: + * A handle to the target outline. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Transform + * + * @description: + * Apply a simple 2x2 matrix to all of an outline's points. Useful for + * applying rotations, slanting, flipping, etc. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * matrix :: + * A pointer to the transformation matrix. + * + * @note: + * You can use @FT_Outline_Translate if you need to translate the + * outline's points. + */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Embolden + * + * @description: + * Embolden an outline. The new outline will be at most 4~times + * `strength` pixels wider and higher. You may think of the left and + * bottom borders as unchanged. + * + * Negative `strength` values to reduce the outline thickness are + * possible also. + * + * @inout: + * outline :: + * A handle to the target outline. + * + * @input: + * strength :: + * How strong the glyph is emboldened. Expressed in 26.6 pixel format. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The used algorithm to increase or decrease the thickness of the glyph + * doesn't change the number of points; this means that certain + * situations like acute angles or intersections are sometimes handled + * incorrectly. + * + * If you need 'better' metrics values you should call + * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. + * + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. + * + * @example: + * ``` + * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + * + * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + * FT_Outline_Embolden( &face->glyph->outline, strength ); + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_EmboldenXY + * + * @description: + * Embolden an outline. The new outline will be `xstrength` pixels wider + * and `ystrength` pixels higher. Otherwise, it is similar to + * @FT_Outline_Embolden, which uses the same strength in both directions. + * + * @since: + * 2.4.10 + */ + FT_EXPORT( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Reverse + * + * @description: + * Reverse the drawing direction of an outline. This is used to ensure + * consistent fill conventions for mirrored glyphs. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @note: + * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the + * outline's `flags` field. + * + * It shouldn't be used by a normal client application, unless it knows + * what it is doing. + */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Bitmap + * + * @description: + * Render an outline within a bitmap. The outline's image is simply + * OR-ed to the target bitmap. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * abitmap :: + * A pointer to the target bitmap descriptor. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does **not create** the bitmap, it only renders an + * outline image within the one you pass to it! Consequently, the + * various fields in `abitmap` should be set accordingly. + * + * It will use the raster corresponding to the default glyph format. + * + * The value of the `num_grays` field in `abitmap` is ignored. If you + * select the gray-level rasterizer, and you want less than 256 gray + * levels, you have to use @FT_Outline_Render directly. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Render + * + * @description: + * Render an outline within a bitmap using the current scan-convert. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * params :: + * A pointer to an @FT_Raster_Params structure used to describe the + * rendering operation. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This advanced function uses @FT_Raster_Params as an argument, + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. You should know how to set up @FT_Raster_Params + * for this function to work. + * + * The field `params.source` will be set to `outline` before the scan + * converter is called, which means that the value you give to it is + * actually ignored. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * less gray levels, you have to provide your own span callback. See the + * @FT_RASTER_FLAG_DIRECT value of the `flags` field in the + * @FT_Raster_Params structure for more details. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must be + * filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise + * contours must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its fill + * orientation (see @FT_Orientation). This is done by integrating the + * total area covered by the outline. The positive integral corresponds + * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is + * returned. The negative integral corresponds to the counter-clockwise + * orientation and @FT_ORIENTATION_TRUETYPE is returned. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOUTLN_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/ftparams.h b/deps/freetype/include/freetype/ftparams.h new file mode 100644 index 00000000..c374ee2f --- /dev/null +++ b/deps/freetype/include/freetype/ftparams.h @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftparams.h + * + * FreeType API for possible FT_Parameter tags (specification only). + * + * Copyright (C) 2017-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPARAMS_H_ +#define FTPARAMS_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * parameter_tags + * + * @title: + * Parameter Tags + * + * @abstract: + * Macros for driver property and font loading parameter tags. + * + * @description: + * This section contains macros for the @FT_Parameter structure that are + * used with various functions to activate some special functionality or + * different behaviour of various components of FreeType. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * family names in the 'name' table (introduced in OpenType version 1.4). + * Use this for backward compatibility with legacy systems that have a + * four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * subfamily names in the 'name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * An @FT_Parameter tag to be used with @FT_Open_Face to indicate + * incremental glyph loading. + * + */ +#define FT_PARAM_TAG_INCREMENTAL \ + FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_LCD_FILTER_WEIGHTS + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding argument specifies the five LCD filter weights for a + * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the + * global default values or the values set up with + * @FT_Library_SetLcdFilterWeights. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \ + FT_MAKE_TAG( 'l', 'c', 'd', 'f' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_RANDOM_SEED + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding 32bit signed integer argument overrides the font + * driver's random seed value with a face-specific one; see @random-seed. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_RANDOM_SEED \ + FT_MAKE_TAG( 's', 'e', 'e', 'd' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_STEM_DARKENING + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding Boolean argument specifies whether to apply stem + * darkening, overriding the global default values or the values set up + * with @FT_Property_Set (see @no-stem-darkening). + * + * This is a passive setting that only takes effect if the font driver or + * autohinter honors it, which the CFF, Type~1, and CID drivers always + * do, but the autohinter only in 'light' hinting mode (as of version + * 2.9). + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_STEM_DARKENING \ + FT_MAKE_TAG( 'd', 'a', 'r', 'k' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * Deprecated, no effect. + * + * Previously: A constant used as the tag of an @FT_Parameter structure + * to indicate that unpatented methods only should be used by the + * TrueType bytecode interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING \ + FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + + /* */ + + +FT_END_HEADER + + +#endif /* FTPARAMS_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftpfr.h b/deps/freetype/include/freetype/ftpfr.h new file mode 100644 index 00000000..b4eca76e --- /dev/null +++ b/deps/freetype/include/freetype/ftpfr.h @@ -0,0 +1,180 @@ +/**************************************************************************** + * + * ftpfr.h + * + * FreeType API for accessing PFR-specific data (specification only). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPFR_H_ +#define FTPFR_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * pfr_fonts + * + * @title: + * PFR Fonts + * + * @abstract: + * PFR/TrueDoc-specific API. + * + * @description: + * This section contains the declaration of PFR-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: + * Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed in + * metrics units to device subpixels. This is equivalent to + * `face->size->x_scale`, but for metrics only. Optional (parameter + * can be `NULL`). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale` but for the vertical direction. + * optional (parameter can be `NULL`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: + * A handle to the input face. + * + * left :: + * Index of the left glyph. + * + * right :: + * Index of the right glyph. + * + * @output: + * avector :: + * A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics units. + * This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED mode, + * which always returns distances converted to outline units. + * + * You can use the value of the `x_scale` and `y_scale` parameters + * returned by @FT_Get_PFR_Metrics to scale these to device subpixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: + * A handle to the input face. + * + * gindex :: + * The glyph index. + * + * @output: + * aadvance :: + * The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale` or `y_scale` results of @FT_Get_PFR_Metrics + * to convert the advance to device subpixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* FTPFR_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftrender.h b/deps/freetype/include/freetype/ftrender.h new file mode 100644 index 00000000..a01c7742 --- /dev/null +++ b/deps/freetype/include/freetype/ftrender.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * ftrender.h + * + * FreeType renderer modules public interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTRENDER_H_ +#define FTRENDER_H_ + + +#include +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /************************************************************************** + * + * @struct: + * FT_Renderer_Class + * + * @description: + * The renderer module class descriptor. + * + * @fields: + * root :: + * The root @FT_Module_Class fields. + * + * glyph_format :: + * The glyph image format this renderer handles. + * + * render_glyph :: + * A method used to render the image that is in a given glyph slot into + * a bitmap. + * + * transform_glyph :: + * A method used to transform the image that is in a given glyph slot. + * + * get_glyph_cbox :: + * A method used to access the glyph's cbox. + * + * set_mode :: + * A method used to pass additional parameters. + * + * raster_class :: + * For @FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to + * its raster's class. + */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /************************************************************************** + * + * @function: + * FT_Get_Renderer + * + * @description: + * Retrieve the current renderer for a given glyph format. + * + * @input: + * library :: + * A handle to the library object. + * + * format :: + * The glyph format. + * + * @return: + * A renderer handle. 0~if none found. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + * + * To add a new renderer, simply use @FT_Add_Module. To retrieve a + * renderer by its name, use @FT_Get_Module. + */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /************************************************************************** + * + * @function: + * FT_Set_Renderer + * + * @description: + * Set the current renderer to use, and set additional mode. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * renderer :: + * A handle to the renderer object. + * + * num_params :: + * The number of additional parameters. + * + * parameters :: + * Additional parameters. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case of success, the renderer will be used to convert glyph images + * in the renderer's known format into bitmaps. + * + * This doesn't change the current renderer for other formats. + * + * Currently, no FreeType renderer module uses `parameters`; you should + * thus always pass `NULL` as the value. + */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + /* */ + + +FT_END_HEADER + +#endif /* FTRENDER_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftsizes.h b/deps/freetype/include/freetype/ftsizes.h new file mode 100644 index 00000000..6c63cef2 --- /dev/null +++ b/deps/freetype/include/freetype/ftsizes.h @@ -0,0 +1,160 @@ +/**************************************************************************** + * + * ftsizes.h + * + * FreeType size objects management (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * Typical application would normally not need to use these functions. + * However, they have been placed in a public API for the rare cases where + * they are needed. + * + */ + + +#ifndef FTSIZES_H_ +#define FTSIZES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sizes_management + * + * @title: + * Size Management + * + * @abstract: + * Managing multiple sizes per face. + * + * @description: + * When creating a new face object (e.g., with @FT_New_Face), an @FT_Size + * object is automatically created and used to store all pixel-size + * dependent information, available in the `face->size` field. + * + * It is however possible to create more sizes for a given face, mostly + * in order to manage several character pixel sizes of the same font + * family and style. See @FT_New_Size and @FT_Done_Size. + * + * Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only modify the + * contents of the current 'active' size; you thus need to use + * @FT_Activate_Size to change it. + * + * 99% of applications won't need the functions provided here, especially + * if they use the caching sub-system, so be cautious when using these. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Size + * + * @description: + * Create a new size object from a given face object. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * asize :: + * A handle to a new size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You need to call @FT_Activate_Size in order to select the new size for + * upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, + * @FT_Load_Glyph, @FT_Load_Char, etc. + */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /************************************************************************** + * + * @function: + * FT_Done_Size + * + * @description: + * Discard a given size object. Note that @FT_Done_Face automatically + * discards all size objects allocated with @FT_New_Size. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /************************************************************************** + * + * @function: + * FT_Activate_Size + * + * @description: + * Even though it is possible to create several size objects for a given + * face (see @FT_New_Size for details), functions like @FT_Load_Glyph or + * @FT_Load_Char only use the one that has been activated last to + * determine the 'current character pixel size'. + * + * This function can be used to 'activate' a previously created size + * object. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `face` is the size's parent face object, this function changes the + * value of `face->size` to the input size handle. + */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSIZES_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftsnames.h b/deps/freetype/include/freetype/ftsnames.h new file mode 100644 index 00000000..4d43602a --- /dev/null +++ b/deps/freetype/include/freetype/ftsnames.h @@ -0,0 +1,273 @@ +/**************************************************************************** + * + * ftsnames.h + * + * Simple interface to access SFNT 'name' tables (which are used + * to hold font names, copyright info, notices, etc.) (specification). + * + * This is _not_ used to retrieve glyph names! + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSNAMES_H_ +#define FTSNAMES_H_ + + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sfnt_names + * + * @title: + * SFNT Names + * + * @abstract: + * Access the names embedded in TrueType and OpenType files. + * + * @description: + * The TrueType and OpenType specifications allow the inclusion of a + * special names table ('name') in font files. This table contains + * textual (and internationalized) information regarding the font, like + * family name, copyright, version, etc. + * + * The definitions below are used to access them if available. + * + * Note that this has nothing to do with glyph names! + * + */ + + + /************************************************************************** + * + * @struct: + * FT_SfntName + * + * @description: + * A structure used to model an SFNT 'name' table entry. + * + * @fields: + * platform_id :: + * The platform ID for `string`. See @TT_PLATFORM_XXX for possible + * values. + * + * encoding_id :: + * The encoding ID for `string`. See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, + * @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX for possible + * values. + * + * language_id :: + * The language ID for `string`. See @TT_MAC_LANGID_XXX and + * @TT_MS_LANGID_XXX for possible values. + * + * Registered OpenType values for `language_id` are always smaller than + * 0x8000; values equal or larger than 0x8000 usually indicate a + * language tag string (introduced in OpenType version 1.6). Use + * function @FT_Get_Sfnt_LangTag with `language_id` as its argument to + * retrieve the associated language tag. + * + * name_id :: + * An identifier for `string`. See @TT_NAME_ID_XXX for possible + * values. + * + * string :: + * The 'name' string. Note that its format differs depending on the + * (platform,encoding) pair, being either a string of bytes (without a + * terminating `NULL` byte) or containing UTF-16BE entities. + * + * string_len :: + * The length of `string` in bytes. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name_Count + * + * @description: + * Retrieve the number of name strings in the SFNT 'name' table. + * + * @input: + * face :: + * A handle to the source face. + * + * @return: + * The number of strings in the 'name' table. + * + * @note: + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name + * + * @description: + * Retrieve a string of the SFNT 'name' table for a given index. + * + * @input: + * face :: + * A handle to the source face. + * + * idx :: + * The index of the 'name' string. + * + * @output: + * aname :: + * The indexed @FT_SfntName structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `aname` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Use @FT_Get_Sfnt_Name_Count to get the total number of available + * 'name' table entries, then do a loop until you get the right platform, + * encoding, and name ID. + * + * 'name' table format~1 entries can use language tags also, see + * @FT_Get_Sfnt_LangTag. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /************************************************************************** + * + * @struct: + * FT_SfntLangTag + * + * @description: + * A structure to model a language tag entry from an SFNT 'name' table. + * + * @fields: + * string :: + * The language tag string, encoded in UTF-16BE (without trailing + * `NULL` bytes). + * + * string_len :: + * The length of `string` in **bytes**. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + * + * @since: + * 2.8 + */ + typedef struct FT_SfntLangTag_ + { + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntLangTag; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_LangTag + * + * @description: + * Retrieve the language tag associated with a language ID of an SFNT + * 'name' table entry. + * + * @input: + * face :: + * A handle to the source face. + * + * langID :: + * The language ID, as returned by @FT_Get_Sfnt_Name. This is always a + * value larger than 0x8000. + * + * @output: + * alangTag :: + * The language tag associated with the 'name' table entry's language + * ID. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `alangTag` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Only 'name' table format~1 supports language tags. For format~0 + * tables, this function always returns FT_Err_Invalid_Table. For + * invalid format~1 language ID values, FT_Err_Invalid_Argument is + * returned. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + * + * @since: + * 2.8 + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTSNAMES_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftstroke.h b/deps/freetype/include/freetype/ftstroke.h new file mode 100644 index 00000000..01a9c181 --- /dev/null +++ b/deps/freetype/include/freetype/ftstroke.h @@ -0,0 +1,772 @@ +/**************************************************************************** + * + * ftstroke.h + * + * FreeType path stroker (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSTROKE_H_ +#define FTSTROKE_H_ + +#include +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial glyph. + * It also allows you to retrieve the 'outside' and/or the 'inside' + * borders of the stroke. + * + * This can be useful to generate 'bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + * + * @order: + * FT_Stroker + * + * FT_Stroker_LineJoin + * FT_Stroker_LineCap + * FT_StrokerBorder + * + * FT_Outline_GetInsideBorder + * FT_Outline_GetOutsideBorder + * + * FT_Glyph_Stroke + * FT_Glyph_StrokeBorder + * + * FT_Stroker_New + * FT_Stroker_Set + * FT_Stroker_Rewind + * FT_Stroker_ParseOutline + * FT_Stroker_Done + * + * FT_Stroker_BeginSubPath + * FT_Stroker_EndSubPath + * + * FT_Stroker_LineTo + * FT_Stroker_ConicTo + * FT_Stroker_CubicTo + * + * FT_Stroker_GetBorderCounts + * FT_Stroker_ExportBorder + * FT_Stroker_GetCounts + * FT_Stroker_Export + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handle to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered in a + * stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used to join + * two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins. The outer corner of the joined + * lines is filled by enclosing the triangular region of the corner + * with a straight line between the outer corners of each stroke. + * + * FT_STROKER_LINEJOIN_MITER_FIXED :: + * Used to render mitered line joins, with fixed bevels if the miter + * limit is exceeded. The outer edges of the strokes for the two + * segments are extended until they meet at an angle. If the segments + * meet at too sharp an angle (such that the miter would extend from + * the intersection of the segments a distance greater than the product + * of the miter limit value and the border radius), then a bevel join + * (see above) is used instead. This prevents long spikes being + * created. `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line + * join as used in PostScript and PDF. + * + * FT_STROKER_LINEJOIN_MITER_VARIABLE :: + * FT_STROKER_LINEJOIN_MITER :: + * Used to render mitered line joins, with variable bevels if the miter + * limit is exceeded. The intersection of the strokes is clipped at a + * line perpendicular to the bisector of the angle between the strokes, + * at the distance from the intersection of the segments equal to the + * product of the miter limit value and the border radius. This + * prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` generates a mitered line join + * as used in XPS. `FT_STROKER_LINEJOIN_MITER` is an alias for + * `FT_STROKER_LINEJOIN_MITER_VARIABLE`, retained for backward + * compatibility. + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL = 1, + FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, + FT_STROKER_LINEJOIN_MITER_FIXED = 3 + + } FT_Stroker_LineJoin; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are rendered in + * a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last point + * itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border in + * @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the 'inside' and 'outside' + * borders. However, there is no direct mapping between these and the + * 'left' and 'right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'inside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'outside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the `FT_STROKER_LINEJOIN_MITER_FIXED` and + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` line join styles, expressed as + * 16.16 fixed-point value. + * + * @note: + * The radius is expressed in the same units as the outline coordinates. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. You should + * call this function before beginning a new series of calls to + * @FT_Stroker_BeginSubPath or @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with the stroker. + * The resulting outline(s) can be retrieved later by functions like + * @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead of + * a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened` is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct 'border' outlines. + * + * If `opened` is~1, the outline is processed as an open path, and the + * stroker generates a single 'stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is not + * stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. If the + * subpath was not 'opened', this function 'draws' a single line segment + * to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * 'Draw' a single line segment in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * 'Draw' a single quadratic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * 'Draw' a single cubic Bezier in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to second Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export one of the 'border' or 'stroke' outlines generated by the + * stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to retrieve + * the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export the + * corresponding border to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to get + * sure that there is enough room in your @FT_Outline object to receive + * all new data. + * + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to retrieve + * all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export all points/borders from the stroked outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export all + * borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be `NULL`. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but only + * return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise the outside + * border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* FTSTROKE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/ftsynth.h b/deps/freetype/include/freetype/ftsynth.h new file mode 100644 index 00000000..8754f97c --- /dev/null +++ b/deps/freetype/include/freetype/ftsynth.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * ftsynth.h + * + * FreeType synthesizing code for emboldening and slanting + * (specification). + * + * Copyright (C) 2000-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* 'standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource that should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef FTSYNTH_H_ +#define FTSYNTH_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a 'reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the height, width, and advance metrics are */ + /* increased by the strength of the emboldening -- this even affects */ + /* mono-width fonts! */ + /* */ + /* You can also call @FT_Outline_Get_CBox to get precise values. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSYNTH_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftsystem.h b/deps/freetype/include/freetype/ftsystem.h new file mode 100644 index 00000000..889a6ba1 --- /dev/null +++ b/deps/freetype/include/freetype/ftsystem.h @@ -0,0 +1,353 @@ +/**************************************************************************** + * + * ftsystem.h + * + * FreeType low-level system interface definition (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSYSTEM_H_ +#define FTSYSTEM_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * system_interface + * + * @title: + * System Interface + * + * @abstract: + * How FreeType manages memory and i/o. + * + * @description: + * This section contains various definitions related to memory management + * and i/o access. You need to understand this information if you want to + * use a custom memory manager or you own i/o streams. + * + */ + + + /************************************************************************** + * + * M E M O R Y M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************** + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size` bytes from `memory`. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************** + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************** + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************** + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /************************************************************************** + * + * I / O M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + * @also: + * See @FT_StreamRec for the publicly accessible fields of a given stream + * object. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************** + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*` in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************** + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation with + * a `count` of~0. A non-zero return value then indicates an error. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************** + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************** + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to `NULL` for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * In case of compressed streams where the size is unknown before + * actually doing the decompression, the value is set to 0x7FFFFFFF. + * (Note that this size value can occur for normal streams also; it is + * thus just a hint.) + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*` + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set internally + * by FreeType and shouldn't be touched by stream implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. In particular, the `FT_GET_XXX` macros use this instead of + * the `pos` field. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + /* */ + + +FT_END_HEADER + +#endif /* FTSYSTEM_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/fttrigon.h b/deps/freetype/include/freetype/fttrigon.h new file mode 100644 index 00000000..37e1412f --- /dev/null +++ b/deps/freetype/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * fttrigon.h + * + * FreeType trigonometric functions (specification). + * + * Copyright (C) 2001-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTRIGON_H_ +#define FTTRIGON_H_ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed-point value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************** + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in the 2d + * plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************** + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `angle2-angle1`. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x` will be `cos(angle)`, and the value of + * `vec.y` will be `sin(angle)`. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* FTTRIGON_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/fttypes.h b/deps/freetype/include/freetype/fttypes.h new file mode 100644 index 00000000..10571505 --- /dev/null +++ b/deps/freetype/include/freetype/fttypes.h @@ -0,0 +1,615 @@ +/**************************************************************************** + * + * fttypes.h + * + * FreeType simple types definitions (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTYPES_H_ +#define FTTYPES_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + * @title: + * Basic Data Types + * + * @abstract: + * The basic data types defined by the library. + * + * @description: + * This section contains the basic data types defined by FreeType~2, + * ranging from simple scalar types to bitmap descriptors. More + * font-specific structures are defined in a different section. + * + * @order: + * FT_Byte + * FT_Bytes + * FT_Char + * FT_Int + * FT_UInt + * FT_Int16 + * FT_UInt16 + * FT_Int32 + * FT_UInt32 + * FT_Int64 + * FT_UInt64 + * FT_Short + * FT_UShort + * FT_Long + * FT_ULong + * FT_Bool + * FT_Offset + * FT_PtrDist + * FT_String + * FT_Tag + * FT_Error + * FT_Fixed + * FT_Pointer + * FT_Pos + * FT_Vector + * FT_BBox + * FT_Matrix + * FT_FWord + * FT_UFWord + * FT_F2Dot14 + * FT_UnitVector + * FT_F26Dot6 + * FT_Data + * + * FT_MAKE_TAG + * + * FT_Generic + * FT_Generic_Finalizer + * + * FT_Bitmap + * FT_Pixel_Mode + * FT_Palette_Mode + * FT_Glyph_Format + * FT_IMAGE_TAG + * + */ + + + /************************************************************************** + * + * @type: + * FT_Bool + * + * @description: + * A typedef of unsigned char, used for simple booleans. As usual, + * values 1 and~0 represent true and false, respectively. + */ + typedef unsigned char FT_Bool; + + + /************************************************************************** + * + * @type: + * FT_FWord + * + * @description: + * A signed 16-bit integer used to store a distance in original font + * units. + */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /************************************************************************** + * + * @type: + * FT_UFWord + * + * @description: + * An unsigned 16-bit integer used to store a distance in original font + * units. + */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /************************************************************************** + * + * @type: + * FT_Char + * + * @description: + * A simple typedef for the _signed_ char type. + */ + typedef signed char FT_Char; + + + /************************************************************************** + * + * @type: + * FT_Byte + * + * @description: + * A simple typedef for the _unsigned_ char type. + */ + typedef unsigned char FT_Byte; + + + /************************************************************************** + * + * @type: + * FT_Bytes + * + * @description: + * A typedef for constant memory areas. + */ + typedef const FT_Byte* FT_Bytes; + + + /************************************************************************** + * + * @type: + * FT_Tag + * + * @description: + * A typedef for 32-bit tags (as used in the SFNT format). + */ + typedef FT_UInt32 FT_Tag; + + + /************************************************************************** + * + * @type: + * FT_String + * + * @description: + * A simple typedef for the char type, usually used for strings. + */ + typedef char FT_String; + + + /************************************************************************** + * + * @type: + * FT_Short + * + * @description: + * A typedef for signed short. + */ + typedef signed short FT_Short; + + + /************************************************************************** + * + * @type: + * FT_UShort + * + * @description: + * A typedef for unsigned short. + */ + typedef unsigned short FT_UShort; + + + /************************************************************************** + * + * @type: + * FT_Int + * + * @description: + * A typedef for the int type. + */ + typedef signed int FT_Int; + + + /************************************************************************** + * + * @type: + * FT_UInt + * + * @description: + * A typedef for the unsigned int type. + */ + typedef unsigned int FT_UInt; + + + /************************************************************************** + * + * @type: + * FT_Long + * + * @description: + * A typedef for signed long. + */ + typedef signed long FT_Long; + + + /************************************************************************** + * + * @type: + * FT_ULong + * + * @description: + * A typedef for unsigned long. + */ + typedef unsigned long FT_ULong; + + + /************************************************************************** + * + * @type: + * FT_F2Dot14 + * + * @description: + * A signed 2.14 fixed-point type used for unit vectors. + */ + typedef signed short FT_F2Dot14; + + + /************************************************************************** + * + * @type: + * FT_F26Dot6 + * + * @description: + * A signed 26.6 fixed-point type used for vectorial pixel coordinates. + */ + typedef signed long FT_F26Dot6; + + + /************************************************************************** + * + * @type: + * FT_Fixed + * + * @description: + * This type is used to store 16.16 fixed-point values, like scaling + * values or matrix coefficients. + */ + typedef signed long FT_Fixed; + + + /************************************************************************** + * + * @type: + * FT_Error + * + * @description: + * The FreeType error code type. A value of~0 is always interpreted as a + * successful operation. + */ + typedef int FT_Error; + + + /************************************************************************** + * + * @type: + * FT_Pointer + * + * @description: + * A simple typedef for a typeless pointer. + */ + typedef void* FT_Pointer; + + + /************************************************************************** + * + * @type: + * FT_Offset + * + * @description: + * This is equivalent to the ANSI~C `size_t` type, i.e., the largest + * _unsigned_ integer type used to express a file size or position, or a + * memory block size. + */ + typedef size_t FT_Offset; + + + /************************************************************************** + * + * @type: + * FT_PtrDist + * + * @description: + * This is equivalent to the ANSI~C `ptrdiff_t` type, i.e., the largest + * _signed_ integer type used to express the distance between two + * pointers. + */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /************************************************************************** + * + * @struct: + * FT_UnitVector + * + * @description: + * A simple structure used to store a 2D vector unit vector. Uses + * FT_F2Dot14 types. + * + * @fields: + * x :: + * Horizontal coordinate. + * + * y :: + * Vertical coordinate. + */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /************************************************************************** + * + * @struct: + * FT_Matrix + * + * @description: + * A simple structure used to store a 2x2 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is: + * + * ``` + * x' = x*xx + y*xy + * y' = x*yx + y*yy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /************************************************************************** + * + * @struct: + * FT_Data + * + * @description: + * Read-only binary data represented as a pointer and a length. + * + * @fields: + * pointer :: + * The data. + * + * length :: + * The length of the data in bytes. + */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /************************************************************************** + * + * @functype: + * FT_Generic_Finalizer + * + * @description: + * Describe a function used to destroy the 'client' data of any FreeType + * object. See the description of the @FT_Generic type for details of + * usage. + * + * @input: + * The address of the FreeType object that is under finalization. Its + * client data is accessed through its `generic` field. + */ + typedef void (*FT_Generic_Finalizer)( void* object ); + + + /************************************************************************** + * + * @struct: + * FT_Generic + * + * @description: + * Client applications often need to associate their own data to a + * variety of FreeType core objects. For example, a text layout API + * might want to associate a glyph cache to a given size object. + * + * Some FreeType object contains a `generic` field, of type `FT_Generic`, + * which usage is left to client applications and font servers. + * + * It can be used to store a pointer to client-specific data, as well as + * the address of a 'finalizer' function, which will be called by + * FreeType when the object is destroyed (for example, the previous + * client example would put the address of the glyph cache destructor in + * the `finalizer` field). + * + * @fields: + * data :: + * A typeless pointer to any client-specified data. This field is + * completely ignored by the FreeType library. + * + * finalizer :: + * A pointer to a 'generic finalizer' function, which will be called + * when the object is destroyed. If this field is set to `NULL`, no + * code will be called. + */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /************************************************************************** + * + * @macro: + * FT_MAKE_TAG + * + * @description: + * This macro converts four-letter tags that are used to label TrueType + * tables into an unsigned long, to be used within FreeType. + * + * @note: + * The produced values **must** be 32-bit integers. Don't redefine this + * macro. + */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * list_processing + * + */ + + + /************************************************************************** + * + * @type: + * FT_ListNode + * + * @description: + * Many elements and objects in FreeType are listed through an @FT_List + * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a + * handle to a single list element. + */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /************************************************************************** + * + * @type: + * FT_List + * + * @description: + * A handle to a list record (see @FT_ListRec). + */ + typedef struct FT_ListRec_* FT_List; + + + /************************************************************************** + * + * @struct: + * FT_ListNodeRec + * + * @description: + * A structure used to hold a single list element. + * + * @fields: + * prev :: + * The previous element in the list. `NULL` if first. + * + * next :: + * The next element in the list. `NULL` if last. + * + * data :: + * A typeless pointer to the listed object. + */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /************************************************************************** + * + * @struct: + * FT_ListRec + * + * @description: + * A structure used to hold a simple doubly-linked list. These are used + * in many parts of FreeType. + * + * @fields: + * head :: + * The head (first element) of doubly-linked list. + * + * tail :: + * The tail (last element) of doubly-linked list. + */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + /* */ + + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) +#define FT_BOOL( x ) ( (FT_Bool)( (x) != 0 ) ) + + /* concatenate C tokens */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* see `ftmoderr.h` for descriptions of the following macros */ + +#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_ERR_EQ( x, e ) \ + ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) +#define FT_ERR_NEQ( x, e ) \ + ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) + + +FT_END_HEADER + +#endif /* FTTYPES_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ftwinfnt.h b/deps/freetype/include/freetype/ftwinfnt.h new file mode 100644 index 00000000..a2fba903 --- /dev/null +++ b/deps/freetype/include/freetype/ftwinfnt.h @@ -0,0 +1,277 @@ +/**************************************************************************** + * + * ftwinfnt.h + * + * FreeType API for accessing Windows fnt-specific data. + * + * Copyright (C) 2003-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTWINFNT_H_ +#define FTWINFNT_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * winfnt_fonts + * + * @title: + * Window FNT Files + * + * @abstract: + * Windows FNT-specific API. + * + * @description: + * This section contains the declaration of Windows FNT-specific + * functions. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset` byte in @FT_WinFNT_HeaderRec. + * Exact mapping tables for the various 'cpXXXX' encodings (except for + * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public/' in the + * `MAPPINGS/VENDORS/MICSFT/WINDOWS` subdirectory. 'cp1361' is roughly a + * superset of `MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT`. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a 'don't + * care' value. Valid font files don't contain this value. When + * querying for information about the character set of the font that is + * currently selected into a specified device context, this return + * value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Poettgen : + * + * The 'Windows Font Mapping' article says that `FT_WinFNT_ID_OEM` is + * used for the charset of vector fonts, like `modern.fon`, + * `roman.fon`, and `script.fon` on Windows. + * + * The 'CreateFont' documentation says: The `FT_WinFNT_ID_OEM` value + * specifies a character set that is operating-system dependent. + * + * The 'IFIMETRICS' documentation from the 'Windows Driver Development + * Kit' says: This font supports an OEM-specific character set. The + * OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., 'cp1252'), denotes the + * second default codepage that most international versions of Windows + * have. It is one of the OEM codepages from + * + * https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers + * , + * + * and is used for the 'DOS boxes', to support legacy applications. A + * German Windows version for example usually uses ANSI codepage 1252 + * and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different ordering + * and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_HeaderRec + * + * @description: + * Windows FNT Header info. + */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_Header + * + * @description: + * A handle to an @FT_WinFNT_HeaderRec structure. + */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /************************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * aheader :: + * The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + /* */ + + +FT_END_HEADER + +#endif /* FTWINFNT_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/deps/freetype/include/freetype/t1tables.h b/deps/freetype/include/freetype/t1tables.h new file mode 100644 index 00000000..645e6457 --- /dev/null +++ b/deps/freetype/include/freetype/t1tables.h @@ -0,0 +1,774 @@ +/**************************************************************************** + * + * t1tables.h + * + * Basic Type 1/Type 2 tables definitions and interface (specification + * only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1TABLES_H_ +#define T1TABLES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * type1_tables + * + * @title: + * Type 1 Tables + * + * @abstract: + * Type~1-specific font tables. + * + * @description: + * This section contains the definition of Type~1-specific tables, + * including structures related to other PostScript font formats. + * + * @order: + * PS_FontInfoRec + * PS_FontInfo + * PS_PrivateRec + * PS_Private + * + * CID_FaceDictRec + * CID_FaceDict + * CID_FaceInfoRec + * CID_FaceInfo + * + * FT_Has_PS_Glyph_Names + * FT_Get_PS_Font_Info + * FT_Get_PS_Font_Private + * FT_Get_PS_Font_Value + * + * T1_Blend_Flags + * T1_EncodingType + * PS_Dict_Keys + * + */ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /************************************************************************** + * + * @struct: + * PS_FontInfoRec + * + * @description: + * A structure used to model a Type~1 or Type~2 FontInfo dictionary. + * Note that for Multiple Master fonts, each instance has its own + * FontInfo dictionary. + */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /************************************************************************** + * + * @struct: + * PS_FontInfo + * + * @description: + * A handle to a @PS_FontInfoRec structure. + */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /************************************************************************** + * + * @struct: + * T1_FontInfo + * + * @description: + * This type is equivalent to @PS_FontInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_FontInfoRec T1_FontInfo; + + + /************************************************************************** + * + * @struct: + * PS_PrivateRec + * + * @description: + * A structure used to model a Type~1 or Type~2 private dictionary. Note + * that for Multiple Master fonts, each instance has its own Private + * dictionary. + */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /************************************************************************** + * + * @struct: + * PS_Private + * + * @description: + * A handle to a @PS_PrivateRec structure. + */ + typedef struct PS_PrivateRec_* PS_Private; + + + /************************************************************************** + * + * @struct: + * T1_Private + * + * @description: + * This type is equivalent to @PS_PrivateRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_PrivateRec T1_Private; + + + /************************************************************************** + * + * @enum: + * T1_Blend_Flags + * + * @description: + * A set of flags used to indicate which fields are present in a given + * blend dictionary (font info or private). Used to support Multiple + * Masters fonts. + * + * @values: + * T1_BLEND_UNDERLINE_POSITION :: + * T1_BLEND_UNDERLINE_THICKNESS :: + * T1_BLEND_ITALIC_ANGLE :: + * T1_BLEND_BLUE_VALUES :: + * T1_BLEND_OTHER_BLUES :: + * T1_BLEND_STANDARD_WIDTH :: + * T1_BLEND_STANDARD_HEIGHT :: + * T1_BLEND_STEM_SNAP_WIDTHS :: + * T1_BLEND_STEM_SNAP_HEIGHTS :: + * T1_BLEND_BLUE_SCALE :: + * T1_BLEND_BLUE_SHIFT :: + * T1_BLEND_FAMILY_BLUES :: + * T1_BLEND_FAMILY_OTHER_BLUES :: + * T1_BLEND_FORCE_BOLD :: + */ + typedef enum T1_Blend_Flags_ + { + /* required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /* required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + T1_BLEND_MAX /* do not remove */ + + } T1_Blend_Flags; + + + /* these constants are deprecated; use the corresponding */ + /* `T1_Blend_Flags` values instead */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + /* */ + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backward compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backward compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /************************************************************************** + * + * @struct: + * CID_FaceDictRec + * + * @description: + * A structure used to represent data in a CID top-level dictionary. In + * most cases, they are part of the font's '/FDArray' array. Within a + * CID font file, such (internal) subfont dictionaries are enclosed by + * '%ADOBeginFontDict' and '%ADOEndFontDict' comments. + * + * Note that `CID_FaceDictRec` misses a field for the '/FontName' + * keyword, specifying the subfont's name (the top-level font name is + * given by the '/CIDFontName' keyword). This is an oversight, but it + * doesn't limit the 'cid' font module's functionality because FreeType + * neither needs this entry nor gives access to CID subfonts. + */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; /* this is a duplicate of */ + /* `private_dict->expansion_factor' */ + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceDict + * + * @description: + * A handle to a @CID_FaceDictRec structure. + */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + + /************************************************************************** + * + * @struct: + * CID_FontDict + * + * @description: + * This type is equivalent to @CID_FaceDictRec. It is deprecated but + * kept to maintain source compatibility between various versions of + * FreeType. + */ + typedef CID_FaceDictRec CID_FontDict; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfoRec + * + * @description: + * A structure used to represent CID Face information. + */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfo + * + * @description: + * A handle to a @CID_FaceInfoRec structure. + */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /************************************************************************** + * + * @struct: + * CID_Info + * + * @description: + * This type is equivalent to @CID_FaceInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************** + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph names. + * This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that + * certain fonts (mostly TrueType) contain incorrect glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * String pointers within the @PS_FontInfoRec structure are owned by the + * face and don't need to be freed by the caller. Missing entries in + * the font's FontInfo dictionary are represented by `NULL` pointers. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + + /************************************************************************** + * + * @enum: + * T1_EncodingType + * + * @description: + * An enumeration describing the 'Encoding' entry in a Type 1 dictionary. + * + * @values: + * T1_ENCODING_TYPE_NONE :: + * T1_ENCODING_TYPE_ARRAY :: + * T1_ENCODING_TYPE_STANDARD :: + * T1_ENCODING_TYPE_ISOLATIN1 :: + * T1_ENCODING_TYPE_EXPERT :: + * + * @since: + * 2.4.8 + */ + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /************************************************************************** + * + * @enum: + * PS_Dict_Keys + * + * @description: + * An enumeration used in calls to @FT_Get_PS_Font_Value to identify the + * Type~1 dictionary entry to retrieve. + * + * @values: + * PS_DICT_FONT_TYPE :: + * PS_DICT_FONT_MATRIX :: + * PS_DICT_FONT_BBOX :: + * PS_DICT_PAINT_TYPE :: + * PS_DICT_FONT_NAME :: + * PS_DICT_UNIQUE_ID :: + * PS_DICT_NUM_CHAR_STRINGS :: + * PS_DICT_CHAR_STRING_KEY :: + * PS_DICT_CHAR_STRING :: + * PS_DICT_ENCODING_TYPE :: + * PS_DICT_ENCODING_ENTRY :: + * PS_DICT_NUM_SUBRS :: + * PS_DICT_SUBR :: + * PS_DICT_STD_HW :: + * PS_DICT_STD_VW :: + * PS_DICT_NUM_BLUE_VALUES :: + * PS_DICT_BLUE_VALUE :: + * PS_DICT_BLUE_FUZZ :: + * PS_DICT_NUM_OTHER_BLUES :: + * PS_DICT_OTHER_BLUE :: + * PS_DICT_NUM_FAMILY_BLUES :: + * PS_DICT_FAMILY_BLUE :: + * PS_DICT_NUM_FAMILY_OTHER_BLUES :: + * PS_DICT_FAMILY_OTHER_BLUE :: + * PS_DICT_BLUE_SCALE :: + * PS_DICT_BLUE_SHIFT :: + * PS_DICT_NUM_STEM_SNAP_H :: + * PS_DICT_STEM_SNAP_H :: + * PS_DICT_NUM_STEM_SNAP_V :: + * PS_DICT_STEM_SNAP_V :: + * PS_DICT_FORCE_BOLD :: + * PS_DICT_RND_STEM_UP :: + * PS_DICT_MIN_FEATURE :: + * PS_DICT_LEN_IV :: + * PS_DICT_PASSWORD :: + * PS_DICT_LANGUAGE_GROUP :: + * PS_DICT_VERSION :: + * PS_DICT_NOTICE :: + * PS_DICT_FULL_NAME :: + * PS_DICT_FAMILY_NAME :: + * PS_DICT_WEIGHT :: + * PS_DICT_IS_FIXED_PITCH :: + * PS_DICT_UNDERLINE_POSITION :: + * PS_DICT_UNDERLINE_THICKNESS :: + * PS_DICT_FS_TYPE :: + * PS_DICT_ITALIC_ANGLE :: + * + * @since: + * 2.4.8 + */ + typedef enum PS_Dict_Keys_ + { + /* conventionally in the font dictionary */ + PS_DICT_FONT_TYPE, /* FT_Byte */ + PS_DICT_FONT_MATRIX, /* FT_Fixed */ + PS_DICT_FONT_BBOX, /* FT_Fixed */ + PS_DICT_PAINT_TYPE, /* FT_Byte */ + PS_DICT_FONT_NAME, /* FT_String* */ + PS_DICT_UNIQUE_ID, /* FT_Int */ + PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */ + PS_DICT_CHAR_STRING_KEY, /* FT_String* */ + PS_DICT_CHAR_STRING, /* FT_String* */ + PS_DICT_ENCODING_TYPE, /* T1_EncodingType */ + PS_DICT_ENCODING_ENTRY, /* FT_String* */ + + /* conventionally in the font Private dictionary */ + PS_DICT_NUM_SUBRS, /* FT_Int */ + PS_DICT_SUBR, /* FT_String* */ + PS_DICT_STD_HW, /* FT_UShort */ + PS_DICT_STD_VW, /* FT_UShort */ + PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */ + PS_DICT_BLUE_VALUE, /* FT_Short */ + PS_DICT_BLUE_FUZZ, /* FT_Int */ + PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */ + PS_DICT_OTHER_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */ + PS_DICT_BLUE_SCALE, /* FT_Fixed */ + PS_DICT_BLUE_SHIFT, /* FT_Int */ + PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */ + PS_DICT_STEM_SNAP_H, /* FT_Short */ + PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */ + PS_DICT_STEM_SNAP_V, /* FT_Short */ + PS_DICT_FORCE_BOLD, /* FT_Bool */ + PS_DICT_RND_STEM_UP, /* FT_Bool */ + PS_DICT_MIN_FEATURE, /* FT_Short */ + PS_DICT_LEN_IV, /* FT_Int */ + PS_DICT_PASSWORD, /* FT_Long */ + PS_DICT_LANGUAGE_GROUP, /* FT_Long */ + + /* conventionally in the font FontInfo dictionary */ + PS_DICT_VERSION, /* FT_String* */ + PS_DICT_NOTICE, /* FT_String* */ + PS_DICT_FULL_NAME, /* FT_String* */ + PS_DICT_FAMILY_NAME, /* FT_String* */ + PS_DICT_WEIGHT, /* FT_String* */ + PS_DICT_IS_FIXED_PITCH, /* FT_Bool */ + PS_DICT_UNDERLINE_POSITION, /* FT_Short */ + PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ + PS_DICT_FS_TYPE, /* FT_UShort */ + PS_DICT_ITALIC_ANGLE, /* FT_Long */ + + PS_DICT_MAX = PS_DICT_ITALIC_ANGLE + + } PS_Dict_Keys; + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Value + * + * @description: + * Retrieve the value for the supplied key from a PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * key :: + * An enumeration value representing the dictionary key to retrieve. + * + * idx :: + * For array values, this specifies the index to be returned. + * + * value :: + * A pointer to memory into which to write the value. + * + * valen_len :: + * The size, in bytes, of the memory supplied for the value. + * + * @output: + * value :: + * The value matching the above key, if it exists. + * + * @return: + * The amount of memory (in bytes) required to hold the requested value + * (if it exists, -1 otherwise). + * + * @note: + * The values returned are not pointers into the internal structures of + * the face, but are 'fresh' copies, so that the memory containing them + * belongs to the calling application. This also enforces the + * 'read-only' nature of these values, i.e., this function cannot be + * used to manipulate the face. + * + * `value` is a void pointer because the values returned can be of + * various types. + * + * If either `value` is `NULL` or `value_len` is too small, just the + * required memory size for the requested entry is returned. + * + * The `idx` parameter is used, not only to retrieve elements of, for + * example, the FontMatrix or FontBBox, but also to retrieve name keys + * from the CharStrings dictionary, and the charstrings themselves. It + * is ignored for atomic values. + * + * `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To + * get the value as in the font stream, you need to divide by 65536000.0 + * (to remove the FT_Fixed scale, and the x1000 scale). + * + * IMPORTANT: Only key/value pairs read by the FreeType interpreter can + * be retrieved. So, for example, PostScript procedures such as NP, ND, + * and RD are not available. Arbitrary keys are, obviously, not be + * available either. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + * @since: + * 2.4.8 + * + */ + FT_EXPORT( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + /* */ + +FT_END_HEADER + +#endif /* T1TABLES_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/ttnameid.h b/deps/freetype/include/freetype/ttnameid.h new file mode 100644 index 00000000..cc677de7 --- /dev/null +++ b/deps/freetype/include/freetype/ttnameid.h @@ -0,0 +1,1236 @@ +/**************************************************************************** + * + * ttnameid.h + * + * TrueType name ID definitions (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTNAMEID_H_ +#define TTNAMEID_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * truetype_tables + */ + + + /************************************************************************** + * + * Possible values for the 'platform' identifier code in the name records + * of an SFNT 'name' table. + * + */ + + + /************************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id` identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id` values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name + * entry. See @TT_MAC_ID_XXX for corresponding `encoding_id` values. + * Note that most TrueType fonts contain an Apple roman charmap to be + * usable on MacOS systems (even if they contain a Microsoft charmap as + * well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is + * however now deprecated. See @TT_ISO_ID_XXX for a list of + * corresponding `encoding_id` values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id` values. + * Note that most fonts contain a Unicode charmap using + * (`TT_PLATFORM_MICROSOFT`, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /************************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations on + * a real cmap. + * + * TT_APPLE_ID_FULL_UNICODE :: + * Used for fallback fonts that provide complete Unicode coverage with + * a type~13 cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_FULL_UNICODE 6 /* used with type 13 cmaps */ + + + /************************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /************************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ISO + * charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /************************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Microsoft symbol encoding. See @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Microsoft WGL4 charmap, matching Unicode. See @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Shift JIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_PRC :: + * Chinese encodings as used in the People's Republic of China (PRC). + * This means the encodings GB~2312 and its supersets GBK and GB~18030. + * See @FT_ENCODING_PRC. + * + * TT_MS_ID_BIG_5 :: + * Traditional Chinese as used in Taiwan and Hong Kong. See + * @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Korean Extended Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Korean Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * UCS-4 or UTF-32 charmaps. This has been added to the OpenType + * specification version 1.4 (mid-2001). + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_PRC 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + /* this value is deprecated */ +#define TT_MS_ID_GB2312 TT_MS_ID_PRC + + + /************************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ADOBE + * charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /************************************************************************** + * + * @enum: + * TT_MAC_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MACINTOSH. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Apple's IDs is + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + */ + +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /************************************************************************** + * + * @enum: + * TT_MS_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MICROSOFT. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Microsoft's IDs is + * + * https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings , + * + * however, we only provide macros for language identifiers present in + * the OpenType specification: Microsoft has abandoned the concept of + * LCIDs (language code identifiers), and format~1 of the 'name' table + * provides a better mechanism for languages not covered here. + * + * More legacy values not listed in the reference can be found in the + * @FT_TRUETYPE_IDS_H header file. + */ + +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1C01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2C01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_CATALAN 0x0403 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 +#define TT_MS_LANGID_CHINESE_MACAO 0x1404 +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1C09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A +#define TT_MS_LANGID_SPANISH_MEXICO 0x080A +#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT 0x0C0A +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A +#define TT_MS_LANGID_SPANISH_PANAMA 0x180A +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1C0A +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200A +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240A +#define TT_MS_LANGID_SPANISH_PERU 0x280A +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2C0A +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300A +#define TT_MS_LANGID_SPANISH_CHILE 0x340A +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380A +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3C0A +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400A +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440A +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480A +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A +#define TT_MS_LANGID_FINNISH_FINLAND 0x040B +#define TT_MS_LANGID_FRENCH_FRANCE 0x040C +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080C +#define TT_MS_LANGID_FRENCH_CANADA 0x0C0C +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C +#define TT_MS_LANGID_FRENCH_MONACO 0x180C +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040D +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_KOREA 0x0412 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_ROMANSH_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041A +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x1C1A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC 0x201A +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081D +#define TT_MS_LANGID_THAI_THAILAND 0x041E +#define TT_MS_LANGID_TURKISH_TURKEY 0x041F +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENIAN_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C +#define TT_MS_LANGID_BASQUE_BASQUE 0x042D +#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY 0x082E +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F +#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043A +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103B +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143B +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183B +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B +#define TT_MS_LANGID_IRISH_IRELAND 0x083C +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043E +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E +#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN 0x043F +#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic*/ 0x0440 +#define TT_MS_LANGID_KISWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_RUSSIA 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ODIA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044A +#define TT_MS_LANGID_KANNADA_INDIA 0x044B +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044C +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044D +#define TT_MS_LANGID_MARATHI_INDIA 0x044E +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044F +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_PRC 0x0850 +#define TT_MS_LANGID_TIBETAN_PRC 0x0451 +#define TT_MS_LANGID_WELSH_UNITED_KINGDOM 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_GALICIAN_GALICIAN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045A +#define TT_MS_LANGID_SINHALA_SRI_LANKA 0x045B +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045D +#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN 0x085D +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E +#define TT_MS_LANGID_TAMAZIGHT_ALGERIA 0x085F +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046A +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B +#define TT_MS_LANGID_QUECHUA_PERU 0x0C6B +#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA 0x046C +#define TT_MS_LANGID_BASHKIR_RUSSIA 0x046D +#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG 0x046E +#define TT_MS_LANGID_GREENLANDIC_GREENLAND 0x046F +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_YI_PRC 0x0478 +#define TT_MS_LANGID_MAPUDUNGUN_CHILE 0x047A +#define TT_MS_LANGID_MOHAWK_MOHAWK 0x047C +#define TT_MS_LANGID_BRETON_FRANCE 0x047E +#define TT_MS_LANGID_UIGHUR_PRC 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_OCCITAN_FRANCE 0x0482 +#define TT_MS_LANGID_CORSICAN_FRANCE 0x0483 +#define TT_MS_LANGID_ALSATIAN_FRANCE 0x0484 +#define TT_MS_LANGID_YAKUT_RUSSIA 0x0485 +#define TT_MS_LANGID_KICHE_GUATEMALA 0x0486 +#define TT_MS_LANGID_KINYARWANDA_RWANDA 0x0487 +#define TT_MS_LANGID_WOLOF_SENEGAL 0x0488 +#define TT_MS_LANGID_DARI_AFGHANISTAN 0x048C + + /* */ + + + /* legacy macro definitions not present in OpenType 1.8.1 */ +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_CATALAN_SPAIN \ + TT_MS_LANGID_CATALAN_CATALAN +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_MACAU \ + TT_MS_LANGID_CHINESE_MACAO +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \ + TT_MS_LANGID_GERMAN_LIECHTENSTEIN +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \ + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C +#define TT_MS_LANGID_FRENCH_REUNION 0x200C +#define TT_MS_LANGID_FRENCH_CONGO 0x240C + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE \ + TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C +#define TT_MS_LANGID_FRENCH_MALI 0x340C +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C +#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \ + TT_MS_LANGID_KOREAN_KOREA +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \ + TT_MS_LANGID_ROMANSH_SWITZERLAND +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_SLOVENE_SLOVENIA \ + TT_MS_LANGID_SLOVENIAN_SLOVENIA +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_BASQUE_SPAIN \ + TT_MS_LANGID_BASQUE_BASQUE +#define TT_MS_LANGID_SORBIAN_GERMANY \ + TT_MS_LANGID_UPPER_SORBIAN_GERMANY +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \ + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \ + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \ + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B + /* the next two values are incorrectly inverted */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_KAZAK_KAZAKSTAN \ + TT_MS_LANGID_KAZAKH_KAZAKHSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_SWAHILI_KENYA \ + TT_MS_LANGID_KISWAHILI_KENYA +#define TT_MS_LANGID_TATAR_TATARSTAN \ + TT_MS_LANGID_TATAR_RUSSIA +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_ORIYA_INDIA \ + TT_MS_LANGID_ODIA_INDIA +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \ + TT_MS_LANGID_MONGOLIAN_PRC +#define TT_MS_LANGID_TIBETAN_CHINA \ + TT_MS_LANGID_TIBETAN_PRC +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 +#define TT_MS_LANGID_TIBETAN_BHUTAN \ + TT_MS_LANGID_DZONGHKA_BHUTAN +#define TT_MS_LANGID_WELSH_WALES \ + TT_MS_LANGID_WELSH_UNITED_KINGDOM +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN \ + TT_MS_LANGID_GALICIAN_GALICIAN +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 +#define TT_MS_LANGID_SINHALESE_SRI_LANKA \ + TT_MS_LANGID_SINHALA_SRI_LANKA +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \ + TT_MS_LANGID_TAMAZIGHT_ALGERIA +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 +#define TT_MS_LANGID_KASHMIRI_INDIA \ + TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_DIVEHI_MALDIVES \ + TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 +#define TT_MS_LANGID_TIGRIGNA_ERYTREA \ + TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 +#define TT_MS_LANGID_YI_CHINA \ + TT_MS_LANGID_YI_PRC +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 +#define TT_MS_LANGID_UIGHUR_CHINA \ + TT_MS_LANGID_UIGHUR_PRC + + + /************************************************************************** + * + * @enum: + * TT_NAME_ID_XXX + * + * @description: + * Possible values of the 'name' identifier field in the name records of + * an SFNT 'name' table. These values are platform independent. + */ + +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_TYPOGRAPHIC_FAMILY 16 +#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + /* This is new in OpenType 1.7 */ +#define TT_NAME_ID_LIGHT_BACKGROUND 23 +#define TT_NAME_ID_DARK_BACKGROUND 24 + + /* This is new in OpenType 1.8 */ +#define TT_NAME_ID_VARIATIONS_PREFIX 25 + + /* these two values are deprecated */ +#define TT_NAME_ID_PREFERRED_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY +#define TT_NAME_ID_PREFERRED_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * TT_UCR_XXX + * + * @description: + * Possible bit mask values for the `ulUnicodeRangeX` fields in an SFNT + * 'OS/2' table. + */ + + /* ulUnicodeRange1 */ + /* --------------- */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + + /* ulUnicodeRange2 */ + /* --------------- */ + + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000. */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */ + + /* ulUnicodeRange3 */ + /* --------------- */ + + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + + /* ulUnicodeRange4 */ + /* --------------- */ + + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + /* */ + + /* for backward compatibility with older FreeType versions */ +#define TT_UCR_ARABIC_PRESENTATION_A \ + TT_UCR_ARABIC_PRESENTATION_FORMS_A +#define TT_UCR_ARABIC_PRESENTATION_B \ + TT_UCR_ARABIC_PRESENTATION_FORMS_B + +#define TT_UCR_COMBINING_DIACRITICS \ + TT_UCR_COMBINING_DIACRITICAL_MARKS +#define TT_UCR_COMBINING_DIACRITICS_SYMB \ + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB + + +FT_END_HEADER + +#endif /* TTNAMEID_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/tttables.h b/deps/freetype/include/freetype/tttables.h new file mode 100644 index 00000000..d04f8102 --- /dev/null +++ b/deps/freetype/include/freetype/tttables.h @@ -0,0 +1,856 @@ +/**************************************************************************** + * + * tttables.h + * + * Basic SFNT/TrueType tables definitions and interface + * (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTTABLES_H_ +#define TTTABLES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * truetype_tables + * + * @title: + * TrueType Tables + * + * @abstract: + * TrueType-specific table types and functions. + * + * @description: + * This section contains definitions of some basic tables specific to + * TrueType and OpenType as well as some routines used to access and + * process them. + * + * @order: + * TT_Header + * TT_HoriHeader + * TT_VertHeader + * TT_OS2 + * TT_Postscript + * TT_PCLT + * TT_MaxProfile + * + * FT_Sfnt_Tag + * FT_Get_Sfnt_Table + * FT_Load_Sfnt_Table + * FT_Sfnt_Table_Info + * + * FT_Get_CMap_Language_ID + * FT_Get_CMap_Format + * + * FT_PARAM_TAG_UNPATENTED_HINTING + * + */ + + + /************************************************************************** + * + * @struct: + * TT_Header + * + * @description: + * A structure to model a TrueType font header table. All fields follow + * the OpenType specification. The 64-bit timestamps are stored in + * two-element arrays `Created` and `Modified`, first the upper then + * the lower 32~bits. + */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_ULong Created [2]; + FT_ULong Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /************************************************************************** + * + * @struct: + * TT_HoriHeader + * + * @description: + * A structure to model a TrueType horizontal header, the 'hhea' table, + * as well as the corresponding horizontal metrics table, 'hmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Width_Max :: + * This field is the maximum of all advance widths found in the font. + * It can be used to compute the maximum width of an arbitrary string + * of text. + * + * min_Left_Side_Bearing :: + * The minimum left side bearing of all glyphs within the font. + * + * min_Right_Side_Bearing :: + * The minimum right side bearing of all glyphs within the font. + * + * xMax_Extent :: + * The maximum horizontal extent (i.e., the 'width' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_HMetrics :: + * Number of HMetrics entries in the 'hmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'hmtx' table. + * + * short_metrics :: + * A pointer into the 'hmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `caret_Slope_Rise`, + * `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'hmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /************************************************************************** + * + * @struct: + * TT_VertHeader + * + * @description: + * A structure used to model a TrueType vertical header, the 'vhea' + * table, as well as the corresponding vertical metrics table, 'vmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Height_Max :: + * This field is the maximum of all advance heights found in the font. + * It can be used to compute the maximum height of an arbitrary string + * of text. + * + * min_Top_Side_Bearing :: + * The minimum top side bearing of all glyphs within the font. + * + * min_Bottom_Side_Bearing :: + * The minimum bottom side bearing of all glyphs within the font. + * + * yMax_Extent :: + * The maximum vertical extent (i.e., the 'height' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_VMetrics :: + * Number of VMetrics entries in the 'vmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'vmtx' table. + * + * short_metrics :: + * A pointer into the 'vmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `Ascender`, `Descender`, + * `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum bottom-sb */ + FT_Short yMax_Extent; /* ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'vmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /************************************************************************** + * + * @struct: + * TT_OS2 + * + * @description: + * A structure to model a TrueType 'OS/2' table. All fields comply to + * the OpenType specification. + * + * Note that we now support old Mac fonts that do not include an 'OS/2' + * table. In this case, the `version` field is always set to 0xFFFF. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`, + * `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`, + * `usWinDescent`, `yStrikeoutPosition`, `yStrikeoutSize`, + * `ySubscriptXOffset`, `ySubScriptXSize`, `ySubscriptYOffset`, + * `ySubscriptYSize`, `ySuperscriptXOffset`, `ySuperscriptXSize`, + * `ySuperscriptYOffset`, and `ySuperscriptYSize`. + * + * Possible values for bits in the `ulUnicodeRangeX` fields are given by + * the @TT_UCR_XXX macros. + */ + + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_UShort fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 and higher: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 and higher: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + /* only version 5 and higher: */ + + FT_UShort usLowerOpticalPointSize; /* in twips (1/20th points) */ + FT_UShort usUpperOpticalPointSize; /* in twips (1/20th points) */ + + } TT_OS2; + + + /************************************************************************** + * + * @struct: + * TT_Postscript + * + * @description: + * A structure to model a TrueType 'post' table. All fields comply to + * the OpenType specification. This structure does not reference a + * font's PostScript glyph names; use @FT_Get_Glyph_Name to retrieve + * them. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `underlinePosition` and + * `underlineThickness`. + */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the 'post' table, but we don't */ + /* load them by default. */ + + } TT_Postscript; + + + /************************************************************************** + * + * @struct: + * TT_PCLT + * + * @description: + * A structure to model a TrueType 'PCLT' table. All fields comply to + * the OpenType specification. + */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /************************************************************************** + * + * @struct: + * TT_MaxProfile + * + * @description: + * The maximum profile ('maxp') table contains many max values, which can + * be used to pre-allocate arrays for speeding up glyph loading and + * hinting. + * + * @fields: + * version :: + * The version number. + * + * numGlyphs :: + * The number of glyphs in this TrueType font. + * + * maxPoints :: + * The maximum number of points in a non-composite TrueType glyph. See + * also `maxCompositePoints`. + * + * maxContours :: + * The maximum number of contours in a non-composite TrueType glyph. + * See also `maxCompositeContours`. + * + * maxCompositePoints :: + * The maximum number of points in a composite TrueType glyph. See + * also `maxPoints`. + * + * maxCompositeContours :: + * The maximum number of contours in a composite TrueType glyph. See + * also `maxContours`. + * + * maxZones :: + * The maximum number of zones used for glyph hinting. + * + * maxTwilightPoints :: + * The maximum number of points in the twilight zone used for glyph + * hinting. + * + * maxStorage :: + * The maximum number of elements in the storage area used for glyph + * hinting. + * + * maxFunctionDefs :: + * The maximum number of function definitions in the TrueType bytecode + * for this font. + * + * maxInstructionDefs :: + * The maximum number of instruction definitions in the TrueType + * bytecode for this font. + * + * maxStackElements :: + * The maximum number of stack elements used during bytecode + * interpretation. + * + * maxSizeOfInstructions :: + * The maximum number of TrueType opcodes used for glyph hinting. + * + * maxComponentElements :: + * The maximum number of simple (i.e., non-composite) glyphs in a + * composite glyph. + * + * maxComponentDepth :: + * The maximum nesting depth of composite glyphs. + * + * @note: + * This structure is only used during font loading. + */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /************************************************************************** + * + * @enum: + * FT_Sfnt_Tag + * + * @description: + * An enumeration to specify indices of SFNT tables loaded and parsed by + * FreeType during initialization of an SFNT font. Used in the + * @FT_Get_Sfnt_Table API function. + * + * @values: + * FT_SFNT_HEAD :: + * To access the font's @TT_Header structure. + * + * FT_SFNT_MAXP :: + * To access the font's @TT_MaxProfile structure. + * + * FT_SFNT_OS2 :: + * To access the font's @TT_OS2 structure. + * + * FT_SFNT_HHEA :: + * To access the font's @TT_HoriHeader structure. + * + * FT_SFNT_VHEA :: + * To access the font's @TT_VertHeader structure. + * + * FT_SFNT_POST :: + * To access the font's @TT_Postscript structure. + * + * FT_SFNT_PCLT :: + * To access the font's @TT_PCLT structure. + */ + typedef enum FT_Sfnt_Tag_ + { + FT_SFNT_HEAD, + FT_SFNT_MAXP, + FT_SFNT_OS2, + FT_SFNT_HHEA, + FT_SFNT_VHEA, + FT_SFNT_POST, + FT_SFNT_PCLT, + + FT_SFNT_MAX + + } FT_Sfnt_Tag; + + /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag` */ + /* values instead */ +#define ft_sfnt_head FT_SFNT_HEAD +#define ft_sfnt_maxp FT_SFNT_MAXP +#define ft_sfnt_os2 FT_SFNT_OS2 +#define ft_sfnt_hhea FT_SFNT_HHEA +#define ft_sfnt_vhea FT_SFNT_VHEA +#define ft_sfnt_post FT_SFNT_POST +#define ft_sfnt_pclt FT_SFNT_PCLT + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Table + * + * @description: + * Return a pointer to a given SFNT table stored within a face. + * + * @input: + * face :: + * A handle to the source. + * + * tag :: + * The index of the SFNT table. + * + * @return: + * A type-less pointer to the table. This will be `NULL` in case of + * error, or if the corresponding table was not found **OR** loaded from + * the file. + * + * Use a typecast according to `tag` to access the structure elements. + * + * @note: + * The table is owned by the face object and disappears with it. + * + * This function is only useful to access SFNT tables that are loaded by + * the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for a + * list. + * + * @example: + * Here is an example demonstrating access to the 'vhea' table. + * + * ``` + * TT_VertHeader* vert_header; + * + * + * vert_header = + * (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA ); + * ``` + */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any SFNT font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use value~0 if you want to + * access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag~==~0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length` parameter is `NULL`, try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length` is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length` set to~0, as in the following example: + * + * ``` + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * ``` + * + * Note that structures like @TT_Header or @TT_OS2 can't be used with + * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that + * those structures depend on the processor architecture, with varying + * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). + * + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @inout: + * tag :: + * The name tag of the SFNT table. If the value is `NULL`, + * `table_index` is ignored, and `length` returns the number of SFNT + * tables in the font. + * + * @output: + * length :: + * The length of the SFNT table (or the number of SFNT tables, + * depending on `tag`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While parsing fonts, FreeType handles SFNT tables with length zero as + * missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Language_ID + * + * @description: + * Return cmap language ID as specified in the OpenType standard. + * Definitions of language ID values are in file @FT_TRUETYPE_IDS_H. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The language ID of `charmap`. If `charmap` doesn't belong to an SFNT + * face, just return~0 as the default value. + * + * For a format~14 cmap (to access Unicode IVS), the return value is + * 0xFFFFFFFF. + */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Format + * + * @description: + * Return the format of an SFNT 'cmap' table. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The format of `charmap`. If `charmap` doesn't belong to an SFNT face, + * return -1. + */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* TTTABLES_H_ */ + + +/* END */ diff --git a/deps/freetype/include/freetype/tttags.h b/deps/freetype/include/freetype/tttags.h new file mode 100644 index 00000000..bd0986ef --- /dev/null +++ b/deps/freetype/include/freetype/tttags.h @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * tttags.h + * + * Tags for TrueType and OpenType tables (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTAGS_H_ +#define TTAGS_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) +#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CFF2 FT_MAKE_TAG( 'C', 'F', 'F', '2' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_COLR FT_MAKE_TAG( 'C', 'O', 'L', 'R' ) +#define TTAG_CPAL FT_MAKE_TAG( 'C', 'P', 'A', 'L' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_HVAR FT_MAKE_TAG( 'H', 'V', 'A', 'R' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_MVAR FT_MAKE_TAG( 'M', 'V', 'A', 'R' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sbix FT_MAKE_TAG( 's', 'b', 'i', 'x' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) +#define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) +#define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) + +/* used by "Keyboard.dfont" on legacy Mac OS X */ +#define TTAG_0xA5kbd FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ) + +/* used by "LastResort.dfont" on legacy Mac OS X */ +#define TTAG_0xA5lst FT_MAKE_TAG( 0xA5, 'l', 's', 't' ) + + +FT_END_HEADER + +#endif /* TTAGS_H_ */ + + +/* END */ diff --git a/deps/freetype/include/ft2build.h b/deps/freetype/include/ft2build.h new file mode 100644 index 00000000..e3f48879 --- /dev/null +++ b/deps/freetype/include/ft2build.h @@ -0,0 +1,44 @@ +/**************************************************************************** + * + * ft2build.h + * + * FreeType 2 build and setup macros. + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This is the 'entry point' for FreeType header file inclusions. It is + * the only header file which should be included directly; all other + * FreeType header files should be accessed with macro names (after + * including `ft2build.h`). + * + * A typical example is + * + * ``` + * #include + * #include FT_FREETYPE_H + * ``` + * + */ + + +#ifndef FT2BUILD_H_ +#define FT2BUILD_H_ + +#include + +#endif /* FT2BUILD_H_ */ + + +/* END */ diff --git a/deps/freetype/lib/libfreetype.a b/deps/freetype/lib/libfreetype.a new file mode 100644 index 0000000000000000000000000000000000000000..d1944d50da5d8b74428caf05946bdc036f05cebb GIT binary patch literal 1253504 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

d{46_3Arz2>Im@$ev8- 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

ne5$mak{hzK?3umSH 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

qZ5gMW#p+Y%ALzE*_DZjrvaX%^l zdUxXM(^8%+bV#=>JpcLWWm?PEiYUjvg;4(0BFYgelp{1mIYNbUgoY?bs8Ej35akF} z%D>v3_$n#?T6f}W0p&k-(xUTuPA8=W$QPyoXc4i(UWeo~bTPd-E*jS2Wok8S3R9gL z#@iCb!BnXvUUN}ACQ(=zjfZJhNxX}^jI6ED#@*Bk(L&S*Mm6v5m&RQpC3X z=vr2lGudoYqGdc=4fGFnLwf=(i&LULxMOg8;o=_~GdvvQfr*=6!vrCf{qpB+eRrhp zb>n#hmKR=T8)!hZsi3>ueiH$mD~kY>0RvoI1fUogKqoscDN2F?jB}QU2!lYnGt3Gi zAtyk34ipH+TFnQKpdZ0sJXU9KI?H_MUa%&zQy?y{==YbHgklc>$zz2hF~KD6-E0A* zby9jBRXHm>4v_;k;J5=-&xF$4$G%LPJsJ3g)4)JZwn80N{zh^s%s$+_V*A;?o`5j> z01);mAjCcZgnbGKu@3-Yp8`Vc13=kFNOy+cWFKkimT#YZot#GmVyANS7{k7g{#nX9 zE6Kw0NSw=5x$3{+R4Zgy9WQ1JoV#2^*<17P`9nc3+th+Idg0b6C*yFbjkpx^d{Yh{ zIp;@DN=g2J^F_S{xoF7ScDB$UBHVV)bJ=~n73cR`lDj$ba*73VJpZAH?AUQ?v$G6KTV1b|4B z0z%RRfJl=9Led0)NRtADzkY*PX(FUM!*5CxX;E7czBFaN;JC|1GKkf^F1yMJ*;8ck zs<#Ojz*<~HBA;?Mui&g%xU5rJX-wqQlUOhMXBmk;|Io9h@D52uxORQC6XPjHGa{Dd z+A;#laZLebxTb(ITvI?ft`X9m;WxQPTDs*s;F{DvyB3TO;EKq_lOLUQr7e8uSPhe| zCr$)*J!WJA(O?7#<(fi$Pyf)Go33fB+f!!S&1`-`cOT z%hg~Sy5gl;1MF&K;<5rMhq{{n$o2m?@bvn>{>t;Fs9yhW8h}S7N{3#$LL;#2oDIg?70EiGNAS6Tps1Om-o#8iyh_rOecOXQ|z-5&M^h;7Q z5MI7MM2JSP(-o@eqQP$?c3GtC59}n{mJ@$R>XdxA8B=La5kR+MKPt9bN z4g||F5QHwdtVpigC)vpjj~*#OE++VsMjdf{}x2ceQSI>yd%DTEZM z%?iD?q|j@Pp0&wY*na?TrO;blq2-*EyGL>$Tc*%ki<{sUREMURT#G_Wl3D!JLT{Di z*DY(?Q_%0+3TJ@cL-&D(0l^D*inPY~QTzu(EjY_LN{URt z9OYrGW{@jF(Uv4o+LG)t-sWIBB)MBys2VLGXL=n4)Cae-LPafLvSZwF69HK1D~IXl z4D}Hk2RF$SoCL{TxgKxl^0(tE5RK}dtI7602{)BIttN@yC)(_pqQZ}=VfpxEuyB>) zC5Ag_L<3yT#p_W^$OiYSXgtGv^wRly;b;)&M+3-$@nB#b1~1awmxgZ&F$QRgB-^?_ z*Sa598;9P+t--xEd-0w)w<_1ZKmCg%vajzUTVDLdDR1(wppMRGLE+Q!@Mzpbd}=m|CLOblhbM!BMdRUY8xP+_KzKX^K*mD_gvLVvWIR+r zXgmZ!#zO^!#zO#fJS3z$!*7mJ@xJn*E9lZTX`%gp>hT^T-|1ggsNiI=m=@<{<@_@sa`d{RI;J`vI_ zx53CK($X#80iU=?sl=zxVbxKQPj^BhD)9*y#K@;P$&QzWPtqshDqC@LV(U2;rf_t8 zsFMY#_vqsK-SHEuz*{$6YX#>QgY#@czj%whjOyp$Z6b9srS01%x;cfJmqULYxOcC6tiqFAyFNf-7-;5>xz&oIe@^ zQ6R1aPX40s!Cr81<4T)w%`r4!Tg}X51d?XTL)J9OTWW(PyM9JEklNiZTUnj;NM}t>;4E0A+4m;+xtpVfxB2HY)(a@pH)?Z$f)M(a$S0lP=wD z3qtxUKZyWcsLQY7g*uli^~I}%%Oy8RU7#xjnH3qRQ5j&BLku{~$QQu4wkZ%Dhy%H>S(6;Yqpz$%n~5_jw-n*3j?_`Cik#JM+WNxRV#Yb>*T~b z6jn5XG=xm}NFD#&on1d|w!UD=V&_%1y{g^hhk3_6~(KeLZWzOLKP1-)KWGE#y z_*ha*-z94t1u*JhWZhvBECq&6nsVV0y^2J1DKI;(*6;XS&_J0!w0@^M@tv;3Bi)Hd zqP!UNc`;b{x-vl{p6X>xIzlKy8igTSrOby4&|p{MVQ-steBfCUCJcm>zwwVNEmUdw zo9@KlAWC=QVV@RR(16WaYN?BC^T6Kt!B}CtRSYC_(A&m!I%u%;Kq8Md8BiJ%EC;jg zNrP44w&$I^#LfrxeIS*;!_d>|l*}NnJTi>l1{&9{`Do%e#hxpbI)FmARVHwfI4A(# z&cf(gdRt}6-BuYdcUuK59IZTE{3MT@cUHdNTSS(;^fR0o2N7f*u4$mT;Et~`Gjzun zB^f6d;aXz{wo~Num)6DFNk8>hk-7Gt+KuPWF^z#AJTITQqMejKlVR%)OFK#0?EvKh zpWD%3CMsV1y#^R)hT|9|rOd1sM((n6y&b^<{XMVK>`+c70kDXVW`?>d?d+xdCo_p@O zzj10+htt$^!b=E;)yFN=NB%vs?yB#w_d)~(0K0BSSOB{njQz5zzi&z#m(y#g-=1MY ziQbOMr%pV`-d-n#IJ>ioB8;6?N&jW_X>8sijPIiQI$-y2szMeId65X@7*oB237g-7vajYC?9@al<%@XXXkiKn{duEpyFaj88V>FV&OxUKvzsfvpP2 zWdh8efQzcb|Aa^|)ChY86)HuX*65PQtTnQ{@jhZX*0nG|WePO)BO=m^lXfSRpf!vg27A_aY)F7-USas-n z6ZJ1TBS@4CcD_py`hoZcNqm1vvr~UCQ-$b6_(dFuosTKXxKS?AIEouXbdVQOw~S{SVivN}Ih5sc4PysVee?8*ZYf2hBg#&dpE5fzK7B&f+Z`&9}xN^ z>%e7eR!dkzXxTy{BYZ=3SUsWY>V{>@Z>kO3qF&dqFjQBwJXC9n8@l1ThT0`JhL5?dW!6soUX-atYE$Z~nj;t*l*eM8N{ zaD$K{JPt1g9pHT!oJWL&EvmV$eyPoqpbYi+xQJy2KNr>4)@lNhU9+$uwD`K(a3C65 zVK7E(7MridOO{66&*h*X@X`8EwJGV+(2bTw@|jiZ8j{N#8=A`?hWnUAuVpyDy~5I$ zRZIqWl#9=$o<3g*==Dn=y`F5ku_6iLW2EcLDfqHz2wWu1E(CwDDAQuktX8zf|o~X z7Jg)Lc-b<^XN8s2rQur0-VNafG)8U7Zpe))%U-h$SQwS7WwjwTy=)eFoG|Um3$U#5 zcpyymyek6U_f7cr%4h(+0D^kHn*v@r-Qs&eUeQgF)X`G7oM?#FqrERcdloh>S+oen z4QQy#6Q~|!5Dq|Aed?xR#iFI*@Z4(}uB*MNF4C|RO$|zD7NOWc=}KD{g(Y9EmRqJw zuU2Qlf)#-UHOr%+y1 znebeBcux`fFDVlKLJ|D0770HqR#=|jRwVqrMZ&Ku5`IIG@LP(6w-gC)FB1N_BH>>y z627ZQ`1gv0A1V?)S|t1zMZ$kqB)qIWAirF>y|765`-+4wDiVG}k?`gs;eS;myt_#F z-xUepQzZO}BH{mT!gKY~uZx8Lu?U`drd{OXSyUvv>~7_M2^{{nzqb|%zrcj&)>nza zpNnT^5%_D1gfA`=^f4E5a<0d?p|05Z;7__?v4KV#44#rK)`V))0oz>FWa(czbuet;`W_+8E=!vgVXE?V(7 zRsQCsPghEK;KS0ym(viW(CWOmwldy<4I2Z^5W~R zm2lnWQXszSLmL0{BJ|B(pz*&@Cl7z+LXCK&7=LOs{@EhwQ`c+6#fmu(|M*8V{>ftL zYc(QVBz^f}jlZXeeD>98{4{N!dHE0Ar13jt*0unDH);IK>g1)b+pH0{7s-F5RpSp9 zN#DnlF!+7ANcqy-+KJyeMevW`sqyR7$)j)OXEXv+`~2m_519D+BJt&ar4igLieFy( zDii;vBJ|gphX3Uv@uv9(NueXuJ^AM z&ak5(+_@XhFDIz}0bM1AfgXDeo4*^%^*% zR}12MfcU4Y&ydXY_DExb1)o>`{D19~Xq%P5KO+(aQzljsR|Cui`WMxggx+$>{&Tt8hk7 z7lgYKaFyRzIHRu%!Yv0}@4qXY(c1;#J`1>(BMN8qcR{!Z0XO`g3TO0qLAb-j_fv&4 z`n(|Ai-7A&E1c2m1>r7$&C>Fm!WsQu5Uv_!neY`2yQ$2Q}ihpz8x;(&)yOUpbWF#f_|FmE<%640PbD4 ztN(`^0|A&Avj*Xo1_E#SINYn?zh-?P@HV&?8h0|>3i$swDuV8QxG*heJqnlUet(e(zQ-e;h8uUu@Fyt$@q&Hm+9pdyUdp&cb{$`_@@iaGB41xWrq1i{|q|xb&Y7 z_Zr0iWR<4B6)v_b&8me9lX=#KaGAaWF5$;lYQ85L6wmMAGW@wus(%zN{Xc;FZqWI4 zxHU-sPjD}Xf7i_l_xErKcPre5h+p>!<;z02%3^YK{lA1u|1P+c%ik{7@C;mrKLeNbm4Zut zegQ7p-mD)lQ~BEfcP{+r!(}-hTB>e6T*~DvxR=2_*Z6<>QN{N-T;lsXxWsoW+y!tm zuw$9-ez+fGINbSxz=u8t_s#I%vIIoIy#X%i`ygD_-%;4dAA!3MZV>J};WFKiqJhA> z!1p#pUJUm=a4&+p`FizV3YY$8P)W>h7hI;>3im?zYvH~F?o7CEhkGod`TrCy^Zznj z!fk|m3Eaz#|F??_AK?=20^@(P@xK}l1m20H55r~p{{@$D_rjeAf86-r4|fXuvyJ~H zFpKcV;S&BZT*Cjr_&*Jo@SBYPK~xIc{g>bp{ylJ6zJFPu<=+aI<$o7kmj8DljURza zzTFGA65;2fQs^InkkJ2*55rc0yYoXDz8Eg?mcnIy?73Fu;Qercde(D@r2Egt-9%vc z>x_Sxsd48R_m?Ov<9m#IfpMRQ5HkGV;S%pxjsFvH@o&}#jQ`~iXgQyR zOA;P{%X(M`_d>v}f?Ench2WB}A2j}_Q7Fbg4wvy?gUk58H~!n-uYA50F5_>!TJ`G1 zaNi2J6Yo=(H{#Jh0GD$7b-0B8;#Hddb8zXegL?tu-whX8%z9>y@^dTP1@O;=`wqBg z!+ks4(bX2DbwK-@ixQLvTsY58x91pJ!?Mufe7N zf5827u;2r5Awsiwa~{jF0xr`ngG;#3OilLzxb*+WUtr9K_+GdWrCHa&g$T`h@e0)+ zhu|{)<8T?jbcUvnz-9X5P@;c^@Ov-U@EBZ%|L0{|f4kr=K>Tkm2?S78v%UzI^nLK+ zKmb)SYtKdMFM~@t_%{eIL}}IlT-N`8K&Z*z>2R6<&mjy@5wk|&GM_t*pXcD&u6p1y z{AE-Q{V&3$|L4YSGT|$YKWf}X#;r%CFdcvYda5N;nVh=irv3eqwNg@V^)CbohUV%3--yz(o_D^*ETx{HMc(=*@Zp z$j*WLaUg+eniT<(YvG;%lI!693P?!Le&c@GxPN8b8;tuN<4!g1^KVl6cfy^F^!0Ed zs6DS1JzXF%(uYn5{ zIBS}5yUx~f$Kf*mcH>`X{PU(MKS#iHG`U%yH|{PFOMZP7F4MgRV@0LX;_ln?Mz$51Z1EGONhar=zhW!x6y zt}t$uac3B}+_)3Um#Jyv4jXsCxV^@W8F!6w>x?_sxRu5&Gw!(ZbLyyZQ^xH#ZjW)d z8h52}BgUO=+zR88sZxG0Q_64Lq;dO<+hyDqu5l}kTV~vGR3_;hHEznd{l@Jv?pEWjG;YMWvyEF}TndMjAAh9$#!VWx z&$wO2Z87c&<5n4WhH=Y{JE3woHErBs;|>_N*SIm`t}!n6IRnMiO1STVs;YoH3vM~w zE8%j#>P)y3kYA{Z>Em$G)TfWaWx5gL4#P!PHa%thNw{e8(+A+9X;1Hg3(=px1}<1T zeI;C^pI!wQzv<=pLwtRRM3z%oPjpurx5~Jc#tj%Z4So_XW!ygF#*DktxK+ljG;YAS zX=EztjoWA3m~mGcx5~Jc#tj%Zjl`1PxP8Wr8F!^|tBhM|+<0mBxi5>DHmYs01@O$21*??2iuxO-C8)Iy7Vj;ut^M08BN0yIyfV_{n&?K7&v3 z+x3o1OuSvc_z$KB{vLz>B?E8Q5AHMYc0GskK>T+7=6?R@`tOn$L$#ka)d*JAt?2A^G@s3AQ5+w}lmWkSE5|NpdsxAXlE8o!<2=hGsr zuULoX_d}$87yLbO^|P1=a(`dU@vj2^{qbKwTEG7*pvUk3L{9uYIsQ-O_}L%$(|;(( ze`5~*XL9Iaf82_v~1eg(zI#IonCN$2oq$7Hg0NKwWY}yC`ebW zUhNBNTHivn>zmd$wixt{>sPfjG_F~-sbTGg)lFLi4U4dWI*PExO`jG|v~^we+B=jM z4|qe<)-8bs>|t+Mw)Qhk4NIG_r*bnwZr{9d6P)HP4Qp0yUemC73-NA7X#x#GPs^%J zo0|~4iXkjS^QNXIDYkmoZCth5cwPD%H?Cjbw83Inw|4Uu;9Q%R3qy!eh*SX5w`f&k zQ$vlwOSGil+_H|~zJN7rn-KucY;J<<7HnD5x~4`8xoXSC*3Bl>#+EJkT(f%Zt!w$Q z+J2CN)tlDd(X^?daowuTh;nH%ehC07i%D5>>$*Ez*0@0`0c)Gw0AZV{a0w<>@b!+h zjRXR}H{ZEo%bKRmtPNzoWo_fCbtul3O=}wwk4n{&G(>HXkI+q8drg}Zkz#ESMy=bp z@wV2M>RO>c^JV^H~Yqvn!{A~Z!#)g!kM+3 z8^E0P#s{HZ4a7~WYyj(Eor%OZKPgU)w?T++YiM4z79ktf-g3*jriS&aHs8i*6?euP zA89eZ%`KbOZrB2$aU<7nyrW6IWSV3R-ZdfZs;kzbHt%d`+R(Uh_1X=$8Y+lwbyM@I z)^#Xl%c@3+@l_8?Wk7|cO&d11Zff#}tlqc*ekKvwRj(_%)ov^(ZQ9hb3Hfc_a_2fE z@i#LzBne@isK?KlTU%FcT5U2_iEG*bKQpD`p$1?<)*_5KUq^9ls6}g3;ZZ&;-*o3v zREV1m>Sf)!jg78feSu5nym!u3mELd8`{!LX=c;RF&zo0S`Tp5+5OLLP#?G0IvnW@? zz3P2ef8ZL1tUP;j^M)<&p~A)Q$ya{;8ir;i=uSj`V)zpnfbI-b;y-?vjtFpUQ0zBu z7DPr2jP(O&fd4T(lV3x_7OFG%*U+#$ykfcQbw6HeQY}t==u!fyzLLN!;+`Ccxj^`6 zXlR7YQV#T&i_hZupC*2Y0~Fscw@ARZaRaog{WUaHhn9z|4|Y?trtdNZYFS$%^v(Eo ziQOCI0plwlUv_zCuQ&9tko>hMKK11PCBF5L{4EWw8$OM0q@kg<+7C7RcEy*%{Ez&$ zlyFEADBDvK_=<*P6}h3IX$?ep)%qrl%;n!W7uETr0N|IpNAamo#$q%X-QT77;+QKi z4Wl#suE2l#C-6Qf#|X@vHrtHvl>}&)l^re#T#LCZjOhY(_|M;W&3}gd0RN5Yi?7rF znfJHL-4mI5Mh~YjaeTG=Lqs&jKRAbt=XDC4x5PP3ToQ$ol-~JH;pJ{d)td_ zF2Oja?RX4rED?P%J~$P}{SM*P$8x;&Ct%&~R>D7eO#{gX7vklXL$g*u*?vqeXlEVsX4~J&?f_ox( z)at3h=gLTGa8C;kQ@%F%%fPf(f_q;;VSWH_g(Rx@b31`R6Ef-WgfF6KA^(Uf-+mD_AB~J7~ zg!Q}i*iTyZ z>bIf6Uw{w44F@0lZMB2DuMq{<*#LblH26yag?}Y^c04rrbHF~2&*!V1^*gE)>-!SX z2dl5hpm_M0AAKMgUyIVl+jgLhG~g={-hqh0qa{37T;K1coP!bE4yEtif`-!I-r>Qc z$fX{h&y<+51*)eF;&ZUt2|uWh0<&2p!VgXg_g=K(Ej*2Bfo-HGsSO7hF>yo2#O(QbL)NuqVPt@VD?I^Wj4 zLZW#5Kg@dTb8A|BSvB34SJSMoycAhA-B+ZhSzkFRb88ye6{_hSOqo;D^cSk>9@O;i zQ2Wm*$*B14@NQ2;AD9&F4bA%(eFUq$Z8u|s_neErL*d<22bq1iv?$)zgF7d%1O_D` zq2@};s|YZG;6!-){4fLu3o7`2zzJ_33U}cOUgDO`9QE}GQj8?p9&tOK;rx#0 zk*R1lZpV|Cx9OMrfr$+Zig!0zZrW*kTT(ln9)!Ja@+kkqiDW<0#!r+6@5cHh_`V~a zK1;4FG5xTQBt#C5O>&^n!aL@NcL%qTI(*woMb${vCo_$<9%8XV>M0exTg2AJc zXvpXTPi(>XkIOm|pYH?4$UNLQm7lvQGcsY`_uQrG=JnM`Pa!5{shLy}HM2cGWv-fm z02ER)crH9wZjiEtU6JiynCVLPVmbXwSG;XIR0l^)nV5E}!`2uuGL}uA{z@ zzbGE<@Ps_qF)7@kI!t^TMh!B*eE=}_rn9!;94jotheCy4-XBlE?|?cIqikzI{c~FO z83Y)7eM9zH7Jhd;0c7K_165~;9Y|x3cFS-`ObjvpKFRK&3REh*ZXp zmhg_q4t9dP^^-3owdyT#xL+s3jxRqLH{d|QXI(DizQ3yD2^g%n9}YHuJMQjhUHY^C zoBZr`D8*~KTE{SIv{#>E0JYixL&uI1A?^vp?K1NtGlHF1BSbOU^jac@CL&j26cukf zh5~W)pkXtZ3>Qmcw*h(&g+jBv@t@aUwI8QGwq2I71AyB0L;nx-T-&aZ zB4)Mhe02?)q0nP}0*mXJ_^dA9J;Woh1%XjO)7hnv^!2HADrbLBb}=%AE{vy3iu7dC zqyd4OgJ5mJl2DB_c(gP=SPs=$m_%2VLHB;hRiDy~zvVG3gwGFe58lIi zCrrA8-n-we-bn((5P63V0EuW!TGx-CL$6REAK^Xd)yg zXfA|%a|8Pjh|!q8hr*R#2=v$6Cqy2@1AvQXV28M!nOlQp!M!gG{(|iv6}Z(mAUlWw z*}+izgs7Tg#Tx2d1BN3LJjT1)d;t}VH+|knhQ;!*5kh+r8WB|+?!#vlK8K{2VtVbV z$k#ZxexL_tJdHqnuHdKY0*hF}`~qkKvW?P5rC-;lm0SdMLW5A1EsqieK`SuC-bwQw zlnDKn5-p5`<%p+*6*Q0@Ua5$rbQY0#w8TK-= zNUA9_U#cf~&sMP7S`FK7gU2s0nDL=q1%2)}qN)&-kb0gkW>WAT8Mz6<`JG<291{&g z!E~8%9DJqpA-N8k;&N*)+Tw9&6W5i2D*lm+4>%fa%y8AaBKZJo!27wg#0y3kN>Tu!-x@^%Bhs{ zqjP~KE`L!GRf3;EljIdOV>vP)(aFE8fKyqHzyTsj9*0Bnky!?xmWsfB?ZH@{dt^X8}VeHh<|tLNX0D+Xn>5kAZ( zPH+>Q*Iq$j6hz?ixN+%H=(#huO94g4Wb(e*oxfNH28_YDO-peTGU+-x6n@%pAZ;e+ zMsPo|2?85V*L-4GSu~avTsZ`;9IAGroUO<)y8sy>S2$HH9U=l&oCpQ?{yRnwp=tky zuYYrHP9|<1aYiHH0cHq|3H~C<%IwD$PShU@J3p>18Lds+j3tr3CEd02MuYd9j}HhWSOEJdK6tjzAkHp}e`Vw| zNF*93j+Kz$wq|$>(dV;|$MPo3j^JKkBpRQe%o>^(Tp+|bY#l8l~O|^C=85TQG|M7=?E(1)xo0`jDUvuFan+-#e+|HgL|%1Jp5c@@rcLb5s!;!$iZ?#`1pLh zEgP4au1}&qCE!5tp1+julrxBcnRrMYme4-b`H9FC&qU_E;ND9Ns6ggQg-t|{&x{V2 zfNw`KG~Pr$(2`~L`EX_c(_L7e)KR!ypXFSJnM**0vT@n^^pq|lL=S^27}?q?PQeGQ zX{uO!UKK+@c~wl0TgCMFs~F0+bu2N}Irx~A4v&On&1L+HRz0RAc;hSXIu#PiD@Dpu zGBv;LOA2!ah)IH&lqVi2R4eGU;(=U#PN!mvUBp6e{+^~sp6@_GUW;mHABqCMo6$t$?Zr-JIJRNU) z8k4Kq4~#m4a=bb+@2TM30{;<#AC>-LG{dv?rdxouQwfb|>PNcdj0{}Eqd6k?h=|-H znNO(5p?er(pYpUTdv1S^W!9Cnc_4!jGcGS1fudH2kN6`~0+rOMr_sm2Lh_}Dp0zp$ zpPoR{;|e4_et|rKHiCKwHGBG)IbZ0y;cES7zh0mQQ$?g_FFel>Jia84q-cUFN04$(L#i26fQt01c5(lK7 z0ltlZvN5mip#ECHTHAK;>9rkttjrTAtLI2}zGsCd0XueSz&1mQz?!BQ}LQvv<_TMw> zcVqsiz%B>HAT8?vvc4=3z(|R=-utmY=wfCefN?%IGe7U%U^Xpmb3lnC1r)H% ztiO~yHGKX_@N+EY{K&WG#9Ll4?=6_O7K++eU>?*98rvDMuh6*8gc*aj1~cZcd+9%j z3}jYFJ;Qhb{~<94#Lm(2;sG7~j8KYoeg_4L!ff)!i|`a0FH$?(Uc`OhL)Su}vBgY* z0W(Shz#?d1qmR!V!_J8P2xZYWmN?593MFaw)Xp2S-Kwr2J)!hlv*$=6dSreS{8c*u z3?(02&gOH|vfGR$VL6-0df@}QMQ_^}7@a*)+BS-pFQAje7|@yTBYq=+9JP=4s10#M znifccdcdsTfsBqN(T!@q5A)zvdDX#_cH7?2|Ia>I|IZN_(4cOeK7JM*UH-{EnCY~w z&2ff0ZD1W0LCos5X;DOIQe46^Vcd9r@NV`Z0y#^{j5P?%ZH^W(H2hst3<*Wk0TJrW zPUV6jrq0oYa&w@s&f&|c^QZBGEWl1R00qcsWC}%=1(eZK4k^<8ry^19gQ^=ST+wl8a4K+WbAH#rbF@6n!Jqn}&5xG({Ltn{v5q_( zc2dc2h(H<(Z+JlipRNo9) zNWO_lX|N@#W|OwWdFV~hDmtqqqHRo(10uF{23qlj20js)i?v%XW&OBQYF=GA29SVV zzMY_fnYBcW2@ze5Hv4~b>~*owLC7gvC|Z`^0M7QkeoNhJuSUg-n4bZxCu^@W$xXD^ z^5ET-{A3q1iyWAPO+EXBke7a6wA~JcX&v%Oml1K@-alf|Jo#1jbYpKi^A zx2ZFPCkZ@!fCev>HxB`UGu7=Kpi`naIKaKlWi( z{{OAdL`X#wzHxn4m!)rY#^Jy9*`K7(TK`+0y$*eLWuC^;F8y^Xt2V2w>S%pb>v~O= zz9^=zbT5~zSN8Vbz@UUVpUA8sf#m*3ugGuT(<(%w0{n5e3P z(nt2;iJ>Y@q)%SXlk|XyZ=DMpif4gLH^J>~l5(#5%pv_lRg#Y}!+HG4*ni4@IpG9y z@MIm|R;zz8Cthbi6@dNL5PKj{?Kh|O{0ry@%{piA)E|?#?#xn*EQ2Pna_S7J4alK~ z3<=C@w>q?ZMau>=-dJO!C=pkW&FTz3y_r&a+?i5(yqQvPZbVa->9P)^OYE`^J*9S8 zhn`99vJMgsYsW8pRe=LM#mIdU7D!u?=VWmvSc*TdfXO9SZj(wLCbuY>=RQg zHyLWAU@|0d-)tl&bjK?8b$SwO=CgeAD%`bGLY0@KZIWw@2^0bi4s zDR47Vx=@+7#M4~gHuvztI0#6E+ z0KMBu&fznK&n%KZg}Flmf<*yPFWsiCs}!Z!?LN_9G9OfU;wb24xG4z0ajqrj)vDClt;1wHQSE?0>~l25P1 z6%a@{ZCD6ApP?COJ#amV{kN0w==v!X$M*!9%S)m-VqjUXt1ieuP;M0`K0S3ok6&G2 zAP&wrFJbwP9Sfu$5L3aiq3{j~;5)_b2UR8W$>P>gFz%07H_=azR|wDI)q~W5K&w-l zZP*glLxk>XCeEPlniTEl^zb(%d^`T4RpWeNfAF3w;+*9WPXM}XPz&adxWwF=i|NjxauL4v>=H+LR1gV zLh{|&Z9>#yB??ViS*jh0S6SeqS6TGBh5wO-KQ^LeGK7%e10j{9os zdfmAr>sTWCv~vg#2|M+uhL^RorF2+&P*N>&CV^VXU`1mB7pjmK^li;YTz8!Aqy;a!uD+cge^@?nXo;FtU2j~E$?P5Fk$~TnkO<-?L%bx6uWtAeF@fP- z62bkL{I!9J0*swE-)#^?ZoGK zr!%wp+XX6mY%S&N@6gni|2;yp_4Q`vSxsW>XFgs75Z228PT*`sbYw_&{%e6X;`j&@)l{9>%ZnZ19YHL{8`5uKdSq*vH;coWA)Wr{rtF|s2%$CNuuvqiv`kD+sEb&5OJO3Z@z@ZXjntRQzdh1NEaXnpYnm_S5k zJy+?o#(~gS1VIH6upL?q1?M+ryT%4*)MSQIQ)$uMS;>x&6p52+9YHPVD5yjx(R73Z zap4PsTFNCQH?B?qRxIE1kig9AJ$)a)@gL^l(L{l zB4p73k|EPFaBUd*>U`=be8^XL*rGDT5if_QHwb*&aHRYF$KGCI`b4glYV=zX?a4o; z329+uB4tvIDU=KhX&032N5N|isX``_%w#H5>7a7}IsG+q@|NU5TtDFOU$BXglh$}L zMwJ!pl!;Ls+(XJ6EREcQ5bgs{`w&`VLk$Y1lbqwpt~?ZfW`PAoFHrOX#rZbWpkO+$ z-~fV%x9VO5yW!XzPT?lt%r$6urmQK@4BEyewVW;QE=SOu)J&Wh@0<;dWDXG;UqZsn zj!2xV#$ojCX-I$>9Nl#sX_UE~vB>;(-iRICelcPNZo8TEt&LH zLLm~<$a6tg4`+!UYZF4o5^T{~nUpI-lvcKkLdCsKfr;Cws2+c3J0$vHU7CV$n8?)oI5hCHs&i{@;%2Aw4maJ$3dHhM zrDDCdK3HlF)-6WkhC2iVA`Q@3=UlBSozsJB)Q86Gm;PDln*8cczat+ zj&gN=4=I9s<-A~g;{0Ie*VQldQw9C4=l{@ae+k&nIT}Jl!M)uClq2<%F(J`$LE*Tm z+_m#jjUy!=I&l{<0UcPX7QtRQ&l=pjlL&*~IuvPqAyP7q3^bpeOy&l|H0)A)2Zhz5 z$uSVNvqaZ0Cy*X5apc1nWbUV!CgxyU4@xb>r%NM^;BdW_2{9V9cK(z4G;tD8S}O|r z&k8!Of+ZVeB9qhzGPaF9k6p%6+cV*6p*V8vbg1)cphGMUmh#JR7rcu%2&dR;)!a+$ zoC|>Oa9nCd(NrQfXie%Clh9Eo(M?cyo>zQ|p962nD6^dqN*^+%(BxKx9lM(I>v@E- z5=dywBUF!f?<9--tajB*B=P7<$@k%0kP#`9G+*ffX96iuP!gngg4yY&lUovA=;CtE z5Y_o+q;F1$pfsbVpm;`*1 z^(Y!j*VFO=&m8tzI^}&fW_z$_Ph!io-ovl365yp^-RL9xAXL(Vvn#kZ~rJXF%v{cb=6J3lV?(X~)$RKg$?Ui^F; z&+01>{|*~ZNpa(YI|ns`dpnuUoX0OM3GNw*zY+-UOvz_g{j&$d&!G4+O<=?qDyDuS zl-#=Zmd$zMt9@z+h(oa#PK07dOG3dtgI(dD#M*v>u0mPyY#`S5EKIY_LKG)Ql3n;j z{3`tQ*pc%E?hM0bAgJ`wiPi}k7)Nrz#4DGR?o3^Mg2fo-UQsR4a98x1Slctmic2)X zJ>j27eg?1L6^CR5L2{OUe?}uW)1y_GYu71CZ=acL6F)yzc%-Z&enP0%HO`4ebr7bug z=Z~@9xBlr6g+P|Ez@r}vk8IshNP~O3mZD+BUoH=B|8uDiHw;%qR)MqksdagzjGVm- z2QW{?-pDE0dnyc7e=>%Ze=>#@r^FyfHbzATJAVc{qiCsk6BY#?t5ByUc%9!qnGjoS zYI2_nA&9(;o!5srnhbU>!(SY1{vU8y`)Gu&iVAk<0Lu$aRITAyF21!KtxQiWgvXnQ zVmve^Xy|CE*{9`Xbq|6hkM?8*5;V1L+7j%1yPEF0_}6O44gE{X11!TqnK_u z1r=3wrze8;9yC_>8pyWk+k`jqWC{d8B(BHbQ{)#T=qa-lBnEdH34oh&a4OscJw4oo zFljx<*oD4vBp&67SnN;2q~ug>edDwk3@xX`06^;f5r~z{3StUrK_vq*H#Y-?06*k= zw*3Y$g`oXq+QGpNolX`Uk1+TsFRYYP9Ph?QtnEioG#u+1=E(fRcw`Du%bko7XFs`) zlb`15acPv7pda_@Nl1wEs7Fy$$O{HxAylL2vOH9=wx^A+3sp|BgvFda zEX?Bf+O$6IYO&r}mHiY;pn1i5V^y{z3zaDrnuQ!!mOUlq_#PnP@#I`caA~mP5*E}A zm=x^bU{s5iOj5}0<#|Z=ra%?Bf(-|I!q3KW_m?@H%qV5HAcv3Yo`AZC%H|PiPmWXI z0+X__BFxeSYrG8eXIb&I{cLZr@sV%lbPv2RkWF z$V{yhWF`AMc4h9tI3?Ehb?C}C$+U}5m}SNBd@NY>G!KOzn1uO;@K;JeXfLs28*jvU zCej`5F>@4984;bM$nGt!kWv}5_8;I0c2L7uizq&EmRU@BYN~6clBbETYa!1L?uq0j z%-b$O(_k=c;1rUJd9Lf#f6g4~DcX7Z4AcTAh^@9*zzljOhxp0sQQ&l?&!$Fo@ zhD+e=?owx@hU8Ms5>BxYzQjx>wZ*VW3s>M&k^*Pv7>08Z=MYAE`qiCAfX;KvS9kP? zts4q|mDq!wi;-AIrxu;I@|~kDI{oS%anZ?_i%#bxeHQW;z^NfwkpOOdWzPZ19hNKE zBDujLQB{@bo{d7GdIz7IB6omy&VV1W81=+PSvE*!qMKN7yL9)?Dtw4Z?aT620n^3T z!HKD;dg5qyN`jB=B-4X?A7--Px1PZy(_Q#-b{uP73ZrXeIo;&*a@Bs27i3`3?0 zgj|La>HH)hDKLqh!Y0|I_pp5a$axkU^)di7klsA){U94`QvuP{Ax=L&Ohloi*6_nA z0O{nOeC1Z?qs#=9T&28aQnY7uV(nF^V6DAKd8GYu)jg4NrH~O$-CQBdRB?IaGJ)X) zLg!3DXF9>lL?ubM(WDRwL8`h6pDHCl;evMXQCftLM}m*Vwu&T)I>&%h!#?AMwb-!F zdSNh=749xKtUabwp{@3CN&^tdW~Zmiga-ExNOu5+QDgj-8!URe{U}q5u3cqf(B$`{ z$cm=xUN7{37rI?TlflP&3;;gmeb6g@Lki*HzCT>2uEcN zyG|p62LPRw0rNt}B#8F{cb;d^1s@Z1EM(^&O>weSRmV{q{FszoK<&UE$yxIMGd$vK z0L~aeR+|&|4-3Pi;L`od@6g0qxE3cI8tP<$lP3;PX2S#bz1-c}RGVfE)u6 zwSYdzR&x*HrQ-JV&^8jaF6JvMb8pvF0*5hbi+qkm;W?ch9F(%4B)G zjSUu!J&<`uo7@Cca*}zNBVzEHS#zwlw~e7~{IyUZOYeR7M2IQu7+@I!wS>7-@QJJQ z!+9VK$pRTykc%Z8iOj5%hb0l4aMKvA(>7sxI`0FO&HW_0j-9ooM1q)!Kn%sW)SzA& zd@|7tR&sVC1}Ri{0`nY|;x&1s5CIOQQ4ah^wo^o7Wh0mij`C-6O;ag*-Z7uoHMKeY zZ%b&(Gr$L(O<|D{2!Wr!T(}uIaP;%X>~)qXH%Y9Ib)HQ$gKR34`b*+9H9uXkp@um1 z$4btjp=E}TP@OEug_!M!;P@|>sH&=LimIv#0L7$(%BGw_{IR^|WFm;PTeiB-P?ru&( zJ}}_GpvLt0r~_+6moXfuMv%>AnjE>#1!A+jFaV7zsR$c=;d?f+p%mfnz`_o0n-q!|4R5s5#)kSl}==v*`9U92+jUpR3$1CQ{J3F81Bk ztD4rR1j$Q(1^79^&E{S8&&S%HN1m&ZlUWtQM)my@qG3oIZewv5i3D{h3DkEW@rW2} zC?WRS)jC+gi4J4=#tDyUy+{EDl?$U}c81(>^C*CH4Unc3X$nY_iZq#rbe$rF9_tY@ zMYEyW;C8Hi?{ zsH)26w^A)t|7L*;r<;eW&Xz*(3k{N7#uwDH`6_q6FvVoTV5pg|x4K^y?iW^GOzZ{j z7q%RkuuAvqV*SFxxa=9)-r}+Tq@>@dTu%r0Mk?YjR|UIK0E@k%O1=rHh*=+~e; zQb>H0Wwz*B-LKEMU!Qfquro@F9*Z%J_1x|EbigBHX|T48Z&q&qsz9Eaygde^q$>?> z|I}%w164waq?;1lKI=5oEdrcZYk$g@TjRd-#Z{(#j-yIppg?J~@8=9C+TEyl-Rg%r zX&nnCw`|_n0@z|I*F5;cJ_lDpaqnY|mJ`U)nsc?{G0`nPXl}$PRL0yB`S!e053#%I zg*_YAgS9_}*v(b3OCoP-!z5;RX5c$lQSNJ6ziLCIJ35l9AveG>poY=@OZNGSfF$z@ z;!`*CBoPWLXLgzGZ6BR{u3RdFtuZ|8LQdcU1AM3OZ7w{5dhwNfD17{W1{_zVoHSC} z`H!y7Yqi_JBw`CkS))A1z}3n~WFrSVj$T&y?=56hwZ z1d241Arcd4P;``p9+^Gk6k@bX=FP%gwcSyDn98uVQZnhh#8QFLaw1ZJZH>5_`w3%H z_;~adQ!G?hCD2?M<{^BD zC<^Qp)|DH?wsZz3zUO!66}l3huQ@gu&7$cPfl4*SC84PR16Q7w(=!{|iaNUe0JU1Sfo;!+REe@v6*j;kXnl_p zhpX?#;KL+>>@fL)0C9Ri1S5?o{Ev<$J~|oIICvB@%T!9JT7=8}avwwr!zj}mCR!>~ z0}{p@FR`q|H6)eHf@XCROz@{PnYzbR#*nxiz!tp_SqXFWi^M>hRUM4r8~;gUt~wZ& zC^=J@OD9s8!yf{ZlNHVunHD@!kj_fq_>pv0X3;rRHJN_WXph(6Q&fb8l}WVTD+$kKdCNpqs-)BJg=LOA?2f@Pgz|Y$x#$= zoj5AR)sC(WFZH8;cnkx;NWja4+UuA?B})^FP_U;;qjp&*&~gw_)-}Z?$H&u@!M(rH zH^Fdxd@G-n;RDpT##r72t47y{n;9L+etBw3Hm@sXQC z&x7DbhUE0%Jwni1rRf4!wBNg?xSw8hIiQ;2fs95-FyC_-D?_KJcauo^6bj7ORnn7W z(VBL=(j^Jm`)R?=)OJpRPfO=!6Fz{;di4zjE~P6@whAi_?%_>x**n&Kl4}K!vPbb)vBE>CcyEsH zc_6MABHxR?tJCGipO&4xVYuBn7@6PNW9scMT+|)~+a+@n*6ZG0+nb?US9)YuGu{|K zC!B%-=d~v!=qE2A%d%j5ICD8}4~LKK%V}SMipIuf^>7b>9O`1sO7T$d$3PBmo2qu- z&#B89Kcj^&oePr;df46zT4)fxc@?(Kw_-AcgJ|%w91{v_?r=I-Cq`l2Qm`}6 zn+PldFapzQ!cJ>DK}caYX{FaE)oy|l9Z(~5z;7{4K!b4-Hrr?-2JV_KjTEv%TTJ#) z!%T|G!&6a55Qw@tB7I?4AiUy_BWKqTh!`Bne2b!EM-e&* z%b7m&>buZ}xb|vnc3#yz$ zCl1AbRqAx}P@6s{FZ@o(DYy6-_69km{oj~pH&2|jc7bUz$Y{BcsPDPOAC)I3gPojR z!Fm`V6Y}b3LM(DDxVJwS2vniReTAFKQ=wRz8_I{B{axKNk+U-x!adIS%6B-p=W#7P zuqb-*W>%7h1WL)vOQe)ot`^%+kCCG>mg~W-kh8x=Gpx}Jv5Q@Ium|^yIu~5(qdddu zALR`7m0OUvv-^;vQjm7+91N6$cv|lzxe+WCBZw5|mB?x6?YGBYJ}cPyw1nX#U?SEl zpJ)-XTOrad5C3U76SDk`C3B{Ybn7uHWMh(EX`Q*_HByK-kW;P35RN(>39 z?yk_=6S9H9_??fIH76df^8lKi+bd9yAnrR#oE+maBr(|0V2A5Z7^B1wl>mnk57u`i zfvu1%^fZXXI9{-EIxj_VP@ZW_$Tu`F5#kv$!5ciso8q?ftt%n9@}?D4u-yM>ruJXG z1SvD;qFUH$xGK5#{t=MEw>@<7|5cj4nO`9c?E!k+p14i{PYP9HplBRrIGmdUk^whm z!l)+rQYY#vfjccHo&|@_)j-9!dcKK zL(-HYjhWMeja-J@p$BOdjl{UVP{{zRyt4O}Rse@GSW1ks+<7Q%oOO%jKv7l36GMlZ z6Ia(YJFRyJHSa5IK9*;83P?BTs2vTI2BGQNf{bZ02w&N~xqz+_g z`AQk;SO&BAz$-)l>6BqP5fPi#TE8j76+|r^H24-pebxip(lT6d=)4r%cl8HLUT~fy z$v$d`MCsyJ)_m1UbAN%kk6;3r@jrXL*jDoxBFD)24xQc>NK?ycls1h$ktpp`$b*n> zjg7LB5CRvo8r~A$D8@3ZR6>u+fCc-*o`G!a4L<{67{$oB6t&h}3lJgShll)shTF@o z9+3uN(A(gl$sup_~H&Ux?GwX6lqhlBB9{B=JlQHsM z0qMuCO6h5T&i2g=bsh{UsN3NaGO}#@RNhkz7$5;ICq>rqB~@hj(wCnSkac{>lCOD| zF*@%hV!oB#`T#Cy1BC&+m;E5TBw+yGePQRN+7j4dFoS6d^DQzv@PXAPq3J{yP2WqR zhrP)q?&Xmxv-Or&9^U{ip98&G4l}wT&p5hC$>^rH(C8+WGrH-;jLz4v7=W%|nk5Cs zo7j!zVuD7d@m1k2N<>1e^-Ik9=$}CdhQb|W21X0m=O}N0$AaTg7ld{J;c4|_CF5(qI??Kx%Iz>@wVT8V(=G%Y2(OX z5c7-DLu>zvVQ5#dQ>V?u%)(Vdc(GI-EH(ZXyr=Wp;4cHyUI{+-iqp2kTv)4n2YFmP z&J8R2=($+79eUS-lnG_eoWKNHX3+2=%MRG~PYBg|n#?axw#~&%s8(;pNRPcNhccLT zF_Yd-W1jXVRh=^oZeNL*Dz7-#xHQ=Il~5v6C)9AuM6KS+NW%ntAVch&BTSdcph%Z0 zcHrIybJ4_(Nxb6WX)C)N0jAJ*%A6vufaPPiSWVCTRNf5cjUyEw4}CJ!kUhIsZN_`q z^F?47YFgGapxwd;OfzwNV`McZYSG?pfB-zl!{_>FjA#@(gxu*~-_0n`TY>i)pq8Y) zZFI@<;7Y~rdNGi2#zdb5l&e^LN&ASd40)qFNH=4?fFrr)L_J2mtr#VK zft!Kw$-WADVlNE{d=4`PXNE(Hm(A2yoCVf}8su*{ARW!~NM zKn;4H0lz1Sszm_yjLr|0nW>#Q!VKCy2+317MIOLQg2)h1^6gr0#(Xej?7Y|ZuX&!`|TSHw_{9! zAqoc9V@Qd^XR#SX#bEW$_Ia_FBg@CF{4S`wnFQikKekT}WE&cFmABLGQ&Kc&d4bGY z{E>|EQ->p2sXHzz0@}E7-7VRm_7KmwW(4U}*^;{xIzC(kj~u|y$}$HJ>@GhZmOb+e zRuawxmF3U09~1Z=5FlY+PEskrAqfBUM07{+Znu5#dQMJE^n>cmMPlm7AlabVd zf=|H?9S|QAxmrxlwPPzC$GB!dtrc>$@Dy9?<*7|*^tF%AX3p({?1*6Zj0U%v3CPjN zEQZPLe**K;@4W{)opwrprW5tV`rSv!G5kko=c^VPt8Vq9hx@kQGvIo_kbc(#Rr+mi zG3oXfsEyp%i$wq&Qq#*8#52j9SZiv9s93`)Qivd zK^53T`OM@U^gzWFhWniS7z#_3OXDt5N~*O!HWU0%XnOm7UOhSp9$ljG(9|FV^TXPR zs7~o+lFVZUg{Fbjea+&`(O`0IM0d28I@;`Vxu`fOmEGxpZdtXO%FYLBZ8x)pG>h_H zKjp|=)t7J}o)iw~HS1n)$GD-G)$4Y5Xg!ju@(kM|#FMNhl%JZ5qAOU9esWiE$?3u! zi0<~$3uj_Lk!|3*?~#;C|Egw2iaE)Cd6~JGu-eegjoY?;xlLqsSMb?lp%W}Gl3%6o zO&fW$gLg*4nw4vEp5#Ib&%;I2BAmce2|WJwmln4(<%AzaEuO4WMwxy`1-`LnE{!!i z)yL6j=6!&ZB#cssl36|q?F}#3IKE&?XZJDLsmQwNW+gdJ%xrWFeJqQV?eOu4V3aun; z^}SUU)m`Cd&G*~zjmagf8^^a+;;xg+!HwX)@H4c(yU&M57kI$Xnb#vdC(*92%sfDG za1(WQdEN?`?OWjW#2VOeycfZo)3vBOu29djgK3;W8#ah57@ZYTnYq~D#?F$`!J`1i zh7MA(ph5`nul{>^N>ri>AYjML5C|8x%rG?105x;7h-5@w4hk-4SpEg@OU}Z_;J(OP zk&0FGX6|4jzw7?Ijt8>acZiaXW$S{ox!e6w|z$k0FLxgw51a7lV>99 zQ)t!>wgGSlTJW(uQ7Q1CJ`n};>j~96UIQc0*0WJY0Hvp52Ss>)H8hkvpDQ9qSsADf zK32sl=11i0Fjnl%_qpMc;hM&YQ{b4P;Crj4SL2BA$@3G511$js#gnIdV`Ky<^Glu3 zMv~G1s46`TVC;(uV+s+qp&kFL5I|T2uR;;GWGi%8f7JQg_T$4MZkUh2K2&5k3VDTL zNC`|~q{dH<*anQ-FRp@_K^IcgkL;@r)h)Dr@8NjcVRU{FszB!AGNi}WgL8v%@t;FK z-@fL172Wm8F(S-5A~6o~K?r9#2LPGcHvhnA+F8Ml1sNN4A>~HWmRA8*!6-tZ? z51g-so!?hGFyq2~fW#i1y#u5Tm`XzNgXfyq`FM>)cg`$Amkhu@%wzNh?-mBWPlLc! z_5!%WlD$B0WM+L|1S=w%ET}M8Ch0Pa19)BOyr)bhJP%ByRGPK!giK<`6lg*-mxKP; zyR)}k?og;8tar;O$p%_dJ&5}r2G7Mm+4S<7W7s?AKPQify* z_yW_wBih$`MEkyAHrn(E)~srILwLH*5S|!XUk_SiwWw(95%TKnuT}p19C53y$E&s# z05iKtQm9mb-%UP4Us1#0PJor1CzCq?^s9RX0(38~e04`{+m&T?U-O-;6tI?iv<~bY zr8?cN^X0O#c0cosG~xjN(Guw|Wv1OMySw+u*ODTNkX^+&r9O}>YMfL}dy2)WbtC{f zLRQ{@pWBHcfl!d`Ge`n%@AcT(89p$9%GJ7u9>*r{J~ajLR2LdF(n z=fi4qkewKBvLXFH%}zPL7;lSt?2P%?c~k|K?4-6}wY$<8^Vs=afaS20;GT3=xzed$ za?gRXbMDF6*{l?hov~A~Qxw|&UFn>QVvB`sMg&RpvCx}0pf`Xf*6&Ju_v0JV{DlEg zh&-_we2H5GN4TE$ucpVD&GXcV|03RdS{9$V=-c{!t>Fo!G;WtY`zVkRM z-SMW{;l{2360_ZJD9nVkZ&KnCES{7M+$|(xFaJ;*);NqKWA)$@^SDcEm(c3z_swIF zx=ah<@oLy~WA)r5>1D36AEu1%0LYpN`mpA}o@khSvsTZsF`*3Bn9eZ>`tuYRGnV*3 zZRz}Fmes>~N?b^yYmnevO0AxhSUt8j_N#!uPCRwAJo08sx4t^~OWGa7usfZqgIk%0oDM;G4U5l7l@6N-uAc|Quf1`NP6vls!O{{ ztjhz_Wpe`ekM>bidfZh|di-ylP*1WvuZNd%&|ttv@~2r5U^7Ub?Akvh8S75g{^6Ao zfEj^4L5ZU&W7E(N62xCF@%l|}qOD4JC2`{$Hd=cUGGIrUyfy`Md}V?e^3~mHcbCAT zXA-Xsr2vERz%lpOF?P}f-xXtM)_WAW^GW{gHDkazfkq&zgD1n}W!8@O0SAN@Z302& zXn>t~lF6^MkB&5R6g{O=L}ot;wvtp9oX;whKUn~|IivZTy=bZ`atg?KJZ~!+EfG{| z*8J3UDvoKaF_&YL6M8GygF2q(n2OU7Wmu5&cJ!CP%CZY z6ze*BTS^o4$Dz$rqH?eGqqzfUn&WK;pg6fyfU4rc=!jDy8y6&}WdPv}1LpEMU*<%U zfJhQjLPqoy9e8~`4sE#fU8wYdimGy>7QisxX@)nMBa`XOFALu7!vES70QVP_p_Wu- z;gfu(DEQBfn2@})BLGfUI}{&46huQ6&b>>+p~0grZUokyFdLdMX8c!t{wr{dRy!4f zF+pb>R8)rMeLon#LMa_>hmi%&*k!5F1Q9|OW$cWhpI0`ssKRo`2TPpDWbhR?YKL)D zK#u9VXX5R7)e&ZqEfS;zU3foYP=7x&G$guG`jvL<*Jz^afE#AM5N7919s7l_UKh@O z9gKY&VP`QjO~U2}kJHs>V4Gp5;4{F+0T`Pw_$`4jLq#+`o@s1VfphnP=(ZSn>*Q8U zOTdmA8bs^h4pu-*+0dLdQRZ{7Pc)B|W<5GziWuzX7I81e>8=KfOt}G4j%Z+_lTl81 z7X%i2vJ_7=J*i!p5gkq3Z^A|=-On)SzWdC%M3hbA!s$uEGJOXjW45G%dnS6+ADxhQ z8)R9JIV$_3>6z`yC+29vMrYp7Fyz?n{_PsmEynTl-1*lw^-U5C8bffwDLzyuD?!Oi>vsrFtxK~Unp z6oNpJ^gVnY1u0v=W!UtHKzR>qfmngT`0e=X3i6|b!?t&m5%zsjuFxwvKN983gw=`m zKBm!w1T~GKLG^S4W;(YcoJhhrJ)lRF9r1eyhIk{NX<#uyYB=mjotye|r2eq4fH^uM z@p%1IJ)~PQVvLf4S=oeciVu~=hfDPG$@EZr4?s6>S$j(cZU7s`Mdfw=Gdy7Icq~~r z8K1$9c_!fAu8$(1EBZsm-rKcQJlGmc&oc2muAb%M8P2RW38C6J2LV*r7a+JHA2KTe z(-52Fd9u=ZD!BLjNc_1{xf+a;eK7pP69>bG@c(iAA66}ZKtvqE|HttkfdC9-8a=c$ zA7smU)xB5uRCToqvBs=0;ahr25Fv!;MwB8#3XvNz2@%66-6$ed+{F9`W7SI?bbp_a zfv<-S=-22>`NGwToC2a{FwRqw zpeo5;{ZMevx#dpxItWm34-UD1OFo_9FMbC-SpbLlWQqtq(+`8+lFu(PjOQW{cE}&b z`7ne%?hpF}!kpomlF%_bFk1&ej_d*mVBKaYxM%W*ozCR|MB8(tO1!ALoG4y9U{clQ zL{0LdID3>3w4i4NJfM4$(9LYns75d>D-Fd{0cll3U6Vgtt9}%Jl!C+ zZ4y58PbPf84F^LHn?r^FfkTC!)rpA&niS@JK6n4u1SIw)IcKF0x&ZA2q&3C-?9R1B zOb!5}V~DlA50y}q+R?3j(!X&_$inE5aKfqneV z_*jXU$iq3*h;i#t^SDLp8B9t|q5NEGG{0`7HB7i-7`updeRO|hQay@~|1hU;Fj_OL zNAagiUgl7Grm9HJ_VQ;vyPn}5`rQ#J;s6Gs9u%6#x%$GhG-xZ*shnq6G>$mezO_(s1*)WwJ zOc(CY`-qEdF5t8jNR|K{`KZdWQNftEFhm7Rw#!7p6ZKsXEU@4_ZN)L5+fuDQwVvLS*d; z&@+L4ayBApQ+`slehOo3E+YRPx7u_mn2F z!J|Eq#`C)(CHqf22dRDn_H^baj5m`)az=yGpBlM4bD*h|o~y0cP2fgJQ@2*mD?T9U^r* z&39My>%qOPPdKduzODN}5y}hJ}4^FitanFs!-pZ9a*8=j+8le+o6DoHEYC*BylduyW1p%<75@U zBPD8gj*=#EISbPxrU@ zpLPGCUyp)zA>Fzn}M;VCQ!g z8ew{`&wXEW1E4XmRkGIgN6@sfC)G}Ea4t_2fe|vIz!g2y(DCZVRb(|5pUcxzK*7R; z4UWvP*-NYDX5q#pht?J;#JmZbv3(dPor5Rs?}@wv_0OvTgTlC3b_nR~aqz?qY zJcyus!%xc7W_VqVQ^schq1hO3D{>sX<5>sPVwxNW<>Sz_a&SP_#qux5S#C07S2G_S zoV~R>ZMrqLx3qbrfqWvv#wHGJ6YvK>#smqr^V>3i=x*lM!$71J zSJcSuz9tR5Y>Pf`nd`NO26UMQ-K@2MAiR22{5eR+BX8J<^9Q!s_O_8lih5d4<}Df@(3b>=Czq@_I-a3n&rD^@bH`_pDSge2Tebu{ z))}83NBX4k$-`G2b;dWRmpENA9v+8A)UJo{5I7e{eRXNI*F1~rhh}w3SnQ%RatS_}67hPb~ z1|$P@A?NWtLr*52fRHC(Q^!dAIs-W@)IJTDPKAr+z`d?2h1m3T3vK8CVk z%ZW@5=qtlmn(B3A>wx!ENBmK4AOLwpn~VE9`fLH z4KB4BOi$J~gIO4OX38@lj$B~^)^_1!2CSFvI;2DU#Sl*f+}X*1E_AC=KxE1z2?^la zF6{>uLT=0G!roB~VFrIyhN()$@lvFHNFg2-9N1xuYf%RO3+0x88fO9M1-j7 z`hbX~5I6xu#fX7%(L4AW@Dv89>Y5{X^tBG$c~uOst0eI-UojDyPK9eW0Z)!gKv=$0 z;kxqFxCG>+xU2>i;oQG(HYHD=7S;`BH0W>`djdv_Zbp$W-=iX10iY)C5~R&RNBIXj zJ}Ru}^y~j)?|tB`F3QFKv#{WzxMwvhG`+5h1|hco$Iv=UdvqbTyQthtC9%jKK@nD9 z70s=Khd+B`oisMaDQw-=2e5 z-ur$1UfbdzDUSA{`7cS& zS7957bnOzC5Mih8uMkXYmz@^r6sTfa{vx^Y6I!!$dnUMUCC9<_+4z(MhyCSRbQ*0+ z{JWRz77p;EQ4jE=D-7@}*H%R~l)OyDbcZ9n`Z&#<<0}%gXB8kz_?r>IUgk-8s209@ z)}2yP9g?)n+NH%SDHWEH54$ffV&VzzOg*GEq%%-srtFHZN9$NUzgf9S z7XHn5s&mYwGMQJbRymoXH-dPr;nm|Uo~SvA)0&PmLgUDyD4hqYuSH3YuN)Cxl`F`t z9{$LBnixjVuoIP|GHDEvfhBc~d9ap>;?Bz|?ucqdlZ(!SjhJ!K8f&`Z+N9#l%-+W| zuN+zl7Qr2*rnvHNDFlyBT*kBm2(WZ3iN_?_|;mJB$}_B>XGKoP8r zA@lu8)P~HU3D<&Bs0q(wr3jCfNe$+a8D-+{&pXqX-(vLBH{ZpE(_4&zcN*EF-)bbh z-|)^ml<_c?OKi>_S~e$wc<`~>^LZ(V2OqLMqt}D@)+2X1r=t!vryw3$PC-1hoPzjv zaysHra|+_2`-x9D@~sr)uFbGAvtM=irfFrC=~V&>go`>tnIz_<_Jj#xsWWX2=f8p z)YKYc#TYA#NE+}3X-9F1NDajw0(~Yy>PS99peB|p>{nr8g(>YcrE$NJn%b&`Lz==y zR&LFD&L5p3KW!h=2JY%abp=ShoKeP@3FP1qOb^vXC8pM}1r0vLC{AwP4 zd-{N6g}3hlrbvyb{7W5eOf4HTQR*e@X%umi8DF5w+%N-K3uuMgskJSbUVJaJHUwoy znx;4f(>SOqAG@cX39)H9p7D}t)!ny^F`^88F$ zJInEwc{x=nH-%IBz~%cQWKPaw5tnbwo}-e=moI&0@N#+WMAUTZWknUtHcc>9Vy0xG zP@v?xz}AVMxa?BRcrJnl+$bSp(v21nE_x^DU{}^@Xk6*j(BTK)h|BsjcUEO5E1xr! z+S{R)XxwvVdvnbmw69GocQW*+ES5nKDRqh8o#-WhEtQ`Ulli%MNWQ;zs?f9#nN?wH0o?q|6__M5=XIqqk< zKbCTHj{8~80{$kN_(hf6J;jVO8$BzUXb7^=(_td_4z2d(FKG3!#kP8$G!$AzbIq3E zjO-@dn=;SH;#ih>MwZ$B4hpfcI<*0_o+y|#mQBl7tvL8d{jVipZF6;P^VE&9p(lks z^Cvr3?uPmNM8CMQo1d)QNmT9&?+hA0t2ujf9KC=ed7vt1Y@=DoN2bwrILY6lgc471 z{$I&svP>~`98#5$+`!mb%|%C$<(W@SN^#1_O0&j7l1fmbvOFoLOI4g?{1FwK3oFWN z4T=K=$-ikKoCW!eJEUo-x}W23dy<#so_LT>n<=Y;{*0(dG`y1LHeHx*JYx4 zSNSbfAo8v}L*8Y{)0Fx>B~smJd~gh2q-m^{Tq-4m>(1D;EY}rTuDZabGSRY z%yaEk_hPP(KJM>4aiAynW{Qk_6pDi>6)LS|=uwG1(6m{GrIurfm2OQrzvK!|e0zls zHqty&_X#38-tZooZtk-uhX&y`f|aSM9Se~>ebiE5)}gAoxJg$02^~4)LXO;DM-3@| zlV_>8l>5UHsZDOKYnRH>x*TaT6$CNHuiIz#Q&c6I*m}vv5dEt-m1P9A{|;=JwMtjBdPakYxzS?Rv#)y2=}4- zmngxAw@0RV$+1#(Qi;ux>U<_CItlDdAFdadNcKZFXQXzBj4|T|(t3v|M~t$T*RL=| zZk6OXaJB4YfjUpgV8ZHA$`uVDwoJnl#!&jfm`USU%na6zox{MRu_?3osXM7^+$&=~ zw0vJXAu?a#N&%gT%Vdl%JylILzb9=-!&~VZgD)9JTkLYbT7CnbKRpX~_3*REj z4sNoDJyCmY;j~m%n4QB8Eh$z*WjZP4OHPz|sTOvGS8tPU+%n`E zP1rQ!!QmgcJ0`kK_W0y1X?x-^x%t6O8ga7!QzBfJr;{w}a;D}TV(g}Oh)yeXHZf&w zb&-29Sxk0O??zw8XI+vg?@ioE!~BO^##$SScsPq|Y(EkSn3^rwN_v}Rf^+Zt#?)-n z3s&L#Fz7*cCChe+yfrxzw4fGblP6CtXkOE`Fv|!J=v^6RBxq1sO9;KV=qzWr33?7_ zhtegx$aF5Bh*Y6OAMmj{nwNZ;N>k-%K}Z*1zK$_k~wp|98+}XxEA#knlLx z3UalsM9L{Ep(5nqldNl4s&tu1RQ{*e(V1(hrfOG_M4OWD6(JZD)b6IrGk8hAI7`Yh zOSA>L_J-pKl~n)n-eB7lIyWoaA--!9fp;P~)A6{jD=mmS-YiNB;|nFZovJCP*c8;2 z<{B#;zv}O(#D}lYh9G~nAt)DRq2((AOCeBN%>ymDQY$4ZX{(yATAoz%!+~`{PRj=4 zC%w*2G3s@cK+aj~*5feZCA%}DvH2{UG%T+M<3&sJ3^n#~?wwAeXq=hvt!kEA=sk(z zk(~7ZeWGflnN*kaKNpc9Rxl#+lV|eBZp#kPJIJX-eXTt`u_l(3#?(pe{L*tw-+KMP zfzQ2h;J_GEV$bt!VKFy}Qoh}<#7moN_4jWB-4I8tGS^zcdJuc4t>oj@Xql>b5)HkH zse9p(KH5AvQPa6IDzh3I1;d;TcYRFHY*ycZv9|B4@upspF>`lTYCn-*+Jbc^rz43E zkj+?J?Raibbp)DOSje^FNOAEGKq_wGv!1rLg zGwo+;h@ThQB#rDIWu;qMkO^sEbwSSA2ERF-IX=2AbvjDgR`OaRy8mifhBQaFjls-7 zKle>fDpcHU=xcJzc&cY0PZ>E7>N)G5O~Lgz{%r{0ApixO%j>BlWK zUz^+#-JmqkWumT09 zDr%j+2W@DZH`WXr@p`_U{!1;lLy0e!E#)8#ck-sblKAC;C-kU4=AfrT%e(8kc>5di z-a+A8W@q~KmV{S~%kmgz2U=6HdXLIb|EpE$qr)r8CCUZ-Ig^WvvQZ*R+w|q^~JcY=3wEN*0pX* z?$xxEpCjbZc%o*bvlnLxV_jpgsQv-3%YQoVuxbLNS{r`U?xvTg|Hk zbBOZG5xe*;k*N3yAkobNCoX0(>Jffm(#hfbI^e#V30gBsliWKv+BrVDCA?bnx7wZ8 zh+>M_>fq>ht-{>7Xt$13pVtu`E4el8(!jXVa9_=KzdtDl^#`2pv1p$p8nnarMR&=x z=JmmJUs+Ag>Z>k#S(MUDyW%~E1ty>MjWn5R$^9U1|J?Q{d80nNXn?fuc6)ERB)leK z{>=GG2=2qgd+H=7R!ttL7$%1JTAL)WHMMwam4`;;Y0wSH2dFB2x%oEf-GWt!Qgh>m zM9qrC>yL)mDSGO^PkOVtamBFLBu1oZT$0F?Z<{_xvdylyQ#iYqUelF4pJb9#w8N*% zq)R3%(^_9SYth!k8`n^@Pb$eKIw!?SA5fKIoypTPEV1QE{{uywGKHm2y(rJqOkLZA zZi$D)gX64Ix$xJ7Wtjv>QLcPZ=rzd=TIe;fb@V~f;D&#ytezexpdKh;s?prAH&GKy zy!6xyyt+3`Ob~Mmyn@NX;HhikZ8cDg zbk%icp6o5iQ(felwMaV63I@8=r)oi@6 z{257~0KFc;%Vn$bHGjeZA~h~&DU%w5R(>Mf;1 z_G+Wb_9w;uapmRmf?b4>yIaj4C#H6y9H?RxWiq_Yn>{S=mgUD>d0xJ%Y3h9$9@BkqGLYS^6Nv21u%Q{#6tJnBlTn&#Y#2Rc0ZRHiQRPxPgX zfV9Rp{RDScu2Q-Yp@rqB#w{Js4@w-UO!QAKYNvysC7; zxE?V#QCS>*WGWRFxTg$dzDbP*?(0gzk2F$Yf&0e8$xD<9bC0S-<#2jj4KYolN0&0Q1~`KNeK!XGN7FQuqvVu4w%)P^2E(;Ir?NNwneBWpts5x{~^ zHuFY{Fh&EGKS|NAs{Vu7>@a_N7P&4*a9DPRADDPD3X%RAx*G5K0wsEbC=w3XdL)mo;;iQGS&O0(?E$wh&K*cvpD!Gm>1( zkWVQ+6sD;)AW?Qij+0e>kJ>?#<(*L!LYRt(j2IM3-eEe<7D zq)|n?VN{DclA1&YYFQ}xi8QJbf@%)EP*GAAV&Y5EW&q9XU1p~Xo~`uyv_a4FIL%@} zLF#+fr6tw2bH~(8D@{9d1Uxfvp-xemlN8(rY+bLehHkIyK7BCQR@pM85Jb*uaATY! zBXSyre)9t+kiX*_qeGSO6&QSFjTij>pMY{WH1mGCyx(0yb>A8tRdwssas=Lp>gMUR zwT$xz2u#%JGzZ!CS-w+CoM=R|zMTTf&PxQM@>3sXS8EAzdEm?+L)xxwRNhF9HA>5s z`ZTMR-SRRm`ehV&;}Lj6dK)$dcvH2mW$$Z2$$Q0va>-um*ZBpms{;uIpPn??o6t8ZI6JE{Fsu} z5Tj<75Ub-4*BSE3V9Av(7$Ol!+4gw2I%K8^k|j#wTms3UhCZ~8-%idB`iW{iD2_JI zw&E0ab&Ky4ah_WczWPG-XTQysKO8lwGXq7Bhd|qK1|xx9H)3$t`z^ zNhFbB)yS<9&7UZ6^@m+-RI)Zpm;755%EYO8rP9^9()Wc|O3wVqwbdXhdFu&(pg`jC_Nd@6_|l#1M-t8u2Zvi!K%C4JI?X|9(XJqu3z# zHkQ>SG`n^OF;7dG++wHZ?Sib_KRom{qJ-rGdEk?@Wt- zy=$n_t~vdnJz6a@wMt(OCFNOQ&5z&Z?6QWB>5~#6o3NXAYA$~SHO1x7GJxIY)L)1s z%_E{m#HW$A(aFS)ER1&QeF%QQl4`KVYt@8Xrbrs9V-vH!y@T~S1w$A{;U<;X5}YAl zEg-7ZvF1A^jp|wV3lXkAzHH?57M*w{zbgKzMk2_TIW@DT84OhC8R9-2AuWI8V3Ete zmb6&P6vpy;=ko0`=6ou91r*rBC{N8NQFl9!WF{BIa7siAE?RIErfDhaSKLgLX6`Qp z`W6|m*+Yg5OZjLYNt?Y^TWFUBMi9m%2K&oG6R6>DF{}DSRr__%Q`lqRa!jBTd&0 z0@r@tIM}*8`dMC%itbHnS5h{m_Wy(Wl`SJ@it`AD1l#44cO)AJ>6Fo=fcrg;w_MB+kpJ?c3*9-M?{}Ay` zL|D0>x z+l>;3shTya!9f#NdVPbGUXO%7QVycm$UdEYsAN+Fkp#I~i#LJF;UfS;7P z8fGebLbV4)lP%tz(S16h;U~1156Aj(GbP>^Oo>-WkoEuc`B!uwY}m;%OnQH09DL~J zm{+@?0#*4()_U1TF*CBd-Ho}M)Hc`mifNS6ebweq7b1rli5o26tyx+FhD-2ntd(^6 z+cB6|5YdgE8(p&s?P!b#PEyut+clAu<&qQ0!7LKNeqSIX+2Bd@^92&x8Qmhe=JJUw zL|abrcveFwDoJ|F+(hvd5L8>RCHbTZWPgL!48>(?Lm)C$iLkGQ4KgvUnwYwIdE@3m z6f(T#G)-*t*dkn5e8Z|NxBH(!?RlHj2ToLrPiWur4i+dWzD}|MKhTUlksi;MNrrSh zvtN3l-o`UI*_6p06d|c9*hhmS`}dNo2c!3TE?Sn7FJYW9K*W|EmAV4|bhff9_W_h( z8#5@M4Q0>0yoEZxrYF4G_NxQBVzYJXM$Bi7eo2pC*BHlWP>sEbl?%wVrr)e~R7ZEP zeW~=$|W$}^EsUA*_bkQmeIb(C@(oU?TE#OxTCmCtl-@{ zmz+`C_a<*<#hFLmFJ zX7cGKEnQ}YcX&>+^1BGank)K0`XCV*>03r}nhTvXXDWDI{0aM6E%LY>A+?@Y9!vPW z)qkfRKio*lG{!G#WBg*!7^?zCNKqvk0bewhdk0NTgFYOH6~`C(U$!T171I>l@dm~ z7P*?M@me^MkZXL(D4a}UwB~1M%?A(_&uB5kL+G$XFG)VAM5IHpAw0gaWPsj&r6IH{ z0xHt#F*Q7jgMPnK3c^d*%a&d{&u`tC>v~h>kW7#FqMqDqhH@256?R!j${J|Qo;fFj z;_Nx|t_-hiClFo|k85#_?dJ{D`R+1|$H+O8r6NXZ=Iaf8*F<;o2vdJ`(VO%p zItSn7I|MCoh99_?O{q?OEu=wSe7aa(3X$hSICT3H>{0Jv?B&n+8n$XV%to5KRXprT zeg_xB;SN1l5(H@;lL><0D)*N4F<1cU`kNGDad``PxG+!T5T}{CX#uwVK@L zFl$D@tjukA*i)96`cAOq&O=~HYV1neYhdi+0yZmHa>XPm{=!h{$l=v;#DcA(Q3B+Q zWX9G}`c`jm(htSrC0o7JKyUI-R!(-Kn)>ilW3jS-s#Oyhs_#zvd|WO-bZe_8yjuxu z4hTHhG>>+*oa+d5UVS&*nm(tXq^}r3K_QyVAGHskm}6LV`q@ZPEDjlqVJ6AY=@M4MgQ~%dhOS!1ySXS{jno}&3wPlH$%TM z;B6`0nhNYJVo_0b*TF@BA4ozb=xyz;?}wMeSl#5J$b*v7*lY)eey_H0nJEPChTTS> zTIM91%r?||u0E{6^IRCqg>NvDRe3_D+xZcgv+#K1K`};vA$jqMl^zQY?vv~M*5^W+ zMto~)F}X@vftOUp2hR5USWZsjTiXq5ny^6g#(`;OYzIE47CTmsNc)S~mzXe0l=h?4 zKTw$HnYZOi-pZFs>CcY$$WZywg2Jh##wG{h2c(iz2cyj{B?H^RWG@U`=~0a=4BNUj z^|P%`8lxpsEk9?mJsVi{Mv*FQK2)hzC9UO%3dD9M|CtabByWTA-nXPI9V)B%(!T-` zDL3i!$b;qk%CyUic%~>?Csbe;rQ#dB64dU_nDvycFeqjbz>05`Yn-&>e^W}0U5{wX zZDAqTQnOAAt_XCkc1hDwcWUF87S8>F0Ez$1=?#Y zIJaSvzbpNCBz>_pEc*Y80`P0@j)i$^^3uQ5)Bi%DszG~e=m|U+d z$8OIVX3)1g`pc@t^Z-rI?+Hd*g%-nZ0_)!WPl3B`=^a5ur6-AxaXuWt%56>d&l`%tWA~nUNo~yPQK- z8!i9s!tv%NsYkgMq&vs9Pn38#M8xXEugI?VT-|Y6Rzs?-c(X zMPsR7DIYqhaY|Ts?PB9#{%4K(;?3Qcc(Nk?`r+YQPS5eJjK6-Iz0d$RQ@At5H-1VQ z_tp}ECCSVK-kJwF+HG5f!9`G^l3Z-Lu_!rpi>3<>!1?sI>o`3dWH=hD*km$!j3 zYN0}D>I1}HW!FsIa#YciR&in=`JffB8MdY>fR-4%rS`C9a$t2(70ab6V6k9izGf!w zozb=MhbhEbJ(u@6>!q7?W}tSE(GjrcEki=GLIa(F1Gq7RGFm)+bS>dFkAnPpxg%Ia z>>bgx@`I!ue&kL8@i)rDD?UL2;YZXv-dhpxr;<<0^s0>aQ^PV(OJU6vuXs6Lw`x2u z;ehrfW|%WmFAGv{(bQl6-%Y*b|6c0<%PDKar(x+bd@X~;rocEwf}dt(8=nd)kd80i zBH0iew)IY9ZLJxZGMd|B{htfp_AL>3Ej+iOX1(A2vrln`1X=8&rI}|+MnBnn=O~DY zx!(@!mf({-SP1$rNoPPD7QIfQ)@KYPex5q>tbNJEl430HP$A;@uETSC#u?p#L`8&2 z6crAIg3d@uA?ZX}u?`mGT{Yggwm2MLFI+R5${c!VIUXuIqigVFR>HN9crCx0SBiJM zC#(-~*=Zx5+B-bpmI`7^UWFhQz%5EgFGkNLu3YwDH-yU`_u$H{P_qubykkFMl)GF| zJ{{m84G>N;3ze_Ve)Ui$SBoydTFFW=jO~}in$^Kc0-1hJe_ZPxe+x=kKG=d%_P^mfTgT8YgaxQW&`_)WW>Q_g~0jCwg&48XxBRg@?%% zHm>%Pdzwz_^_nhOWUM?94BClCW{k_V+AAIVGweS+mLdT1k4B z%}{GIY3P*1q|9^G^qKrh8$MH|ZBOQ#J`y-Wqhvg=;yRs-1xv*DNRzq z5K`ZkekpfNZ>VLF}i8>C37HDEL%NjG5xT?Vr>4rQP{m2F0lB^X+x5}jGooh%G z3Ta-mHM#tMs3E1BPr6aPt%j7+e{r6J+P2w-JWTZ0@GYaY!Qdy;4e@&;e2erW#nbu5 z9Xwa`#;wsenxcQbHTqY1w5VP5KceqQG`^x+dD7e2vWqvqLN}Hkr>#Cy^VhQ@RAHWU zpt;Pd6t_k8)AaayPv#tEY7ZmP7?gBTY$ZmYlG7%ymtnM)NIx#o*xmFVuCea2_cl4sdQIg&=FpBhUK5Q z>9MM&`_@`nIg-uvEU>1hsVpgjnLQHXG6EEe7}usQ_&Ofs#M==%|RhsPfqf&$xj z3(-Lj3Af0kkOLW=)pz|!UXH1L?e*{@eeoR>rm-jMHdGIfU>G7eP_aDdq*YF`UK8y+ zT#qURJBD^fjtm7x$dE#~q|iFi7!qE22l19ScJ@pd!s%zzQy{rTIG-7u;pB*Vs6t=P z1+n~YIXpAc*rkY17peZ!cQe&1S%iodmIe{BDOcEWO38~Zb_5&b4EgFp)^k!3_RX!J zDque&aSizjC4VWurBuG6G3}3>P^wCu&yl%5EzT6d{s1Xl=ocDtCw}G45J`01rTUrI z-b71|f{RMjzq|D>S8nmyg{Xhu7r$}})tC5E>32EW^M^@49LIx-Uub^zZYcJ!4Iz&x z$QBP1ubQ@IB|Sz=8gItj1>=>ROd!AP+RA&+@eXSK$>!l}b*`B9W&Ac@xe1iQ9TfPs zX8H~ed^gOm*(AAx7PHWfr^6U#?RfF1VK3o9kmT5c&aUZZQb9B5c=}y*n2r~Z6dXKu z57v-tYPyFk?|9$Oj{g^Y=W~cdV{YU)N5|7;Tr%o-u}mUtBuL87FM`fyqoQUvG&-I> zs<~lz$BSXX!J})ihFnv#8={wd`=>|XJHMvYVsbyZRU@=|gjRxtn+ds^-+DGS$7(np z!mG8Erprr%$F9K|a!pMaM9)3`XI}(ue$57p$tC^`9Zw(K+_0hJ#Zt)yoY`QUk)X3{ zcBx3&)$#O^%?-OcUVN9}AY-}*YsfV*<8=A zS>YasYjPPL!!)@J4-yyG{F)V3Z!4N>R!F@~UD5GESdx<<%ZUV8y*c&6G`XhKb>`}! znp}p*5KS(_qxftLwbV4t=dZTCCcP0|#%=137s@0#39_6>khMKeZm=e|#$J0BW)9Ni zGCbJWraWm6cg(L@V+>ovZEk6BQ`dC7aFnFBh9Jv`1bO#~zH)Z7Tcrd)I0S>B;D^l0 z^~Wy61>1R?W>lQ6;K#1uNB3Zl#Se?c4~>tOBBFEpBVd`p1j_kQqL;On?H zYfa6NQ}fpf7wvL9Ma>6A`sQ+E2u+(v1v`4l`Yp`Hly4h862A%zS3`2)g-yz3z_1DN( zdKZg=N0{5?mY2cN&ig>UpJO=ZpD8kHYH%RhZWgSZX~_%1`wb!Bw+n*L~3it8T7V{W1Dj`w42=eE9YjjP!Zi>U_-nUk5257 zF`}m|kcoMCwd-TsU%~EYAJZqTxiDnmZJ(w{UfaNH3j$wewyd?LrxaFw&vO3uP9bcT zOy!L$S^+UoBzS;47XxJM(D3EB} z*xa}={(PCfEbvpCED@yyp>F84MOdgC#;%M|svQKGlw)wmGa(Vzt)2|yOc3d?%t$4f zk%oCBvHT+&&J8`)<1Zc&j!(3-+bAY=J#hq&6QvI3#!uJ4U_mBVT3S&v$yT$R{=RgC zxSy!z=CGS@(q8!*jFW@6XsYz05Y`QDc|U&MJ=co?rWH+D9)rUxz9b&9M~)p979x_s z_(|l?cl=3ClHZV(Jod-}#kA^be0f73Am1UllN*c9H=)EkOHvln$*3U`g=%9SgQ2o$ zZ=yPdB$_wz+8Lr9=LxUCR|}T@BehaJMAmB3DAMiacZ?Fw0};dZGI`fYlB5P7L*B9P;cIVkty4FMh|-j4c&gD<;Jd_PM~NbuegBHua)lR!rfV6jNMs>pM7I zC9Y+er>p2=@*ac8l$_p5?~G&|u8K-`t<5}KMR)ymRbqO(MJ>)q5zJ{kK=G_M|7m~Y z`H9M5zqQOvdy~f}(yjwMJ%KBl_-$1}n6wp{gOnD@4Rf}_9H~p9Zmk|$BELF%2Z^Z? zHDGwlF+rHEzvM8S8I$`10eZT*rYBKZZoOz&^(8LQ+)e8ZiM;pYfXlp7u=qrLGTctv@vZ=^e*9E z@^NTqwr{^blQq8}Uoe23Wri?*bAn=79qsTqD=J=*IvF|;R=r}JYk%-u4d=w+`F@+r z1ojSW*^8D^vtj3;mcK5VhHzXaEcmEt7OpGtlj}Wt5S!KU@{XaBAZtMQpiXJ~EVS&f zj$h~Kl2$Hes-7;Atft35%{h{r?Pfh!D0h?wyhMTqih}8YsA6Z9W~fK5rqDdnl`UBi z=?V>Mxlaj-e^Z%N25w0_(w9PoE6= zVa^hF*NQ>q-`LwPzn0!y8GrUodh~WN<5Ai1M+|mMH@$(Mn0iIXC!av%nkB_yIBCKU%{=)jP3MP#Ne*RZnzE#dEuqXiJDbDtNfv#5Y966Qp|7RS zKdv8e{&5?{TbqipR$MvOyw}2vd^3-BW*(a`u-|Tmh^&w{_h=VudfHGPpc!h#=^u(O z7Fk!fm|!Md7948?e=MrJ;J4vhE`znp8{6${-^J?KW{wMRnC+Dh@JrH^xs*;IGK|+qWpNKnhHSq) zrUhQ!xYejAGrmHwk=g(rLK@Z2n3{HaqZ*BCq6_UXt8o-N`g`qeehyH~j&tB$$;jP` z6rX%sFt0`?99NluN6@+@kV!B~zMoyV75&TuMD@;a8UPE9hyrDDPxKoa%(h1u~lv4l4n)ciK7IlJ~NI znAK@1agVIPH`>MxBZ;nW)Sl8*v8c3sUlU{yM~JG1_NJ+iQbC<2j@tOiHxNf{X>qiP z5PFe_qu5T>K0-sPmY8XYZc_PV%{Fyt&YQHdTCYUL zlc@IOV3=mh)UBS`i~&HY3>X7s7Osc&;4oFIKf|j`RN5&$qnA8^tOOS-H&7etX7%^g zt4{xEQ13{+J}L_W8p-r@BVk(q8(pL4H1%UE!w>$Jl|Z_sUneaci|@~K+2pUROa5Aw zXj~uEkgkH7^%AOHeQ8Qc?Yc)hkIG9;B|paCtHaq^4tjB&YUKx*Kp2uf2|P~gF%U*t zb2V%Kp*qX#+*-3i=Vth}_F}E|5XGE#ZrJCJO%iQQ zcZ$ESZ~YI*%v66+iKW#*tz>nEBJT{-r88KM2|5UUL;Ar=t)Nuomx39s1gkHGw+B|J zScUxuq}%^HJtZjz%!7(Db?a@gQ!B}av4^F(iOJR27}v z`90u!=VaE*K&OrN0<9x$>^i>K#M#~1b7y^`C$4`P0A&GSd&7gH>ueIOb2am0`orYT zrqZG=OV8u91j!$2=407WQ(0Y`qMb?SrYt%Pam3D;R&Q`;YFfRH`C~GYN+@Fj-Eyk> zN{kHOHFAK2Y4y7Fv^r+F#osuel(LxL;J?UZSSE-6Ezxu}u7}*IknuH4pKMOuq|+xv z9-U@I_N22tpoLAJTIvnU&8pwf+L9fH6t9Qjpu8}nogD_@gSyn7SfX-N3Qvwu1pN2F z)03lf(LFg$i;+{4t~}k25Tr=SqMFvCfz_iZUV9?rh=V1f8-}~tVv|X}n68{|#w&C8 z%hKxs76OTe?I|H|$LuUSAC?xHz+f24K5!iY9aJzg!DJpj!JY@U!>f!1@RTu2>Y9> zN6B%2o^_HpU84QttH*`oA_O#AH3vub24(1Hby^KY^n6gPzECer%dd!@|JXaeW_NhC zTq_fOJ!0cAqr#aLC{OJlGihAr&?xguzIqi}1+^T_3X;mvvS;bCItS>oY#&ptxzWei zsdtr!`yWd_4wL84(1}Y%=95I8iG}(4jnZs@q z|I5L03qsHUFGFT?wm_XJnT;xVud6}?HA6bPDnw#r_y($wuC&bFYbv(Og3M_S&G>n4 zQQNK1rzhh9a&{?4N+}6)kuSe=FIg-29BCL&q$IY!Y>_+>6ldo6%7IPgKZAWDX(Kx$ za{67i;Q1*RWoQ|?k)5%FADpMIqdoVbL+Ndr`h4m(xio1}h{#D=Z+PgFeV>t?&j%t! zNI%}f>L3ku50a4JyTsD?6Pv_o6XP~zstvNgPnRqG{8VF|I(T~offvIwskzjZuUCXXVh<4yGIDaV11=R!Pbz@cJ} zLx~EWeK(`SPu0jzFgl`-pY%5l+YF=osY4zPO*sy*m>Je7dE)3I+Vt_!U4ixlJM!(x zJG6*+qm$I>F*{Krx3(o+CTCQSj5NWHF5c;FU~vT7z}rO$+=;S&49B`KZuh8idh~16 z7xV|VHG4=iq*tx!x`tWQ$^J*iRAmj5c&oCXfJ;TgBxx{h`V-|N(ewdKo3dD**$v0I z{_gCSaJ!@>2@-SDj>xDYV#`m>% zsf%j#XO?>r$=Wzy7AzdvI0J_^&X@I>W!<)VN9c50N@e!Wv!q!hy(36-ko1ngF<5#> zkby2D%COTDj+bZ+$sQoL?4{y7s5`uRqq#t4*d9~UV-jGr?x)(iVs#D%w?Tu)T~^A8 z0X6^-eHYMEY`|R<&`(uHvIPvp18Go&HkRl}D56rcqUT>Ld51)HYx)zl;{aA?iONV) z=J-Lj+f#Mio;-!#5cp#zdK8Dl(i7I;d`{i}O?f*bkhi=$aOm=Obhf;0r}!psx5E{A zRwI6f%G-7x{84!ua5gP(xBY)d-folG;502_ro82K2;^1fs?`xJ3H^Xezk^@s%mo#MEHm?_w=D4vK&RZ*>9Gmm1^x7?#IJ_lD!&(em(&*j|+?dqiGe6Wwz}dg>;_guHjoii>H79D?9D z!vmFnV{U3cuS?C=@V_oSTLZZhn<<;F;y{45WD^pZu!L7;z#L&{xN>Z$96Fi{rE`8jt%igTE* zX3A)~LMHDyO!Nf+{W$YM;`hVD^ub%-@BN=`U#90A(7uMe1MN#MN9@a(#cSKT#5g40 zIXsaSk2EaRKlu>@9NB8p#{C(uaLPk)1Nmj|jihW0(Jxg6mURTU(M^9GQ^Q& z50%XNuQI}vnF~LAnj7{dUc$eR>FT&gWG%y6J6L|Sv&)V=E^V|(jx}+}N|se_gebwp zNj)=8TUDj(moWvl^`;$7Bpp+144C6q`iMO8Y?c&lX{M?8L} zU#t;F#)~zWuagzb&lAOu$Vs%cDZ5^%t2F6Kt`o7rq*xGty0dsK$w_uPMY;gRk{PGZ z^XQ*+y`IfKx01^R3#y3Zg4HYw2F&55Ra*tZJZ@KZDmg zh-tIHdw23v&VI>wRy)XGe(wA|n9u05+Ce?hBD}5k(+K_+ti8pNdeBH5>E^+ymeg}V z4gE9@YhVridJA-wuS1Aaf+}cmO*may0&4#()nYrow;P`oW)B**UnkGc>b&c_#^A{~#5<2sY^UgT?{E(0t zyL9H23+7}Jo4W|#g)^_66S``_jrH@!&YnMOY3Rz?b3;pmgg#nbdFf@*%V%5~y=3BL zmtXpcP~Z{$_(%V_YU0O5Wd8r3e}n^inH~bK&5;pTJ^^G|cL*ODn*KLF?{qqaN+;9i zck&}cWWLWkU7n%&62b4CPN(F5DIL+r<@>zT^&`{Ge4lqZ9oc=#_o>e3`49Ms`ZwR_ zoo)w=D;z%i-}`)cZXlN|&51egPv^Mj=eV!UasN-}yf{=6I;upzWtvoR==4w-ou>@H zGW>=Q8o~ECewPDB@%;e5EBKD%8{u2cH{A+FUJ1`<&0i>|{ZqdKt}MKE@l2T}$mhyy zZ(Jh3r4I?d{1&|6x6oQL|7yjNu=4UNuM#M->fEd5Un##uarlpnir!cQ|x|vKcjrFXaf4&LChh-=X|Y=k>@#$ZJVa zd8nl5B)%u}J%#T`zNhj%jqm&Uj^aByineS)$#xzX+6!UNRpj-H^P`~0(x$;libWjIn z)VZ|Z%=!)p2)~6t!;7I)Y&;Lb1Zr3Y@1$OadtcEo(#iZ}wzoocHKOeJ(1?=LLnDTs z6B<_ZA-?0`&xL$1$|R+~g&&$`MjOaPDh`!Vu5^EuvSxlN&OGbvbIv{Q{BajlPWWh5 z^kND7ubU6tM;HAS-+v8o92|Wc4_Jer>sh-(vMRAiQU!g)cQQAiPetx%hZH z8xX$MMeh$RWI%ZBD2xA8f$)kCSa_lI+dRC{&<4=27-Iomi~-?w9^P6YKEt(s-Ymes zkZ6MW6v|)B!wcmv5CDbpSK$JpRZ|&Q|6Lyb+XDG(JKG`_%3sAf7QUtc{dNz(wm^8r zxfbBfYyf|2J^bVX@nardQ=tC4&a;SeyNb^M`W53WTpq8<7akFPGoR-RgjbBW@P?rZ z2heY;wD7MN2(PWSaIb~|@natTO+y$#k_=E!C<&!Mn)&k*e z9{x1)kI#VgTjd-RpOGf#284HAZQ=4%6Q6n-5f0`jx=GZtPb{g4ZW@de^X zmRtO%3*@gNZsA`wFd%*6F&`)QLiO?)0UFd%;Y7cAh80{ye>%NBlRf%q{G|4@POb`RGp7J2el z+iDT_(0}rl?>iPgx|clp#c9w_gVOmLiP833$H8C|LZx} zD4$Oj$bXlfs|$tBE6{$+J1qW!0{L6}n1y>W29!VYxP`|Gq~E^7!vA9PxB>Co|I@;6 zGB6-K@=FW2qCj}7hd)*z{rcZn#4i?zU-nxIxVb?1S`T+IHz0qZJr?oX1>(1P_?HXR zZ|(0b;{65cx31U1Wt*DMfb?S?ep!L~?b&A$KVdNk#E-ma;l~uf!QA zC7%J|?H+z-f$+M+EQ&lnmM?y+!~*Ur5Wjqwg^w-}UhCogg~AWF`0o})P@eqPhb{bm z1NPTw>EDW@%;zW18f#|y--JJtgF zl>ET-Ymc+=y9>k*dBuF;@cj8}JDeMN(f%>wlsJKN${6`ey)Xoy+C-ohxZnc z4{dURj88Y^%hx~GUTERd3()WL@Y4;={u-|SE%%A%=a4`7=(kR=D8<9`>krzz;mHeB z`Sc6rQ!M`Dh3e-r3ztj4d0`coyFv~Mn`Qq1JVe$7E7(l<`)8-{tw)4iH zVF4d05Wcp~0zOzEynUtxd_~C*EMMJ~7A|)=^QGT9%K{n-gqQn%W~)XYNWa~~&o2;u zjQNL(Zn`v7w5+VCZ1`a%Ye{P){>Ss}yNPpee9myZP-SV^szDz;(x#(^Cw-^i@g$CZ z^588XAfQ*{X!+=^BW%QHEM1>|^J3J%bhm*Qb3E7o<;B|z-X=M}$ES|p`pKbpI-bKR zcaP)!*!Z2MR}(*M&Cr%1w-w*6EmiQPYsEfmbVWa?pMY*2e3>IgmK(n43lD}b{NDin z+LZ^-x8Q9Duha1wjA}aH?iRd#;FYg3dcJJTi+2oVS>|}V3eeN?gIB)V=!t$&KSB9x zv-u_IF95&w_O~w2I`Fz3?+quLxBkIvTWj=0|EQlJ{mQu3lcXz;fsVSv@LUg>x7@>t z(fWnA&fhuUbvvHxCG*m|0=(FrM$h$=dGS^Vy)PM_>nZc%Z3Zv0!SI%Par5zIH+btE zFVK(Y!`lyD>sO7Q>o4=BJF++w8uxX>dn%XDo)6*kWbpc0-#ULw!K=R8@O)jEH{A{3 zwK|^A*H2Kt?iBy+;B9ieR`<_W-hJSef5XyseP`Zuk72IRzwxchaUpoM-+JqE%m#0h z;~lIVYrt!Byn~fv3wWc%$Sxn(i{>rI9`JfLy>&T?5$5B*V|Z&0!oSnOYjr%=m*!3P za`1W`?}UTUyBWM5$2<8TcpEe5xgIrdy1T$D`>vJ4^{ILBUIDLqv*Ed3H80-r?Cn(i zo8h^BH7{Njc>UiqJlC`4#ajSg?fr)5`qsR7>%i;$cf)hNYhJu<;B`6PHxI(Uz2HsT zX7pSSo0r~jWcXUgiyVaBIpA$_ya@-vy8^r}$8$AV-gH-hH|}A}pX+J!;%x>mB-cjx zxV|);V`JLgp-Zn4Ze(-vF4A1qqdGSULLq0!kc%u$d-pSzgIG#_d^U_-iUjH*j z&-J=_@iu^0|E%G;el;)NcA>Y|@MMhFPaZkB54`s04A1qwdFdU)T5sC(hUa?Uym%La zSHAD9^EVs3O@A^x*8}IJw+6iSmkiJK!FlnvfYSGUhp;rv=VD(mf1ntG~ zL{F@rfPdBLdBo}9wf)8DxxP4W{w@cvQ{ENi<9g$~csGMr{)XX+{x~b$iE*84%6PF6 zy!CGyp6ikG(%S`IUy&wz;9)11ZybCDyrw~h=X&M5^o}16kzs~+8^e#J{~iL~ zIpB?ZpV9lmLHgSj;I$oZc&?w$n?E^@zy6;L&-K)K@iv3kb(-P1zB(`7ZtzMzV0f;# z&WpDnyoxgnPu3<`e0Ha_zme#km&p@>eE!Y-^R=tV;Dss-&-K}P(_ISQw6hJ*_1byy zHh@<#!SGzaofmIAcukIX#X<7754?8AbA5MSddGxAp?Mcux~})mi+3S-J&t$tLDHQK z-ndJQp6kK$(h~zYF~|G%LFjD(ucX@Oxn4Xky*)y2lHs|2JTD$k$A{)!W_YeA&x?0D zcy*5F`trPZmxH(dUyYutXY%6R3|^Pm`r_mI^SpQ)!7I7K@LZ3c7jGAM^)n35_2~of zPKU3rfH!ZJ;fY>dKY@JtSbXT3)GFWf8zYZmK0C+oUC%y%uJn`1;FVovc&=~Hi?dXN)%+z-yOx==e-@w0!+;yX4RDTo0c&-F@KoIG*d{^Wq&tBbZii=^lR& zxo{zPwbvP*>*w>*n+;y4OO0DuHVm#w^8VQ&hT8_ znip>uc&#zR>pKXaUjc8PJWI#N_5OM39glLb?-s*z{eND(D)8osH32@p50Dpc0eH2y z8=mh60SX|%<-li1aAd+TOIF(gWzozdSAA5eLo>@{&s`c?|8nikQZ-1cq)AQbu?_vDE+wi6zB!82^YjeEQ57OV3g17Y>Mo;z~veI?Eoyh48;FW#b@MQlX z3ol2%DEPa;@B4w_%YH-_{=|X$$o=3~+;8~4KarPDvexW=(C~bpA}`)#@XS=lfdjr@ zkr!_%c>UXqp6^@a#oGX0`=f^E`xklfwu85_GQF<5-W9FOA&?nX$NnD0l(?5&SQL61_-WwpfMY&X6nYXk2p9$SvY#j6FTx09^w-aLS~#=cCZ-vs^|2+6U}5n1To4%`pC8A#T~-T-8de8MCktQ|W6DCIp9Nck^16)5HV zGl{+o+yVSEumiZBcn<-;1Z)F}JopyyKM5}-(^B4(D8%Q1!(he&VAV?@l|L`_g+gD% z-2uFl_}>Sv1KtGu0`O{wp9J24J4t2)ZUEj+yw5s(>P7bVaX$c*_Ivd{42=ON0lR>w z0VVy-e>C@3fzrNC20jIRm%ED{?nPMr9RD8!h2DpOLgy@?;GgDjC{XbBQMrQGh7ec_ zJmNXa-x~-Q$>)g(TM4hH@k)Q22fU4PJWOXKXzZsQHWJu^|1LU5C;p!WN`1@(QnayQ z;2Oeb)5xX&t%b<~8-Y&%=eqkshsQeHLt%eG_`Sep;wOLvjeUc{NVzrx{{uK3DE(qT z$WpF7K*{%Z9MXROvI~_P`FRO=D|G%7DDipCSYZuN_;Z27Qym`V@J$kt@b3VH{t}?j z9qI7%6dD$eUFh&5JB?rG0~4h8nH?5>AyCpi8YuLB`D3H^6`;_2eY?eb3D`uuBH(KL zfA_eR=j%XNKK3>stQ@BC)@^H39NN@#NiMBJ*0AJ z4N&5Zare>g{`ZG0{HqRE00nQt{h`ovz&~vF-64)`g`lVS19t*H23!dID~n!|pAVGs_R}~8Z!b{z+~x2Apx`w%8lUf{u}OKCIXu!~*JsTC zM4-?a1QfdW+-Ujv8gLf*`7}`Ioez}o*OwXJp9M<1tAUdLD}h&nejf&Yqo`*p^j!+}C)5b$#ROY5y(ezb@+9{w_!z8Kg_r3xP# z98Pk0qQh6HYzg1x@M{jQcR0o22OaLEQ3(F`9IkTsL7?=z7ilaK{v(Iq0RA)XyMP}D z{(P?S_s!V`?{oM~Dy@_7*}(0T=Uu?bf=}gq4ETANF6Ft#;bjhs>q4PP`2Psz3!Lw8 ztixwMZT@#SoZ@h(!*(i3;x#zj1~Vm{4GwR1cpQyh%Js$+gE8PsxTgb!-%zc|Cf8ytSz z;e}((f86N?`-pTh@xBcl37q8aHy|qMuWtc=!z4rn@5c@w zI?3GcbGV`0+&8|@V6nq-$C>+E?=d*SVcomU{hMP9{_R}`A9nceqs{%{qYVDC%;2BH z2HPFhIy}YU-K7?OCJ?W&uOG>M0pQPoc#XXhDE=RF_kSH>_@f+dJ>1-KHsMd;{iVd< zEQik@X6|7_(B%;RuE7SU4Kn{1iVQAv2wOw@z&jC$*9ozqq0kS=$}(UZupW3Ha31h` zz&hZ+0jB}K0jvey4Xg&X0wcg$;3(jafaO4v9y$WJ6?d7tOMnmJ4!OIZ{62uY4=DJ( z!25CcxVsDZDDF<+Bfxgx!@#Y;ZNN6*We6>uEzqreK_ z1mGxO1ULft5nvhc!@v-bu2$M#9179ZO8bCxt5EN~N$u25PJ`~YwskfvTb4fuXwHSjcG1b8a21V|Gv4FOLA_EDeZz#brV zR@x2xCtxe^1mJq$@xUe^d@NlCq^XzI18M4|H2l6SM2HXOSnE%jGz*V@*fr#|d5x_XG z40sC=9Y81s3;}Nj_Cw@zz&_w-fxW;+U=Q#!z;578z%Jm8z)s*YU_0;z;8x)Ez&79# z;3nW=U@P!C;CkR9;9B6-z$V~)U<`N_5L%(Rz%Te=``S{fwjO-0IPxj z0*nBs0>=R_16Ba107n7AEiDJ~DILL|8ekc4BCrH_2@oK9&C*sX4^|9~IjnOSaais! zl{WLmOBhN>_NC`e21+LV-D*aMjVzq3_0wfAR6CctHYSXI)@R5 z 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%0AVj&5u}!1eZ~+o+7y*!c=1T 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 z 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 QBe6(V*FXc-;Vk(4A3vs~F8}}l literal 0 HcmV?d00001