From 51b2ccaceca9ccf869c6e8c78926d0ba3bdf662e Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sun, 7 Apr 2019 19:39:29 +0200 Subject: [PATCH] Text drawing using FreeType library --- FreeType/freetype.dll | Bin 0 -> 822784 bytes FreeType/freetype.lib | Bin 0 -> 46362 bytes FreeType/include/freetype/config/ftconfig.h | 575 ++ FreeType/include/freetype/config/ftheader.h | 814 +++ FreeType/include/freetype/config/ftmodule.h | 32 + FreeType/include/freetype/config/ftoption.h | 982 ++++ FreeType/include/freetype/config/ftstdlib.h | 175 + FreeType/include/freetype/freetype.h | 4880 +++++++++++++++++ FreeType/include/freetype/ftadvanc.h | 188 + FreeType/include/freetype/ftbbox.h | 102 + FreeType/include/freetype/ftbdf.h | 213 + FreeType/include/freetype/ftbitmap.h | 330 ++ FreeType/include/freetype/ftbzip2.h | 102 + FreeType/include/freetype/ftcache.h | 1088 ++++ FreeType/include/freetype/ftchapters.h | 145 + FreeType/include/freetype/ftcid.h | 168 + FreeType/include/freetype/ftcolor.h | 311 ++ FreeType/include/freetype/ftdriver.h | 1232 +++++ FreeType/include/freetype/fterrdef.h | 279 + FreeType/include/freetype/fterrors.h | 285 + FreeType/include/freetype/ftfntfmt.h | 94 + FreeType/include/freetype/ftgasp.h | 144 + FreeType/include/freetype/ftglyph.h | 665 +++ FreeType/include/freetype/ftgxval.h | 355 ++ FreeType/include/freetype/ftgzip.h | 151 + FreeType/include/freetype/ftimage.h | 1240 +++++ FreeType/include/freetype/ftincrem.h | 344 ++ FreeType/include/freetype/ftlcdfil.h | 328 ++ FreeType/include/freetype/ftlist.h | 297 + FreeType/include/freetype/ftlzw.h | 100 + FreeType/include/freetype/ftmac.h | 290 + FreeType/include/freetype/ftmm.h | 753 +++ FreeType/include/freetype/ftmodapi.h | 785 +++ FreeType/include/freetype/ftmoderr.h | 203 + FreeType/include/freetype/ftotval.h | 207 + FreeType/include/freetype/ftoutln.h | 593 ++ FreeType/include/freetype/ftparams.h | 204 + FreeType/include/freetype/ftpfr.h | 180 + FreeType/include/freetype/ftrender.h | 245 + FreeType/include/freetype/ftsizes.h | 160 + FreeType/include/freetype/ftsnames.h | 273 + FreeType/include/freetype/ftstroke.h | 772 +++ FreeType/include/freetype/ftsynth.h | 84 + FreeType/include/freetype/ftsystem.h | 353 ++ FreeType/include/freetype/fttrigon.h | 350 ++ FreeType/include/freetype/fttypes.h | 615 +++ FreeType/include/freetype/ftwinfnt.h | 277 + FreeType/include/freetype/internal/autohint.h | 232 + .../include/freetype/internal/cffotypes.h | 108 + FreeType/include/freetype/internal/cfftypes.h | 417 ++ FreeType/include/freetype/internal/ftcalc.h | 510 ++ FreeType/include/freetype/internal/ftdebug.h | 283 + FreeType/include/freetype/internal/ftdrv.h | 288 + FreeType/include/freetype/internal/ftgloadr.h | 149 + FreeType/include/freetype/internal/fthash.h | 136 + FreeType/include/freetype/internal/ftmemory.h | 392 ++ FreeType/include/freetype/internal/ftobjs.h | 1236 +++++ FreeType/include/freetype/internal/ftpsprop.h | 48 + FreeType/include/freetype/internal/ftrfork.h | 246 + FreeType/include/freetype/internal/ftserv.h | 521 ++ FreeType/include/freetype/internal/ftstream.h | 561 ++ FreeType/include/freetype/internal/fttrace.h | 156 + FreeType/include/freetype/internal/ftvalid.h | 159 + FreeType/include/freetype/internal/internal.h | 66 + FreeType/include/freetype/internal/psaux.h | 1439 +++++ FreeType/include/freetype/internal/pshints.h | 700 +++ .../freetype/internal/services/svbdf.h | 66 + .../freetype/internal/services/svcfftl.h | 90 + .../freetype/internal/services/svcid.h | 69 + .../freetype/internal/services/svfntfmt.h | 55 + .../freetype/internal/services/svgldict.h | 72 + .../freetype/internal/services/svgxval.h | 72 + .../freetype/internal/services/svkern.h | 51 + .../freetype/internal/services/svmetric.h | 125 + .../include/freetype/internal/services/svmm.h | 156 + .../freetype/internal/services/svotval.h | 55 + .../freetype/internal/services/svpfr.h | 66 + .../freetype/internal/services/svpostnm.h | 65 + .../freetype/internal/services/svprop.h | 66 + .../freetype/internal/services/svpscmap.h | 145 + .../freetype/internal/services/svpsinfo.h | 86 + .../freetype/internal/services/svsfnt.h | 88 + .../freetype/internal/services/svttcmap.h | 90 + .../freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 56 + .../freetype/internal/services/svwinfnt.h | 50 + FreeType/include/freetype/internal/sfnt.h | 875 +++ FreeType/include/freetype/internal/t1types.h | 260 + FreeType/include/freetype/internal/tttypes.h | 1854 +++++++ FreeType/include/freetype/t1tables.h | 774 +++ FreeType/include/freetype/ttnameid.h | 1236 +++++ FreeType/include/freetype/tttables.h | 856 +++ FreeType/include/freetype/tttags.h | 123 + FreeType/include/ft2build.h | 44 + PdfForQt.pro | 2 +- PdfForQtLib/PdfForQtLib.pro | 14 + PdfForQtLib/sources/pdffont.cpp | 279 +- PdfForQtLib/sources/pdffont.h | 57 +- .../sources/pdfpagecontentprocessor.cpp | 197 +- PdfForQtLib/sources/pdfpagecontentprocessor.h | 28 +- 100 files changed, 37664 insertions(+), 121 deletions(-) create mode 100644 FreeType/freetype.dll create mode 100644 FreeType/freetype.lib create mode 100644 FreeType/include/freetype/config/ftconfig.h create mode 100644 FreeType/include/freetype/config/ftheader.h create mode 100644 FreeType/include/freetype/config/ftmodule.h create mode 100644 FreeType/include/freetype/config/ftoption.h create mode 100644 FreeType/include/freetype/config/ftstdlib.h create mode 100644 FreeType/include/freetype/freetype.h create mode 100644 FreeType/include/freetype/ftadvanc.h create mode 100644 FreeType/include/freetype/ftbbox.h create mode 100644 FreeType/include/freetype/ftbdf.h create mode 100644 FreeType/include/freetype/ftbitmap.h create mode 100644 FreeType/include/freetype/ftbzip2.h create mode 100644 FreeType/include/freetype/ftcache.h create mode 100644 FreeType/include/freetype/ftchapters.h create mode 100644 FreeType/include/freetype/ftcid.h create mode 100644 FreeType/include/freetype/ftcolor.h create mode 100644 FreeType/include/freetype/ftdriver.h create mode 100644 FreeType/include/freetype/fterrdef.h create mode 100644 FreeType/include/freetype/fterrors.h create mode 100644 FreeType/include/freetype/ftfntfmt.h create mode 100644 FreeType/include/freetype/ftgasp.h create mode 100644 FreeType/include/freetype/ftglyph.h create mode 100644 FreeType/include/freetype/ftgxval.h create mode 100644 FreeType/include/freetype/ftgzip.h create mode 100644 FreeType/include/freetype/ftimage.h create mode 100644 FreeType/include/freetype/ftincrem.h create mode 100644 FreeType/include/freetype/ftlcdfil.h create mode 100644 FreeType/include/freetype/ftlist.h create mode 100644 FreeType/include/freetype/ftlzw.h create mode 100644 FreeType/include/freetype/ftmac.h create mode 100644 FreeType/include/freetype/ftmm.h create mode 100644 FreeType/include/freetype/ftmodapi.h create mode 100644 FreeType/include/freetype/ftmoderr.h create mode 100644 FreeType/include/freetype/ftotval.h create mode 100644 FreeType/include/freetype/ftoutln.h create mode 100644 FreeType/include/freetype/ftparams.h create mode 100644 FreeType/include/freetype/ftpfr.h create mode 100644 FreeType/include/freetype/ftrender.h create mode 100644 FreeType/include/freetype/ftsizes.h create mode 100644 FreeType/include/freetype/ftsnames.h create mode 100644 FreeType/include/freetype/ftstroke.h create mode 100644 FreeType/include/freetype/ftsynth.h create mode 100644 FreeType/include/freetype/ftsystem.h create mode 100644 FreeType/include/freetype/fttrigon.h create mode 100644 FreeType/include/freetype/fttypes.h create mode 100644 FreeType/include/freetype/ftwinfnt.h create mode 100644 FreeType/include/freetype/internal/autohint.h create mode 100644 FreeType/include/freetype/internal/cffotypes.h create mode 100644 FreeType/include/freetype/internal/cfftypes.h create mode 100644 FreeType/include/freetype/internal/ftcalc.h create mode 100644 FreeType/include/freetype/internal/ftdebug.h create mode 100644 FreeType/include/freetype/internal/ftdrv.h create mode 100644 FreeType/include/freetype/internal/ftgloadr.h create mode 100644 FreeType/include/freetype/internal/fthash.h create mode 100644 FreeType/include/freetype/internal/ftmemory.h create mode 100644 FreeType/include/freetype/internal/ftobjs.h create mode 100644 FreeType/include/freetype/internal/ftpsprop.h create mode 100644 FreeType/include/freetype/internal/ftrfork.h create mode 100644 FreeType/include/freetype/internal/ftserv.h create mode 100644 FreeType/include/freetype/internal/ftstream.h create mode 100644 FreeType/include/freetype/internal/fttrace.h create mode 100644 FreeType/include/freetype/internal/ftvalid.h create mode 100644 FreeType/include/freetype/internal/internal.h create mode 100644 FreeType/include/freetype/internal/psaux.h create mode 100644 FreeType/include/freetype/internal/pshints.h create mode 100644 FreeType/include/freetype/internal/services/svbdf.h create mode 100644 FreeType/include/freetype/internal/services/svcfftl.h create mode 100644 FreeType/include/freetype/internal/services/svcid.h create mode 100644 FreeType/include/freetype/internal/services/svfntfmt.h create mode 100644 FreeType/include/freetype/internal/services/svgldict.h create mode 100644 FreeType/include/freetype/internal/services/svgxval.h create mode 100644 FreeType/include/freetype/internal/services/svkern.h create mode 100644 FreeType/include/freetype/internal/services/svmetric.h create mode 100644 FreeType/include/freetype/internal/services/svmm.h create mode 100644 FreeType/include/freetype/internal/services/svotval.h create mode 100644 FreeType/include/freetype/internal/services/svpfr.h create mode 100644 FreeType/include/freetype/internal/services/svpostnm.h create mode 100644 FreeType/include/freetype/internal/services/svprop.h create mode 100644 FreeType/include/freetype/internal/services/svpscmap.h create mode 100644 FreeType/include/freetype/internal/services/svpsinfo.h create mode 100644 FreeType/include/freetype/internal/services/svsfnt.h create mode 100644 FreeType/include/freetype/internal/services/svttcmap.h create mode 100644 FreeType/include/freetype/internal/services/svtteng.h create mode 100644 FreeType/include/freetype/internal/services/svttglyf.h create mode 100644 FreeType/include/freetype/internal/services/svwinfnt.h create mode 100644 FreeType/include/freetype/internal/sfnt.h create mode 100644 FreeType/include/freetype/internal/t1types.h create mode 100644 FreeType/include/freetype/internal/tttypes.h create mode 100644 FreeType/include/freetype/t1tables.h create mode 100644 FreeType/include/freetype/ttnameid.h create mode 100644 FreeType/include/freetype/tttables.h create mode 100644 FreeType/include/freetype/tttags.h create mode 100644 FreeType/include/ft2build.h diff --git a/FreeType/freetype.dll b/FreeType/freetype.dll new file mode 100644 index 0000000000000000000000000000000000000000..06c8dc8dab5788bc18d76f273c67e5d435f5c2e2 GIT binary patch literal 822784 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­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

GIJ5a9bxWP;+VKcs_(*vZTbm#9zcO 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%0Aq2WQ$^ul$#QA6K_D5wHb~_LHZ;E&$ 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 literal 0 HcmV?d00001 diff --git a/FreeType/freetype.lib b/FreeType/freetype.lib new file mode 100644 index 0000000000000000000000000000000000000000..de77825c1680bf0264adfd9ad2e26d7dbf31fada GIT binary patch literal 46362 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 N*kIYa_Z7?`{{wa5`, and contains + * system-specific files that are always included first when building the + * library. + * + * This ANSI version should stay in `include/config/`. + * + */ + +#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. + * + */ + + + /* 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 + + + /* 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 + + + /* `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 == ( 32 / FT_CHAR_BIT ) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) + + 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 >= ( 32 / FT_CHAR_BIT ) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) + + 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 == ( 64 / FT_CHAR_BIT ) + + /* `FT_LONG64` must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long +#define FT_UINT64 unsigned long + + /************************************************************************** + * + * 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 == (64 / FT_CHAR_BIT) */ + +#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/FreeType/include/freetype/config/ftheader.h b/FreeType/include/freetype/config/ftheader.h new file mode 100644 index 0000000..696d6ba --- /dev/null +++ b/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/FreeType/include/freetype/config/ftmodule.h b/FreeType/include/freetype/config/ftmodule.h new file mode 100644 index 0000000..7c603e5 --- /dev/null +++ b/FreeType/include/freetype/config/ftmodule.h @@ -0,0 +1,32 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/`) based on information + * from `/modules.cfg`. + * + * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +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_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_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_Module_Class, sfnt_module_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_Driver_ClassRec, bdf_driver_class ) + +/* EOF */ diff --git a/FreeType/include/freetype/config/ftoption.h b/FreeType/include/freetype/config/ftoption.h new file mode 100644 index 0000000..12f47a8 --- /dev/null +++ b/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. + */ +/* #define 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/FreeType/include/freetype/config/ftstdlib.h b/FreeType/include/freetype/config/ftstdlib.h new file mode 100644 index 0000000..438b614 --- /dev/null +++ b/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/FreeType/include/freetype/freetype.h b/FreeType/include/freetype/freetype.h new file mode 100644 index 0000000..f758ea1 --- /dev/null +++ b/FreeType/include/freetype/freetype.h @@ -0,0 +1,4880 @@ +/**************************************************************************** + * + * 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. + * + * 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 0 + + + /************************************************************************** + * + * @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/FreeType/include/freetype/ftadvanc.h b/FreeType/include/freetype/ftadvanc.h new file mode 100644 index 0000000..95c38f9 --- /dev/null +++ b/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/FreeType/include/freetype/ftbbox.h b/FreeType/include/freetype/ftbbox.h new file mode 100644 index 0000000..22da70c --- /dev/null +++ b/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/FreeType/include/freetype/ftbdf.h b/FreeType/include/freetype/ftbdf.h new file mode 100644 index 0000000..1c46da5 --- /dev/null +++ b/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/FreeType/include/freetype/ftbitmap.h b/FreeType/include/freetype/ftbitmap.h new file mode 100644 index 0000000..a6acdb9 --- /dev/null +++ b/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/FreeType/include/freetype/ftbzip2.h b/FreeType/include/freetype/ftbzip2.h new file mode 100644 index 0000000..ae88cfd --- /dev/null +++ b/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/FreeType/include/freetype/ftcache.h b/FreeType/include/freetype/ftcache.h new file mode 100644 index 0000000..0d589d0 --- /dev/null +++ b/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/FreeType/include/freetype/ftchapters.h b/FreeType/include/freetype/ftchapters.h new file mode 100644 index 0000000..2ee2697 --- /dev/null +++ b/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/FreeType/include/freetype/ftcid.h b/FreeType/include/freetype/ftcid.h new file mode 100644 index 0000000..8eafc1c --- /dev/null +++ b/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/FreeType/include/freetype/ftcolor.h b/FreeType/include/freetype/ftcolor.h new file mode 100644 index 0000000..cf18021 --- /dev/null +++ b/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/FreeType/include/freetype/ftdriver.h b/FreeType/include/freetype/ftdriver.h new file mode 100644 index 0000000..497bde9 --- /dev/null +++ b/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/FreeType/include/freetype/fterrdef.h b/FreeType/include/freetype/fterrdef.h new file mode 100644 index 0000000..9bc7dc6 --- /dev/null +++ b/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/FreeType/include/freetype/fterrors.h b/FreeType/include/freetype/fterrors.h new file mode 100644 index 0000000..58f5a3e --- /dev/null +++ b/FreeType/include/freetype/fterrors.h @@ -0,0 +1,285 @@ +/**************************************************************************** + * + * 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 + + + /************************************************************************** + * + * @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 ); + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/FreeType/include/freetype/ftfntfmt.h b/FreeType/include/freetype/ftfntfmt.h new file mode 100644 index 0000000..aae0b13 --- /dev/null +++ b/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/FreeType/include/freetype/ftgasp.h b/FreeType/include/freetype/ftgasp.h new file mode 100644 index 0000000..24673d8 --- /dev/null +++ b/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/FreeType/include/freetype/ftglyph.h b/FreeType/include/freetype/ftglyph.h new file mode 100644 index 0000000..4067c2e --- /dev/null +++ b/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/FreeType/include/freetype/ftgxval.h b/FreeType/include/freetype/ftgxval.h new file mode 100644 index 0000000..b14f637 --- /dev/null +++ b/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/FreeType/include/freetype/ftgzip.h b/FreeType/include/freetype/ftgzip.h new file mode 100644 index 0000000..418c612 --- /dev/null +++ b/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/FreeType/include/freetype/ftimage.h b/FreeType/include/freetype/ftimage.h new file mode 100644 index 0000000..d640b0b --- /dev/null +++ b/FreeType/include/freetype/ftimage.h @@ -0,0 +1,1240 @@ +/**************************************************************************** + * + * 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 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. + * + * 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. + * + * Note that by default, the glyph bitmap is clipped to the target + * pixmap, except in direct rendering mode where all spans are + * generated if no clipping box is set. + */ +#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 arguments used by a raster's render function. + * + * @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/FreeType/include/freetype/ftincrem.h b/FreeType/include/freetype/ftincrem.h new file mode 100644 index 0000000..a4db02b --- /dev/null +++ b/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/FreeType/include/freetype/ftlcdfil.h b/FreeType/include/freetype/ftlcdfil.h new file mode 100644 index 0000000..3a19d04 --- /dev/null +++ b/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/FreeType/include/freetype/ftlist.h b/FreeType/include/freetype/ftlist.h new file mode 100644 index 0000000..4782892 --- /dev/null +++ b/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/FreeType/include/freetype/ftlzw.h b/FreeType/include/freetype/ftlzw.h new file mode 100644 index 0000000..fd22968 --- /dev/null +++ b/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/FreeType/include/freetype/ftmac.h b/FreeType/include/freetype/ftmac.h new file mode 100644 index 0000000..92b9f3d --- /dev/null +++ b/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/FreeType/include/freetype/ftmm.h b/FreeType/include/freetype/ftmm.h new file mode 100644 index 0000000..f2e16b6 --- /dev/null +++ b/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/FreeType/include/freetype/ftmodapi.h b/FreeType/include/freetype/ftmodapi.h new file mode 100644 index 0000000..88488bf --- /dev/null +++ b/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 void + (*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/FreeType/include/freetype/ftmoderr.h b/FreeType/include/freetype/ftmoderr.h new file mode 100644 index 0000000..e169935 --- /dev/null +++ b/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/FreeType/include/freetype/ftotval.h b/FreeType/include/freetype/ftotval.h new file mode 100644 index 0000000..c034f48 --- /dev/null +++ b/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/FreeType/include/freetype/ftoutln.h b/FreeType/include/freetype/ftoutln.h new file mode 100644 index 0000000..75c3d01 --- /dev/null +++ b/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. + * This function uses an @FT_Raster_Params structure as an argument, + * allowing advanced features like direct composition, translucency, etc. + * + * @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: + * You should know what you are doing and how @FT_Raster_Params works to + * use this function. + * + * 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/FreeType/include/freetype/ftparams.h b/FreeType/include/freetype/ftparams.h new file mode 100644 index 0000000..c374ee2 --- /dev/null +++ b/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/FreeType/include/freetype/ftpfr.h b/FreeType/include/freetype/ftpfr.h new file mode 100644 index 0000000..b4eca76 --- /dev/null +++ b/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/FreeType/include/freetype/ftrender.h b/FreeType/include/freetype/ftrender.h new file mode 100644 index 0000000..a01c774 --- /dev/null +++ b/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/FreeType/include/freetype/ftsizes.h b/FreeType/include/freetype/ftsizes.h new file mode 100644 index 0000000..6c63cef --- /dev/null +++ b/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/FreeType/include/freetype/ftsnames.h b/FreeType/include/freetype/ftsnames.h new file mode 100644 index 0000000..4d43602 --- /dev/null +++ b/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/FreeType/include/freetype/ftstroke.h b/FreeType/include/freetype/ftstroke.h new file mode 100644 index 0000000..01a9c18 --- /dev/null +++ b/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/FreeType/include/freetype/ftsynth.h b/FreeType/include/freetype/ftsynth.h new file mode 100644 index 0000000..8754f97 --- /dev/null +++ b/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/FreeType/include/freetype/ftsystem.h b/FreeType/include/freetype/ftsystem.h new file mode 100644 index 0000000..889a6ba --- /dev/null +++ b/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/FreeType/include/freetype/fttrigon.h b/FreeType/include/freetype/fttrigon.h new file mode 100644 index 0000000..37e1412 --- /dev/null +++ b/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/FreeType/include/freetype/fttypes.h b/FreeType/include/freetype/fttypes.h new file mode 100644 index 0000000..1057150 --- /dev/null +++ b/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/FreeType/include/freetype/ftwinfnt.h b/FreeType/include/freetype/ftwinfnt.h new file mode 100644 index 0000000..3437913 --- /dev/null +++ b/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/FreeType/include/freetype/internal/autohint.h b/FreeType/include/freetype/internal/autohint.h new file mode 100644 index 0000000..f64c28b --- /dev/null +++ b/FreeType/include/freetype/internal/autohint.h @@ -0,0 +1,232 @@ +/**************************************************************************** + * + * autohint.h + * + * High-level 'autohint' module-specific 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. + * + */ + + + /************************************************************************** + * + * The auto-hinter is used to load and automatically hint glyphs if a + * format-specific hinter isn't available. + * + */ + + +#ifndef AUTOHINT_H_ +#define AUTOHINT_H_ + + + /************************************************************************** + * + * A small technical note regarding automatic hinting in order to clarify + * this module interface. + * + * An automatic hinter might compute two kinds of data for a given face: + * + * - global hints: Usually some metrics that describe global properties + * of the face. It is computed by scanning more or less + * aggressively the glyphs in the face, and thus can be + * very slow to compute (even if the size of global hints + * is really small). + * + * - glyph hints: These describe some important features of the glyph + * outline, as well as how to align them. They are + * generally much faster to compute than global hints. + * + * The current FreeType auto-hinter does a pretty good job while performing + * fast computations for both global and glyph hints. However, we might be + * interested in introducing more complex and powerful algorithms in the + * future, like the one described in the John D. Hobby paper, which + * unfortunately requires a lot more horsepower. + * + * Because a sufficiently sophisticated font management system would + * typically implement an LRU cache of opened face objects to reduce memory + * usage, it is a good idea to be able to avoid recomputing global hints + * every time the same face is re-opened. + * + * We thus provide the ability to cache global hints outside of the face + * object, in order to speed up font re-opening time. Of course, this + * feature is purely optional, so most client programs won't even notice + * it. + * + * I initially thought that it would be a good idea to cache the glyph + * hints too. However, my general idea now is that if you really need to + * cache these too, you are simply in need of a new font format, where all + * this information could be stored within the font file and decoded on the + * fly. + * + */ + + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalGetFunc + * + * @description: + * Retrieve the global hints computed for a given face object. The + * resulting data is dissociated from the face and will survive a call to + * FT_Done_Face(). It must be discarded through the API + * FT_AutoHinter_GlobalDoneFunc(). + * + * @input: + * hinter :: + * A handle to the source auto-hinter. + * + * face :: + * A handle to the source face object. + * + * @output: + * global_hints :: + * A typeless pointer to the global hints. + * + * global_len :: + * The size in bytes of the global hints. + */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalDoneFunc + * + * @description: + * Discard the global hints retrieved through + * FT_AutoHinter_GlobalGetFunc(). This is the only way these hints are + * freed from memory. + * + * @input: + * hinter :: + * A handle to the auto-hinter module. + * + * global :: + * A pointer to retrieved global hints to discard. + */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalResetFunc + * + * @description: + * This function is used to recompute the global metrics in a given font. + * This is useful when global font data changes (e.g. Multiple Masters + * fonts where blend coordinates change). + * + * @input: + * hinter :: + * A handle to the source auto-hinter. + * + * face :: + * A handle to the face. + */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlyphLoadFunc + * + * @description: + * This function is used to load, scale, and automatically hint a glyph + * from a given face. + * + * @input: + * face :: + * A handle to the face. + * + * glyph_index :: + * The glyph index. + * + * load_flags :: + * The load flags. + * + * @note: + * This function is capable of loading composite glyphs by hinting each + * sub-glyph independently (which improves quality). + * + * It will call the font driver with @FT_Load_Glyph, with + * @FT_LOAD_NO_SCALE set. + */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @struct: + * FT_AutoHinter_InterfaceRec + * + * @description: + * The auto-hinter module's interface. + */ + typedef struct FT_AutoHinter_InterfaceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; + + +#define FT_DEFINE_AUTOHINTER_INTERFACE( \ + class_, \ + reset_face_, \ + get_global_hints_, \ + done_global_hints_, \ + load_glyph_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_AutoHinter_InterfaceRec class_ = \ + { \ + reset_face_, \ + get_global_hints_, \ + done_global_hints_, \ + load_glyph_ \ + }; + + +FT_END_HEADER + +#endif /* AUTOHINT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/cffotypes.h b/FreeType/include/freetype/internal/cffotypes.h new file mode 100644 index 0000000..b26893e --- /dev/null +++ b/FreeType/include/freetype/internal/cffotypes.h @@ -0,0 +1,108 @@ +/**************************************************************************** + * + * cffotypes.h + * + * Basic OpenType/CFF object type definitions (specification). + * + * 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 CFFOTYPES_H_ +#define CFFOTYPES_H_ + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_CFF_TYPES_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + typedef TT_Face CFF_Face; + + + /************************************************************************** + * + * @type: + * CFF_Size + * + * @description: + * A handle to an OpenType size object. + */ + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + + } CFF_SizeRec, *CFF_Size; + + + /************************************************************************** + * + * @type: + * CFF_GlyphSlot + * + * @description: + * A handle to an OpenType glyph slot object. + */ + typedef struct CFF_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CFF_GlyphSlotRec, *CFF_GlyphSlot; + + + /************************************************************************** + * + * @type: + * CFF_Internal + * + * @description: + * The interface to the 'internal' field of `FT_Size`. + */ + typedef struct CFF_InternalRec_ + { + PSH_Globals topfont; + PSH_Globals subfonts[CFF_MAX_CID_FONTS]; + + } CFF_InternalRec, *CFF_Internal; + + + /************************************************************************** + * + * Subglyph transformation record. + */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + +FT_END_HEADER + + +#endif /* CFFOTYPES_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/cfftypes.h b/FreeType/include/freetype/internal/cfftypes.h new file mode 100644 index 0000000..2fc905e --- /dev/null +++ b/FreeType/include/freetype/internal/cfftypes.h @@ -0,0 +1,417 @@ +/**************************************************************************** + * + * cfftypes.h + * + * Basic OpenType/CFF type 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 CFFTYPES_H_ +#define CFFTYPES_H_ + + +#include +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * CFF_IndexRec + * + * @description: + * A structure used to model a CFF Index table. + * + * @fields: + * stream :: + * The source input stream. + * + * start :: + * The position of the first index byte in the input stream. + * + * count :: + * The number of elements in the index. + * + * off_size :: + * The size in bytes of object offsets in index. + * + * data_offset :: + * The position of first data byte in the index's bytes. + * + * data_size :: + * The size of the data table in this index. + * + * offsets :: + * A table of element offsets in the index. Must be loaded explicitly. + * + * bytes :: + * If the index is loaded in memory, its bytes. + */ + typedef struct CFF_IndexRec_ + { + FT_Stream stream; + FT_ULong start; + FT_UInt hdr_size; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + FT_ULong data_size; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_IndexRec, *CFF_Index; + + + typedef struct CFF_EncodingRec_ + { + FT_UInt format; + FT_ULong offset; + + FT_UInt count; + FT_UShort sids [256]; /* avoid dynamic allocations */ + FT_UShort codes[256]; + + } CFF_EncodingRec, *CFF_Encoding; + + + typedef struct CFF_CharsetRec_ + { + + FT_UInt format; + FT_ULong offset; + + FT_UShort* sids; + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ + FT_UInt max_cid; + FT_UInt num_glyphs; + + } CFF_CharsetRec, *CFF_Charset; + + + /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */ + + typedef struct CFF_VarData_ + { +#if 0 + FT_UInt itemCount; /* not used; always zero */ + FT_UInt shortDeltaCount; /* not used; always zero */ +#endif + + FT_UInt regionIdxCount; /* number of region indexes */ + FT_UInt* regionIndices; /* array of `regionIdxCount' indices; */ + /* these index `varRegionList' */ + } CFF_VarData; + + + /* contribution of one axis to a region */ + typedef struct CFF_AxisCoords_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero peak means no effect (factor = 1) */ + FT_Fixed endCoord; + + } CFF_AxisCoords; + + + typedef struct CFF_VarRegion_ + { + CFF_AxisCoords* axisList; /* array of axisCount records */ + + } CFF_VarRegion; + + + typedef struct CFF_VStoreRec_ + { + FT_UInt dataCount; + CFF_VarData* varData; /* array of dataCount records */ + /* vsindex indexes this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + CFF_VarRegion* varRegionList; + + } CFF_VStoreRec, *CFF_VStore; + + + /* forward reference */ + typedef struct CFF_FontRec_* CFF_Font; + + + /* This object manages one cached blend vector. */ + /* */ + /* There is a BlendRec for Private DICT parsing in each subfont */ + /* and a BlendRec for charstrings in CF2_Font instance data. */ + /* A cached BV may be used across DICTs or Charstrings if inputs */ + /* have not changed. */ + /* */ + /* `usedBV' is reset at the start of each parse or charstring. */ + /* vsindex cannot be changed after a BV is used. */ + /* */ + /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32). */ + typedef struct CFF_BlendRec_ + { + FT_Bool builtBV; /* blendV has been built */ + FT_Bool usedBV; /* blendV has been used */ + CFF_Font font; /* top level font struct */ + FT_UInt lastVsindex; /* last vsindex used */ + FT_UInt lenNDV; /* normDV length (aka numAxes) */ + FT_Fixed* lastNDV; /* last NDV used */ + FT_UInt lenBV; /* BlendV length (aka numMasters) */ + FT_Int32* BV; /* current blendV (per DICT/glyph) */ + + } CFF_BlendRec, *CFF_Blend; + + + typedef struct CFF_FontRecDictRec_ + { + FT_UInt version; + FT_UInt notice; + FT_UInt copyright; + FT_UInt full_name; + FT_UInt family_name; + FT_UInt weight; + FT_Bool is_fixed_pitch; + FT_Fixed italic_angle; + FT_Fixed underline_position; + FT_Fixed underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + FT_Bool has_font_matrix; + FT_ULong units_per_em; /* temporarily used as scaling value also */ + FT_Vector font_offset; + FT_ULong unique_id; + FT_BBox font_bbox; + FT_Pos stroke_width; + FT_ULong charset_offset; + FT_ULong encoding_offset; + FT_ULong charstrings_offset; + FT_ULong private_offset; + FT_ULong private_size; + FT_Long synthetic_base; + FT_UInt embedded_postscript; + + /* these should only be used for the top-level font dictionary */ + FT_UInt cid_registry; + FT_UInt cid_ordering; + FT_Long cid_supplement; + + FT_Long cid_font_version; + FT_Long cid_font_revision; + FT_Long cid_font_type; + FT_ULong cid_count; + FT_ULong cid_uid_base; + FT_ULong cid_fd_array_offset; + FT_ULong cid_fd_select_offset; + FT_UInt cid_font_name; + + /* the next fields come from the data of the deprecated */ + /* `MultipleMaster' operator; they are needed to parse the (also */ + /* deprecated) `blend' operator in Type 2 charstrings */ + FT_UShort num_designs; + FT_UShort num_axes; + + /* fields for CFF2 */ + FT_ULong vstore_offset; + FT_UInt maxstack; + + } CFF_FontRecDictRec, *CFF_FontRecDict; + + + /* forward reference */ + typedef struct CFF_SubFontRec_* CFF_SubFont; + + + typedef struct CFF_PrivateRec_ + { + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Pos blue_values[14]; + FT_Pos other_blues[10]; + FT_Pos family_blues[14]; + FT_Pos family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Pos blue_shift; + FT_Pos blue_fuzz; + FT_Pos standard_width; + FT_Pos standard_height; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Pos snap_widths[13]; + FT_Pos snap_heights[13]; + FT_Bool force_bold; + FT_Fixed force_bold_threshold; + FT_Int lenIV; + FT_Int language_group; + FT_Fixed expansion_factor; + FT_Long initial_random_seed; + FT_ULong local_subrs_offset; + FT_Pos default_width; + FT_Pos nominal_width; + + /* fields for CFF2 */ + FT_UInt vsindex; + CFF_SubFont subfont; + + } CFF_PrivateRec, *CFF_Private; + + + typedef struct CFF_FDSelectRec_ + { + FT_Byte format; + FT_UInt range_count; + + /* that's the table, taken from the file `as is' */ + FT_Byte* data; + FT_UInt data_size; + + /* small cache for format 3 only */ + FT_UInt cache_first; + FT_UInt cache_count; + FT_Byte cache_fd; + + } CFF_FDSelectRec, *CFF_FDSelect; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFontRec_ + { + CFF_FontRecDictRec font_dict; + CFF_PrivateRec private_dict; + + /* fields for CFF2 */ + CFF_BlendRec blend; /* current blend vector */ + FT_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + + /* `blend_stack' is a writable buffer to hold blend results. */ + /* This buffer is to the side of the normal cff parser stack; */ + /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */ + /* The normal stack then points to these values instead of the DICT */ + /* because all other operators in Private DICT clear the stack. */ + /* `blend_stack' could be cleared at each operator other than blend. */ + /* Blended values are stored as 5-byte fixed point values. */ + + FT_Byte* blend_stack; /* base of stack allocation */ + FT_Byte* blend_top; /* first empty slot */ + FT_UInt blend_used; /* number of bytes in use */ + FT_UInt blend_alloc; /* number of bytes allocated */ + + CFF_IndexRec local_subrs_index; + FT_Byte** local_subrs; /* array of pointers */ + /* into Local Subrs INDEX data */ + + FT_UInt32 random; + + } CFF_SubFontRec; + + +#define CFF_MAX_CID_FONTS 256 + + + typedef struct CFF_FontRec_ + { + FT_Library library; + FT_Stream stream; + FT_Memory memory; /* TODO: take this from stream->memory? */ + FT_ULong base_offset; /* offset to start of CFF */ + FT_UInt num_faces; + FT_UInt num_glyphs; + + FT_Byte version_major; + FT_Byte version_minor; + FT_Byte header_size; + + FT_UInt top_dict_length; /* cff2 only */ + + FT_Bool cff2; + + CFF_IndexRec name_index; + CFF_IndexRec top_dict_index; + CFF_IndexRec global_subrs_index; + + CFF_EncodingRec encoding; + CFF_CharsetRec charset; + + CFF_IndexRec charstrings_index; + CFF_IndexRec font_dict_index; + CFF_IndexRec private_index; + CFF_IndexRec local_subrs_index; + + FT_String* font_name; + + /* array of pointers into Global Subrs INDEX data */ + FT_Byte** global_subrs; + + /* array of pointers into String INDEX data stored at string_pool */ + FT_UInt num_strings; + FT_Byte** strings; + FT_Byte* string_pool; + FT_ULong string_pool_size; + + CFF_SubFontRec top_font; + FT_UInt num_subfonts; + CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; + + CFF_FDSelectRec fd_select; + + /* interface to PostScript hinter */ + PSHinter_Service pshinter; + + /* interface to Postscript Names service */ + FT_Service_PsCMaps psnames; + + /* interface to CFFLoad service */ + const void* cffload; + + /* since version 2.3.0 */ + PS_FontInfoRec* font_info; /* font info dictionary */ + + /* since version 2.3.6 */ + FT_String* registry; + FT_String* ordering; + + /* since version 2.4.12 */ + FT_Generic cf2_instance; + + /* since version 2.7.1 */ + CFF_VStoreRec vstore; /* parsed vstore structure */ + + /* since version 2.9 */ + PS_FontExtraRec* font_extra; + + } CFF_FontRec; + + +FT_END_HEADER + +#endif /* CFFTYPES_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftcalc.h b/FreeType/include/freetype/internal/ftcalc.h new file mode 100644 index 0000000..2986ec3 --- /dev/null +++ b/FreeType/include/freetype/internal/ftcalc.h @@ -0,0 +1,510 @@ +/**************************************************************************** + * + * ftcalc.h + * + * Arithmetic computations (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 FTCALC_H_ +#define FTCALC_H_ + + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * FT_MulDiv() and FT_MulFix() are declared in freetype.h. + * + */ + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ + +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 t, t2; + + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x8000 /* a += 0x8000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #16 /* a = t2 >> 16 */ + orr a, a, t, lsl #16 /* a |= t << 16 */ + } + return a; + } + +#endif /* __CC_ARM || __ARMCC__ */ + + +#ifdef __GNUC__ + +#if defined( __arm__ ) && \ + ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \ + !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 t, t2; + + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ +#if defined( __clang__ ) && defined( __thumb2__ ) + "add.w %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ +#else + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ +#endif + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) + : "cc" ); + return a; + } + +#endif /* __arm__ && */ + /* ( __thumb2__ || !__thumb__ ) && */ + /* !( __CC_ARM || __ARMCC__ ) */ + + +#if defined( __i386__ ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "=d"(b) + : "a"(a), "d"(b) + : "%ecx", "cc" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + + +#ifdef _MSC_VER /* Visual C++ */ + +#ifdef _M_IX86 + +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 result; + + __asm + { + mov eax, a + mov edx, b + imul edx + mov ecx, edx + sar ecx, 31 + add ecx, 8000h + add eax, ecx + adc edx, 0 + shr eax, 16 + shl edx, 16 + add eax, edx + mov result, eax + } + return result; + } + +#endif /* _M_IX86 */ + +#endif /* _MSC_VER */ + + +#if defined( __GNUC__ ) && defined( __x86_64__ ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_x86_64 + + static __inline__ FT_Int32 + FT_MulFix_x86_64( FT_Int32 a, + FT_Int32 b ) + { + /* Temporarily disable the warning that C90 doesn't support */ + /* `long long'. */ +#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wlong-long" +#endif + +#if 1 + /* Technically not an assembly fragment, but GCC does a really good */ + /* job at inlining it and generating good machine code for it. */ + long long ret, tmp; + + + ret = (long long)a * b; + tmp = ret >> 63; + ret += 0x8000 + tmp; + + return (FT_Int32)( ret >> 16 ); +#else + + /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine */ + /* code from the lines below. The main issue is that `wide_a' is not */ + /* properly initialized by sign-extending `a'. Instead, the generated */ + /* machine code assumes that the register that contains `a' on input */ + /* can be used directly as a 64-bit value, which is wrong most of the */ + /* time. */ + long long wide_a = (long long)a; + long long wide_b = (long long)b; + long long result; + + + __asm__ __volatile__ ( + "imul %2, %1\n" + "mov %1, %0\n" + "sar $63, %0\n" + "lea 0x8000(%1, %0), %0\n" + "sar $16, %0\n" + : "=&r"(result), "=&r"(wide_a) + : "r"(wide_b) + : "cc" ); + + return (FT_Int32)result; +#endif + +#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) +#pragma GCC diagnostic pop +#endif + } + +#endif /* __GNUC__ && __x86_64__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MulFix( a, b ) FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) ) +#endif +#endif + + + /************************************************************************** + * + * @function: + * FT_MulDiv_No_Round + * + * @description: + * A very simple function used to perform the computation '(a*b)/c' + * (without rounding) with maximum accuracy (it uses 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_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + + + /* + * A variant of FT_Matrix_Multiply which scales its result afterwards. The + * idea is that both `a' and `b' are scaled by factors of 10 so that the + * values are as precise as possible to get a correct result during the + * 64bit multiplication. Let `sa' and `sb' be the scaling factors of `a' + * and `b', respectively, then the scaling factor of the result is `sa*sb'. + */ + FT_BASE( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ); + + + /* + * Check a matrix. If the transformation would lead to extreme shear or + * extreme scaling, for example, return 0. If everything is OK, return 1. + * + * Based on geometric considerations we use the following inequality to + * identify a degenerate matrix. + * + * 50 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 + * + * Value 50 is heuristic. + */ + FT_BASE( FT_Bool ) + FT_Matrix_Check( const FT_Matrix* matrix ); + + + /* + * A variant of FT_Vector_Transform. See comments for + * FT_Matrix_Multiply_Scaled. + */ + FT_BASE( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ); + + + /* + * This function normalizes a vector and returns its original length. The + * normalized vector is a 16.16 fixed-point unit vector with length close + * to 0x10000. The accuracy of the returned length is limited to 16 bits + * also. The function utilizes quick inverse square root approximation + * without divisions and square roots relying on Newton's iterations + * instead. + */ + FT_BASE( FT_UInt32 ) + FT_Vector_NormLen( FT_Vector* vector ); + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. We + * use the Cartesian coordinate system, with positive vertical values going + * upwards. The function returns +1 if the corner turns to the left, -1 to + * the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the corner point is close to its neighbors, or inside an + * ellipse defined by the neighbor focal points to be more precise. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + + /* + * Return the most significant bit index. + */ + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + +#if defined( __GNUC__ ) && \ + ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) ) + +#if FT_SIZEOF_INT == 4 + +#define FT_MSB( x ) ( 31 - __builtin_clz( x ) ) + +#elif FT_SIZEOF_LONG == 4 + +#define FT_MSB( x ) ( 31 - __builtin_clzl( x ) ) + +#endif /* __GNUC__ */ + + +#elif defined( _MSC_VER ) && ( _MSC_VER >= 1400 ) + +#if FT_SIZEOF_INT == 4 + +#include + + static __inline FT_Int32 + FT_MSB_i386( FT_UInt32 x ) + { + unsigned long where; + + + /* not available in older VC versions */ + _BitScanReverse( &where, x ); + + return (FT_Int32)where; + } + +#define FT_MSB( x ) ( FT_MSB_i386( x ) ) + +#endif + +#endif /* _MSC_VER */ + + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + +#ifndef FT_MSB + + FT_BASE( FT_Int ) + FT_MSB( FT_UInt32 z ); + +#endif + + + /* + * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses + * two fixed-point arguments instead. + */ + FT_BASE( FT_Fixed ) + FT_Hypot( FT_Fixed x, + FT_Fixed y ); + + +#if 0 + + /************************************************************************** + * + * @function: + * FT_SqrtFixed + * + * @description: + * Computes the square root of a 16.16 fixed-point value. + * + * @input: + * x :: + * The value to compute the root for. + * + * @return: + * The result of 'sqrt(x)'. + * + * @note: + * This function is not very fast. + */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + +#endif /* 0 */ + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) * 64 ) /* << 6 */ +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) * 16384 ) /* << 14 */ +#define INT_TO_FIXED( x ) ( (FT_Long)(x) * 65536 ) /* << 16 */ +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) * 4 ) /* << 2 */ +#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) + +#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + /* + * The following macros have two purposes. + * + * - Tag places where overflow is expected and harmless. + * + * - Avoid run-time sanitizer errors. + * + * Use with care! + */ +#define ADD_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) ) +#define SUB_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) ) +#define MUL_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) ) +#define NEG_INT( a ) \ + (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) ) + +#define ADD_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) ) +#define SUB_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) ) +#define MUL_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) ) +#define NEG_LONG( a ) \ + (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) ) + +#define ADD_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) ) +#define SUB_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) ) +#define MUL_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) ) +#define NEG_INT32( a ) \ + (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) ) + +#ifdef FT_LONG64 + +#define ADD_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) ) +#define SUB_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) ) +#define MUL_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) ) +#define NEG_INT64( a ) \ + (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) ) + +#endif /* FT_LONG64 */ + + +FT_END_HEADER + +#endif /* FTCALC_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftdebug.h b/FreeType/include/freetype/internal/ftdebug.h new file mode 100644 index 0000000..54a9673 --- /dev/null +++ b/FreeType/include/freetype/internal/ftdebug.h @@ -0,0 +1,283 @@ +/**************************************************************************** + * + * ftdebug.h + * + * Debugging and logging component (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. + * + * + * IMPORTANT: A description of FreeType's debugging support can be + * found in 'docs/DEBUG.TXT'. Read it if you need to use or + * understand this code. + * + */ + + +#ifndef FTDEBUG_H_ +#define FTDEBUG_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /************************************************************************** + * + * Define the trace enums as well as the trace levels array when they are + * needed. + * + */ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum FT_Trace_ + { +#include FT_INTERNAL_TRACE_H + trace_count + + } FT_Trace; + + + /* a pointer to the array of trace levels, */ + /* provided by `src/base/ftdebug.c' */ + extern int* ft_trace_levels; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Define the FT_TRACE macro + * + * IMPORTANT! + * + * Each component must define the macro FT_COMPONENT to a valid FT_Trace + * value before using any TRACE macro. + * + */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* we need two macros here to make cpp expand `FT_COMPONENT' */ +#define FT_TRACE_COMP( x ) FT_TRACE_COMP_( x ) +#define FT_TRACE_COMP_( x ) trace_ ## x + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * @function: + * FT_Trace_Get_Count + * + * @description: + * Return the number of available trace components. + * + * @return: + * The number of trace components. 0 if FreeType 2 is not built with + * FT_DEBUG_LEVEL_TRACE definition. + * + * @note: + * This function may be useful if you want to access elements of the + * internal trace levels array by an index. + */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Get_Name + * + * @description: + * Return the name of a trace component. + * + * @input: + * The index of the trace component. + * + * @return: + * The name of the trace component. This is a statically allocated + * C~string, so do not free it after use. `NULL` if FreeType is not + * built with FT_DEBUG_LEVEL_TRACE definition. + * + * @note: + * Use @FT_Trace_Get_Count to get the number of available trace + * components. + */ + FT_BASE( const char* ) + FT_Trace_Get_Name( FT_Int idx ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Disable + * + * @description: + * Switch off tracing temporarily. It can be activated again with + * @FT_Trace_Enable. + */ + FT_BASE( void ) + FT_Trace_Disable( void ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Enable + * + * @description: + * Activate tracing. Use it after tracing has been switched off with + * @FT_Trace_Disable. + */ + FT_BASE( void ) + FT_Trace_Enable( void ); + + + /************************************************************************** + * + * You need two opening and closing parentheses! + * + * Example: FT_TRACE0(( "Value is %i", foo )) + * + * Output of the FT_TRACEX macros is sent to stderr. + * + */ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /************************************************************************** + * + * Define the FT_ERROR macro. + * + * Output of this macro is sent to stderr. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /************************************************************************** + * + * Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw` makes + * it possible to easily set a breakpoint at this function. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#define FT_THROW( e ) \ + ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \ + __LINE__, \ + __FILE__ ) | \ + FT_ERR_CAT( FT_ERR_PREFIX, e ) ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do { } while ( 0 ) + +#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /************************************************************************** + * + * Define `FT_Message` and `FT_Panic` when needed. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vfprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, + ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, + ... ); + + /* report file name and line number of an error */ + FT_BASE( int ) + FT_Throw( FT_Error error, + int line, + const char* file ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + +FT_END_HEADER + +#endif /* FTDEBUG_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftdrv.h b/FreeType/include/freetype/internal/ftdrv.h new file mode 100644 index 0000000..09e846e --- /dev/null +++ b/FreeType/include/freetype/internal/ftdrv.h @@ -0,0 +1,288 @@ +/**************************************************************************** + * + * ftdrv.h + * + * FreeType internal font driver 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 FTDRV_H_ +#define FTDRV_H_ + + +#include +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ); + + + /************************************************************************** + * + * @struct: + * FT_Driver_ClassRec + * + * @description: + * The font driver class. This structure mostly contains pointers to + * driver methods. + * + * @fields: + * root :: + * The parent module. + * + * face_object_size :: + * The size of a face object in bytes. + * + * size_object_size :: + * The size of a size object in bytes. + * + * slot_object_size :: + * The size of a glyph object in bytes. + * + * init_face :: + * The format-specific face constructor. + * + * done_face :: + * The format-specific face destructor. + * + * init_size :: + * The format-specific size constructor. + * + * done_size :: + * The format-specific size destructor. + * + * init_slot :: + * The format-specific slot constructor. + * + * done_slot :: + * The format-specific slot destructor. + * + * + * load_glyph :: + * A function handle to load a glyph to a slot. This field is + * mandatory! + * + * get_kerning :: + * A function handle to return the unscaled kerning for a given pair of + * glyphs. Can be set to 0 if the format doesn't support kerning. + * + * attach_file :: + * This function handle is used to read additional data for a face from + * another file/stream. For example, this can be used to add data from + * AFM or PFM files on a Type 1 face, or a CIDMap on a CID-keyed face. + * + * get_advances :: + * A function handle used to return advance widths of 'count' glyphs + * (in font units), starting at 'first'. The 'vertical' flag must be + * set to get vertical advance heights. The 'advances' buffer is + * caller-allocated. The idea of this function is to be able to + * perform device-independent text layout without loading a single + * glyph image. + * + * request_size :: + * A handle to a function used to request the new character size. Can + * be set to 0 if the scaling done in the base layer suffices. + * + * select_size :: + * A handle to a function used to select a new fixed size. It is used + * only if @FT_FACE_FLAG_FIXED_SIZES is set. Can be set to 0 if the + * scaling done in the base layer suffices. + * @note: + * Most function pointers, with the exception of `load_glyph`, can be set + * to 0 to indicate a default behaviour. + */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_DRIVER + * + * @description: + * Used to create a forward declaration of an FT_Driver_ClassRec struct + * instance. + * + * @macro: + * FT_DEFINE_DRIVER + * + * @description: + * Used to initialize an instance of FT_Driver_ClassRec struct. + * + * `ftinit.c` (ft_create_default_module_classes) already contains a + * mechanism to call these functions for the default modules described in + * `ftmodule.h`. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DECLARE_DRIVER( class_ ) \ + FT_CALLBACK_TABLE \ + const FT_Driver_ClassRec class_; + +#define FT_DEFINE_DRIVER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + init_face_, \ + done_face_, \ + init_size_, \ + done_size_, \ + init_slot_, \ + done_slot_, \ + load_glyph_, \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + request_size_, \ + select_size_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Driver_ClassRec class_ = \ + { \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + \ + init_face_, \ + done_face_, \ + \ + init_size_, \ + done_size_, \ + \ + init_slot_, \ + done_slot_, \ + \ + load_glyph_, \ + \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + \ + request_size_, \ + select_size_ \ + }; + + +FT_END_HEADER + +#endif /* FTDRV_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftgloadr.h b/FreeType/include/freetype/internal/ftgloadr.h new file mode 100644 index 0000000..770871d --- /dev/null +++ b/FreeType/include/freetype/internal/ftgloadr.h @@ -0,0 +1,149 @@ +/**************************************************************************** + * + * ftgloadr.h + * + * The FreeType glyph loader (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 FTGLOADR_H_ +#define FTGLOADR_H_ + + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * FT_GlyphLoader + * + * @description: + * The glyph loader is an internal object used to load several glyphs + * together (for example, in the case of composites). + */ + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec, *FT_GlyphLoader; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || \ + ( (FT_UInt)(_loader)->base.outline.n_points + \ + (FT_UInt)(_loader)->current.outline.n_points + \ + (FT_UInt)(_count) ) <= (_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || \ + ( (FT_UInt)(_loader)->base.outline.n_contours + \ + (FT_UInt)(_loader)->current.outline.n_contours + \ + (FT_UInt)(_count) ) <= (_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), \ + (FT_UInt)(_points), \ + (FT_UInt)(_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGLOADR_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/fthash.h b/FreeType/include/freetype/internal/fthash.h new file mode 100644 index 0000000..2491880 --- /dev/null +++ b/FreeType/include/freetype/internal/fthash.h @@ -0,0 +1,136 @@ +/**************************************************************************** + * + * fthash.h + * + * Hashing functions (specification). + * + */ + +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2015 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /************************************************************************** + * + * This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50 + * + * taken from Mark Leisher's xmbdfed package + * + */ + + +#ifndef FTHASH_H_ +#define FTHASH_H_ + + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef union FT_Hashkey_ + { + FT_Int num; + const char* str; + + } FT_Hashkey; + + + typedef struct FT_HashnodeRec_ + { + FT_Hashkey key; + size_t data; + + } FT_HashnodeRec; + + typedef struct FT_HashnodeRec_ *FT_Hashnode; + + + typedef FT_ULong + (*FT_Hash_LookupFunc)( FT_Hashkey* key ); + + typedef FT_Bool + (*FT_Hash_CompareFunc)( FT_Hashkey* a, + FT_Hashkey* b ); + + + typedef struct FT_HashRec_ + { + FT_UInt limit; + FT_UInt size; + FT_UInt used; + + FT_Hash_LookupFunc lookup; + FT_Hash_CompareFunc compare; + + FT_Hashnode* table; + + } FT_HashRec; + + typedef struct FT_HashRec_ *FT_Hash; + + + FT_Error + ft_hash_str_init( FT_Hash hash, + FT_Memory memory ); + + FT_Error + ft_hash_num_init( FT_Hash hash, + FT_Memory memory ); + + void + ft_hash_str_free( FT_Hash hash, + FT_Memory memory ); + +#define ft_hash_num_free ft_hash_str_free + + FT_Error + ft_hash_str_insert( const char* key, + size_t data, + FT_Hash hash, + FT_Memory memory ); + + FT_Error + ft_hash_num_insert( FT_Int num, + size_t data, + FT_Hash hash, + FT_Memory memory ); + + size_t* + ft_hash_str_lookup( const char* key, + FT_Hash hash ); + + size_t* + ft_hash_num_lookup( FT_Int num, + FT_Hash hash ); + + +FT_END_HEADER + + +#endif /* FTHASH_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftmemory.h b/FreeType/include/freetype/internal/ftmemory.h new file mode 100644 index 0000000..78bd3bc --- /dev/null +++ b/FreeType/include/freetype/internal/ftmemory.h @@ -0,0 +1,392 @@ +/**************************************************************************** + * + * ftmemory.h + * + * The FreeType memory management macros (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 FTMEMORY_H_ +#define FTMEMORY_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @macro: + * FT_SET_ERROR + * + * @description: + * This macro is used to set an implicit 'error' variable to a given + * expression's value (usually a function call), and convert it to a + * boolean which is set whenever the value is != 0. + */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * C++ refuses to handle statements like p = (void*)anything, with `p' a + * typed pointer. Since we don't have a `typeof' operator in standard C++, + * we have to use a template to emulate it. + */ + +#ifdef __cplusplus + +extern "C++" +{ + template inline T* + cplusplus_typeof( T*, + void *v ) + { + return static_cast ( v ); + } +} + +#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) + +#else + +#define FT_ASSIGNP( p, val ) (p) = (val) + +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) _ft_debug_file; + FT_BASE( long ) _ft_debug_lineno; + +#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code is written + * to through the `p_error' parameter. + */ + + /* The `q' variants of the functions below (`q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + + /* The `Q' variants of the macros below (`Q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ + (FT_Long)(size), \ + &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + ft_mem_free( memory, (ptr) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + 1, \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ + (FT_Long)(size), \ + &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + 1, \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + (FT_Long)(item_size), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + (FT_Long)(itmsz), \ + (FT_Long)(oldcnt), \ + (FT_Long)(newcnt), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + (FT_Long)(item_size), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + (FT_Long)(itmsz), \ + (FT_Long)(oldcnt), \ + (FT_Long)(newcnt), \ + (ptr), \ + &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) \ + ft_memset( dest, byte, (FT_Offset)(count) ) + +#define FT_MEM_COPY( dest, source, count ) \ + ft_memcpy( dest, source, (FT_Offset)(count) ) + +#define FT_MEM_MOVE( dest, source, count ) \ + ft_memmove( dest, source, (FT_Offset)(count) ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, \ + source, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, \ + source, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. We limit + * ourselves to INT_MAX, rather than UINT_MAX, to avoid any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /************************************************************************** + * + * The following functions macros expect that their pointer argument is + * _typed_ in order to automatically compute array element sizes. + */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + sizeof ( *(ptr) ), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + sizeof ( *(ptr) ), \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + sizeof ( *(ptr) ), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + sizeof ( *(ptr) ), \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + /* */ + + +FT_END_HEADER + +#endif /* FTMEMORY_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftobjs.h b/FreeType/include/freetype/internal/ftobjs.h new file mode 100644 index 0000000..0578dd8 --- /dev/null +++ b/FreeType/include/freetype/internal/ftobjs.h @@ -0,0 +1,1236 @@ +/**************************************************************************** + * + * ftobjs.h + * + * The FreeType private base classes (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 all internal FreeType classes. + * + */ + + +#ifndef FTOBJS_H_ +#define FTOBJS_H_ + +#include +#include FT_RENDER_H +#include FT_SIZES_H +#include FT_LCD_FILTER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_CALC_H + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include FT_INCREMENTAL_H +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * Some generic definitions. + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /************************************************************************** + * + * The min and max functions missing in C. As usual, be careful not to + * write things like FT_MIN( a++, b++ ) to avoid side effects. + */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + /* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' algorithm. + * We use alpha = 1, beta = 3/8, giving us results with a largest error + * less than 7% compared to the exact value. + */ +#define FT_HYPOT( x, y ) \ + ( x = FT_ABS( x ), \ + y = FT_ABS( y ), \ + x > y ? x + ( 3 * y >> 3 ) \ + : y + ( 3 * x >> 3 ) ) + + /* we use FT_TYPEOF to suppress signedness compilation warnings */ +#define FT_PAD_FLOOR( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + (n) / 2, n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + (n) - 1, n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + /* specialized versions (for signed values) */ + /* that don't produce run-time errors due to integer overflow */ +#define FT_PAD_ROUND_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \ + n ) +#define FT_PAD_CEIL_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \ + n ) +#define FT_PIX_ROUND_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 32 ) ) +#define FT_PIX_CEIL_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 63 ) ) + +#define FT_PAD_ROUND_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \ + n ) +#define FT_PAD_CEIL_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \ + n ) +#define FT_PIX_ROUND_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 32 ) ) +#define FT_PIX_CEIL_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 63 ) ) + + + /* + * character classification functions -- since these are used to parse font + * files, we must not use those in which are locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecast any pointer to a charmap handle */ +#define FT_CMAP( x ) ( (FT_CMap)( x ) ) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + typedef FT_UInt + (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, + FT_CMap unicode_cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_Int + (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_UInt32 * + (*FT_CMap_VariantListFunc)( FT_CMap cmap, + FT_Memory mem ); + + typedef FT_UInt32 * + (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 char_code ); + + typedef FT_UInt32 * + (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 variant_selector ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + /* Subsequent entries are special ones for format 14 -- the variant */ + /* selector subtable which behaves like no other */ + + FT_CMap_CharVarIndexFunc char_var_index; + FT_CMap_CharVarIsDefaultFunc char_var_default; + FT_CMap_VariantListFunc variant_list; + FT_CMap_CharVariantListFunc charvariant_list; + FT_CMap_VariantCharListFunc variantchar_list; + + } FT_CMap_ClassRec; + + +#define FT_DECLARE_CMAP_CLASS( class_ ) \ + FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; + +#define FT_DEFINE_CMAP_CLASS( \ + class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_CMap_ClassRec class_ = \ + { \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ \ + }; + + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /* add LCD padding to CBox */ + FT_BASE( void ) + ft_lcd_padding( FT_BBox* cbox, + FT_GlyphSlot slot, + FT_Render_Mode mode ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Render_Mode render_mode, + FT_Byte* weights ); + + + /* This is the default LCD filter, an in-place, 5-tap FIR filter. */ + FT_BASE( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_LcdFiveTapFilter weights ); + +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /************************************************************************** + * + * @struct: + * FT_Face_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_Face object. + * These fields may change between different releases of FreeType. + * + * @fields: + * max_points :: + * The maximum number of points used to store the vectorial outline of + * any glyph in this face. If this value cannot be known in advance, + * or if the face isn't scalable, this should be set to 0. Only + * relevant for scalable formats. + * + * max_contours :: + * The maximum number of contours used to store the vectorial outline + * of any glyph in this face. If this value cannot be known in + * advance, or if the face isn't scalable, this should be set to 0. + * Only relevant for scalable formats. + * + * transform_matrix :: + * A 2x2 matrix of 16.16 coefficients used to transform glyph outlines + * after they are loaded from the font. Only used by the convenience + * functions. + * + * transform_delta :: + * A translation vector used to transform glyph outlines after they are + * loaded from the font. Only used by the convenience functions. + * + * transform_flags :: + * Some flags used to classify the transform. Only used by the + * convenience functions. + * + * services :: + * A cache for frequently used services. It should be only accessed + * with the macro `FT_FACE_LOOKUP_SERVICE`. + * + * incremental_interface :: + * If non-null, the interface through which glyph data and metrics are + * loaded incrementally for faces that do not provide all of this data + * when first opened. This field exists only if + * @FT_CONFIG_OPTION_INCREMENTAL is defined. + * + * no_stem_darkening :: + * Overrides the module-level default, see @stem-darkening[cff], for + * example. FALSE and TRUE toggle stem darkening on and off, + * respectively, value~-1 means to use the module/driver default. + * + * random_seed :: + * If positive, override the seed value for the CFF 'random' operator. + * Value~0 means to use the font's value. Value~-1 means to use the + * CFF driver's default. + * + * lcd_weights :: + * lcd_filter_func :: + * These fields specify the LCD filtering weights and callback function + * for ClearType-style subpixel rendering. + * + * refcount :: + * A counter initialized to~1 at the time an @FT_Face structure is + * created. @FT_Reference_Face increments this counter, and + * @FT_Done_Face only destroys a face if the counter is~1, otherwise it + * simply decrements it. + */ + typedef struct FT_Face_InternalRec_ + { + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Char no_stem_darkening; + FT_Int32 random_seed; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + + FT_Int refcount; + + } FT_Face_InternalRec; + + + /************************************************************************** + * + * @struct: + * FT_Slot_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_GlyphSlot + * object. These fields may change between different releases of + * FreeType. + * + * @fields: + * loader :: + * The glyph loader object used to load outlines into the glyph slot. + * + * flags :: + * Possible values are zero or FT_GLYPH_OWN_BITMAP. The latter + * indicates that the FT_GlyphSlot structure owns the bitmap buffer. + * + * glyph_transformed :: + * Boolean. Set to TRUE when the loaded glyph must be transformed + * through a specific font transformation. This is _not_ the same as + * the face transform set through FT_Set_Transform(). + * + * glyph_matrix :: + * The 2x2 matrix corresponding to the glyph transformation, if + * necessary. + * + * glyph_delta :: + * The 2d translation vector corresponding to the glyph transformation, + * if necessary. + * + * glyph_hints :: + * Format-specific glyph hints management. + * + * load_flags :: + * The load flags passed as an argument to @FT_Load_Glyph while + * initializing the glyph slot. + */ + +#define FT_GLYPH_OWN_BITMAP 0x1U + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + FT_Int32 load_flags; + + } FT_GlyphSlot_InternalRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_Size object. + * + * @fields: + * module_data :: + * Data specific to a driver module. + * + * autohint_mode :: + * The used auto-hinting mode. + * + * autohint_metrics :: + * Metrics used by the auto-hinter. + * + */ + + typedef struct FT_Size_InternalRec_ + { + void* module_data; + + FT_Render_Mode autohint_mode; + FT_Size_Metrics autohint_metrics; + + } FT_Size_InternalRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FT_ModuleRec + * + * @description: + * A module object instance. + * + * @fields: + * clazz :: + * A pointer to the module's class. + * + * library :: + * A handle to the parent library object. + * + * memory :: + * A handle to the memory manager. + */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + + } FT_ModuleRec; + + + /* typecast an object to an FT_Module */ +#define FT_MODULE( x ) ( (FT_Module)(x) ) + +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + +#define FT_DRIVER_HINTS_LIGHTLY( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HINTS_LIGHTLY ) + + + /************************************************************************** + * + * @function: + * FT_Get_Module_Interface + * + * @description: + * Finds a module and returns its specific interface as a typeless + * pointer. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module-specific interface if available, 0 otherwise. + * + * @note: + * You should better be familiar with FreeType internals to know which + * module to look for, and what its interface is :-) + */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id, + FT_Bool global ); + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_BASE( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ); +#endif + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ( (FT_Face)(x) ) +#define FT_SIZE( x ) ( (FT_Size)(x) ) +#define FT_SLOT( x ) ( (FT_GlyphSlot)(x) ) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /************************************************************************** + * + * @function: + * FT_New_GlyphSlot + * + * @description: + * It is sometimes useful to have more than one glyph slot for a given + * face object. This function is used to create additional slots. All + * of them are automatically discarded when the face is destroyed. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * aslot :: + * A handle to a new glyph slot object. + * + * @return: + * FreeType error code. 0 means success. + */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /************************************************************************** + * + * @function: + * FT_Done_GlyphSlot + * + * @description: + * Destroys a given glyph slot. Remember however that all slots are + * automatically destroyed with its parent. Using this function is not + * always mandatory. + * + * @input: + * slot :: + * A handle to a target glyph slot. + */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? ( (req)->width * (FT_Pos)(req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? ( (req)->height * (FT_Pos)(req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Preset bitmap metrics of an outline glyphslot prior to rendering */ + /* and check whether the truncated bbox is too large for rendering. */ + FT_BASE( FT_Bool ) + ft_glyphslot_preset_bitmap( FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ( (FT_Renderer)(x) ) +#define FT_GLYPH( x ) ( (FT_Glyph)(x) ) +#define FT_BITMAP_GLYPH( x ) ( (FT_BitmapGlyph)(x) ) +#define FT_OUTLINE_GLYPH( x ) ( (FT_OutlineGlyph)(x) ) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ( (FT_Driver)(x) ) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /************************************************************************** + * + * @struct: + * FT_DriverRec + * + * @description: + * The root font driver class. A font driver is responsible for managing + * and loading font files of a given format. + * + * @fields: + * root :: + * Contains the fields of the root module class. + * + * clazz :: + * A pointer to the font driver's class. Note that this is NOT + * root.clazz. 'class' wasn't used as it is a reserved word in C++. + * + * faces_list :: + * The list of faces currently opened by this driver. + * + * glyph_loader :: + * Unused. Used to be glyph loader for all faces managed by this + * driver. + */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + FT_ListRec faces_list; + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FT_LibraryRec + * + * @description: + * The FreeType library class. This is the root of all FreeType data. + * Use FT_New_Library() to create a library object, and FT_Done_Library() + * to discard it and all child objects. + * + * @fields: + * memory :: + * The library's memory object. Manages memory allocation. + * + * version_major :: + * The major version number of the library. + * + * version_minor :: + * The minor version number of the library. + * + * version_patch :: + * The current patch level of the library. + * + * num_modules :: + * The number of modules currently registered within this library. + * This is set to 0 for new libraries. New modules are added through + * the FT_Add_Module() API function. + * + * modules :: + * A table used to store handles to the currently registered + * modules. Note that each font driver contains a list of its opened + * faces. + * + * renderers :: + * The list of renderers currently registered within the library. + * + * cur_renderer :: + * The current outline renderer. This is a shortcut used to avoid + * parsing the list on each call to FT_Outline_Render(). It is a + * handle to the current renderer for the FT_GLYPH_FORMAT_OUTLINE + * format. + * + * auto_hinter :: + * The auto-hinter module interface. + * + * debug_hooks :: + * An array of four function pointers that allow debuggers to hook into + * a font format's interpreter. Currently, only the TrueType bytecode + * debugger uses this. + * + * lcd_weights :: + * The LCD filter weights for ClearType-style subpixel rendering. + * + * lcd_filter_func :: + * The LCD filtering callback function for for ClearType-style subpixel + * rendering. + * + * lcd_geometry :: + * This array specifies LCD subpixel geometry and controls Harmony LCD + * rendering technique, alternative to ClearType. + * + * pic_container :: + * Contains global structs and tables, instead of defining them + * globally. + * + * refcount :: + * A counter initialized to~1 at the time an @FT_Library structure is + * created. @FT_Reference_Library increments this counter, and + * @FT_Done_Library only destroys a library if the counter is~1, + * otherwise it simply decrements it. + */ + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#else + FT_Vector lcd_geometry[3]; /* RGB subpixel positions */ +#endif + + FT_Int refcount; + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /************************************************************************** + * + * @function: + * FT_New_Memory + * + * @description: + * Creates a new memory object. + * + * @return: + * A pointer to the new memory object. 0 in case of error. + */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /************************************************************************** + * + * @function: + * FT_Done_Memory + * + * @description: + * Discards memory manager. + * + * @input: + * memory :: + * A handle to the memory manager. + */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_OUTLINE_FUNCS + * + * @description: + * Used to initialize an instance of FT_Outline_Funcs struct. The struct + * will be allocated in the global scope (or the scope where the macro is + * used). + */ +#define FT_DEFINE_OUTLINE_FUNCS( \ + class_, \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_RASTER_FUNCS + * + * @description: + * Used to initialize an instance of FT_Raster_Funcs struct. The struct + * will be allocated in the global scope (or the scope where the macro is + * used). + */ +#define FT_DEFINE_RASTER_FUNCS( \ + class_, \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_GLYPH + * + * @description: + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DEFINE_GLYPH( \ + class_, \ + size_, \ + format_, \ + init_, \ + done_, \ + copy_, \ + transform_, \ + bbox_, \ + prepare_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Glyph_Class class_ = \ + { \ + size_, \ + format_, \ + init_, \ + done_, \ + copy_, \ + transform_, \ + bbox_, \ + prepare_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_RENDERER + * + * @description: + * Used to create a forward declaration of a FT_Renderer_Class struct + * instance. + * + * @macro: + * FT_DEFINE_RENDERER + * + * @description: + * Used to initialize an instance of FT_Renderer_Class struct. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DECLARE_RENDERER( class_ ) \ + FT_EXPORT_VAR( const FT_Renderer_Class ) class_; + +#define FT_DEFINE_RENDERER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + glyph_format_, \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + raster_class_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Renderer_Class class_ = \ + { \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + glyph_format_, \ + \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + \ + raster_class_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_MODULE + * + * @description: + * Used to create a forward declaration of a FT_Module_Class struct + * instance. + * + * @macro: + * FT_DEFINE_MODULE + * + * @description: + * Used to initialize an instance of an FT_Module_Class struct. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + * + * @macro: + * FT_DEFINE_ROOT_MODULE + * + * @description: + * Used to initialize an instance of an FT_Module_Class struct inside + * another struct that contains it or in a function that initializes that + * containing struct. + */ +#define FT_DECLARE_MODULE( class_ ) \ + FT_CALLBACK_TABLE \ + const FT_Module_Class class_; + +#define FT_DEFINE_ROOT_MODULE( \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }, + +#define FT_DEFINE_MODULE( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Module_Class class_ = \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }; + + +FT_END_HEADER + +#endif /* FTOBJS_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftpsprop.h b/FreeType/include/freetype/internal/ftpsprop.h new file mode 100644 index 0000000..574837f --- /dev/null +++ b/FreeType/include/freetype/internal/ftpsprop.h @@ -0,0 +1,48 @@ +/**************************************************************************** + * + * ftpsprop.h + * + * Get and set properties of PostScript drivers (specification). + * + * 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 FTPSPROP_H_ +#define FTPSPROP_H_ + + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + FT_BASE_CALLBACK( FT_Error ) + ps_property_set( FT_Module module, /* PS_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ); + + FT_BASE_CALLBACK( FT_Error ) + ps_property_get( FT_Module module, /* PS_Driver */ + const char* property_name, + void* value ); + + +FT_END_HEADER + + +#endif /* FTPSPROP_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftrfork.h b/FreeType/include/freetype/internal/ftrfork.h new file mode 100644 index 0000000..75b3e53 --- /dev/null +++ b/FreeType/include/freetype/internal/ftrfork.h @@ -0,0 +1,246 @@ +/**************************************************************************** + * + * ftrfork.h + * + * Embedded resource forks accessor (specification). + * + * Copyright (C) 2004-2019 by + * Masatake YAMATO and Redhat K.K. + * + * 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. + * + */ + +/**************************************************************************** + * Development of the code in this file is support of + * Information-technology Promotion Agency, Japan. + */ + + +#ifndef FTRFORK_H_ +#define FTRFORK_H_ + + +#include +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 9 + + + /* A structure to describe a reference in a resource by its resource ID */ + /* and internal offset. The `POST' resource expects to be concatenated */ + /* by the order of resource IDs instead of its appearance in the file. */ + + typedef struct FT_RFork_Ref_ + { + FT_Short res_id; + FT_Long offset; + + } FT_RFork_Ref; + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + typedef FT_Error + (*ft_raccess_guess_func)( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + typedef enum FT_RFork_Rule_ { + FT_RFork_Rule_invalid = -2, + FT_RFork_Rule_uknown, /* -1 */ + FT_RFork_Rule_apple_double, + FT_RFork_Rule_apple_single, + FT_RFork_Rule_darwin_ufs_export, + FT_RFork_Rule_darwin_newvfs, + FT_RFork_Rule_darwin_hfsplus, + FT_RFork_Rule_vfat, + FT_RFork_Rule_linux_cap, + FT_RFork_Rule_linux_double, + FT_RFork_Rule_linux_netatalk + } FT_RFork_Rule; + + /* For fast translation between rule index and rule type, + * the macros FT_RFORK_xxx should be kept consistent with the + * raccess_guess_funcs table + */ + typedef struct ft_raccess_guess_rec_ { + ft_raccess_guess_func func; + FT_RFork_Rule type; + } ft_raccess_guess_rec; + + +#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ + static const type name[] = { +#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ + { raccess_guess_ ## func_suffix, \ + FT_RFork_Rule_ ## type_suffix }, + /* this array is a storage, thus a final `;' is needed */ +#define CONST_FT_RFORK_RULE_ARRAY_END }; + +#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /************************************************************************** + * + * @function: + * FT_Raccess_Guess + * + * @description: + * Guess a file name and offset where the actual resource fork is stored. + * The macro FT_RACCESS_N_RULES holds the number of guessing rules; the + * guessed result for the Nth rule is represented as a triplet: a new + * file name (new_names[N]), a file offset (offsets[N]), and an error + * code (errors[N]). + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * base_name :: + * The (base) file name of the resource fork used for some guessing + * rules. + * + * @output: + * new_names :: + * An array of guessed file names in which the resource forks may + * exist. If 'new_names[N]' is `NULL`, the guessed file name is equal + * to `base_name`. + * + * offsets :: + * An array of guessed file offsets. 'offsets[N]' holds the file + * offset of the possible start of the resource fork in file + * 'new_names[N]'. + * + * errors :: + * An array of FreeType error codes. 'errors[N]' is the error code of + * Nth guessing rule function. If 'errors[N]' is not FT_Err_Ok, + * 'new_names[N]' and 'offsets[N]' are meaningless. + */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /************************************************************************** + * + * @function: + * FT_Raccess_Get_HeaderInfo + * + * @description: + * Get the information from the header of resource fork. The information + * includes the file offset where the resource map starts, and the file + * offset where the resource data starts. `FT_Raccess_Get_DataOffsets` + * requires these two data. + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * rfork_offset :: + * The file offset where the resource fork starts. + * + * @output: + * map_offset :: + * The file offset where the resource map starts. + * + * rdata_pos :: + * The file offset where the resource data starts. + * + * @return: + * FreeType error code. FT_Err_Ok means success. + */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /************************************************************************** + * + * @function: + * FT_Raccess_Get_DataOffsets + * + * @description: + * Get the data offsets for a tag in a resource fork. Offsets are stored + * in an array because, in some cases, resources in a resource fork have + * the same tag. + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * map_offset :: + * The file offset where the resource map starts. + * + * rdata_pos :: + * The file offset where the resource data starts. + * + * tag :: + * The resource tag. + * + * sort_by_res_id :: + * A Boolean to sort the fragmented resource by their ids. The + * fragmented resources for 'POST' resource should be sorted to restore + * Type1 font properly. For 'sfnt' resources, sorting may induce a + * different order of the faces in comparison to that by QuickDraw API. + * + * @output: + * offsets :: + * The stream offsets for the resource data specified by 'tag'. This + * array is allocated by the function, so you have to call @ft_mem_free + * after use. + * + * count :: + * The length of offsets array. + * + * @return: + * FreeType error code. FT_Err_Ok means success. + * + * @note: + * Normally you should use `FT_Raccess_Get_HeaderInfo` to get the value + * for `map_offset` and `rdata_pos`. + */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Bool sort_by_res_id, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* FTRFORK_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftserv.h b/FreeType/include/freetype/internal/ftserv.h new file mode 100644 index 0000000..8836cf3 --- /dev/null +++ b/FreeType/include/freetype/internal/ftserv.h @@ -0,0 +1,521 @@ +/**************************************************************************** + * + * ftserv.h + * + * The FreeType services (specification only). + * + * 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. + * + */ + + /************************************************************************** + * + * Each module can export one or more 'services'. Each service is + * identified by a constant string and modeled by a pointer; the latter + * generally corresponds to a structure containing function pointers. + * + * Note that a service's data cannot be a mere function pointer because in + * C it is possible that function pointers might be implemented differently + * than data pointers (e.g. 48 bits instead of 32). + * + */ + + +#ifndef FTSERV_H_ +#define FTSERV_H_ + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's header + * files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * 'multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_`. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be `NULL` if not + * found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /************************************************************************** + * + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's header + * files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * 'multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_`. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be `NULL` if not + * found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service to the + * library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_SERVICEDESCREC1 + * FT_DEFINE_SERVICEDESCREC2 + * FT_DEFINE_SERVICEDESCREC3 + * FT_DEFINE_SERVICEDESCREC4 + * FT_DEFINE_SERVICEDESCREC5 + * FT_DEFINE_SERVICEDESCREC6 + * FT_DEFINE_SERVICEDESCREC7 + * FT_DEFINE_SERVICEDESCREC8 + * FT_DEFINE_SERVICEDESCREC9 + * FT_DEFINE_SERVICEDESCREC10 + * + * @description: + * Used to initialize an array of FT_ServiceDescRec structures. + * + * The array will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DEFINE_SERVICEDESCREC1( class_, \ + serv_id_1, serv_data_1 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC2( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC3( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC4( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC5( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC6( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC7( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC8( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC9( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { serv_id_9, serv_data_9 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC10( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9, \ + serv_id_10, serv_data_10 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { serv_id_9, serv_data_9 }, \ + { serv_id_10, serv_data_10 }, \ + { NULL, NULL } \ + }; + + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for a specific + * service by ID. Note that the last element in the array must be { NULL, + * NULL }, and that the function should return NULL if the service isn't + * available. + * + * This function can be used by modules to implement their `get_service' + * method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You should + * only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to the + * correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_METRICS_VARIATIONS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ + + /* ensure that value `1' has the same width as a pointer */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1) + + + /************************************************************************** + * + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module + * using its cache. + * + * @input: + * face :: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. `NULL` if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_BDF_H +#define FT_SERVICE_CFF_TABLE_LOAD_H +#define FT_SERVICE_CID_H +#define FT_SERVICE_FONT_FORMAT_H +#define FT_SERVICE_GLYPH_DICT_H +#define FT_SERVICE_GX_VALIDATE_H +#define FT_SERVICE_KERNING_H +#define FT_SERVICE_METRICS_VARIATIONS_H +#define FT_SERVICE_MULTIPLE_MASTERS_H +#define FT_SERVICE_OPENTYPE_VALIDATE_H +#define FT_SERVICE_PFR_H +#define FT_SERVICE_POSTSCRIPT_CMAPS_H +#define FT_SERVICE_POSTSCRIPT_INFO_H +#define FT_SERVICE_POSTSCRIPT_NAME_H +#define FT_SERVICE_PROPERTIES_H +#define FT_SERVICE_SFNT_H +#define FT_SERVICE_TRUETYPE_ENGINE_H +#define FT_SERVICE_TRUETYPE_GLYF_H +#define FT_SERVICE_TT_CMAP_H +#define FT_SERVICE_WINFNT_H + + /* */ + +FT_END_HEADER + +#endif /* FTSERV_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/ftstream.h b/FreeType/include/freetype/internal/ftstream.h new file mode 100644 index 0000000..e4dca0b --- /dev/null +++ b/FreeType/include/freetype/internal/ftstream.h @@ -0,0 +1,561 @@ +/**************************************************************************** + * + * ftstream.h + * + * Stream 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. + * + */ + + +#ifndef FTSTREAM_H_ +#define FTSTREAM_H_ + + +#include +#include FT_SYSTEM_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /************************************************************************** + * + * Integer extraction macros -- the 'buffer' parameter must ALWAYS be of + * type 'char*' or equivalent (1-byte elements). + */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + + +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + + + /* + * `FT_PEEK_XXX' are generic macros to get data from a buffer position. No + * safety checks are performed. + */ +#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + /* + * `FT_NEXT_XXX' are generic macros to get data from a buffer position + * which is then increased appropriately. No safety checks are performed. + */ +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) + + + /************************************************************************** + * + * The `FT_GET_XXX` macros use an implicit 'stream' variable. + * + * Note that a call to `FT_STREAM_SEEK` or `FT_STREAM_POS` has **no** + * effect on `FT_GET_XXX`! They operate on `stream->pos`, while + * `FT_GET_XXX` use `stream->cursor`. + */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort ) +#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong ) +#endif + + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + + /* + * The `FT_READ_XXX' macros use implicit `stream' and `error' variables. + * + * `FT_READ_XXX' can be controlled with `FT_STREAM_SEEK' and + * `FT_STREAM_POS'. They use the full machinery to check whether a read is + * valid. + */ +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var ) +#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_ULong ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the `FT_Stream_GetXXX' functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call `FT_Stream_ExitFrame' once you have entered */ + /* a stream frame! */ + /* */ + /* Nested frames are not permitted. */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply sets a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* `FT_Stream_GetXXX' functions can't be used. */ + /* */ + /* An extracted frame must be `freed' with a call to the function */ + /* `FT_Stream_ReleaseFrame'. */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see `FT_Stream_ExtractFrame') */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + + /* read a byte from an entered frame */ + FT_BASE( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ); + + /* read a 16-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_UShort ) + FT_Stream_GetUShort( FT_Stream stream ); + + /* read a 24-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_ULong ) + FT_Stream_GetUOffset( FT_Stream stream ); + + /* read a 32-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_ULong ) + FT_Stream_GetULong( FT_Stream stream ); + + /* read a 16-bit little-endian unsigned integer from an entered frame */ + FT_BASE( FT_UShort ) + FT_Stream_GetUShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian unsigned integer from an entered frame */ + FT_BASE( FT_ULong ) + FT_Stream_GetULongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian unsigned integer from a stream */ + FT_BASE( FT_UShort ) + FT_Stream_ReadUShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian unsigned integer from a stream */ + FT_BASE( FT_ULong ) + FT_Stream_ReadUOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_ULong ) + FT_Stream_ReadULong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian unsigned integer from a stream */ + FT_BASE( FT_UShort ) + FT_Stream_ReadUShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian unsigned integer from a stream */ + FT_BASE( FT_ULong ) + FT_Stream_ReadULongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, \ + (FT_ULong)(position) ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, \ + (FT_Long)(distance) ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)(buffer), \ + (FT_ULong)(count) ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + (FT_ULong)(position), \ + (FT_Byte*)(buffer), \ + (FT_ULong)(count) ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \ + (FT_ULong)(size) ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \ + (FT_ULong)(size), \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* FTSTREAM_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/fttrace.h b/FreeType/include/freetype/internal/fttrace.h new file mode 100644 index 0000000..8089bab --- /dev/null +++ b/FreeType/include/freetype/internal/fttrace.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * fttrace.h + * + * Tracing handling (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. + * + */ + + + /* definitions of trace levels for FreeType 2 */ + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ + +FT_TRACE_DEF( bitmap ) /* bitmap manipulation (ftbitmap.c) */ +FT_TRACE_DEF( checksum ) /* bitmap checksum (ftobjs.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( psprops ) /* PS driver properties (ftpsprop.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttcolr ) /* glyph layer table (ttcolr.c) */ +FT_TRACE_DEF( ttcpal ) /* color palette table (ttcpal.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1afm ) +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( cffdecode ) +FT_TRACE_DEF( psconv ) +FT_TRACE_DEF( psobjs ) +FT_TRACE_DEF( t1decode ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshalgo ) +FT_TRACE_DEF( pshrec ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + +FT_TRACE_DEF( cf2blues ) +FT_TRACE_DEF( cf2hints ) +FT_TRACE_DEF( cf2interp ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) +FT_TRACE_DEF( otvmath ) +FT_TRACE_DEF( otvmodule ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvlcar ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvtrak ) + + /* autofit components */ +FT_TRACE_DEF( afcjk ) +FT_TRACE_DEF( afglobal ) +FT_TRACE_DEF( afhints ) +FT_TRACE_DEF( afmodule ) +FT_TRACE_DEF( aflatin ) +FT_TRACE_DEF( aflatin2 ) +FT_TRACE_DEF( afshaper ) +FT_TRACE_DEF( afwarp ) + +/* END */ diff --git a/FreeType/include/freetype/internal/ftvalid.h b/FreeType/include/freetype/internal/ftvalid.h new file mode 100644 index 0000000..38aa06c --- /dev/null +++ b/FreeType/include/freetype/internal/ftvalid.h @@ -0,0 +1,159 @@ +/**************************************************************************** + * + * ftvalid.h + * + * FreeType validation support (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 FTVALID_H_ +#define FTVALID_H_ + +#include +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /************************************************************************** + * + * There are three distinct validation levels defined here: + * + * FT_VALIDATE_DEFAULT :: + * A table that passes this validation level can be used reliably by + * FreeType. It generally means that all offsets have been checked to + * prevent out-of-bound reads, that array counts are correct, etc. + * + * FT_VALIDATE_TIGHT :: + * A table that passes this validation level can be used reliably and + * doesn't contain invalid data. For example, a charmap table that + * returns invalid glyph indices will not pass, even though it can be + * used with FreeType in default mode (the library will simply return an + * error later when trying to load the glyph). + * + * It also checks that fields which must be a multiple of 2, 4, or 8, + * don't have incorrect values, etc. + * + * FT_VALIDATE_PARANOID :: + * Only for font debugging. Checks that a table follows the + * specification by 100%. Very few fonts will be able to pass this level + * anyway but it can be useful for certain tools like font + * editors/converters. + */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `structure was padded due to */ + /* __declspec(align())' in order to compile cleanly with */ + /* the maximum level of warnings. */ +#pragma warning( push ) +#pragma warning( disable : 4324 ) +#endif /* _MSC_VER */ + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + ft_jmp_buf jump_buffer; /* used for exception handling */ + + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + } FT_ValidatorRec; + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) ) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ +#define FT_INVALID( _error ) FT_INVALID_( _error ) +#define FT_INVALID_( _error ) \ + ft_validator_error( valid, FT_THROW( _error ) ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( Invalid_Table ) + + +FT_END_HEADER + +#endif /* FTVALID_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/internal.h b/FreeType/include/freetype/internal/internal.h new file mode 100644 index 0000000..173d8ad --- /dev/null +++ b/FreeType/include/freetype/internal/internal.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * internal.h + * + * Internal header files (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 file is automatically included by `ft2build.h`. Do not include it + * manually! + * + */ + + +#define FT_INTERNAL_OBJECTS_H +#define FT_INTERNAL_STREAM_H +#define FT_INTERNAL_MEMORY_H +#define FT_INTERNAL_DEBUG_H +#define FT_INTERNAL_CALC_H +#define FT_INTERNAL_HASH_H +#define FT_INTERNAL_DRIVER_H +#define FT_INTERNAL_TRACE_H +#define FT_INTERNAL_GLYPH_LOADER_H +#define FT_INTERNAL_SFNT_H +#define FT_INTERNAL_SERVICE_H +#define FT_INTERNAL_RFORK_H +#define FT_INTERNAL_VALIDATE_H + +#define FT_INTERNAL_TRUETYPE_TYPES_H +#define FT_INTERNAL_TYPE1_TYPES_H + +#define FT_INTERNAL_POSTSCRIPT_AUX_H +#define FT_INTERNAL_POSTSCRIPT_HINTS_H +#define FT_INTERNAL_POSTSCRIPT_PROPS_H + +#define FT_INTERNAL_AUTOHINT_H + +#define FT_INTERNAL_CFF_TYPES_H +#define FT_INTERNAL_CFF_OBJECTS_TYPES_H + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ + /* In particular, the warning complains about stuff like `while(0)' */ + /* which is very useful in macro definitions. There is no benefit */ + /* in having it enabled. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/psaux.h b/FreeType/include/freetype/internal/psaux.h new file mode 100644 index 0000000..3ab01c3 --- /dev/null +++ b/FreeType/include/freetype/internal/psaux.h @@ -0,0 +1,1439 @@ +/**************************************************************************** + * + * psaux.h + * + * Auxiliary functions and data structures related to PostScript fonts + * (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 PSAUX_H_ +#define PSAUX_H_ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_HASH_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_CFF_TYPES_H +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * PostScript modules driver class. + */ + typedef struct PS_DriverRec_ + { + FT_DriverRec root; + + FT_UInt hinting_engine; + FT_Bool no_stem_darkening; + FT_Int darken_params[8]; + FT_Int32 random_seed; + + } PS_DriverRec, *PS_Driver; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /************************************************************************** + * + * @struct: + * PS_Table_FuncsRec + * + * @description: + * A set of function pointers to manage PS_Table objects. + * + * @fields: + * table_init :: + * Used to initialize a table. + * + * table_done :: + * Finalizes resp. destroy a given table. + * + * table_add :: + * Adds a new object to a table. + * + * table_release :: + * Releases table data, then finalizes it. + */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + void* object, + FT_UInt length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_TableRec + * + * @description: + * A PS_Table is a simple object used to store an array of objects in a + * single memory block. + * + * @fields: + * block :: + * The address in memory of the growheap's block. This can change + * between two object adds, due to reallocation. + * + * cursor :: + * The current top of the grow heap within its block. + * + * capacity :: + * The current size of the heap block. Increments by 1kByte chunks. + * + * init :: + * Set to 0xDEADBEEF if 'elements' and 'lengths' have been allocated. + * + * max_elems :: + * The maximum number of elements in table. + * + * num_elems :: + * The current number of elements in table. + * + * elements :: + * A table of element addresses within the block. + * + * lengths :: + * A table of element sizes within the block. + * + * memory :: + * The object used for memory operations (alloc/realloc). + * + * funcs :: + * A table of method pointers for this object. + */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_ULong init; + + FT_Int max_elems; + FT_Int num_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_UInt* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_MM_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_EXTRA, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximum number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays; must not be zero if in */ + /* use -- in other words, a */ + /* `num_FOO' element must not */ + /* start the used structure if we */ + /* parse a `FOO' array */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_ParserRec + * + * @description: + * A PS_Parser is an object used to parse a Type 1 font very quickly. + * + * @fields: + * cursor :: + * The current position in the text. + * + * base :: + * Start of the processed text. + * + * limit :: + * End of the processed text. + * + * error :: + * The last error returned. + * + * memory :: + * The object used for memory operations (alloc/realloc). + * + * funcs :: + * A table of functions for the parser. + */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_Builder_ PS_Builder; + typedef const struct PS_Builder_FuncsRec_* PS_Builder_Funcs; + + typedef struct PS_Builder_FuncsRec_ + { + void + (*init)( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ); + + void + (*done)( PS_Builder* builder ); + + } PS_Builder_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_Builder + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * XXX + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * path_begun :: + * A flag which indicates that a new path has begun. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * is_t1 :: + * Set if current font type is Type 1. + * + * funcs :: + * An array of function pointers for the builder. + */ + struct PS_Builder_ + { + FT_Memory memory; + FT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos* pos_x; + FT_Pos* pos_y; + + FT_Vector* left_bearing; + FT_Vector* advance; + + FT_BBox* bbox; /* bounding box */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + FT_Bool is_t1; + + PS_Builder_FuncsRec funcs; + + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define PS_MAX_OPERANDS 48 +#define PS_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ + + /* execution context charstring zone */ + + typedef struct PS_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } PS_Decoder_Zone; + + + typedef FT_Error + (*CFF_Decoder_Get_Glyph_Callback)( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ); + + typedef void + (*CFF_Decoder_Free_Glyph_Callback)( TT_Face face, + FT_Byte** pointer, + FT_ULong length ); + + + typedef struct PS_Decoder_ + { + PS_Builder builder; + + FT_Fixed stack[PS_MAX_OPERANDS + 1]; + FT_Fixed* top; + + PS_Decoder_Zone zones[PS_MAX_SUBRS_CALLS + 1]; + PS_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + CFF_Font cff; + CFF_SubFont current_subfont; /* for current glyph_index */ + FT_Generic* cf2_instance; + + FT_Pos* glyph_width; + FT_Bool width_only; + FT_Int num_hints; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + CFF_Decoder_Get_Glyph_Callback get_glyph_callback; + CFF_Decoder_Free_Glyph_Callback free_glyph_callback; + + /* Type 1 stuff */ + FT_Service_PsCMaps psnames; /* for seac */ + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt* locals_len; /* array of subrs length (optional) */ + FT_Hash locals_hash; /* used if `num_subrs' was massaged */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + PS_Blend blend; /* for multiple master support */ + + FT_Long* buildchar; + FT_UInt len_buildchar; + + } PS_Decoder; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /************************************************************************** + * + * @struct: + * T1_BuilderRec + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * XXX + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * max_points :: + * maximum points in builder outline + * + * max_contours :: + * Maximum number of contours in builder outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * parse_state :: + * An enumeration which controls the charstring parsing state. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * funcs :: + * An array of function pointers for the builder. + */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /************************************************************************** + * + * T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 8 + + + /************************************************************************** + * + * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A + * minimum of 16 is required. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + FT_Error + (*parse_charstrings_old)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#else + FT_Error + (*parse_metrics)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#endif + + FT_Error + (*parse_charstrings)( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_Int num_subrs; + FT_Byte** subrs; + FT_UInt* subrs_len; /* array of subrs length (optional) */ + FT_Hash subrs_hash; /* used if `num_subrs' was massaged */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Long* buildchar; + FT_UInt len_buildchar; + + FT_Bool seac; + + FT_Generic cf2_instance; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct CFF_Builder_ CFF_Builder; + + + typedef FT_Error + (*CFF_Builder_Check_Points_Func)( CFF_Builder* builder, + FT_Int count ); + + typedef void + (*CFF_Builder_Add_Point_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + typedef FT_Error + (*CFF_Builder_Add_Point1_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + typedef FT_Error + (*CFF_Builder_Start_Point_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + typedef void + (*CFF_Builder_Close_Contour_Func)( CFF_Builder* builder ); + + typedef FT_Error + (*CFF_Builder_Add_Contour_Func)( CFF_Builder* builder ); + + typedef const struct CFF_Builder_FuncsRec_* CFF_Builder_Funcs; + + typedef struct CFF_Builder_FuncsRec_ + { + void + (*init)( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ); + + void + (*done)( CFF_Builder* builder ); + + CFF_Builder_Check_Points_Func check_points; + CFF_Builder_Add_Point_Func add_point; + CFF_Builder_Add_Point1_Func add_point1; + CFF_Builder_Add_Contour_Func add_contour; + CFF_Builder_Start_Point_Func start_point; + CFF_Builder_Close_Contour_Func close_contour; + + } CFF_Builder_FuncsRec; + + + /************************************************************************** + * + * @struct: + * CFF_Builder + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * The current glyph loader. + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * path_begun :: + * A flag which indicates that a new path has begun. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * hints_funcs :: + * Auxiliary pointer for hinting. + * + * hints_globals :: + * Auxiliary pointer for hinting. + * + * funcs :: + * A table of method pointers for this object. + */ + struct CFF_Builder_ + { + FT_Memory memory; + TT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + CFF_Builder_FuncsRec funcs; + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#define CFF_MAX_OPERANDS 48 +#define CFF_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ +#define CFF_MAX_TRANS_ELEMENTS 32 + + /* execution context charstring zone */ + + typedef struct CFF_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } CFF_Decoder_Zone; + + + typedef struct CFF_Decoder_ + { + CFF_Builder builder; + CFF_Font cff; + + FT_Fixed stack[CFF_MAX_OPERANDS + 1]; + FT_Fixed* top; + + CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; + CFF_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + FT_Pos glyph_width; + FT_Pos nominal_width; + + FT_Bool read_width; + FT_Bool width_only; + FT_Int num_hints; + FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + CFF_SubFont current_subfont; /* for current glyph_index */ + + CFF_Decoder_Get_Glyph_Callback get_glyph_callback; + CFF_Decoder_Free_Glyph_Callback free_glyph_callback; + + } CFF_Decoder; + + + typedef const struct CFF_Decoder_FuncsRec_* CFF_Decoder_Funcs; + + typedef struct CFF_Decoder_FuncsRec_ + { + void + (*init)( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ); + + FT_Error + (*prepare)( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_Error + (*parse_charstrings_old)( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ); +#endif + + FT_Error + (*parse_charstrings)( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + } CFF_Decoder_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /************************************************************************** + * + * @struct: + * AFM_ParserRec + * + * @description: + * An AFM_Parser is a parser for the AFM files. + * + * @fields: + * memory :: + * The object used for memory operations (alloc and realloc). + * + * stream :: + * This is an opaque object. + * + * FontInfo :: + * The result will be stored here. + * + * get_index :: + * A user provided function to get a glyph index by its name. + */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_Offset len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + FT_UInt32 + (*cff_random)( FT_UInt32 r ); + + void + (*ps_decoder_init)( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ); + + void + (*t1_make_subfont)( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + const CFF_Decoder_FuncsRec* cff_decoder_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backward compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* PSAUX_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/pshints.h b/FreeType/include/freetype/internal/pshints.h new file mode 100644 index 0000000..699acea --- /dev/null +++ b/FreeType/include/freetype/internal/pshints.h @@ -0,0 +1,700 @@ +/**************************************************************************** + * + * pshints.h + * + * Interface to Postscript-specific (Type 1 and Type 2) hints + * recorders (specification only). These are used to support native + * T1/T2 hints in the 'type1', 'cid', and 'cff' font drivers. + * + * 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 PSHINTS_H_ +#define PSHINTS_H_ + + +#include +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef void + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the 'open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method ('stem', 'stem3', or 'reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the 'close' method. It + * returns an error code if the hints were invalid or something strange + * happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************** + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************** + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 'hstem' and 'vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 coordinates in 16.16 format, used as (position,length) + * stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * 'coords[0]' is the absolute stem position (lowest coordinate); + * 'coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a 'ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then the + * real stem position is 'coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 values in 16.16 format, holding 3 (position,length) + * pairs for the counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the 'globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************** + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the 'open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method ('stems', 'hintmask', 'counters'). Note that these functions + * do not return an error code. + * + * - Close the recording session by calling the 'close' method. It + * returns an error code if the hints were invalid or something strange + * happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************** + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************** + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * 'hstem', 'vstem', 'hstemhm', and 'vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of 'count' (position,length) pairs in 16.16 format. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are '2*count' elements in the 'coords' array. Each even element + * is an absolute position in font units, each odd element is a length in + * font units. + * + * A length can be negative, in which case it must be either -20 or -21. + * It is interpreted as a 'ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Fixed* coordinates ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the 'hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined or + * activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point` should be 0. + * + * `bit_count` is the number of meaningful bits in the 'bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The 'bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask (this + * corresponds to the 'hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point` should be 0. + * + * `bit_count` is the number of meaningful bits in the 'bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The 'bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the 'close' method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the 'globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************** + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + + +#define FT_DEFINE_PSHINTER_INTERFACE( \ + class_, \ + get_globals_funcs_, \ + get_t1_funcs_, \ + get_t2_funcs_ ) \ + static const PSHinter_Interface class_ = \ + { \ + get_globals_funcs_, \ + get_t1_funcs_, \ + get_t2_funcs_ \ + }; + + +FT_END_HEADER + +#endif /* PSHINTS_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svbdf.h b/FreeType/include/freetype/internal/services/svbdf.h new file mode 100644 index 0000000..e4786ed --- /dev/null +++ b/FreeType/include/freetype/internal/services/svbdf.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svbdf.h + * + * The FreeType BDF services (specification). + * + * 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 SVBDF_H_ +#define SVBDF_H_ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + + +#define FT_DEFINE_SERVICE_BDFRec( class_, \ + get_charset_id_, \ + get_property_ ) \ + static const FT_Service_BDFRec class_ = \ + { \ + get_charset_id_, get_property_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVBDF_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svcfftl.h b/FreeType/include/freetype/internal/services/svcfftl.h new file mode 100644 index 0000000..6c62173 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svcfftl.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svcfftl.h + * + * The FreeType CFF tables loader service (specification). + * + * 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 SVCFFTL_H_ +#define SVCFFTL_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_CFF_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CFF_LOAD "cff-load" + + + typedef FT_UShort + (*FT_Get_Standard_Encoding_Func)( FT_UInt charcode ); + + typedef FT_Error + (*FT_Load_Private_Dict_Func)( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + typedef FT_Byte + (*FT_FD_Select_Get_Func)( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + typedef FT_Bool + (*FT_Blend_Check_Vector_Func)( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + typedef FT_Error + (*FT_Blend_Build_Vector_Func)( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + + FT_DEFINE_SERVICE( CFFLoad ) + { + FT_Get_Standard_Encoding_Func get_standard_encoding; + FT_Load_Private_Dict_Func load_private_dict; + FT_FD_Select_Get_Func fd_select_get; + FT_Blend_Check_Vector_Func blend_check_vector; + FT_Blend_Build_Vector_Func blend_build_vector; + }; + + +#define FT_DEFINE_SERVICE_CFFLOADREC( class_, \ + get_standard_encoding_, \ + load_private_dict_, \ + fd_select_get_, \ + blend_check_vector_, \ + blend_build_vector_ ) \ + static const FT_Service_CFFLoadRec class_ = \ + { \ + get_standard_encoding_, \ + load_private_dict_, \ + fd_select_get_, \ + blend_check_vector_, \ + blend_build_vector_ \ + }; + + +FT_END_HEADER + + +#endif + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svcid.h b/FreeType/include/freetype/internal/services/svcid.h new file mode 100644 index 0000000..555a5af --- /dev/null +++ b/FreeType/include/freetype/internal/services/svcid.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * + * svcid.h + * + * The FreeType CID font services (specification). + * + * Copyright (C) 2007-2019 by + * Derek 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 SVCID_H_ +#define SVCID_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CID "CID" + + typedef FT_Error + (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + typedef FT_Error + (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, + FT_Bool *is_cid ); + typedef FT_Error + (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + FT_DEFINE_SERVICE( CID ) + { + FT_CID_GetRegistryOrderingSupplementFunc get_ros; + FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; + FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; + }; + + +#define FT_DEFINE_SERVICE_CIDREC( class_, \ + get_ros_, \ + get_is_cid_, \ + get_cid_from_glyph_index_ ) \ + static const FT_Service_CIDRec class_ = \ + { \ + get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVCID_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svfntfmt.h b/FreeType/include/freetype/internal/services/svfntfmt.h new file mode 100644 index 0000000..6f4285e --- /dev/null +++ b/FreeType/include/freetype/internal/services/svfntfmt.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svfntfmt.h + * + * The FreeType font format service (specification only). + * + * 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 SVFNTFMT_H_ +#define SVFNTFMT_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data is a + * simple constant string pointer. + */ + +#define FT_SERVICE_ID_FONT_FORMAT "font-format" + +#define FT_FONT_FORMAT_TRUETYPE "TrueType" +#define FT_FONT_FORMAT_TYPE_1 "Type 1" +#define FT_FONT_FORMAT_BDF "BDF" +#define FT_FONT_FORMAT_PCF "PCF" +#define FT_FONT_FORMAT_TYPE_42 "Type 42" +#define FT_FONT_FORMAT_CID "CID Type 1" +#define FT_FONT_FORMAT_CFF "CFF" +#define FT_FONT_FORMAT_PFR "PFR" +#define FT_FONT_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* SVFNTFMT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svgldict.h b/FreeType/include/freetype/internal/services/svgldict.h new file mode 100644 index 0000000..0949621 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svgldict.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgldict.h + * + * The FreeType glyph dictionary services (specification). + * + * 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 SVGLDICT_H_ +#define SVGLDICT_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the index of + * a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + + +#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ + get_name_, \ + name_index_ ) \ + static const FT_Service_GlyphDictRec class_ = \ + { \ + get_name_, name_index_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVGLDICT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svgxval.h b/FreeType/include/freetype/internal/services/svgxval.h new file mode 100644 index 0000000..0bb76f3 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2019 by + * Masatake YAMATO, Red Hat 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 SVGXVAL_H_ +#define SVGXVAL_H_ + +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVGXVAL_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svkern.h b/FreeType/include/freetype/internal/services/svkern.h new file mode 100644 index 0000000..f992a32 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * svkern.h + * + * The FreeType Kerning service (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 SVKERN_H_ +#define SVKERN_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVKERN_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svmetric.h b/FreeType/include/freetype/internal/services/svmetric.h new file mode 100644 index 0000000..d688bc7 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svmetric.h @@ -0,0 +1,125 @@ +/**************************************************************************** + * + * svmetric.h + * + * The FreeType services for metrics variations (specification). + * + * Copyright (C) 2016-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 SVMETRIC_H_ +#define SVMETRIC_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service to manage the `HVAR, `MVAR', and `VVAR' OpenType tables. + * + */ + +#define FT_SERVICE_ID_METRICS_VARIATIONS "metrics-variations" + + + /* HVAR */ + + typedef FT_Error + (*FT_HAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_LSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_RSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* VVAR */ + + typedef FT_Error + (*FT_VAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_TSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_BSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_VOrg_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* MVAR */ + + typedef void + (*FT_Metrics_Adjust_Func)( FT_Face face ); + + + FT_DEFINE_SERVICE( MetricsVariations ) + { + FT_HAdvance_Adjust_Func hadvance_adjust; + FT_LSB_Adjust_Func lsb_adjust; + FT_RSB_Adjust_Func rsb_adjust; + + FT_VAdvance_Adjust_Func vadvance_adjust; + FT_TSB_Adjust_Func tsb_adjust; + FT_BSB_Adjust_Func bsb_adjust; + FT_VOrg_Adjust_Func vorg_adjust; + + FT_Metrics_Adjust_Func metrics_adjust; + }; + + +#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ ) \ + static const FT_Service_MetricsVariationsRec class_ = \ + { \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVMETRIC_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svmm.h b/FreeType/include/freetype/internal/services/svmm.h new file mode 100644 index 0000000..3652f20 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svmm.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * svmm.h + * + * The FreeType Multiple Masters and GX var services (specification). + * + * 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 SVMM_H_ +#define SVMM_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + /* use return value -1 to indicate that the new coordinates */ + /* are equal to the current ones; no changes are thus needed */ + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + /* use return value -1 to indicate that the new coordinates */ + /* are equal to the current ones; no changes are thus needed */ + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Get_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_Instance_Func)( FT_Face face, + FT_UInt instance_index ); + + typedef FT_Error + (*FT_Get_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Get_Var_Blend_Func)( FT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + typedef void + (*FT_Done_Blend_Func)( FT_Face ); + + typedef FT_Error + (*FT_Set_MM_WeightVector_Func)( FT_Face face, + FT_UInt len, + FT_Fixed* weight_vector ); + + typedef FT_Error + (*FT_Get_MM_WeightVector_Func)( FT_Face face, + FT_UInt* len, + FT_Fixed* weight_vector ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Blend_Func get_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + FT_Get_Var_Design_Func get_var_design; + FT_Set_Instance_Func set_instance; + FT_Set_MM_WeightVector_Func set_mm_weightvector; + FT_Get_MM_WeightVector_Func get_mm_weightvector; + + /* for internal use; only needed for code sharing between modules */ + FT_Get_Var_Blend_Func get_var_blend; + FT_Done_Blend_Func done_blend; + }; + + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_instance_, \ + set_weightvector_, \ + get_weightvector_, \ + get_var_blend_, \ + done_blend_ ) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_instance_, \ + set_weightvector_, \ + get_weightvector_, \ + get_var_blend_, \ + done_blend_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVMM_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svotval.h b/FreeType/include/freetype/internal/services/svotval.h new file mode 100644 index 0000000..cab4c6e --- /dev/null +++ b/FreeType/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svotval.h + * + * The FreeType OpenType validation service (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 SVOTVAL_H_ +#define SVOTVAL_H_ + +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVOTVAL_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svpfr.h b/FreeType/include/freetype/internal/services/svpfr.h new file mode 100644 index 0000000..fd01d61 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svpfr.h + * + * Internal PFR service functions (specification). + * + * 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 SVPFR_H_ +#define SVPFR_H_ + +#include FT_PFR_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + /* */ + +FT_END_HEADER + +#endif /* SVPFR_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svpostnm.h b/FreeType/include/freetype/internal/services/svpostnm.h new file mode 100644 index 0000000..18e3843 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,65 @@ +/**************************************************************************** + * + * svpostnm.h + * + * The FreeType PostScript name services (specification). + * + * 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 SVPOSTNM_H_ +#define SVPOSTNM_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given font + * when available. The `get_name' field should never be `NULL`. + * + * The corresponding function can return `NULL` to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ + static const FT_Service_PsFontNameRec class_ = \ + { \ + get_ps_font_name_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPOSTNM_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svprop.h b/FreeType/include/freetype/internal/services/svprop.h new file mode 100644 index 0000000..e48d015 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svprop.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svprop.h + * + * The FreeType property service (specification). + * + * Copyright (C) 2012-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 SVPROP_H_ +#define SVPROP_H_ + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PROPERTIES "properties" + + + typedef FT_Error + (*FT_Properties_SetFunc)( FT_Module module, + const char* property_name, + const void* value, + FT_Bool value_is_string ); + + typedef FT_Error + (*FT_Properties_GetFunc)( FT_Module module, + const char* property_name, + void* value ); + + + FT_DEFINE_SERVICE( Properties ) + { + FT_Properties_SetFunc set_property; + FT_Properties_GetFunc get_property; + }; + + +#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ + set_property_, \ + get_property_ ) \ + static const FT_Service_PropertiesRec class_ = \ + { \ + set_property_, \ + get_property_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPROP_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svpscmap.h b/FreeType/include/freetype/internal/services/svpscmap.h new file mode 100644 index 0000000..dfac3ba --- /dev/null +++ b/FreeType/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,145 @@ +/**************************************************************************** + * + * svpscmap.h + * + * The FreeType PostScript charmap service (specification). + * + * 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 SVPSCMAP_H_ +#define SVPSCMAP_H_ + +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. `NULL` if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. `NULL` if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * `NULL` if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_UInt32 + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + +#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ + unicode_value_, \ + unicodes_init_, \ + unicodes_char_index_, \ + unicodes_char_next_, \ + macintosh_name_, \ + adobe_std_strings_, \ + adobe_std_encoding_, \ + adobe_expert_encoding_ ) \ + static const FT_Service_PsCMapsRec class_ = \ + { \ + unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPSCMAP_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svpsinfo.h b/FreeType/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 0000000..fb4e0e3 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,86 @@ +/**************************************************************************** + * + * svpsinfo.h + * + * The FreeType PostScript info service (specification). + * + * 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 SVPSINFO_H_ +#define SVPSINFO_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Error + (*PS_GetFontExtraFunc)( FT_Face face, + PS_FontExtraRec* afont_extra ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + typedef FT_Long + (*PS_GetFontValueFunc)( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_GetFontExtraFunc ps_get_font_extra; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + PS_GetFontValueFunc ps_get_font_value; + }; + + +#define FT_DEFINE_SERVICE_PSINFOREC( class_, \ + get_font_info_, \ + ps_get_font_extra_, \ + has_glyph_names_, \ + get_font_private_, \ + get_font_value_ ) \ + static const FT_Service_PsInfoRec class_ = \ + { \ + get_font_info_, ps_get_font_extra_, has_glyph_names_, \ + get_font_private_, get_font_value_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPSINFO_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svsfnt.h b/FreeType/include/freetype/internal/services/svsfnt.h new file mode 100644 index 0000000..464aa20 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * svsfnt.h + * + * The FreeType SFNT table loading service (specification). + * + * 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 SVSFNT_H_ +#define SVSFNT_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ + static const FT_Service_SFNT_TableRec class_ = \ + { \ + load_, get_, info_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVSFNT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svttcmap.h b/FreeType/include/freetype/internal/services/svttcmap.h new file mode 100644 index 0000000..0fcb813 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svttcmap.h + * + * The FreeType TrueType/sfnt cmap extra information service. + * + * Copyright (C) 2003-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. + * + */ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef SVTTCMAP_H_ +#define SVTTCMAP_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /************************************************************************** + * + * @struct: + * TT_CMapInfo + * + * @description: + * A structure used to store TrueType/sfnt specific cmap information + * which is not covered by the generic @FT_CharMap structure. This + * structure can be accessed with the @FT_Get_TT_CMap_Info function. + * + * @fields: + * language :: + * The language ID used in Mac fonts. Definitions of values are in + * `ttnameid.h`. + * + * format :: + * The cmap format. OpenType 1.6 defines the formats 0 (byte encoding + * table), 2~(high-byte mapping through table), 4~(segment mapping to + * delta values), 6~(trimmed table mapping), 8~(mixed 16-bit and 32-bit + * coverage), 10~(trimmed array), 12~(segmented coverage), 13~(last + * resort font), and 14 (Unicode Variation Sequences). + */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + + +#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ + static const FT_Service_TTCMapsRec class_ = \ + { \ + get_cmap_info_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVTTCMAP_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svtteng.h b/FreeType/include/freetype/internal/services/svtteng.h new file mode 100644 index 0000000..a852f5c --- /dev/null +++ b/FreeType/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * + * svtteng.h + * + * The FreeType TrueType engine query service (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 SVTTENG_H_ +#define SVTTENG_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVTTENG_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svttglyf.h b/FreeType/include/freetype/internal/services/svttglyf.h new file mode 100644 index 0000000..c879877 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * svttglyf.h + * + * The FreeType TrueType glyph service. + * + * Copyright (C) 2007-2019 by + * David Turner. + * + * 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 SVTTGLYF_H_ +#define SVTTGLYF_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + + +#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ + static const FT_Service_TTGlyfRec class_ = \ + { \ + get_location_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVTTGLYF_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/services/svwinfnt.h b/FreeType/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 0000000..38ee020 --- /dev/null +++ b/FreeType/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * svwinfnt.h + * + * The FreeType Windows FNT/FONT service (specification). + * + * 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 SVWINFNT_H_ +#define SVWINFNT_H_ + +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVWINFNT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/sfnt.h b/FreeType/include/freetype/internal/sfnt.h new file mode 100644 index 0000000..225f40d --- /dev/null +++ b/FreeType/include/freetype/internal/sfnt.h @@ -0,0 +1,875 @@ +/**************************************************************************** + * + * sfnt.h + * + * High-level 'sfnt' driver 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 SFNT_H_ +#define SFNT_H_ + + +#include +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @functype: + * TT_Init_Face_Func + * + * @description: + * First part of the SFNT face object initialization. This finds the + * face in a SFNT file or collection, and load its format tag in + * face->format_tag. + * + * @input: + * stream :: + * The input stream. + * + * face :: + * A handle to the target face object. + * + * face_index :: + * The index of the TrueType font, if we are opening a collection, in + * bits 0-15. The numbered instance index~+~1 of a GX (sub)font, if + * applicable, in bits 16-30. + * + * num_params :: + * The number of additional parameters. + * + * params :: + * Optional additional parameters. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be at the font file's origin. + * + * This function recognizes fonts embedded in a 'TrueType collection'. + * + * Once the format tag has been validated by the font driver, it should + * then call the TT_Load_Face_Func() callback to read the rest of the + * SFNT tables in the object. + */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Face_Func + * + * @description: + * Second part of the SFNT face object initialization. This loads the + * common SFNT tables (head, OS/2, maxp, metrics, etc.) in the face + * object. + * + * @input: + * stream :: + * The input stream. + * + * face :: + * A handle to the target face object. + * + * face_index :: + * The index of the TrueType font, if we are opening a collection, in + * bits 0-15. The numbered instance index~+~1 of a GX (sub)font, if + * applicable, in bits 16-30. + * + * num_params :: + * The number of additional parameters. + * + * params :: + * Optional additional parameters. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function must be called after TT_Init_Face_Func(). + */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /************************************************************************** + * + * @functype: + * TT_Done_Face_Func + * + * @description: + * A callback used to delete the common SFNT data from a face. + * + * @input: + * face :: + * A handle to the target face object. + * + * @note: + * This function does NOT destroy the face object. + */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Any_Func + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * The face object to look for. + * + * tag :: + * The tag of table to load. Use the value 0 if you want to access the + * whole font file, else set this parameter to a valid TrueType table + * tag that you can forge with the MAKE_TT_TAG macro. + * + * offset :: + * The starting offset in the table (or the file if tag == 0). + * + * length :: + * The address of the decision variable: + * + * If `length == NULL`: Loads the whole table. Returns an error if + * 'offset' == 0! + * + * If `*length == 0`: Exits immediately; returning the length of the + * given table or of the font file, depending on the value of 'tag'. + * + * If `*length != 0`: Loads the next 'length' bytes of table or font, + * starting at offset 'offset' (in table or font too). + * + * @output: + * buffer :: + * The address of target buffer. + * + * @return: + * TrueType error code. 0 means success. + */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @functype: + * TT_Find_SBit_Image_Func + * + * @description: + * Check whether an embedded bitmap (an 'sbit') exists for a given glyph, + * at a given strike. + * + * @input: + * face :: + * The target face object. + * + * glyph_index :: + * The glyph index. + * + * strike_index :: + * The current strike index. + * + * @output: + * arange :: + * The SBit range containing the glyph index. + * + * astrike :: + * The SBit strike containing the glyph index. + * + * aglyph_offset :: + * The offset of the glyph data in 'EBDT' table. + * + * @return: + * FreeType error code. 0 means success. Returns + * SFNT_Err_Invalid_Argument if no sbit exists for the requested glyph. + */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /************************************************************************** + * + * @functype: + * TT_Load_SBit_Metrics_Func + * + * @description: + * Get the big metrics for a given embedded bitmap. + * + * @input: + * stream :: + * The input stream. + * + * range :: + * The SBit range containing the glyph. + * + * @output: + * big_metrics :: + * A big SBit metrics structure for the glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be positioned at the glyph's offset within the + * 'EBDT' table before the call. + * + * If the image format uses variable metrics, the stream cursor is + * positioned just after the metrics header in the 'EBDT' table on + * function exit. + */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /************************************************************************** + * + * @functype: + * TT_Load_SBit_Image_Func + * + * @description: + * Load a given glyph sbit image from the font resource. This also + * returns its metrics. + * + * @input: + * face :: + * The target face object. + * + * strike_index :: + * The strike index. + * + * glyph_index :: + * The current glyph index. + * + * load_flags :: + * The current load flags. + * + * stream :: + * The input stream. + * + * @output: + * amap :: + * The target pixmap. + * + * ametrics :: + * A big sbit metrics structure for the glyph image. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no glyph + * sbit exists for the index. + * + * @note: + * The `map.buffer` field is always freed before the glyph is loaded. + */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @functype: + * TT_Set_SBit_Strike_Func + * + * @description: + * Select an sbit strike for a given size request. + * + * @input: + * face :: + * The target face object. + * + * req :: + * The size request. + * + * @output: + * astrike_index :: + * The index of the sbit strike. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no sbit + * strike exists for the selected ppem values. + */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Strike_Metrics_Func + * + * @description: + * Load the metrics of a given strike. + * + * @input: + * face :: + * The target face object. + * + * strike_index :: + * The strike index. + * + * @output: + * metrics :: + * the metrics of the strike. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no such + * sbit strike exists. + */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /************************************************************************** + * + * @functype: + * TT_Get_PS_Name_Func + * + * @description: + * Get the PostScript glyph name of a glyph. + * + * @input: + * idx :: + * The glyph index. + * + * PSname :: + * The address of a string pointer. Will be `NULL` in case of error, + * otherwise it is a pointer to the glyph name. + * + * You must not modify the returned string! + * + * @output: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Metrics_Func + * + * @description: + * Load a metrics table, which is a table with a horizontal and a + * vertical version. + * + * @input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * vertical :: + * A boolean flag. If set, load the vertical one. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Metrics_Func + * + * @description: + * Load the horizontal or vertical header in a face object. + * + * @input: + * face :: + * A handle to the target face object. + * + * vertical :: + * A boolean flag. If set, load vertical metrics. + * + * gindex :: + * The glyph index. + * + * @output: + * abearing :: + * The horizontal (or vertical) bearing. Set to zero in case of error. + * + * aadvance :: + * The horizontal (or vertical) advance. Set to zero in case of error. + */ + typedef void + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /************************************************************************** + * + * @functype: + * TT_Set_Palette_Func + * + * @description: + * Load the colors into `face->palette` for a given palette index. + * + * @input: + * face :: + * The target face object. + * + * idx :: + * The palette index. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Set_Palette_Func)( TT_Face face, + FT_UInt idx ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Colr_Layer_Func + * + * @description: + * Iteratively get the color layer data of a given glyph index. + * + * @input: + * face :: + * The target 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). + * + * @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. + */ + typedef FT_Bool + (*TT_Get_Colr_Layer_Func)( TT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @functype: + * TT_Blend_Colr_Func + * + * @description: + * Blend the bitmap in `new_glyph` into `base_glyph` using the color + * specified by `color_index`. If `color_index` is 0xFFFF, use + * `face->foreground_color` if `face->have_foreground_color` is set. + * Otherwise check `face->palette_data.palette_flags`: If present and + * @FT_PALETTE_FOR_DARK_BACKGROUND is set, use BGRA value 0xFFFFFFFF + * (white opaque). Otherwise use BGRA value 0x000000FF (black opaque). + * + * @input: + * face :: + * The target face object. + * + * color_index :: + * Color index from the COLR table. + * + * base_glyph :: + * Slot for bitmap to be merged into. The underlying bitmap may get + * reallocated. + * + * new_glyph :: + * Slot to be incooperated into `base_glyph`. + * + * @return: + * FreeType error code. 0 means success. Returns an error if + * color_index is invalid or reallocation fails. + */ + typedef FT_Error + (*TT_Blend_Colr_Func)( TT_Face face, + FT_UInt color_index, + FT_GlyphSlot base_glyph, + FT_GlyphSlot new_glyph ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Name_Func + * + * @description: + * From the 'name' table, return a given ENGLISH name record in ASCII. + * + * @input: + * face :: + * A handle to the source face object. + * + * nameid :: + * The name id of the name record to return. + * + * @inout: + * name :: + * The address of an allocated string pointer. `NULL` if no name is + * present. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Get_Name_Func)( TT_Face face, + FT_UShort nameid, + FT_String** name ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Name_ID_Func + * + * @description: + * Search whether an ENGLISH version for a given name ID is in the 'name' + * table. + * + * @input: + * face :: + * A handle to the source face object. + * + * nameid :: + * The name id of the name record to return. + * + * @output: + * win :: + * If non-negative, an index into the 'name' table with the + * corresponding (3,1) or (3,0) Windows entry. + * + * apple :: + * If non-negative, an index into the 'name' table with the + * corresponding (1,0) Apple entry. + * + * @return: + * 1 if there is either a win or apple entry (or both), 0 otheriwse. + */ + typedef FT_Bool + (*TT_Get_Name_ID_Func)( TT_Face face, + FT_UShort nameid, + FT_Int *win, + FT_Int *apple ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Table_Func + * + * @description: + * Load a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The function uses `face->goto_table` to seek the stream to the start + * of the table, except while loading the font directory. + */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /************************************************************************** + * + * @functype: + * TT_Free_Table_Func + * + * @description: + * Free a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: + * A handle to the source face object. + * + * left_glyph :: + * The left glyph index. + * + * right_glyph :: + * The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /************************************************************************** + * + * @struct: + * SFNT_Interface + * + * @description: + * This structure holds pointers to the functions used to load and free + * the basic tables that are required in a 'sfnt' font file. + * + * @fields: + * Check the various xxx_Func() descriptions for details. + */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + + TT_Load_SBit_Image_Func load_sbit_image; + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Load_Table_Func load_cpal; + TT_Load_Table_Func load_colr; + TT_Free_Table_Func free_cpal; + TT_Free_Table_Func free_colr; + TT_Set_Palette_Func set_palette; + TT_Get_Colr_Layer_Func get_colr_layer; + TT_Blend_Colr_Func colr_blend; + + TT_Get_Metrics_Func get_metrics; + + TT_Get_Name_Func get_name; + TT_Get_Name_ID_Func get_name_id; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + + +#define FT_DEFINE_SFNT_INTERFACE( \ + class_, \ + goto_table_, \ + init_face_, \ + load_face_, \ + done_face_, \ + get_interface_, \ + load_any_, \ + load_head_, \ + load_hhea_, \ + load_cmap_, \ + load_maxp_, \ + load_os2_, \ + load_post_, \ + load_name_, \ + free_name_, \ + load_kern_, \ + load_gasp_, \ + load_pclt_, \ + load_bhed_, \ + load_sbit_image_, \ + get_psname_, \ + free_psnames_, \ + get_kerning_, \ + load_font_dir_, \ + load_hmtx_, \ + load_eblc_, \ + free_eblc_, \ + set_sbit_strike_, \ + load_strike_metrics_, \ + load_cpal_, \ + load_colr_, \ + free_cpal_, \ + free_colr_, \ + set_palette_, \ + get_colr_layer_, \ + colr_blend_, \ + get_metrics_, \ + get_name_, \ + get_name_id_ ) \ + static const SFNT_Interface class_ = \ + { \ + goto_table_, \ + init_face_, \ + load_face_, \ + done_face_, \ + get_interface_, \ + load_any_, \ + load_head_, \ + load_hhea_, \ + load_cmap_, \ + load_maxp_, \ + load_os2_, \ + load_post_, \ + load_name_, \ + free_name_, \ + load_kern_, \ + load_gasp_, \ + load_pclt_, \ + load_bhed_, \ + load_sbit_image_, \ + get_psname_, \ + free_psnames_, \ + get_kerning_, \ + load_font_dir_, \ + load_hmtx_, \ + load_eblc_, \ + free_eblc_, \ + set_sbit_strike_, \ + load_strike_metrics_, \ + load_cpal_, \ + load_colr_, \ + free_cpal_, \ + free_colr_, \ + set_palette_, \ + get_colr_layer_, \ + colr_blend_, \ + get_metrics_, \ + get_name_, \ + get_name_id_ \ + }; + + +FT_END_HEADER + +#endif /* SFNT_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/t1types.h b/FreeType/include/freetype/internal/t1types.h new file mode 100644 index 0000000..e197a1a --- /dev/null +++ b/FreeType/include/freetype/internal/t1types.h @@ -0,0 +1,260 @@ +/**************************************************************************** + * + * t1types.h + * + * Basic Type1/Type2 type 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 T1TYPES_H_ +#define T1TYPES_H_ + + +#include +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_HASH_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * T1_EncodingRec + * + * @description: + * A structure modeling a custom encoding. + * + * @fields: + * num_chars :: + * The number of character codes in the encoding. Usually 256. + * + * code_first :: + * The lowest valid character code in the encoding. + * + * code_last :: + * The highest valid character code in the encoding + 1. When equal to + * code_first there are no valid character codes. + * + * char_index :: + * An array of corresponding glyph indices. + * + * char_name :: + * An array of corresponding glyph names. + */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + /* used to hold extra data of PS_FontInfoRec that + * cannot be stored in the publicly defined structure. + * + * Note these can't be blended with multiple-masters. + */ + typedef struct PS_FontExtraRec_ + { + FT_UShort fs_type; + + } PS_FontExtraRec; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_FontExtraRec font_extra; /* font info extra fields */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_UInt* subrs_len; + FT_Hash subrs_hash; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_UInt* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_Int num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_UInt index1; + FT_UInt index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; + FT_Fixed Descender; + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_UInt NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_UInt NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Long* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + PS_FontExtraRec font_extra; +#if 0 + void* afm_data; +#endif + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* T1TYPES_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/internal/tttypes.h b/FreeType/include/freetype/internal/tttypes.h new file mode 100644 index 0000000..5e9f40e --- /dev/null +++ b/FreeType/include/freetype/internal/tttypes.h @@ -0,0 +1,1854 @@ +/**************************************************************************** + * + * tttypes.h + * + * Basic SFNT/TrueType type 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 TTTYPES_H_ +#define TTTYPES_H_ + + +#include +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H +#include FT_COLOR_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TTC_HeaderRec + * + * @description: + * TrueType collection header. This table contains the offsets of the + * font headers of each distinct TrueType face in the file. + * + * @fields: + * tag :: + * Must be 'ttc~' to indicate a TrueType collection. + * + * version :: + * The version number. + * + * count :: + * The number of faces in the collection. The specification says this + * should be an unsigned long, but we use a signed long since we need + * the value -1 for specific purposes. + * + * offsets :: + * The offsets of the font headers, one per face. + */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /************************************************************************** + * + * @struct: + * SFNT_HeaderRec + * + * @description: + * SFNT file format header. + * + * @fields: + * format_tag :: + * The font format tag. + * + * num_tables :: + * The number of tables in file. + * + * search_range :: + * Must be '16 * (max power of 2 <= num_tables)'. + * + * entry_selector :: + * Must be log2 of 'search_range / 16'. + * + * range_shift :: + * Must be 'num_tables * 16 - search_range'. + */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /************************************************************************** + * + * @struct: + * TT_TableRec + * + * @description: + * This structure describes a given table of a TrueType font. + * + * @fields: + * Tag :: + * A four-bytes tag describing the table. + * + * CheckSum :: + * The table checksum. This value can be ignored. + * + * Offset :: + * The offset of the table from the start of the TrueType font in its + * resource. + * + * Length :: + * The table length (in bytes). + */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /************************************************************************** + * + * @struct: + * WOFF_HeaderRec + * + * @description: + * WOFF file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF/#WOFFHeader + */ + typedef struct WOFF_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_UShort reserved; + FT_ULong totalSfntSize; + FT_UShort majorVersion; + FT_UShort minorVersion; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + } WOFF_HeaderRec, *WOFF_Header; + + + /************************************************************************** + * + * @struct: + * WOFF_TableRec + * + * @description: + * This structure describes a given table of a WOFF font. + * + * @fields: + * Tag :: + * A four-bytes tag describing the table. + * + * Offset :: + * The offset of the table from the start of the WOFF font in its + * resource. + * + * CompLength :: + * Compressed table length (in bytes). + * + * OrigLength :: + * Uncompressed table length (in bytes). + * + * CheckSum :: + * The table checksum. This value can be ignored. + * + * OrigOffset :: + * The uncompressed table file offset. This value gets computed while + * constructing the (uncompressed) SFNT header. It is not contained in + * the WOFF file. + */ + typedef struct WOFF_TableRec_ + { + FT_ULong Tag; /* table ID */ + FT_ULong Offset; /* table file offset */ + FT_ULong CompLength; /* compressed table length */ + FT_ULong OrigLength; /* uncompressed table length */ + FT_ULong CheckSum; /* uncompressed checksum */ + + FT_ULong OrigOffset; /* uncompressed table file offset */ + /* (not in the WOFF file) */ + } WOFF_TableRec, *WOFF_Table; + + + /************************************************************************** + * + * @struct: + * TT_LongMetricsRec + * + * @description: + * A structure modeling the long metrics of the 'hmtx' and 'vmtx' + * TrueType tables. The values are expressed in font units. + * + * @fields: + * advance :: + * The advance width or height for the glyph. + * + * bearing :: + * The left-side or top-side bearing for the glyph. + */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /************************************************************************** + * + * @type: + * TT_ShortMetrics + * + * @description: + * A simple type to model the short metrics of the 'hmtx' and 'vmtx' + * tables. + */ + typedef FT_Short TT_ShortMetrics; + + + /************************************************************************** + * + * @struct: + * TT_NameRec + * + * @description: + * A structure modeling TrueType name records. Name records are used to + * store important strings like family name, style name, copyright, + * etc. in _localized_ versions (i.e., language, encoding, etc). + * + * @fields: + * platformID :: + * The ID of the name's encoding platform. + * + * encodingID :: + * The platform-specific ID for the name's encoding. + * + * languageID :: + * The platform-specific ID for the name's language. + * + * nameID :: + * The ID specifying what kind of name this is. + * + * stringLength :: + * The length of the string in bytes. + * + * stringOffset :: + * The offset to the string in the 'name' table. + * + * string :: + * A pointer to the string's bytes. Note that these are usually UTF-16 + * encoded characters. + */ + typedef struct TT_NameRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameRec, *TT_Name; + + + /************************************************************************** + * + * @struct: + * TT_LangTagRec + * + * @description: + * A structure modeling language tag records in SFNT 'name' tables, + * introduced in OpenType version 1.6. + * + * @fields: + * stringLength :: + * The length of the string in bytes. + * + * stringOffset :: + * The offset to the string in the 'name' table. + * + * string :: + * A pointer to the string's bytes. Note that these are UTF-16BE + * encoded characters. + */ + typedef struct TT_LangTagRec_ + { + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_LangTagRec, *TT_LangTag; + + + /************************************************************************** + * + * @struct: + * TT_NameTableRec + * + * @description: + * A structure modeling the TrueType name table. + * + * @fields: + * format :: + * The format of the name table. + * + * numNameRecords :: + * The number of names in table. + * + * storageOffset :: + * The offset of the name table in the 'name' TrueType table. + * + * names :: + * An array of name records. + * + * numLangTagRecords :: + * The number of language tags in table. + * + * langTags :: + * An array of language tag records. + * + * stream :: + * The file's input stream. + */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameRec* names; + FT_UInt numLangTagRecords; + TT_LangTagRec* langTags; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_GaspRangeRec + * + * @description: + * A tiny structure used to model a gasp range according to the TrueType + * specification. + * + * @fields: + * maxPPEM :: + * The maximum ppem value to which `gaspFlag` applies. + * + * gaspFlag :: + * A flag describing the grid-fitting and anti-aliasing modes to be + * used. + */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /************************************************************************** + * + * @struct: + * TT_GaspRec + * + * @description: + * A structure modeling the TrueType 'gasp' table used to specify + * grid-fitting and anti-aliasing behaviour. + * + * @fields: + * version :: + * The version number. + * + * numRanges :: + * The number of gasp ranges in table. + * + * gaspRanges :: + * An array of gasp ranges. + */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_SBit_MetricsRec + * + * @description: + * A structure used to hold the big metrics of a given glyph bitmap in a + * TrueType or OpenType font. These are usually found in the 'EBDT' + * (Microsoft) or 'bloc' (Apple) table. + * + * @fields: + * height :: + * The glyph height in pixels. + * + * width :: + * The glyph width in pixels. + * + * horiBearingX :: + * The horizontal left bearing. + * + * horiBearingY :: + * The horizontal top bearing. + * + * horiAdvance :: + * The horizontal advance. + * + * vertBearingX :: + * The vertical left bearing. + * + * vertBearingY :: + * The vertical top bearing. + * + * vertAdvance :: + * The vertical advance. + */ + typedef struct TT_SBit_MetricsRec_ + { + FT_UShort height; + FT_UShort width; + + FT_Short horiBearingX; + FT_Short horiBearingY; + FT_UShort horiAdvance; + + FT_Short vertBearingX; + FT_Short vertBearingY; + FT_UShort vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_SmallMetricsRec + * + * @description: + * A structure used to hold the small metrics of a given glyph bitmap in + * a TrueType or OpenType font. These are usually found in the 'EBDT' + * (Microsoft) or the 'bdat' (Apple) table. + * + * @fields: + * height :: + * The glyph height in pixels. + * + * width :: + * The glyph width in pixels. + * + * bearingX :: + * The left-side bearing. + * + * bearingY :: + * The top-side bearing. + * + * advance :: + * The advance width or height. + */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_LineMetricsRec + * + * @description: + * A structure used to describe the text line metrics of a given bitmap + * strike, for either a horizontal or vertical layout. + * + * @fields: + * ascender :: + * The ascender in pixels. + * + * descender :: + * The descender in pixels. + * + * max_width :: + * The maximum glyph width in pixels. + * + * caret_slope_enumerator :: + * Rise of the caret slope, typically set to 1 for non-italic fonts. + * + * caret_slope_denominator :: + * Rise of the caret slope, typically set to 0 for non-italic fonts. + * + * caret_offset :: + * Offset in pixels to move the caret for proper positioning. + * + * min_origin_SB :: + * Minimum of horiBearingX (resp. vertBearingY). + * min_advance_SB :: + * Minimum of + * + * horizontal advance - ( horiBearingX + width ) + * + * resp. + * + * vertical advance - ( vertBearingY + height ) + * + * max_before_BL :: + * Maximum of horiBearingY (resp. vertBearingY). + * + * min_after_BL :: + * Minimum of + * + * horiBearingY - height + * + * resp. + * + * vertBearingX - width + * + * pads :: + * Unused (to make the size of the record a multiple of 32 bits. + */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_RangeRec + * + * @description: + * A TrueType/OpenType subIndexTable as defined in the 'EBLC' (Microsoft) + * or 'bloc' (Apple) tables. + * + * @fields: + * first_glyph :: + * The first glyph index in the range. + * + * last_glyph :: + * The last glyph index in the range. + * + * index_format :: + * The format of index table. Valid values are 1 to 5. + * + * image_format :: + * The format of 'EBDT' image data. + * + * image_offset :: + * The offset to image data in 'EBDT'. + * + * image_size :: + * For index formats 2 and 5. This is the size in bytes of each glyph + * bitmap. + * + * big_metrics :: + * For index formats 2 and 5. This is the big metrics for each glyph + * bitmap. + * + * num_glyphs :: + * For index formats 4 and 5. This is the number of glyphs in the code + * array. + * + * glyph_offsets :: + * For index formats 1 and 3. + * + * glyph_codes :: + * For index formats 4 and 5. + * + * table_offset :: + * The offset of the index table in the 'EBLC' table. Only used during + * strike loading. + */ + typedef struct TT_SBit_RangeRec_ + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /************************************************************************** + * + * @struct: + * TT_SBit_StrikeRec + * + * @description: + * A structure used describe a given bitmap strike in the 'EBLC' + * (Microsoft) or 'bloc' (Apple) tables. + * + * @fields: + * num_index_ranges :: + * The number of index ranges. + * + * index_ranges :: + * An array of glyph index ranges. + * + * color_ref :: + * Unused. `color_ref` is put in for future enhancements, but these + * fields are already in use by other platforms (e.g. Newton). For + * details, please see + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html + * + * hori :: + * The line metrics for horizontal layouts. + * + * vert :: + * The line metrics for vertical layouts. + * + * start_glyph :: + * The lowest glyph index for this strike. + * + * end_glyph :: + * The highest glyph index for this strike. + * + * x_ppem :: + * The number of horizontal pixels per EM. + * + * y_ppem :: + * The number of vertical pixels per EM. + * + * bit_depth :: + * The bit depth. Valid values are 1, 2, 4, and 8. + * + * flags :: + * Is this a vertical or horizontal strike? For details, please see + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html + */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /************************************************************************** + * + * @struct: + * TT_SBit_ComponentRec + * + * @description: + * A simple structure to describe a compound sbit element. + * + * @fields: + * glyph_code :: + * The element's glyph index. + * + * x_offset :: + * The element's left bearing. + * + * y_offset :: + * The element's top bearing. + */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /************************************************************************** + * + * @struct: + * TT_SBit_ScaleRec + * + * @description: + * A structure used describe a given bitmap scaling table, as defined in + * the 'EBSC' table. + * + * @fields: + * hori :: + * The horizontal line metrics. + * + * vert :: + * The vertical line metrics. + * + * x_ppem :: + * The number of horizontal pixels per EM. + * + * y_ppem :: + * The number of vertical pixels per EM. + * + * x_ppem_substitute :: + * Substitution x_ppem value. + * + * y_ppem_substitute :: + * Substitution y_ppem value. + */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_Post_20Rec + * + * @description: + * Postscript names sub-table, format 2.0. Stores the PS name of each + * glyph in the font face. + * + * @fields: + * num_glyphs :: + * The number of named glyphs in the table. + * + * num_names :: + * The number of PS names stored in the table. + * + * glyph_indices :: + * The indices of the glyphs in the names arrays. + * + * glyph_names :: + * The PS names not in Mac Encoding. + */ + typedef struct TT_Post_20Rec_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20Rec, *TT_Post_20; + + + /************************************************************************** + * + * @struct: + * TT_Post_25Rec + * + * @description: + * Postscript names sub-table, format 2.5. Stores the PS name of each + * glyph in the font face. + * + * @fields: + * num_glyphs :: + * The number of glyphs in the table. + * + * offsets :: + * An array of signed offsets in a normal Mac Postscript name encoding. + */ + typedef struct TT_Post_25_ + { + FT_UShort num_glyphs; + FT_Char* offsets; + + } TT_Post_25Rec, *TT_Post_25; + + + /************************************************************************** + * + * @struct: + * TT_Post_NamesRec + * + * @description: + * Postscript names table, either format 2.0 or 2.5. + * + * @fields: + * loaded :: + * A flag to indicate whether the PS names are loaded. + * + * format_20 :: + * The sub-table used for format 2.0. + * + * format_25 :: + * The sub-table used for format 2.5. + */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + + union + { + TT_Post_20Rec format_20; + TT_Post_25Rec format_25; + + } names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based bitmap + * fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. USHORT + * strikeCount Number of strikes (bitmap sizes) in this table. ULONG + * stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. USHORT numItems + * Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each `value + * set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_ULong strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * This structure/class is defined here because it is common to the + * following formats: TTF, OpenType-TT, and OpenType-CFF. + * + * Note, however, that the classes TT_Size and TT_GlyphSlot are not shared + * between font drivers, and are thus defined in `ttobjs.h`. + * + */ + + + /************************************************************************** + * + * @type: + * TT_Face + * + * @description: + * A handle to a TrueType face/font object. A TT_Face encapsulates the + * resolution and scaling independent parts of a TrueType font resource. + * + * @note: + * The TT_Face structure is also used as a 'parent class' for the + * OpenType-CFF class (T2_Face). + */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /************************************************************************** + * + * @functype: + * TT_Loader_GotoTableFunc + * + * @description: + * Seeks a stream to the start of a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + * + * tag :: + * A 4-byte tag used to name the table. + * + * stream :: + * The input stream. + * + * @output: + * length :: + * The length of the table in bytes. Set to 0 if not needed. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be at the font file's origin. + */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_StartGlyphFunc + * + * @description: + * Seeks a stream to the start of a given glyph element, and opens a + * frame for it. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + * + * glyph index :: The index of the glyph to access. + * + * offset :: + * The offset of the glyph according to the 'locations' table. + * + * byte_count :: + * The size of the frame in bytes. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function is normally equivalent to FT_STREAM_SEEK(offset) + * followed by FT_FRAME_ENTER(byte_count) with the loader's stream, but + * alternative formats (e.g. compressed ones) might use something + * different. + */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_ReadGlyphFunc + * + * @description: + * Reads one glyph element (its header, a simple glyph, or a composite) + * from the loader's current stream frame. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_EndGlyphFunc + * + * @description: + * Closes the current loader stream frame for the glyph. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + typedef enum TT_SbitTableType_ + { + TT_SBIT_TABLE_TYPE_NONE = 0, + TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */ + /* `bloc' (Apple) */ + TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google) */ + TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple) */ + + /* do not remove */ + TT_SBIT_TABLE_TYPE_MAX + + } TT_SbitTableType; + + + /* OpenType 1.8 brings new tables for variation font support; */ + /* to make the old MM and GX fonts still work we need to check */ + /* the presence (and validity) of the functionality provided */ + /* by those tables. The following flag macros are for the */ + /* field `variation_support'. */ + /* */ + /* Note that `fvar' gets checked immediately at font loading, */ + /* while the other features are only loaded if MM support is */ + /* actually requested. */ + + /* FVAR */ +#define TT_FACE_FLAG_VAR_FVAR ( 1 << 0 ) + + /* HVAR */ +#define TT_FACE_FLAG_VAR_HADVANCE ( 1 << 1 ) +#define TT_FACE_FLAG_VAR_LSB ( 1 << 2 ) +#define TT_FACE_FLAG_VAR_RSB ( 1 << 3 ) + + /* VVAR */ +#define TT_FACE_FLAG_VAR_VADVANCE ( 1 << 4 ) +#define TT_FACE_FLAG_VAR_TSB ( 1 << 5 ) +#define TT_FACE_FLAG_VAR_BSB ( 1 << 6 ) +#define TT_FACE_FLAG_VAR_VORG ( 1 << 7 ) + + /* MVAR */ +#define TT_FACE_FLAG_VAR_MVAR ( 1 << 8 ) + + + /************************************************************************** + * + * TrueType Face Type + * + * @struct: + * TT_Face + * + * @description: + * The TrueType face class. These objects model the resolution and + * point-size independent data found in a TrueType font file. + * + * @fields: + * root :: + * The base FT_Face structure, managed by the base layer. + * + * ttc_header :: + * The TrueType collection header, used when the file is a 'ttc' rather + * than a 'ttf'. For ordinary font files, the field `ttc_header.count` + * is set to 0. + * + * format_tag :: + * The font format tag. + * + * num_tables :: + * The number of TrueType tables in this font file. + * + * dir_tables :: + * The directory of TrueType tables for this font file. + * + * header :: + * The font's font header ('head' table). Read on font opening. + * + * horizontal :: + * The font's horizontal header ('hhea' table). This field also + * contains the associated horizontal metrics table ('hmtx'). + * + * max_profile :: + * The font's maximum profile table. Read on font opening. Note that + * some maximum values cannot be taken directly from this table. We + * thus define additional fields below to hold the computed maxima. + * + * vertical_info :: + * A boolean which is set when the font file contains vertical metrics. + * If not, the value of the 'vertical' field is undefined. + * + * vertical :: + * The font's vertical header ('vhea' table). This field also contains + * the associated vertical metrics table ('vmtx'), if found. + * IMPORTANT: The contents of this field is undefined if the + * `vertical_info` field is unset. + * + * num_names :: + * The number of name records within this TrueType font. + * + * name_table :: + * The table of name records ('name'). + * + * os2 :: + * The font's OS/2 table ('OS/2'). + * + * postscript :: + * The font's PostScript table ('post' table). The PostScript glyph + * names are not loaded by the driver on face opening. See the + * 'ttpost' module for more details. + * + * cmap_table :: + * Address of the face's 'cmap' SFNT table in memory (it's an extracted + * frame). + * + * cmap_size :: + * The size in bytes of the `cmap_table` described above. + * + * goto_table :: + * A function called by each TrueType table loader to position a + * stream's cursor to the start of a given table according to its tag. + * It defaults to TT_Goto_Face but can be different for strange formats + * (e.g. Type 42). + * + * access_glyph_frame :: + * A function used to access the frame of a given glyph within the + * face's font file. + * + * forget_glyph_frame :: + * A function used to forget the frame of a given glyph when all data + * has been loaded. + * + * read_glyph_header :: + * A function used to read a glyph header. It must be called between + * an 'access' and 'forget'. + * + * read_simple_glyph :: + * A function used to read a simple glyph. It must be called after the + * header was read, and before the 'forget'. + * + * read_composite_glyph :: + * A function used to read a composite glyph. It must be called after + * the header was read, and before the 'forget'. + * + * sfnt :: + * A pointer to the SFNT service. + * + * psnames :: + * A pointer to the PostScript names service. + * + * mm :: + * A pointer to the Multiple Masters service. + * + * var :: + * A pointer to the Metrics Variations service. + * + * hdmx :: + * The face's horizontal device metrics ('hdmx' table). This table is + * optional in TrueType/OpenType fonts. + * + * gasp :: + * The grid-fitting and scaling properties table ('gasp'). This table + * is optional in TrueType/OpenType fonts. + * + * pclt :: + * The 'pclt' SFNT table. + * + * num_sbit_scales :: + * The number of sbit scales for this font. + * + * sbit_scales :: + * Array of sbit scales embedded in this font. This table is optional + * in a TrueType/OpenType font. + * + * postscript_names :: + * A table used to store the Postscript names of the glyphs for this + * font. See the file `ttconfig.h` for comments on the + * TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. + * + * palette_data :: + * Some fields from the 'CPAL' table that are directly indexed. + * + * palette_index :: + * The current palette index, as set by @FT_Palette_Select. + * + * palette :: + * An array containing the current palette's colors. + * + * have_foreground_color :: + * There was a call to @FT_Palette_Set_Foreground_Color. + * + * foreground_color :: + * The current foreground color corresponding to 'CPAL' color index + * 0xFFFF. Only valid if `have_foreground_color` is set. + * + * font_program_size :: + * Size in bytecodes of the face's font program. 0 if none defined. + * Ignored for Type 2 fonts. + * + * font_program :: + * The face's font program (bytecode stream) executed at load time, + * also used during glyph rendering. Comes from the 'fpgm' table. + * Ignored for Type 2 font fonts. + * + * cvt_program_size :: + * The size in bytecodes of the face's cvt program. Ignored for Type 2 + * fonts. + * + * cvt_program :: + * The face's cvt program (bytecode stream) executed each time an + * instance/size is changed/reset. Comes from the 'prep' table. + * Ignored for Type 2 fonts. + * + * cvt_size :: + * Size of the control value table (in entries). Ignored for Type 2 + * fonts. + * + * cvt :: + * The face's original control value table. Coordinates are expressed + * in unscaled font units. Comes from the 'cvt~' table. Ignored for + * Type 2 fonts. + * + * interpreter :: + * A pointer to the TrueType bytecode interpreters field is also used + * to hook the debugger in 'ttdebug'. + * + * extra :: + * Reserved for third-party font drivers. + * + * postscript_name :: + * The PS name of the font. Used by the postscript name service. + * + * glyf_len :: + * The length of the 'glyf' table. Needed for malformed 'loca' tables. + * + * glyf_offset :: + * The file offset of the 'glyf' table. + * + * is_cff2 :: + * Set if the font format is CFF2. + * + * doblend :: + * A boolean which is set if the font should be blended (this is for GX + * var). + * + * blend :: + * Contains the data needed to control GX variation tables (rather like + * Multiple Master data). + * + * variation_support :: + * Flags that indicate which OpenType functionality related to font + * variation support is present, valid, and usable. For example, + * TT_FACE_FLAG_VAR_FVAR is only set if we have at least one design + * axis. + * + * var_postscript_prefix :: + * The PostScript name prefix needed for constructing a variation font + * instance's PS name . + * + * var_postscript_prefix_len :: + * The length of the `var_postscript_prefix` string. + * + * horz_metrics_size :: + * The size of the 'hmtx' table. + * + * vert_metrics_size :: + * The size of the 'vmtx' table. + * + * num_locations :: + * The number of glyph locations in this TrueType file. This should be + * identical to the number of glyphs. Ignored for Type 2 fonts. + * + * glyph_locations :: + * An array of longs. These are offsets to glyph data within the + * 'glyf' table. Ignored for Type 2 font faces. + * + * hdmx_table :: + * A pointer to the 'hdmx' table. + * + * hdmx_table_size :: + * The size of the 'hdmx' table. + * + * hdmx_record_count :: + * The number of hdmx records. + * + * hdmx_record_size :: + * The size of a single hdmx record. + * + * hdmx_record_sizes :: + * An array holding the ppem sizes available in the 'hdmx' table. + * + * sbit_table :: + * A pointer to the font's embedded bitmap location table. + * + * sbit_table_size :: + * The size of `sbit_table`. + * + * sbit_table_type :: + * The sbit table type (CBLC, sbix, etc.). + * + * sbit_num_strikes :: + * The number of sbit strikes exposed by FreeType's API, omitting + * invalid strikes. + * + * sbit_strike_map :: + * A mapping between the strike indices exposed by the API and the + * indices used in the font's sbit table. + * + * cpal :: + * A pointer to data related to the 'CPAL' table. `NULL` if the table + * is not available. + * + * colr :: + * A pointer to data related to the 'COLR' table. `NULL` if the table + * is not available. + * + * kern_table :: + * A pointer to the 'kern' table. + * + * kern_table_size :: + * The size of the 'kern' table. + * + * num_kern_tables :: + * The number of supported kern subtables (up to 32; FreeType + * recognizes only horizontal ones with format 0). + * + * kern_avail_bits :: + * The availability status of kern subtables; if bit n is set, table n + * is available. + * + * kern_order_bits :: + * The sortedness status of kern subtables; if bit n is set, table n is + * sorted. + * + * bdf :: + * Data related to an SFNT font's 'bdf' table; see `tttypes.h`. + * + * horz_metrics_offset :: + * The file offset of the 'hmtx' table. + * + * vert_metrics_offset :: + * The file offset of the 'vmtx' table. + * + * sph_found_func_flags :: + * Flags identifying special bytecode functions (used by the v38 + * implementation of the bytecode interpreter). + * + * sph_compatibility_mode :: + * This flag is set if we are in ClearType backward compatibility mode + * (used by the v38 implementation of the bytecode interpreter). + * + * ebdt_start :: + * The file offset of the sbit data table (CBDT, bdat, etc.). + * + * ebdt_size :: + * The size of the sbit data table. + */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* a typeless pointer to the FT_Service_MultiMasters table used to */ + /* handle variation fonts */ + void* mm; + + /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ + /* used to handle the HVAR, VVAR, and MVAR OpenType tables */ + void* var; +#endif + + /* a typeless pointer to the PostScript Aux service */ + void* psaux; + + + /************************************************************************ + * + * Optional TrueType/OpenType tables + * + */ + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + /* glyph colors */ + FT_Palette_Data palette_data; /* since 2.10 */ + FT_UShort palette_index; + FT_Color* palette; + FT_Bool have_foreground_color; + FT_Color foreground_color; + + + /************************************************************************ + * + * TrueType-specific fields (ignored by the CFF driver) + * + */ + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Short* cvt; + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + + + /************************************************************************ + * + * Other tables or fields. This is used by derivative formats like + * OpenType. + * + */ + + FT_Generic extra; + + const char* postscript_name; + + FT_ULong glyf_len; + FT_ULong glyf_offset; /* since 2.7.1 */ + + FT_Bool is_cff2; /* since 2.7.1 */ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; + + FT_UInt32 variation_support; /* since 2.7.1 */ + + const char* var_postscript_prefix; /* since 2.7.2 */ + FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ + +#endif + + /* since version 2.2 */ + + FT_ULong horz_metrics_size; + FT_ULong vert_metrics_size; + + FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte* hdmx_record_sizes; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + TT_SbitTableType sbit_table_type; + FT_UInt sbit_num_strikes; + FT_UInt* sbit_strike_map; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* since 2.4.12 */ + FT_ULong sph_found_func_flags; /* special functions found */ + /* for this face */ + FT_Bool sph_compatibility_mode; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* since 2.7 */ + FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ + FT_ULong ebdt_size; +#endif + + /* since 2.10 */ + void* cpal; + void* colr; + + } TT_FaceRec; + + + /************************************************************************** + * + * @struct: + * TT_GlyphZoneRec + * + * @description: + * A glyph zone is used to load, scale and hint glyph outline + * coordinates. + * + * @fields: + * memory :: + * A handle to the memory manager. + * + * max_points :: + * The maximum size in points of the zone. + * + * max_contours :: + * Max size in links contours of the zone. + * + * n_points :: + * The current number of points in the zone. + * + * n_contours :: + * The current number of contours in the zone. + * + * org :: + * The original glyph coordinates (font units/scaled). + * + * cur :: + * The current glyph coordinates (scaled/hinted). + * + * tags :: + * The point control tags. + * + * contours :: + * The contours end points. + * + * first_point :: + * Offset of the current subglyph's first point. + */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_Short max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + + /************************************************************************** + * + * @type: + * TT_Size + * + * @description: + * A handle to a TrueType size object. + */ + typedef struct TT_SizeRec_* TT_Size; + + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + TT_Face face; + TT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_Int byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Vector pp1; + FT_Vector pp2; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + /* since version 2.6.2 */ + FT_ListRec composites; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* TTTYPES_H_ */ + + +/* END */ diff --git a/FreeType/include/freetype/t1tables.h b/FreeType/include/freetype/t1tables.h new file mode 100644 index 0000000..645e645 --- /dev/null +++ b/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/FreeType/include/freetype/ttnameid.h b/FreeType/include/freetype/ttnameid.h new file mode 100644 index 0000000..cc677de --- /dev/null +++ b/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/FreeType/include/freetype/tttables.h b/FreeType/include/freetype/tttables.h new file mode 100644 index 0000000..d04f810 --- /dev/null +++ b/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/FreeType/include/freetype/tttags.h b/FreeType/include/freetype/tttags.h new file mode 100644 index 0000000..bd0986e --- /dev/null +++ b/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/FreeType/include/ft2build.h b/FreeType/include/ft2build.h new file mode 100644 index 0000000..e3f4887 --- /dev/null +++ b/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/PdfForQt.pro b/PdfForQt.pro index 19b7e03..28a29e6 100644 --- a/PdfForQt.pro +++ b/PdfForQt.pro @@ -1,4 +1,4 @@ -# Copyright (C) 2018 Jakub Melka +# Copyright (C) 2018-2019 Jakub Melka # # This file is part of PdfForQt. # diff --git a/PdfForQtLib/PdfForQtLib.pro b/PdfForQtLib/PdfForQtLib.pro index 9d8572e..7a8c3f8 100644 --- a/PdfForQtLib/PdfForQtLib.pro +++ b/PdfForQtLib/PdfForQtLib.pro @@ -91,6 +91,20 @@ unix { } +# Link to freetype library + +win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../FreeType/ -lfreetype +else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../FreeType/ -lfreetype +else:unix: LIBS += -L$$PWD/FreeType/ -lfreetype + +INCLUDEPATH += $$PWD/../FreeType/include +DEPENDPATH += $$PWD/../FreeType/include + +freetype_lib.files = $$PWD/../FreeType/freetype.dll +freetype_lib.path = $$OUT_PWD + +INSTALLS += freetype_lib + CONFIG += force_debug_info diff --git a/PdfForQtLib/sources/pdffont.cpp b/PdfForQtLib/sources/pdffont.cpp index 3cff8a0..5ade3e4 100644 --- a/PdfForQtLib/sources/pdffont.cpp +++ b/PdfForQtLib/sources/pdffont.cpp @@ -20,6 +20,14 @@ #include "pdfparser.h" #include "pdfnametounicode.h" +#include +#include +#include +#include +#include + +#include + namespace pdf { @@ -29,8 +37,271 @@ PDFFont::PDFFont(FontDescriptor fontDescriptor) : } +/// Implementation of the PDFRealizedFont class using PIMPL pattern +class PDFRealizedFontImpl +{ +public: + explicit PDFRealizedFontImpl(); + ~PDFRealizedFontImpl(); + + /// Fills the text sequence by interpreting byte array according font data and + /// produces glyphs for the font. + /// \param byteArray Array of bytes to be interpreted + /// \param textSequence Text sequence to be filled + void fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence); + +private: + friend class PDFRealizedFont; + + static constexpr const PDFReal FORMAT_26_6_MULTIPLIER = 1 / 64.0; + + struct Glyph + { + QPainterPath glyph; + PDFReal advance; + }; + + static int outlineMoveTo(const FT_Vector* to, void* user); + static int outlineLineTo(const FT_Vector* to, void* user); + static int outlineConicTo(const FT_Vector* control, const FT_Vector* to, void* user); + static int outlineCubicTo(const FT_Vector* control1, const FT_Vector* control2, const FT_Vector* to, void* user); + + /// Get glyph for unicode character. Throws exception, if glyph can't be found. + const Glyph& getGlyphForUnicode(QChar character); + + /// Function checks, if error occured, and if yes, then exception is thrown + static void checkFreeTypeError(FT_Error error); + + /// Mutex for accessing the glyph data + QMutex m_mutex; + + /// Glyph cache, must be protected by the mutex above + std::map m_glyphCache; + + /// For embedded fonts, this byte array contains embedded font data + QByteArray m_embeddedFontData; + + /// Instance of FreeType library assigned to this font + FT_Library m_library; + + /// Face of the font + FT_Face m_face; + + /// Pixel size of the font + PDFReal m_pixelSize; + + /// Parent font + const PDFFont* m_parentFont; + + /// True, if font is embedded + bool m_isEmbedded; + + /// True, if font has vertical writing system + bool m_isVertical; +}; + +PDFRealizedFontImpl::PDFRealizedFontImpl() : + m_library(nullptr), + m_face(nullptr), + m_pixelSize(0.0), + m_parentFont(nullptr), + m_isEmbedded(false), + m_isVertical(false) +{ + +} + +PDFRealizedFontImpl::~PDFRealizedFontImpl() +{ + if (m_face) + { + FT_Done_Face(m_face); + m_face = nullptr; + } + + if (m_library) + { + FT_Done_FreeType(m_library); + m_library = nullptr; + } +} + +void PDFRealizedFontImpl::fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence) +{ + switch (m_parentFont->getFontType()) + { + case FontType::Type1: + case FontType::TrueType: + { + // We can use encoding + QString text = m_parentFont->getTextUsingEncoding(byteArray); + + textSequence.items.reserve(textSequence.items.size() + text.size()); + for (const QChar& character : text) + { + const Glyph& glyph = getGlyphForUnicode(character); + textSequence.items.emplace_back(&glyph.glyph, character, glyph.advance); + } + break; + } + + default: + { + // Unhandled font type + Q_ASSERT(false); + break; + } + } +} + +int PDFRealizedFontImpl::outlineMoveTo(const FT_Vector* to, void* user) +{ + Glyph* glyph = reinterpret_cast(user); + glyph->glyph.moveTo(to->x * FORMAT_26_6_MULTIPLIER, to->y * FORMAT_26_6_MULTIPLIER); + return 0; +} + +int PDFRealizedFontImpl::outlineLineTo(const FT_Vector* to, void* user) +{ + Glyph* glyph = reinterpret_cast(user); + glyph->glyph.lineTo(to->x * FORMAT_26_6_MULTIPLIER, to->y * FORMAT_26_6_MULTIPLIER); + return 0; +} + +int PDFRealizedFontImpl::outlineConicTo(const FT_Vector* control, const FT_Vector* to, void* user) +{ + Glyph* glyph = reinterpret_cast(user); + glyph->glyph.cubicTo(control->x * FORMAT_26_6_MULTIPLIER, control->y * FORMAT_26_6_MULTIPLIER, control->x * FORMAT_26_6_MULTIPLIER, control->y * FORMAT_26_6_MULTIPLIER, to->x * FORMAT_26_6_MULTIPLIER, to->y * FORMAT_26_6_MULTIPLIER); + return 0; +} + +int PDFRealizedFontImpl::outlineCubicTo(const FT_Vector* control1, const FT_Vector* control2, const FT_Vector* to, void* user) +{ + Glyph* glyph = reinterpret_cast(user); + glyph->glyph.cubicTo(control1->x * FORMAT_26_6_MULTIPLIER, control1->y * FORMAT_26_6_MULTIPLIER, control2->x * FORMAT_26_6_MULTIPLIER, control2->y * FORMAT_26_6_MULTIPLIER, to->x * FORMAT_26_6_MULTIPLIER, to->y * FORMAT_26_6_MULTIPLIER); + return 0; +} + +const PDFRealizedFontImpl::Glyph& PDFRealizedFontImpl::getGlyphForUnicode(QChar character) +{ + QMutexLocker lock(&m_mutex); + + // First look into cache + auto it = m_glyphCache.find(character); + if (it != m_glyphCache.cend()) + { + return it->second; + } + + FT_UInt glyphIndex = FT_Get_Char_Index(m_face, character.unicode()); + if (glyphIndex) + { + Glyph glyph; + + FT_Outline_Funcs interface; + interface.delta = 0; + interface.shift = 0; + interface.move_to = PDFRealizedFontImpl::outlineMoveTo; + interface.line_to = PDFRealizedFontImpl::outlineLineTo; + interface.conic_to = PDFRealizedFontImpl::outlineConicTo; + interface.cubic_to = PDFRealizedFontImpl::outlineCubicTo; + + checkFreeTypeError(FT_Load_Glyph(m_face, glyphIndex, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING)); + checkFreeTypeError(FT_Outline_Decompose(&m_face->glyph->outline, &interface, &glyph)); + glyph.glyph.closeSubpath(); + glyph.advance = !m_isVertical ? m_face->glyph->advance.x : m_face->glyph->advance.y; + glyph.advance *= FORMAT_26_6_MULTIPLIER; + + m_glyphCache[character] = qMove(glyph); + return m_glyphCache[character]; + } + else + { + throw PDFParserException(PDFTranslationContext::tr("Glyph for unicode character '%1' not found.").arg(character)); + } + + static Glyph dummy; + return dummy; +} + +void PDFRealizedFontImpl::checkFreeTypeError(FT_Error error) +{ + if (error) + { + QString message; + if (const char* errorString = FT_Error_String(error)) + { + message = QString::fromLatin1(errorString); + } + + throw PDFParserException(PDFTranslationContext::tr("FreeType error code %1: message").arg(error).arg(message)); + } +} + +PDFRealizedFont::~PDFRealizedFont() +{ + delete m_impl; +} + +void PDFRealizedFont::fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence) +{ + m_impl->fillTextSequence(byteArray, textSequence); +} + +bool PDFRealizedFont::isHorizontalWritingSystem() const +{ + return !m_impl->m_isVertical; +} + +PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(const PDFFont* font, PDFReal pixelSize) +{ + PDFRealizedFontPointer result; + std::unique_ptr implPtr(new PDFRealizedFontImpl()); + + PDFRealizedFontImpl* impl = implPtr.get(); + impl->m_parentFont = font; + + const FontDescriptor* descriptor = font->getFontDescriptor(); + if (descriptor->isEmbedded()) + { + + PDFRealizedFontImpl::checkFreeTypeError(FT_Init_FreeType(&impl->m_library)); + + if (!descriptor->fontFile.isEmpty()) + { + impl->m_embeddedFontData = descriptor->fontFile; + } + else if (!descriptor->fontFile2.isEmpty()) + { + impl->m_embeddedFontData = descriptor->fontFile2; + } + else if (!descriptor->fontFile3.isEmpty()) + { + impl->m_embeddedFontData = descriptor->fontFile3; + } + + // At this time, embedded font data should not be empty! + Q_ASSERT(!impl->m_embeddedFontData.isEmpty()); + + PDFRealizedFontImpl::checkFreeTypeError(FT_New_Memory_Face(impl->m_library, reinterpret_cast(impl->m_embeddedFontData.constData()), impl->m_embeddedFontData.size(), 0, &impl->m_face)); + PDFRealizedFontImpl::checkFreeTypeError(FT_Select_Charmap(impl->m_face, FT_ENCODING_UNICODE)); + PDFRealizedFontImpl::checkFreeTypeError(FT_Set_Pixel_Sizes(impl->m_face, 0, qRound(pixelSize))); + impl->m_isVertical = impl->m_face->face_flags & FT_FACE_FLAG_VERTICAL; + impl->m_isEmbedded = true; + result.reset(new PDFRealizedFont(implPtr.release())); + } + else + { + // TODO: Support non-embedded fonts + throw PDFParserException(PDFTranslationContext::tr("Only embedded fonts are supported.")); + } + + return result; +} + PDFFontPointer PDFFont::createFont(const PDFObject& object, const PDFDocument* document) { + // TODO: Create font cache for realized fonts const PDFObject& dereferencedFontDictionary = document->getObject(object); if (!dereferencedFontDictionary.isDictionary()) { @@ -326,9 +597,13 @@ PDFSimpleFont::PDFSimpleFont(FontDescriptor fontDescriptor, } -QRawFont PDFSimpleFont::getRealizedFont(PDFReal fontSize) const +PDFRealizedFontPointer PDFSimpleFont::getRealizedFont(PDFReal fontSize) const { // TODO: Fix font creation to use also embedded fonts, font descriptor, etc. + // TODO: Remove QRawFont + + return PDFRealizedFont::createRealizedFont(this, fontSize); + /* QRawFont rawFont; if (m_fontDescriptor.isEmbedded()) @@ -362,7 +637,7 @@ QRawFont PDFSimpleFont::getRealizedFont(PDFReal fontSize) const rawFont = QRawFont::fromFont(font, QFontDatabase::Any); } - return rawFont; + return rawFont;*/ } QString PDFSimpleFont::getTextUsingEncoding(const QByteArray& byteArray) const diff --git a/PdfForQtLib/sources/pdffont.h b/PdfForQtLib/sources/pdffont.h index 5cce063..29229b7 100644 --- a/PdfForQtLib/sources/pdffont.h +++ b/PdfForQtLib/sources/pdffont.h @@ -41,6 +41,27 @@ enum class TextRenderingMode Clip = 7 }; +/// Item of the text sequence (either single character, or advance) +struct TextSequenceItem +{ + inline explicit TextSequenceItem() = default; + inline explicit TextSequenceItem(const QPainterPath* glyph, QChar character, PDFReal advance) : glyph(glyph), character(character), advance(advance) { } + inline explicit TextSequenceItem(PDFReal advance) : character(), advance(advance) { } + + inline bool isCharacter() const { return !character.isNull(); } + inline bool isAdvance() const { return advance != 0.0; } + inline bool isNull() const { return !isCharacter() && !isAdvance(); } + + const QPainterPath* glyph = nullptr; + QChar character; + PDFReal advance = 0; +}; + +struct TextSequence +{ + std::vector items; +}; + constexpr bool isTextRenderingModeFilled(TextRenderingMode mode) { switch (mode) @@ -169,6 +190,38 @@ class PDFFont; using PDFFontPointer = QSharedPointer; +class PDFRealizedFont; +class PDFRealizedFontImpl; + +using PDFRealizedFontPointer = QSharedPointer; + +/// Font, which has fixed pixel size. It is programmed as PIMPL, because we need +/// to remove FreeType types from the interface (so we do not include FreeType in the interface). +class PDFRealizedFont +{ +public: + ~PDFRealizedFont(); + + /// Fills the text sequence by interpreting byte array according font data and + /// produces glyphs for the font. + /// \param byteArray Array of bytes to be interpreted + /// \param textSequence Text sequence to be filled + void fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence); + + /// Return true, if we have horizontal writing system + bool isHorizontalWritingSystem() const; + + /// Creates new realized font from the standard font. If font can't be created, + /// then exception is thrown. + static PDFRealizedFontPointer createRealizedFont(const PDFFont* font, PDFReal pixelSize); + +private: + /// Constructs new realized font + explicit PDFRealizedFont(PDFRealizedFontImpl* impl) : m_impl(impl) { } + + PDFRealizedFontImpl* m_impl; +}; + /// Base class representing font in the PDF file class PDFFont { @@ -182,7 +235,7 @@ public: /// Realizes the font (physical materialization of the font using pixel size, /// if font can't be realized, then empty QRawFont is returned). /// \param fontSize Size of the font - virtual QRawFont getRealizedFont(PDFReal fontSize) const = 0; + virtual PDFRealizedFontPointer getRealizedFont(PDFReal fontSize) const = 0; /// Returns text using the font encoding /// \param byteArray Byte array with encoded string @@ -215,7 +268,7 @@ public: encoding::EncodingTable encoding); virtual ~PDFSimpleFont() override = default; - virtual QRawFont getRealizedFont(PDFReal fontSize) const override; + virtual PDFRealizedFontPointer getRealizedFont(PDFReal fontSize) const override; virtual QString getTextUsingEncoding(const QByteArray& byteArray) const override; protected: diff --git a/PdfForQtLib/sources/pdfpagecontentprocessor.cpp b/PdfForQtLib/sources/pdfpagecontentprocessor.cpp index ba2039a..60aff8a 100644 --- a/PdfForQtLib/sources/pdfpagecontentprocessor.cpp +++ b/PdfForQtLib/sources/pdfpagecontentprocessor.cpp @@ -1626,8 +1626,19 @@ void PDFPageContentProcessor::operatorTextShowTextString(PDFOperandString text) { if (m_graphicState.getTextFont()) { - QString textDecoded = m_graphicState.getTextFont()->getTextUsingEncoding(text.string); - drawText(TextSequence::fromString(textDecoded)); + // Get the realized font + const PDFRealizedFontPointer& realizedFont = getRealizedFont(); + if (!realizedFont) + { + throw PDFRendererException(RenderErrorType::Error, PDFTranslationContext::tr("Invalid font, text can't be printed.")); + } + + TextSequence textSequence; + + // We use simple heuristic to ensure reallocation doesn't occur too often + textSequence.items.reserve(m_operands.size()); + realizedFont->fillTextSequence(text.string, textSequence); + drawText(textSequence); } else { @@ -1658,6 +1669,13 @@ void PDFPageContentProcessor::operatorTextShowTextIndividualSpacing() // We use simple heuristic to ensure reallocation doesn't occur too often textSequence.items.reserve(m_operands.size() * 4); + // Get the realized font + const PDFRealizedFontPointer& realizedFont = getRealizedFont(); + if (!realizedFont) + { + throw PDFRendererException(RenderErrorType::Error, PDFTranslationContext::tr("Invalid font, text can't be printed.")); + } + for (size_t i = 1, lastIndex = m_operands.size() - 1; i < lastIndex; ++i) { switch (m_operands[i].type) @@ -1676,8 +1694,7 @@ void PDFPageContentProcessor::operatorTextShowTextIndividualSpacing() case PDFLexicalAnalyzer::TokenType::String: { - QString string = m_graphicState.getTextFont()->getTextUsingEncoding(m_operands[i].data.toByteArray()); - std::transform(string.cbegin(), string.cend(), std::back_inserter(textSequence.items), [](const QChar character) { return TextSequenceItem(character); }); + realizedFont->fillTextSequence(m_operands[i].data.toByteArray(), textSequence); break; } @@ -1721,10 +1738,89 @@ void PDFPageContentProcessor::drawText(const TextSequence& textSequence) return; } - const QRawFont& font = getRealizedFont(); - if (font.isValid()) + const PDFRealizedFontPointer& font = getRealizedFont(); + if (font) { - std::vector chars; + const PDFReal fontSize = m_graphicState.getTextFontSize(); + const PDFReal horizontalScaling = m_graphicState.getTextHorizontalScaling() * 0.01; // Horizontal scaling is in percents + const PDFReal characterSpacing = m_graphicState.getTextCharacterSpacing(); + const PDFReal wordSpacing = m_graphicState.getTextWordSpacing(); + const PDFReal textRise = m_graphicState.getTextRise(); + const TextRenderingMode textRenderingMode = m_graphicState.getTextRenderingMode(); + const bool fill = isTextRenderingModeFilled(textRenderingMode); + const bool stroke = isTextRenderingModeStroked(textRenderingMode); + const bool clipped = isTextRenderingModeClipped(textRenderingMode); + // TODO: Add Text Clipping + // TODO: Pouzit pravdepodobne sirky z widths array? + + // Detect horizontal writing system + const bool isHorizontalWritingSystem = font->isHorizontalWritingSystem(); + + // Calculate text rendering matrix + QMatrix adjustMatrix(horizontalScaling, 0.0, 0.0, 1.0, 0.0, textRise); + QMatrix textMatrix = m_graphicState.getTextMatrix(); + QMatrix fontMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0); + + size_t characterIndex = 0; + for (const TextSequenceItem& item : textSequence.items) + { + PDFReal displacementX = 0.0; + PDFReal displacementY = 0.0; + + if (item.isCharacter()) + { + QChar character = item.character; + QPointF advance = isHorizontalWritingSystem ? QPointF(item.advance, 0) : QPointF(0, item.advance); + + // First, compute the advance + const PDFReal additionalAdvance = (character == QChar(QChar::Space)) ? wordSpacing : characterSpacing; + if (isHorizontalWritingSystem) + { + advance.rx() += additionalAdvance; + } + else + { + advance.ry() += additionalAdvance; + } + advance.rx() *= horizontalScaling; + + // Then get the glyph path and paint it + if (item.glyph) + { + QPainterPath glyphPath = fontMatrix.map(*item.glyph); + if (!glyphPath.isEmpty()) + { + QMatrix textRenderingMatrix = textMatrix * adjustMatrix; + QPainterPath transformedGlyph = textRenderingMatrix.map(glyphPath); + performPathPainting(transformedGlyph, stroke, fill, transformedGlyph.fillRule()); + } + } + + displacementX = advance.x(); + displacementY = advance.y(); + + ++characterIndex; + } + else if (item.isAdvance()) + { + if (horizontalScaling) + { + displacementX = -item.advance * 0.001 * fontSize * horizontalScaling; + } + else + { + displacementY = -item.advance * 0.001 * fontSize; + } + } + + textMatrix.translate(displacementX, displacementY); + } + + m_graphicState.setTextMatrix(textMatrix); + updateGraphicState(); + + + /*std::vector chars; chars.reserve(textSequence.items.size()); for (const TextSequenceItem& item : textSequence.items) { @@ -1748,80 +1844,7 @@ void PDFPageContentProcessor::drawText(const TextSequence& textSequence) advances.resize(numGlyphs, QPointF()); if (font.advancesForGlyphIndexes(glyphIndices.data(), advances.data(), numGlyphs, QRawFont::SeparateAdvances | QRawFont::UseDesignMetrics)) { - const PDFReal fontSize = m_graphicState.getTextFontSize(); - const PDFReal horizontalScaling = m_graphicState.getTextHorizontalScaling() * 0.01; // Horizontal scaling is in percents - const PDFReal characterSpacing = m_graphicState.getTextCharacterSpacing(); - const PDFReal wordSpacing = m_graphicState.getTextWordSpacing(); - const PDFReal textRise = m_graphicState.getTextRise(); - const TextRenderingMode textRenderingMode = m_graphicState.getTextRenderingMode(); - const bool fill = isTextRenderingModeFilled(textRenderingMode); - const bool stroke = isTextRenderingModeStroked(textRenderingMode); - const bool clipped = isTextRenderingModeClipped(textRenderingMode); - // TODO: Add Text Clipping - // TODO: Pouzit pravdepodobne sirky z widths array? - // Detect horizontal writing system - const bool isHorizontalWritingSystem = std::any_of(advances.cbegin(), advances.cend(), [](const QPointF& point) { return !qFuzzyIsNull(point.x()); }); - - // Calculate text rendering matrix - QMatrix adjustMatrix(horizontalScaling, 0.0, 0.0, 1.0, 0.0, textRise); - QMatrix textMatrix = m_graphicState.getTextMatrix(); - QMatrix fontMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); - - size_t characterIndex = 0; - for (const TextSequenceItem& item : textSequence.items) - { - PDFReal displacementX = 0.0; - PDFReal displacementY = 0.0; - - if (item.isCharacter()) - { - QChar character = item.character; - QPointF advance = advances[characterIndex]; - - // First, compute the advance - const PDFReal additionalAdvance = (character == QChar(QChar::Space)) ? wordSpacing : characterSpacing; - if (isHorizontalWritingSystem) - { - advance.rx() += additionalAdvance; - } - else - { - advance.ry() += additionalAdvance; - } - advance.rx() *= horizontalScaling; - - // Then get the glyph path and paint it - QPainterPath glyphPath = fontMatrix.map(font.pathForGlyph(glyphIndices[characterIndex])); - if (!glyphPath.isEmpty()) - { - QMatrix textRenderingMatrix = textMatrix * adjustMatrix; - QPainterPath transformedGlyph = textRenderingMatrix.map(glyphPath); - performPathPainting(transformedGlyph, stroke, fill, transformedGlyph.fillRule()); - } - - displacementX = advance.x(); - displacementY = advance.y(); - - ++characterIndex; - } - else if (item.isAdvance()) - { - if (horizontalScaling) - { - displacementX = -item.advance * 0.001 * fontSize * horizontalScaling; - } - else - { - displacementY = -item.advance * 0.001 * fontSize; - } - } - - textMatrix.translate(displacementX, displacementY); - } - - m_graphicState.setTextMatrix(textMatrix); - updateGraphicState(); } else { @@ -1831,7 +1854,7 @@ void PDFPageContentProcessor::drawText(const TextSequence& textSequence) else { throw PDFRendererException(RenderErrorType::Error, PDFTranslationContext::tr("Cant convert unicode to glyph indices, text can't be printed.")); - } + }*/ } else { @@ -1839,14 +1862,14 @@ void PDFPageContentProcessor::drawText(const TextSequence& textSequence) } } -QRawFont PDFPageContentProcessor::getRealizedFontImpl() const +PDFRealizedFontPointer PDFPageContentProcessor::getRealizedFontImpl() const { if (m_graphicState.getTextFont()) { return m_graphicState.getTextFont()->getRealizedFont(m_graphicState.getTextFontSize()); } - return QRawFont(); + return PDFRealizedFontPointer(); } PDFPageContentProcessor::PDFPageContentProcessorState::PDFPageContentProcessorState() : @@ -2126,12 +2149,4 @@ void PDFPageContentProcessor::PDFPageContentProcessorState::setTextCharacterSpac } } -PDFPageContentProcessor::TextSequence PDFPageContentProcessor::TextSequence::fromString(const QString& string) -{ - TextSequence result; - result.items.reserve(string.size()); - std::transform(string.cbegin(), string.cend(), std::back_inserter(result.items), [](const QChar character) { return TextSequenceItem(character); }); - return result; -} - } // namespace pdf diff --git a/PdfForQtLib/sources/pdfpagecontentprocessor.h b/PdfForQtLib/sources/pdfpagecontentprocessor.h index d1081b4..683f74d 100644 --- a/PdfForQtLib/sources/pdfpagecontentprocessor.h +++ b/PdfForQtLib/sources/pdfpagecontentprocessor.h @@ -350,28 +350,6 @@ protected: StateFlags m_stateFlags; }; - /// Item of the text sequence (either single character, or advance) - struct TextSequenceItem - { - inline explicit TextSequenceItem() = default; - inline explicit TextSequenceItem(QChar character) : character(character), advance(0) { } - inline explicit TextSequenceItem(PDFReal advance) : character(), advance(advance) { } - - inline bool isCharacter() const { return !character.isNull(); } - inline bool isAdvance() const { return advance != 0.0; } - inline bool isNull() const { return !isCharacter() && !isAdvance(); } - - QChar character; - PDFReal advance = 0; - }; - - struct TextSequence - { - static TextSequence fromString(const QString& string); - - std::vector items; - }; - enum class ProcessOrder { BeforeOperation, @@ -593,10 +571,10 @@ private: void drawText(const TextSequence& textSequence); /// Returns realized font - const QRawFont& getRealizedFont() { return m_realizedFont.get(this, &PDFPageContentProcessor::getRealizedFontImpl); } + const PDFRealizedFontPointer& getRealizedFont() { return m_realizedFont.get(this, &PDFPageContentProcessor::getRealizedFontImpl); } /// Returns realized font (or empty font, if font can't be realized) - QRawFont getRealizedFontImpl() const; + PDFRealizedFontPointer getRealizedFontImpl() const; const PDFPage* m_page; const PDFDocument* m_document; @@ -627,7 +605,7 @@ private: int m_textBeginEndState; /// Actually realized physical font - PDFCachedItem m_realizedFont; + PDFCachedItem m_realizedFont; }; } // namespace pdf