From 38749dff87dddfc2711ab301a3ed2abe8c03eb5a Mon Sep 17 00:00:00 2001 From: rich_b <56879808+rbarkmore@users.noreply.github.com> Date: Tue, 23 Jun 2020 09:59:08 -0400 Subject: [PATCH] Add Freetype2 to includes and lib folders, update CMakeLists.txt to properly build the text_rendering example as just one more project. --- CMakeLists.txt | 4 +- includes/freetype/config/ftconfig.h | 575 ++ includes/freetype/config/ftheader.h | 814 +++ includes/freetype/config/ftmodule.h | 32 + includes/freetype/config/ftoption.h | 1000 ++++ includes/freetype/config/ftstdlib.h | 175 + includes/freetype/freetype.h | 4888 +++++++++++++++++ includes/freetype/ftadvanc.h | 188 + includes/freetype/ftbbox.h | 102 + includes/freetype/ftbdf.h | 213 + includes/freetype/ftbitmap.h | 330 ++ includes/freetype/ftbzip2.h | 102 + includes/freetype/ftcache.h | 1088 ++++ includes/freetype/ftchapters.h | 145 + includes/freetype/ftcid.h | 168 + includes/freetype/ftcolor.h | 314 ++ includes/freetype/ftdriver.h | 1232 +++++ includes/freetype/fterrdef.h | 279 + includes/freetype/fterrors.h | 289 + includes/freetype/ftfntfmt.h | 94 + includes/freetype/ftgasp.h | 144 + includes/freetype/ftglyph.h | 665 +++ includes/freetype/ftgxval.h | 355 ++ includes/freetype/ftgzip.h | 151 + includes/freetype/ftimage.h | 1238 +++++ includes/freetype/ftincrem.h | 344 ++ includes/freetype/ftlcdfil.h | 328 ++ includes/freetype/ftlist.h | 297 + includes/freetype/ftlzw.h | 100 + includes/freetype/ftmac.h | 290 + includes/freetype/ftmm.h | 753 +++ includes/freetype/ftmodapi.h | 785 +++ includes/freetype/ftmoderr.h | 203 + includes/freetype/ftotval.h | 207 + includes/freetype/ftoutln.h | 593 ++ includes/freetype/ftparams.h | 204 + includes/freetype/ftpfr.h | 180 + includes/freetype/ftrender.h | 245 + includes/freetype/ftsizes.h | 160 + includes/freetype/ftsnames.h | 273 + includes/freetype/ftstroke.h | 774 +++ includes/freetype/ftsynth.h | 84 + includes/freetype/ftsystem.h | 353 ++ includes/freetype/fttrigon.h | 350 ++ includes/freetype/fttypes.h | 615 +++ includes/freetype/ftwinfnt.h | 277 + includes/freetype/internal/autohint.h | 232 + includes/freetype/internal/cffotypes.h | 108 + includes/freetype/internal/cfftypes.h | 417 ++ includes/freetype/internal/ftcalc.h | 510 ++ includes/freetype/internal/ftdebug.h | 283 + includes/freetype/internal/ftdrv.h | 288 + includes/freetype/internal/ftgloadr.h | 149 + includes/freetype/internal/fthash.h | 136 + includes/freetype/internal/ftmemory.h | 400 ++ includes/freetype/internal/ftobjs.h | 1234 +++++ includes/freetype/internal/ftpsprop.h | 48 + includes/freetype/internal/ftrfork.h | 246 + includes/freetype/internal/ftserv.h | 521 ++ includes/freetype/internal/ftstream.h | 572 ++ includes/freetype/internal/fttrace.h | 158 + includes/freetype/internal/ftvalid.h | 159 + includes/freetype/internal/internal.h | 67 + includes/freetype/internal/psaux.h | 1439 +++++ includes/freetype/internal/pshints.h | 700 +++ includes/freetype/internal/services/svbdf.h | 66 + includes/freetype/internal/services/svcfftl.h | 90 + includes/freetype/internal/services/svcid.h | 69 + .../freetype/internal/services/svfntfmt.h | 55 + .../freetype/internal/services/svgldict.h | 72 + includes/freetype/internal/services/svgxval.h | 72 + includes/freetype/internal/services/svkern.h | 51 + .../freetype/internal/services/svmetric.h | 125 + includes/freetype/internal/services/svmm.h | 156 + includes/freetype/internal/services/svotval.h | 55 + includes/freetype/internal/services/svpfr.h | 66 + .../freetype/internal/services/svpostnm.h | 65 + includes/freetype/internal/services/svprop.h | 66 + .../freetype/internal/services/svpscmap.h | 145 + .../freetype/internal/services/svpsinfo.h | 86 + includes/freetype/internal/services/svsfnt.h | 88 + .../freetype/internal/services/svttcmap.h | 90 + includes/freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 56 + .../freetype/internal/services/svwinfnt.h | 50 + includes/freetype/internal/sfnt.h | 876 +++ includes/freetype/internal/t1types.h | 260 + includes/freetype/internal/tttypes.h | 1781 ++++++ includes/freetype/internal/wofftypes.h | 313 ++ includes/freetype/t1tables.h | 774 +++ includes/freetype/ttnameid.h | 1236 +++++ includes/freetype/tttables.h | 856 +++ includes/freetype/tttags.h | 124 + includes/ft2build.h | 44 + lib/freetype.lib | Bin 0 -> 4038932 bytes 95 files changed, 37505 insertions(+), 2 deletions(-) create mode 100644 includes/freetype/config/ftconfig.h create mode 100644 includes/freetype/config/ftheader.h create mode 100644 includes/freetype/config/ftmodule.h create mode 100644 includes/freetype/config/ftoption.h create mode 100644 includes/freetype/config/ftstdlib.h create mode 100644 includes/freetype/freetype.h create mode 100644 includes/freetype/ftadvanc.h create mode 100644 includes/freetype/ftbbox.h create mode 100644 includes/freetype/ftbdf.h create mode 100644 includes/freetype/ftbitmap.h create mode 100644 includes/freetype/ftbzip2.h create mode 100644 includes/freetype/ftcache.h create mode 100644 includes/freetype/ftchapters.h create mode 100644 includes/freetype/ftcid.h create mode 100644 includes/freetype/ftcolor.h create mode 100644 includes/freetype/ftdriver.h create mode 100644 includes/freetype/fterrdef.h create mode 100644 includes/freetype/fterrors.h create mode 100644 includes/freetype/ftfntfmt.h create mode 100644 includes/freetype/ftgasp.h create mode 100644 includes/freetype/ftglyph.h create mode 100644 includes/freetype/ftgxval.h create mode 100644 includes/freetype/ftgzip.h create mode 100644 includes/freetype/ftimage.h create mode 100644 includes/freetype/ftincrem.h create mode 100644 includes/freetype/ftlcdfil.h create mode 100644 includes/freetype/ftlist.h create mode 100644 includes/freetype/ftlzw.h create mode 100644 includes/freetype/ftmac.h create mode 100644 includes/freetype/ftmm.h create mode 100644 includes/freetype/ftmodapi.h create mode 100644 includes/freetype/ftmoderr.h create mode 100644 includes/freetype/ftotval.h create mode 100644 includes/freetype/ftoutln.h create mode 100644 includes/freetype/ftparams.h create mode 100644 includes/freetype/ftpfr.h create mode 100644 includes/freetype/ftrender.h create mode 100644 includes/freetype/ftsizes.h create mode 100644 includes/freetype/ftsnames.h create mode 100644 includes/freetype/ftstroke.h create mode 100644 includes/freetype/ftsynth.h create mode 100644 includes/freetype/ftsystem.h create mode 100644 includes/freetype/fttrigon.h create mode 100644 includes/freetype/fttypes.h create mode 100644 includes/freetype/ftwinfnt.h create mode 100644 includes/freetype/internal/autohint.h create mode 100644 includes/freetype/internal/cffotypes.h create mode 100644 includes/freetype/internal/cfftypes.h create mode 100644 includes/freetype/internal/ftcalc.h create mode 100644 includes/freetype/internal/ftdebug.h create mode 100644 includes/freetype/internal/ftdrv.h create mode 100644 includes/freetype/internal/ftgloadr.h create mode 100644 includes/freetype/internal/fthash.h create mode 100644 includes/freetype/internal/ftmemory.h create mode 100644 includes/freetype/internal/ftobjs.h create mode 100644 includes/freetype/internal/ftpsprop.h create mode 100644 includes/freetype/internal/ftrfork.h create mode 100644 includes/freetype/internal/ftserv.h create mode 100644 includes/freetype/internal/ftstream.h create mode 100644 includes/freetype/internal/fttrace.h create mode 100644 includes/freetype/internal/ftvalid.h create mode 100644 includes/freetype/internal/internal.h create mode 100644 includes/freetype/internal/psaux.h create mode 100644 includes/freetype/internal/pshints.h create mode 100644 includes/freetype/internal/services/svbdf.h create mode 100644 includes/freetype/internal/services/svcfftl.h create mode 100644 includes/freetype/internal/services/svcid.h create mode 100644 includes/freetype/internal/services/svfntfmt.h create mode 100644 includes/freetype/internal/services/svgldict.h create mode 100644 includes/freetype/internal/services/svgxval.h create mode 100644 includes/freetype/internal/services/svkern.h create mode 100644 includes/freetype/internal/services/svmetric.h create mode 100644 includes/freetype/internal/services/svmm.h create mode 100644 includes/freetype/internal/services/svotval.h create mode 100644 includes/freetype/internal/services/svpfr.h create mode 100644 includes/freetype/internal/services/svpostnm.h create mode 100644 includes/freetype/internal/services/svprop.h create mode 100644 includes/freetype/internal/services/svpscmap.h create mode 100644 includes/freetype/internal/services/svpsinfo.h create mode 100644 includes/freetype/internal/services/svsfnt.h create mode 100644 includes/freetype/internal/services/svttcmap.h create mode 100644 includes/freetype/internal/services/svtteng.h create mode 100644 includes/freetype/internal/services/svttglyf.h create mode 100644 includes/freetype/internal/services/svwinfnt.h create mode 100644 includes/freetype/internal/sfnt.h create mode 100644 includes/freetype/internal/t1types.h create mode 100644 includes/freetype/internal/tttypes.h create mode 100644 includes/freetype/internal/wofftypes.h create mode 100644 includes/freetype/t1tables.h create mode 100644 includes/freetype/ttnameid.h create mode 100644 includes/freetype/tttables.h create mode 100644 includes/freetype/tttags.h create mode 100644 includes/ft2build.h create mode 100644 lib/freetype.lib diff --git a/CMakeLists.txt b/CMakeLists.txt index d7999c9..2af2f32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ message(STATUS "Found ASSIMP in ${ASSIMP_INCLUDE_DIR}") # message(STATUS "Found GLEW in ${GLEW_INCLUDE_DIR}") if(WIN32) - set(LIBS glfw3 opengl32 assimp) + set(LIBS glfw3 opengl32 assimp freetype) elseif(UNIX AND NOT APPLE) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") find_package(OpenGL REQUIRED) @@ -163,7 +163,7 @@ set(6.pbr set(7.in_practice 1.debugging # due to trickier build setups (other libs rarely used everywhere else) these examples won't compile through CMake, but source code is available. - # 2.text_rendering + 2.text_rendering # 3.2d_game ) diff --git a/includes/freetype/config/ftconfig.h b/includes/freetype/config/ftconfig.h new file mode 100644 index 0000000..14eecef --- /dev/null +++ b/includes/freetype/config/ftconfig.h @@ -0,0 +1,575 @@ +/**************************************************************************** + * + * ftconfig.h + * + * ANSI-specific configuration file (specification only). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + * 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/includes/freetype/config/ftheader.h b/includes/freetype/config/ftheader.h new file mode 100644 index 0000000..e91598e --- /dev/null +++ b/includes/freetype/config/ftheader.h @@ -0,0 +1,814 @@ +/**************************************************************************** + * + * ftheader.h + * + * Build macros of the FreeType 2 library. + * + * Copyright (C) 1996-2020 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/includes/freetype/config/ftmodule.h b/includes/freetype/config/ftmodule.h new file mode 100644 index 0000000..7c603e5 --- /dev/null +++ b/includes/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/includes/freetype/config/ftoption.h b/includes/freetype/config/ftoption.h new file mode 100644 index 0000000..426806d --- /dev/null +++ b/includes/freetype/config/ftoption.h @@ -0,0 +1,1000 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2020 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 */ + + + /************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * 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_BROTLI */ + + + /************************************************************************** + * + * 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. Currently, this needs option `AF_CONFIG_OPTION_CJK`. + */ +#ifdef AF_CONFIG_OPTION_CJK +#define AF_CONFIG_OPTION_INDIC +#endif + + + /************************************************************************** + * + * 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/includes/freetype/config/ftstdlib.h b/includes/freetype/config/ftstdlib.h new file mode 100644 index 0000000..d6091f8 --- /dev/null +++ b/includes/freetype/config/ftstdlib.h @@ -0,0 +1,175 @@ +/**************************************************************************** + * + * ftstdlib.h + * + * ANSI-specific library and header configuration file (specification + * only). + * + * Copyright (C) 2002-2020 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/includes/freetype/freetype.h b/includes/freetype/freetype.h new file mode 100644 index 0000000..973264b --- /dev/null +++ b/includes/freetype/freetype.h @@ -0,0 +1,4888 @@ +/**************************************************************************** + * + * freetype.h + * + * FreeType high-level API and common types (specification only). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FREETYPE_H_ +#define FREETYPE_H_ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include " +#error " #include FT_FREETYPE_H" +#endif + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H +#include FT_ERRORS_H + + +FT_BEGIN_HEADER + + + + /************************************************************************** + * + * @section: + * header_inclusion + * + * @title: + * FreeType's header inclusion scheme + * + * @abstract: + * How client applications should include FreeType header files. + * + * @description: + * To be as flexible as possible (and for historical reasons), FreeType + * uses a very special inclusion scheme to load header files, for example + * + * ``` + * #include + * + * #include FT_FREETYPE_H + * #include FT_OUTLINE_H + * ``` + * + * A compiler and its preprocessor only needs an include path to find the + * file `ft2build.h`; the exact locations and names of the other FreeType + * header files are hidden by @header_file_macros, loaded by + * `ft2build.h`. The API documentation always gives the header macro + * name needed for a particular function. + * + */ + + + /************************************************************************** + * + * @section: + * user_allocation + * + * @title: + * User allocation + * + * @abstract: + * How client applications should allocate FreeType data structures. + * + * @description: + * FreeType assumes that structures allocated by the user and passed as + * arguments are zeroed out except for the actual data. In other words, + * it is recommended to use `calloc` (or variants of it) instead of + * `malloc` for allocation. + * + */ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * base_interface + * + * @title: + * Base Interface + * + * @abstract: + * The FreeType~2 base font interface. + * + * @description: + * This section describes the most important public high-level API + * functions of FreeType~2. + * + * @order: + * FT_Library + * FT_Face + * FT_Size + * FT_GlyphSlot + * FT_CharMap + * FT_Encoding + * FT_ENC_TAG + * + * FT_FaceRec + * + * FT_FACE_FLAG_SCALABLE + * FT_FACE_FLAG_FIXED_SIZES + * FT_FACE_FLAG_FIXED_WIDTH + * FT_FACE_FLAG_HORIZONTAL + * FT_FACE_FLAG_VERTICAL + * FT_FACE_FLAG_COLOR + * FT_FACE_FLAG_SFNT + * FT_FACE_FLAG_CID_KEYED + * FT_FACE_FLAG_TRICKY + * FT_FACE_FLAG_KERNING + * FT_FACE_FLAG_MULTIPLE_MASTERS + * FT_FACE_FLAG_VARIATION + * FT_FACE_FLAG_GLYPH_NAMES + * FT_FACE_FLAG_EXTERNAL_STREAM + * FT_FACE_FLAG_HINTER + * + * FT_HAS_HORIZONTAL + * FT_HAS_VERTICAL + * FT_HAS_KERNING + * FT_HAS_FIXED_SIZES + * FT_HAS_GLYPH_NAMES + * FT_HAS_COLOR + * FT_HAS_MULTIPLE_MASTERS + * + * FT_IS_SFNT + * FT_IS_SCALABLE + * FT_IS_FIXED_WIDTH + * FT_IS_CID_KEYED + * FT_IS_TRICKY + * FT_IS_NAMED_INSTANCE + * FT_IS_VARIATION + * + * FT_STYLE_FLAG_BOLD + * FT_STYLE_FLAG_ITALIC + * + * FT_SizeRec + * FT_Size_Metrics + * + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * FT_SubGlyph + * + * FT_Bitmap_Size + * + * FT_Init_FreeType + * FT_Done_FreeType + * + * FT_New_Face + * FT_Done_Face + * FT_Reference_Face + * FT_New_Memory_Face + * FT_Face_Properties + * FT_Open_Face + * FT_Open_Args + * FT_Parameter + * FT_Attach_File + * FT_Attach_Stream + * + * FT_Set_Char_Size + * FT_Set_Pixel_Sizes + * FT_Request_Size + * FT_Select_Size + * FT_Size_Request_Type + * FT_Size_RequestRec + * FT_Size_Request + * FT_Set_Transform + * FT_Load_Glyph + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Get_Name_Index + * FT_Load_Char + * + * FT_OPEN_MEMORY + * FT_OPEN_STREAM + * FT_OPEN_PATHNAME + * FT_OPEN_DRIVER + * FT_OPEN_PARAMS + * + * FT_LOAD_DEFAULT + * FT_LOAD_RENDER + * FT_LOAD_MONOCHROME + * FT_LOAD_LINEAR_DESIGN + * FT_LOAD_NO_SCALE + * FT_LOAD_NO_HINTING + * FT_LOAD_NO_BITMAP + * FT_LOAD_NO_AUTOHINT + * FT_LOAD_COLOR + * + * FT_LOAD_VERTICAL_LAYOUT + * FT_LOAD_IGNORE_TRANSFORM + * FT_LOAD_FORCE_AUTOHINT + * FT_LOAD_NO_RECURSE + * FT_LOAD_PEDANTIC + * + * FT_LOAD_TARGET_NORMAL + * FT_LOAD_TARGET_LIGHT + * FT_LOAD_TARGET_MONO + * FT_LOAD_TARGET_LCD + * FT_LOAD_TARGET_LCD_V + * + * FT_LOAD_TARGET_MODE + * + * FT_Render_Glyph + * FT_Render_Mode + * FT_Get_Kerning + * FT_Kerning_Mode + * FT_Get_Track_Kerning + * FT_Get_Glyph_Name + * FT_Get_Postscript_Name + * + * FT_CharMapRec + * FT_Select_Charmap + * FT_Set_Charmap + * FT_Get_Charmap_Index + * + * FT_Get_FSType_Flags + * FT_Get_SubGlyph_Info + * + * FT_Face_Internal + * FT_Size_Internal + * FT_Slot_Internal + * + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * FT_OPEN_XXX + * FT_LOAD_XXX + * FT_LOAD_TARGET_XXX + * FT_SUBGLYPH_FLAG_XXX + * FT_FSTYPE_XXX + * + * FT_HAS_FAST_GLYPHS + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Glyph_Metrics + * + * @description: + * A structure to model the metrics of a single glyph. The values are + * expressed in 26.6 fractional pixel format; if the flag + * @FT_LOAD_NO_SCALE has been used while loading the glyph, values are + * expressed in font units instead. + * + * @fields: + * width :: + * The glyph's width. + * + * height :: + * The glyph's height. + * + * horiBearingX :: + * Left side bearing for horizontal layout. + * + * horiBearingY :: + * Top side bearing for horizontal layout. + * + * horiAdvance :: + * Advance width for horizontal layout. + * + * vertBearingX :: + * Left side bearing for vertical layout. + * + * vertBearingY :: + * Top side bearing for vertical layout. Larger positive values mean + * further below the vertical glyph origin. + * + * vertAdvance :: + * Advance height for vertical layout. Positive values mean the glyph + * has a positive advance downward. + * + * @note: + * If not disabled with @FT_LOAD_NO_HINTING, the values represent + * dimensions of the hinted glyph (in case hinting is applicable). + * + * Stroking a glyph with an outside border does not increase + * `horiAdvance` or `vertAdvance`; you have to manually adjust these + * values to account for the added width and height. + * + * FreeType doesn't use the 'VORG' table data for CFF fonts because it + * doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as + * `vertBearingY + height` after loading a glyph. + */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_Bitmap_Size + * + * @description: + * This structure models the metrics of a bitmap strike (i.e., a set of + * glyphs for a given point size and resolution) in a bitmap font. It is + * used for the `available_sizes` field of @FT_Face. + * + * @fields: + * height :: + * The vertical distance, in pixels, between two consecutive baselines. + * It is always positive. + * + * width :: + * The average width, in pixels, of all glyphs in the strike. + * + * size :: + * The nominal size of the strike in 26.6 fractional points. This + * field is not very useful. + * + * x_ppem :: + * The horizontal ppem (nominal width) in 26.6 fractional pixels. + * + * y_ppem :: + * The vertical ppem (nominal height) in 26.6 fractional pixels. + * + * @note: + * Windows FNT: + * The nominal size given in a FNT font is not reliable. If the driver + * finds it incorrect, it sets `size` to some calculated values, and + * `x_ppem` and `y_ppem` to the pixel width and height given in the + * font, respectively. + * + * TrueType embedded bitmaps: + * `size`, `width`, and `height` values are not contained in the bitmap + * strike itself. They are computed from the global font parameters. + */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * FT_Library + * + * @description: + * A handle to a FreeType library instance. Each 'library' is completely + * independent from the others; it is the 'root' of a set of objects like + * fonts, faces, sizes, etc. + * + * It also embeds a memory manager (see @FT_Memory), as well as a + * scan-line converter object (see @FT_Raster). + * + * [Since 2.5.6] In multi-threaded applications it is easiest to use one + * `FT_Library` object per thread. In case this is too cumbersome, a + * single `FT_Library` object across threads is possible also, as long as + * a mutex lock is used around @FT_New_Face and @FT_Done_Face. + * + * @note: + * Library objects are normally created by @FT_Init_FreeType, and + * destroyed with @FT_Done_FreeType. If you need reference-counting + * (cf. @FT_Reference_Library), use @FT_New_Library and @FT_Done_Library. + */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + /************************************************************************** + * + * @type: + * FT_Module + * + * @description: + * A handle to a given FreeType module object. A module can be a font + * driver, a renderer, or anything else that provides services to the + * former. + */ + typedef struct FT_ModuleRec_* FT_Module; + + + /************************************************************************** + * + * @type: + * FT_Driver + * + * @description: + * A handle to a given FreeType font driver object. A font driver is a + * module capable of creating faces from font files. + */ + typedef struct FT_DriverRec_* FT_Driver; + + + /************************************************************************** + * + * @type: + * FT_Renderer + * + * @description: + * A handle to a given FreeType renderer. A renderer is a module in + * charge of converting a glyph's outline image to a bitmap. It supports + * a single glyph image format, and one or more target surface depths. + */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @type: + * FT_Face + * + * @description: + * A handle to a typographic face object. A face object models a given + * typeface, in a given style. + * + * @note: + * A face object also owns a single @FT_GlyphSlot object, as well as one + * or more @FT_Size objects. + * + * Use @FT_New_Face or @FT_Open_Face to create a new face object from a + * given filepath or a custom input stream. + * + * Use @FT_Done_Face to destroy it (along with its slot and sizes). + * + * An `FT_Face` object can only be safely used from one thread at a time. + * Similarly, creation and destruction of `FT_Face` with the same + * @FT_Library object can only be done from one thread at a time. On the + * other hand, functions like @FT_Load_Glyph and its siblings are + * thread-safe and do not need the lock to be held as long as the same + * `FT_Face` object is not used from multiple threads at the same time. + * + * @also: + * See @FT_FaceRec for the publicly accessible fields of a given face + * object. + */ + typedef struct FT_FaceRec_* FT_Face; + + + /************************************************************************** + * + * @type: + * FT_Size + * + * @description: + * A handle to an object that models a face scaled to a given character + * size. + * + * @note: + * An @FT_Face has one _active_ @FT_Size object that is used by functions + * like @FT_Load_Glyph to determine the scaling transformation that in + * turn is used to load and hint glyphs and metrics. + * + * You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, @FT_Request_Size + * or even @FT_Select_Size to change the content (i.e., the scaling + * values) of the active @FT_Size. + * + * You can use @FT_New_Size to create additional size objects for a given + * @FT_Face, but they won't be used by other functions until you activate + * it through @FT_Activate_Size. Only one size can be activated at any + * given time per face. + * + * @also: + * See @FT_SizeRec for the publicly accessible fields of a given size + * object. + */ + typedef struct FT_SizeRec_* FT_Size; + + + /************************************************************************** + * + * @type: + * FT_GlyphSlot + * + * @description: + * A handle to a given 'glyph slot'. A slot is a container that can hold + * any of the glyphs contained in its parent face. + * + * In other words, each time you call @FT_Load_Glyph or @FT_Load_Char, + * the slot's content is erased by the new glyph data, i.e., the glyph's + * metrics, its image (bitmap or outline), and other control information. + * + * @also: + * See @FT_GlyphSlotRec for the publicly accessible glyph fields. + */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /************************************************************************** + * + * @type: + * FT_CharMap + * + * @description: + * A handle to a character map (usually abbreviated to 'charmap'). A + * charmap is used to translate character codes in a given encoding into + * glyph indexes for its parent's face. Some font formats may provide + * several charmaps per font. + * + * Each face object owns zero or more charmaps, but only one of them can + * be 'active', providing the data used by @FT_Get_Char_Index or + * @FT_Load_Char. + * + * The list of available charmaps in a face is available through the + * `face->num_charmaps` and `face->charmaps` fields of @FT_FaceRec. + * + * The currently active charmap is available as `face->charmap`. You + * should call @FT_Set_Charmap to change it. + * + * @note: + * When a new face is created (either through @FT_New_Face or + * @FT_Open_Face), the library looks for a Unicode charmap within the + * list and automatically activates it. If there is no Unicode charmap, + * FreeType doesn't set an 'active' charmap. + * + * @also: + * See @FT_CharMapRec for the publicly accessible fields of a given + * character map. + */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /************************************************************************** + * + * @macro: + * FT_ENC_TAG + * + * @description: + * This macro converts four-letter tags into an unsigned long. It is + * used to define 'encoding' identifiers (see @FT_Encoding). + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_ENC_TAG( value, a, b, c, d ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Encoding + * + * @description: + * An enumeration to specify character sets supported by charmaps. Used + * in the @FT_Select_Charmap API function. + * + * @note: + * Despite the name, this enumeration lists specific character + * repertories (i.e., charsets), and not text encoding methods (e.g., + * UTF-8, UTF-16, etc.). + * + * Other encodings might be defined in the future. + * + * @values: + * FT_ENCODING_NONE :: + * The encoding value~0 is reserved for all formats except BDF, PCF, + * and Windows FNT; see below for more information. + * + * FT_ENCODING_UNICODE :: + * The Unicode character set. This value covers all versions of the + * Unicode repertoire, including ASCII and Latin-1. Most fonts include + * a Unicode charmap, but not all of them. + * + * For example, if you want to access Unicode value U+1F028 (and the + * font contains it), use value 0x1F028 as the input value for + * @FT_Get_Char_Index. + * + * FT_ENCODING_MS_SYMBOL :: + * Microsoft Symbol encoding, used to encode mathematical symbols and + * wingdings. For more information, see + * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts', + * 'http://www.kostis.net/charsets/symbol.htm', and + * 'http://www.kostis.net/charsets/wingding.htm'. + * + * This encoding uses character codes from the PUA (Private Unicode + * Area) in the range U+F020-U+F0FF. + * + * FT_ENCODING_SJIS :: + * Shift JIS encoding for Japanese. More info at + * 'https://en.wikipedia.org/wiki/Shift_JIS'. See note on multi-byte + * encodings below. + * + * FT_ENCODING_PRC :: + * Corresponds to encoding systems mainly for Simplified Chinese as + * used in People's Republic of China (PRC). The encoding layout is + * based on GB~2312 and its supersets GBK and GB~18030. + * + * FT_ENCODING_BIG5 :: + * Corresponds to an encoding system for Traditional Chinese as used in + * Taiwan and Hong Kong. + * + * FT_ENCODING_WANSUNG :: + * Corresponds to the Korean encoding system known as Extended Wansung + * (MS Windows code page 949). For more information see + * 'https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. + * + * FT_ENCODING_JOHAB :: + * The Korean standard character set (KS~C 5601-1992), which + * corresponds to MS Windows code page 1361. This character set + * includes all possible Hangul character combinations. + * + * FT_ENCODING_ADOBE_LATIN_1 :: + * Corresponds to a Latin-1 encoding as defined in a Type~1 PostScript + * font. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_STANDARD :: + * Adobe Standard encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_EXPERT :: + * Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_CUSTOM :: + * Corresponds to a custom encoding, as found in Type~1, CFF, and + * OpenType/CFF fonts. It is limited to 256 character codes. + * + * FT_ENCODING_APPLE_ROMAN :: + * Apple roman encoding. Many TrueType and OpenType fonts contain a + * charmap for this 8-bit encoding, since older versions of Mac OS are + * able to use it. + * + * FT_ENCODING_OLD_LATIN_2 :: + * This value is deprecated and was neither used nor reported by + * FreeType. Don't use or test for it. + * + * FT_ENCODING_MS_SJIS :: + * Same as FT_ENCODING_SJIS. Deprecated. + * + * FT_ENCODING_MS_GB2312 :: + * Same as FT_ENCODING_PRC. Deprecated. + * + * FT_ENCODING_MS_BIG5 :: + * Same as FT_ENCODING_BIG5. Deprecated. + * + * FT_ENCODING_MS_WANSUNG :: + * Same as FT_ENCODING_WANSUNG. Deprecated. + * + * FT_ENCODING_MS_JOHAB :: + * Same as FT_ENCODING_JOHAB. Deprecated. + * + * @note: + * By default, FreeType enables a Unicode charmap and tags it with + * `FT_ENCODING_UNICODE` when it is either provided or can be generated + * from PostScript glyph name dictionaries in the font file. All other + * encodings are considered legacy and tagged only if explicitly defined + * in the font file. Otherwise, `FT_ENCODING_NONE` is used. + * + * `FT_ENCODING_NONE` is set by the BDF and PCF drivers if the charmap is + * neither Unicode nor ISO-8859-1 (otherwise it is set to + * `FT_ENCODING_UNICODE`). Use @FT_Get_BDF_Charset_ID to find out which + * encoding is really present. If, for example, the `cs_registry` field + * is 'KOI8' and the `cs_encoding` field is 'R', the font is encoded in + * KOI8-R. + * + * `FT_ENCODING_NONE` is always set (with a single exception) by the + * winfonts driver. Use @FT_Get_WinFNT_Header and examine the `charset` + * field of the @FT_WinFNT_HeaderRec structure to find out which encoding + * is really present. For example, @FT_WinFNT_ID_CP1251 (204) means + * Windows code page 1251 (for Russian). + * + * `FT_ENCODING_NONE` is set if `platform_id` is @TT_PLATFORM_MACINTOSH + * and `encoding_id` is not `TT_MAC_ID_ROMAN` (otherwise it is set to + * `FT_ENCODING_APPLE_ROMAN`). + * + * If `platform_id` is @TT_PLATFORM_MACINTOSH, use the function + * @FT_Get_CMap_Language_ID to query the Mac language ID that may be + * needed to be able to distinguish Apple encoding variants. See + * + * https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + * + * to get an idea how to do that. Basically, if the language ID is~0, + * don't use it, otherwise subtract 1 from the language ID. Then examine + * `encoding_id`. If, for example, `encoding_id` is `TT_MAC_ID_ROMAN` + * and the language ID (minus~1) is `TT_MAC_LANGID_GREEK`, it is the + * Greek encoding, not Roman. `TT_MAC_ID_ARABIC` with + * `TT_MAC_LANGID_FARSI` means the Farsi variant the Arabic encoding. + */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /* these constants are deprecated; use the corresponding `FT_Encoding` */ + /* values instead */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_PRC +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /************************************************************************** + * + * @struct: + * FT_CharMapRec + * + * @description: + * The base charmap structure. + * + * @fields: + * face :: + * A handle to the parent face object. + * + * encoding :: + * An @FT_Encoding tag identifying the charmap. Use this with + * @FT_Select_Charmap. + * + * platform_id :: + * An ID number describing the platform for the following encoding ID. + * This comes directly from the TrueType specification and gets + * emulated for other formats. + * + * encoding_id :: + * A platform-specific encoding number. This also comes from the + * TrueType specification and gets emulated similarly. + */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FT_Face_Internal + * + * @description: + * An opaque handle to an `FT_Face_InternalRec` structure that models the + * private data of a given @FT_Face object. + * + * This structure might change between releases of FreeType~2 and is not + * generally available to client applications. + */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /************************************************************************** + * + * @struct: + * FT_FaceRec + * + * @description: + * FreeType root face class structure. A face object models a typeface + * in a font file. + * + * @fields: + * num_faces :: + * The number of faces in the font file. Some font formats can have + * multiple faces in a single font file. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). They are set + * to~0 if there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, holding the named instance index for the current face + * index (starting with value~1; value~0 indicates font access without + * a named instance). For non-variation fonts, bits 16-30 are ignored. + * If we have the third named instance of face~4, say, `face_index` is + * set to 0x00030004. + * + * Bit 31 is always zero (this is, `face_index` is always a positive + * value). + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the named instance index value (only + * @FT_Set_Named_Instance does that). + * + * face_flags :: + * A set of bit flags that give important information about the face; + * see @FT_FACE_FLAG_XXX for the details. + * + * style_flags :: + * The lower 16~bits contain a set of bit flags indicating the style of + * the face; see @FT_STYLE_FLAG_XXX for the details. + * + * [Since 2.6.1] Bits 16-30 hold the number of named instances + * available for the current face if we have a GX or OpenType variation + * (sub)font. Bit 31 is always zero (this is, `style_flags` is always + * a positive value). Note that a variation font has always at least + * one named instance, namely the default instance. + * + * num_glyphs :: + * The number of glyphs in the face. If the face is scalable and has + * sbits (see `num_fixed_sizes`), it is set to the number of outline + * glyphs. + * + * For CID-keyed fonts (not in an SFNT wrapper) this value gives the + * highest CID used in the font. + * + * family_name :: + * The face's family name. This is an ASCII string, usually in + * English, that describes the typeface's family (like 'Times New + * Roman', 'Bodoni', 'Garamond', etc). This is a least common + * denominator used to list fonts. Some formats (TrueType & OpenType) + * provide localized and Unicode versions of this string. Applications + * should use the format-specific interface to access them. Can be + * `NULL` (e.g., in fonts embedded in a PDF file). + * + * In case the font doesn't provide a specific family name entry, + * FreeType tries to synthesize one, deriving it from other name + * entries. + * + * style_name :: + * The face's style name. This is an ASCII string, usually in English, + * that describes the typeface's style (like 'Italic', 'Bold', + * 'Condensed', etc). Not all font formats provide a style name, so + * this field is optional, and can be set to `NULL`. As for + * `family_name`, some formats provide localized and Unicode versions + * of this string. Applications should use the format-specific + * interface to access them. + * + * num_fixed_sizes :: + * The number of bitmap strikes in the face. Even if the face is + * scalable, there might still be bitmap strikes, which are called + * 'sbits' in that case. + * + * available_sizes :: + * An array of @FT_Bitmap_Size for all bitmap strikes in the face. It + * is set to `NULL` if there is no bitmap strike. + * + * Note that FreeType tries to sanitize the strike data since they are + * sometimes sloppy or incorrect, but this can easily fail. + * + * num_charmaps :: + * The number of charmaps in the face. + * + * charmaps :: + * An array of the charmaps of the face. + * + * generic :: + * A field reserved for client uses. See the @FT_Generic type + * description. + * + * bbox :: + * The font bounding box. Coordinates are expressed in font units (see + * `units_per_EM`). The box is large enough to contain any glyph from + * the font. Thus, `bbox.yMax` can be seen as the 'maximum ascender', + * and `bbox.yMin` as the 'minimum descender'. Only relevant for + * scalable formats. + * + * Note that the bounding box might be off by (at least) one pixel for + * hinted fonts. See @FT_Size_Metrics for further discussion. + * + * units_per_EM :: + * The number of font units per EM square for this face. This is + * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only + * relevant for scalable formats. + * + * ascender :: + * The typographic ascender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMax`. + * Only relevant for scalable formats. + * + * descender :: + * The typographic descender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMin`. + * Note that this field is negative for values below the baseline. + * Only relevant for scalable formats. + * + * height :: + * This value is the vertical distance between two consecutive + * baselines, expressed in font units. It is always positive. Only + * relevant for scalable formats. + * + * If you want the global glyph height, use `ascender - descender`. + * + * max_advance_width :: + * The maximum advance width, in font units, for all glyphs in this + * face. This can be used to make word wrapping computations faster. + * Only relevant for scalable formats. + * + * max_advance_height :: + * The maximum advance height, in font units, for all glyphs in this + * face. This is only relevant for vertical layouts, and is set to + * `height` for fonts that do not provide vertical metrics. Only + * relevant for scalable formats. + * + * underline_position :: + * The position, in font units, of the underline line for this face. + * It is the center of the underlining stem. Only relevant for + * scalable formats. + * + * underline_thickness :: + * The thickness, in font units, of the underline for this face. Only + * relevant for scalable formats. + * + * glyph :: + * The face's associated glyph slot(s). + * + * size :: + * The current active size for this face. + * + * charmap :: + * The current active charmap for this face. + * + * @note: + * Fields may be changed after a call to @FT_Attach_File or + * @FT_Attach_Stream. + * + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `ascender`, `descender`, `height`, + * `underline_position`, and `underline_thickness`. + * + * Especially for TrueType fonts see also the documentation for + * @FT_Size_Metrics. + */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness`) */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; /* face-specific auto-hinter data */ + void* extensions; /* unused */ + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /************************************************************************** + * + * @enum: + * FT_FACE_FLAG_XXX + * + * @description: + * A list of bit flags used in the `face_flags` field of the @FT_FaceRec + * structure. They inform client applications of properties of the + * corresponding face. + * + * @values: + * FT_FACE_FLAG_SCALABLE :: + * The face contains outline glyphs. Note that a face can contain + * bitmap strikes also, i.e., a face can have both this flag and + * @FT_FACE_FLAG_FIXED_SIZES set. + * + * FT_FACE_FLAG_FIXED_SIZES :: + * The face contains bitmap strikes. See also the `num_fixed_sizes` + * and `available_sizes` fields of @FT_FaceRec. + * + * FT_FACE_FLAG_FIXED_WIDTH :: + * The face contains fixed-width characters (like Courier, Lucida, + * MonoType, etc.). + * + * FT_FACE_FLAG_SFNT :: + * The face uses the SFNT storage scheme. For now, this means TrueType + * and OpenType. + * + * FT_FACE_FLAG_HORIZONTAL :: + * The face contains horizontal glyph metrics. This should be set for + * all common formats. + * + * FT_FACE_FLAG_VERTICAL :: + * The face contains vertical glyph metrics. This is only available in + * some formats, not all of them. + * + * FT_FACE_FLAG_KERNING :: + * The face contains kerning information. If set, the kerning distance + * can be retrieved using the function @FT_Get_Kerning. Otherwise the + * function always return the vector (0,0). Note that FreeType doesn't + * handle kerning data from the SFNT 'GPOS' table (as present in many + * OpenType fonts). + * + * FT_FACE_FLAG_FAST_GLYPHS :: + * THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + * + * FT_FACE_FLAG_MULTIPLE_MASTERS :: + * The face contains multiple masters and is capable of interpolating + * between them. Supported formats are Adobe MM, TrueType GX, and + * OpenType variation fonts. + * + * See section @multiple_masters for API details. + * + * FT_FACE_FLAG_GLYPH_NAMES :: + * The face contains glyph names, which can be retrieved using + * @FT_Get_Glyph_Name. Note that some TrueType fonts contain broken + * glyph name tables. Use the function @FT_Has_PS_Glyph_Names when + * needed. + * + * FT_FACE_FLAG_EXTERNAL_STREAM :: + * Used internally by FreeType to indicate that a face's stream was + * provided by the client application and should not be destroyed when + * @FT_Done_Face is called. Don't read or test this flag. + * + * FT_FACE_FLAG_HINTER :: + * The font driver has a hinting machine of its own. For example, with + * TrueType fonts, it makes sense to use data from the SFNT 'gasp' + * table only if the native TrueType hinting engine (with the bytecode + * interpreter) is available and active. + * + * FT_FACE_FLAG_CID_KEYED :: + * The face is CID-keyed. In that case, the face is not accessed by + * glyph indices but by CID values. For subsetted CID-keyed fonts this + * has the consequence that not all index values are a valid argument + * to @FT_Load_Glyph. Only the CID values for which corresponding + * glyphs in the subsetted font exist make `FT_Load_Glyph` return + * successfully; in all other cases you get an + * `FT_Err_Invalid_Argument` error. + * + * Note that CID-keyed fonts that are in an SFNT wrapper (this is, all + * OpenType/CFF fonts) don't have this flag set since the glyphs are + * accessed in the normal way (using contiguous indices); the + * 'CID-ness' isn't visible to the application. + * + * FT_FACE_FLAG_TRICKY :: + * The face is 'tricky', this is, it always needs the font format's + * native hinting engine to get a reasonable result. A typical example + * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that + * uses TrueType bytecode instructions to move and scale all of its + * subglyphs. + * + * It is not possible to auto-hint such fonts using + * @FT_LOAD_FORCE_AUTOHINT; it will also ignore @FT_LOAD_NO_HINTING. + * You have to set both @FT_LOAD_NO_HINTING and @FT_LOAD_NO_AUTOHINT to + * really disable hinting; however, you probably never want this except + * for demonstration purposes. + * + * Currently, there are about a dozen TrueType fonts in the list of + * tricky fonts; they are hard-coded in file `ttobjs.c`. + * + * FT_FACE_FLAG_COLOR :: + * [Since 2.5.1] The face has color glyph tables. See @FT_LOAD_COLOR + * for more information. + * + * FT_FACE_FLAG_VARIATION :: + * [Since 2.9] Set if the current face (or named instance) has been + * altered with @FT_Set_MM_Design_Coordinates, + * @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates. + * This flag is unset by a call to @FT_Set_Named_Instance. + */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) +#define FT_FACE_FLAG_COLOR ( 1L << 14 ) +#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_HORIZONTAL + * + * @description: + * A macro that returns true whenever a face object contains horizontal + * metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_VERTICAL + * + * @description: + * A macro that returns true whenever a face object contains real + * vertical metrics (and not only synthesized ones). + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_KERNING + * + * @description: + * A macro that returns true whenever a face object contains kerning data + * that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_KERNING ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SCALABLE + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, and + * PFR font formats). + * + */ +#define FT_IS_SCALABLE( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SFNT + * + * @description: + * A macro that returns true whenever a face object contains a font whose + * format is based on the SFNT storage scheme. This usually means: + * TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap + * fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SFNT ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_FIXED_WIDTH + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or 'monospace', 'fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FIXED_SIZES + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes` field of the @FT_FaceRec + * structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FAST_GLYPHS + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************** + * + * @macro: + * FT_HAS_GLYPH_NAMES + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_NAMED_INSTANCE + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the return value of this macro (only + * @FT_Set_Named_Instance does that). + * + * @since: + * 2.7 + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( !!( (face)->face_index & 0x7FFF0000L ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_VARIATION + * + * @description: + * A macro that returns true whenever a face object has been altered by + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or + * @FT_Set_Var_Blend_Coordinates. + * + * @since: + * 2.9 + * + */ +#define FT_IS_VARIATION( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VARIATION ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_CID_KEYED + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_TRICKY + * + * @description: + * A macro that returns true whenever a face represents a 'tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_TRICKY ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_COLOR + * + * @description: + * A macro that returns true whenever a face object contains tables for + * color glyphs. + * + * @since: + * 2.5.1 + * + */ +#define FT_HAS_COLOR( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_COLOR ) ) + + + /************************************************************************** + * + * @enum: + * FT_STYLE_FLAG_XXX + * + * @description: + * A list of bit flags to indicate the style of a given face. These are + * used in the `style_flags` field of @FT_FaceRec. + * + * @values: + * FT_STYLE_FLAG_ITALIC :: + * The face style is italic or oblique. + * + * FT_STYLE_FLAG_BOLD :: + * The face is bold. + * + * @note: + * The style information as provided by FreeType is very basic. More + * details are beyond the scope and should be done on a higher level (for + * example, by analyzing various fields of the 'OS/2' table in SFNT based + * fonts). + */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /************************************************************************** + * + * @type: + * FT_Size_Internal + * + * @description: + * An opaque handle to an `FT_Size_InternalRec` structure, used to model + * private data of a given @FT_Size object. + */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /************************************************************************** + * + * @struct: + * FT_Size_Metrics + * + * @description: + * The size metrics structure gives the metrics of a size object. + * + * @fields: + * x_ppem :: + * The width of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal width'. + * + * y_ppem :: + * The height of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal height'. + * + * x_scale :: + * A 16.16 fractional scaling value to convert horizontal metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * y_scale :: + * A 16.16 fractional scaling value to convert vertical metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * ascender :: + * The ascender in 26.6 fractional pixels, rounded up to an integer + * value. See @FT_FaceRec for the details. + * + * descender :: + * The descender in 26.6 fractional pixels, rounded down to an integer + * value. See @FT_FaceRec for the details. + * + * height :: + * The height in 26.6 fractional pixels, rounded to an integer value. + * See @FT_FaceRec for the details. + * + * max_advance :: + * The maximum advance width in 26.6 fractional pixels, rounded to an + * integer value. See @FT_FaceRec for the details. + * + * @note: + * The scaling values, if relevant, are determined first during a size + * changing operation. The remaining fields are then set by the driver. + * For scalable formats, they are usually set to scaled values of the + * corresponding fields in @FT_FaceRec. Some values like ascender or + * descender are rounded for historical reasons; more precise values (for + * outline fonts) can be derived by scaling the corresponding @FT_FaceRec + * values manually, with code similar to the following. + * + * ``` + * scaled_ascender = FT_MulFix( face->ascender, + * size_metrics->y_scale ); + * ``` + * + * Note that due to glyph hinting and the selected rendering mode these + * values are usually not exact; consequently, they must be treated as + * unreliable with an error margin of at least one pixel! + * + * Indeed, the only way to get the exact metrics is to render _all_ + * glyphs. As this would be a definite performance hit, it is up to + * client applications to perform such computations. + * + * The `FT_Size_Metrics` structure is valid for bitmap fonts also. + * + * + * **TrueType fonts with native bytecode hinting** + * + * All applications that handle TrueType fonts with native hinting must + * be aware that TTFs expect different rounding of vertical font + * dimensions. The application has to cater for this, especially if it + * wants to rely on a TTF's vertical data (for example, to properly align + * box characters vertically). + * + * Only the application knows _in advance_ that it is going to use native + * hinting for TTFs! FreeType, on the other hand, selects the hinting + * mode not at the time of creating an @FT_Size object but much later, + * namely while calling @FT_Load_Glyph. + * + * Here is some pseudo code that illustrates a possible solution. + * + * ``` + * font_format = FT_Get_Font_Format( face ); + * + * if ( !strcmp( font_format, "TrueType" ) && + * do_native_bytecode_hinting ) + * { + * ascender = ROUND( FT_MulFix( face->ascender, + * size_metrics->y_scale ) ); + * descender = ROUND( FT_MulFix( face->descender, + * size_metrics->y_scale ) ); + * } + * else + * { + * ascender = size_metrics->ascender; + * descender = size_metrics->descender; + * } + * + * height = size_metrics->height; + * max_advance = size_metrics->max_advance; + * ``` + */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_SizeRec + * + * @description: + * FreeType root size class structure. A size object models a face + * object at a given size. + * + * @fields: + * face :: + * Handle to the parent face object. + * + * generic :: + * A typeless pointer, unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each size object. + * + * metrics :: + * Metrics for this size object. This field is read-only. + */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /************************************************************************** + * + * @struct: + * FT_SubGlyph + * + * @description: + * The subglyph structure is an internal object used to describe + * subglyphs (for example, in the case of composites). + * + * @note: + * The subglyph implementation is not part of the high-level API, hence + * the forward structure declaration. + * + * You can however retrieve subglyph information with + * @FT_Get_SubGlyph_Info. + */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /************************************************************************** + * + * @type: + * FT_Slot_Internal + * + * @description: + * An opaque handle to an `FT_Slot_InternalRec` structure, used to model + * private data of a given @FT_GlyphSlot object. + */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /************************************************************************** + * + * @struct: + * FT_GlyphSlotRec + * + * @description: + * FreeType root glyph slot class structure. A glyph slot is a container + * where individual glyphs can be loaded, be they in outline or bitmap + * format. + * + * @fields: + * library :: + * A handle to the FreeType library instance this slot belongs to. + * + * face :: + * A handle to the parent face object. + * + * next :: + * In some cases (like some font tools), several glyph slots per face + * object can be a good thing. As this is rare, the glyph slots are + * listed through a direct, single-linked list using its `next` field. + * + * glyph_index :: + * [Since 2.10] The glyph index passed as an argument to @FT_Load_Glyph + * while initializing the glyph slot. + * + * generic :: + * A typeless pointer unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each glyph slot object. + * + * metrics :: + * The metrics of the last loaded glyph in the slot. The returned + * values depend on the last load flags (see the @FT_Load_Glyph API + * function) and can be expressed either in 26.6 fractional pixels or + * font units. + * + * Note that even when the glyph image is transformed, the metrics are + * not. + * + * linearHoriAdvance :: + * The advance width of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * linearVertAdvance :: + * The advance height of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * advance :: + * This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the + * transformed (hinted) advance width for the glyph, in 26.6 fractional + * pixel format. As specified with @FT_LOAD_VERTICAL_LAYOUT, it uses + * either the `horiAdvance` or the `vertAdvance` value of `metrics` + * field. + * + * format :: + * This field indicates the format of the image contained in the glyph + * slot. Typically @FT_GLYPH_FORMAT_BITMAP, @FT_GLYPH_FORMAT_OUTLINE, + * or @FT_GLYPH_FORMAT_COMPOSITE, but other values are possible. + * + * bitmap :: + * This field is used as a bitmap descriptor. Note that the address + * and content of the bitmap buffer can change between calls of + * @FT_Load_Glyph and a few other functions. + * + * bitmap_left :: + * The bitmap's left bearing expressed in integer pixels. + * + * bitmap_top :: + * The bitmap's top bearing expressed in integer pixels. This is the + * distance from the baseline to the top-most glyph scanline, upwards + * y~coordinates being **positive**. + * + * outline :: + * The outline descriptor for the current glyph image if its format is + * @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, `outline` can be + * transformed, distorted, emboldened, etc. However, it must not be + * freed. + * + * [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of + * OpenType variation fonts for a selected instance are internally + * handled as 26.6 fractional font units but returned as (rounded) + * integers, as expected. To get unrounded font units, don't use + * @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and + * scale it, using the font's `units_per_EM` value as the ppem. + * + * num_subglyphs :: + * The number of subglyphs in a composite glyph. This field is only + * valid for the composite glyph format that should normally only be + * loaded with the @FT_LOAD_NO_RECURSE flag. + * + * subglyphs :: + * An array of subglyph descriptors for composite glyphs. There are + * `num_subglyphs` elements in there. Currently internal to FreeType. + * + * control_data :: + * Certain font drivers can also return the control data for a given + * glyph image (e.g. TrueType bytecode, Type~1 charstrings, etc.). + * This field is a pointer to such data; it is currently internal to + * FreeType. + * + * control_len :: + * This is the length in bytes of the control data. Currently internal + * to FreeType. + * + * other :: + * Reserved. + * + * lsb_delta :: + * The difference between hinted and unhinted left side bearing while + * auto-hinting is active. Zero otherwise. + * + * rsb_delta :: + * The difference between hinted and unhinted right side bearing while + * auto-hinting is active. Zero otherwise. + * + * @note: + * If @FT_Load_Glyph is called with default flags (see @FT_LOAD_DEFAULT) + * the glyph image is loaded in the glyph slot in its native format + * (e.g., an outline glyph for TrueType and Type~1 formats). [Since 2.9] + * The prospective bitmap metrics are calculated according to + * @FT_LOAD_TARGET_XXX and other flags even for the outline glyph, even + * if @FT_LOAD_RENDER is not set. + * + * This image can later be converted into a bitmap by calling + * @FT_Render_Glyph. This function searches the current renderer for the + * native image's format, then invokes it. + * + * The renderer is in charge of transforming the native image through the + * slot's face transformation fields, then converting it into a bitmap + * that is returned in `slot->bitmap`. + * + * Note that `slot->bitmap_left` and `slot->bitmap_top` are also used to + * specify the position of the bitmap relative to the current pen + * position (e.g., coordinates (0,0) on the baseline). Of course, + * `slot->format` is also changed to @FT_GLYPH_FORMAT_BITMAP. + * + * Here is a small pseudo code fragment that shows how to use `lsb_delta` + * and `rsb_delta` to do fractional positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * + * + * for all glyphs do + * + * + * FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); + * + * + * + * + * + * origin_x += slot->advance.x; + * origin_x += slot->lsb_delta - slot->rsb_delta; + * endfor + * ``` + * + * Here is another small pseudo code fragment that shows how to use + * `lsb_delta` and `rsb_delta` to improve integer positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * FT_Pos prev_rsb_delta = 0; + * + * + * for all glyphs do + * + * + * + * + * if ( prev_rsb_delta - slot->lsb_delta > 32 ) + * origin_x -= 64; + * else if ( prev_rsb_delta - slot->lsb_delta < -31 ) + * origin_x += 64; + * + * prev_rsb_delta = slot->rsb_delta; + * + * + * + * origin_x += slot->advance.x; + * endfor + * ``` + * + * If you use strong auto-hinting, you **must** apply these delta values! + * Otherwise you will experience far too large inter-glyph spacing at + * small rendering sizes in most cases. Note that it doesn't harm to use + * the above code for other hinting modes also, since the delta values + * are zero then. + */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt glyph_index; /* new in 2.10; was reserved previously */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @function: + * FT_Init_FreeType + * + * @description: + * Initialize a new FreeType library object. The set of modules that are + * registered by this function is determined at build time. + * + * @output: + * alibrary :: + * A handle to a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case you want to provide your own memory allocating routines, use + * @FT_New_Library instead, followed by a call to @FT_Add_Default_Modules + * (or a series of calls to @FT_Add_Module) and + * @FT_Set_Default_Properties. + * + * See the documentation of @FT_Library and @FT_Face for multi-threading + * issues. + * + * If you need reference-counting (cf. @FT_Reference_Library), use + * @FT_New_Library and @FT_Done_Library. + * + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_FreeType + * + * @description: + * Destroy a given FreeType library object and all of its children, + * including resources, drivers, faces, sizes, etc. + * + * @input: + * library :: + * A handle to the target library object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /************************************************************************** + * + * @enum: + * FT_OPEN_XXX + * + * @description: + * A list of bit field constants used within the `flags` field of the + * @FT_Open_Args structure. + * + * @values: + * FT_OPEN_MEMORY :: + * This is a memory-based stream. + * + * FT_OPEN_STREAM :: + * Copy the stream from the `stream` field. + * + * FT_OPEN_PATHNAME :: + * Create a new input stream from a C~path name. + * + * FT_OPEN_DRIVER :: + * Use the `driver` field. + * + * FT_OPEN_PARAMS :: + * Use the `num_params` and `params` fields. + * + * @note: + * The `FT_OPEN_MEMORY`, `FT_OPEN_STREAM`, and `FT_OPEN_PATHNAME` flags + * are mutually exclusive. + */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + + + /* these constants are deprecated; use the corresponding `FT_OPEN_XXX` */ + /* values instead */ +#define ft_open_memory FT_OPEN_MEMORY +#define ft_open_stream FT_OPEN_STREAM +#define ft_open_pathname FT_OPEN_PATHNAME +#define ft_open_driver FT_OPEN_DRIVER +#define ft_open_params FT_OPEN_PARAMS + + + /************************************************************************** + * + * @struct: + * FT_Parameter + * + * @description: + * A simple structure to pass more or less generic parameters to + * @FT_Open_Face and @FT_Face_Properties. + * + * @fields: + * tag :: + * A four-byte identification tag. + * + * data :: + * A pointer to the parameter data. + * + * @note: + * The ID and function of parameters are driver-specific. See section + * @parameter_tags for more information. + */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /************************************************************************** + * + * @struct: + * FT_Open_Args + * + * @description: + * A structure to indicate how to open a new font file or stream. A + * pointer to such a structure can be used as a parameter for the + * functions @FT_Open_Face and @FT_Attach_Stream. + * + * @fields: + * flags :: + * A set of bit flags indicating how to use the structure. + * + * memory_base :: + * The first byte of the file in memory. + * + * memory_size :: + * The size in bytes of the file in memory. + * + * pathname :: + * A pointer to an 8-bit file pathname. The pointer is not owned by + * FreeType. + * + * 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 2 + + + /************************************************************************** + * + * @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/includes/freetype/ftadvanc.h b/includes/freetype/ftadvanc.h new file mode 100644 index 0000000..c30472b --- /dev/null +++ b/includes/freetype/ftadvanc.h @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * ftadvanc.h + * + * Quick computation of advance widths (specification only). + * + * Copyright (C) 2008-2020 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/includes/freetype/ftbbox.h b/includes/freetype/ftbbox.h new file mode 100644 index 0000000..294f996 --- /dev/null +++ b/includes/freetype/ftbbox.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbbox.h + * + * FreeType exact bbox computation (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftbdf.h b/includes/freetype/ftbdf.h new file mode 100644 index 0000000..61db27c --- /dev/null +++ b/includes/freetype/ftbdf.h @@ -0,0 +1,213 @@ +/**************************************************************************** + * + * ftbdf.h + * + * FreeType API for accessing BDF-specific strings (specification). + * + * Copyright (C) 2002-2020 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/includes/freetype/ftbitmap.h b/includes/freetype/ftbitmap.h new file mode 100644 index 0000000..6c55455 --- /dev/null +++ b/includes/freetype/ftbitmap.h @@ -0,0 +1,330 @@ +/**************************************************************************** + * + * ftbitmap.h + * + * FreeType utility functions for bitmaps (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/ftbzip2.h b/includes/freetype/ftbzip2.h new file mode 100644 index 0000000..cb8e845 --- /dev/null +++ b/includes/freetype/ftbzip2.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbzip2.h + * + * Bzip2-compressed stream support. + * + * Copyright (C) 2010-2020 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/includes/freetype/ftcache.h b/includes/freetype/ftcache.h new file mode 100644 index 0000000..d82c481 --- /dev/null +++ b/includes/freetype/ftcache.h @@ -0,0 +1,1088 @@ +/**************************************************************************** + * + * ftcache.h + * + * FreeType Cache subsystem (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftchapters.h b/includes/freetype/ftchapters.h new file mode 100644 index 0000000..2ee2697 --- /dev/null +++ b/includes/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/includes/freetype/ftcid.h b/includes/freetype/ftcid.h new file mode 100644 index 0000000..85b74e0 --- /dev/null +++ b/includes/freetype/ftcid.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * ftcid.h + * + * FreeType API for accessing CID font information (specification). + * + * Copyright (C) 2007-2020 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/includes/freetype/ftcolor.h b/includes/freetype/ftcolor.h new file mode 100644 index 0000000..b744939 --- /dev/null +++ b/includes/freetype/ftcolor.h @@ -0,0 +1,314 @@ +/**************************************************************************** + * + * ftcolor.h + * + * FreeType's glyph color management (specification). + * + * Copyright (C) 2018-2020 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 :: + * An optional 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 :: + * An optional 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 :: + * An optional 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. + * + * Use function @FT_Palette_Select to get the colors associated with a + * palette entry. + * + * @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/includes/freetype/ftdriver.h b/includes/freetype/ftdriver.h new file mode 100644 index 0000000..19b666e --- /dev/null +++ b/includes/freetype/ftdriver.h @@ -0,0 +1,1232 @@ +/**************************************************************************** + * + * ftdriver.h + * + * FreeType API for controlling driver modules (specification only). + * + * Copyright (C) 2017-2020 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/includes/freetype/fterrdef.h b/includes/freetype/fterrdef.h new file mode 100644 index 0000000..895d2d4 --- /dev/null +++ b/includes/freetype/fterrdef.h @@ -0,0 +1,279 @@ +/**************************************************************************** + * + * fterrdef.h + * + * FreeType error codes (specification). + * + * Copyright (C) 2002-2020 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/includes/freetype/fterrors.h b/includes/freetype/fterrors.h new file mode 100644 index 0000000..771bc5d --- /dev/null +++ b/includes/freetype/fterrors.h @@ -0,0 +1,289 @@ +/**************************************************************************** + * + * fterrors.h + * + * FreeType error code handling (specification). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_enumerations + * + * @title: + * Error Enumerations + * + * @abstract: + * How to handle errors and error strings. + * + * @description: + * The header file `fterrors.h` (which is automatically included by + * `freetype.h` defines the handling of FreeType's enumeration + * constants. It can also be used to generate error message strings + * with a small macro trick explained below. + * + * **Error Formats** + * + * The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be + * defined in `ftoption.h` in order to make the higher byte indicate the + * module where the error has happened (this is not compatible with + * standard builds of FreeType~2, however). See the file `ftmoderr.h` + * for more details. + * + * **Error Message Strings** + * + * Error definitions are set up with special macros that allow client + * applications to build a table of error message strings. The strings + * are not included in a normal build of FreeType~2 to save space (most + * client applications do not use them). + * + * To do so, you have to define the following macros before including + * this file. + * + * ``` + * FT_ERROR_START_LIST + * ``` + * + * This macro is called before anything else to define the start of the + * error list. It is followed by several `FT_ERROR_DEF` calls. + * + * ``` + * FT_ERROR_DEF( e, v, s ) + * ``` + * + * This macro is called to define one single error. 'e' is the error + * code identifier (e.g., `Invalid_Argument`), 'v' is the error's + * numerical value, and 's' is the corresponding error string. + * + * ``` + * FT_ERROR_END_LIST + * ``` + * + * This macro ends the list. + * + * Additionally, you have to undefine `FTERRORS_H_` before #including + * this file. + * + * Here is a simple example. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERRORDEF( e, v, s ) { e, s }, + * #define FT_ERROR_START_LIST { + * #define FT_ERROR_END_LIST { 0, NULL } }; + * + * const struct + * { + * int err_code; + * const char* err_msg; + * } ft_errors[] = + * + * #include FT_ERRORS_H + * ``` + * + * An alternative to using an array is a switch statement. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERROR_START_LIST switch ( error_code ) { + * #define FT_ERRORDEF( e, v, s ) case v: return s; + * #define FT_ERROR_END_LIST } + * ``` + * + * If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should + * be replaced with `FT_ERROR_BASE(error_code)` in the last example. + */ + + /* */ + + /* In previous FreeType versions we used `__FTERRORS_H__`. However, */ + /* using two successive underscores in a non-system symbol name */ + /* violates the C (and C++) standard, so it was changed to the */ + /* current form. In spite of this, we have to make */ + /* */ + /* ``` */ + /* #undefine __FTERRORS_H__ */ + /* ``` */ + /* */ + /* work for backward compatibility. */ + /* */ +#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) +#define FTERRORS_H_ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_`. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_INCLUDE_ERR_PROTOS + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for _Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_BASE + + /* FT_ERR_PREFIX is needed internally */ +#ifndef FT2_BUILD_LIBRARY +#undef FT_ERR_PREFIX +#endif + + /* FT_INCLUDE_ERR_PROTOS: Control if function prototypes should be */ + /* included with `#include FT_ERRORS_H'. This is */ + /* only true where `FT_ERRORDEF` is undefined. */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ +#ifdef FT_INCLUDE_ERR_PROTOS +#undef FT_INCLUDE_ERR_PROTOS + +#ifndef FT_ERR_PROTOS_DEFINED +#define FT_ERR_PROTOS_DEFINED + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @function: + * FT_Error_String + * + * @description: + * Retrieve the description of a valid FreeType error code. + * + * @input: + * error_code :: + * A valid FreeType error code. + * + * @return: + * A C~string or `NULL`, if any error occurred. + * + * @note: + * FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or + * `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. + * 'error_string' will be `NULL` otherwise. + * + * Module identification will be ignored: + * + * ```c + * strcmp( FT_Error_String( FT_Err_Unknown_File_Format ), + * FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; + * ``` + */ + FT_EXPORT( const char* ) + FT_Error_String( FT_Error error_code ); + +FT_END_HEADER + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/includes/freetype/ftfntfmt.h b/includes/freetype/ftfntfmt.h new file mode 100644 index 0000000..ad5a1d4 --- /dev/null +++ b/includes/freetype/ftfntfmt.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * + * ftfntfmt.h + * + * Support functions for font formats. + * + * Copyright (C) 2002-2020 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/includes/freetype/ftgasp.h b/includes/freetype/ftgasp.h new file mode 100644 index 0000000..aca1a13 --- /dev/null +++ b/includes/freetype/ftgasp.h @@ -0,0 +1,144 @@ +/**************************************************************************** + * + * ftgasp.h + * + * Access of TrueType's 'gasp' table (specification). + * + * Copyright (C) 2007-2020 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/includes/freetype/ftglyph.h b/includes/freetype/ftglyph.h new file mode 100644 index 0000000..ec515a3 --- /dev/null +++ b/includes/freetype/ftglyph.h @@ -0,0 +1,665 @@ +/**************************************************************************** + * + * ftglyph.h + * + * FreeType convenience functions to handle glyphs (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftgxval.h b/includes/freetype/ftgxval.h new file mode 100644 index 0000000..691a73b --- /dev/null +++ b/includes/freetype/ftgxval.h @@ -0,0 +1,355 @@ +/**************************************************************************** + * + * ftgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/ftgzip.h b/includes/freetype/ftgzip.h new file mode 100644 index 0000000..f588c85 --- /dev/null +++ b/includes/freetype/ftgzip.h @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * ftgzip.h + * + * Gzip-compressed stream support. + * + * Copyright (C) 2002-2020 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/includes/freetype/ftimage.h b/includes/freetype/ftimage.h new file mode 100644 index 0000000..185967c --- /dev/null +++ b/includes/freetype/ftimage.h @@ -0,0 +1,1238 @@ +/**************************************************************************** + * + * ftimage.h + * + * FreeType glyph image formats and default raster interface + * (specification). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Note: A 'raster' is simply a scan-line converter, used to render + * FT_Outlines into FT_Bitmaps. + * + */ + + +#ifndef FTIMAGE_H_ +#define FTIMAGE_H_ + + + /* STANDALONE_ is from ftgrays.c */ +#ifndef STANDALONE_ +#include +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Pos + * + * @description: + * The type FT_Pos is used to store vectorial coordinates. Depending on + * the context, these can represent distances in integer font units, or + * 16.16, or 26.6 fixed-point pixel coordinates. + */ + typedef signed long FT_Pos; + + + /************************************************************************** + * + * @struct: + * FT_Vector + * + * @description: + * A simple structure used to store a 2D vector; coordinates are of the + * FT_Pos type. + * + * @fields: + * x :: + * The horizontal coordinate. + * y :: + * The vertical coordinate. + */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /************************************************************************** + * + * @struct: + * FT_BBox + * + * @description: + * A structure used to hold an outline's bounding box, i.e., the + * coordinates of its extrema in the horizontal and vertical directions. + * + * @fields: + * xMin :: + * The horizontal minimum (left-most). + * + * yMin :: + * The vertical minimum (bottom-most). + * + * xMax :: + * The horizontal maximum (right-most). + * + * yMax :: + * The vertical maximum (top-most). + * + * @note: + * The bounding box is specified with the coordinates of the lower left + * and the upper right corner. In PostScript, those values are often + * called (llx,lly) and (urx,ury), respectively. + * + * If `yMin` is negative, this value gives the glyph's descender. + * Otherwise, the glyph doesn't descend below the baseline. Similarly, + * if `ymax` is positive, this value gives the glyph's ascender. + * + * `xMin` gives the horizontal distance from the glyph's origin to the + * left edge of the glyph's bounding box. If `xMin` is negative, the + * glyph extends to the left of the origin. + */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /************************************************************************** + * + * @enum: + * FT_Pixel_Mode + * + * @description: + * An enumeration type used to describe the format of pixels in a given + * bitmap. Note that additional formats may be added in the future. + * + * @values: + * FT_PIXEL_MODE_NONE :: + * Value~0 is reserved. + * + * FT_PIXEL_MODE_MONO :: + * A monochrome bitmap, using 1~bit per pixel. Note that pixels are + * stored in most-significant order (MSB), which means that the + * left-most pixel in a byte has value 128. + * + * FT_PIXEL_MODE_GRAY :: + * An 8-bit bitmap, generally used to represent anti-aliased glyph + * images. Each pixel is stored in one byte. Note that the number of + * 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap + * structure (it generally is 256). + * + * FT_PIXEL_MODE_GRAY2 :: + * A 2-bit per pixel bitmap, used to represent embedded anti-aliased + * bitmaps in font files according to the OpenType specification. We + * haven't found a single font using this format, however. + * + * FT_PIXEL_MODE_GRAY4 :: + * A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps + * in font files according to the OpenType specification. We haven't + * found a single font using this format, however. + * + * FT_PIXEL_MODE_LCD :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on LCD displays; the bitmap is three times wider than + * the original glyph image. See also @FT_RENDER_MODE_LCD. + * + * FT_PIXEL_MODE_LCD_V :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on rotated LCD displays; the bitmap is three times + * taller than the original glyph image. See also + * @FT_RENDER_MODE_LCD_V. + * + * FT_PIXEL_MODE_BGRA :: + * [Since 2.5] An image with four 8-bit channels per pixel, + * representing a color image (such as emoticons) with alpha channel. + * For each pixel, the format is BGRA, which means, the blue channel + * comes first in memory. The color channels are pre-multiplied and in + * the sRGB colorspace. For example, full red at half-translucent + * opacity will be represented as '00,00,80,80', not '00,00,FF,80'. + * See also @FT_LOAD_COLOR. + */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + FT_PIXEL_MODE_BGRA, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */ + /* values instead. */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + + /************************************************************************** + * + * @struct: + * FT_Bitmap + * + * @description: + * A structure used to describe a bitmap or pixmap to the raster. Note + * that we now manage pixmaps of various depths through the `pixel_mode` + * field. + * + * @fields: + * rows :: + * The number of bitmap rows. + * + * width :: + * The number of pixels in bitmap row. + * + * pitch :: + * The pitch's absolute value is the number of bytes taken by one + * bitmap row, including padding. However, the pitch is positive when + * the bitmap has a 'down' flow, and negative when it has an 'up' flow. + * In all cases, the pitch is an offset to add to a bitmap pointer in + * order to go down one row. + * + * Note that 'padding' means the alignment of a bitmap to a byte + * border, and FreeType functions normally align to the smallest + * possible integer value. + * + * For the B/W rasterizer, `pitch` is always an even number. + * + * To change the pitch of a bitmap (say, to make it a multiple of 4), + * use @FT_Bitmap_Convert. Alternatively, you might use callback + * functions to directly render to the application's surface; see the + * file `example2.cpp` in the tutorial for a demonstration. + * + * buffer :: + * A typeless pointer to the bitmap buffer. This value should be + * aligned on 32-bit boundaries in most cases. + * + * num_grays :: + * This field is only used with @FT_PIXEL_MODE_GRAY; it gives the + * number of gray levels used in the bitmap. + * + * pixel_mode :: + * The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode + * for possible values. + * + * palette_mode :: + * This field is intended for paletted pixel modes; it indicates how + * the palette is stored. Not used currently. + * + * palette :: + * A typeless pointer to the bitmap palette; this field is intended for + * paletted pixel modes. Not used currently. + */ + typedef struct FT_Bitmap_ + { + unsigned int rows; + unsigned int width; + int pitch; + unsigned char* buffer; + unsigned short num_grays; + unsigned char pixel_mode; + unsigned char palette_mode; + void* palette; + + } FT_Bitmap; + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Outline + * + * @description: + * This structure is used to describe an outline to the scan-line + * converter. + * + * @fields: + * n_contours :: + * The number of contours in the outline. + * + * n_points :: + * The number of points in the outline. + * + * points :: + * A pointer to an array of `n_points` @FT_Vector elements, giving the + * outline's point coordinates. + * + * tags :: + * A pointer to an array of `n_points` chars, giving each outline + * point's type. + * + * If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier + * control point, while it is 'on' if set. + * + * Bit~1 is meaningful for 'off' points only. If set, it indicates a + * third-order Bezier arc control point; and a second-order control + * point if unset. + * + * If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in + * the OpenType specification; the value is the same as the argument to + * the 'SCANMODE' instruction). + * + * Bits 3 and~4 are reserved for internal purposes. + * + * contours :: + * An array of `n_contours` shorts, giving the end point of each + * contour within the outline. For example, the first contour is + * defined by the points '0' to `contours[0]`, the second one is + * defined by the points `contours[0]+1` to `contours[1]`, etc. + * + * flags :: + * A set of bit flags used to characterize the outline and give hints + * to the scan-converter and hinter on how to convert/grid-fit it. See + * @FT_OUTLINE_XXX. + * + * @note: + * The B/W rasterizer only checks bit~2 in the `tags` array for the first + * point of each contour. The drop-out mode as given with + * @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden. + */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* */ + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /************************************************************************** + * + * @enum: + * FT_OUTLINE_XXX + * + * @description: + * A list of bit-field constants used for the flags in an outline's + * `flags` field. + * + * @values: + * FT_OUTLINE_NONE :: + * Value~0 is reserved. + * + * FT_OUTLINE_OWNER :: + * If set, this flag indicates that the outline's field arrays (i.e., + * `points`, `flags`, and `contours`) are 'owned' by the outline + * object, and should thus be freed when it is destroyed. + * + * FT_OUTLINE_EVEN_ODD_FILL :: + * By default, outlines are filled using the non-zero winding rule. If + * set to 1, the outline will be filled using the even-odd fill rule + * (only works with the smooth rasterizer). + * + * FT_OUTLINE_REVERSE_FILL :: + * By default, outside contours of an outline are oriented in + * clock-wise direction, as defined in the TrueType specification. + * This flag is set if the outline uses the opposite direction + * (typically for Type~1 fonts). This flag is ignored by the scan + * converter. + * + * FT_OUTLINE_IGNORE_DROPOUTS :: + * By default, the scan converter will try to detect drop-outs in an + * outline and correct the glyph bitmap to ensure consistent shape + * continuity. If set, this flag hints the scan-line converter to + * ignore such cases. See below for more information. + * + * FT_OUTLINE_SMART_DROPOUTS :: + * Select smart dropout control. If unset, use simple dropout control. + * Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_INCLUDE_STUBS :: + * If set, turn pixels on for 'stubs', otherwise exclude them. Ignored + * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_HIGH_PRECISION :: + * This flag indicates that the scan-line converter should try to + * convert this outline to bitmaps with the highest possible quality. + * It is typically set for small character sizes. Note that this is + * only a hint that might be completely ignored by a given + * scan-converter. + * + * FT_OUTLINE_SINGLE_PASS :: + * This flag is set to force a given scan-converter to only use a + * single pass over the outline to render a bitmap glyph image. + * Normally, it is set for very large character sizes. It is only a + * hint that might be completely ignored by a given scan-converter. + * + * @note: + * The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer. + * + * There exists a second mechanism to pass the drop-out mode to the B/W + * rasterizer; see the `tags` field in @FT_Outline. + * + * Please refer to the description of the 'SCANTYPE' instruction in the + * OpenType specification (in file `ttinst1.doc`) how simple drop-outs, + * smart drop-outs, and stubs are defined. + */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /* these constants are deprecated; use the corresponding */ + /* `FT_OUTLINE_XXX` values instead */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 0x03 ) + + /* see the `tags` field in `FT_Outline` for a description of the values */ +#define FT_CURVE_TAG_ON 0x01 +#define FT_CURVE_TAG_CONIC 0x00 +#define FT_CURVE_TAG_CUBIC 0x02 + +#define FT_CURVE_TAG_HAS_SCANMODE 0x04 + +#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + /* values 0x20, 0x40, and 0x80 are reserved */ + + + /* these constants are deprecated; use the corresponding */ + /* `FT_CURVE_TAG_XXX` values instead */ +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /************************************************************************** + * + * @functype: + * FT_Outline_MoveToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'move to' + * function during outline walking/decomposition. + * + * A 'move to' is emitted to start a new contour in an outline. + * + * @input: + * to :: + * A pointer to the target point of the 'move to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_LineToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'line to' + * function during outline walking/decomposition. + * + * A 'line to' is emitted to indicate a segment in the outline. + * + * @input: + * to :: + * A pointer to the target point of the 'line to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_ConicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'conic to' + * function during outline walking or decomposition. + * + * A 'conic to' is emitted to indicate a second-order Bezier arc in the + * outline. + * + * @input: + * control :: + * An intermediate control point between the last position and the new + * target in `to`. + * + * to :: + * A pointer to the target end point of the conic arc. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_CubicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'cubic to' + * function during outline walking or decomposition. + * + * A 'cubic to' is emitted to indicate a third-order Bezier arc. + * + * @input: + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to the second Bezier control point. + * + * to :: + * A pointer to the target end point. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /************************************************************************** + * + * @struct: + * FT_Outline_Funcs + * + * @description: + * A structure to hold various function pointers used during outline + * decomposition in order to emit segments, conic, and cubic Beziers. + * + * @fields: + * move_to :: + * The 'move to' emitter. + * + * line_to :: + * The segment emitter. + * + * conic_to :: + * The second-order Bezier arc emitter. + * + * cubic_to :: + * The third-order Bezier arc emitter. + * + * shift :: + * The shift that is applied to coordinates before they are sent to the + * emitter. + * + * delta :: + * The delta that is applied to coordinates before they are sent to the + * emitter, but after the shift. + * + * @note: + * The point coordinates sent to the emitters are the transformed version + * of the original coordinates (this is important for high accuracy + * during scan-conversion). The transformation is simple: + * + * ``` + * x' = (x << shift) - delta + * y' = (y << shift) - delta + * ``` + * + * Set the values of `shift` and `delta` to~0 to get the original point + * coordinates. + */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_TAG + * + * @description: + * This macro converts four-letter tags to an unsigned long type. + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Glyph_Format + * + * @description: + * An enumeration type used to describe the format of a given glyph + * image. Note that this version of FreeType only supports two image + * formats, even though future font drivers will be able to register + * their own format. + * + * @values: + * FT_GLYPH_FORMAT_NONE :: + * The value~0 is reserved. + * + * FT_GLYPH_FORMAT_COMPOSITE :: + * The glyph image is a composite of several other images. This format + * is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report + * compound glyphs (like accented characters). + * + * FT_GLYPH_FORMAT_BITMAP :: + * The glyph image is a bitmap, and can be described as an @FT_Bitmap. + * You generally need to access the `bitmap` field of the + * @FT_GlyphSlotRec structure to read it. + * + * FT_GLYPH_FORMAT_OUTLINE :: + * The glyph image is a vectorial outline made of line segments and + * Bezier arcs; it can be described as an @FT_Outline; you generally + * want to access the `outline` field of the @FT_GlyphSlotRec structure + * to read it. + * + * FT_GLYPH_FORMAT_PLOTTER :: + * The glyph image is a vectorial path with no inside and outside + * contours. Some Type~1 fonts, like those in the Hershey family, + * contain glyphs in this format. These are described as @FT_Outline, + * but FreeType isn't currently capable of rendering them correctly. + */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_Format` values instead. */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * A raster is a scan converter, in charge of rendering an outline into a + * bitmap. This section contains the public API for rasters. + * + * Note that in FreeType 2, all rasters are now encapsulated within + * specific modules called 'renderers'. See `ftrender.h` for more details + * on renderers. + * + */ + + + /************************************************************************** + * + * @section: + * raster + * + * @title: + * Scanline Converter + * + * @abstract: + * How vectorial outlines are converted into bitmaps and pixmaps. + * + * @description: + * This section contains technical definitions. + * + * @order: + * FT_Raster + * FT_Span + * FT_SpanFunc + * + * FT_Raster_Params + * FT_RASTER_FLAG_XXX + * + * FT_Raster_NewFunc + * FT_Raster_DoneFunc + * FT_Raster_ResetFunc + * FT_Raster_SetModeFunc + * FT_Raster_RenderFunc + * FT_Raster_Funcs + * + */ + + + /************************************************************************** + * + * @type: + * FT_Raster + * + * @description: + * An opaque handle (pointer) to a raster object. Each object can be + * used independently to convert an outline into a bitmap or pixmap. + */ + typedef struct FT_RasterRec_* FT_Raster; + + + /************************************************************************** + * + * @struct: + * FT_Span + * + * @description: + * A structure used to model a single span of gray pixels when rendering + * an anti-aliased bitmap. + * + * @fields: + * x :: + * The span's horizontal start position. + * + * len :: + * The span's length in pixels. + * + * coverage :: + * The span color/coverage, ranging from 0 (background) to 255 + * (foreground). + * + * @note: + * This structure is used by the span drawing callback type named + * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. + * + * The coverage value is always between 0 and 255. If you want less gray + * values, the callback function has to reduce them. + */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /************************************************************************** + * + * @functype: + * FT_SpanFunc + * + * @description: + * A function used as a call-back by the anti-aliased renderer in order + * to let client applications draw themselves the gray pixel spans on + * each scan line. + * + * @input: + * y :: + * The scanline's upward y~coordinate. + * + * count :: + * The number of spans to draw on this scanline. + * + * spans :: + * A table of `count` spans to draw on the scanline. + * + * user :: + * User-supplied data that is passed to the callback. + * + * @note: + * This callback allows client applications to directly render the gray + * spans of the anti-aliased bitmap to any kind of surfaces. + * + * This can be used to write anti-aliased outlines directly to a given + * background bitmap, and even perform translucency. + */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitTest_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitSet_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @enum: + * FT_RASTER_FLAG_XXX + * + * @description: + * A list of bit flag constants as used in the `flags` field of a + * @FT_Raster_Params structure. + * + * @values: + * FT_RASTER_FLAG_DEFAULT :: + * This value is 0. + * + * FT_RASTER_FLAG_AA :: + * This flag is set to indicate that an anti-aliased glyph image should + * be generated. Otherwise, it will be monochrome (1-bit). + * + * FT_RASTER_FLAG_DIRECT :: + * This flag is set to indicate direct rendering. In this mode, client + * applications must provide their own span callback. This lets them + * directly draw or compose over an existing bitmap. If this bit is + * _not_ set, the target pixmap's buffer _must_ be zeroed before + * rendering and the output will be clipped to its size. + * + * Direct rendering is only possible with anti-aliased glyphs. + * + * FT_RASTER_FLAG_CLIP :: + * This flag is only used in direct rendering mode. If set, the output + * will be clipped to a box specified in the `clip_box` field of the + * @FT_Raster_Params structure. Otherwise, the `clip_box` is + * effectively set to the bounding box and all spans are generated. + */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* these constants are deprecated; use the corresponding */ + /* `FT_RASTER_FLAG_XXX` values instead */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /************************************************************************** + * + * @struct: + * FT_Raster_Params + * + * @description: + * A structure to hold the parameters used by a raster's render function, + * passed as an argument to @FT_Outline_Render. + * + * @fields: + * target :: + * The target bitmap. + * + * source :: + * A pointer to the source glyph image (e.g., an @FT_Outline). + * + * flags :: + * The rendering flags. + * + * gray_spans :: + * The gray span drawing callback. + * + * black_spans :: + * Unused. + * + * bit_test :: + * Unused. + * + * bit_set :: + * Unused. + * + * user :: + * User-supplied data that is passed to each drawing callback. + * + * clip_box :: + * An optional clipping box. It is only used in direct rendering mode. + * Note that coordinates here should be expressed in _integer_ pixels + * (and not in 26.6 fixed-point units). + * + * @note: + * An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA bit + * flag is set in the `flags` field, otherwise a monochrome bitmap is + * generated. + * + * If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags`, the raster + * will call the `gray_spans` callback to draw gray pixel spans. This + * allows direct composition over a pre-existing bitmap through + * user-provided callbacks to perform the span drawing and composition. + * Not supported by the monochrome rasterizer. + */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* unused */ + FT_Raster_BitTest_Func bit_test; /* unused */ + FT_Raster_BitSet_Func bit_set; /* unused */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /************************************************************************** + * + * @functype: + * FT_Raster_NewFunc + * + * @description: + * A function used to create a new raster object. + * + * @input: + * memory :: + * A handle to the memory allocator. + * + * @output: + * raster :: + * A handle to the new raster object. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The `memory` parameter is a typeless pointer in order to avoid + * un-wanted dependencies on the rest of the FreeType code. In practice, + * it is an @FT_Memory object, i.e., a handle to the standard FreeType + * memory allocator. However, this field can be completely ignored by a + * given raster implementation. + */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_DoneFunc + * + * @description: + * A function used to destroy a given raster object. + * + * @input: + * raster :: + * A handle to the raster object. + */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_ResetFunc + * + * @description: + * FreeType used to provide an area of memory called the 'render pool' + * available to all registered rasterizers. This was not thread safe, + * however, and now FreeType never allocates this pool. + * + * This function is called after a new raster object is created. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * pool_base :: + * Previously, the address in memory of the render pool. Set this to + * `NULL`. + * + * pool_size :: + * Previously, the size in bytes of the render pool. Set this to 0. + * + * @note: + * Rasterizers should rely on dynamic or stack allocation if they want to + * (a handle to the memory allocator is passed to the rasterizer + * constructor). + */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_SetModeFunc + * + * @description: + * This function is a generic facility to change modes or attributes in a + * given raster. This can be used for debugging purposes, or simply to + * allow implementation-specific 'features' in a given raster module. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * mode :: + * A 4-byte tag used to name the mode or property. + * + * args :: + * A pointer to the new mode/property to use. + */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_RenderFunc + * + * @description: + * Invoke a given raster to scan-convert a given glyph image into a + * target bitmap. + * + * @input: + * raster :: + * A handle to the raster object. + * + * params :: + * A pointer to an @FT_Raster_Params structure used to store the + * rendering parameters. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The exact format of the source image depends on the raster's glyph + * format defined in its @FT_Raster_Funcs structure. It can be an + * @FT_Outline or anything else in order to support a large array of + * glyph formats. + * + * Note also that the render function can fail and return a + * `FT_Err_Unimplemented_Feature` error code if the raster used does not + * support direct composition. + */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /************************************************************************** + * + * @struct: + * FT_Raster_Funcs + * + * @description: + * A structure used to describe a given raster class to the library. + * + * @fields: + * glyph_format :: + * The supported glyph format for this raster. + * + * raster_new :: + * The raster constructor. + * + * raster_reset :: + * Used to reset the render pool within the raster. + * + * raster_render :: + * A function to render a glyph into a given bitmap. + * + * raster_done :: + * The raster destructor. + */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + /* */ + + +FT_END_HEADER + +#endif /* FTIMAGE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/includes/freetype/ftincrem.h b/includes/freetype/ftincrem.h new file mode 100644 index 0000000..8c00cfe --- /dev/null +++ b/includes/freetype/ftincrem.h @@ -0,0 +1,344 @@ +/**************************************************************************** + * + * ftincrem.h + * + * FreeType incremental loading (specification). + * + * Copyright (C) 2002-2020 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/includes/freetype/ftlcdfil.h b/includes/freetype/ftlcdfil.h new file mode 100644 index 0000000..c5516d0 --- /dev/null +++ b/includes/freetype/ftlcdfil.h @@ -0,0 +1,328 @@ +/**************************************************************************** + * + * ftlcdfil.h + * + * FreeType API for color filtering of subpixel bitmap glyphs + * (specification). + * + * Copyright (C) 2006-2020 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/includes/freetype/ftlist.h b/includes/freetype/ftlist.h new file mode 100644 index 0000000..3f6079f --- /dev/null +++ b/includes/freetype/ftlist.h @@ -0,0 +1,297 @@ +/**************************************************************************** + * + * ftlist.h + * + * Generic list support for FreeType (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftlzw.h b/includes/freetype/ftlzw.h new file mode 100644 index 0000000..37a53c1 --- /dev/null +++ b/includes/freetype/ftlzw.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * ftlzw.h + * + * LZW-compressed stream support. + * + * Copyright (C) 2004-2020 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/includes/freetype/ftmac.h b/includes/freetype/ftmac.h new file mode 100644 index 0000000..c1a0aa3 --- /dev/null +++ b/includes/freetype/ftmac.h @@ -0,0 +1,290 @@ +/**************************************************************************** + * + * ftmac.h + * + * Additional Mac-specific API. + * + * Copyright (C) 1996-2020 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/includes/freetype/ftmm.h b/includes/freetype/ftmm.h new file mode 100644 index 0000000..0d83994 --- /dev/null +++ b/includes/freetype/ftmm.h @@ -0,0 +1,753 @@ +/**************************************************************************** + * + * ftmm.h + * + * FreeType Multiple Master font interface (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftmodapi.h b/includes/freetype/ftmodapi.h new file mode 100644 index 0000000..01cb5fb --- /dev/null +++ b/includes/freetype/ftmodapi.h @@ -0,0 +1,785 @@ +/**************************************************************************** + * + * ftmodapi.h + * + * FreeType modules public interface (specification). + * + * Copyright (C) 1996-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMODAPI_H_ +#define FTMODAPI_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + * @title: + * Module Management + * + * @abstract: + * How to add, upgrade, remove, and control modules from FreeType. + * + * @description: + * The definitions below are used to manage modules within FreeType. + * Modules can be added, upgraded, and removed at runtime. Additionally, + * some module properties can be controlled also. + * + * Here is a list of possible values of the `module_name` field in the + * @FT_Module_Class structure. + * + * ``` + * autofitter + * bdf + * cff + * gxvalid + * otvalid + * pcf + * pfr + * psaux + * pshinter + * psnames + * raster1 + * sfnt + * smooth, smooth-lcd, smooth-lcdv + * truetype + * type1 + * type42 + * t1cid + * winfonts + * ``` + * + * Note that the FreeType Cache sub-system is not a FreeType module. + * + * @order: + * FT_Module + * FT_Module_Constructor + * FT_Module_Destructor + * FT_Module_Requester + * FT_Module_Class + * + * FT_Add_Module + * FT_Get_Module + * FT_Remove_Module + * FT_Add_Default_Modules + * + * FT_Property_Set + * FT_Property_Get + * FT_Set_Default_Properties + * + * FT_New_Library + * FT_Done_Library + * FT_Reference_Library + * + * FT_Renderer + * FT_Renderer_Class + * + * FT_Get_Renderer + * FT_Set_Renderer + * + * FT_Set_Debug_Hook + * + */ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ +#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */ + /* produces LIGHT hints */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER +#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY + + + typedef FT_Pointer FT_Module_Interface; + + + /************************************************************************** + * + * @functype: + * FT_Module_Constructor + * + * @description: + * A function used to initialize (not create) a new module object. + * + * @input: + * module :: + * The module to initialize. + */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Destructor + * + * @description: + * A function used to finalize (not destroy) a given module object. + * + * @input: + * module :: + * The module to finalize. + */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Requester + * + * @description: + * A function used to query a given module for a specific interface. + * + * @input: + * module :: + * The module to be searched. + * + * name :: + * The name of the interface in the module. + */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /************************************************************************** + * + * @struct: + * FT_Module_Class + * + * @description: + * The module class descriptor. While being a public structure necessary + * for FreeType's module bookkeeping, most of the fields are essentially + * internal, not to be used directly by an application. + * + * @fields: + * module_flags :: + * Bit flags describing the module. + * + * module_size :: + * The size of one module object/instance in bytes. + * + * module_name :: + * The name of the module. + * + * module_version :: + * The version, as a 16.16 fixed number (major.minor). + * + * module_requires :: + * The version of FreeType this module requires, as a 16.16 fixed + * number (major.minor). Starts at version 2.0, i.e., 0x20000. + * + * module_interface :: + * A typeless pointer to a structure (which varies between different + * modules) that holds the module's interface functions. This is + * essentially what `get_interface` returns. + * + * module_init :: + * The initializing function. + * + * module_done :: + * The finalizing function. + * + * get_interface :: + * The interface requesting function. + */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /************************************************************************** + * + * @function: + * FT_Add_Module + * + * @description: + * Add a new module to a given library instance. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * clazz :: + * A pointer to class descriptor for the module. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /************************************************************************** + * + * @function: + * FT_Get_Module + * + * @description: + * Find a module by its name. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module handle. 0~if none was found. + * + * @note: + * FreeType's internal modules aren't documented very well, and you + * should look up the source code for details. + */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /************************************************************************** + * + * @function: + * FT_Remove_Module + * + * @description: + * Remove a given module from a library instance. + * + * @inout: + * library :: + * A handle to a library object. + * + * @input: + * module :: + * A handle to a module object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The module object is destroyed by the function in case of success. + */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /************************************************************************** + * + * @function: + * FT_Property_Set + * + * @description: + * Set a property for a given module. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * Note that only a few modules have properties. + * + * value :: + * A generic pointer to a variable or structure that gives the new + * value of the property. The exact definition of `value` is + * dependent on the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example sets property 'bar' (a simple integer) in + * module 'foo' to value~1. + * + * ``` + * FT_UInt bar; + * + * + * bar = 1; + * FT_Property_Set( library, "foo", "bar", &bar ); + * ``` + * + * Note that the FreeType Cache sub-system doesn't recognize module + * property changes. To avoid glyph lookup confusion within the cache + * you should call @FTC_Manager_Reset to completely flush the cache if a + * module property gets changed after @FTC_Manager_New has been called. + * + * It is not possible to set properties of the FreeType Cache sub-system + * itself with FT_Property_Set; use @FTC_Property_Set instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ); + + + /************************************************************************** + * + * @function: + * FT_Property_Get + * + * @description: + * Get a module's property value. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * @inout: + * value :: + * A generic pointer to a variable or structure that gives the value + * of the property. The exact definition of `value` is dependent on + * the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example gets property 'baz' (a range) in module 'foo'. + * + * ``` + * typedef range_ + * { + * FT_Int32 min; + * FT_Int32 max; + * + * } range; + * + * range baz; + * + * + * FT_Property_Get( library, "foo", "baz", &baz ); + * ``` + * + * It is not possible to retrieve properties of the FreeType Cache + * sub-system with FT_Property_Get; use @FTC_Property_Get instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Properties + * + * @description: + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + * + * If the compilation option is not set, this function does nothing. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 \ + * autofitter:warping=1 + * ``` + * + * @inout: + * library :: + * A handle to a new library object. + * + * @since: + * 2.8 + */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Library + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Library structure + * is created. This function increments the counter. @FT_Done_Library + * then only destroys a library if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Library objects. + * + * @input: + * library :: + * A handle to a target library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_New_Library + * + * @description: + * This function is used to create a new FreeType library instance from a + * given memory object. It is thus possible to use libraries with + * distinct memory allocators within the same program. Note, however, + * that the used @FT_Memory structure is expected to remain valid for the + * life of the @FT_Library object. + * + * Normally, you would call this function (followed by a call to + * @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a + * call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to + * initialize the FreeType library. + * + * Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library + * instance. + * + * @input: + * memory :: + * A handle to the original memory object. + * + * @output: + * alibrary :: + * A pointer to handle of a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_Library + * + * @description: + * Discard a given library object. This closes all drivers and discards + * all resource objects. + * + * @input: + * library :: + * A handle to the target library. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + + + /************************************************************************** + * + * @functype: + * FT_DebugHook_Func + * + * @description: + * A drop-in replacement (or rather a wrapper) for the bytecode or + * charstring interpreter's main loop function. + * + * Its job is essentially + * + * - to activate debug mode to enforce single-stepping, + * + * - to call the main loop function to interpret the next opcode, and + * + * - to show the changed context to the user. + * + * An example for such a main loop function is `TT_RunIns` (declared in + * FreeType's internal header file `src/truetype/ttinterp.h`). + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of a drop-in replacement. + * + * @inout: + * arg :: + * A typeless pointer, to be cast to the main loop function's data + * structure (which depends on the font module). For TrueType fonts + * it is bytecode interpreter's execution context, `TT_ExecContext`, + * which is declared in FreeType's internal header file `tttypes.h`. + */ + typedef FT_Error + (*FT_DebugHook_Func)( void* arg ); + + + /************************************************************************** + * + * @enum: + * FT_DEBUG_HOOK_XXX + * + * @description: + * A list of named debug hook indices. + * + * @values: + * FT_DEBUG_HOOK_TRUETYPE:: + * This hook index identifies the TrueType bytecode debugger. + */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /************************************************************************** + * + * @function: + * FT_Set_Debug_Hook + * + * @description: + * Set a debug hook function for debugging the interpreter of a font + * format. + * + * While this is a public API function, an application needs access to + * FreeType's internal header files to do something useful. + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of its usage. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * hook_index :: + * The index of the debug hook. You should use defined enumeration + * macros like @FT_DEBUG_HOOK_TRUETYPE. + * + * debug_hook :: + * The function used to debug the interpreter. + * + * @note: + * Currently, four debug hook slots are available, but only one (for the + * TrueType interpreter) is defined. + */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /************************************************************************** + * + * @function: + * FT_Add_Default_Modules + * + * @description: + * Add the set of default drivers to a given library object. This is + * only useful when you create a library object with @FT_New_Library + * (usually to plug a custom memory manager). + * + * @inout: + * library :: + * A handle to a new library object. + */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode engine is + * implemented in a given FT_Library instance. It is used by the + * @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * Deprecated and removed. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers the full + * instruction set of the TrueType virtual machine (this was governed + * by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @function: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of the + * TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMODAPI_H_ */ + + +/* END */ diff --git a/includes/freetype/ftmoderr.h b/includes/freetype/ftmoderr.h new file mode 100644 index 0000000..5e6aeeb --- /dev/null +++ b/includes/freetype/ftmoderr.h @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * ftmoderr.h + * + * FreeType module error offsets (specification). + * + * Copyright (C) 2001-2020 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/includes/freetype/ftotval.h b/includes/freetype/ftotval.h new file mode 100644 index 0000000..6f46c41 --- /dev/null +++ b/includes/freetype/ftotval.h @@ -0,0 +1,207 @@ +/**************************************************************************** + * + * ftotval.h + * + * FreeType API for validating OpenType tables (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/ftoutln.h b/includes/freetype/ftoutln.h new file mode 100644 index 0000000..fa295b0 --- /dev/null +++ b/includes/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-2020 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOUTLN_H_ +#define FTOUTLN_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + * @title: + * Outline Processing + * + * @abstract: + * Functions to create, transform, and render vectorial glyph images. + * + * @description: + * This section contains routines used to create and destroy scalable + * glyph images known as 'outlines'. These can also be measured, + * transformed, and converted into bitmaps and pixmaps. + * + * @order: + * FT_Outline + * FT_Outline_New + * FT_Outline_Done + * FT_Outline_Copy + * FT_Outline_Translate + * FT_Outline_Transform + * FT_Outline_Embolden + * FT_Outline_EmboldenXY + * FT_Outline_Reverse + * FT_Outline_Check + * + * FT_Outline_Get_CBox + * FT_Outline_Get_BBox + * + * FT_Outline_Get_Bitmap + * FT_Outline_Render + * FT_Outline_Decompose + * FT_Outline_Funcs + * FT_Outline_MoveToFunc + * FT_Outline_LineToFunc + * FT_Outline_ConicToFunc + * FT_Outline_CubicToFunc + * + * FT_Orientation + * FT_Outline_Get_Orientation + * + * FT_OUTLINE_XXX + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Decompose + * + * @description: + * Walk over an outline's structure to decompose it into individual + * segments and Bezier arcs. This function also emits 'move to' + * operations to indicate the start of new contours in the outline. + * + * @input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of 'emitters', i.e., function pointers called during + * decomposition to indicate path operations. + * + * @inout: + * user :: + * A typeless pointer that is passed to each emitter during the + * decomposition. It can be used to store the state during the + * decomposition. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * A contour that contains a single point only is represented by a 'move + * to' operation followed by 'line to' to the same point. In most cases, + * it is best to filter this out before using the outline for stroking + * purposes (otherwise it would result in a visible dot when round caps + * are used). + * + * Similarly, the function returns success for an empty outline also + * (doing nothing, this is, not calling any emitter); if necessary, you + * should filter this out, too. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_Outline_New + * + * @description: + * Create a new outline of a given size. + * + * @input: + * library :: + * A handle to the library object from where the outline is allocated. + * Note however that the new outline will **not** necessarily be + * **freed**, when destroying the library, by @FT_Done_FreeType. + * + * numPoints :: + * The maximum number of points within the outline. Must be smaller + * than or equal to 0xFFFF (65535). + * + * numContours :: + * The maximum number of contours within the outline. This value must + * be in the range 0 to `numPoints`. + * + * @output: + * anoutline :: + * A handle to the new outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The reason why this function takes a `library` parameter is simply to + * use the library's memory allocator. + */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Done + * + * @description: + * Destroy an outline created with @FT_Outline_New. + * + * @input: + * library :: + * A handle of the library object used to allocate the outline. + * + * outline :: + * A pointer to the outline object to be discarded. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the outline's 'owner' field is not set, only the outline descriptor + * will be released. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Check + * + * @description: + * Check the contents of an outline descriptor. + * + * @input: + * outline :: + * A handle to a source outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An empty outline, or an outline with a single point only is also + * valid. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_CBox + * + * @description: + * Return an outline's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * outline :: + * A pointer to the source outline descriptor. + * + * @output: + * acbox :: + * The outline's control box. + * + * @note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Translate + * + * @description: + * Apply a simple translation to the points of an outline. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * xOffset :: + * The horizontal offset. + * + * yOffset :: + * The vertical offset. + */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Copy + * + * @description: + * Copy an outline into another one. Both objects must have the same + * sizes (number of points & number of contours) when this function is + * called. + * + * @input: + * source :: + * A handle to the source outline. + * + * @output: + * target :: + * A handle to the target outline. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Transform + * + * @description: + * Apply a simple 2x2 matrix to all of an outline's points. Useful for + * applying rotations, slanting, flipping, etc. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * matrix :: + * A pointer to the transformation matrix. + * + * @note: + * You can use @FT_Outline_Translate if you need to translate the + * outline's points. + */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Embolden + * + * @description: + * Embolden an outline. The new outline will be at most 4~times + * `strength` pixels wider and higher. You may think of the left and + * bottom borders as unchanged. + * + * Negative `strength` values to reduce the outline thickness are + * possible also. + * + * @inout: + * outline :: + * A handle to the target outline. + * + * @input: + * strength :: + * How strong the glyph is emboldened. Expressed in 26.6 pixel format. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The used algorithm to increase or decrease the thickness of the glyph + * doesn't change the number of points; this means that certain + * situations like acute angles or intersections are sometimes handled + * incorrectly. + * + * If you need 'better' metrics values you should call + * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. + * + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. + * + * @example: + * ``` + * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + * + * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + * FT_Outline_Embolden( &face->glyph->outline, strength ); + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_EmboldenXY + * + * @description: + * Embolden an outline. The new outline will be `xstrength` pixels wider + * and `ystrength` pixels higher. Otherwise, it is similar to + * @FT_Outline_Embolden, which uses the same strength in both directions. + * + * @since: + * 2.4.10 + */ + FT_EXPORT( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Reverse + * + * @description: + * Reverse the drawing direction of an outline. This is used to ensure + * consistent fill conventions for mirrored glyphs. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @note: + * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the + * outline's `flags` field. + * + * It shouldn't be used by a normal client application, unless it knows + * what it is doing. + */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Bitmap + * + * @description: + * Render an outline within a bitmap. The outline's image is simply + * OR-ed to the target bitmap. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * abitmap :: + * A pointer to the target bitmap descriptor. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does **not create** the bitmap, it only renders an + * outline image within the one you pass to it! Consequently, the + * various fields in `abitmap` should be set accordingly. + * + * It will use the raster corresponding to the default glyph format. + * + * The value of the `num_grays` field in `abitmap` is ignored. If you + * select the gray-level rasterizer, and you want less than 256 gray + * levels, you have to use @FT_Outline_Render directly. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Render + * + * @description: + * Render an outline within a bitmap using the current scan-convert. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * params :: + * A pointer to an @FT_Raster_Params structure used to describe the + * rendering operation. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This advanced function uses @FT_Raster_Params as an argument, + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. You should know how to set up @FT_Raster_Params + * for this function to work. + * + * The field `params.source` will be set to `outline` before the scan + * converter is called, which means that the value you give to it is + * actually ignored. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * less gray levels, you have to provide your own span callback. See the + * @FT_RASTER_FLAG_DIRECT value of the `flags` field in the + * @FT_Raster_Params structure for more details. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must be + * filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise + * contours must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its fill + * orientation (see @FT_Orientation). This is done by integrating the + * total area covered by the outline. The positive integral corresponds + * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is + * returned. The negative integral corresponds to the counter-clockwise + * orientation and @FT_ORIENTATION_TRUETYPE is returned. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOUTLN_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/includes/freetype/ftparams.h b/includes/freetype/ftparams.h new file mode 100644 index 0000000..255c6bb --- /dev/null +++ b/includes/freetype/ftparams.h @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftparams.h + * + * FreeType API for possible FT_Parameter tags (specification only). + * + * Copyright (C) 2017-2020 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/includes/freetype/ftpfr.h b/includes/freetype/ftpfr.h new file mode 100644 index 0000000..58fbbb7 --- /dev/null +++ b/includes/freetype/ftpfr.h @@ -0,0 +1,180 @@ +/**************************************************************************** + * + * ftpfr.h + * + * FreeType API for accessing PFR-specific data (specification only). + * + * Copyright (C) 2002-2020 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/includes/freetype/ftrender.h b/includes/freetype/ftrender.h new file mode 100644 index 0000000..6845111 --- /dev/null +++ b/includes/freetype/ftrender.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * ftrender.h + * + * FreeType renderer modules public interface (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftsizes.h b/includes/freetype/ftsizes.h new file mode 100644 index 0000000..7dc9295 --- /dev/null +++ b/includes/freetype/ftsizes.h @@ -0,0 +1,160 @@ +/**************************************************************************** + * + * ftsizes.h + * + * FreeType size objects management (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftsnames.h b/includes/freetype/ftsnames.h new file mode 100644 index 0000000..2982760 --- /dev/null +++ b/includes/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-2020 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/includes/freetype/ftstroke.h b/includes/freetype/ftstroke.h new file mode 100644 index 0000000..141af7d --- /dev/null +++ b/includes/freetype/ftstroke.h @@ -0,0 +1,774 @@ +/**************************************************************************** + * + * ftstroke.h + * + * FreeType path stroker (specification). + * + * Copyright (C) 2002-2020 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. A bevel join + * (see above) is used if the segments meet at too sharp an angle and + * the outer edges meet beyond a distance corresponding to the meter + * limit. 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 + * perpendicularly to the bisector, at a distance corresponding to + * the miter limit. 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 maximum reciprocal sine of half-angle at the miter join, + * expressed as 16.16 fixed point value. + * + * @note: + * The `radius` is expressed in the same units as the outline + * coordinates. + * + * The `miter_limit` multiplied by the `radius` gives the maximum size + * of a miter spike, at which it is clipped for + * @FT_STROKER_LINEJOIN_MITER_VARIABLE or replaced with a bevel join for + * @FT_STROKER_LINEJOIN_MITER_FIXED. + * + * 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/includes/freetype/ftsynth.h b/includes/freetype/ftsynth.h new file mode 100644 index 0000000..3882e69 --- /dev/null +++ b/includes/freetype/ftsynth.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * ftsynth.h + * + * FreeType synthesizing code for emboldening and slanting + * (specification). + * + * Copyright (C) 2000-2020 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/includes/freetype/ftsystem.h b/includes/freetype/ftsystem.h new file mode 100644 index 0000000..f7fecb5 --- /dev/null +++ b/includes/freetype/ftsystem.h @@ -0,0 +1,353 @@ +/**************************************************************************** + * + * ftsystem.h + * + * FreeType low-level system interface definition (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/fttrigon.h b/includes/freetype/fttrigon.h new file mode 100644 index 0000000..968df1f --- /dev/null +++ b/includes/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * fttrigon.h + * + * FreeType trigonometric functions (specification). + * + * Copyright (C) 2001-2020 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/includes/freetype/fttypes.h b/includes/freetype/fttypes.h new file mode 100644 index 0000000..cb785d9 --- /dev/null +++ b/includes/freetype/fttypes.h @@ -0,0 +1,615 @@ +/**************************************************************************** + * + * fttypes.h + * + * FreeType simple types definitions (specification only). + * + * Copyright (C) 1996-2020 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/includes/freetype/ftwinfnt.h b/includes/freetype/ftwinfnt.h new file mode 100644 index 0000000..bacb8aa --- /dev/null +++ b/includes/freetype/ftwinfnt.h @@ -0,0 +1,277 @@ +/**************************************************************************** + * + * ftwinfnt.h + * + * FreeType API for accessing Windows fnt-specific data. + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/autohint.h b/includes/freetype/internal/autohint.h new file mode 100644 index 0000000..438f9c1 --- /dev/null +++ b/includes/freetype/internal/autohint.h @@ -0,0 +1,232 @@ +/**************************************************************************** + * + * autohint.h + * + * High-level 'autohint' module-specific interface (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/internal/cffotypes.h b/includes/freetype/internal/cffotypes.h new file mode 100644 index 0000000..207eeda --- /dev/null +++ b/includes/freetype/internal/cffotypes.h @@ -0,0 +1,108 @@ +/**************************************************************************** + * + * cffotypes.h + * + * Basic OpenType/CFF object type definitions (specification). + * + * Copyright (C) 2017-2020 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/includes/freetype/internal/cfftypes.h b/includes/freetype/internal/cfftypes.h new file mode 100644 index 0000000..40b0fc7 --- /dev/null +++ b/includes/freetype/internal/cfftypes.h @@ -0,0 +1,417 @@ +/**************************************************************************** + * + * cfftypes.h + * + * Basic OpenType/CFF type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2020 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/includes/freetype/internal/ftcalc.h b/includes/freetype/internal/ftcalc.h new file mode 100644 index 0000000..3054a4c --- /dev/null +++ b/includes/freetype/internal/ftcalc.h @@ -0,0 +1,510 @@ +/**************************************************************************** + * + * ftcalc.h + * + * Arithmetic computations (specification). + * + * Copyright (C) 1996-2020 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 +#pragma intrinsic( _BitScanReverse ) + + static __inline FT_Int32 + FT_MSB_i386( FT_UInt32 x ) + { + unsigned long where; + + + _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/includes/freetype/internal/ftdebug.h b/includes/freetype/internal/ftdebug.h new file mode 100644 index 0000000..00d258e --- /dev/null +++ b/includes/freetype/internal/ftdebug.h @@ -0,0 +1,283 @@ +/**************************************************************************** + * + * ftdebug.h + * + * Debugging and logging component (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/internal/ftdrv.h b/includes/freetype/internal/ftdrv.h new file mode 100644 index 0000000..1dd9206 --- /dev/null +++ b/includes/freetype/internal/ftdrv.h @@ -0,0 +1,288 @@ +/**************************************************************************** + * + * ftdrv.h + * + * FreeType internal font driver interface (specification). + * + * Copyright (C) 1996-2020 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/includes/freetype/internal/ftgloadr.h b/includes/freetype/internal/ftgloadr.h new file mode 100644 index 0000000..6f3793b --- /dev/null +++ b/includes/freetype/internal/ftgloadr.h @@ -0,0 +1,149 @@ +/**************************************************************************** + * + * ftgloadr.h + * + * The FreeType glyph loader (specification). + * + * Copyright (C) 2002-2020 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/includes/freetype/internal/fthash.h b/includes/freetype/internal/fthash.h new file mode 100644 index 0000000..2491880 --- /dev/null +++ b/includes/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/includes/freetype/internal/ftmemory.h b/includes/freetype/internal/ftmemory.h new file mode 100644 index 0000000..e0758c1 --- /dev/null +++ b/includes/freetype/internal/ftmemory.h @@ -0,0 +1,400 @@ +/**************************************************************************** + * + * ftmemory.h + * + * The FreeType memory management macros (specification). + * + * Copyright (C) 1996-2020 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 ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* The calculation `NULL + n' is undefined in C. Even if the resulting */ + /* pointer doesn't get dereferenced, this causes warnings with */ + /* sanitizers. */ + /* */ + /* We thus provide a macro that should be used if `base' can be NULL. */ +#define FT_OFFSET( base, count ) ( (base) ? (base) + (count) : NULL ) + + + /* + * 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_DEBUG_INNER( 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/includes/freetype/internal/ftobjs.h b/includes/freetype/internal/ftobjs.h new file mode 100644 index 0000000..140eebc --- /dev/null +++ b/includes/freetype/internal/ftobjs.h @@ -0,0 +1,1234 @@ +/**************************************************************************** + * + * ftobjs.h + * + * The FreeType private base classes (specification). + * + * Copyright (C) 1996-2020 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_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_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/includes/freetype/internal/ftpsprop.h b/includes/freetype/internal/ftpsprop.h new file mode 100644 index 0000000..72907c4 --- /dev/null +++ b/includes/freetype/internal/ftpsprop.h @@ -0,0 +1,48 @@ +/**************************************************************************** + * + * ftpsprop.h + * + * Get and set properties of PostScript drivers (specification). + * + * Copyright (C) 2017-2020 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/includes/freetype/internal/ftrfork.h b/includes/freetype/internal/ftrfork.h new file mode 100644 index 0000000..9a275a5 --- /dev/null +++ b/includes/freetype/internal/ftrfork.h @@ -0,0 +1,246 @@ +/**************************************************************************** + * + * ftrfork.h + * + * Embedded resource forks accessor (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/internal/ftserv.h b/includes/freetype/internal/ftserv.h new file mode 100644 index 0000000..bcaf472 --- /dev/null +++ b/includes/freetype/internal/ftserv.h @@ -0,0 +1,521 @@ +/**************************************************************************** + * + * ftserv.h + * + * The FreeType services (specification only). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/ftstream.h b/includes/freetype/internal/ftstream.h new file mode 100644 index 0000000..f3b3ef0 --- /dev/null +++ b/includes/freetype/internal/ftstream.h @@ -0,0 +1,572 @@ +/**************************************************************************** + * + * ftstream.h + * + * Stream handling (specification). + * + * Copyright (C) 1996-2020 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) ) + + + /* + * function acts on increases does range for emits + * pointer checking frames error + * ------------------------------------------------------------------- + * FT_PEEK_XXX buffer pointer no no no no + * FT_NEXT_XXX buffer pointer yes no no no + * FT_GET_XXX stream->cursor yes yes yes no + * FT_READ_XXX stream->pos yes yes no yes + */ + + + /* + * `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/includes/freetype/internal/fttrace.h b/includes/freetype/internal/fttrace.h new file mode 100644 index 0000000..58bd774 --- /dev/null +++ b/includes/freetype/internal/fttrace.h @@ -0,0 +1,158 @@ +/**************************************************************************** + * + * fttrace.h + * + * Tracing handling (specification only). + * + * Copyright (C) 2002-2020 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( sfwoff ) /* WOFF format handler (sfwoff.c) */ +FT_TRACE_DEF( sfwoff2 ) /* WOFF2 format handler (sfwoff2.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/includes/freetype/internal/ftvalid.h b/includes/freetype/internal/ftvalid.h new file mode 100644 index 0000000..62aea4d --- /dev/null +++ b/includes/freetype/internal/ftvalid.h @@ -0,0 +1,159 @@ +/**************************************************************************** + * + * ftvalid.h + * + * FreeType validation support (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/internal/internal.h b/includes/freetype/internal/internal.h new file mode 100644 index 0000000..766bf64 --- /dev/null +++ b/includes/freetype/internal/internal.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * internal.h + * + * Internal header files (specification only). + * + * Copyright (C) 1996-2020 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_WOFF_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/includes/freetype/internal/psaux.h b/includes/freetype/internal/psaux.h new file mode 100644 index 0000000..8248a0e --- /dev/null +++ b/includes/freetype/internal/psaux.h @@ -0,0 +1,1439 @@ +/**************************************************************************** + * + * psaux.h + * + * Auxiliary functions and data structures related to PostScript fonts + * (specification). + * + * Copyright (C) 1996-2020 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, + const 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/includes/freetype/internal/pshints.h b/includes/freetype/internal/pshints.h new file mode 100644 index 0000000..cf0c652 --- /dev/null +++ b/includes/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-2020 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/includes/freetype/internal/services/svbdf.h b/includes/freetype/internal/services/svbdf.h new file mode 100644 index 0000000..0ec9c7c --- /dev/null +++ b/includes/freetype/internal/services/svbdf.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svbdf.h + * + * The FreeType BDF services (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svcfftl.h b/includes/freetype/internal/services/svcfftl.h new file mode 100644 index 0000000..c2f42c1 --- /dev/null +++ b/includes/freetype/internal/services/svcfftl.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svcfftl.h + * + * The FreeType CFF tables loader service (specification). + * + * Copyright (C) 2017-2020 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/includes/freetype/internal/services/svcid.h b/includes/freetype/internal/services/svcid.h new file mode 100644 index 0000000..b8efd81 --- /dev/null +++ b/includes/freetype/internal/services/svcid.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * + * svcid.h + * + * The FreeType CID font services (specification). + * + * Copyright (C) 2007-2020 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/includes/freetype/internal/services/svfntfmt.h b/includes/freetype/internal/services/svfntfmt.h new file mode 100644 index 0000000..5ec84c9 --- /dev/null +++ b/includes/freetype/internal/services/svfntfmt.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svfntfmt.h + * + * The FreeType font format service (specification only). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svgldict.h b/includes/freetype/internal/services/svgldict.h new file mode 100644 index 0000000..5a63883 --- /dev/null +++ b/includes/freetype/internal/services/svgldict.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgldict.h + * + * The FreeType glyph dictionary services (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svgxval.h b/includes/freetype/internal/services/svgxval.h new file mode 100644 index 0000000..d0cb10a --- /dev/null +++ b/includes/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/internal/services/svkern.h b/includes/freetype/internal/services/svkern.h new file mode 100644 index 0000000..891c61a --- /dev/null +++ b/includes/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * svkern.h + * + * The FreeType Kerning service (specification). + * + * Copyright (C) 2006-2020 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/includes/freetype/internal/services/svmetric.h b/includes/freetype/internal/services/svmetric.h new file mode 100644 index 0000000..06faa4b --- /dev/null +++ b/includes/freetype/internal/services/svmetric.h @@ -0,0 +1,125 @@ +/**************************************************************************** + * + * svmetric.h + * + * The FreeType services for metrics variations (specification). + * + * Copyright (C) 2016-2020 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/includes/freetype/internal/services/svmm.h b/includes/freetype/internal/services/svmm.h new file mode 100644 index 0000000..fa044c9 --- /dev/null +++ b/includes/freetype/internal/services/svmm.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * svmm.h + * + * The FreeType Multiple Masters and GX var services (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svotval.h b/includes/freetype/internal/services/svotval.h new file mode 100644 index 0000000..34ad7ca --- /dev/null +++ b/includes/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svotval.h + * + * The FreeType OpenType validation service (specification). + * + * Copyright (C) 2004-2020 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/includes/freetype/internal/services/svpfr.h b/includes/freetype/internal/services/svpfr.h new file mode 100644 index 0000000..2dd075c --- /dev/null +++ b/includes/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svpfr.h + * + * Internal PFR service functions (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svpostnm.h b/includes/freetype/internal/services/svpostnm.h new file mode 100644 index 0000000..86ab611 --- /dev/null +++ b/includes/freetype/internal/services/svpostnm.h @@ -0,0 +1,65 @@ +/**************************************************************************** + * + * svpostnm.h + * + * The FreeType PostScript name services (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svprop.h b/includes/freetype/internal/services/svprop.h new file mode 100644 index 0000000..8f75543 --- /dev/null +++ b/includes/freetype/internal/services/svprop.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svprop.h + * + * The FreeType property service (specification). + * + * Copyright (C) 2012-2020 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/includes/freetype/internal/services/svpscmap.h b/includes/freetype/internal/services/svpscmap.h new file mode 100644 index 0000000..6c2ffe2 --- /dev/null +++ b/includes/freetype/internal/services/svpscmap.h @@ -0,0 +1,145 @@ +/**************************************************************************** + * + * svpscmap.h + * + * The FreeType PostScript charmap service (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svpsinfo.h b/includes/freetype/internal/services/svpsinfo.h new file mode 100644 index 0000000..ade24dc --- /dev/null +++ b/includes/freetype/internal/services/svpsinfo.h @@ -0,0 +1,86 @@ +/**************************************************************************** + * + * svpsinfo.h + * + * The FreeType PostScript info service (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svsfnt.h b/includes/freetype/internal/services/svsfnt.h new file mode 100644 index 0000000..f3e81ca --- /dev/null +++ b/includes/freetype/internal/services/svsfnt.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * svsfnt.h + * + * The FreeType SFNT table loading service (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svttcmap.h b/includes/freetype/internal/services/svttcmap.h new file mode 100644 index 0000000..fbb3115 --- /dev/null +++ b/includes/freetype/internal/services/svttcmap.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svttcmap.h + * + * The FreeType TrueType/sfnt cmap extra information service. + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/services/svtteng.h b/includes/freetype/internal/services/svtteng.h new file mode 100644 index 0000000..6218d9e --- /dev/null +++ b/includes/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * + * svtteng.h + * + * The FreeType TrueType engine query service (specification). + * + * Copyright (C) 2006-2020 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/includes/freetype/internal/services/svttglyf.h b/includes/freetype/internal/services/svttglyf.h new file mode 100644 index 0000000..d9894e3 --- /dev/null +++ b/includes/freetype/internal/services/svttglyf.h @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * svttglyf.h + * + * The FreeType TrueType glyph service. + * + * Copyright (C) 2007-2020 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/includes/freetype/internal/services/svwinfnt.h b/includes/freetype/internal/services/svwinfnt.h new file mode 100644 index 0000000..377f73d --- /dev/null +++ b/includes/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * svwinfnt.h + * + * The FreeType Windows FNT/FONT service (specification). + * + * Copyright (C) 2003-2020 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/includes/freetype/internal/sfnt.h b/includes/freetype/internal/sfnt.h new file mode 100644 index 0000000..b9c81a8 --- /dev/null +++ b/includes/freetype/internal/sfnt.h @@ -0,0 +1,876 @@ +/**************************************************************************** + * + * sfnt.h + * + * High-level 'sfnt' driver interface (specification). + * + * Copyright (C) 1996-2020 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 +#include FT_INTERNAL_WOFF_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/includes/freetype/internal/t1types.h b/includes/freetype/internal/t1types.h new file mode 100644 index 0000000..799c293 --- /dev/null +++ b/includes/freetype/internal/t1types.h @@ -0,0 +1,260 @@ +/**************************************************************************** + * + * t1types.h + * + * Basic Type1/Type2 type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2020 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; + const 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/includes/freetype/internal/tttypes.h b/includes/freetype/internal/tttypes.h new file mode 100644 index 0000000..1bddf10 --- /dev/null +++ b/includes/freetype/internal/tttypes.h @@ -0,0 +1,1781 @@ +/**************************************************************************** + * + * tttypes.h + * + * Basic SFNT/TrueType type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2020 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: + * 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 (in 26.6 format). Comes from the 'cvt~' + * table. Ignored for Type 2 fonts. + * + * If varied by the `CVAR' table, non-integer values are possible. + * + * 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_Int32* 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/includes/freetype/internal/wofftypes.h b/includes/freetype/internal/wofftypes.h new file mode 100644 index 0000000..26159b9 --- /dev/null +++ b/includes/freetype/internal/wofftypes.h @@ -0,0 +1,313 @@ +/**************************************************************************** + * + * wofftypes.h + * + * Basic WOFF/WOFF2 type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2020 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 WOFFTYPES_H_ +#define WOFFTYPES_H_ + + +#include +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @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: + * WOFF2_TtcFontRec + * + * @description: + * Metadata for a TTC font entry in WOFF2. + * + * @fields: + * flavor :: + * TTC font flavor. + * + * num_tables :: + * Number of tables in TTC, indicating number of elements in + * `table_indices`. + * + * table_indices :: + * Array of table indices for each TTC font. + */ + typedef struct WOFF2_TtcFontRec_ + { + FT_ULong flavor; + FT_UShort num_tables; + FT_UShort* table_indices; + + } WOFF2_TtcFontRec, *WOFF2_TtcFont; + + + /************************************************************************** + * + * @struct: + * WOFF2_HeaderRec + * + * @description: + * WOFF2 file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#woff20Header + * + * @note: + * We don't care about the fields `reserved`, `majorVersion` and + * `minorVersion`, so they are not included. The `totalSfntSize` field + * does not necessarily represent the actual size of the uncompressed + * SFNT font stream, so that is used as a reference value instead. + */ + typedef struct WOFF2_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_ULong totalSfntSize; + FT_ULong totalCompressedSize; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + FT_ULong uncompressed_size; /* uncompressed brotli stream size */ + FT_ULong compressed_offset; /* compressed stream offset */ + FT_ULong header_version; /* version of original TTC Header */ + FT_UShort num_fonts; /* number of fonts in TTC */ + FT_ULong actual_sfnt_size; /* actual size of sfnt stream */ + + WOFF2_TtcFont ttc_fonts; /* metadata for fonts in a TTC */ + + } WOFF2_HeaderRec, *WOFF2_Header; + + + /************************************************************************** + * + * @struct: + * WOFF2_TableRec + * + * @description: + * This structure describes a given table of a WOFF2 font. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#table_dir_format + */ + typedef struct WOFF2_TableRec_ + { + FT_Byte FlagByte; /* table type and flags */ + FT_ULong Tag; /* table file offset */ + FT_ULong dst_length; /* uncompressed table length */ + FT_ULong TransformLength; /* transformed length */ + + FT_ULong flags; /* calculated flags */ + FT_ULong src_offset; /* compressed table offset */ + FT_ULong src_length; /* compressed table length */ + FT_ULong dst_offset; /* uncompressed table offset */ + + } WOFF2_TableRec, *WOFF2_Table; + + + /************************************************************************** + * + * @struct: + * WOFF2_InfoRec + * + * @description: + * Metadata for WOFF2 font that may be required for reconstruction of + * sfnt tables. + * + * @fields: + * header_checksum :: + * Checksum of SFNT offset table. + * + * num_glyphs :: + * Number of glyphs in the font. + * + * num_hmetrics :: + * `numberOfHMetrics` field in the 'hhea' table. + * + * x_mins :: + * `xMin` values of glyph bounding box. + * + * glyf_table :: + * A pointer to the `glyf' table record. + * + * loca_table :: + * A pointer to the `loca' table record. + * + * head_table :: + * A pointer to the `head' table record. + */ + typedef struct WOFF2_InfoRec_ + { + FT_ULong header_checksum; + FT_UShort num_glyphs; + FT_UShort num_hmetrics; + FT_Short* x_mins; + + WOFF2_Table glyf_table; + WOFF2_Table loca_table; + WOFF2_Table head_table; + + } WOFF2_InfoRec, *WOFF2_Info; + + + /************************************************************************** + * + * @struct: + * WOFF2_SubstreamRec + * + * @description: + * This structure stores information about a substream in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * start :: + * Beginning of the substream relative to uncompressed table stream. + * + * offset :: + * Offset of the substream relative to uncompressed table stream. + * + * size :: + * Size of the substream. + */ + typedef struct WOFF2_SubstreamRec_ + { + FT_ULong start; + FT_ULong offset; + FT_ULong size; + + } WOFF2_SubstreamRec, *WOFF2_Substream; + + + /************************************************************************** + * + * @struct: + * WOFF2_PointRec + * + * @description: + * This structure stores information about a point in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * x :: + * x-coordinate of point. + * + * y :: + * y-coordinate of point. + * + * on_curve :: + * Set if point is on-curve. + */ + typedef struct WOFF2_PointRec_ + { + FT_Int x; + FT_Int y; + FT_Bool on_curve; + + } WOFF2_PointRec, *WOFF2_Point; + + +FT_END_HEADER + +#endif /* WOFFTYPES_H_ */ + + +/* END */ diff --git a/includes/freetype/t1tables.h b/includes/freetype/t1tables.h new file mode 100644 index 0000000..522d6ae --- /dev/null +++ b/includes/freetype/t1tables.h @@ -0,0 +1,774 @@ +/**************************************************************************** + * + * t1tables.h + * + * Basic Type 1/Type 2 tables definitions and interface (specification + * only). + * + * Copyright (C) 1996-2020 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/includes/freetype/ttnameid.h b/includes/freetype/ttnameid.h new file mode 100644 index 0000000..9a00913 --- /dev/null +++ b/includes/freetype/ttnameid.h @@ -0,0 +1,1236 @@ +/**************************************************************************** + * + * ttnameid.h + * + * TrueType name ID definitions (specification only). + * + * Copyright (C) 1996-2020 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/includes/freetype/tttables.h b/includes/freetype/tttables.h new file mode 100644 index 0000000..8108db7 --- /dev/null +++ b/includes/freetype/tttables.h @@ -0,0 +1,856 @@ +/**************************************************************************** + * + * tttables.h + * + * Basic SFNT/TrueType tables definitions and interface + * (specification only). + * + * Copyright (C) 1996-2020 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/includes/freetype/tttags.h b/includes/freetype/tttags.h new file mode 100644 index 0000000..f2b2a45 --- /dev/null +++ b/includes/freetype/tttags.h @@ -0,0 +1,124 @@ +/**************************************************************************** + * + * tttags.h + * + * Tags for TrueType and OpenType tables (specification only). + * + * Copyright (C) 1996-2020 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' ) +#define TTAG_wOF2 FT_MAKE_TAG( 'w', 'O', 'F', '2' ) + +/* 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/includes/ft2build.h b/includes/ft2build.h new file mode 100644 index 0000000..195e918 --- /dev/null +++ b/includes/ft2build.h @@ -0,0 +1,44 @@ +/**************************************************************************** + * + * ft2build.h + * + * FreeType 2 build and setup macros. + * + * Copyright (C) 1996-2020 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/lib/freetype.lib b/lib/freetype.lib new file mode 100644 index 0000000000000000000000000000000000000000..4a993fca9627eb2c5f11e1ec9282f85cfd6cab94 GIT binary patch literal 4038932 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

^12jT@r~Dx?_rJxT`y2d}?UYY>vG=4|7xRwg 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

  • 7lrJ7ljJL%M&{5Y~Z~v;ZWf#Gmv-%m$lR|AF`7 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ฯH{%3%`vJsHOY4#AO= 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%0D9;Q#wkPll$}{x~oFOrH78#u9)F$I+`o@W} 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

    KRz%Q8lMF{q(X>?bP0xQ_-_fE@3P@ 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 z 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