From 2456387643e8f8a21502c0348b8b32d4f701d15b Mon Sep 17 00:00:00 2001 From: yangchao <1162485779@qq.com> Date: Thu, 31 Mar 2022 19:15:57 +0800 Subject: [PATCH] add linux freetype files --- .../freetype2/freetype/config/ftconfig.h | 603 ++ .../freetype2/freetype/config/ftheader.h | 814 +++ .../freetype2/freetype/config/ftmodule.h | 32 + .../freetype2/freetype/config/ftoption.h | 982 ++++ .../freetype2/freetype/config/ftstdlib.h | 175 + linux/include/freetype2/freetype/freetype.h | 4880 +++++++++++++++++ linux/include/freetype2/freetype/ftadvanc.h | 188 + linux/include/freetype2/freetype/ftbbox.h | 102 + linux/include/freetype2/freetype/ftbdf.h | 213 + linux/include/freetype2/freetype/ftbitmap.h | 330 ++ linux/include/freetype2/freetype/ftbzip2.h | 102 + linux/include/freetype2/freetype/ftcache.h | 1088 ++++ linux/include/freetype2/freetype/ftchapters.h | 145 + linux/include/freetype2/freetype/ftcid.h | 168 + linux/include/freetype2/freetype/ftcolor.h | 311 ++ linux/include/freetype2/freetype/ftdriver.h | 1232 +++++ linux/include/freetype2/freetype/fterrdef.h | 279 + linux/include/freetype2/freetype/fterrors.h | 285 + linux/include/freetype2/freetype/ftfntfmt.h | 94 + linux/include/freetype2/freetype/ftgasp.h | 144 + linux/include/freetype2/freetype/ftglyph.h | 665 +++ linux/include/freetype2/freetype/ftgxval.h | 355 ++ linux/include/freetype2/freetype/ftgzip.h | 151 + linux/include/freetype2/freetype/ftimage.h | 1240 +++++ linux/include/freetype2/freetype/ftincrem.h | 344 ++ linux/include/freetype2/freetype/ftlcdfil.h | 328 ++ linux/include/freetype2/freetype/ftlist.h | 297 + linux/include/freetype2/freetype/ftlzw.h | 100 + linux/include/freetype2/freetype/ftmac.h | 290 + linux/include/freetype2/freetype/ftmm.h | 753 +++ linux/include/freetype2/freetype/ftmodapi.h | 785 +++ linux/include/freetype2/freetype/ftmoderr.h | 203 + linux/include/freetype2/freetype/ftotval.h | 207 + linux/include/freetype2/freetype/ftoutln.h | 593 ++ linux/include/freetype2/freetype/ftparams.h | 204 + linux/include/freetype2/freetype/ftpfr.h | 180 + linux/include/freetype2/freetype/ftrender.h | 245 + linux/include/freetype2/freetype/ftsizes.h | 160 + linux/include/freetype2/freetype/ftsnames.h | 273 + linux/include/freetype2/freetype/ftstroke.h | 772 +++ linux/include/freetype2/freetype/ftsynth.h | 84 + linux/include/freetype2/freetype/ftsystem.h | 353 ++ linux/include/freetype2/freetype/fttrigon.h | 350 ++ linux/include/freetype2/freetype/fttypes.h | 615 +++ linux/include/freetype2/freetype/ftwinfnt.h | 277 + linux/include/freetype2/freetype/t1tables.h | 774 +++ linux/include/freetype2/freetype/ttnameid.h | 1236 +++++ linux/include/freetype2/freetype/tttables.h | 856 +++ linux/include/freetype2/freetype/tttags.h | 123 + linux/include/freetype2/ft2build.h | 44 + linux/lib/freetype/libfreetype.a | Bin 0 -> 1310318 bytes 51 files changed, 25024 insertions(+) create mode 100644 linux/include/freetype2/freetype/config/ftconfig.h create mode 100644 linux/include/freetype2/freetype/config/ftheader.h create mode 100644 linux/include/freetype2/freetype/config/ftmodule.h create mode 100644 linux/include/freetype2/freetype/config/ftoption.h create mode 100644 linux/include/freetype2/freetype/config/ftstdlib.h create mode 100644 linux/include/freetype2/freetype/freetype.h create mode 100644 linux/include/freetype2/freetype/ftadvanc.h create mode 100644 linux/include/freetype2/freetype/ftbbox.h create mode 100644 linux/include/freetype2/freetype/ftbdf.h create mode 100644 linux/include/freetype2/freetype/ftbitmap.h create mode 100644 linux/include/freetype2/freetype/ftbzip2.h create mode 100644 linux/include/freetype2/freetype/ftcache.h create mode 100644 linux/include/freetype2/freetype/ftchapters.h create mode 100644 linux/include/freetype2/freetype/ftcid.h create mode 100644 linux/include/freetype2/freetype/ftcolor.h create mode 100644 linux/include/freetype2/freetype/ftdriver.h create mode 100644 linux/include/freetype2/freetype/fterrdef.h create mode 100644 linux/include/freetype2/freetype/fterrors.h create mode 100644 linux/include/freetype2/freetype/ftfntfmt.h create mode 100644 linux/include/freetype2/freetype/ftgasp.h create mode 100644 linux/include/freetype2/freetype/ftglyph.h create mode 100644 linux/include/freetype2/freetype/ftgxval.h create mode 100644 linux/include/freetype2/freetype/ftgzip.h create mode 100644 linux/include/freetype2/freetype/ftimage.h create mode 100644 linux/include/freetype2/freetype/ftincrem.h create mode 100644 linux/include/freetype2/freetype/ftlcdfil.h create mode 100644 linux/include/freetype2/freetype/ftlist.h create mode 100644 linux/include/freetype2/freetype/ftlzw.h create mode 100644 linux/include/freetype2/freetype/ftmac.h create mode 100644 linux/include/freetype2/freetype/ftmm.h create mode 100644 linux/include/freetype2/freetype/ftmodapi.h create mode 100644 linux/include/freetype2/freetype/ftmoderr.h create mode 100644 linux/include/freetype2/freetype/ftotval.h create mode 100644 linux/include/freetype2/freetype/ftoutln.h create mode 100644 linux/include/freetype2/freetype/ftparams.h create mode 100644 linux/include/freetype2/freetype/ftpfr.h create mode 100644 linux/include/freetype2/freetype/ftrender.h create mode 100644 linux/include/freetype2/freetype/ftsizes.h create mode 100644 linux/include/freetype2/freetype/ftsnames.h create mode 100644 linux/include/freetype2/freetype/ftstroke.h create mode 100644 linux/include/freetype2/freetype/ftsynth.h create mode 100644 linux/include/freetype2/freetype/ftsystem.h create mode 100644 linux/include/freetype2/freetype/fttrigon.h create mode 100644 linux/include/freetype2/freetype/fttypes.h create mode 100644 linux/include/freetype2/freetype/ftwinfnt.h create mode 100644 linux/include/freetype2/freetype/t1tables.h create mode 100644 linux/include/freetype2/freetype/ttnameid.h create mode 100644 linux/include/freetype2/freetype/tttables.h create mode 100644 linux/include/freetype2/freetype/tttags.h create mode 100644 linux/include/freetype2/ft2build.h create mode 100644 linux/lib/freetype/libfreetype.a diff --git a/linux/include/freetype2/freetype/config/ftconfig.h b/linux/include/freetype2/freetype/config/ftconfig.h new file mode 100644 index 00000000..09a549e6 --- /dev/null +++ b/linux/include/freetype2/freetype/config/ftconfig.h @@ -0,0 +1,603 @@ +/**************************************************************************** + * + * ftconfig.in + * + * UNIX-specific configuration file (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + */ + +#ifndef FTCONFIG_H_ +#define FTCONFIG_H_ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * PLATFORM-SPECIFIC CONFIGURATION MACROS + * + * These macros can be toggled to suit a specific system. The current ones + * are defaults used to compile FreeType in an ANSI C environment (16bit + * compilers are also supported). Copy this file to your own + * `builds/` directory, and edit it to port the engine. + * + */ + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_STDINT_H 1 + + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + +#undef FT_USE_AUTOCONF_SIZEOF_TYPES +#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES + +#undef SIZEOF_INT +#undef SIZEOF_LONG +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* Following cpp computation of the bit length of `int` and `long` */ + /* is copied from default `include/freetype/config/ftconfig.h`. */ + /* If any improvement is required for this file, it should be */ + /* applied to the original header file for the builders that do */ + /* not use configure script. */ + + /* The size of an `int` type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* `FT_UNUSED` indicates that a given parameter is not used -- */ + /* this is only used to get rid of unpleasant compiler warnings. */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /************************************************************************** + * + * AUTOMATIC CONFIGURATION MACROS + * + * These macros are computed from the ones defined above. Don't touch + * their definition, unless you know precisely what you are doing. No + * porter should need to mess with them. + * + */ + + + /************************************************************************** + * + * Mac support + * + * This is the only necessary change, so it is defined here instead + * providing a new configuration file. + */ +#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ +#include +#ifdef ECANCELED /* defined since 10.2 */ +#include "AvailabilityMacros.h" +#endif +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#undef FT_MACINTOSH +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ + typedef signed short FT_Int16; + + + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on the + * configuration. + */ + typedef signed XXX FT_Int32; + + + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on the + * configuration. + */ + typedef unsigned XXX FT_UInt32; + + + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef signed XXX FT_Int64; + + + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef unsigned XXX FT_UInt64; + + /* */ + +#endif + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32~bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit `int` type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* `FT_LONG64` must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long +#define FT_UINT64 unsigned long + + /* we handle the LLP64 scheme separately for GCC and clang, */ + /* suppressing the `long long` warning */ +#elif ( FT_SIZEOF_LONG == 4 ) && \ + defined( HAVE_LONG_LONG_INT ) && \ + defined( __GNUC__ ) +#pragma GCC diagnostic ignored "-Wlong-long" +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + + /************************************************************************** + * + * A 64-bit data type may create compilation problems if you compile in + * strict ANSI mode. To avoid them, we disable other 64-bit data types if + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. + */ +#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ + + /* this compiler provides the `__int64` type */ +#define FT_LONG64 +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long` type */ +#define FT_LONG64 +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#endif /* __STDC_VERSION__ >= 199901L */ + +#endif /* FT_SIZEOF_LONG == 8 */ + +#ifdef FT_LONG64 + typedef FT_INT64 FT_Int64; + typedef FT_UINT64 FT_UInt64; +#endif + + +#ifdef _WIN64 + /* only 64bit Windows uses the LLP64 data model, i.e., */ + /* 32bit integers, 64bit pointers */ +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x) +#else +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x) +#endif + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + + /* `typeof` condition taken from gnulib's `intprops.h` header file */ +#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ + ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ + defined( __IBM__TYPEOF__ ) ) || \ + ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) +#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) +#else +#define FT_TYPEOF( type ) /* empty */ +#endif + + + /* Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, */ + /* respectively, a function that gets used only within the scope of a */ + /* module. Normally, both the header and source code files for such a */ + /* function are within a single module directory. */ + /* */ + /* Intra-module arrays should be tagged with `FT_LOCAL_ARRAY` and */ + /* `FT_LOCAL_ARRAY_DEF`. */ + /* */ +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + +#define FT_LOCAL_ARRAY( x ) extern const x +#define FT_LOCAL_ARRAY_DEF( x ) const x + + + /* Use `FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, */ + /* functions that are used in more than a single module. In the */ + /* current setup this implies that the declaration is in a header file */ + /* in the `include/freetype/internal` directory, and the function body */ + /* is in a file in `src/base`. */ + /* */ +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + + /* When compiling FreeType as a DLL or DSO with hidden visibility */ + /* some systems/compilers need a special attribute in front OR after */ + /* the return type of function declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ + /* */ + /* - `FT_EXPORT( return_type )` */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* ``` */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* ``` */ + /* */ + /* - `FT_EXPORT_DEF( return_type )` */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* ``` */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* ``` */ + /* */ + /* You can provide your own implementation of `FT_EXPORT` and */ + /* `FT_EXPORT_DEF` here if you want. */ + /* */ + /* To export a variable, use `FT_EXPORT_VAR`. */ + /* */ +#ifndef FT_EXPORT + +#ifdef FT2_BUILD_LIBRARY + +#if defined( _WIN32 ) && defined( DLL_EXPORT ) +#define FT_EXPORT( x ) __declspec( dllexport ) x +#elif defined( __GNUC__ ) && __GNUC__ >= 4 +#define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_EXPORT( x ) __global x +#elif defined( __cplusplus ) +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#else + +#if defined( _WIN32 ) && defined( DLL_IMPORT ) +#define FT_EXPORT( x ) __declspec( dllimport ) x +#elif defined( __cplusplus ) +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"` for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function, */ + /* located in the same source code file as the structure that uses */ + /* it. */ + /* */ + /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare */ + /* and define a callback function, respectively, in a similar way */ + /* as FT_BASE and FT_BASE_DEF work. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl` or `__fastcall` declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_BASE_CALLBACK +#ifdef __cplusplus +#define FT_BASE_CALLBACK( x ) extern "C" x +#define FT_BASE_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_BASE_CALLBACK( x ) extern x +#define FT_BASE_CALLBACK_DEF( x ) x +#endif +#endif /* FT_BASE_CALLBACK */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* FTCONFIG_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/config/ftheader.h b/linux/include/freetype2/freetype/config/ftheader.h new file mode 100644 index 00000000..696d6ba9 --- /dev/null +++ b/linux/include/freetype2/freetype/config/ftheader.h @@ -0,0 +1,814 @@ +/**************************************************************************** + * + * ftheader.h + * + * Build macros of the FreeType 2 library. + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTHEADER_H_ +#define FTHEADER_H_ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /************************************************************************** + * + * Aliases for the FreeType 2 public and configuration files. + * + */ + + /************************************************************************** + * + * @section: + * header_file_macros + * + * @title: + * Header File Macros + * + * @abstract: + * Macro definitions used to `#include` specific header files. + * + * @description: + * The following macros are defined to the name of specific FreeType~2 + * header files. They can be used directly in `#include` statements as + * in: + * + * ``` + * #include FT_FREETYPE_H + * #include FT_MULTIPLE_MASTERS_H + * #include FT_GLYPH_H + * ``` + * + * There are several reasons why we are now using macros to name public + * header files. The first one is that such macros are not limited to + * the infamous 8.3~naming rule required by DOS (and + * `FT_MULTIPLE_MASTERS_H` is a lot more meaningful than `ftmm.h`). + * + * The second reason is that it allows for more flexibility in the way + * FreeType~2 is installed on a given system. + * + */ + + + /* configuration files */ + + /************************************************************************** + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H +#endif + + /* */ + + /* public headers */ + + /************************************************************************** + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H + + + /************************************************************************** + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in `#include` statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H + + + /************************************************************************** + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H + + + /************************************************************************** + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H + + + /************************************************************************** + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H + + + /************************************************************************** + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H + + + /************************************************************************** + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H + + + /************************************************************************** + * + * @macro: + * FT_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the driver modules. + * + */ +#define FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_AUTOHINTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the auto-hinting module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_AUTOHINTER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_CFF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the CFF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_CFF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the TrueType driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_TRUETYPE_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_PCF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the PCF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_PCF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of TrueType four-byte 'tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H + + + /************************************************************************** + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a face. + * + */ +#define FT_BDF_H + + + /************************************************************************** + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which access CID font information from a face. + * + */ +#define FT_CID_H + + + /************************************************************************** + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H + + + /************************************************************************** + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H + + + /************************************************************************** + * + * @macro: + * FT_BZIP2_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports bzip2-compressed files. + * + */ +#define FT_BZIP2_H + + + /************************************************************************** + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H + + + /************************************************************************** + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H + + + /************************************************************************** + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H + + + /************************************************************************** + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H + + + /************************************************************************** + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H + + + /************************************************************************** + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access fonts + * embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H + + + /************************************************************************** + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H + + + /************************************************************************** + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which accesses embedded 'name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H + + + /************************************************************************** + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables ('BASE', + * 'GDEF', 'GPOS', 'GSUB', 'JSTF'). + * + */ +#define FT_OPENTYPE_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables ('feat', + * 'mort', 'morx', 'bsln', 'just', 'kern', 'opbd', 'trak', 'prop'). + * + */ +#define FT_GX_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H + + + /************************************************************************** + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H + + + /************************************************************************** + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H + + + /************************************************************************** + * + * @macro: + * FT_FONT_FORMATS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions specific to font formats. + */ +#define FT_FONT_FORMATS_H + + /* deprecated */ +#define FT_XFREE86_H FT_FONT_FORMATS_H + + + /************************************************************************** + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H + + + /************************************************************************** + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H + + + /************************************************************************** + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs incremental glyph loading. + */ +#define FT_INCREMENTAL_H + + + /************************************************************************** + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H + + + /************************************************************************** + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H + + + /************************************************************************** + * + * @macro: + * FT_COLOR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which handles the OpenType 'CPAL' table. + */ +#define FT_COLOR_H + + + /* */ + + /* These header files don't need to be included by the user. */ +#define FT_ERROR_DEFINITIONS_H +#define FT_PARAMETER_TAGS_H + + /* Deprecated macros. */ +#define FT_UNPATENTED_HINTING_H +#define FT_TRUETYPE_UNPATENTED_H + + /* `FT_CACHE_H` is the only header file needed for the cache subsystem. */ +#define FT_CACHE_IMAGE_H FT_CACHE_H +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to `FT_CACHE_H` at the moment just in case, but we know */ + /* of no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MRU_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_CACHE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_GLYPH_H FT_CACHE_H +#define FT_CACHE_INTERNAL_IMAGE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_SBITS_H FT_CACHE_H + + + /* + * Include internal headers definitions from `` only when + * building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* FTHEADER_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/config/ftmodule.h b/linux/include/freetype2/freetype/config/ftmodule.h new file mode 100644 index 00000000..7c603e53 --- /dev/null +++ b/linux/include/freetype2/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/linux/include/freetype2/freetype/config/ftoption.h b/linux/include/freetype2/freetype/config/ftoption.h new file mode 100644 index 00000000..63b12234 --- /dev/null +++ b/linux/include/freetype2/freetype/config/ftoption.h @@ -0,0 +1,982 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + + +#include + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles and Jamfiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 \ + * autofitter:warping=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + + /************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * Note that this feature is covered by several Microsoft patents and + * should not be activated in any default build of the library. When this + * macro is not defined, FreeType offers alternative LCD rendering + * technology that produces excellent output without LCD filtering. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + + + /************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_SYSTEM_ZLIB + + + /************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + + + /************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + + + /************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_USE_PNG + + + /************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + /************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + + + /************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + + + /************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * _af_debug_disable_horz_hints + * _af_debug_disable_vert_hints + * _af_debug_disable_blue_hints + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * _af_debug_hints + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + + + /************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + + + /************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +/* #define FT_CONFIG_OPTION_ERROR_STRINGS */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support coloured + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. + * + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on the LEAN option. + * + * There are three possible values. + * + * Value 1: + * This value is associated with the 'Infinality' moniker, contributed by + * an individual nicknamed Infinality with the goal of making TrueType + * fonts render better than on Windows. A high amount of configurability + * and flexibility, down to rules for single glyphs in fonts, but also + * very slow. Its experimental and slow nature and the original + * developer losing interest meant that this option was never enabled in + * default builds. + * + * The corresponding interpreter version is v38. + * + * Value 2: + * The new default mode for the TrueType driver. The Infinality code + * base was stripped to the bare minimum and all configurability removed + * in the name of speed and simplicity. The configurability was mainly + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean + * black-and-white bitmaps. The new mode focuses on applying a minimal + * set of rules to all fonts indiscriminately so that modern and web + * fonts render well while legacy fonts render okay. + * + * The corresponding interpreter version is v40. + * + * Value 3: + * Compile both, making both v38 and v40 available (the latter is the + * default). + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + + + /************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES +#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + + + /************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + + + /************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** C F F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + + + /************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + + + /************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. + */ +#define AF_CONFIG_OPTION_INDIC + + + /************************************************************************** + * + * Compile 'autofit' module with warp hinting. The idea of the warping + * code is to slightly scale and shift a glyph within a single dimension so + * that as much of its segments are aligned (more or less) on the grid. To + * find out the optimal scaling and shifting value, various parameter + * combinations are tried and scored. + * + * You can switch warping on and off with the `warping` property of the + * auto-hinter (see file `ftdriver.h` for more information; by default it + * is switched off). + * + * This experimental option is not active if the rendering mode is + * `FT_RENDER_MODE_LIGHT`. + */ +#define AF_CONFIG_OPTION_USE_WARPER + + + /************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + + /* */ + + + /* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 +#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#endif + +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 +#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#endif +#endif +#endif + + + /* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 +#error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + + +#endif /* FTOPTION_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/config/ftstdlib.h b/linux/include/freetype2/freetype/config/ftstdlib.h new file mode 100644 index 00000000..438b6145 --- /dev/null +++ b/linux/include/freetype2/freetype/config/ftstdlib.h @@ -0,0 +1,175 @@ +/**************************************************************************** + * + * ftstdlib.h + * + * ANSI-specific library and header configuration file (specification + * only). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to group all `#includes` to the ANSI~C library that + * FreeType normally requires. It also defines macros to rename the + * standard functions within the FreeType source code. + * + * Load a file which defines `FTSTDLIB_H_` before this one to override it. + * + */ + + +#ifndef FTSTDLIB_H_ +#define FTSTDLIB_H_ + + +#include + +#define ft_ptrdiff_t ptrdiff_t + + + /************************************************************************** + * + * integer limits + * + * `UINT_MAX` and `ULONG_MAX` are used to automatically compute the size of + * `int` and `long` in bytes at compile-time. So far, this works for all + * platforms the library has been tested on. + * + * Note that on the extremely rare platforms that do not provide integer + * types that are _exactly_ 16 and 32~bits wide (e.g., some old Crays where + * `int` is 36~bits), we do not make any guarantee about the correct + * behaviour of FreeType~2 with all fonts. + * + * In these cases, `ftconfig.h` will refuse to compile anyway with a + * message like 'couldn't find 32-bit type' or something similar. + * + */ + + +#include + +#define FT_CHAR_BIT CHAR_BIT +#define FT_USHORT_MAX USHRT_MAX +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_LONG_MIN LONG_MIN +#define FT_LONG_MAX LONG_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /************************************************************************** + * + * character and string processing + * + */ + + +#include + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /************************************************************************** + * + * file handling + * + */ + + +#include + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /************************************************************************** + * + * sorting + * + */ + + +#include + +#define ft_qsort qsort + + + /************************************************************************** + * + * memory allocation + * + */ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define ft_strtol strtol +#define ft_getenv getenv + + + /************************************************************************** + * + * execution control + * + */ + + +#include + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* `jmp_buf` is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ + + + /* The following is only used for debugging purposes, i.e., if */ + /* `FT_DEBUG_LEVEL_ERROR` or `FT_DEBUG_LEVEL_TRACE` are defined. */ + +#include + + +#endif /* FTSTDLIB_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/freetype.h b/linux/include/freetype2/freetype/freetype.h new file mode 100644 index 00000000..4f2eaca6 --- /dev/null +++ b/linux/include/freetype2/freetype/freetype.h @@ -0,0 +1,4880 @@ +/**************************************************************************** + * + * freetype.h + * + * FreeType high-level API and common types (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FREETYPE_H_ +#define FREETYPE_H_ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include " +#error " #include FT_FREETYPE_H" +#endif + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H +#include FT_ERRORS_H + + +FT_BEGIN_HEADER + + + + /************************************************************************** + * + * @section: + * header_inclusion + * + * @title: + * FreeType's header inclusion scheme + * + * @abstract: + * How client applications should include FreeType header files. + * + * @description: + * To be as flexible as possible (and for historical reasons), FreeType + * uses a very special inclusion scheme to load header files, for example + * + * ``` + * #include + * + * #include FT_FREETYPE_H + * #include FT_OUTLINE_H + * ``` + * + * A compiler and its preprocessor only needs an include path to find the + * file `ft2build.h`; the exact locations and names of the other FreeType + * header files are hidden by @header_file_macros, loaded by + * `ft2build.h`. The API documentation always gives the header macro + * name needed for a particular function. + * + */ + + + /************************************************************************** + * + * @section: + * user_allocation + * + * @title: + * User allocation + * + * @abstract: + * How client applications should allocate FreeType data structures. + * + * @description: + * FreeType assumes that structures allocated by the user and passed as + * arguments are zeroed out except for the actual data. In other words, + * it is recommended to use `calloc` (or variants of it) instead of + * `malloc` for allocation. + * + */ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * base_interface + * + * @title: + * Base Interface + * + * @abstract: + * The FreeType~2 base font interface. + * + * @description: + * This section describes the most important public high-level API + * functions of FreeType~2. + * + * @order: + * FT_Library + * FT_Face + * FT_Size + * FT_GlyphSlot + * FT_CharMap + * FT_Encoding + * FT_ENC_TAG + * + * FT_FaceRec + * + * FT_FACE_FLAG_SCALABLE + * FT_FACE_FLAG_FIXED_SIZES + * FT_FACE_FLAG_FIXED_WIDTH + * FT_FACE_FLAG_HORIZONTAL + * FT_FACE_FLAG_VERTICAL + * FT_FACE_FLAG_COLOR + * FT_FACE_FLAG_SFNT + * FT_FACE_FLAG_CID_KEYED + * FT_FACE_FLAG_TRICKY + * FT_FACE_FLAG_KERNING + * FT_FACE_FLAG_MULTIPLE_MASTERS + * FT_FACE_FLAG_VARIATION + * FT_FACE_FLAG_GLYPH_NAMES + * FT_FACE_FLAG_EXTERNAL_STREAM + * FT_FACE_FLAG_HINTER + * + * FT_HAS_HORIZONTAL + * FT_HAS_VERTICAL + * FT_HAS_KERNING + * FT_HAS_FIXED_SIZES + * FT_HAS_GLYPH_NAMES + * FT_HAS_COLOR + * FT_HAS_MULTIPLE_MASTERS + * + * FT_IS_SFNT + * FT_IS_SCALABLE + * FT_IS_FIXED_WIDTH + * FT_IS_CID_KEYED + * FT_IS_TRICKY + * FT_IS_NAMED_INSTANCE + * FT_IS_VARIATION + * + * FT_STYLE_FLAG_BOLD + * FT_STYLE_FLAG_ITALIC + * + * FT_SizeRec + * FT_Size_Metrics + * + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * FT_SubGlyph + * + * FT_Bitmap_Size + * + * FT_Init_FreeType + * FT_Done_FreeType + * + * FT_New_Face + * FT_Done_Face + * FT_Reference_Face + * FT_New_Memory_Face + * FT_Face_Properties + * FT_Open_Face + * FT_Open_Args + * FT_Parameter + * FT_Attach_File + * FT_Attach_Stream + * + * FT_Set_Char_Size + * FT_Set_Pixel_Sizes + * FT_Request_Size + * FT_Select_Size + * FT_Size_Request_Type + * FT_Size_RequestRec + * FT_Size_Request + * FT_Set_Transform + * FT_Load_Glyph + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Get_Name_Index + * FT_Load_Char + * + * FT_OPEN_MEMORY + * FT_OPEN_STREAM + * FT_OPEN_PATHNAME + * FT_OPEN_DRIVER + * FT_OPEN_PARAMS + * + * FT_LOAD_DEFAULT + * FT_LOAD_RENDER + * FT_LOAD_MONOCHROME + * FT_LOAD_LINEAR_DESIGN + * FT_LOAD_NO_SCALE + * FT_LOAD_NO_HINTING + * FT_LOAD_NO_BITMAP + * FT_LOAD_NO_AUTOHINT + * FT_LOAD_COLOR + * + * FT_LOAD_VERTICAL_LAYOUT + * FT_LOAD_IGNORE_TRANSFORM + * FT_LOAD_FORCE_AUTOHINT + * FT_LOAD_NO_RECURSE + * FT_LOAD_PEDANTIC + * + * FT_LOAD_TARGET_NORMAL + * FT_LOAD_TARGET_LIGHT + * FT_LOAD_TARGET_MONO + * FT_LOAD_TARGET_LCD + * FT_LOAD_TARGET_LCD_V + * + * FT_LOAD_TARGET_MODE + * + * FT_Render_Glyph + * FT_Render_Mode + * FT_Get_Kerning + * FT_Kerning_Mode + * FT_Get_Track_Kerning + * FT_Get_Glyph_Name + * FT_Get_Postscript_Name + * + * FT_CharMapRec + * FT_Select_Charmap + * FT_Set_Charmap + * FT_Get_Charmap_Index + * + * FT_Get_FSType_Flags + * FT_Get_SubGlyph_Info + * + * FT_Face_Internal + * FT_Size_Internal + * FT_Slot_Internal + * + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * FT_OPEN_XXX + * FT_LOAD_XXX + * FT_LOAD_TARGET_XXX + * FT_SUBGLYPH_FLAG_XXX + * FT_FSTYPE_XXX + * + * FT_HAS_FAST_GLYPHS + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Glyph_Metrics + * + * @description: + * A structure to model the metrics of a single glyph. The values are + * expressed in 26.6 fractional pixel format; if the flag + * @FT_LOAD_NO_SCALE has been used while loading the glyph, values are + * expressed in font units instead. + * + * @fields: + * width :: + * The glyph's width. + * + * height :: + * The glyph's height. + * + * horiBearingX :: + * Left side bearing for horizontal layout. + * + * horiBearingY :: + * Top side bearing for horizontal layout. + * + * horiAdvance :: + * Advance width for horizontal layout. + * + * vertBearingX :: + * Left side bearing for vertical layout. + * + * vertBearingY :: + * Top side bearing for vertical layout. Larger positive values mean + * further below the vertical glyph origin. + * + * vertAdvance :: + * Advance height for vertical layout. Positive values mean the glyph + * has a positive advance downward. + * + * @note: + * If not disabled with @FT_LOAD_NO_HINTING, the values represent + * dimensions of the hinted glyph (in case hinting is applicable). + * + * Stroking a glyph with an outside border does not increase + * `horiAdvance` or `vertAdvance`; you have to manually adjust these + * values to account for the added width and height. + * + * FreeType doesn't use the 'VORG' table data for CFF fonts because it + * doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as + * `vertBearingY + height` after loading a glyph. + */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_Bitmap_Size + * + * @description: + * This structure models the metrics of a bitmap strike (i.e., a set of + * glyphs for a given point size and resolution) in a bitmap font. It is + * used for the `available_sizes` field of @FT_Face. + * + * @fields: + * height :: + * The vertical distance, in pixels, between two consecutive baselines. + * It is always positive. + * + * width :: + * The average width, in pixels, of all glyphs in the strike. + * + * size :: + * The nominal size of the strike in 26.6 fractional points. This + * field is not very useful. + * + * x_ppem :: + * The horizontal ppem (nominal width) in 26.6 fractional pixels. + * + * y_ppem :: + * The vertical ppem (nominal height) in 26.6 fractional pixels. + * + * @note: + * Windows FNT: + * The nominal size given in a FNT font is not reliable. If the driver + * finds it incorrect, it sets `size` to some calculated values, and + * `x_ppem` and `y_ppem` to the pixel width and height given in the + * font, respectively. + * + * TrueType embedded bitmaps: + * `size`, `width`, and `height` values are not contained in the bitmap + * strike itself. They are computed from the global font parameters. + */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * FT_Library + * + * @description: + * A handle to a FreeType library instance. Each 'library' is completely + * independent from the others; it is the 'root' of a set of objects like + * fonts, faces, sizes, etc. + * + * It also embeds a memory manager (see @FT_Memory), as well as a + * scan-line converter object (see @FT_Raster). + * + * [Since 2.5.6] In multi-threaded applications it is easiest to use one + * `FT_Library` object per thread. In case this is too cumbersome, a + * single `FT_Library` object across threads is possible also, as long as + * a mutex lock is used around @FT_New_Face and @FT_Done_Face. + * + * @note: + * Library objects are normally created by @FT_Init_FreeType, and + * destroyed with @FT_Done_FreeType. If you need reference-counting + * (cf. @FT_Reference_Library), use @FT_New_Library and @FT_Done_Library. + */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + /************************************************************************** + * + * @type: + * FT_Module + * + * @description: + * A handle to a given FreeType module object. A module can be a font + * driver, a renderer, or anything else that provides services to the + * former. + */ + typedef struct FT_ModuleRec_* FT_Module; + + + /************************************************************************** + * + * @type: + * FT_Driver + * + * @description: + * A handle to a given FreeType font driver object. A font driver is a + * module capable of creating faces from font files. + */ + typedef struct FT_DriverRec_* FT_Driver; + + + /************************************************************************** + * + * @type: + * FT_Renderer + * + * @description: + * A handle to a given FreeType renderer. A renderer is a module in + * charge of converting a glyph's outline image to a bitmap. It supports + * a single glyph image format, and one or more target surface depths. + */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @type: + * FT_Face + * + * @description: + * A handle to a typographic face object. A face object models a given + * typeface, in a given style. + * + * @note: + * A face object also owns a single @FT_GlyphSlot object, as well as one + * or more @FT_Size objects. + * + * Use @FT_New_Face or @FT_Open_Face to create a new face object from a + * given filepath or a custom input stream. + * + * Use @FT_Done_Face to destroy it (along with its slot and sizes). + * + * An `FT_Face` object can only be safely used from one thread at a time. + * Similarly, creation and destruction of `FT_Face` with the same + * @FT_Library object can only be done from one thread at a time. On the + * other hand, functions like @FT_Load_Glyph and its siblings are + * thread-safe and do not need the lock to be held as long as the same + * `FT_Face` object is not used from multiple threads at the same time. + * + * @also: + * See @FT_FaceRec for the publicly accessible fields of a given face + * object. + */ + typedef struct FT_FaceRec_* FT_Face; + + + /************************************************************************** + * + * @type: + * FT_Size + * + * @description: + * A handle to an object that models a face scaled to a given character + * size. + * + * @note: + * An @FT_Face has one _active_ @FT_Size object that is used by functions + * like @FT_Load_Glyph to determine the scaling transformation that in + * turn is used to load and hint glyphs and metrics. + * + * You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, @FT_Request_Size + * or even @FT_Select_Size to change the content (i.e., the scaling + * values) of the active @FT_Size. + * + * You can use @FT_New_Size to create additional size objects for a given + * @FT_Face, but they won't be used by other functions until you activate + * it through @FT_Activate_Size. Only one size can be activated at any + * given time per face. + * + * @also: + * See @FT_SizeRec for the publicly accessible fields of a given size + * object. + */ + typedef struct FT_SizeRec_* FT_Size; + + + /************************************************************************** + * + * @type: + * FT_GlyphSlot + * + * @description: + * A handle to a given 'glyph slot'. A slot is a container that can hold + * any of the glyphs contained in its parent face. + * + * In other words, each time you call @FT_Load_Glyph or @FT_Load_Char, + * the slot's content is erased by the new glyph data, i.e., the glyph's + * metrics, its image (bitmap or outline), and other control information. + * + * @also: + * See @FT_GlyphSlotRec for the publicly accessible glyph fields. + */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /************************************************************************** + * + * @type: + * FT_CharMap + * + * @description: + * A handle to a character map (usually abbreviated to 'charmap'). A + * charmap is used to translate character codes in a given encoding into + * glyph indexes for its parent's face. Some font formats may provide + * several charmaps per font. + * + * Each face object owns zero or more charmaps, but only one of them can + * be 'active', providing the data used by @FT_Get_Char_Index or + * @FT_Load_Char. + * + * The list of available charmaps in a face is available through the + * `face->num_charmaps` and `face->charmaps` fields of @FT_FaceRec. + * + * The currently active charmap is available as `face->charmap`. You + * should call @FT_Set_Charmap to change it. + * + * @note: + * When a new face is created (either through @FT_New_Face or + * @FT_Open_Face), the library looks for a Unicode charmap within the + * list and automatically activates it. If there is no Unicode charmap, + * FreeType doesn't set an 'active' charmap. + * + * @also: + * See @FT_CharMapRec for the publicly accessible fields of a given + * character map. + */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /************************************************************************** + * + * @macro: + * FT_ENC_TAG + * + * @description: + * This macro converts four-letter tags into an unsigned long. It is + * used to define 'encoding' identifiers (see @FT_Encoding). + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_ENC_TAG( value, a, b, c, d ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Encoding + * + * @description: + * An enumeration to specify character sets supported by charmaps. Used + * in the @FT_Select_Charmap API function. + * + * @note: + * Despite the name, this enumeration lists specific character + * repertories (i.e., charsets), and not text encoding methods (e.g., + * UTF-8, UTF-16, etc.). + * + * Other encodings might be defined in the future. + * + * @values: + * FT_ENCODING_NONE :: + * The encoding value~0 is reserved for all formats except BDF, PCF, + * and Windows FNT; see below for more information. + * + * FT_ENCODING_UNICODE :: + * The Unicode character set. This value covers all versions of the + * Unicode repertoire, including ASCII and Latin-1. Most fonts include + * a Unicode charmap, but not all of them. + * + * For example, if you want to access Unicode value U+1F028 (and the + * font contains it), use value 0x1F028 as the input value for + * @FT_Get_Char_Index. + * + * FT_ENCODING_MS_SYMBOL :: + * Microsoft Symbol encoding, used to encode mathematical symbols and + * wingdings. For more information, see + * 'https://www.microsoft.com/typography/otspec/recom.htm', + * 'http://www.kostis.net/charsets/symbol.htm', and + * 'http://www.kostis.net/charsets/wingding.htm'. + * + * This encoding uses character codes from the PUA (Private Unicode + * Area) in the range U+F020-U+F0FF. + * + * FT_ENCODING_SJIS :: + * Shift JIS encoding for Japanese. More info at + * 'https://en.wikipedia.org/wiki/Shift_JIS'. See note on multi-byte + * encodings below. + * + * FT_ENCODING_PRC :: + * Corresponds to encoding systems mainly for Simplified Chinese as + * used in People's Republic of China (PRC). The encoding layout is + * based on GB~2312 and its supersets GBK and GB~18030. + * + * FT_ENCODING_BIG5 :: + * Corresponds to an encoding system for Traditional Chinese as used in + * Taiwan and Hong Kong. + * + * FT_ENCODING_WANSUNG :: + * Corresponds to the Korean encoding system known as Extended Wansung + * (MS Windows code page 949). For more information see + * 'https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. + * + * FT_ENCODING_JOHAB :: + * The Korean standard character set (KS~C 5601-1992), which + * corresponds to MS Windows code page 1361. This character set + * includes all possible Hangul character combinations. + * + * FT_ENCODING_ADOBE_LATIN_1 :: + * Corresponds to a Latin-1 encoding as defined in a Type~1 PostScript + * font. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_STANDARD :: + * Adobe Standard encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_EXPERT :: + * Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_CUSTOM :: + * Corresponds to a custom encoding, as found in Type~1, CFF, and + * OpenType/CFF fonts. It is limited to 256 character codes. + * + * FT_ENCODING_APPLE_ROMAN :: + * Apple roman encoding. Many TrueType and OpenType fonts contain a + * charmap for this 8-bit encoding, since older versions of Mac OS are + * able to use it. + * + * FT_ENCODING_OLD_LATIN_2 :: + * This value is deprecated and was neither used nor reported by + * FreeType. Don't use or test for it. + * + * FT_ENCODING_MS_SJIS :: + * Same as FT_ENCODING_SJIS. Deprecated. + * + * FT_ENCODING_MS_GB2312 :: + * Same as FT_ENCODING_PRC. Deprecated. + * + * FT_ENCODING_MS_BIG5 :: + * Same as FT_ENCODING_BIG5. Deprecated. + * + * FT_ENCODING_MS_WANSUNG :: + * Same as FT_ENCODING_WANSUNG. Deprecated. + * + * FT_ENCODING_MS_JOHAB :: + * Same as FT_ENCODING_JOHAB. Deprecated. + * + * @note: + * By default, FreeType enables a Unicode charmap and tags it with + * `FT_ENCODING_UNICODE` when it is either provided or can be generated + * from PostScript glyph name dictionaries in the font file. All other + * encodings are considered legacy and tagged only if explicitly defined + * in the font file. Otherwise, `FT_ENCODING_NONE` is used. + * + * `FT_ENCODING_NONE` is set by the BDF and PCF drivers if the charmap is + * neither Unicode nor ISO-8859-1 (otherwise it is set to + * `FT_ENCODING_UNICODE`). Use @FT_Get_BDF_Charset_ID to find out which + * encoding is really present. If, for example, the `cs_registry` field + * is 'KOI8' and the `cs_encoding` field is 'R', the font is encoded in + * KOI8-R. + * + * `FT_ENCODING_NONE` is always set (with a single exception) by the + * winfonts driver. Use @FT_Get_WinFNT_Header and examine the `charset` + * field of the @FT_WinFNT_HeaderRec structure to find out which encoding + * is really present. For example, @FT_WinFNT_ID_CP1251 (204) means + * Windows code page 1251 (for Russian). + * + * `FT_ENCODING_NONE` is set if `platform_id` is @TT_PLATFORM_MACINTOSH + * and `encoding_id` is not `TT_MAC_ID_ROMAN` (otherwise it is set to + * `FT_ENCODING_APPLE_ROMAN`). + * + * If `platform_id` is @TT_PLATFORM_MACINTOSH, use the function + * @FT_Get_CMap_Language_ID to query the Mac language ID that may be + * needed to be able to distinguish Apple encoding variants. See + * + * https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + * + * to get an idea how to do that. Basically, if the language ID is~0, + * don't use it, otherwise subtract 1 from the language ID. Then examine + * `encoding_id`. If, for example, `encoding_id` is `TT_MAC_ID_ROMAN` + * and the language ID (minus~1) is `TT_MAC_LANGID_GREEK`, it is the + * Greek encoding, not Roman. `TT_MAC_ID_ARABIC` with + * `TT_MAC_LANGID_FARSI` means the Farsi variant the Arabic encoding. + */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /* these constants are deprecated; use the corresponding `FT_Encoding` */ + /* values instead */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_PRC +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /************************************************************************** + * + * @struct: + * FT_CharMapRec + * + * @description: + * The base charmap structure. + * + * @fields: + * face :: + * A handle to the parent face object. + * + * encoding :: + * An @FT_Encoding tag identifying the charmap. Use this with + * @FT_Select_Charmap. + * + * platform_id :: + * An ID number describing the platform for the following encoding ID. + * This comes directly from the TrueType specification and gets + * emulated for other formats. + * + * encoding_id :: + * A platform-specific encoding number. This also comes from the + * TrueType specification and gets emulated similarly. + */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FT_Face_Internal + * + * @description: + * An opaque handle to an `FT_Face_InternalRec` structure that models the + * private data of a given @FT_Face object. + * + * This structure might change between releases of FreeType~2 and is not + * generally available to client applications. + */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /************************************************************************** + * + * @struct: + * FT_FaceRec + * + * @description: + * FreeType root face class structure. A face object models a typeface + * in a font file. + * + * @fields: + * num_faces :: + * The number of faces in the font file. Some font formats can have + * multiple faces in a single font file. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). They are set + * to~0 if there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, holding the named instance index for the current face + * index (starting with value~1; value~0 indicates font access without + * a named instance). For non-variation fonts, bits 16-30 are ignored. + * If we have the third named instance of face~4, say, `face_index` is + * set to 0x00030004. + * + * Bit 31 is always zero (this is, `face_index` is always a positive + * value). + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the named instance index value (only + * @FT_Set_Named_Instance does that). + * + * face_flags :: + * A set of bit flags that give important information about the face; + * see @FT_FACE_FLAG_XXX for the details. + * + * style_flags :: + * The lower 16~bits contain a set of bit flags indicating the style of + * the face; see @FT_STYLE_FLAG_XXX for the details. + * + * [Since 2.6.1] Bits 16-30 hold the number of named instances + * available for the current face if we have a GX or OpenType variation + * (sub)font. Bit 31 is always zero (this is, `style_flags` is always + * a positive value). Note that a variation font has always at least + * one named instance, namely the default instance. + * + * num_glyphs :: + * The number of glyphs in the face. If the face is scalable and has + * sbits (see `num_fixed_sizes`), it is set to the number of outline + * glyphs. + * + * For CID-keyed fonts (not in an SFNT wrapper) this value gives the + * highest CID used in the font. + * + * family_name :: + * The face's family name. This is an ASCII string, usually in + * English, that describes the typeface's family (like 'Times New + * Roman', 'Bodoni', 'Garamond', etc). This is a least common + * denominator used to list fonts. Some formats (TrueType & OpenType) + * provide localized and Unicode versions of this string. Applications + * should use the format-specific interface to access them. Can be + * `NULL` (e.g., in fonts embedded in a PDF file). + * + * In case the font doesn't provide a specific family name entry, + * FreeType tries to synthesize one, deriving it from other name + * entries. + * + * style_name :: + * The face's style name. This is an ASCII string, usually in English, + * that describes the typeface's style (like 'Italic', 'Bold', + * 'Condensed', etc). Not all font formats provide a style name, so + * this field is optional, and can be set to `NULL`. As for + * `family_name`, some formats provide localized and Unicode versions + * of this string. Applications should use the format-specific + * interface to access them. + * + * num_fixed_sizes :: + * The number of bitmap strikes in the face. Even if the face is + * scalable, there might still be bitmap strikes, which are called + * 'sbits' in that case. + * + * available_sizes :: + * An array of @FT_Bitmap_Size for all bitmap strikes in the face. It + * is set to `NULL` if there is no bitmap strike. + * + * Note that FreeType tries to sanitize the strike data since they are + * sometimes sloppy or incorrect, but this can easily fail. + * + * num_charmaps :: + * The number of charmaps in the face. + * + * charmaps :: + * An array of the charmaps of the face. + * + * generic :: + * A field reserved for client uses. See the @FT_Generic type + * description. + * + * bbox :: + * The font bounding box. Coordinates are expressed in font units (see + * `units_per_EM`). The box is large enough to contain any glyph from + * the font. Thus, `bbox.yMax` can be seen as the 'maximum ascender', + * and `bbox.yMin` as the 'minimum descender'. Only relevant for + * scalable formats. + * + * Note that the bounding box might be off by (at least) one pixel for + * hinted fonts. See @FT_Size_Metrics for further discussion. + * + * units_per_EM :: + * The number of font units per EM square for this face. This is + * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only + * relevant for scalable formats. + * + * ascender :: + * The typographic ascender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMax`. + * Only relevant for scalable formats. + * + * descender :: + * The typographic descender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMin`. + * Note that this field is negative for values below the baseline. + * Only relevant for scalable formats. + * + * height :: + * This value is the vertical distance between two consecutive + * baselines, expressed in font units. It is always positive. Only + * relevant for scalable formats. + * + * If you want the global glyph height, use `ascender - descender`. + * + * max_advance_width :: + * The maximum advance width, in font units, for all glyphs in this + * face. This can be used to make word wrapping computations faster. + * Only relevant for scalable formats. + * + * max_advance_height :: + * The maximum advance height, in font units, for all glyphs in this + * face. This is only relevant for vertical layouts, and is set to + * `height` for fonts that do not provide vertical metrics. Only + * relevant for scalable formats. + * + * underline_position :: + * The position, in font units, of the underline line for this face. + * It is the center of the underlining stem. Only relevant for + * scalable formats. + * + * underline_thickness :: + * The thickness, in font units, of the underline for this face. Only + * relevant for scalable formats. + * + * glyph :: + * The face's associated glyph slot(s). + * + * size :: + * The current active size for this face. + * + * charmap :: + * The current active charmap for this face. + * + * @note: + * Fields may be changed after a call to @FT_Attach_File or + * @FT_Attach_Stream. + * + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `ascender`, `descender`, `height`, + * `underline_position`, and `underline_thickness`. + * + * Especially for TrueType fonts see also the documentation for + * @FT_Size_Metrics. + */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness`) */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; /* face-specific auto-hinter data */ + void* extensions; /* unused */ + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /************************************************************************** + * + * @enum: + * FT_FACE_FLAG_XXX + * + * @description: + * A list of bit flags used in the `face_flags` field of the @FT_FaceRec + * structure. They inform client applications of properties of the + * corresponding face. + * + * @values: + * FT_FACE_FLAG_SCALABLE :: + * The face contains outline glyphs. Note that a face can contain + * bitmap strikes also, i.e., a face can have both this flag and + * @FT_FACE_FLAG_FIXED_SIZES set. + * + * FT_FACE_FLAG_FIXED_SIZES :: + * The face contains bitmap strikes. See also the `num_fixed_sizes` + * and `available_sizes` fields of @FT_FaceRec. + * + * FT_FACE_FLAG_FIXED_WIDTH :: + * The face contains fixed-width characters (like Courier, Lucida, + * MonoType, etc.). + * + * FT_FACE_FLAG_SFNT :: + * The face uses the SFNT storage scheme. For now, this means TrueType + * and OpenType. + * + * FT_FACE_FLAG_HORIZONTAL :: + * The face contains horizontal glyph metrics. This should be set for + * all common formats. + * + * FT_FACE_FLAG_VERTICAL :: + * The face contains vertical glyph metrics. This is only available in + * some formats, not all of them. + * + * FT_FACE_FLAG_KERNING :: + * The face contains kerning information. If set, the kerning distance + * can be retrieved using the function @FT_Get_Kerning. Otherwise the + * function always return the vector (0,0). Note that FreeType doesn't + * handle kerning data from the SFNT 'GPOS' table (as present in many + * OpenType fonts). + * + * FT_FACE_FLAG_FAST_GLYPHS :: + * THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + * + * FT_FACE_FLAG_MULTIPLE_MASTERS :: + * The face contains multiple masters and is capable of interpolating + * between them. Supported formats are Adobe MM, TrueType GX, and + * OpenType variation fonts. + * + * See section @multiple_masters for API details. + * + * FT_FACE_FLAG_GLYPH_NAMES :: + * The face contains glyph names, which can be retrieved using + * @FT_Get_Glyph_Name. Note that some TrueType fonts contain broken + * glyph name tables. Use the function @FT_Has_PS_Glyph_Names when + * needed. + * + * FT_FACE_FLAG_EXTERNAL_STREAM :: + * Used internally by FreeType to indicate that a face's stream was + * provided by the client application and should not be destroyed when + * @FT_Done_Face is called. Don't read or test this flag. + * + * FT_FACE_FLAG_HINTER :: + * The font driver has a hinting machine of its own. For example, with + * TrueType fonts, it makes sense to use data from the SFNT 'gasp' + * table only if the native TrueType hinting engine (with the bytecode + * interpreter) is available and active. + * + * FT_FACE_FLAG_CID_KEYED :: + * The face is CID-keyed. In that case, the face is not accessed by + * glyph indices but by CID values. For subsetted CID-keyed fonts this + * has the consequence that not all index values are a valid argument + * to @FT_Load_Glyph. Only the CID values for which corresponding + * glyphs in the subsetted font exist make `FT_Load_Glyph` return + * successfully; in all other cases you get an + * `FT_Err_Invalid_Argument` error. + * + * Note that CID-keyed fonts that are in an SFNT wrapper (this is, all + * OpenType/CFF fonts) don't have this flag set since the glyphs are + * accessed in the normal way (using contiguous indices); the + * 'CID-ness' isn't visible to the application. + * + * FT_FACE_FLAG_TRICKY :: + * The face is 'tricky', this is, it always needs the font format's + * native hinting engine to get a reasonable result. A typical example + * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that + * uses TrueType bytecode instructions to move and scale all of its + * subglyphs. + * + * It is not possible to auto-hint such fonts using + * @FT_LOAD_FORCE_AUTOHINT; it will also ignore @FT_LOAD_NO_HINTING. + * You have to set both @FT_LOAD_NO_HINTING and @FT_LOAD_NO_AUTOHINT to + * really disable hinting; however, you probably never want this except + * for demonstration purposes. + * + * Currently, there are about a dozen TrueType fonts in the list of + * tricky fonts; they are hard-coded in file `ttobjs.c`. + * + * FT_FACE_FLAG_COLOR :: + * [Since 2.5.1] The face has color glyph tables. See @FT_LOAD_COLOR + * for more information. + * + * FT_FACE_FLAG_VARIATION :: + * [Since 2.9] Set if the current face (or named instance) has been + * altered with @FT_Set_MM_Design_Coordinates, + * @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates. + * This flag is unset by a call to @FT_Set_Named_Instance. + */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) +#define FT_FACE_FLAG_COLOR ( 1L << 14 ) +#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_HORIZONTAL + * + * @description: + * A macro that returns true whenever a face object contains horizontal + * metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_VERTICAL + * + * @description: + * A macro that returns true whenever a face object contains real + * vertical metrics (and not only synthesized ones). + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_KERNING + * + * @description: + * A macro that returns true whenever a face object contains kerning data + * that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SCALABLE + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, and + * PFR font formats). + * + */ +#define FT_IS_SCALABLE( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SFNT + * + * @description: + * A macro that returns true whenever a face object contains a font whose + * format is based on the SFNT storage scheme. This usually means: + * TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap + * fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************** + * + * @macro: + * FT_IS_FIXED_WIDTH + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or 'monospace', 'fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FIXED_SIZES + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes` field of the @FT_FaceRec + * structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FAST_GLYPHS + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************** + * + * @macro: + * FT_HAS_GLYPH_NAMES + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************** + * + * @macro: + * FT_IS_NAMED_INSTANCE + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the return value of this macro (only + * @FT_Set_Named_Instance does that). + * + * @since: + * 2.7 + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( (face)->face_index & 0x7FFF0000L ) + + + /************************************************************************** + * + * @macro: + * FT_IS_VARIATION + * + * @description: + * A macro that returns true whenever a face object has been altered by + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or + * @FT_Set_Var_Blend_Coordinates. + * + * @since: + * 2.9 + * + */ +#define FT_IS_VARIATION( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_VARIATION ) + + + /************************************************************************** + * + * @macro: + * FT_IS_CID_KEYED + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************** + * + * @macro: + * FT_IS_TRICKY + * + * @description: + * A macro that returns true whenever a face represents a 'tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_TRICKY ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_COLOR + * + * @description: + * A macro that returns true whenever a face object contains tables for + * color glyphs. + * + * @since: + * 2.5.1 + * + */ +#define FT_HAS_COLOR( face ) \ + ( (face)->face_flags & FT_FACE_FLAG_COLOR ) + + + /************************************************************************** + * + * @enum: + * FT_STYLE_FLAG_XXX + * + * @description: + * A list of bit flags to indicate the style of a given face. These are + * used in the `style_flags` field of @FT_FaceRec. + * + * @values: + * FT_STYLE_FLAG_ITALIC :: + * The face style is italic or oblique. + * + * FT_STYLE_FLAG_BOLD :: + * The face is bold. + * + * @note: + * The style information as provided by FreeType is very basic. More + * details are beyond the scope and should be done on a higher level (for + * example, by analyzing various fields of the 'OS/2' table in SFNT based + * fonts). + */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /************************************************************************** + * + * @type: + * FT_Size_Internal + * + * @description: + * An opaque handle to an `FT_Size_InternalRec` structure, used to model + * private data of a given @FT_Size object. + */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /************************************************************************** + * + * @struct: + * FT_Size_Metrics + * + * @description: + * The size metrics structure gives the metrics of a size object. + * + * @fields: + * x_ppem :: + * The width of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal width'. + * + * y_ppem :: + * The height of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal height'. + * + * x_scale :: + * A 16.16 fractional scaling value to convert horizontal metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * y_scale :: + * A 16.16 fractional scaling value to convert vertical metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * ascender :: + * The ascender in 26.6 fractional pixels, rounded up to an integer + * value. See @FT_FaceRec for the details. + * + * descender :: + * The descender in 26.6 fractional pixels, rounded down to an integer + * value. See @FT_FaceRec for the details. + * + * height :: + * The height in 26.6 fractional pixels, rounded to an integer value. + * See @FT_FaceRec for the details. + * + * max_advance :: + * The maximum advance width in 26.6 fractional pixels, rounded to an + * integer value. See @FT_FaceRec for the details. + * + * @note: + * The scaling values, if relevant, are determined first during a size + * changing operation. The remaining fields are then set by the driver. + * For scalable formats, they are usually set to scaled values of the + * corresponding fields in @FT_FaceRec. Some values like ascender or + * descender are rounded for historical reasons; more precise values (for + * outline fonts) can be derived by scaling the corresponding @FT_FaceRec + * values manually, with code similar to the following. + * + * ``` + * scaled_ascender = FT_MulFix( face->ascender, + * size_metrics->y_scale ); + * ``` + * + * Note that due to glyph hinting and the selected rendering mode these + * values are usually not exact; consequently, they must be treated as + * unreliable with an error margin of at least one pixel! + * + * Indeed, the only way to get the exact metrics is to render _all_ + * glyphs. As this would be a definite performance hit, it is up to + * client applications to perform such computations. + * + * The `FT_Size_Metrics` structure is valid for bitmap fonts also. + * + * + * **TrueType fonts with native bytecode hinting** + * + * All applications that handle TrueType fonts with native hinting must + * be aware that TTFs expect different rounding of vertical font + * dimensions. The application has to cater for this, especially if it + * wants to rely on a TTF's vertical data (for example, to properly align + * box characters vertically). + * + * Only the application knows _in advance_ that it is going to use native + * hinting for TTFs! FreeType, on the other hand, selects the hinting + * mode not at the time of creating an @FT_Size object but much later, + * namely while calling @FT_Load_Glyph. + * + * Here is some pseudo code that illustrates a possible solution. + * + * ``` + * font_format = FT_Get_Font_Format( face ); + * + * if ( !strcmp( font_format, "TrueType" ) && + * do_native_bytecode_hinting ) + * { + * ascender = ROUND( FT_MulFix( face->ascender, + * size_metrics->y_scale ) ); + * descender = ROUND( FT_MulFix( face->descender, + * size_metrics->y_scale ) ); + * } + * else + * { + * ascender = size_metrics->ascender; + * descender = size_metrics->descender; + * } + * + * height = size_metrics->height; + * max_advance = size_metrics->max_advance; + * ``` + */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_SizeRec + * + * @description: + * FreeType root size class structure. A size object models a face + * object at a given size. + * + * @fields: + * face :: + * Handle to the parent face object. + * + * generic :: + * A typeless pointer, unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each size object. + * + * metrics :: + * Metrics for this size object. This field is read-only. + */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /************************************************************************** + * + * @struct: + * FT_SubGlyph + * + * @description: + * The subglyph structure is an internal object used to describe + * subglyphs (for example, in the case of composites). + * + * @note: + * The subglyph implementation is not part of the high-level API, hence + * the forward structure declaration. + * + * You can however retrieve subglyph information with + * @FT_Get_SubGlyph_Info. + */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /************************************************************************** + * + * @type: + * FT_Slot_Internal + * + * @description: + * An opaque handle to an `FT_Slot_InternalRec` structure, used to model + * private data of a given @FT_GlyphSlot object. + */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /************************************************************************** + * + * @struct: + * FT_GlyphSlotRec + * + * @description: + * FreeType root glyph slot class structure. A glyph slot is a container + * where individual glyphs can be loaded, be they in outline or bitmap + * format. + * + * @fields: + * library :: + * A handle to the FreeType library instance this slot belongs to. + * + * face :: + * A handle to the parent face object. + * + * next :: + * In some cases (like some font tools), several glyph slots per face + * object can be a good thing. As this is rare, the glyph slots are + * listed through a direct, single-linked list using its `next` field. + * + * glyph_index :: + * [Since 2.10] The glyph index passed as an argument to @FT_Load_Glyph + * while initializing the glyph slot. + * + * generic :: + * A typeless pointer unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each glyph slot object. + * + * metrics :: + * The metrics of the last loaded glyph in the slot. The returned + * values depend on the last load flags (see the @FT_Load_Glyph API + * function) and can be expressed either in 26.6 fractional pixels or + * font units. + * + * Note that even when the glyph image is transformed, the metrics are + * not. + * + * linearHoriAdvance :: + * The advance width of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * linearVertAdvance :: + * The advance height of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for outline glyphs. + * + * advance :: + * This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the + * transformed (hinted) advance width for the glyph, in 26.6 fractional + * pixel format. As specified with @FT_LOAD_VERTICAL_LAYOUT, it uses + * either the `horiAdvance` or the `vertAdvance` value of `metrics` + * field. + * + * format :: + * This field indicates the format of the image contained in the glyph + * slot. Typically @FT_GLYPH_FORMAT_BITMAP, @FT_GLYPH_FORMAT_OUTLINE, + * or @FT_GLYPH_FORMAT_COMPOSITE, but other values are possible. + * + * bitmap :: + * This field is used as a bitmap descriptor. Note that the address + * and content of the bitmap buffer can change between calls of + * @FT_Load_Glyph and a few other functions. + * + * bitmap_left :: + * The bitmap's left bearing expressed in integer pixels. + * + * bitmap_top :: + * The bitmap's top bearing expressed in integer pixels. This is the + * distance from the baseline to the top-most glyph scanline, upwards + * y~coordinates being **positive**. + * + * outline :: + * The outline descriptor for the current glyph image if its format is + * @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, `outline` can be + * transformed, distorted, emboldened, etc. However, it must not be + * freed. + * + * num_subglyphs :: + * The number of subglyphs in a composite glyph. This field is only + * valid for the composite glyph format that should normally only be + * loaded with the @FT_LOAD_NO_RECURSE flag. + * + * subglyphs :: + * An array of subglyph descriptors for composite glyphs. There are + * `num_subglyphs` elements in there. Currently internal to FreeType. + * + * control_data :: + * Certain font drivers can also return the control data for a given + * glyph image (e.g. TrueType bytecode, Type~1 charstrings, etc.). + * This field is a pointer to such data; it is currently internal to + * FreeType. + * + * control_len :: + * This is the length in bytes of the control data. Currently internal + * to FreeType. + * + * other :: + * Reserved. + * + * lsb_delta :: + * The difference between hinted and unhinted left side bearing while + * auto-hinting is active. Zero otherwise. + * + * rsb_delta :: + * The difference between hinted and unhinted right side bearing while + * auto-hinting is active. Zero otherwise. + * + * @note: + * If @FT_Load_Glyph is called with default flags (see @FT_LOAD_DEFAULT) + * the glyph image is loaded in the glyph slot in its native format + * (e.g., an outline glyph for TrueType and Type~1 formats). [Since 2.9] + * The prospective bitmap metrics are calculated according to + * @FT_LOAD_TARGET_XXX and other flags even for the outline glyph, even + * if @FT_LOAD_RENDER is not set. + * + * This image can later be converted into a bitmap by calling + * @FT_Render_Glyph. This function searches the current renderer for the + * native image's format, then invokes it. + * + * The renderer is in charge of transforming the native image through the + * slot's face transformation fields, then converting it into a bitmap + * that is returned in `slot->bitmap`. + * + * Note that `slot->bitmap_left` and `slot->bitmap_top` are also used to + * specify the position of the bitmap relative to the current pen + * position (e.g., coordinates (0,0) on the baseline). Of course, + * `slot->format` is also changed to @FT_GLYPH_FORMAT_BITMAP. + * + * Here is a small pseudo code fragment that shows how to use `lsb_delta` + * and `rsb_delta` to do fractional positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * + * + * for all glyphs do + * + * + * FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); + * + * + * + * + * + * origin_x += slot->advance.x; + * origin_x += slot->lsb_delta - slot->rsb_delta; + * endfor + * ``` + * + * Here is another small pseudo code fragment that shows how to use + * `lsb_delta` and `rsb_delta` to improve integer positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * FT_Pos prev_rsb_delta = 0; + * + * + * for all glyphs do + * + * + * + * + * if ( prev_rsb_delta - slot->lsb_delta > 32 ) + * origin_x -= 64; + * else if ( prev_rsb_delta - slot->lsb_delta < -31 ) + * origin_x += 64; + * + * prev_rsb_delta = slot->rsb_delta; + * + * + * + * origin_x += slot->advance.x; + * endfor + * ``` + * + * If you use strong auto-hinting, you **must** apply these delta values! + * Otherwise you will experience far too large inter-glyph spacing at + * small rendering sizes in most cases. Note that it doesn't harm to use + * the above code for other hinting modes also, since the delta values + * are zero then. + */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt glyph_index; /* new in 2.10; was reserved previously */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @function: + * FT_Init_FreeType + * + * @description: + * Initialize a new FreeType library object. The set of modules that are + * registered by this function is determined at build time. + * + * @output: + * alibrary :: + * A handle to a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case you want to provide your own memory allocating routines, use + * @FT_New_Library instead, followed by a call to @FT_Add_Default_Modules + * (or a series of calls to @FT_Add_Module) and + * @FT_Set_Default_Properties. + * + * See the documentation of @FT_Library and @FT_Face for multi-threading + * issues. + * + * If you need reference-counting (cf. @FT_Reference_Library), use + * @FT_New_Library and @FT_Done_Library. + * + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_FreeType + * + * @description: + * Destroy a given FreeType library object and all of its children, + * including resources, drivers, faces, sizes, etc. + * + * @input: + * library :: + * A handle to the target library object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /************************************************************************** + * + * @enum: + * FT_OPEN_XXX + * + * @description: + * A list of bit field constants used within the `flags` field of the + * @FT_Open_Args structure. + * + * @values: + * FT_OPEN_MEMORY :: + * This is a memory-based stream. + * + * FT_OPEN_STREAM :: + * Copy the stream from the `stream` field. + * + * FT_OPEN_PATHNAME :: + * Create a new input stream from a C~path name. + * + * FT_OPEN_DRIVER :: + * Use the `driver` field. + * + * FT_OPEN_PARAMS :: + * Use the `num_params` and `params` fields. + * + * @note: + * The `FT_OPEN_MEMORY`, `FT_OPEN_STREAM`, and `FT_OPEN_PATHNAME` flags + * are mutually exclusive. + */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + + + /* these constants are deprecated; use the corresponding `FT_OPEN_XXX` */ + /* values instead */ +#define ft_open_memory FT_OPEN_MEMORY +#define ft_open_stream FT_OPEN_STREAM +#define ft_open_pathname FT_OPEN_PATHNAME +#define ft_open_driver FT_OPEN_DRIVER +#define ft_open_params FT_OPEN_PARAMS + + + /************************************************************************** + * + * @struct: + * FT_Parameter + * + * @description: + * A simple structure to pass more or less generic parameters to + * @FT_Open_Face and @FT_Face_Properties. + * + * @fields: + * tag :: + * A four-byte identification tag. + * + * data :: + * A pointer to the parameter data. + * + * @note: + * The ID and function of parameters are driver-specific. See section + * @parameter_tags for more information. + */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /************************************************************************** + * + * @struct: + * FT_Open_Args + * + * @description: + * A structure to indicate how to open a new font file or stream. A + * pointer to such a structure can be used as a parameter for the + * functions @FT_Open_Face and @FT_Attach_Stream. + * + * @fields: + * flags :: + * A set of bit flags indicating how to use the structure. + * + * memory_base :: + * The first byte of the file in memory. + * + * memory_size :: + * The size in bytes of the file in memory. + * + * pathname :: + * A pointer to an 8-bit file pathname. + * + * stream :: + * A handle to a source stream object. + * + * driver :: + * This field is exclusively used by @FT_Open_Face; it simply specifies + * the font driver to use for opening the face. If set to `NULL`, + * FreeType tries to load the face with each one of the drivers in its + * list. + * + * num_params :: + * The number of extra parameters. + * + * params :: + * Extra parameters passed to the font driver when opening a new face. + * + * @note: + * The stream type is determined by the contents of `flags` that are + * tested in the following order by @FT_Open_Face: + * + * If the @FT_OPEN_MEMORY bit is set, assume that this is a memory file + * of `memory_size` bytes, located at `memory_address`. The data are not + * copied, and the client is responsible for releasing and destroying + * them _after_ the corresponding call to @FT_Done_Face. + * + * Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a custom + * input stream `stream` is used. + * + * Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this is a + * normal file and use `pathname` to open it. + * + * If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to open + * the file with the driver whose handler is in `driver`. + * + * If the @FT_OPEN_PARAMS bit is set, the parameters given by + * `num_params` and `params` is used. They are ignored otherwise. + * + * Ideally, both the `pathname` and `params` fields should be tagged as + * 'const'; this is missing for API backward compatibility. In other + * words, applications should treat them as read-only. + */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /************************************************************************** + * + * @function: + * FT_New_Face + * + * @description: + * Call @FT_Open_Face to open a font by its pathname. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * pathname :: + * A path to the font file. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Use @FT_Done_Face to destroy the created @FT_Face object (along with + * its slot and sizes). + */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_New_Memory_Face + * + * @description: + * Call @FT_Open_Face to open a font that has been loaded into memory. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * file_base :: + * A pointer to the beginning of the font data. + * + * file_size :: + * The size of the memory chunk used by the font data. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You must not deallocate the memory before calling @FT_Done_Face. + */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Open_Face + * + * @description: + * Create a face object from a given resource described by @FT_Open_Args. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * args :: + * A pointer to an `FT_Open_Args` structure that must be filled by the + * caller. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). Set it to~0 if + * there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, specifying the named instance index for the current face + * index (starting with value~1; value~0 makes FreeType ignore named + * instances). For non-variation fonts, bits 16-30 are ignored. + * Assuming that you want to access the third named instance in face~4, + * `face_index` should be set to 0x00030004. If you want to access + * face~4 without variation handling, simply set `face_index` to + * value~4. + * + * `FT_Open_Face` and its siblings can be used to quickly check whether + * the font format of a given font resource is supported by FreeType. + * In general, if the `face_index` argument is negative, the function's + * return value is~0 if the font format is recognized, or non-zero + * otherwise. The function allocates a more or less empty face handle + * in `*aface` (if `aface` isn't `NULL`); the only two useful fields in + * this special case are `face->num_faces` and `face->style_flags`. + * For any negative value of `face_index`, `face->num_faces` gives the + * number of faces within the font file. For the negative value + * '-(N+1)' (with 'N' a non-negative 16-bit value), bits 16-30 in + * `face->style_flags` give the number of named instances in face 'N' + * if we have a variation font (or zero otherwise). After examination, + * the returned @FT_Face structure should be deallocated with a call to + * @FT_Done_Face. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Unlike FreeType 1.x, this function automatically creates a glyph slot + * for the face object that can be accessed directly through + * `face->glyph`. + * + * Each new face object created with this function also owns a default + * @FT_Size object, accessible as `face->size`. + * + * One @FT_Library instance can have multiple face objects, this is, + * @FT_Open_Face and its siblings can be called multiple times using the + * same `library` argument. + * + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + * + * @example: + * To loop over all faces, use code similar to the following snippet + * (omitting the error handling). + * + * ``` + * ... + * FT_Face face; + * FT_Long i, num_faces; + * + * + * error = FT_Open_Face( library, args, -1, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * FT_Done_Face( face ); + * + * for ( i = 0; i < num_faces; i++ ) + * { + * ... + * error = FT_Open_Face( library, args, i, &face ); + * ... + * FT_Done_Face( face ); + * ... + * } + * ``` + * + * To loop over all valid values for `face_index`, use something similar + * to the following snippet, again without error handling. The code + * accesses all faces immediately (thus only a single call of + * `FT_Open_Face` within the do-loop), with and without named instances. + * + * ``` + * ... + * FT_Face face; + * + * FT_Long num_faces = 0; + * FT_Long num_instances = 0; + * + * FT_Long face_idx = 0; + * FT_Long instance_idx = 0; + * + * + * do + * { + * FT_Long id = ( instance_idx << 16 ) + face_idx; + * + * + * error = FT_Open_Face( library, args, id, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * num_instances = face->style_flags >> 16; + * + * ... + * + * FT_Done_Face( face ); + * + * if ( instance_idx < num_instances ) + * instance_idx++; + * else + * { + * face_idx++; + * instance_idx = 0; + * } + * + * } while ( face_idx < num_faces ) + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Attach_File + * + * @description: + * Call @FT_Attach_Stream to attach a file. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * filepathname :: + * The pathname. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /************************************************************************** + * + * @function: + * FT_Attach_Stream + * + * @description: + * 'Attach' data to a face object. Normally, this is used to read + * additional information for the face object. For example, you can + * attach an AFM file that comes with a Type~1 font to get the kerning + * values and other metrics. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * parameters :: + * A pointer to @FT_Open_Args that must be filled by the caller. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The meaning of the 'attach' (i.e., what really happens when the new + * file is read) is not fixed by FreeType itself. It really depends on + * the font format (and thus the font driver). + * + * Client applications are expected to know what they are doing when + * invoking this function. Most drivers simply do not implement file or + * stream attachments. + */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Face + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Face structure is + * created. This function increments the counter. @FT_Done_Face then + * only destroys a face if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Face objects. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Done_Face + * + * @description: + * Discard a given face object, as well as all of its child slots and + * sizes. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Size + * + * @description: + * Select a bitmap strike. To be more precise, this function sets the + * scaling factors of the active @FT_Size object in a face so that + * bitmaps from this particular strike are taken by @FT_Load_Glyph and + * friends. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * strike_index :: + * The index of the bitmap strike in the `available_sizes` field of + * @FT_FaceRec structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For bitmaps embedded in outline fonts it is common that only a subset + * of the available glyphs at a given ppem value is available. FreeType + * silently uses outlines if there is no bitmap for a given glyph index. + * + * For GX and OpenType variation fonts, a bitmap strike makes sense only + * if the default instance is active (this is, no glyph variation takes + * place); otherwise, FreeType simply ignores bitmap strikes. The same + * is true for all named instances that are different from the default + * instance. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /************************************************************************** + * + * @enum: + * FT_Size_Request_Type + * + * @description: + * An enumeration type that lists the supported size request types, i.e., + * what input size (in font units) maps to the requested output size (in + * pixels, as computed from the arguments of @FT_Size_Request). + * + * @values: + * FT_SIZE_REQUEST_TYPE_NOMINAL :: + * The nominal size. The `units_per_EM` field of @FT_FaceRec is used + * to determine both scaling values. + * + * This is the standard scaling found in most applications. In + * particular, use this size request type for TrueType fonts if they + * provide optical scaling or something similar. Note, however, that + * `units_per_EM` is a rather abstract value which bears no relation to + * the actual size of the glyphs in a font. + * + * FT_SIZE_REQUEST_TYPE_REAL_DIM :: + * The real dimension. The sum of the `ascender` and (minus of) the + * `descender` fields of @FT_FaceRec is used to determine both scaling + * values. + * + * FT_SIZE_REQUEST_TYPE_BBOX :: + * The font bounding box. The width and height of the `bbox` field of + * @FT_FaceRec are used to determine the horizontal and vertical + * scaling value, respectively. + * + * FT_SIZE_REQUEST_TYPE_CELL :: + * The `max_advance_width` field of @FT_FaceRec is used to determine + * the horizontal scaling value; the vertical scaling value is + * determined the same way as @FT_SIZE_REQUEST_TYPE_REAL_DIM does. + * Finally, both scaling values are set to the smaller one. This type + * is useful if you want to specify the font size for, say, a window of + * a given dimension and 80x24 cells. + * + * FT_SIZE_REQUEST_TYPE_SCALES :: + * Specify the scaling values directly. + * + * @note: + * The above descriptions only apply to scalable formats. For bitmap + * formats, the behaviour is up to the driver. + * + * See the note section of @FT_Size_Metrics if you wonder how size + * requesting relates to scaling values. + */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /************************************************************************** + * + * @struct: + * FT_Size_RequestRec + * + * @description: + * A structure to model a size request. + * + * @fields: + * type :: + * See @FT_Size_Request_Type. + * + * width :: + * The desired width, given as a 26.6 fractional point value (with 72pt + * = 1in). + * + * height :: + * The desired height, given as a 26.6 fractional point value (with + * 72pt = 1in). + * + * horiResolution :: + * The horizontal resolution (dpi, i.e., pixels per inch). If set to + * zero, `width` is treated as a 26.6 fractional **pixel** value, which + * gets internally rounded to an integer. + * + * vertResolution :: + * The vertical resolution (dpi, i.e., pixels per inch). If set to + * zero, `height` is treated as a 26.6 fractional **pixel** value, + * which gets internally rounded to an integer. + * + * @note: + * If `width` is zero, the horizontal scaling value is set equal to the + * vertical scaling value, and vice versa. + * + * If `type` is `FT_SIZE_REQUEST_TYPE_SCALES`, `width` and `height` are + * interpreted directly as 16.16 fractional scaling values, without any + * further modification, and both `horiResolution` and `vertResolution` + * are ignored. + */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_Request + * + * @description: + * A handle to a size request structure. + */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /************************************************************************** + * + * @function: + * FT_Request_Size + * + * @description: + * Resize the scale of the active @FT_Size object in a face. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * req :: + * A pointer to a @FT_Size_RequestRec. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Although drivers may select the bitmap strike matching the request, + * you should not rely on this if you intend to select a particular + * bitmap strike. Use @FT_Select_Size instead in that case. + * + * The relation between the requested size and the resulting glyph size + * is dependent entirely on how the size is defined in the source face. + * The font designer chooses the final size of each glyph relative to + * this size. For more information refer to + * 'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'. + * + * Contrary to @FT_Set_Char_Size, this function doesn't have special code + * to normalize zero-valued widths, heights, or resolutions (which lead + * to errors in most cases). + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /************************************************************************** + * + * @function: + * FT_Set_Char_Size + * + * @description: + * Call @FT_Request_Size to request the nominal size (in points). + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * char_width :: + * The nominal width, in 26.6 fractional points. + * + * char_height :: + * The nominal height, in 26.6 fractional points. + * + * horz_resolution :: + * The horizontal resolution in dpi. + * + * vert_resolution :: + * The vertical resolution in dpi. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While this function allows fractional points as input values, the + * resulting ppem value for the given resolution is always rounded to the + * nearest integer. + * + * If either the character width or height is zero, it is set equal to + * the other value. + * + * If either the horizontal or vertical resolution is zero, it is set + * equal to the other value. + * + * A character width or height smaller than 1pt is set to 1pt; if both + * resolution values are zero, they are set to 72dpi. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /************************************************************************** + * + * @function: + * FT_Set_Pixel_Sizes + * + * @description: + * Call @FT_Request_Size to request the nominal size (in pixels). + * + * @inout: + * face :: + * A handle to the target face object. + * + * @input: + * pixel_width :: + * The nominal width, in pixels. + * + * pixel_height :: + * The nominal height, in pixels. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should not rely on the resulting glyphs matching or being + * constrained to this pixel size. Refer to @FT_Request_Size to + * understand how requested sizes relate to actual sizes. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /************************************************************************** + * + * @function: + * FT_Load_Glyph + * + * @description: + * Load a glyph into the glyph slot of a face object. + * + * @inout: + * face :: + * A handle to the target face object where the glyph is loaded. + * + * @input: + * glyph_index :: + * The index of the glyph in the font file. For CID-keyed fonts + * (either in PS or in CFF format) this argument specifies the CID + * value. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The loaded glyph may be transformed. See @FT_Set_Transform for the + * details. + * + * For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned + * for invalid CID values (this is, for CID values that don't have a + * corresponding glyph in the font). See the discussion of the + * @FT_FACE_FLAG_CID_KEYED flag for more details. + * + * If you receive `FT_Err_Glyph_Too_Big`, try getting the glyph outline + * at EM size, then scale it manually and fill it as a graphics + * operation. + */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @function: + * FT_Load_Char + * + * @description: + * Load a glyph into the glyph slot of a face object, accessed by its + * character code. + * + * @inout: + * face :: + * A handle to a target face object where the glyph is loaded. + * + * @input: + * char_code :: + * The glyph's character code, according to the current charmap used in + * the face. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. + * + * Many fonts contain glyphs that can't be loaded by this function since + * its glyph indices are not listed in any of the font's charmaps. + * + * If no active cmap is set up (i.e., `face->charmap` is zero), the call + * to @FT_Get_Char_Index is omitted, and the function behaves identically + * to @FT_Load_Glyph. + */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit field constants for @FT_Load_Glyph to indicate what kind + * of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. The + * bitmap data can be accessed from the glyph slot (see note below). + * + * 2. If no embedded bitmap is searched for or found, FreeType looks + * for a scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then 'hinted' to the pixel grid in + * order to optimize it. The outline data can be accessed from the + * glyph slot (see note below). + * + * Note that by default the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the loaded outline glyph but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * If the font is 'tricky' (see @FT_FACE_FLAG_TRICKY for more), using + * `FT_LOAD_NO_SCALE` usually yields meaningless outlines because the + * subglyphs must be scaled and positioned with hinting instructions. + * This can be solved by loading the font without `FT_LOAD_NO_SCALE` + * and setting the character size to `font->units_per_EM`. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates 'blurrier' bitmap glyphs + * when the glyph are rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. In particular, the + * `advance` value in the @FT_GlyphSlotRec structure is set to the + * `vertAdvance` value of the `metrics` field. + * + * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use this + * flag currently. Reason is that in this case vertical metrics get + * synthesized, and those values are not always consistent across + * various font formats. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Prefer the auto-hinter over the font's native hinter. See also the + * note below. + * + * FT_LOAD_PEDANTIC :: + * Make the font driver perform pedantic verifications during glyph + * loading and hinting. This is mostly used to detect broken glyphs in + * fonts. By default, FreeType tries to handle broken fonts also. + * + * In particular, errors from the TrueType bytecode engine are not + * passed to the application if this flag is not set; this might result + * in partially hinted or distorted glyphs in case a glyph's bytecode + * is buggy. + * + * FT_LOAD_NO_RECURSE :: + * Don't load composite glyphs recursively. Instead, the font driver + * fills the `num_subglyph` and `subglyphs` values of the glyph slot; + * it also sets `glyph->format` to @FT_GLYPH_FORMAT_COMPOSITE. The + * description of subglyphs can then be accessed with + * @FT_Get_SubGlyph_Info. + * + * Don't use this flag for retrieving metrics information since some + * font drivers only return rudimentary data. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Ignore the transform matrix set by @FT_Set_Transform. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Keep `linearHoriAdvance` and `linearVertAdvance` fields of + * @FT_GlyphSlotRec in font units. See @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable the auto-hinter. See also the note below. + * + * FT_LOAD_COLOR :: + * Load colored glyphs. There are slight differences depending on the + * font format. + * + * [Since 2.5] Load embedded color bitmap images. The resulting color + * bitmaps, if available, will have the @FT_PIXEL_MODE_BGRA format, + * with pre-multiplied color channels. If the flag is not set and + * color bitmaps are found, they are converted to 256-level gray + * bitmaps, using the @FT_PIXEL_MODE_GRAY format. + * + * [Since 2.10, experimental] If the glyph index contains an entry in + * the face's 'COLR' table with a 'CPAL' palette table (as defined in + * the OpenType specification), make @FT_Render_Glyph provide a default + * blending of the color glyph layers associated with the glyph index, + * using the same bitmap format as embedded color bitmap images. This + * is mainly for convenience; for full control of color layers use + * @FT_Get_Color_Glyph_Layer and FreeType's color functions like + * @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering + * so that the client application can handle blending by itself. + * + * FT_LOAD_COMPUTE_METRICS :: + * [Since 2.6.1] Compute glyph metrics from the glyph data, without the + * use of bundled metrics tables (for example, the 'hdmx' table in + * TrueType fonts). This flag is mainly used by font validating or + * font editing applications, which need to ignore, verify, or edit + * those tables. + * + * Currently, this flag is only implemented for TrueType fonts. + * + * FT_LOAD_BITMAP_METRICS_ONLY :: + * [Since 2.7.1] Request loading of the metrics and bitmap image + * information of a (possibly embedded) bitmap glyph without allocating + * or copying the bitmap image data itself. No effect if the target + * glyph is not a bitmap image. + * + * This flag unsets @FT_LOAD_RENDER. + * + * FT_LOAD_CROP_BITMAP :: + * Ignored. Deprecated. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Ignored. Deprecated. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be used + * at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + * Note that the auto-hinter needs a valid Unicode cmap (either a native + * one or synthesized by FreeType) for producing correct results. If a + * font provides an incorrect mapping (for example, assigning the + * character code U+005A, LATIN CAPITAL LETTER~Z, to a glyph depicting a + * mathematical integral sign), the auto-hinter might produce useless + * results. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE ( 1L << 0 ) +#define FT_LOAD_NO_HINTING ( 1L << 1 ) +#define FT_LOAD_RENDER ( 1L << 2 ) +#define FT_LOAD_NO_BITMAP ( 1L << 3 ) +#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 ) +#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 ) +#define FT_LOAD_CROP_BITMAP ( 1L << 6 ) +#define FT_LOAD_PEDANTIC ( 1L << 7 ) +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 ) +#define FT_LOAD_NO_RECURSE ( 1L << 10 ) +#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) +#define FT_LOAD_MONOCHROME ( 1L << 12 ) +#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) +#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) + /* Bits 16-19 are used by `FT_LOAD_TARGET_` */ +#define FT_LOAD_COLOR ( 1L << 20 ) +#define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) +#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) + + /* */ + + /* used internally only by certain font drivers */ +#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) +#define FT_LOAD_SBITS_ONLY ( 1L << 14 ) + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values to select a specific hinting algorithm for the + * hinter. You should OR one of these values to your `load_flags` when + * calling @FT_Load_Glyph. + * + * Note that a font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * The default hinting algorithm, optimized for standard gray-level + * rendering. For monochrome output, use @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for gray-level modes. Many generated + * glyphs are fuzzier but better resemble their original shape. This + * is achieved by snapping glyphs to the pixel grid only vertically + * (Y-axis), as is done by FreeType's new CFF engine or Microsoft's + * ClearType font renderer. This preserves inter-glyph spacing in + * horizontal text. The snapping is done either by the native font + * driver, if the driver itself and the font support it, or by the + * auto-hinter. + * + * Advance widths are rounded to integer values; however, using the + * `lsb_delta` and `rsb_delta` fields of @FT_GlyphSlotRec, it is + * possible to get fractional advance widths for subpixel positioning + * (which is recommended to use). + * + * If configuration option `AF_CONFIG_OPTION_TT_SIZE_METRICS` is + * active, TrueType-like metrics are used to make this mode behave + * similarly as in unpatched FreeType versions between 2.4.6 and 2.7.1 + * (inclusive). + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * Note that for outline fonts only the TrueType font driver has proper + * monochrome hinting support, provided the TTFs contain hints for B/W + * rendering (which most fonts no longer provide). If these conditions + * are not met it is very likely that you get ugly results at smaller + * sizes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the `FT_LOAD_TARGET_XXX` values in your + * `load_flags`. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode that matches the used algorithm + * best). An exception is `FT_LOAD_TARGET_MONO` since it implies + * @FT_LOAD_MONOCHROME. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the 'light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * ``` + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * ``` + * + * In general, you should stick with one rendering mode. For example, + * switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO + * enforces a lot of recomputation for TrueType fonts, which is slow. + * Another reason is caching: Selecting a different mode usually causes + * changes in both the outlines and the rasterized bitmaps; it is thus + * necessary to empty the cache after a mode switch to avoid false hits. + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /************************************************************************** + * + * @function: + * FT_Set_Transform + * + * @description: + * Set the transformation that is applied to glyph images when they are + * loaded into a glyph slot through @FT_Load_Glyph. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * matrix :: + * A pointer to the transformation's 2x2 matrix. Use `NULL` for the + * identity matrix. + * delta :: + * A pointer to the translation vector. Use `NULL` for the null vector. + * + * @note: + * The transformation is only applied to scalable image formats after the + * glyph has been loaded. It means that hinting is unaltered by the + * transformation and is performed on the character size given in the + * last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. + * + * Note that this also transforms the `face.glyph.advance` field, but + * **not** the values in `face.glyph.metrics`. + */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Render_Mode + * + * @description: + * Render modes supported by FreeType~2. Each mode corresponds to a + * specific type of scanline conversion performed on the outline. + * + * For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode` field + * in the @FT_GlyphSlotRec structure gives the format of the returned + * bitmap. + * + * All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity, + * indicating pixel coverage. Use linear alpha blending and gamma + * correction to correctly render non-monochrome glyph bitmaps onto a + * surface; see @FT_Render_Glyph. + * + * @values: + * FT_RENDER_MODE_NORMAL :: + * Default render mode; it corresponds to 8-bit anti-aliased bitmaps. + * + * FT_RENDER_MODE_LIGHT :: + * This is equivalent to @FT_RENDER_MODE_NORMAL. It is only defined as + * a separate value because render modes are also used indirectly to + * define hinting algorithm selectors. See @FT_LOAD_TARGET_XXX for + * details. + * + * FT_RENDER_MODE_MONO :: + * This mode corresponds to 1-bit bitmaps (with 2~levels of opacity). + * + * FT_RENDER_MODE_LCD :: + * This mode corresponds to horizontal RGB and BGR subpixel displays + * like LCD screens. It produces 8-bit bitmaps that are 3~times the + * width of the original glyph outline in pixels, and which use the + * @FT_PIXEL_MODE_LCD mode. + * + * FT_RENDER_MODE_LCD_V :: + * This mode corresponds to vertical RGB and BGR subpixel displays + * (like PDA screens, rotated LCD displays, etc.). It produces 8-bit + * bitmaps that are 3~times the height of the original glyph outline in + * pixels and use the @FT_PIXEL_MODE_LCD_V mode. + * + * @note: + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h`, which enables patented ClearType-style rendering, the + * LCD-optimized glyph bitmaps should be filtered to reduce color fringes + * inherent to this technology. You can either set up LCD filtering with + * @FT_Library_SetLcdFilter or @FT_Face_Properties, or do the filtering + * yourself. The default FreeType LCD rendering technology does not + * require filtering. + * + * The selected render mode only affects vector glyphs of a font. + * Embedded bitmaps often have a different pixel mode like + * @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform them + * into 8-bit pixmaps. + */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Render_Mode` values instead */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /************************************************************************** + * + * @function: + * FT_Render_Glyph + * + * @description: + * Convert a given glyph image to a bitmap. It does so by inspecting the + * glyph image format, finding the relevant renderer, and invoking it. + * + * @inout: + * slot :: + * A handle to the glyph slot containing the image to convert. + * + * @input: + * render_mode :: + * The render mode used to render the glyph image into a bitmap. See + * @FT_Render_Mode for a list of possible values. + * + * If @FT_RENDER_MODE_NORMAL is used, a previous call of @FT_Load_Glyph + * with flag @FT_LOAD_COLOR makes FT_Render_Glyph provide a default + * blending of colored glyph layers associated with the current glyph + * slot (provided the font contains such layers) instead of rendering + * the glyph slot's outline. This is an experimental feature; see + * @FT_LOAD_COLOR for more information. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling `FT_Render_Glyph`. + * + * When FreeType outputs a bitmap of a glyph, it really outputs an alpha + * coverage map. If a pixel is completely covered by a filled-in + * outline, the bitmap contains 0xFF at that pixel, meaning that + * 0xFF/0xFF fraction of that pixel is covered, meaning the pixel is 100% + * black (or 0% bright). If a pixel is only 50% covered (value 0x80), + * the pixel is made 50% black (50% bright or a middle shade of grey). + * 0% covered means 0% black (100% bright or white). + * + * On high-DPI screens like on smartphones and tablets, the pixels are so + * small that their chance of being completely covered and therefore + * completely black are fairly good. On the low-DPI screens, however, + * the situation is different. The pixels are too large for most of the + * details of a glyph and shades of gray are the norm rather than the + * exception. + * + * This is relevant because all our screens have a second problem: they + * are not linear. 1~+~1 is not~2. Twice the value does not result in + * twice the brightness. When a pixel is only 50% covered, the coverage + * map says 50% black, and this translates to a pixel value of 128 when + * you use 8~bits per channel (0-255). However, this does not translate + * to 50% brightness for that pixel on our sRGB and gamma~2.2 screens. + * Due to their non-linearity, they dwell longer in the darks and only a + * pixel value of about 186 results in 50% brightness -- 128 ends up too + * dark on both bright and dark backgrounds. The net result is that dark + * text looks burnt-out, pixely and blotchy on bright background, bright + * text too frail on dark backgrounds, and colored text on colored + * background (for example, red on green) seems to have dark halos or + * 'dirt' around it. The situation is especially ugly for diagonal stems + * like in 'w' glyph shapes where the quality of FreeType's anti-aliasing + * depends on the correct display of grays. On high-DPI screens where + * smaller, fully black pixels reign supreme, this doesn't matter, but on + * our low-DPI screens with all the gray shades, it does. 0% and 100% + * brightness are the same things in linear and non-linear space, just + * all the shades in-between aren't. + * + * The blending function for placing text over a background is + * + * ``` + * dst = alpha * src + (1 - alpha) * dst , + * ``` + * + * which is known as the OVER operator. + * + * To correctly composite an antialiased pixel of a glyph onto a surface, + * + * 1. take the foreground and background colors (e.g., in sRGB space) + * and apply gamma to get them in a linear space, + * + * 2. use OVER to blend the two linear colors using the glyph pixel + * as the alpha value (remember, the glyph bitmap is an alpha coverage + * bitmap), and + * + * 3. apply inverse gamma to the blended pixel and write it back to + * the image. + * + * Internal testing at Adobe found that a target inverse gamma of~1.8 for + * step~3 gives good results across a wide range of displays with an sRGB + * gamma curve or a similar one. + * + * This process can cost performance. There is an approximation that + * does not need to know about the background color; see + * https://bel.fi/alankila/lcd/ and + * https://bel.fi/alankila/lcd/alpcor.html for details. + * + * **ATTENTION**: Linear blending is even more important when dealing + * with subpixel-rendered glyphs to prevent color-fringing! A + * subpixel-rendered glyph must first be filtered with a filter that + * gives equal weight to the three color primaries and does not exceed a + * sum of 0x100, see section @lcd_rendering. Then the only difference to + * gray linear blending is that subpixel-rendered linear blending is done + * 3~times per pixel: red foreground subpixel to red background subpixel + * and so on for green and blue. + */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /************************************************************************** + * + * @enum: + * FT_Kerning_Mode + * + * @description: + * An enumeration to specify the format of kerning values returned by + * @FT_Get_Kerning. + * + * @values: + * FT_KERNING_DEFAULT :: + * Return grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNFITTED :: + * Return un-grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNSCALED :: + * Return the kerning vector in original font units. + * + * @note: + * `FT_KERNING_DEFAULT` returns full pixel values; it also makes FreeType + * heuristically scale down kerning distances at small ppem values so + * that they don't become too big. + * + * Both `FT_KERNING_DEFAULT` and `FT_KERNING_UNFITTED` use the current + * horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to + * convert font units to pixels. + */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Kerning_Mode` values instead */ +#define ft_kerning_default FT_KERNING_DEFAULT +#define ft_kerning_unfitted FT_KERNING_UNFITTED +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /************************************************************************** + * + * @function: + * FT_Get_Kerning + * + * @description: + * Return the kerning vector between two glyphs of the same face. + * + * @input: + * face :: + * A handle to a source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * kern_mode :: + * See @FT_Kerning_Mode for more information. Determines the scale and + * dimension of the returned kerning vector. + * + * @output: + * akerning :: + * The kerning vector. This is either in font units, fractional pixels + * (26.6 format), or pixels for scalable formats, and in pixels for + * fixed-sizes formats. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Only horizontal layouts (left-to-right & right-to-left) are supported + * by this method. Other layouts, or more sophisticated kernings, are + * out of the scope of this API function -- they can be implemented + * through format-specific interfaces. + * + * Kerning for OpenType fonts implemented in a 'GPOS' table is not + * supported; use @FT_HAS_KERNING to find out whether a font has data + * that can be extracted with `FT_Get_Kerning`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Track_Kerning + * + * @description: + * Return the track kerning for a given face object at a given size. + * + * @input: + * face :: + * A handle to a source face object. + * + * point_size :: + * The point size in 16.16 fractional points. + * + * degree :: + * The degree of tightness. Increasingly negative values represent + * tighter track kerning, while increasingly positive values represent + * looser track kerning. Value zero means no track kerning. + * + * @output: + * akerning :: + * The kerning in 16.16 fractional points, to be uniformly applied + * between all glyphs. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Currently, only the Type~1 font driver supports track kerning, using + * data from AFM files (if attached with @FT_Attach_File or + * @FT_Attach_Stream). + * + * Only very few AFM files come with track kerning data; please refer to + * Adobe's AFM specification for more details. + */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph_Name + * + * @description: + * Retrieve the ASCII name of a given glyph in a face. This only works + * for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. + * + * @input: + * face :: + * A handle to a source face object. + * + * glyph_index :: + * The glyph index. + * + * buffer_max :: + * The maximum number of bytes available in the buffer. + * + * @output: + * buffer :: + * A pointer to a target buffer where the name is copied to. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error is returned if the face doesn't provide glyph names or if the + * glyph index is invalid. In all cases of failure, the first byte of + * `buffer` is set to~0 to indicate an empty name. + * + * The glyph name is truncated to fit within the buffer if it is too + * long. The returned string is always zero-terminated. + * + * Be aware that FreeType reorders glyph indices internally so that glyph + * index~0 always corresponds to the 'missing glyph' (called '.notdef'). + * + * This function always returns an error if the config macro + * `FT_CONFIG_OPTION_NO_GLYPH_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /************************************************************************** + * + * @function: + * FT_Get_Postscript_Name + * + * @description: + * Retrieve the ASCII PostScript name of a given face, if available. + * This only works with PostScript, TrueType, and OpenType fonts. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to the face's PostScript name. `NULL` if unavailable. + * + * @note: + * The returned pointer is owned by the face and is destroyed with it. + * + * For variation fonts, this string changes if you select a different + * instance, and you have to call `FT_Get_PostScript_Name` again to + * retrieve it. FreeType follows Adobe TechNote #5902, 'Generating + * PostScript Names for Fonts Using OpenType Font Variations'. + * + * https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html + * + * [Since 2.9] Special PostScript names for named instances are only + * returned if the named instance is set with @FT_Set_Named_Instance (and + * the font has corresponding entries in its 'fvar' table). If + * @FT_IS_VARIATION returns true, the algorithmically derived PostScript + * name is provided, not looking up special entries for named instances. + */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Select_Charmap + * + * @description: + * Select a given charmap by its encoding tag (as listed in + * `freetype.h`). + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * encoding :: + * A handle to the selected encoding. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if no charmap in the face corresponds + * to the encoding queried here. + * + * Because many fonts contain more than a single cmap for Unicode + * encoding, this function has some special code to select the one that + * covers Unicode best ('best' in the sense that a UCS-4 cmap is + * preferred to a UCS-2 cmap). It is thus preferable to @FT_Set_Charmap + * in this case. + */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /************************************************************************** + * + * @function: + * FT_Set_Charmap + * + * @description: + * Select a given charmap for character code to glyph index mapping. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * charmap :: + * A handle to the selected charmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if the charmap is not part of the face + * (i.e., if it is not listed in the `face->charmaps` table). + * + * It also fails if an OpenType type~14 charmap is selected (which + * doesn't map character codes to glyph indices at all). + */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap` belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Char_Index + * + * @description: + * Return the glyph index of a given character code. This function uses + * the currently selected charmap to do the mapping. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. If + * the first glyph is not named '.notdef', then for Type~1 and Type~42 + * fonts, '.notdef' will be moved into the glyph ID~0 position, and + * whatever was there will be moved to the position '.notdef' had. For + * Type~1 fonts, if there is no '.notdef' glyph at all, then one will be + * created at index~0 and whatever was there will be moved to the last + * index -- Type~42 fonts are considered invalid under this condition. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Get_First_Char + * + * @description: + * Return the first character code in the current charmap of a given + * face, together with its corresponding glyph index. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * agindex :: + * Glyph index of first character code. 0~if charmap is empty. + * + * @return: + * The charmap's first character code. + * + * @note: + * You should use this function together with @FT_Get_Next_Char to parse + * all character codes available in a given charmap. The code should + * look like this: + * + * ``` + * FT_ULong charcode; + * FT_UInt gindex; + * + * + * charcode = FT_Get_First_Char( face, &gindex ); + * while ( gindex != 0 ) + * { + * ... do something with (charcode,gindex) pair ... + * + * charcode = FT_Get_Next_Char( face, charcode, &gindex ); + * } + * ``` + * + * Be aware that character codes can have values up to 0xFFFFFFFF; this + * might happen for non-Unicode or malformed cmaps. However, even with + * regular Unicode encoding, so-called 'last resort fonts' (using SFNT + * cmap format 13, see function @FT_Get_CMap_Format) normally have + * entries for all Unicode characters up to 0x1FFFFF, which can cause *a + * lot* of iterations. + * + * Note that `*agindex` is set to~0 if the charmap is empty. The result + * itself can be~0 in two cases: if the charmap is empty or if the + * value~0 is the first valid character code. + */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Get_Next_Char + * + * @description: + * Return the next character code in the current charmap of a given face + * following the value `char_code`, as well as the corresponding glyph + * index. + * + * @input: + * face :: + * A handle to the source face object. + * + * char_code :: + * The starting character code. + * + * @output: + * agindex :: + * Glyph index of next character code. 0~if charmap is empty. + * + * @return: + * The charmap's next character code. + * + * @note: + * You should use this function with @FT_Get_First_Char to walk over all + * character codes available in a given charmap. See the note for that + * function for a simple code example. + * + * Note that `*agindex` is set to~0 when there are no more codes in the + * charmap. + */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Face_Properties + * + * @description: + * Set or override certain (library or module-wide) properties on a + * face-by-face basis. Useful for finer-grained control and avoiding + * locks on shared structures (threads can modify their own faces as they + * see fit). + * + * Contrary to @FT_Property_Set, this function uses @FT_Parameter so that + * you can pass multiple properties to the target face in one call. Note + * that only a subset of the available properties can be controlled. + * + * * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the + * property `no-stem-darkening` provided by the 'autofit', 'cff', + * 'type1', and 't1cid' modules; see @no-stem-darkening). + * + * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding + * to function @FT_Library_SetLcdFilterWeights). + * + * * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID + * 'random' operator, corresponding to the `random-seed` property + * provided by the 'cff', 'type1', and 't1cid' modules; see + * @random-seed). + * + * Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the + * option and use the library or module default again. + * + * @input: + * face :: + * A handle to the source face object. + * + * num_properties :: + * The number of properties that follow. + * + * properties :: + * A handle to an @FT_Parameter array with `num_properties` elements. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * Here is an example that sets three properties. You must define + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` to make the LCD filter examples + * work. + * + * ``` + * FT_Parameter property1; + * FT_Bool darken_stems = 1; + * + * FT_Parameter property2; + * FT_LcdFiveTapFilter custom_weight = + * { 0x11, 0x44, 0x56, 0x44, 0x11 }; + * + * FT_Parameter property3; + * FT_Int32 random_seed = 314159265; + * + * FT_Parameter properties[3] = { property1, + * property2, + * property3 }; + * + * + * property1.tag = FT_PARAM_TAG_STEM_DARKENING; + * property1.data = &darken_stems; + * + * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property2.data = custom_weight; + * + * property3.tag = FT_PARAM_TAG_RANDOM_SEED; + * property3.data = &random_seed; + * + * FT_Face_Properties( face, 3, properties ); + * ``` + * + * The next example resets a single property to its default value. + * + * ``` + * FT_Parameter property; + * + * + * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.data = NULL; + * + * FT_Face_Properties( face, 1, &property ); + * ``` + * + * @since: + * 2.8 + * + */ + FT_EXPORT( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ); + + + /************************************************************************** + * + * @function: + * FT_Get_Name_Index + * + * @description: + * Return the glyph index of a given glyph name. + * + * @input: + * face :: + * A handle to the source face object. + * + * glyph_name :: + * The glyph name. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************** + * + * @enum: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants describing subglyphs. Please refer to the 'glyf' + * table description in the OpenType specification for the meaning of the + * various flags (which get synthesized for non-OpenType subglyphs). + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************** + * + * @function: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format` is @FT_GLYPH_FORMAT_COMPOSITE; an error is returned + * otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs`. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1`, `*p_arg2`, and `*p_transform` must be + * interpreted depending on the flags returned in `*p_flags`. See the + * OpenType specification for details. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /************************************************************************** + * + * @section: + * layer_management + * + * @title: + * Glyph Layer Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'COLR' table data. + * + * @description: + * The functions described here allow access of colored glyph layer data + * in OpenType's 'COLR' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_LayerIterator + * + * @description: + * This iterator object is needed for @FT_Get_Color_Glyph_Layer. + * + * @fields: + * num_layers :: + * The number of glyph layers for the requested glyph index. Will be + * set by @FT_Get_Color_Glyph_Layer. + * + * layer :: + * The current layer. Will be set by @FT_Get_Color_Glyph_Layer. + * + * p :: + * An opaque pointer into 'COLR' table data. The caller must set this + * to `NULL` before the first call of @FT_Get_Color_Glyph_Layer. + */ + typedef struct FT_LayerIterator_ + { + FT_UInt num_layers; + FT_UInt layer; + FT_Byte* p; + + } FT_LayerIterator; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Layer + * + * @description: + * This is an interface to the 'COLR' table in OpenType fonts to + * iteratively retrieve the colored glyph layers associated with the + * current glyph slot. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/colr + * + * The glyph layer data for a given glyph index, if present, provides an + * alternative, multi-colour glyph representation: Instead of rendering + * the outline or bitmap with the given glyph index, glyphs with the + * indices and colors returned by this function are rendered layer by + * layer. + * + * The returned elements are ordered in the z~direction from bottom to + * top; the 'n'th element should be rendered with the associated palette + * color and blended on top of the already rendered layers (elements 0, + * 1, ..., n-1). + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @inout: + * iterator :: + * An @FT_LayerIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * aglyph_index :: + * The glyph index of the current layer. + * + * acolor_index :: + * The color index into the font face's color palette of the current + * layer. The value 0xFFFF is special; it doesn't reference a palette + * entry but indicates that the text foreground color should be used + * instead (to be set up by the application outside of FreeType). + * + * The color palette can be retrieved with @FT_Palette_Select. + * + * @return: + * Value~1 if everything is OK. If there are no more layers (or if there + * are no layers at all), value~0 gets returned. In case of an error, + * value~0 is returned also. + * + * @note: + * This function is necessary if you want to handle glyph layers by + * yourself. In particular, functions that operate with @FT_GlyphRec + * objects (like @FT_Get_Glyph or @FT_Glyph_To_Bitmap) don't have access + * to this information. + * + * Note that @FT_Render_Glyph is able to handle colored glyph layers + * automatically if the @FT_LOAD_COLOR flag is passed to a previous call + * to @FT_Load_Glyph. [This is an experimental feature.] + * + * @example: + * ``` + * FT_Color* palette; + * FT_LayerIterator iterator; + * + * FT_Bool have_layers; + * FT_UInt layer_glyph_index; + * FT_UInt layer_color_index; + * + * + * error = FT_Palette_Select( face, palette_index, &palette ); + * if ( error ) + * palette = NULL; + * + * iterator.p = NULL; + * have_layers = FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ); + * + * if ( palette && have_layers ) + * { + * do + * { + * FT_Color layer_color; + * + * + * if ( layer_color_index == 0xFFFF ) + * layer_color = text_foreground_color; + * else + * layer_color = palette[layer_color_index]; + * + * // Load and render glyph `layer_glyph_index', then + * // blend resulting pixmap (using color `layer_color') + * // with previously created pixmaps. + * + * } while ( FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ) ); + * } + * ``` + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Layer( FT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @section: + * base_interface + * + */ + + /************************************************************************** + * + * @enum: + * FT_FSTYPE_XXX + * + * @description: + * A list of bit flags used in the `fsType` field of the OS/2 table in a + * TrueType or OpenType font and the `FSType` entry in a PostScript font. + * These bit flags are returned by @FT_Get_FSType_Flags; they inform + * client applications of embedding and subsetting restrictions + * associated with a font. + * + * See + * https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf + * for more details. + * + * @values: + * FT_FSTYPE_INSTALLABLE_EMBEDDING :: + * Fonts with no fsType bit set may be embedded and permanently + * installed on the remote system by an application. + * + * FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: + * Fonts that have only this bit set must not be modified, embedded or + * exchanged in any manner without first obtaining permission of the + * font software copyright owner. + * + * FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: + * The font may be embedded and temporarily loaded on the remote + * system. Documents containing Preview & Print fonts must be opened + * 'read-only'; no edits can be applied to the document. + * + * FT_FSTYPE_EDITABLE_EMBEDDING :: + * The font may be embedded but must only be installed temporarily on + * other systems. In contrast to Preview & Print fonts, documents + * containing editable fonts may be opened for reading, editing is + * permitted, and changes may be saved. + * + * FT_FSTYPE_NO_SUBSETTING :: + * The font may not be subsetted prior to embedding. + * + * FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: + * Only bitmaps contained in the font may be embedded; no outline data + * may be embedded. If there are no bitmaps available in the font, + * then the font is unembeddable. + * + * @note: + * The flags are ORed together, thus more than a single value can be + * returned. + * + * While the `fsType` flags can indicate that a font may be embedded, a + * license with the font vendor may be separately required to use the + * font in this way. + */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /************************************************************************** + * + * @function: + * FT_Get_FSType_Flags + * + * @description: + * Return the `fsType` flags for a font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * The `fsType` flags, see @FT_FSTYPE_XXX. + * + * @note: + * Use this function rather than directly reading the `fs_type` field in + * the @PS_FontInfoRec structure, which is only guaranteed to return the + * correct results for Type~1 fonts. + * + * @since: + * 2.3.8 + */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /************************************************************************** + * + * @section: + * glyph_variants + * + * @title: + * Unicode Variation Sequences + * + * @abstract: + * The FreeType~2 interface to Unicode Variation Sequences (UVS), using + * the SFNT cmap format~14. + * + * @description: + * Many characters, especially for CJK scripts, have variant forms. They + * are a sort of grey area somewhere between being totally irrelevant and + * semantically distinct; for this reason, the Unicode consortium decided + * to introduce Variation Sequences (VS), consisting of a Unicode base + * character and a variation selector instead of further extending the + * already huge number of characters. + * + * Unicode maintains two different sets, namely 'Standardized Variation + * Sequences' and registered 'Ideographic Variation Sequences' (IVS), + * collected in the 'Ideographic Variation Database' (IVD). + * + * https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt + * https://unicode.org/reports/tr37/ https://unicode.org/ivd/ + * + * To date (January 2017), the character with the most ideographic + * variations is U+9089, having 32 such IVS. + * + * Three Mongolian Variation Selectors have the values U+180B-U+180D; 256 + * generic Variation Selectors are encoded in the ranges U+FE00-U+FE0F + * and U+E0100-U+E01EF. IVS currently use Variation Selectors from the + * range U+E0100-U+E01EF only. + * + * A VS consists of the base character value followed by a single + * Variation Selector. For example, to get the first variation of + * U+9089, you have to write the character sequence `U+9089 U+E0100`. + * + * Adobe and MS decided to support both standardized and ideographic VS + * with a new cmap subtable (format~14). It is an odd subtable because + * it is not a mapping of input code points to glyphs, but contains lists + * of all variations supported by the font. + * + * A variation may be either 'default' or 'non-default' for a given font. + * A default variation is the one you will get for that code point if you + * look it up in the standard Unicode cmap. A non-default variation is a + * different glyph. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIndex + * + * @description: + * Return the glyph index of a given character code as modified by the + * variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code point in Unicode. + * + * variantSelector :: + * The Unicode code point of the variation selector. + * + * @return: + * The glyph index. 0~means either 'undefined character code', or + * 'undefined selector code', or 'no variation selector cmap subtable', + * or 'current CharMap is not Unicode'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. + * + * This function is only meaningful if + * a) the font has a variation selector cmap sub table, and + * b) the current charmap has a Unicode encoding. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIsDefault + * + * @description: + * Check whether this variation of this Unicode character is the one to + * be found in the charmap. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * variantSelector :: + * The Unicode codepoint of the variation selector. + * + * @return: + * 1~if found in the standard (Unicode) cmap, 0~if found in the variation + * selector cmap, or -1 if it is not a variation. + * + * @note: + * This function is only meaningful if the font has a variation selector + * cmap subtable. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantSelectors + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found in + * the font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to an array of selector code points, or `NULL` if there is + * no valid variation selector cmap subtable. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantsOfChar + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found for + * the specified character code. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * @return: + * A pointer to an array of variation selector code points that are + * active for the given character, or `NULL` if the corresponding list is + * empty. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharsOfVariant + * + * @description: + * Return a zero-terminated list of Unicode character codes found for the + * specified variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * variantSelector :: + * The variation selector code point in Unicode. + * + * @return: + * A list of all the code points that are specified by this selector + * (both default and non-default codes are returned) or `NULL` if there + * is no valid cmap or the variation selector is invalid. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @section: + * computations + * + * @title: + * Computations + * + * @abstract: + * Crunching fixed numbers and vectors. + * + * @description: + * This section contains various functions used to perform computations + * on 16.16 fixed-float numbers or 2d vectors. + * + * **Attention**: Most arithmetic functions take `FT_Long` as arguments. + * For historical reasons, FreeType was designed under the assumption + * that `FT_Long` is a 32-bit integer; results can thus be undefined if + * the arguments don't fit into 32 bits. + * + * @order: + * FT_MulDiv + * FT_MulFix + * FT_DivFix + * FT_RoundFix + * FT_CeilFix + * FT_FloorFix + * FT_Vector_Transform + * FT_Matrix_Multiply + * FT_Matrix_Invert + * + */ + + + /************************************************************************** + * + * @function: + * FT_MulDiv + * + * @description: + * Compute `(a*b)/c` with maximum accuracy, using a 64-bit intermediate + * integer whenever necessary. + * + * This function isn't necessarily as fast as some processor-specific + * operations, but is at least completely portable. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. + * + * c :: + * The divisor. + * + * @return: + * The result of `(a*b)/c`. This function never traps when trying to + * divide by zero; it simply returns 'MaxInt' or 'MinInt' depending on + * the signs of `a` and `b`. + */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /************************************************************************** + * + * @function: + * FT_MulFix + * + * @description: + * Compute `(a*b)/0x10000` with maximum accuracy. Its main use is to + * multiply a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. Use a 16.16 factor here whenever possible + * (see note below). + * + * @return: + * The result of `(a*b)/0x10000`. + * + * @note: + * This function has been optimized for the case where the absolute value + * of `a` is less than 2048, and `b` is a 16.16 scaling factor. As this + * happens mainly when scaling from notional units to fractional pixels + * in FreeType, it resulted in noticeable speed improvements between + * versions 2.x and 1.x. + * + * As a conclusion, always try to place a 16.16 factor as the _second_ + * argument of this function; this can make a great difference. + */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_DivFix + * + * @description: + * Compute `(a*0x10000)/b` with maximum accuracy. Its main use is to + * divide a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The numerator. + * + * b :: + * The denominator. Use a 16.16 factor here. + * + * @return: + * The result of `(a*0x10000)/b`. + */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_RoundFix + * + * @description: + * Round a 16.16 fixed number. + * + * @input: + * a :: + * The number to be rounded. + * + * @return: + * `a` rounded to the nearest 16.16 fixed integer, halfway cases away + * from zero. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_CeilFix + * + * @description: + * Compute the smallest following integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the ceiling function is to be computed. + * + * @return: + * `a` rounded towards plus infinity. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_FloorFix + * + * @description: + * Compute the largest previous integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the floor function is to be computed. + * + * @return: + * `a` rounded towards minus infinity. + */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Transform + * + * @description: + * Transform a single vector through a 2x2 matrix. + * + * @inout: + * vector :: + * The target vector to transform. + * + * @input: + * matrix :: + * A pointer to the source 2x2 matrix. + * + * @note: + * The result is undefined if either `vector` or `matrix` is invalid. + */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @section: + * version + * + * @title: + * FreeType Version + * + * @abstract: + * Functions and macros related to FreeType versions. + * + * @description: + * Note that those functions and macros are of limited use because even a + * new release of FreeType with only documentation changes increases the + * version number. + * + * @order: + * FT_Library_Version + * + * FREETYPE_MAJOR + * FREETYPE_MINOR + * FREETYPE_PATCH + * + * FT_Face_CheckTrueTypePatents + * FT_Face_SetUnpatentedHinting + * + */ + + + /************************************************************************** + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. Use + * @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: + * The major version number. + * FREETYPE_MINOR :: + * The minor version number. + * FREETYPE_PATCH :: + * The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library with + * the 'libtool' package is _not_ controlled by these three macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 10 +#define FREETYPE_PATCH 0 + + + /************************************************************************** + * + * @function: + * FT_Library_Version + * + * @description: + * Return the version of the FreeType library being used. This is useful + * when dynamically linking to the library, since one cannot use the + * macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and @FREETYPE_PATCH. + * + * @input: + * library :: + * A source library handle. + * + * @output: + * amajor :: + * The major version number. + * + * aminor :: + * The minor version number. + * + * apatch :: + * The patch version number. + * + * @note: + * The reason why this function takes a `library` argument is because + * certain programs implement library initialization in a custom way that + * doesn't use @FT_Init_FreeType. + * + * In such cases, the library version might not be available before the + * library object has been created. + */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /************************************************************************** + * + * @function: + * FT_Face_CheckTrueTypePatents + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_SetUnpatentedHinting + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * value :: + * New boolean setting. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* FREETYPE_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftadvanc.h b/linux/include/freetype2/freetype/ftadvanc.h new file mode 100644 index 00000000..95c38f92 --- /dev/null +++ b/linux/include/freetype2/freetype/ftadvanc.h @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * ftadvanc.h + * + * Quick computation of advance widths (specification only). + * + * Copyright (C) 2008-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTADVANC_H_ +#define FTADVANC_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + * + * @order: + * FT_Get_Advance + * FT_Get_Advances + * + */ + + + /************************************************************************** + * + * @enum: + * FT_ADVANCE_FLAG_FAST_ONLY + * + * @description: + * A bit-flag to be OR-ed with the `flags` parameter of the + * @FT_Get_Advance and @FT_Get_Advances functions. + * + * If set, it indicates that you want these functions to fail if the + * corresponding hinting mode or font driver doesn't allow for very quick + * advance computation. + * + * Typically, glyphs that are either unscaled, unhinted, bitmapped, or + * light-hinted can have their advance width computed very quickly. + * + * Normal and bytecode hinted modes that require loading, scaling, and + * hinting of the glyph outline, are extremely slow by comparison. + */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000L + + + /************************************************************************** + * + * @function: + * FT_Get_Advance + * + * @description: + * Retrieve the advance value of a given glyph outline in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * gindex :: + * The glyph index. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph, used to determine what kind of advances you need. + * @output: + * padvance :: + * The advance value. If scaling is performed (based on the value of + * `load_flags`), the advance value is in 16.16 format. Otherwise, it + * is in font units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, this is the vertical advance + * corresponding to a vertical layout. Otherwise, it is the horizontal + * advance in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * A scaled advance is returned in 16.16 format but isn't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /************************************************************************** + * + * @function: + * FT_Get_Advances + * + * @description: + * Retrieve the advance values of several glyph outlines in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * start :: + * The first glyph index. + * + * count :: + * The number of advance values you want to retrieve. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph. + * + * @output: + * padvance :: + * The advance values. This array, to be provided by the caller, must + * contain at least `count` elements. + * + * If scaling is performed (based on the value of `load_flags`), the + * advance values are in 16.16 format. Otherwise, they are in font + * units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, these are the vertical advances + * corresponding to a vertical layout. Otherwise, they are the + * horizontal advances in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * Scaled advances are returned in 16.16 format but aren't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + + /* */ + + +FT_END_HEADER + +#endif /* FTADVANC_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftbbox.h b/linux/include/freetype2/freetype/ftbbox.h new file mode 100644 index 00000000..22da70c0 --- /dev/null +++ b/linux/include/freetype2/freetype/ftbbox.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbbox.h + * + * FreeType exact bbox computation (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component has a _single_ role: to compute exact outline bounding + * boxes. + * + * It is separated from the rest of the engine for various technical + * reasons. It may well be integrated in 'ftoutln' later. + * + */ + + +#ifndef FTBBOX_H_ +#define FTBBOX_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_BBox + * + * @description: + * Compute the exact bounding box of an outline. This is slower than + * computing the control box. However, it uses an advanced algorithm + * that returns _very_ quickly when the two boxes coincide. Otherwise, + * the outline Bezier arcs are traversed to extract their extrema. + * + * @input: + * outline :: + * A pointer to the source outline. + * + * @output: + * abbox :: + * The outline's exact bounding box. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get + * reasonable values for the BBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the BBox, which can be + * eventually converted back to font units. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBBOX_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/ftbdf.h b/linux/include/freetype2/freetype/ftbdf.h new file mode 100644 index 00000000..1c46da59 --- /dev/null +++ b/linux/include/freetype2/freetype/ftbdf.h @@ -0,0 +1,213 @@ +/**************************************************************************** + * + * ftbdf.h + * + * FreeType API for accessing BDF-specific strings (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBDF_H_ +#define FTBDF_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bdf_fonts + * + * @title: + * BDF and PCF Files + * + * @abstract: + * BDF and PCF specific API. + * + * @description: + * This section contains the declaration of functions specific to BDF and + * PCF fonts. + * + */ + + + /************************************************************************** + * + * @enum: + * BDF_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /************************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given BDF/PCF + * property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /************************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. May be + * `NULL`, indicating an empty string. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to the BDF + * specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: + * A handle to the input face. + * + * name :: + * The property name. + * + * @output: + * aproperty :: + * The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A 'property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props` array within a `FontRec` structure of a PCF font. + * + * Integer properties are always stored as 'signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type` is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* FTBDF_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftbitmap.h b/linux/include/freetype2/freetype/ftbitmap.h new file mode 100644 index 00000000..a6acdb96 --- /dev/null +++ b/linux/include/freetype2/freetype/ftbitmap.h @@ -0,0 +1,330 @@ +/**************************************************************************** + * + * ftbitmap.h + * + * FreeType utility functions for bitmaps (specification). + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBITMAP_H_ +#define FTBITMAP_H_ + + +#include +#include FT_FREETYPE_H +#include FT_COLOR_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bitmap_handling + * + * @title: + * Bitmap Handling + * + * @abstract: + * Handling FT_Bitmap objects. + * + * @description: + * This section contains functions for handling @FT_Bitmap objects, + * automatically adjusting the target's bitmap buffer size as needed. + * + * Note that none of the functions changes the bitmap's 'flow' (as + * indicated by the sign of the `pitch` field in @FT_Bitmap). + * + * To set the flow, assign an appropriate positive or negative value to + * the `pitch` field of the target @FT_Bitmap object after calling + * @FT_Bitmap_Init but before calling any of the other functions + * described here. + */ + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Init + * + * @description: + * Initialize a pointer to an @FT_Bitmap structure. + * + * @inout: + * abitmap :: + * A pointer to the bitmap structure. + * + * @note: + * A deprecated name for the same function is `FT_Bitmap_New`. + */ + FT_EXPORT( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ); + + + /* deprecated */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Copy + * + * @description: + * Copy a bitmap into another one. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * A handle to the source bitmap. + * + * @output: + * target :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Embolden + * + * @description: + * Embolden a bitmap. The new bitmap will be about `xStrength` pixels + * wider and `yStrength` pixels higher. The left and bottom borders are + * kept unchanged. + * + * @input: + * library :: + * A handle to a library object. + * + * xStrength :: + * How strong the glyph is emboldened horizontally. Expressed in 26.6 + * pixel format. + * + * yStrength :: + * How strong the glyph is emboldened vertically. Expressed in 26.6 + * pixel format. + * + * @inout: + * bitmap :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The current implementation restricts `xStrength` to be less than or + * equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. + * + * If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, you + * should call @FT_GlyphSlot_Own_Bitmap on the slot first. + * + * Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format are + * converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp). + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Convert + * + * @description: + * Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp to + * a bitmap object with depth 8bpp, making the number of used bytes per + * line (a.k.a. the 'pitch') a multiple of `alignment`. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap. + * + * alignment :: + * The pitch of the bitmap is a multiple of this argument. Common + * values are 1, 2, or 4. + * + * @output: + * target :: + * The target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * It is possible to call @FT_Bitmap_Convert multiple times without + * calling @FT_Bitmap_Done (the memory is simply reallocated). + * + * Use @FT_Bitmap_Done to finally remove the bitmap object. + * + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Blend + * + * @description: + * Blend a bitmap onto another bitmap, using a given color. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap, which can have any @FT_Pixel_Mode format. + * + * source_offset :: + * The offset vector to the upper left corner of the source bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * color :: + * The color used to draw `source` onto `target`. + * + * @inout: + * target :: + * A handle to an `FT_Bitmap` object. It should be either initialized + * as empty with a call to @FT_Bitmap_Init, or it should be of type + * @FT_PIXEL_MODE_BGRA. + * + * atarget_offset :: + * The offset vector to the upper left corner of the target bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function doesn't perform clipping. + * + * The bitmap in `target` gets allocated or reallocated as needed; the + * vector `atarget_offset` is updated accordingly. + * + * In case of allocation or reallocation, the bitmap's pitch is set to + * `4 * width`. Both `source` and `target` must have the same bitmap + * flow (as indicated by the sign of the `pitch` field). + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Blend( FT_Library library, + const FT_Bitmap* source, + const FT_Vector source_offset, + FT_Bitmap* target, + FT_Vector *atarget_offset, + FT_Color color ); + + + /************************************************************************** + * + * @function: + * FT_GlyphSlot_Own_Bitmap + * + * @description: + * Make sure that a glyph slot owns `slot->bitmap`. + * + * @input: + * slot :: + * The glyph slot. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is to be used in combination with @FT_Bitmap_Embolden. + */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Done + * + * @description: + * Destroy a bitmap object initialized with @FT_Bitmap_Init. + * + * @input: + * library :: + * A handle to a library object. + * + * bitmap :: + * The bitmap object to be freed. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTBITMAP_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftbzip2.h b/linux/include/freetype2/freetype/ftbzip2.h new file mode 100644 index 00000000..ae88cfdb --- /dev/null +++ b/linux/include/freetype2/freetype/ftbzip2.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbzip2.h + * + * Bzip2-compressed stream support. + * + * Copyright (C) 2010-2019 by + * Joel Klinghed. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBZIP2_H_ +#define FTBZIP2_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * bzip2 + * + * @title: + * BZIP2 Streams + * + * @abstract: + * Using bzip2-compressed font files. + * + * @description: + * This section contains the declaration of Bzip2-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenBzip2 + * + * @description: + * Open a new stream to parse bzip2-compressed font files. This is + * mainly used to support the compressed `*.pcf.bz2` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, bzip2 compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a bzip2 compressed + * stream from it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with bzip2 support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBZIP2_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftcache.h b/linux/include/freetype2/freetype/ftcache.h new file mode 100644 index 00000000..0d589d0b --- /dev/null +++ b/linux/include/freetype2/freetype/ftcache.h @@ -0,0 +1,1088 @@ +/**************************************************************************** + * + * ftcache.h + * + * FreeType Cache subsystem (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCACHE_H_ +#define FTCACHE_H_ + + +#include +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @abstract: + * How to cache face, size, and glyph data with FreeType~2. + * + * @description: + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_` prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert an @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. To monitor termination of face objects, the + * finalizer callback in the `generic` field of the @FT_Face object can + * be used, which might also be used to store the @FTC_FaceID of the + * face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * **persistent**, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may keep + * internally. Failure to do so will lead to incorrect behaviour or even + * crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient to + * call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small bitmaps + * directly. (A small bitmap is one whose metrics and dimensions all fit + * into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * @order: + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined structure + * containing a font file path, and face index. + * + * @note: + * Never use `NULL` as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager that calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even memory + * leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************** + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * @input: + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * @output: + * aface :: + * A new @FT_Face handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The third parameter `req_data` is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer req_data, + FT_Face* aface ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_Manager + * + * @description: + * This object corresponds to one instance of the cache-subsystem. It is + * used to cache one or more @FT_Face objects, along with corresponding + * @FT_Size objects. + * + * The manager intentionally limits the total number of opened @FT_Face + * and @FT_Size objects to control memory usage. See the `max_faces` and + * `max_sizes` parameters of @FTC_Manager_New. + * + * The manager is also used to cache 'nodes' of various types while + * limiting their total memory usage. + * + * All limitations are enforced by keeping lists of managed objects in + * most-recently-used order, and flushing old nodes to make room for new + * ones. + */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /************************************************************************** + * + * @type: + * FTC_Node + * + * @description: + * An opaque handle to a cache node object. Each cache node is + * reference-counted. A node with a count of~0 might be flushed out of a + * full cache whenever a lookup request is performed. + * + * If you look up nodes, you have the ability to 'acquire' them, i.e., to + * increment their reference count. This will prevent the node from + * being flushed out of the cache until you explicitly 'release' it (see + * @FTC_Node_Unref). + * + * See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. + */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /************************************************************************** + * + * @function: + * FTC_Manager_New + * + * @description: + * Create a new cache manager. + * + * @input: + * library :: + * The parent FreeType library handle to use. + * + * max_faces :: + * Maximum number of opened @FT_Face objects managed by this cache + * instance. Use~0 for defaults. + * + * max_sizes :: + * Maximum number of opened @FT_Size objects managed by this cache + * instance. Use~0 for defaults. + * + * max_bytes :: + * Maximum number of bytes to use for cached data nodes. Use~0 for + * defaults. Note that this value does not account for managed + * @FT_Face and @FT_Size objects. + * + * requester :: + * An application-provided callback used to translate face IDs into + * real @FT_Face objects. + * + * req_data :: + * A generic pointer that is passed to the requester each time it is + * called (see @FTC_Face_Requester). + * + * @output: + * amanager :: + * A handle to a new manager object. 0~in case of failure. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Reset + * + * @description: + * Empty a given cache manager. This simply gets rid of all the + * currently cached @FT_Face and @FT_Size objects within the manager. + * + * @inout: + * manager :: + * A handle to the manager. + */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Done + * + * @description: + * Destroy a given manager after emptying it. + * + * @input: + * manager :: + * A handle to the target cache manager object. + */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupFace + * + * @description: + * Retrieve the @FT_Face object that corresponds to a given face ID + * through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * face_id :: + * The ID of the face object. + * + * @output: + * aface :: + * A handle to the face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Face object is always owned by the manager. You + * should never try to discard it yourself. + * + * The @FT_Face object doesn't necessarily have a current size object + * (i.e., face->size can be~0). If you need a specific 'font size', use + * @FTC_Manager_LookupSize instead. + * + * Never change the face's transformation matrix (i.e., never call the + * @FT_Set_Transform function) on a returned face! If you need to + * transform glyphs, do it yourself after glyph loading. + * + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory was available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /************************************************************************** + * + * @struct: + * FTC_ScalerRec + * + * @description: + * A structure used to describe a given character size in either pixels + * or points to the cache manager. See @FTC_Manager_LookupSize. + * + * @fields: + * face_id :: + * The source face ID. + * + * width :: + * The character width. + * + * height :: + * The character height. + * + * pixel :: + * A Boolean. If 1, the `width` and `height` fields are interpreted as + * integer pixel character sizes. Otherwise, they are expressed as + * 1/64th of points. + * + * x_res :: + * Only used when `pixel` is value~0 to indicate the horizontal + * resolution in dpi. + * + * y_res :: + * Only used when `pixel` is value~0 to indicate the vertical + * resolution in dpi. + * + * @note: + * This type is mainly used to retrieve @FT_Size objects through the + * cache manager. + */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /************************************************************************** + * + * @struct: + * FTC_Scaler + * + * @description: + * A handle to an @FTC_ScalerRec structure. + */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupSize + * + * @description: + * Retrieve the @FT_Size object that corresponds to a given + * @FTC_ScalerRec pointer through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * scaler :: + * A scaler handle. + * + * @output: + * asize :: + * A handle to the size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Size object is always owned by the manager. You + * should never try to discard it by yourself. + * + * You can access the parent @FT_Face object simply as `size->face` if + * you need it. Note that this object is also owned by the manager. + * + * @note: + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory is available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /************************************************************************** + * + * @function: + * FTC_Node_Unref + * + * @description: + * Decrement a cache node's internal reference count. When the count + * reaches 0, it is not destroyed but becomes eligible for subsequent + * cache flushes. + * + * @input: + * node :: + * The cache node handle. + * + * manager :: + * The cache manager handle. + */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that a given + * @FTC_FaceID is no longer valid, either because its content changed, or + * because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id`, with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear in + * later lookups with the same `face_id` value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /************************************************************************** + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to hold + * character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means 'no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************** + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + + + /************************************************************************** + * + * @type: + * FTC_ImageCache + * + * @description: + * A handle to a glyph image cache object. They are designed to hold + * many distinct glyph images while not exceeding a certain memory + * threshold. + */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_New + * + * @description: + * Create a new glyph image cache. + * + * @input: + * manager :: + * The parent manager for the image cache. + * + * @output: + * acache :: + * A handle to the new glyph image cache object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_Lookup + * + * @description: + * Retrieve a given glyph image from a glyph image cache. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * type :: + * A pointer to a glyph image type descriptor. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_LookupScaler + * + * @description: + * A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * scaler :: + * A pointer to a scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + * + * Calls to @FT_Set_Char_Size and friends have no effect on cached + * glyphs; you should always use the FreeType cache API instead. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @type: + * FTC_SBit + * + * @description: + * A handle to a small bitmap descriptor. See the @FTC_SBitRec structure + * for details. + */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /************************************************************************** + * + * @struct: + * FTC_SBitRec + * + * @description: + * A very compact structure used to describe a small glyph bitmap. + * + * @fields: + * width :: + * The bitmap width in pixels. + * + * height :: + * The bitmap height in pixels. + * + * left :: + * The horizontal distance from the pen position to the left bitmap + * border (a.k.a. 'left side bearing', or 'lsb'). + * + * top :: + * The vertical distance from the pen position (on the baseline) to the + * upper bitmap border (a.k.a. 'top side bearing'). The distance is + * positive for upwards y~coordinates. + * + * format :: + * The format of the glyph bitmap (monochrome or gray). + * + * max_grays :: + * Maximum gray level value (in the range 1 to~255). + * + * pitch :: + * The number of bytes per bitmap line. May be positive or negative. + * + * xadvance :: + * The horizontal advance width in pixels. + * + * yadvance :: + * The vertical advance height in pixels. + * + * buffer :: + * A pointer to the bitmap pixels. + */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /************************************************************************** + * + * @type: + * FTC_SBitCache + * + * @description: + * A handle to a small bitmap cache. These are special cache objects + * used to store small glyph bitmaps (and anti-aliased pixmaps) in a much + * more efficient way than the traditional glyph image cache implemented + * by @FTC_ImageCache. + */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_New + * + * @description: + * Create a new cache to store small glyph bitmaps. + * + * @input: + * manager :: + * A handle to the source cache manager. + * + * @output: + * acache :: + * A handle to the new sbit cache. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_Lookup + * + * @description: + * Look up a given small glyph bitmap in a given sbit cache and 'lock' it + * to prevent its flushing from the cache until needed. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * type :: + * A pointer to the glyph image type descriptor. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_LookupScaler + * + * @description: + * A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * scaler :: + * A pointer to the scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCACHE_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftchapters.h b/linux/include/freetype2/freetype/ftchapters.h new file mode 100644 index 00000000..2ee26973 --- /dev/null +++ b/linux/include/freetype2/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/linux/include/freetype2/freetype/ftcid.h b/linux/include/freetype2/freetype/ftcid.h new file mode 100644 index 00000000..8eafc1c7 --- /dev/null +++ b/linux/include/freetype2/freetype/ftcid.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * ftcid.h + * + * FreeType API for accessing CID font information (specification). + * + * Copyright (C) 2007-2019 by + * Dereg Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCID_H_ +#define FTCID_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cid_fonts + * + * @title: + * CID Fonts + * + * @abstract: + * CID-keyed font-specific API. + * + * @description: + * This section contains the declaration of CID-keyed font-specific + * functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In contrast + * to the @FT_IS_CID_KEYED macro this function returns successfully also + * for CID-keyed fonts in an SFNT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCID_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftcolor.h b/linux/include/freetype2/freetype/ftcolor.h new file mode 100644 index 00000000..cf180219 --- /dev/null +++ b/linux/include/freetype2/freetype/ftcolor.h @@ -0,0 +1,311 @@ +/**************************************************************************** + * + * ftcolor.h + * + * FreeType's glyph color management (specification). + * + * Copyright (C) 2018-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCOLOR_H_ +#define FTCOLOR_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * color_management + * + * @title: + * Glyph Color Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'CPAL' table data. + * + * @description: + * The functions described here allow access and manipulation of color + * palette entries in OpenType's 'CPAL' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_Color + * + * @description: + * This structure models a BGRA color value of a 'CPAL' palette entry. + * + * The used color space is sRGB; the colors are not pre-multiplied, and + * alpha values must be explicitly set. + * + * @fields: + * blue :: + * Blue value. + * + * green :: + * Green value. + * + * red :: + * Red value. + * + * alpha :: + * Alpha value, giving the red, green, and blue color's opacity. + * + * @since: + * 2.10 + */ + typedef struct FT_Color_ + { + FT_Byte blue; + FT_Byte green; + FT_Byte red; + FT_Byte alpha; + + } FT_Color; + + + /************************************************************************** + * + * @enum: + * FT_PALETTE_XXX + * + * @description: + * A list of bit field constants used in the `palette_flags` array of the + * @FT_Palette_Data structure to indicate for which background a palette + * with a given index is usable. + * + * @values: + * FT_PALETTE_FOR_LIGHT_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a + * light background such as white. + * + * FT_PALETTE_FOR_DARK_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a dark + * background such as black. + * + * @since: + * 2.10 + */ +#define FT_PALETTE_FOR_LIGHT_BACKGROUND 0x01 +#define FT_PALETTE_FOR_DARK_BACKGROUND 0x02 + + + /************************************************************************** + * + * @struct: + * FT_Palette_Data + * + * @description: + * This structure holds the data of the 'CPAL' table. + * + * @fields: + * num_palettes :: + * The number of palettes. + * + * palette_name_ids :: + * A read-only array of palette name IDs with `num_palettes` elements, + * corresponding to entries like 'dark' or 'light' in the font's 'name' + * table. + * + * An empty name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * palette_flags :: + * A read-only array of palette flags with `num_palettes` elements. + * Possible values are an ORed combination of + * @FT_PALETTE_FOR_LIGHT_BACKGROUND and + * @FT_PALETTE_FOR_DARK_BACKGROUND. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * num_palette_entries :: + * The number of entries in a single palette. All palettes have the + * same size. + * + * palette_entry_name_ids :: + * A read-only array of palette entry name IDs with + * `num_palette_entries`. In each palette, entries with the same index + * have the same function. For example, index~0 might correspond to + * string 'outline' in the font's 'name' table to indicate that this + * palette entry is used for outlines, index~1 might correspond to + * 'fill' to indicate the filling color palette entry, etc. + * + * An empty entry name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * @note: + * Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to + * name strings. + * + * @since: + * 2.10 + */ + typedef struct FT_Palette_Data_ { + FT_UShort num_palettes; + const FT_UShort* palette_name_ids; + const FT_UShort* palette_flags; + + FT_UShort num_palette_entries; + const FT_UShort* palette_entry_name_ids; + + } FT_Palette_Data; + + + /************************************************************************** + * + * @function: + * FT_Palette_Data_Get + * + * @description: + * Retrieve the face's color palette data. + * + * @input: + * face :: + * The source face handle. + * + * @output: + * apalette :: + * A pointer to an @FT_Palette_Data structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * All arrays in the returned @FT_Palette_Data structure are read-only. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Select + * + * @description: + * This function has two purposes. + * + * (1) It activates a palette for rendering color glyphs, and + * + * (2) it retrieves all (unmodified) color entries of this palette. This + * function returns a read-write array, which means that a calling + * application can modify the palette entries on demand. + * + * A corollary of (2) is that calling the function, then modifying some + * values, then calling the function again with the same arguments resets + * all color entries to the original 'CPAL' values; all user modifications + * are lost. + * + * @input: + * face :: + * The source face handle. + * + * palette_index :: + * The palette index. + * + * @output: + * apalette :: + * An array of color entries for a palette with index `palette_index`, + * having `num_palette_entries` elements (as found in the + * `FT_Palette_Data` structure). If `apalette` is set to `NULL`, no + * array gets returned (and no color entries can be modified). + * + * In case the font doesn't support color palettes, `NULL` is returned. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The array pointed to by `apalette_entries` is owned and managed by + * FreeType. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Set_Foreground_Color + * + * @description: + * 'COLR' uses palette index 0xFFFF to indicate a 'text foreground + * color'. This function sets this value. + * + * @input: + * face :: + * The source face handle. + * + * foreground_color :: + * An `FT_Color` structure to define the text foreground color. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function isn't called, the text foreground color is set to + * white opaque (BGRA value 0xFFFFFFFF) if + * @FT_PALETTE_FOR_DARK_BACKGROUND is present for the current palette, + * and black opaque (BGRA value 0x000000FF) otherwise, including the case + * that no palette types are available in the 'CPAL' table. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCOLOR_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftdriver.h b/linux/include/freetype2/freetype/ftdriver.h new file mode 100644 index 00000000..497bde9f --- /dev/null +++ b/linux/include/freetype2/freetype/ftdriver.h @@ -0,0 +1,1232 @@ +/**************************************************************************** + * + * ftdriver.h + * + * FreeType API for controlling driver modules (specification only). + * + * Copyright (C) 2017-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTDRIVER_H_ +#define FTDRIVER_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * auto_hinter + * + * @title: + * The auto-hinter + * + * @abstract: + * Controlling the auto-hinting module. + * + * @description: + * While FreeType's auto-hinter doesn't expose API functions by itself, + * it is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * Note that the auto-hinter's module name is 'autofitter' for historical + * reasons. + * + * Available properties are @increase-x-height, @no-stem-darkening + * (experimental), @darkening-parameters (experimental), @warping + * (experimental), @glyph-to-script-map (experimental), @fallback-script + * (experimental), and @default-script (experimental), as documented in + * the @properties section. + * + */ + + + /************************************************************************** + * + * @section: + * cff_driver + * + * @title: + * The CFF driver + * + * @abstract: + * Controlling the CFF driver module. + * + * @description: + * While FreeType's CFF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. + * + * The CFF driver's module name is 'cff'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * + * **Hinting and antialiasing principles of the new engine** + * + * The rasterizer is positioning horizontal features (e.g., ascender + * height & x-height, or crossbars) on the pixel grid and minimizing the + * amount of antialiasing applied to them, while placing vertical + * features (vertical stems) on the pixel grid without hinting, thus + * representing the stem position and weight accurately. Sometimes the + * vertical stems may be only partially black. In this context, + * 'antialiasing' means that stems are not positioned exactly on pixel + * borders, causing a fuzzy appearance. + * + * There are two principles behind this approach. + * + * 1) No hinting in the horizontal direction: Unlike 'superhinted' + * TrueType, which changes glyph widths to accommodate regular + * inter-glyph spacing, Adobe's approach is 'faithful to the design' in + * representing both the glyph width and the inter-glyph spacing designed + * for the font. This makes the screen display as close as it can be to + * the result one would get with infinite resolution, while preserving + * what is considered the key characteristics of each glyph. Note that + * the distances between unhinted and grid-fitted positions at small + * sizes are comparable to kerning values and thus would be noticeable + * (and distracting) while reading if hinting were applied. + * + * One of the reasons to not hint horizontally is antialiasing for LCD + * screens: The pixel geometry of modern displays supplies three vertical + * subpixels as the eye moves horizontally across each visible pixel. On + * devices where we can be certain this characteristic is present a + * rasterizer can take advantage of the subpixels to add increments of + * weight. In Western writing systems this turns out to be the more + * critical direction anyway; the weights and spacing of vertical stems + * (see above) are central to Armenian, Cyrillic, Greek, and Latin type + * designs. Even when the rasterizer uses greyscale antialiasing instead + * of color (a necessary compromise when one doesn't know the screen + * characteristics), the unhinted vertical features preserve the design's + * weight and spacing much better than aliased type would. + * + * 2) Alignment in the vertical direction: Weights and spacing along the + * y~axis are less critical; what is much more important is the visual + * alignment of related features (like cap-height and x-height). The + * sense of alignment for these is enhanced by the sharpness of grid-fit + * edges, while the cruder vertical resolution (full pixels instead of + * 1/3 pixels) is less of a problem. + * + * On the technical side, horizontal alignment zones for ascender, + * x-height, and other important height values (traditionally called + * 'blue zones') as defined in the font are positioned independently, + * each being rounded to the nearest pixel edge, taking care of overshoot + * suppression at small sizes, stem darkening, and scaling. + * + * Hstems (this is, hint values defined in the font to help align + * horizontal features) that fall within a blue zone are said to be + * 'captured' and are aligned to that zone. Uncaptured stems are moved + * in one of four ways, top edge up or down, bottom edge up or down. + * Unless there are conflicting hstems, the smallest movement is taken to + * minimize distortion. + * + */ + + + /************************************************************************** + * + * @section: + * pcf_driver + * + * @title: + * The PCF driver + * + * @abstract: + * Controlling the PCF driver module. + * + * @description: + * While FreeType's PCF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. Right now, there is a single property + * @no-long-family-names available if FreeType is compiled with + * PCF_CONFIG_OPTION_LONG_FAMILY_NAMES. + * + * The PCF driver's module name is 'pcf'. + * + */ + + + /************************************************************************** + * + * @section: + * t1_cid_driver + * + * @title: + * The Type 1 and CID drivers + * + * @abstract: + * Controlling the Type~1 and CID driver modules. + * + * @description: + * It is possible to control the behaviour of FreeType's Type~1 and + * Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get. + * + * Behind the scenes, both drivers use the Adobe CFF engine for hinting; + * however, the used properties must be specified separately. + * + * The Type~1 driver's module name is 'type1'; the CID driver's module + * name is 't1cid'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * Please see the @cff_driver section for more details on the new hinting + * engine. + * + */ + + + /************************************************************************** + * + * @section: + * tt_driver + * + * @title: + * The TrueType driver + * + * @abstract: + * Controlling the TrueType driver module. + * + * @description: + * While FreeType's TrueType driver doesn't expose API functions by + * itself, it is possible to control its behaviour with @FT_Property_Set + * and @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * The TrueType driver's module name is 'truetype'. + * + * A single property @interpreter-version is available, as documented in + * the @properties section. + * + * We start with a list of definitions, kindly provided by Greg + * Hitchcock. + * + * _Bi-Level Rendering_ + * + * Monochromatic rendering, exclusively used in the early days of + * TrueType by both Apple and Microsoft. Microsoft's GDI interface + * supported hinting of the right-side bearing point, such that the + * advance width could be non-linear. Most often this was done to + * achieve some level of glyph symmetry. To enable reasonable + * performance (e.g., not having to run hinting on all glyphs just to get + * the widths) there was a bit in the head table indicating if the side + * bearing was hinted, and additional tables, 'hdmx' and 'LTSH', to cache + * hinting widths across multiple sizes and device aspect ratios. + * + * _Font Smoothing_ + * + * Microsoft's GDI implementation of anti-aliasing. Not traditional + * anti-aliasing as the outlines were hinted before the sampling. The + * widths matched the bi-level rendering. + * + * _ClearType Rendering_ + * + * Technique that uses physical subpixels to improve rendering on LCD + * (and other) displays. Because of the higher resolution, many methods + * of improving symmetry in glyphs through hinting the right-side bearing + * were no longer necessary. This lead to what GDI calls 'natural + * widths' ClearType, see + * http://rastertragedy.com/RTRCh4.htm#Sec21. Since hinting + * has extra resolution, most non-linearity went away, but it is still + * possible for hints to change the advance widths in this mode. + * + * _ClearType Compatible Widths_ + * + * One of the earliest challenges with ClearType was allowing the + * implementation in GDI to be selected without requiring all UI and + * documents to reflow. To address this, a compatible method of + * rendering ClearType was added where the font hints are executed once + * to determine the width in bi-level rendering, and then re-run in + * ClearType, with the difference in widths being absorbed in the font + * hints for ClearType (mostly in the white space of hints); see + * http://rastertragedy.com/RTRCh4.htm#Sec20. Somewhat by + * definition, compatible width ClearType allows for non-linear widths, + * but only when the bi-level version has non-linear widths. + * + * _ClearType Subpixel Positioning_ + * + * One of the nice benefits of ClearType is the ability to more crisply + * display fractional widths; unfortunately, the GDI model of integer + * bitmaps did not support this. However, the WPF and Direct Write + * frameworks do support fractional widths. DWrite calls this 'natural + * mode', not to be confused with GDI's 'natural widths'. Subpixel + * positioning, in the current implementation of Direct Write, + * unfortunately does not support hinted advance widths, see + * http://rastertragedy.com/RTRCh4.htm#Sec22. Note that the + * TrueType interpreter fully allows the advance width to be adjusted in + * this mode, just the DWrite client will ignore those changes. + * + * _ClearType Backward Compatibility_ + * + * This is a set of exceptions made in the TrueType interpreter to + * minimize hinting techniques that were problematic with the extra + * resolution of ClearType; see + * http://rastertragedy.com/RTRCh4.htm#Sec1 and + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. + * This technique is not to be confused with ClearType compatible widths. + * ClearType backward compatibility has no direct impact on changing + * advance widths, but there might be an indirect impact on disabling + * some deltas. This could be worked around in backward compatibility + * mode. + * + * _Native ClearType Mode_ + * + * (Not to be confused with 'natural widths'.) This mode removes all the + * exceptions in the TrueType interpreter when running with ClearType. + * Any issues on widths would still apply, though. + * + */ + + + /************************************************************************** + * + * @section: + * properties + * + * @title: + * Driver properties + * + * @abstract: + * Controlling driver modules. + * + * @description: + * Driver modules can be controlled by setting and unsetting properties, + * using the functions @FT_Property_Set and @FT_Property_Get. This + * section documents the available properties, together with auxiliary + * macros and structures. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_HINTING_XXX + * + * @description: + * A list of constants used for the @hinting-engine property to select + * the hinting engine for CFF, Type~1, and CID fonts. + * + * @values: + * FT_HINTING_FREETYPE :: + * Use the old FreeType hinting engine. + * + * FT_HINTING_ADOBE :: + * Use the hinting engine contributed by Adobe. + * + * @since: + * 2.9 + * + */ +#define FT_HINTING_FREETYPE 0 +#define FT_HINTING_ADOBE 1 + + /* these constants (introduced in 2.4.12) are deprecated */ +#define FT_CFF_HINTING_FREETYPE FT_HINTING_FREETYPE +#define FT_CFF_HINTING_ADOBE FT_HINTING_ADOBE + + + /************************************************************************** + * + * @property: + * hinting-engine + * + * @description: + * Thanks to Adobe, which contributed a new hinting (and parsing) engine, + * an application can select between 'freetype' and 'adobe' if compiled + * with `CFF_CONFIG_OPTION_OLD_ENGINE`. If this configuration macro + * isn't defined, 'hinting-engine' does nothing. + * + * The same holds for the Type~1 and CID modules if compiled with + * `T1_CONFIG_OPTION_OLD_ENGINE`. + * + * For the 'cff' module, the default engine is 'freetype' if + * `CFF_CONFIG_OPTION_OLD_ENGINE` is defined, and 'adobe' otherwise. + * + * For both the 'type1' and 't1cid' modules, the default engine is + * 'freetype' if `T1_CONFIG_OPTION_OLD_ENGINE` is defined, and 'adobe' + * otherwise. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 'adobe' or 'freetype'). + * + * @example: + * The following example code demonstrates how to select Adobe's hinting + * engine for the 'cff' module (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_UInt hinting_engine = FT_HINTING_ADOBE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "hinting-engine", &hinting_engine ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-stem-darkening + * + * @description: + * All glyphs that pass through the auto-hinter will be emboldened unless + * this property is set to TRUE. The same is true for the CFF, Type~1, + * and CID font modules if the 'Adobe' engine is selected (which is the + * default). + * + * Stem darkening emboldens glyphs at smaller sizes to make them more + * readable on common low-DPI screens when using linear alpha blending + * and gamma correction, see @FT_Render_Glyph. When not using linear + * alpha blending and gamma correction, glyphs will appear heavy and + * fuzzy! + * + * Gamma correction essentially lightens fonts since shades of grey are + * shifted to higher pixel values (=~higher brightness) to match the + * original intention to the reality of our screens. The side-effect is + * that glyphs 'thin out'. Mac OS~X and Adobe's proprietary font + * rendering library implement a counter-measure: stem darkening at + * smaller sizes where shades of gray dominate. By emboldening a glyph + * slightly in relation to its pixel size, individual pixels get higher + * coverage of filled-in outlines and are therefore 'blacker'. This + * counteracts the 'thinning out' of glyphs, making text remain readable + * at smaller sizes. + * + * By default, the Adobe engines for CFF, Type~1, and CID fonts darken + * stems at smaller sizes, regardless of hinting, to enhance contrast. + * Setting this property, stem darkening gets switched off. + * + * For the auto-hinter, stem-darkening is experimental currently and thus + * switched off by default (this is, `no-stem-darkening` is set to TRUE + * by default). Total consistency with the CFF driver is not achieved + * right now because the emboldening method differs and glyphs must be + * scaled down on the Y-axis to keep outline points inside their + * precomputed blue zones. The smaller the size (especially 9ppem and + * down), the higher the loss of emboldening versus the CFF driver. + * + * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). It + * can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_STEM_DARKENING. + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_stem_darkening = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "no-stem-darkening", &no_stem_darkening ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * darkening-parameters + * + * @description: + * By default, the Adobe hinting engine, as used by the CFF, Type~1, and + * CID font drivers, darkens stems as follows (if the `no-stem-darkening` + * property isn't set): + * + * ``` + * stem width <= 0.5px: darkening amount = 0.4px + * stem width = 1px: darkening amount = 0.275px + * stem width = 1.667px: darkening amount = 0.275px + * stem width >= 2.333px: darkening amount = 0px + * ``` + * + * and piecewise linear in-between. At configuration time, these four + * control points can be set with the macro + * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS`; the CFF, Type~1, and CID + * drivers share these values. At runtime, the control points can be + * changed using the `darkening-parameters` property (see the example + * below that demonstrates this for the Type~1 driver). + * + * The x~values give the stem width, and the y~values the darkening + * amount. The unit is 1000th of pixels. All coordinate values must be + * positive; the x~values must be monotonically increasing; the y~values + * must be monotonically decreasing and smaller than or equal to 500 + * (corresponding to half a pixel); the slope of each linear piece must + * be shallower than -1 (e.g., -.4). + * + * The auto-hinter provides this property, too, as an experimental + * feature. See @no-stem-darkening for more. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable, using eight comma-separated integers without spaces. Here + * the above example, using `\` to break the line for readability. + * + * ``` + * FREETYPE_PROPERTIES=\ + * type1:darkening-parameters=500,300,1000,200,1500,100,2000,0 + * ``` + * + * @example: + * ``` + * FT_Library library; + * FT_Int darken_params[8] = { 500, 300, // x1, y1 + * 1000, 200, // x2, y2 + * 1500, 100, // x3, y3 + * 2000, 0 }; // x4, y4 + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "type1", + * "darkening-parameters", darken_params ); + * ``` + * + * @since: + * 2.5.1 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * random-seed + * + * @description: + * By default, the seed value for the CFF 'random' operator and the + * similar '0 28 callothersubr pop' command for the Type~1 and CID + * drivers is set to a random value. However, mainly for debugging + * purposes, it is often necessary to use a known value as a seed so that + * the pseudo-random number sequences generated by 'random' are + * repeatable. + * + * The `random-seed` property does that. Its argument is a signed 32bit + * integer; if the value is zero or negative, the seed given by the + * `intitialRandomSeed` private DICT operator in a CFF file gets used (or + * a default value if there is no such operator). If the value is + * positive, use it instead of `initialRandomSeed`, which is consequently + * ignored. + * + * @note: + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable. It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_RANDOM_SEED. + * + * @since: + * 2.8 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-long-family-names + * + * @description: + * If `PCF_CONFIG_OPTION_LONG_FAMILY_NAMES` is active while compiling + * FreeType, the PCF driver constructs long family names. + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When + * selecting 'Fixed' in KDE or Gnome one gets results that appear rather + * random, the style changes often if one changes the size and one cannot + * select some fonts at all. The improve this situation, the PCF module + * prepends the foundry name (plus a space) to the family name. It also + * checks whether there are 'wide' characters; all put together, family + * names like 'Sony Fixed' or 'Misc Fixed Wide' are constructed. + * + * If `no-long-family-names` is set, this feature gets switched off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_long_family_names = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "pcf", + * "no-long-family-names", + * &no_long_family_names ); + * ``` + * + * @since: + * 2.8 + */ + + + /************************************************************************** + * + * @enum: + * TT_INTERPRETER_VERSION_XXX + * + * @description: + * A list of constants used for the @interpreter-version property to + * select the hinting engine for Truetype fonts. + * + * The numeric value in the constant names represents the version number + * as returned by the 'GETINFO' bytecode instruction. + * + * @values: + * TT_INTERPRETER_VERSION_35 :: + * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in + * Windows~98; only grayscale and B/W rasterizing is supported. + * + * TT_INTERPRETER_VERSION_38 :: + * Version~38 corresponds to MS rasterizer v.1.9; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in the Internet Explorer~9 running on + * Windows~7). It is used in FreeType to select the 'Infinality' + * subpixel hinting code. The code may be removed in a future version. + * + * TT_INTERPRETER_VERSION_40 :: + * Version~40 corresponds to MS rasterizer v.2.1; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in Microsoft's Edge Browser on Windows~10). + * It is used in FreeType to select the 'minimal' subpixel hinting + * code, a stripped-down and higher performance version of the + * 'Infinality' code. + * + * @note: + * This property controls the behaviour of the bytecode interpreter and + * thus how outlines get hinted. It does **not** control how glyph get + * rasterized! In particular, it does not control subpixel color + * filtering. + * + * If FreeType has not been compiled with the configuration option + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING`, selecting version~38 or~40 causes + * an `FT_Err_Unimplemented_Feature` error. + * + * Depending on the graphics framework, Microsoft uses different bytecode + * and rendering engines. As a consequence, the version numbers returned + * by a call to the 'GETINFO' bytecode instruction are more convoluted + * than desired. + * + * Here are two tables that try to shed some light on the possible values + * for the MS rasterizer engine, together with the additional features + * introduced by it. + * + * ``` + * GETINFO framework version feature + * ------------------------------------------------------------------- + * 3 GDI (Win 3.1), v1.0 16-bit, first version + * TrueImage + * 33 GDI (Win NT 3.1), v1.5 32-bit + * HP Laserjet + * 34 GDI (Win 95) v1.6 font smoothing, + * new SCANTYPE opcode + * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET + * bits in composite glyphs + * 36 MGDI (Win CE 2) v1.6+ classic ClearType + * 37 GDI (XP and later), v1.8 ClearType + * GDI+ old (before Vista) + * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, + * WPF Y-direction ClearType, + * additional error checking + * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags + * in GETINFO opcode, + * bug fixes + * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag + * DWrite (Win 8) in GETINFO opcode, + * Gray ClearType + * ``` + * + * The 'version' field gives a rough orientation only, since some + * applications provided certain features much earlier (as an example, + * Microsoft Reader used subpixel and Y-direction ClearType already in + * Windows 2000). Similarly, updates to a given framework might include + * improved hinting support. + * + * ``` + * version sampling rendering comment + * x y x y + * -------------------------------------------------------------- + * v1.0 normal normal B/W B/W bi-level + * v1.6 high high gray gray grayscale + * v1.8 high normal color-filter B/W (GDI) ClearType + * v1.9 high high color-filter gray Color ClearType + * v2.1 high normal gray B/W Gray ClearType + * v2.1 high high gray gray Gray ClearType + * ``` + * + * Color and Gray ClearType are the two available variants of + * 'Y-direction ClearType', meaning grayscale rasterization along the + * Y-direction; the name used in the TrueType specification for this + * feature is 'symmetric smoothing'. 'Classic ClearType' is the original + * algorithm used before introducing a modified version in Win~XP. + * Another name for v1.6's grayscale rendering is 'font smoothing', and + * 'Color ClearType' is sometimes also called 'DWrite ClearType'. To + * differentiate between today's Color ClearType and the earlier + * ClearType variant with B/W rendering along the vertical axis, the + * latter is sometimes called 'GDI ClearType'. + * + * 'Normal' and 'high' sampling describe the (virtual) resolution to + * access the rasterized outline after the hinting process. 'Normal' + * means 1 sample per grid line (i.e., B/W). In the current Microsoft + * implementation, 'high' means an extra virtual resolution of 16x16 (or + * 16x1) grid lines per pixel for bytecode instructions like 'MIRP'. + * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid + * lines for color filtering if Color ClearType is activated. + * + * Note that 'Gray ClearType' is essentially the same as v1.6's grayscale + * rendering. However, the GETINFO instruction handles it differently: + * v1.6 returns bit~12 (hinting for grayscale), while v2.1 returns + * bits~13 (hinting for ClearType), 18 (symmetrical smoothing), and~19 + * (Gray ClearType). Also, this mode respects bits 2 and~3 for the + * version~1 gasp table exclusively (like Color ClearType), while v1.6 + * only respects the values of version~0 (bits 0 and~1). + * + * Keep in mind that the features of the above interpreter versions might + * not map exactly to FreeType features or behavior because it is a + * fundamentally different library with different internals. + * + */ +#define TT_INTERPRETER_VERSION_35 35 +#define TT_INTERPRETER_VERSION_38 38 +#define TT_INTERPRETER_VERSION_40 40 + + + /************************************************************************** + * + * @property: + * interpreter-version + * + * @description: + * Currently, three versions are available, two representing the bytecode + * interpreter with subpixel hinting support (old 'Infinality' code and + * new stripped-down and higher performance 'minimal' code) and one + * without, respectively. The default is subpixel support if + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING` is defined, and no subpixel + * support otherwise (since it isn't available then). + * + * If subpixel hinting is on, many TrueType bytecode instructions behave + * differently compared to B/W or grayscale rendering (except if 'native + * ClearType' is selected by the font). Microsoft's main idea is to + * render at a much increased horizontal resolution, then sampling down + * the created output to subpixel precision. However, many older fonts + * are not suited to this and must be specially taken care of by applying + * (hardcoded) tweaks in Microsoft's interpreter. + * + * Details on subpixel hinting and some of the necessary tweaks can be + * found in Greg Hitchcock's whitepaper at + * 'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. + * Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2, + * or 6x5 supersampling) like discussed in the paper. Depending on the + * chosen interpreter, it simply ignores instructions on vertical stems + * to arrive at very similar results. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values '35', '38', or '40'). + * + * @example: + * The following example code demonstrates how to deactivate subpixel + * hinting (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "truetype", + * "interpreter-version", + * &interpreter_version ); + * ``` + * + * @since: + * 2.5 + */ + + + /************************************************************************** + * + * @property: + * glyph-to-script-map + * + * @description: + * **Experimental only** + * + * The auto-hinter provides various script modules to hint glyphs. + * Examples of supported scripts are Latin or CJK. Before a glyph is + * auto-hinted, the Unicode character map of the font gets examined, and + * the script is then determined based on Unicode character ranges, see + * below. + * + * OpenType fonts, however, often provide much more glyphs than character + * codes (small caps, superscripts, ligatures, swashes, etc.), to be + * controlled by so-called 'features'. Handling OpenType features can be + * quite complicated and thus needs a separate library on top of + * FreeType. + * + * The mapping between glyph indices and scripts (in the auto-hinter + * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an array + * with `num_glyphs` elements, as found in the font's @FT_Face structure. + * The `glyph-to-script-map` property returns a pointer to this array, + * which can be modified as needed. Note that the modification should + * happen before the first glyph gets processed by the auto-hinter so + * that the global analysis of the font shapes actually uses the modified + * mapping. + * + * @example: + * The following example code demonstrates how to access it (omitting the + * error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_GlyphToScriptMap prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * + * prop.face = face; + * + * FT_Property_Get( library, "autofitter", + * "glyph-to-script-map", &prop ); + * + * // adjust `prop.map' as needed right here + * + * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @enum: + * FT_AUTOHINTER_SCRIPT_XXX + * + * @description: + * **Experimental only** + * + * A list of constants used for the @glyph-to-script-map property to + * specify the script submodule the auto-hinter should use for hinting a + * particular glyph. + * + * @values: + * FT_AUTOHINTER_SCRIPT_NONE :: + * Don't auto-hint this glyph. + * + * FT_AUTOHINTER_SCRIPT_LATIN :: + * Apply the latin auto-hinter. For the auto-hinter, 'latin' is a very + * broad term, including Cyrillic and Greek also since characters from + * those scripts share the same design constraints. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0020 - U+007F // Basic Latin (no control characters) + * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) + * U+0100 - U+017F // Latin Extended-A + * U+0180 - U+024F // Latin Extended-B + * U+0250 - U+02AF // IPA Extensions + * U+02B0 - U+02FF // Spacing Modifier Letters + * U+0300 - U+036F // Combining Diacritical Marks + * U+0370 - U+03FF // Greek and Coptic + * U+0400 - U+04FF // Cyrillic + * U+0500 - U+052F // Cyrillic Supplement + * U+1D00 - U+1D7F // Phonetic Extensions + * U+1D80 - U+1DBF // Phonetic Extensions Supplement + * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement + * U+1E00 - U+1EFF // Latin Extended Additional + * U+1F00 - U+1FFF // Greek Extended + * U+2000 - U+206F // General Punctuation + * U+2070 - U+209F // Superscripts and Subscripts + * U+20A0 - U+20CF // Currency Symbols + * U+2150 - U+218F // Number Forms + * U+2460 - U+24FF // Enclosed Alphanumerics + * U+2C60 - U+2C7F // Latin Extended-C + * U+2DE0 - U+2DFF // Cyrillic Extended-A + * U+2E00 - U+2E7F // Supplemental Punctuation + * U+A640 - U+A69F // Cyrillic Extended-B + * U+A720 - U+A7FF // Latin Extended-D + * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) + * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols + * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_CJK :: + * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old + * Vietnamese, and some other scripts. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+1100 - U+11FF // Hangul Jamo + * U+2E80 - U+2EFF // CJK Radicals Supplement + * U+2F00 - U+2FDF // Kangxi Radicals + * U+2FF0 - U+2FFF // Ideographic Description Characters + * U+3000 - U+303F // CJK Symbols and Punctuation + * U+3040 - U+309F // Hiragana + * U+30A0 - U+30FF // Katakana + * U+3100 - U+312F // Bopomofo + * U+3130 - U+318F // Hangul Compatibility Jamo + * U+3190 - U+319F // Kanbun + * U+31A0 - U+31BF // Bopomofo Extended + * U+31C0 - U+31EF // CJK Strokes + * U+31F0 - U+31FF // Katakana Phonetic Extensions + * U+3200 - U+32FF // Enclosed CJK Letters and Months + * U+3300 - U+33FF // CJK Compatibility + * U+3400 - U+4DBF // CJK Unified Ideographs Extension A + * U+4DC0 - U+4DFF // Yijing Hexagram Symbols + * U+4E00 - U+9FFF // CJK Unified Ideographs + * U+A960 - U+A97F // Hangul Jamo Extended-A + * U+AC00 - U+D7AF // Hangul Syllables + * U+D7B0 - U+D7FF // Hangul Jamo Extended-B + * U+F900 - U+FAFF // CJK Compatibility Ideographs + * U+FE10 - U+FE1F // Vertical forms + * U+FE30 - U+FE4F // CJK Compatibility Forms + * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms + * U+1B000 - U+1B0FF // Kana Supplement + * U+1D300 - U+1D35F // Tai Xuan Hing Symbols + * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement + * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B + * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C + * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D + * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_INDIC :: + * Apply the indic auto-hinter, covering all major scripts from the + * Indian sub-continent and some other related scripts like Thai, Lao, + * or Tibetan. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0900 - U+0DFF // Indic Range + * U+0F00 - U+0FFF // Tibetan + * U+1900 - U+194F // Limbu + * U+1B80 - U+1BBF // Sundanese + * U+A800 - U+A82F // Syloti Nagri + * U+ABC0 - U+ABFF // Meetei Mayek + * U+11800 - U+118DF // Sharada + * ``` + * + * Note that currently Indic support is rudimentary only, missing blue + * zone support. + * + * @since: + * 2.4.11 + * + */ +#define FT_AUTOHINTER_SCRIPT_NONE 0 +#define FT_AUTOHINTER_SCRIPT_LATIN 1 +#define FT_AUTOHINTER_SCRIPT_CJK 2 +#define FT_AUTOHINTER_SCRIPT_INDIC 3 + + + /************************************************************************** + * + * @struct: + * FT_Prop_GlyphToScriptMap + * + * @description: + * **Experimental only** + * + * The data exchange structure for the @glyph-to-script-map property. + * + * @since: + * 2.4.11 + * + */ + typedef struct FT_Prop_GlyphToScriptMap_ + { + FT_Face face; + FT_UShort* map; + + } FT_Prop_GlyphToScriptMap; + + + /************************************************************************** + * + * @property: + * fallback-script + * + * @description: + * **Experimental only** + * + * If no auto-hinter script module can be assigned to a glyph, a fallback + * script gets assigned to it (see also the @glyph-to-script-map + * property). By default, this is @FT_AUTOHINTER_SCRIPT_CJK. Using the + * `fallback-script` property, this fallback value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the fallback + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the fallback script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "fallback-script", &fallback_script ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @property: + * default-script + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with `FT_CONFIG_OPTION_USE_HARFBUZZ` to make + * the HarfBuzz library access OpenType features for getting better glyph + * coverages, this property sets the (auto-fitter) script to be used for + * the default (OpenType) script data of a font's GSUB table. Features + * for the default script are intended for all scripts not explicitly + * handled in GSUB; an example is a 'dlig' feature, containing the + * combination of the characters 'T', 'E', and 'L' to form a 'TEL' + * ligature. + * + * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the + * `default-script` property, this default value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the default + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the default script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "default-script", &default_script ); + * ``` + * + * @since: + * 2.5.3 + * + */ + + + /************************************************************************** + * + * @property: + * increase-x-height + * + * @description: + * For ppem values in the range 6~<= ppem <= `increase-x-height`, round + * up the font's x~height much more often than normally. If the value is + * set to~0, which is the default, this feature is switched off. Use + * this property to improve the legibility of small font sizes if + * necessary. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * Set this value right after calling @FT_Set_Char_Size, but before + * loading any glyph (using the auto-hinter). + * + * @example: + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_IncreaseXHeight prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); + * + * prop.face = face; + * prop.limit = 14; + * + * FT_Property_Set( library, "autofitter", + * "increase-x-height", &prop ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Prop_IncreaseXHeight + * + * @description: + * The data exchange structure for the @increase-x-height property. + * + */ + typedef struct FT_Prop_IncreaseXHeight_ + { + FT_Face face; + FT_UInt limit; + + } FT_Prop_IncreaseXHeight; + + + /************************************************************************** + * + * @property: + * warping + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with option `AF_CONFIG_OPTION_USE_WARPER` to + * activate the warp hinting code in the auto-hinter, this property + * switches warping on and off. + * + * Warping only works in 'normal' auto-hinting mode replacing it. The + * idea of the code is to slightly scale and shift a glyph along the + * non-hinted dimension (which is usually the horizontal axis) so that as + * much of its segments are aligned (more or less) to the grid. To find + * out a glyph's optimal scaling and shifting value, various parameter + * combinations are tried and scored. + * + * By default, warping is off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * The warping code can also change advance widths. Have a look at the + * `lsb_delta` and `rsb_delta` fields in the @FT_GlyphSlotRec structure + * for details on improving inter-glyph distances while rendering. + * + * Since warping is a global property of the auto-hinter it is best to + * change its value before rendering any face. Otherwise, you should + * reload all faces that get auto-hinted in 'normal' hinting mode. + * + * @example: + * This example shows how to switch on warping (omitting the error + * handling). + * + * ``` + * FT_Library library; + * FT_Bool warping = 1; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", "warping", &warping ); + * ``` + * + * @since: + * 2.6 + * + */ + + + /* */ + + +FT_END_HEADER + + +#endif /* FTDRIVER_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/fterrdef.h b/linux/include/freetype2/freetype/fterrdef.h new file mode 100644 index 00000000..9bc7dc65 --- /dev/null +++ b/linux/include/freetype2/freetype/fterrdef.h @@ -0,0 +1,279 @@ +/**************************************************************************** + * + * fterrdef.h + * + * FreeType error codes (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_code_values + * + * @title: + * Error Code Values + * + * @abstract: + * All possible error codes returned by FreeType functions. + * + * @description: + * The list below is taken verbatim from the file `fterrdef.h` (loaded + * automatically by including `FT_FREETYPE_H`). The first argument of the + * `FT_ERROR_DEF_` macro is the error label; by default, the prefix + * `FT_Err_` gets added so that you get error names like + * `FT_Err_Cannot_Open_Resource`. The second argument is the error code, + * and the last argument an error string, which is not used by FreeType. + * + * Within your application you should **only** use error names and + * **never** its numeric values! The latter might (and actually do) + * change in forthcoming FreeType versions. + * + * Macro `FT_NOERRORDEF_` defines `FT_Err_Ok`, which is always zero. See + * the 'Error Enumerations' subsection how to automatically generate a + * list of error strings. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_Err_XXX + * + */ + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, + "array allocation size too large" ) + FT_ERRORDEF_( Missing_Module, 0x0B, + "missing module" ) + FT_ERRORDEF_( Missing_Property, 0x0C, + "missing property" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, + "invalid PostScript (post) table" ) + FT_ERRORDEF_( DEF_In_Glyf_Bytecode, 0x9C, + "found FDEF or IDEF opcode in glyf bytecode" ) + FT_ERRORDEF_( Missing_Bitmap, 0x9D, + "missing bitmap in strike" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, + "no Unicode glyph name found" ) + FT_ERRORDEF_( Glyph_Too_Big, 0xA4, + "glyph too big for hinting" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, + "Font glyphs corrupted or missing fields" ) + + /* */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/fterrors.h b/linux/include/freetype2/freetype/fterrors.h new file mode 100644 index 00000000..58f5a3ea --- /dev/null +++ b/linux/include/freetype2/freetype/fterrors.h @@ -0,0 +1,285 @@ +/**************************************************************************** + * + * fterrors.h + * + * FreeType error code handling (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_enumerations + * + * @title: + * Error Enumerations + * + * @abstract: + * How to handle errors and error strings. + * + * @description: + * The header file `fterrors.h` (which is automatically included by + * `freetype.h` defines the handling of FreeType's enumeration + * constants. It can also be used to generate error message strings + * with a small macro trick explained below. + * + * **Error Formats** + * + * The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be + * defined in `ftoption.h` in order to make the higher byte indicate the + * module where the error has happened (this is not compatible with + * standard builds of FreeType~2, however). See the file `ftmoderr.h` + * for more details. + * + * **Error Message Strings** + * + * Error definitions are set up with special macros that allow client + * applications to build a table of error message strings. The strings + * are not included in a normal build of FreeType~2 to save space (most + * client applications do not use them). + * + * To do so, you have to define the following macros before including + * this file. + * + * ``` + * FT_ERROR_START_LIST + * ``` + * + * This macro is called before anything else to define the start of the + * error list. It is followed by several `FT_ERROR_DEF` calls. + * + * ``` + * FT_ERROR_DEF( e, v, s ) + * ``` + * + * This macro is called to define one single error. 'e' is the error + * code identifier (e.g., `Invalid_Argument`), 'v' is the error's + * numerical value, and 's' is the corresponding error string. + * + * ``` + * FT_ERROR_END_LIST + * ``` + * + * This macro ends the list. + * + * Additionally, you have to undefine `FTERRORS_H_` before #including + * this file. + * + * Here is a simple example. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERRORDEF( e, v, s ) { e, s }, + * #define FT_ERROR_START_LIST { + * #define FT_ERROR_END_LIST { 0, NULL } }; + * + * const struct + * { + * int err_code; + * const char* err_msg; + * } ft_errors[] = + * + * #include FT_ERRORS_H + * ``` + * + * An alternative to using an array is a switch statement. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERROR_START_LIST switch ( error_code ) { + * #define FT_ERRORDEF( e, v, s ) case v: return s; + * #define FT_ERROR_END_LIST } + * ``` + * + * If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should + * be replaced with `FT_ERROR_BASE(error_code)` in the last example. + */ + + /* */ + + /* In previous FreeType versions we used `__FTERRORS_H__`. However, */ + /* using two successive underscores in a non-system symbol name */ + /* violates the C (and C++) standard, so it was changed to the */ + /* current form. In spite of this, we have to make */ + /* */ + /* ``` */ + /* #undefine __FTERRORS_H__ */ + /* ``` */ + /* */ + /* work for backward compatibility. */ + /* */ +#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) +#define FTERRORS_H_ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_`. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_INCLUDE_ERR_PROTOS + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for _Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_BASE + + /* FT_ERR_PREFIX is needed internally */ +#ifndef FT2_BUILD_LIBRARY +#undef FT_ERR_PREFIX +#endif + + /* FT_INCLUDE_ERR_PROTOS: Control if function prototypes should be */ + /* included with `#include FT_ERRORS_H'. This is */ + /* only true where `FT_ERRORDEF` is undefined. */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ +#ifdef FT_INCLUDE_ERR_PROTOS +#undef FT_INCLUDE_ERR_PROTOS + +#ifndef FT_ERR_PROTOS_DEFINED +#define FT_ERR_PROTOS_DEFINED + + + /************************************************************************** + * + * @function: + * FT_Error_String + * + * @description: + * Retrieve the description of a valid FreeType error code. + * + * @input: + * error_code :: + * A valid FreeType error code. + * + * @return: + * A C~string or `NULL`, if any error occurred. + * + * @note: + * FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or + * `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. + * 'error_string' will be `NULL` otherwise. + * + * Module identification will be ignored: + * + * ```c + * strcmp( FT_Error_String( FT_Err_Unknown_File_Format ), + * FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; + * ``` + */ + FT_EXPORT( const char* ) + FT_Error_String( FT_Error error_code ); + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftfntfmt.h b/linux/include/freetype2/freetype/ftfntfmt.h new file mode 100644 index 00000000..aae0b132 --- /dev/null +++ b/linux/include/freetype2/freetype/ftfntfmt.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * + * ftfntfmt.h + * + * Support functions for font formats. + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTFNTFMT_H_ +#define FTFNTFMT_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * font_formats + * + * @title: + * Font Formats + * + * @abstract: + * Getting the font format. + * + * @description: + * The single function in this section can be used to get the font format. + * Note that this information is not needed normally; however, there are + * special cases (like in PDF devices) where it is important to + * differentiate, in spite of FreeType's uniform API. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_Font_Format + * + * @description: + * Return a string describing the format of a given face. Possible values + * are 'TrueType', 'Type~1', 'BDF', 'PCF', 'Type~42', 'CID~Type~1', 'CFF', + * 'PFR', and 'Windows~FNT'. + * + * The return value is suitable to be used as an X11 FONT_PROPERTY. + * + * @input: + * face :: + * Input face handle. + * + * @return: + * Font format string. `NULL` in case of error. + * + * @note: + * A deprecated name for the same function is `FT_Get_X11_Font_Format`. + */ + FT_EXPORT( const char* ) + FT_Get_Font_Format( FT_Face face ); + + + /* deprecated */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTFNTFMT_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftgasp.h b/linux/include/freetype2/freetype/ftgasp.h new file mode 100644 index 00000000..24673d8c --- /dev/null +++ b/linux/include/freetype2/freetype/ftgasp.h @@ -0,0 +1,144 @@ +/**************************************************************************** + * + * ftgasp.h + * + * Access of TrueType's 'gasp' table (specification). + * + * Copyright (C) 2007-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGASP_H_ +#define FTGASP_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType 'gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its 'gasp' table, if any. This is mainly + * useful when implementing native TrueType hinting with the bytecode + * interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************** + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This **really** means TrueType bytecode interpretation. If this bit + * is not set, no hinting gets applied. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * If not set, do monochrome rendering. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * If set, smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * The bit-flags `FT_GASP_DO_GRIDFIT` and `FT_GASP_DO_GRAY` are to be + * used for standard font rasterization only. Independently of that, + * `FT_GASP_SYMMETRIC_SMOOTHING` and `FT_GASP_SYMMETRIC_GRIDFIT` are to + * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT` and + * `FT_GASP_DO_GRAY` are consequently ignored). + * + * 'ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x04 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 + + + /************************************************************************** + * + * @function: + * FT_Get_Gasp + * + * @description: + * For a TrueType or OpenType font file, return the rasterizer behaviour + * flags from the font's 'gasp' table corresponding to a given character + * pixel size. + * + * @input: + * face :: + * The source face handle. + * + * ppem :: + * The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * 'gasp' table in the face. + * + * @note: + * If you want to use the MM functionality of OpenType variation fonts + * (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this + * function **after** setting an instance since the return values can + * change. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGASP_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftglyph.h b/linux/include/freetype2/freetype/ftglyph.h new file mode 100644 index 00000000..4067c2e6 --- /dev/null +++ b/linux/include/freetype2/freetype/ftglyph.h @@ -0,0 +1,665 @@ +/**************************************************************************** + * + * ftglyph.h + * + * FreeType convenience functions to handle glyphs (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file contains the definition of several convenience functions that + * can be used by client applications to easily retrieve glyph bitmaps and + * outlines from a given face. + * + * These functions should be optional if you are writing a font server or + * text layout engine on top of FreeType. However, they are pretty handy + * for many other simple uses of the library. + * + */ + + +#ifndef FTGLYPH_H_ +#define FTGLYPH_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_management + * + * @title: + * Glyph Management + * + * @abstract: + * Generic interface to manage individual glyph data. + * + * @description: + * This section contains definitions used to manage glyph data through + * generic @FT_Glyph objects. Each of them can contain a bitmap, + * a vector outline, or even images in other formats. These objects are + * detached from @FT_Face, contrary to @FT_GlyphSlot. + * + */ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /************************************************************************** + * + * @type: + * FT_Glyph + * + * @description: + * Handle to an object used to model generic glyph images. It is a + * pointer to the @FT_GlyphRec structure and can contain a glyph bitmap + * or pointer. + * + * @note: + * Glyph objects are not owned by the library. You must thus release + * them manually (through @FT_Done_Glyph) _before_ calling + * @FT_Done_FreeType. + */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /************************************************************************** + * + * @struct: + * FT_GlyphRec + * + * @description: + * The root glyph structure contains a given glyph image plus its advance + * width in 16.16 fixed-point format. + * + * @fields: + * library :: + * A handle to the FreeType library object. + * + * clazz :: + * A pointer to the glyph's class. Private. + * + * format :: + * The format of the glyph's image. + * + * advance :: + * A 16.16 vector that gives the glyph's advance width. + */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /************************************************************************** + * + * @type: + * FT_BitmapGlyph + * + * @description: + * A handle to an object used to model a bitmap glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. + */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /************************************************************************** + * + * @struct: + * FT_BitmapGlyphRec + * + * @description: + * A structure used for bitmap glyph images. This really is a + * 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * left :: + * The left-side bearing, i.e., the horizontal distance from the + * current pen position to the left border of the glyph bitmap. + * + * top :: + * The top-side bearing, i.e., the vertical distance from the current + * pen position to the top border of the glyph bitmap. This distance + * is positive for upwards~y! + * + * bitmap :: + * A descriptor for the bitmap. + * + * @note: + * You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_BITMAP`. This lets you access the + * bitmap's contents easily. + * + * The corresponding pixel buffer is always owned by @FT_BitmapGlyph and + * is thus created and destroyed with it. + */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /************************************************************************** + * + * @type: + * FT_OutlineGlyph + * + * @description: + * A handle to an object used to model an outline glyph image. This is a + * sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. + */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /************************************************************************** + * + * @struct: + * FT_OutlineGlyphRec + * + * @description: + * A structure used for outline (vectorial) glyph images. This really is + * a 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * outline :: + * A descriptor for the outline. + * + * @note: + * You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_OUTLINE`. This lets you access the + * outline's content easily. + * + * As the outline is extracted from a glyph slot, its coordinates are + * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE + * was used in @FT_Load_Glyph() or @FT_Load_Char(). + * + * The outline's tables are always owned by the object and are destroyed + * with it. + */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /************************************************************************** + * + * @function: + * FT_New_Glyph + * + * @description: + * A function used to create a new empty glyph image. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * library :: + * A handle to the FreeType library object. + * + * format :: + * The format of the glyph's image. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_New_Glyph( FT_Library library, + FT_Glyph_Format format, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph + * + * @description: + * A function used to extract a glyph image from a slot. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * slot :: + * A handle to the source glyph slot. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Because `*aglyph->advance.x` and `*aglyph->advance.y` are 16.16 + * fixed-point numbers, `slot->advance.x` and `slot->advance.y` (which + * are in 26.6 fixed-point format) must be in the range ]-32768;32768[. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Copy + * + * @description: + * A function used to copy a glyph image. Note that the created + * @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * source :: + * A handle to the source glyph object. + * + * @output: + * target :: + * A handle to the target glyph object. 0~in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Transform + * + * @description: + * Transform a glyph image if its format is scalable. + * + * @inout: + * glyph :: + * A handle to the target glyph object. + * + * @input: + * matrix :: + * A pointer to a 2x2 matrix to apply. + * + * delta :: + * A pointer to a 2d vector to apply. Coordinates are expressed in + * 1/64th of a pixel. + * + * @return: + * FreeType error code (if not 0, the glyph format is not scalable). + * + * @note: + * The 2x2 transformation matrix is also applied to the glyph's advance + * vector. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Glyph_BBox_Mode + * + * @description: + * The mode how the values of @FT_Glyph_Get_CBox are returned. + * + * @values: + * FT_GLYPH_BBOX_UNSCALED :: + * Return unscaled font units. + * + * FT_GLYPH_BBOX_SUBPIXELS :: + * Return unfitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_GRIDFIT :: + * Return grid-fitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_TRUNCATE :: + * Return coordinates in integer pixels. + * + * FT_GLYPH_BBOX_PIXELS :: + * Return grid-fitted pixel coordinates. + */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_BBox_Mode` values instead */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /************************************************************************** + * + * @function: + * FT_Glyph_Get_CBox + * + * @description: + * Return a glyph's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * glyph :: + * A handle to the source glyph object. + * + * mode :: + * The mode that indicates how to interpret the returned bounding box + * values. + * + * @output: + * acbox :: + * The glyph coordinate bounding box. Coordinates are expressed in + * 1/64th of pixels if it is grid-fitted. + * + * @note: + * Coordinates are relative to the glyph origin, using the y~upwards + * convention. + * + * If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode` must + * be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 + * pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS is another name for + * this constant. + * + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get + * reasonable values for the CBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the CBox, which can be + * eventually converted back to font units. + * + * Note that the maximum coordinates are exclusive, which means that one + * can compute the width and height of the glyph image (be it in integer + * or 26.6 pixels) as: + * + * ``` + * width = bbox.xMax - bbox.xMin; + * height = bbox.yMax - bbox.yMin; + * ``` + * + * Note also that for 26.6 coordinates, if `bbox_mode` is set to + * @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, + * which corresponds to: + * + * ``` + * bbox.xMin = FLOOR(bbox.xMin); + * bbox.yMin = FLOOR(bbox.yMin); + * bbox.xMax = CEILING(bbox.xMax); + * bbox.yMax = CEILING(bbox.yMax); + * ``` + * + * To get the bbox in pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_TRUNCATE. + * + * To get the bbox in grid-fitted pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_PIXELS. + */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_To_Bitmap + * + * @description: + * Convert a given glyph object to a bitmap glyph object. + * + * @inout: + * the_glyph :: + * A pointer to a handle to the target glyph. + * + * @input: + * render_mode :: + * An enumeration that describes how the data is rendered. + * + * origin :: + * A pointer to a vector used to translate the glyph image before + * rendering. Can be~0 (if no translation). The origin is expressed + * in 26.6 pixels. + * + * destroy :: + * A boolean that indicates that the original glyph image should be + * destroyed by this function. It is never destroyed in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing if the glyph format isn't scalable. + * + * The glyph image is translated with the `origin` vector before + * rendering. + * + * The first parameter is a pointer to an @FT_Glyph handle, that will be + * _replaced_ by this function (with newly allocated data). Typically, + * you would use (omitting error handling): + * + * ``` + * FT_Glyph glyph; + * FT_BitmapGlyph glyph_bitmap; + * + * + * // load glyph + * error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); + * + * // extract glyph image + * error = FT_Get_Glyph( face->glyph, &glyph ); + * + * // convert to a bitmap (default render mode + destroying old) + * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) + * { + * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, + * 0, 1 ); + * if ( error ) // `glyph' unchanged + * ... + * } + * + * // access bitmap content by typecasting + * glyph_bitmap = (FT_BitmapGlyph)glyph; + * + * // do funny stuff with it, like blitting/drawing + * ... + * + * // discard glyph image (bitmap or not) + * FT_Done_Glyph( glyph ); + * ``` + * + * Here is another example, again without error handling: + * + * ``` + * FT_Glyph glyphs[MAX_GLYPHS] + * + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || + * FT_Get_Glyph ( face->glyph, &glyphs[idx] ); + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * { + * FT_Glyph bitmap = glyphs[idx]; + * + * + * ... + * + * // after this call, `bitmap' no longer points into + * // the `glyphs' array (and the old value isn't destroyed) + * FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); + * + * ... + * + * FT_Done_Glyph( bitmap ); + * } + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * FT_Done_Glyph( glyphs[idx] ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Done_Glyph + * + * @description: + * Destroy a given glyph. + * + * @input: + * glyph :: + * A handle to the target glyph object. + */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @function: + * FT_Matrix_Multiply + * + * @description: + * Perform the matrix operation `b = a*b`. + * + * @input: + * a :: + * A pointer to matrix `a`. + * + * @inout: + * b :: + * A pointer to matrix `b`. + * + * @note: + * The result is undefined if either `a` or `b` is zero. + * + * Since the function uses wrap-around arithmetic, results become + * meaningless if the arguments are very large. + */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /************************************************************************** + * + * @function: + * FT_Matrix_Invert + * + * @description: + * Invert a 2x2 matrix. Return an error if it can't be inverted. + * + * @inout: + * matrix :: + * A pointer to the target matrix. Remains untouched in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGLYPH_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/ftgxval.h b/linux/include/freetype2/freetype/ftgxval.h new file mode 100644 index 00000000..b14f637c --- /dev/null +++ b/linux/include/freetype2/freetype/ftgxval.h @@ -0,0 +1,355 @@ +/**************************************************************************** + * + * ftgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2019 by + * Masatake YAMATO, Redhat K.K, + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef FTGXVAL_H_ +#define FTGXVAL_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gx_validation + * + * @title: + * TrueTypeGX/AAT Validation + * + * @abstract: + * An API to validate TrueTypeGX/AAT tables. + * + * @description: + * This section contains the declaration of functions to validate some + * TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, + * prop, lcar). + * + * @order: + * FT_TrueTypeGX_Validate + * FT_TrueTypeGX_Free + * + * FT_ClassicKern_Validate + * FT_ClassicKern_Free + * + * FT_VALIDATE_GX_LENGTH + * FT_VALIDATE_GXXXX + * FT_VALIDATE_CKERNXXX + * + */ + + /************************************************************************** + * + * + * Warning: Use `FT_VALIDATE_XXX` to validate a table. + * Following definitions are for gxvalid developers. + * + * + */ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************** + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length` argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH ( FT_VALIDATE_GX_LAST_INDEX + 1 ) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate 'feat' table. + * + * FT_VALIDATE_mort :: + * Validate 'mort' table. + * + * FT_VALIDATE_morx :: + * Validate 'morx' table. + * + * FT_VALIDATE_bsln :: + * Validate 'bsln' table. + * + * FT_VALIDATE_just :: + * Validate 'just' table. + * + * FT_VALIDATE_kern :: + * Validate 'kern' table. + * + * FT_VALIDATE_opbd :: + * Validate 'opbd' table. + * + * FT_VALIDATE_trak :: + * Validate 'trak' table. + * + * FT_VALIDATE_prop :: + * Validate 'prop' table. + * + * FT_VALIDATE_lcar :: + * Validate 'lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables` array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. The array + * itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables` element, by calling @FT_TrueTypeGX_Free. A `NULL` value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate to + * indicate the classic kern dialect or dialects. If the selected type + * doesn't fit, @FT_ClassicKern_Validate regards the table as invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the 'kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the 'kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the 'kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the + * offsets and indices are valid. The idea is that a higher-level + * library that actually does the text layout can access those tables + * without error checking (which can be quite time consuming). + * + * The 'kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table`, by calling @FT_ClassicKern_Free. A `NULL` value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGXVAL_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftgzip.h b/linux/include/freetype2/freetype/ftgzip.h new file mode 100644 index 00000000..418c6122 --- /dev/null +++ b/linux/include/freetype2/freetype/ftgzip.h @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * ftgzip.h + * + * Gzip-compressed stream support. + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGZIP_H_ +#define FTGZIP_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * gzip + * + * @title: + * GZIP Streams + * + * @abstract: + * Using gzip-compressed font files. + * + * @description: + * This section contains the declaration of Gzip-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is mainly + * used to support the compressed `*.pcf.gz` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + + /************************************************************************** + * + * @function: + * FT_Gzip_Uncompress + * + * @description: + * Decompress a zipped input buffer into an output buffer. This function + * is modeled after zlib's `uncompress` function. + * + * @input: + * memory :: + * A FreeType memory handle. + * + * input :: + * The input buffer. + * + * input_len :: + * The length of the input buffer. + * + * @output: + * output :: + * The output buffer. + * + * @inout: + * output_len :: + * Before calling the function, this is the total size of the output + * buffer, which must be large enough to hold the entire uncompressed + * data (so the size of the uncompressed data must be known in + * advance). After calling the function, `output_len` is the size of + * the used data in `output`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + * + * @since: + * 2.5.1 + */ + FT_EXPORT( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGZIP_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftimage.h b/linux/include/freetype2/freetype/ftimage.h new file mode 100644 index 00000000..d640b0b0 --- /dev/null +++ b/linux/include/freetype2/freetype/ftimage.h @@ -0,0 +1,1240 @@ +/**************************************************************************** + * + * ftimage.h + * + * FreeType glyph image formats and default raster interface + * (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Note: A 'raster' is simply a scan-line converter, used to render + * FT_Outlines into FT_Bitmaps. + * + */ + + +#ifndef FTIMAGE_H_ +#define FTIMAGE_H_ + + + /* STANDALONE_ is from ftgrays.c */ +#ifndef STANDALONE_ +#include +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Pos + * + * @description: + * The type FT_Pos is used to store vectorial coordinates. Depending on + * the context, these can represent distances in integer font units, or + * 16.16, or 26.6 fixed-point pixel coordinates. + */ + typedef signed long FT_Pos; + + + /************************************************************************** + * + * @struct: + * FT_Vector + * + * @description: + * A simple structure used to store a 2D vector; coordinates are of the + * FT_Pos type. + * + * @fields: + * x :: + * The horizontal coordinate. + * y :: + * The vertical coordinate. + */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /************************************************************************** + * + * @struct: + * FT_BBox + * + * @description: + * A structure used to hold an outline's bounding box, i.e., the + * coordinates of its extrema in the horizontal and vertical directions. + * + * @fields: + * xMin :: + * The horizontal minimum (left-most). + * + * yMin :: + * The vertical minimum (bottom-most). + * + * xMax :: + * The horizontal maximum (right-most). + * + * yMax :: + * The vertical maximum (top-most). + * + * @note: + * The bounding box is specified with the coordinates of the lower left + * and the upper right corner. In PostScript, those values are often + * called (llx,lly) and (urx,ury), respectively. + * + * If `yMin` is negative, this value gives the glyph's descender. + * Otherwise, the glyph doesn't descend below the baseline. Similarly, + * if `ymax` is positive, this value gives the glyph's ascender. + * + * `xMin` gives the horizontal distance from the glyph's origin to the + * left edge of the glyph's bounding box. If `xMin` is negative, the + * glyph extends to the left of the origin. + */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /************************************************************************** + * + * @enum: + * FT_Pixel_Mode + * + * @description: + * An enumeration type used to describe the format of pixels in a given + * bitmap. Note that additional formats may be added in the future. + * + * @values: + * FT_PIXEL_MODE_NONE :: + * Value~0 is reserved. + * + * FT_PIXEL_MODE_MONO :: + * A monochrome bitmap, using 1~bit per pixel. Note that pixels are + * stored in most-significant order (MSB), which means that the + * left-most pixel in a byte has value 128. + * + * FT_PIXEL_MODE_GRAY :: + * An 8-bit bitmap, generally used to represent anti-aliased glyph + * images. Each pixel is stored in one byte. Note that the number of + * 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap + * structure (it generally is 256). + * + * FT_PIXEL_MODE_GRAY2 :: + * A 2-bit per pixel bitmap, used to represent embedded anti-aliased + * bitmaps in font files according to the OpenType specification. We + * haven't found a single font using this format, however. + * + * FT_PIXEL_MODE_GRAY4 :: + * A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps + * in font files according to the OpenType specification. We haven't + * found a single font using this format, however. + * + * FT_PIXEL_MODE_LCD :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on LCD displays; the bitmap is three times wider than + * the original glyph image. See also @FT_RENDER_MODE_LCD. + * + * FT_PIXEL_MODE_LCD_V :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on rotated LCD displays; the bitmap is three times + * taller than the original glyph image. See also + * @FT_RENDER_MODE_LCD_V. + * + * FT_PIXEL_MODE_BGRA :: + * [Since 2.5] An image with four 8-bit channels per pixel, + * representing a color image (such as emoticons) with alpha channel. + * For each pixel, the format is BGRA, which means, the blue channel + * comes first in memory. The color channels are pre-multiplied and in + * the sRGB colorspace. For example, full red at half-translucent + * opacity will be represented as '00,00,80,80', not '00,00,FF,80'. + * See also @FT_LOAD_COLOR. + */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + FT_PIXEL_MODE_BGRA, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */ + /* values instead. */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + + /************************************************************************** + * + * @struct: + * FT_Bitmap + * + * @description: + * A structure used to describe a bitmap or pixmap to the raster. Note + * that we now manage pixmaps of various depths through the `pixel_mode` + * field. + * + * @fields: + * rows :: + * The number of bitmap rows. + * + * width :: + * The number of pixels in bitmap row. + * + * pitch :: + * The pitch's absolute value is the number of bytes taken by one + * bitmap row, including padding. However, the pitch is positive when + * the bitmap has a 'down' flow, and negative when it has an 'up' flow. + * In all cases, the pitch is an offset to add to a bitmap pointer in + * order to go down one row. + * + * Note that 'padding' means the alignment of a bitmap to a byte + * border, and FreeType functions normally align to the smallest + * possible integer value. + * + * For the B/W rasterizer, `pitch` is always an even number. + * + * To change the pitch of a bitmap (say, to make it a multiple of 4), + * use @FT_Bitmap_Convert. Alternatively, you might use callback + * functions to directly render to the application's surface; see the + * file `example2.cpp` in the tutorial for a demonstration. + * + * buffer :: + * A typeless pointer to the bitmap buffer. This value should be + * aligned on 32-bit boundaries in most cases. + * + * num_grays :: + * This field is only used with @FT_PIXEL_MODE_GRAY; it gives the + * number of gray levels used in the bitmap. + * + * pixel_mode :: + * The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode + * for possible values. + * + * palette_mode :: + * This field is intended for paletted pixel modes; it indicates how + * the palette is stored. Not used currently. + * + * palette :: + * A typeless pointer to the bitmap palette; this field is intended for + * paletted pixel modes. Not used currently. + */ + typedef struct FT_Bitmap_ + { + unsigned int rows; + unsigned int width; + int pitch; + unsigned char* buffer; + unsigned short num_grays; + unsigned char pixel_mode; + unsigned char palette_mode; + void* palette; + + } FT_Bitmap; + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Outline + * + * @description: + * This structure is used to describe an outline to the scan-line + * converter. + * + * @fields: + * n_contours :: + * The number of contours in the outline. + * + * n_points :: + * The number of points in the outline. + * + * points :: + * A pointer to an array of `n_points` @FT_Vector elements, giving the + * outline's point coordinates. + * + * tags :: + * A pointer to an array of `n_points` chars, giving each outline + * point's type. + * + * If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier + * control point, while it is 'on' if set. + * + * Bit~1 is meaningful for 'off' points only. If set, it indicates a + * third-order Bezier arc control point; and a second-order control + * point if unset. + * + * If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in + * the OpenType specification; the value is the same as the argument to + * the 'SCANMODE' instruction). + * + * Bits 3 and~4 are reserved for internal purposes. + * + * contours :: + * An array of `n_contours` shorts, giving the end point of each + * contour within the outline. For example, the first contour is + * defined by the points '0' to `contours[0]`, the second one is + * defined by the points `contours[0]+1` to `contours[1]`, etc. + * + * flags :: + * A set of bit flags used to characterize the outline and give hints + * to the scan-converter and hinter on how to convert/grid-fit it. See + * @FT_OUTLINE_XXX. + * + * @note: + * The B/W rasterizer only checks bit~2 in the `tags` array for the first + * point of each contour. The drop-out mode as given with + * @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden. + */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* */ + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /************************************************************************** + * + * @enum: + * FT_OUTLINE_XXX + * + * @description: + * A list of bit-field constants used for the flags in an outline's + * `flags` field. + * + * @values: + * FT_OUTLINE_NONE :: + * Value~0 is reserved. + * + * FT_OUTLINE_OWNER :: + * If set, this flag indicates that the outline's field arrays (i.e., + * `points`, `flags`, and `contours`) are 'owned' by the outline + * object, and should thus be freed when it is destroyed. + * + * FT_OUTLINE_EVEN_ODD_FILL :: + * By default, outlines are filled using the non-zero winding rule. If + * set to 1, the outline will be filled using the even-odd fill rule + * (only works with the smooth rasterizer). + * + * FT_OUTLINE_REVERSE_FILL :: + * By default, outside contours of an outline are oriented in + * clock-wise direction, as defined in the TrueType specification. + * This flag is set if the outline uses the opposite direction + * (typically for Type~1 fonts). This flag is ignored by the scan + * converter. + * + * FT_OUTLINE_IGNORE_DROPOUTS :: + * By default, the scan converter will try to detect drop-outs in an + * outline and correct the glyph bitmap to ensure consistent shape + * continuity. If set, this flag hints the scan-line converter to + * ignore such cases. See below for more information. + * + * FT_OUTLINE_SMART_DROPOUTS :: + * Select smart dropout control. If unset, use simple dropout control. + * Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_INCLUDE_STUBS :: + * If set, turn pixels on for 'stubs', otherwise exclude them. Ignored + * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_HIGH_PRECISION :: + * This flag indicates that the scan-line converter should try to + * convert this outline to bitmaps with the highest possible quality. + * It is typically set for small character sizes. Note that this is + * only a hint that might be completely ignored by a given + * scan-converter. + * + * FT_OUTLINE_SINGLE_PASS :: + * This flag is set to force a given scan-converter to only use a + * single pass over the outline to render a bitmap glyph image. + * Normally, it is set for very large character sizes. It is only a + * hint that might be completely ignored by a given scan-converter. + * + * @note: + * The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer. + * + * There exists a second mechanism to pass the drop-out mode to the B/W + * rasterizer; see the `tags` field in @FT_Outline. + * + * Please refer to the description of the 'SCANTYPE' instruction in the + * OpenType specification (in file `ttinst1.doc`) how simple drop-outs, + * smart drop-outs, and stubs are defined. + */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /* these constants are deprecated; use the corresponding */ + /* `FT_OUTLINE_XXX` values instead */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 0x03 ) + + /* see the `tags` field in `FT_Outline` for a description of the values */ +#define FT_CURVE_TAG_ON 0x01 +#define FT_CURVE_TAG_CONIC 0x00 +#define FT_CURVE_TAG_CUBIC 0x02 + +#define FT_CURVE_TAG_HAS_SCANMODE 0x04 + +#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + /* values 0x20, 0x40, and 0x80 are reserved */ + + + /* these constants are deprecated; use the corresponding */ + /* `FT_CURVE_TAG_XXX` values instead */ +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /************************************************************************** + * + * @functype: + * FT_Outline_MoveToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'move to' + * function during outline walking/decomposition. + * + * A 'move to' is emitted to start a new contour in an outline. + * + * @input: + * to :: + * A pointer to the target point of the 'move to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_LineToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'line to' + * function during outline walking/decomposition. + * + * A 'line to' is emitted to indicate a segment in the outline. + * + * @input: + * to :: + * A pointer to the target point of the 'line to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_ConicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'conic to' + * function during outline walking or decomposition. + * + * A 'conic to' is emitted to indicate a second-order Bezier arc in the + * outline. + * + * @input: + * control :: + * An intermediate control point between the last position and the new + * target in `to`. + * + * to :: + * A pointer to the target end point of the conic arc. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_CubicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'cubic to' + * function during outline walking or decomposition. + * + * A 'cubic to' is emitted to indicate a third-order Bezier arc. + * + * @input: + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to the second Bezier control point. + * + * to :: + * A pointer to the target end point. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /************************************************************************** + * + * @struct: + * FT_Outline_Funcs + * + * @description: + * A structure to hold various function pointers used during outline + * decomposition in order to emit segments, conic, and cubic Beziers. + * + * @fields: + * move_to :: + * The 'move to' emitter. + * + * line_to :: + * The segment emitter. + * + * conic_to :: + * The second-order Bezier arc emitter. + * + * cubic_to :: + * The third-order Bezier arc emitter. + * + * shift :: + * The shift that is applied to coordinates before they are sent to the + * emitter. + * + * delta :: + * The delta that is applied to coordinates before they are sent to the + * emitter, but after the shift. + * + * @note: + * The point coordinates sent to the emitters are the transformed version + * of the original coordinates (this is important for high accuracy + * during scan-conversion). The transformation is simple: + * + * ``` + * x' = (x << shift) - delta + * y' = (y << shift) - delta + * ``` + * + * Set the values of `shift` and `delta` to~0 to get the original point + * coordinates. + */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_TAG + * + * @description: + * This macro converts four-letter tags to an unsigned long type. + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Glyph_Format + * + * @description: + * An enumeration type used to describe the format of a given glyph + * image. Note that this version of FreeType only supports two image + * formats, even though future font drivers will be able to register + * their own format. + * + * @values: + * FT_GLYPH_FORMAT_NONE :: + * The value~0 is reserved. + * + * FT_GLYPH_FORMAT_COMPOSITE :: + * The glyph image is a composite of several other images. This format + * is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report + * compound glyphs (like accented characters). + * + * FT_GLYPH_FORMAT_BITMAP :: + * The glyph image is a bitmap, and can be described as an @FT_Bitmap. + * You generally need to access the `bitmap` field of the + * @FT_GlyphSlotRec structure to read it. + * + * FT_GLYPH_FORMAT_OUTLINE :: + * The glyph image is a vectorial outline made of line segments and + * Bezier arcs; it can be described as an @FT_Outline; you generally + * want to access the `outline` field of the @FT_GlyphSlotRec structure + * to read it. + * + * FT_GLYPH_FORMAT_PLOTTER :: + * The glyph image is a vectorial path with no inside and outside + * contours. Some Type~1 fonts, like those in the Hershey family, + * contain glyphs in this format. These are described as @FT_Outline, + * but FreeType isn't currently capable of rendering them correctly. + */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_Format` values instead. */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * A raster is a scan converter, in charge of rendering an outline into a + * bitmap. This section contains the public API for rasters. + * + * Note that in FreeType 2, all rasters are now encapsulated within + * specific modules called 'renderers'. See `ftrender.h` for more details + * on renderers. + * + */ + + + /************************************************************************** + * + * @section: + * raster + * + * @title: + * Scanline Converter + * + * @abstract: + * How vectorial outlines are converted into bitmaps and pixmaps. + * + * @description: + * This section contains technical definitions. + * + * @order: + * FT_Raster + * FT_Span + * FT_SpanFunc + * + * FT_Raster_Params + * FT_RASTER_FLAG_XXX + * + * FT_Raster_NewFunc + * FT_Raster_DoneFunc + * FT_Raster_ResetFunc + * FT_Raster_SetModeFunc + * FT_Raster_RenderFunc + * FT_Raster_Funcs + * + */ + + + /************************************************************************** + * + * @type: + * FT_Raster + * + * @description: + * An opaque handle (pointer) to a raster object. Each object can be + * used independently to convert an outline into a bitmap or pixmap. + */ + typedef struct FT_RasterRec_* FT_Raster; + + + /************************************************************************** + * + * @struct: + * FT_Span + * + * @description: + * A structure used to model a single span of gray pixels when rendering + * an anti-aliased bitmap. + * + * @fields: + * x :: + * The span's horizontal start position. + * + * len :: + * The span's length in pixels. + * + * coverage :: + * The span color/coverage, ranging from 0 (background) to 255 + * (foreground). + * + * @note: + * This structure is used by the span drawing callback type named + * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. + * + * The coverage value is always between 0 and 255. If you want less gray + * values, the callback function has to reduce them. + */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /************************************************************************** + * + * @functype: + * FT_SpanFunc + * + * @description: + * A function used as a call-back by the anti-aliased renderer in order + * to let client applications draw themselves the gray pixel spans on + * each scan line. + * + * @input: + * y :: + * The scanline's y~coordinate. + * + * count :: + * The number of spans to draw on this scanline. + * + * spans :: + * A table of `count` spans to draw on the scanline. + * + * user :: + * User-supplied data that is passed to the callback. + * + * @note: + * This callback allows client applications to directly render the gray + * spans of the anti-aliased bitmap to any kind of surfaces. + * + * This can be used to write anti-aliased outlines directly to a given + * background bitmap, and even perform translucency. + */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitTest_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitSet_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @enum: + * FT_RASTER_FLAG_XXX + * + * @description: + * A list of bit flag constants as used in the `flags` field of a + * @FT_Raster_Params structure. + * + * @values: + * FT_RASTER_FLAG_DEFAULT :: + * This value is 0. + * + * FT_RASTER_FLAG_AA :: + * This flag is set to indicate that an anti-aliased glyph image should + * be generated. Otherwise, it will be monochrome (1-bit). + * + * FT_RASTER_FLAG_DIRECT :: + * This flag is set to indicate direct rendering. In this mode, client + * applications must provide their own span callback. This lets them + * directly draw or compose over an existing bitmap. If this bit is + * not set, the target pixmap's buffer _must_ be zeroed before + * rendering. + * + * Direct rendering is only possible with anti-aliased glyphs. + * + * FT_RASTER_FLAG_CLIP :: + * This flag is only used in direct rendering mode. If set, the output + * will be clipped to a box specified in the `clip_box` field of the + * @FT_Raster_Params structure. + * + * Note that by default, the glyph bitmap is clipped to the target + * pixmap, except in direct rendering mode where all spans are + * generated if no clipping box is set. + */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* these constants are deprecated; use the corresponding */ + /* `FT_RASTER_FLAG_XXX` values instead */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /************************************************************************** + * + * @struct: + * FT_Raster_Params + * + * @description: + * A structure to hold the arguments used by a raster's render function. + * + * @fields: + * target :: + * The target bitmap. + * + * source :: + * A pointer to the source glyph image (e.g., an @FT_Outline). + * + * flags :: + * The rendering flags. + * + * gray_spans :: + * The gray span drawing callback. + * + * black_spans :: + * Unused. + * + * bit_test :: + * Unused. + * + * bit_set :: + * Unused. + * + * user :: + * User-supplied data that is passed to each drawing callback. + * + * clip_box :: + * An optional clipping box. It is only used in direct rendering mode. + * Note that coordinates here should be expressed in _integer_ pixels + * (and not in 26.6 fixed-point units). + * + * @note: + * An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA bit + * flag is set in the `flags` field, otherwise a monochrome bitmap is + * generated. + * + * If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags`, the raster + * will call the `gray_spans` callback to draw gray pixel spans. This + * allows direct composition over a pre-existing bitmap through + * user-provided callbacks to perform the span drawing and composition. + * Not supported by the monochrome rasterizer. + */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* unused */ + FT_Raster_BitTest_Func bit_test; /* unused */ + FT_Raster_BitSet_Func bit_set; /* unused */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /************************************************************************** + * + * @functype: + * FT_Raster_NewFunc + * + * @description: + * A function used to create a new raster object. + * + * @input: + * memory :: + * A handle to the memory allocator. + * + * @output: + * raster :: + * A handle to the new raster object. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The `memory` parameter is a typeless pointer in order to avoid + * un-wanted dependencies on the rest of the FreeType code. In practice, + * it is an @FT_Memory object, i.e., a handle to the standard FreeType + * memory allocator. However, this field can be completely ignored by a + * given raster implementation. + */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_DoneFunc + * + * @description: + * A function used to destroy a given raster object. + * + * @input: + * raster :: + * A handle to the raster object. + */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_ResetFunc + * + * @description: + * FreeType used to provide an area of memory called the 'render pool' + * available to all registered rasterizers. This was not thread safe, + * however, and now FreeType never allocates this pool. + * + * This function is called after a new raster object is created. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * pool_base :: + * Previously, the address in memory of the render pool. Set this to + * `NULL`. + * + * pool_size :: + * Previously, the size in bytes of the render pool. Set this to 0. + * + * @note: + * Rasterizers should rely on dynamic or stack allocation if they want to + * (a handle to the memory allocator is passed to the rasterizer + * constructor). + */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_SetModeFunc + * + * @description: + * This function is a generic facility to change modes or attributes in a + * given raster. This can be used for debugging purposes, or simply to + * allow implementation-specific 'features' in a given raster module. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * mode :: + * A 4-byte tag used to name the mode or property. + * + * args :: + * A pointer to the new mode/property to use. + */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_RenderFunc + * + * @description: + * Invoke a given raster to scan-convert a given glyph image into a + * target bitmap. + * + * @input: + * raster :: + * A handle to the raster object. + * + * params :: + * A pointer to an @FT_Raster_Params structure used to store the + * rendering parameters. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The exact format of the source image depends on the raster's glyph + * format defined in its @FT_Raster_Funcs structure. It can be an + * @FT_Outline or anything else in order to support a large array of + * glyph formats. + * + * Note also that the render function can fail and return a + * `FT_Err_Unimplemented_Feature` error code if the raster used does not + * support direct composition. + */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /************************************************************************** + * + * @struct: + * FT_Raster_Funcs + * + * @description: + * A structure used to describe a given raster class to the library. + * + * @fields: + * glyph_format :: + * The supported glyph format for this raster. + * + * raster_new :: + * The raster constructor. + * + * raster_reset :: + * Used to reset the render pool within the raster. + * + * raster_render :: + * A function to render a glyph into a given bitmap. + * + * raster_done :: + * The raster destructor. + */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + /* */ + + +FT_END_HEADER + +#endif /* FTIMAGE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/ftincrem.h b/linux/include/freetype2/freetype/ftincrem.h new file mode 100644 index 00000000..a4db02b5 --- /dev/null +++ b/linux/include/freetype2/freetype/ftincrem.h @@ -0,0 +1,344 @@ +/**************************************************************************** + * + * ftincrem.h + * + * FreeType incremental loading (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTINCREM_H_ +#define FTINCREM_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * 'incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application. + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * 'incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript + * interpreters), where the glyph data isn't in the font file, or must be + * overridden by different values. + * + * @note: + * It is up to client applications to create and implement + * @FT_Incremental objects, as long as they provide implementations for + * the methods @FT_Incremental_GetGlyphDataFunc, + * @FT_Incremental_FreeGlyphDataFunc and + * @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned by + * the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical` argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the 'glyf' table. For PostScript formats, it must correspond to the + * **unencrypted** charstring bytes, without any `lenIV` header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release the + * data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place + * from the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. The original + * glyph metrics, if any, in font units. If metrics are not available + * all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data incrementally. + * Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does not + * provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * ``` + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * ``` + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /* */ + + +FT_END_HEADER + +#endif /* FTINCREM_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftlcdfil.h b/linux/include/freetype2/freetype/ftlcdfil.h new file mode 100644 index 00000000..3a19d043 --- /dev/null +++ b/linux/include/freetype2/freetype/ftlcdfil.h @@ -0,0 +1,328 @@ +/**************************************************************************** + * + * ftlcdfil.h + * + * FreeType API for color filtering of subpixel bitmap glyphs + * (specification). + * + * Copyright (C) 2006-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLCDFIL_H_ +#define FTLCDFIL_H_ + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lcd_rendering + * + * @title: + * Subpixel Rendering + * + * @abstract: + * API to control subpixel rendering. + * + * @description: + * FreeType provides two alternative subpixel rendering technologies. + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h` file, this enables patented ClearType-style rendering. + * Otherwise, Harmony LCD rendering is enabled. These technologies are + * controlled differently and API described below, although always + * available, performs its function when appropriate method is enabled + * and does nothing otherwise. + * + * ClearType-style LCD rendering exploits the color-striped structure of + * LCD pixels, increasing the available resolution in the direction of + * the stripe (usually horizontal RGB) by a factor of~3. Using the + * subpixels coverages unfiltered can create severe color fringes + * especially when rendering thin features. Indeed, to produce + * black-on-white text, the nearby color subpixels must be dimmed + * equally. + * + * A good 5-tap FIR filter should be applied to subpixel coverages + * regardless of pixel boundaries and should have these properties: + * + * 1. It should be symmetrical, like {~a, b, c, b, a~}, to avoid + * any shifts in appearance. + * + * 2. It should be color-balanced, meaning a~+ b~=~c, to reduce color + * fringes by distributing the computed coverage for one subpixel to + * all subpixels equally. + * + * 3. It should be normalized, meaning 2a~+ 2b~+ c~=~1.0 to maintain + * overall brightness. + * + * Boxy 3-tap filter {0, 1/3, 1/3, 1/3, 0} is sharper but is less + * forgiving of non-ideal gamma curves of a screen (and viewing angles), + * beveled filters are fuzzier but more tolerant. + * + * Use the @FT_Library_SetLcdFilter or @FT_Library_SetLcdFilterWeights + * API to specify a low-pass filter, which is then applied to + * subpixel-rendered bitmaps generated through @FT_Render_Glyph. + * + * Harmony LCD rendering is suitable to panels with any regular subpixel + * structure, not just monitors with 3 color striped subpixels, as long + * as the color subpixels have fixed positions relative to the pixel + * center. In this case, each color channel is then rendered separately + * after shifting the outline opposite to the subpixel shift so that the + * coverage maps are aligned. This method is immune to color fringes + * because the shifts do not change integral coverage. + * + * The subpixel geometry must be specified by xy-coordinates for each + * subpixel. By convention they may come in the RGB order: {{-1/3, 0}, + * {0, 0}, {1/3, 0}} for standard RGB striped panel or {{-1/6, 1/4}, + * {-1/6, -1/4}, {1/3, 0}} for a certain PenTile panel. + * + * Use the @FT_Library_SetLcdGeometry API to specify subpixel positions. + * If one follows the RGB order convention, the same order applies to the + * resulting @FT_PIXEL_MODE_LCD and @FT_PIXEL_MODE_LCD_V bitmaps. Note, + * however, that the coordinate frame for the latter must be rotated + * clockwise. Harmony with default LCD geometry is equivalent to + * ClearType with light filter. + * + * As a result of ClearType filtering or Harmony rendering, the + * dimensions of LCD bitmaps can be either wider or taller than the + * dimensions of the corresponding outline with regard to the pixel grid. + * For example, for @FT_RENDER_MODE_LCD, the filter adds 2~subpixels to + * the left, and 2~subpixels to the right. The bitmap offset values are + * adjusted accordingly, so clients shouldn't need to modify their layout + * and glyph positioning code when enabling the filter. + * + * The ClearType and Harmony rendering is applicable to glyph bitmaps + * rendered through @FT_Render_Glyph, @FT_Load_Glyph, @FT_Load_Char, and + * @FT_Glyph_To_Bitmap, when @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V + * is specified. This API does not control @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * The described algorithms can completely remove color artefacts when + * combined with gamma-corrected alpha blending in linear space. Each of + * the 3~alpha values (subpixels) must by independently used to blend one + * color channel. That is, red alpha blends the red channel of the text + * color with the red channel of the background pixel. + */ + + + /************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * This is a beveled, normalized, and color-balanced five-tap filter + * with weights of [0x08 0x4D 0x56 0x4D 0x08] in 1/256th units. + * + * FT_LCD_FILTER_LIGHT :: + * this is a boxy, normalized, and color-balanced three-tap filter with + * weights of [0x00 0x55 0x56 0x55 0x00] in 1/256th units. + * + * FT_LCD_FILTER_LEGACY :: + * FT_LCD_FILTER_LEGACY1 :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. The second value is + * provided for compatibility with FontConfig, which historically used + * different enumeration, sometimes incorrectly forwarded to FreeType. + * + * @since: + * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2) + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY1 = 3, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work well + * on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter` value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to **PATENTS** covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature` if the + * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilterWeights + * + * @description: + * This function can be used to enable LCD filter with custom weights, + * instead of using presets in @FT_Library_SetLcdFilter. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights in 1/256th units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Due to **PATENTS** covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature` if the + * configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * LCD filter weights can also be set per face using @FT_Face_Properties + * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + + /************************************************************************** + * + * @type: + * FT_LcdFiveTapFilter + * + * @description: + * A typedef for passing the five LCD filter weights to + * @FT_Face_Properties within an @FT_Parameter structure. + * + * @since: + * 2.8 + * + */ +#define FT_LCD_FILTER_FIVE_TAPS 5 + + typedef FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdGeometry + * + * @description: + * This function can be used to modify default positions of color + * subpixels, which controls Harmony LCD rendering. + * + * @input: + * library :: + * A handle to the target library instance. + * + * sub :: + * A pointer to an array of 3 vectors in 26.6 fractional pixel format; + * the function modifies the default values, see the note below. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Subpixel geometry examples: + * + * - {{-21, 0}, {0, 0}, {21, 0}} is the default, corresponding to 3 color + * stripes shifted by a third of a pixel. This could be an RGB panel. + * + * - {{21, 0}, {0, 0}, {-21, 0}} looks the same as the default but can + * specify a BGR panel instead, while keeping the bitmap in the same + * RGB888 format. + * + * - {{0, 21}, {0, 0}, {0, -21}} is the vertical RGB, but the bitmap + * stays RGB888 as a result. + * + * - {{-11, 16}, {-11, -16}, {22, 0}} is a certain PenTile arrangement. + * + * This function does nothing and returns `FT_Err_Unimplemented_Feature` + * in the context of ClearType-style subpixel rendering when + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is defined in your build of the + * library. + * + * @since: + * 2.10.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLCDFIL_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftlist.h b/linux/include/freetype2/freetype/ftlist.h new file mode 100644 index 00000000..4782892d --- /dev/null +++ b/linux/include/freetype2/freetype/ftlist.h @@ -0,0 +1,297 @@ +/**************************************************************************** + * + * ftlist.h + * + * Generic list support for FreeType (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file implements functions relative to list processing. Its data + * structures are defined in `freetype.h`. + * + */ + + +#ifndef FTLIST_H_ +#define FTLIST_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * list_processing + * + * @title: + * List Processing + * + * @abstract: + * Simple management of lists. + * + * @description: + * This section contains various definitions related to list processing + * using doubly-linked nodes. + * + * @order: + * FT_List + * FT_ListNode + * FT_ListRec + * FT_ListNodeRec + * + * FT_List_Add + * FT_List_Insert + * FT_List_Find + * FT_List_Remove + * FT_List_Up + * FT_List_Iterate + * FT_List_Iterator + * FT_List_Finalize + * FT_List_Destructor + * + */ + + + /************************************************************************** + * + * @function: + * FT_List_Find + * + * @description: + * Find the list node for a given listed object. + * + * @input: + * list :: + * A pointer to the parent list. + * data :: + * The address of the listed object. + * + * @return: + * List node. `NULL` if it wasn't found. + */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /************************************************************************** + * + * @function: + * FT_List_Add + * + * @description: + * Append an element to the end of a list. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to append. + */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Insert + * + * @description: + * Insert an element at the head of a list. + * + * @inout: + * list :: + * A pointer to parent list. + * node :: + * The node to insert. + */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Remove + * + * @description: + * Remove a node from a list. This function doesn't check whether the + * node is in the list! + * + * @input: + * node :: + * The node to remove. + * + * @inout: + * list :: + * A pointer to the parent list. + */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Up + * + * @description: + * Move a node to the head/top of a list. Used to maintain LRU lists. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to move. + */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @functype: + * FT_List_Iterator + * + * @description: + * An FT_List iterator function that is called during a list parse by + * @FT_List_Iterate. + * + * @input: + * node :: + * The current iteration list node. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. Can be used to point + * to the iteration's state. + */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Iterate + * + * @description: + * Parse a list and calls a given iterator function on each element. + * Note that parsing is stopped as soon as one of the iterator calls + * returns a non-zero value. + * + * @input: + * list :: + * A handle to the list. + * iterator :: + * An iterator function, called on each node of the list. + * user :: + * A user-supplied field that is passed as the second argument to the + * iterator. + * + * @return: + * The result (a FreeType error code) of the last iterator call. + */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_List_Destructor + * + * @description: + * An @FT_List iterator function that is called during a list + * finalization by @FT_List_Finalize to destroy all elements in a given + * list. + * + * @input: + * system :: + * The current system object. + * + * data :: + * The current object to destroy. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. It can be used to + * point to the iteration's state. + */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Finalize + * + * @description: + * Destroy all elements in the list as well as the list itself. + * + * @input: + * list :: + * A handle to the list. + * + * destroy :: + * A list destructor that will be applied to each element of the list. + * Set this to `NULL` if not needed. + * + * memory :: + * The current memory object that handles deallocation. + * + * user :: + * A user-supplied field that is passed as the last argument to the + * destructor. + * + * @note: + * This function expects that all nodes added by @FT_List_Add or + * @FT_List_Insert have been dynamically allocated. + */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLIST_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftlzw.h b/linux/include/freetype2/freetype/ftlzw.h new file mode 100644 index 00000000..fd22968f --- /dev/null +++ b/linux/include/freetype2/freetype/ftlzw.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * ftlzw.h + * + * LZW-compressed stream support. + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLZW_H_ +#define FTLZW_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lzw + * + * @title: + * LZW Streams + * + * @abstract: + * Using LZW-compressed font files. + * + * @description: + * This section contains the declaration of LZW-specific functions. + * + */ + + /************************************************************************** + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is mainly + * used to support the compressed `*.pcf.Z` fonts that come with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it and + * re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLZW_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftmac.h b/linux/include/freetype2/freetype/ftmac.h new file mode 100644 index 00000000..92b9f3dc --- /dev/null +++ b/linux/include/freetype2/freetype/ftmac.h @@ -0,0 +1,290 @@ +/**************************************************************************** + * + * ftmac.h + * + * Additional Mac-specific API. + * + * Copyright (C) 1996-2019 by + * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * NOTE: Include this file after `FT_FREETYPE_H` and after any + * Mac-specific headers (because this header uses Mac types such as + * 'Handle', 'FSSpec', 'FSRef', etc.) + * + */ + + +#ifndef FTMAC_H_ +#define FTMAC_H_ + + +#include + + +FT_BEGIN_HEADER + + + /* gcc-3.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 4 ) || \ + ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) ) +#define FT_DEPRECATED_ATTRIBUTE __attribute__(( deprecated )) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /************************************************************************** + * + * @section: + * mac_specific + * + * @title: + * Mac Specific Interface + * + * @abstract: + * Only available on the Macintosh. + * + * @description: + * The following definitions are only available if FreeType is compiled + * on a Macintosh. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FOND + * + * @description: + * Create a new face object from a FOND resource. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * fond :: + * A FOND resource. + * + * face_index :: + * Only supported for the -1 'sanity check' special case. + * + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * This function can be used to create @FT_Face objects from fonts that + * are installed in the system as follows. + * + * ``` + * fond = GetResource( 'FOND', fontName ); + * error = FT_New_Face_From_FOND( library, fond, 0, &face ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font (e.g., Times New Roman Bold). + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_ATS_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFilePath_From_Mac_ATS_Name + * + * @description: + * Return a pathname of the disk file and face index for given font name + * that is handled by ATS framework. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * path :: + * Buffer to store pathname of the file. For passing to @FT_New_Face. + * The client must allocate this buffer before calling this function. + * + * maxPathSize :: + * Lengths of the buffer `path` that client allocated. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSSpec + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSSpec to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSSpec to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSSpec is identical to @FT_New_Face except it + * accepts an FSSpec instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSRef + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSRef to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSRef to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSRef is identical to @FT_New_Face except it accepts + * an FSRef instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* FTMAC_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftmm.h b/linux/include/freetype2/freetype/ftmm.h new file mode 100644 index 00000000..f2e16b64 --- /dev/null +++ b/linux/include/freetype2/freetype/ftmm.h @@ -0,0 +1,753 @@ +/**************************************************************************** + * + * ftmm.h + * + * FreeType Multiple Master font interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMM_H_ +#define FTMM_H_ + + +#include +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * multiple_masters + * + * @title: + * Multiple Masters + * + * @abstract: + * How to manage Multiple Masters fonts. + * + * @description: + * The following types and functions are used to manage Multiple Master + * fonts, i.e., the selection of specific design instances by setting + * design axis coordinates. + * + * Besides Adobe MM fonts, the interface supports Apple's TrueType GX and + * OpenType variation fonts. Some of the routines only work with Adobe + * MM fonts, others will work with all three types. They are similar + * enough that a consistent interface makes sense. + * + */ + + + /************************************************************************** + * + * @struct: + * FT_MM_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple Masters + * fonts. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * name :: + * The axis's name. + * + * minimum :: + * The axis's minimum design coordinate. + * + * maximum :: + * The axis's maximum design coordinate. + */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Multi_Master + * + * @description: + * A structure to model the axes and space of a Multiple Masters font. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * num_axis :: + * Number of axes. Cannot exceed~4. + * + * num_designs :: + * Number of designs; should be normally 2^num_axis even though the + * Type~1 specification strangely allows for intermediate designs to be + * present. This number cannot exceed~16. + * + * axis :: + * A table of axis descriptors. + */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /************************************************************************** + * + * @struct: + * FT_Var_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple + * Masters, TrueType GX, and OpenType variation fonts. + * + * @fields: + * name :: + * The axis's name. Not always meaningful for TrueType GX or OpenType + * variation fonts. + * + * minimum :: + * The axis's minimum design coordinate. + * + * def :: + * The axis's default design coordinate. FreeType computes meaningful + * default values for Adobe MM fonts. + * + * maximum :: + * The axis's maximum design coordinate. + * + * tag :: + * The axis's tag (the equivalent to 'name' for TrueType GX and + * OpenType variation fonts). FreeType provides default values for + * Adobe MM fonts if possible. + * + * strid :: + * The axis name entry in the font's 'name' table. This is another + * (and often better) version of the 'name' field for TrueType GX or + * OpenType variation fonts. Not meaningful for Adobe MM fonts. + * + * @note: + * The fields `minimum`, `def`, and `maximum` are 16.16 fractional values + * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the + * values are integers. + */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Var_Named_Style + * + * @description: + * A structure to model a named instance in a TrueType GX or OpenType + * variation font. + * + * This structure can't be used for Adobe MM fonts. + * + * @fields: + * coords :: + * The design coordinates for this instance. This is an array with one + * entry for each axis. + * + * strid :: + * The entry in 'name' table identifying this instance. + * + * psid :: + * The entry in 'name' table identifying a PostScript name for this + * instance. Value 0xFFFF indicates a missing entry. + */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + FT_UInt psid; /* since 2.7.1 */ + + } FT_Var_Named_Style; + + + /************************************************************************** + * + * @struct: + * FT_MM_Var + * + * @description: + * A structure to model the axes and space of an Adobe MM, TrueType GX, + * or OpenType variation font. + * + * Some fields are specific to one format and not to the others. + * + * @fields: + * num_axis :: + * The number of axes. The maximum value is~4 for Adobe MM fonts; no + * limit in TrueType GX or OpenType variation fonts. + * + * num_designs :: + * The number of designs; should be normally 2^num_axis for Adobe MM + * fonts. Not meaningful for TrueType GX or OpenType variation fonts + * (where every glyph could have a different number of designs). + * + * num_namedstyles :: + * The number of named styles; a 'named style' is a tuple of design + * coordinates that has a string ID (in the 'name' table) associated + * with it. The font can tell the user that, for example, + * [Weight=1.5,Width=1.1] is 'Bold'. Another name for 'named style' is + * 'named instance'. + * + * For Adobe Multiple Masters fonts, this value is always zero because + * the format does not support named styles. + * + * axis :: + * An axis descriptor table. TrueType GX and OpenType variation fonts + * contain slightly more data than Adobe MM fonts. Memory management + * of this pointer is done internally by FreeType. + * + * namedstyle :: + * A named style (instance) table. Only meaningful for TrueType GX and + * OpenType variation fonts. Memory management of this pointer is done + * internally by FreeType. + */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /************************************************************************** + * + * @function: + * FT_Get_Multi_Master + * + * @description: + * Retrieve a variation descriptor of a given Adobe MM font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The Multiple Masters descriptor. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Var + * + * @description: + * Retrieve a variation descriptor for a given font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The variation descriptor. Allocates a data structure, which the + * user must deallocate with a call to @FT_Done_MM_Var after use. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Done_MM_Var + * + * @description: + * Free the memory allocated by @FT_Get_MM_Var. + * + * @input: + * library :: + * A handle of the face's parent library object that was used in the + * call to @FT_Get_MM_Var to create `amaster`. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Design_Coordinates + * + * @description: + * For Adobe MM fonts, choose an interpolated font design through design + * coordinates. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Design_Coordinates + * + * @description: + * Choose an interpolated font design through design coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Design_Coordinates + * + * @description: + * Get the design coordinates of the currently selected interpolated + * font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of design coordinates to retrieve. If it is larger than + * the number of axes, set the excess values to~0. + * + * @output: + * coords :: + * The design coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Blend_Coordinates + * + * @description: + * Choose an interpolated font design through normalized blend + * coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * The design coordinates array (each element must be between 0 and 1.0 + * for Adobe MM fonts, and between -1.0 and 1.0 for TrueType GX and + * OpenType variation fonts). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Blend_Coordinates + * + * @description: + * Get the normalized blend coordinates of the currently selected + * interpolated font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of normalized blend coordinates to retrieve. If it is + * larger than the number of axes, set the excess values to~0.5 for + * Adobe MM fonts, and to~0 for TrueType GX and OpenType variation + * fonts. + * + * @output: + * coords :: + * The normalized blend coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Set_MM_Blend_Coordinates. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Get_MM_Blend_Coordinates. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_WeightVector + * + * @description: + * For Adobe MM fonts, choose an interpolated font design by directly + * setting the weight vector. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * len :: + * The length of the weight vector array. If it is larger than the + * number of designs, the extra values are ignored. If it is less than + * the number of designs, the remaining values are set to zero. + * + * weightvector :: + * An array representing the weight vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the weight vector to~16. + * + * If `len` is zero and `weightvector` is `NULL`, the weight vector array + * is reset to the default values. + * + * The Adobe documentation also states that the values in the + * WeightVector array must total 1.0 +/-~0.001. In practice this does + * not seem to be enforced, so is not enforced here, either. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_WeightVector + * + * @description: + * For Adobe MM fonts, retrieve the current weight vector of the font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * len :: + * A pointer to the size of the array to be filled. If the size of the + * array is less than the number of designs, `FT_Err_Invalid_Argument` + * is returned, and `len` is set to the required size (the number of + * designs). If the size of the array is greater than the number of + * designs, the remaining entries are set to~0. On successful + * completion, `len` is set to the number of designs (i.e., the number + * of values written to the array). + * + * @output: + * weightvector :: + * An array to be filled. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the WeightVector to~16. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @enum: + * FT_VAR_AXIS_FLAG_XXX + * + * @description: + * A list of bit flags used in the return value of + * @FT_Get_Var_Axis_Flags. + * + * @values: + * FT_VAR_AXIS_FLAG_HIDDEN :: + * The variation axis should not be exposed to user interfaces. + * + * @since: + * 2.8.1 + */ +#define FT_VAR_AXIS_FLAG_HIDDEN 1 + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Axis_Flags + * + * @description: + * Get the 'flags' field of an OpenType Variation Axis Record. + * + * Not meaningful for Adobe MM fonts (`*flags` is always zero). + * + * @input: + * master :: + * The variation descriptor. + * + * axis_index :: + * The index of the requested variation axis. + * + * @output: + * flags :: + * The 'flags' field. See @FT_VAR_AXIS_FLAG_XXX for possible values. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.8.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ); + + + /************************************************************************** + * + * @function: + * FT_Set_Named_Instance + * + * @description: + * Set or change the current named instance. + * + * @input: + * face :: + * A handle to the source face. + * + * instance_index :: + * The index of the requested instance, starting with value 1. If set + * to value 0, FreeType switches to font access without a named + * instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The function uses the value of `instance_index` to set bits 16-30 of + * the face's `face_index` field. It also resets any variation applied + * to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's + * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will + * return false). + * + * For Adobe MM fonts (which don't have named instances) this function + * simply resets the current face to the default instance. + * + * @since: + * 2.9 + */ + FT_EXPORT( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMM_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftmodapi.h b/linux/include/freetype2/freetype/ftmodapi.h new file mode 100644 index 00000000..88488bfe --- /dev/null +++ b/linux/include/freetype2/freetype/ftmodapi.h @@ -0,0 +1,785 @@ +/**************************************************************************** + * + * ftmodapi.h + * + * FreeType modules public interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMODAPI_H_ +#define FTMODAPI_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + * @title: + * Module Management + * + * @abstract: + * How to add, upgrade, remove, and control modules from FreeType. + * + * @description: + * The definitions below are used to manage modules within FreeType. + * Modules can be added, upgraded, and removed at runtime. Additionally, + * some module properties can be controlled also. + * + * Here is a list of possible values of the `module_name` field in the + * @FT_Module_Class structure. + * + * ``` + * autofitter + * bdf + * cff + * gxvalid + * otvalid + * pcf + * pfr + * psaux + * pshinter + * psnames + * raster1 + * sfnt + * smooth, smooth-lcd, smooth-lcdv + * truetype + * type1 + * type42 + * t1cid + * winfonts + * ``` + * + * Note that the FreeType Cache sub-system is not a FreeType module. + * + * @order: + * FT_Module + * FT_Module_Constructor + * FT_Module_Destructor + * FT_Module_Requester + * FT_Module_Class + * + * FT_Add_Module + * FT_Get_Module + * FT_Remove_Module + * FT_Add_Default_Modules + * + * FT_Property_Set + * FT_Property_Get + * FT_Set_Default_Properties + * + * FT_New_Library + * FT_Done_Library + * FT_Reference_Library + * + * FT_Renderer + * FT_Renderer_Class + * + * FT_Get_Renderer + * FT_Set_Renderer + * + * FT_Set_Debug_Hook + * + */ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ +#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */ + /* produces LIGHT hints */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER +#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY + + + typedef FT_Pointer FT_Module_Interface; + + + /************************************************************************** + * + * @functype: + * FT_Module_Constructor + * + * @description: + * A function used to initialize (not create) a new module object. + * + * @input: + * module :: + * The module to initialize. + */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Destructor + * + * @description: + * A function used to finalize (not destroy) a given module object. + * + * @input: + * module :: + * The module to finalize. + */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Requester + * + * @description: + * A function used to query a given module for a specific interface. + * + * @input: + * module :: + * The module to be searched. + * + * name :: + * The name of the interface in the module. + */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /************************************************************************** + * + * @struct: + * FT_Module_Class + * + * @description: + * The module class descriptor. While being a public structure necessary + * for FreeType's module bookkeeping, most of the fields are essentially + * internal, not to be used directly by an application. + * + * @fields: + * module_flags :: + * Bit flags describing the module. + * + * module_size :: + * The size of one module object/instance in bytes. + * + * module_name :: + * The name of the module. + * + * module_version :: + * The version, as a 16.16 fixed number (major.minor). + * + * module_requires :: + * The version of FreeType this module requires, as a 16.16 fixed + * number (major.minor). Starts at version 2.0, i.e., 0x20000. + * + * module_interface :: + * A typeless pointer to a structure (which varies between different + * modules) that holds the module's interface functions. This is + * essentially what `get_interface` returns. + * + * module_init :: + * The initializing function. + * + * module_done :: + * The finalizing function. + * + * get_interface :: + * The interface requesting function. + */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /************************************************************************** + * + * @function: + * FT_Add_Module + * + * @description: + * Add a new module to a given library instance. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * clazz :: + * A pointer to class descriptor for the module. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /************************************************************************** + * + * @function: + * FT_Get_Module + * + * @description: + * Find a module by its name. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module handle. 0~if none was found. + * + * @note: + * FreeType's internal modules aren't documented very well, and you + * should look up the source code for details. + */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /************************************************************************** + * + * @function: + * FT_Remove_Module + * + * @description: + * Remove a given module from a library instance. + * + * @inout: + * library :: + * A handle to a library object. + * + * @input: + * module :: + * A handle to a module object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The module object is destroyed by the function in case of success. + */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /************************************************************************** + * + * @function: + * FT_Property_Set + * + * @description: + * Set a property for a given module. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * Note that only a few modules have properties. + * + * value :: + * A generic pointer to a variable or structure that gives the new + * value of the property. The exact definition of `value` is + * dependent on the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example sets property 'bar' (a simple integer) in + * module 'foo' to value~1. + * + * ``` + * FT_UInt bar; + * + * + * bar = 1; + * FT_Property_Set( library, "foo", "bar", &bar ); + * ``` + * + * Note that the FreeType Cache sub-system doesn't recognize module + * property changes. To avoid glyph lookup confusion within the cache + * you should call @FTC_Manager_Reset to completely flush the cache if a + * module property gets changed after @FTC_Manager_New has been called. + * + * It is not possible to set properties of the FreeType Cache sub-system + * itself with FT_Property_Set; use @FTC_Property_Set instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ); + + + /************************************************************************** + * + * @function: + * FT_Property_Get + * + * @description: + * Get a module's property value. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * @inout: + * value :: + * A generic pointer to a variable or structure that gives the value + * of the property. The exact definition of `value` is dependent on + * the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example gets property 'baz' (a range) in module 'foo'. + * + * ``` + * typedef range_ + * { + * FT_Int32 min; + * FT_Int32 max; + * + * } range; + * + * range baz; + * + * + * FT_Property_Get( library, "foo", "baz", &baz ); + * ``` + * + * It is not possible to retrieve properties of the FreeType Cache + * sub-system with FT_Property_Get; use @FTC_Property_Get instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Properties + * + * @description: + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + * + * If the compilation option is not set, this function does nothing. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 \ + * autofitter:warping=1 + * ``` + * + * @inout: + * library :: + * A handle to a new library object. + * + * @since: + * 2.8 + */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Library + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Library structure + * is created. This function increments the counter. @FT_Done_Library + * then only destroys a library if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Library objects. + * + * @input: + * library :: + * A handle to a target library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_New_Library + * + * @description: + * This function is used to create a new FreeType library instance from a + * given memory object. It is thus possible to use libraries with + * distinct memory allocators within the same program. Note, however, + * that the used @FT_Memory structure is expected to remain valid for the + * life of the @FT_Library object. + * + * Normally, you would call this function (followed by a call to + * @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a + * call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to + * initialize the FreeType library. + * + * Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library + * instance. + * + * @input: + * memory :: + * A handle to the original memory object. + * + * @output: + * alibrary :: + * A pointer to handle of a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_Library + * + * @description: + * Discard a given library object. This closes all drivers and discards + * all resource objects. + * + * @input: + * library :: + * A handle to the target library. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + + + /************************************************************************** + * + * @functype: + * FT_DebugHook_Func + * + * @description: + * A drop-in replacement (or rather a wrapper) for the bytecode or + * charstring interpreter's main loop function. + * + * Its job is essentially + * + * - to activate debug mode to enforce single-stepping, + * + * - to call the main loop function to interpret the next opcode, and + * + * - to show the changed context to the user. + * + * An example for such a main loop function is `TT_RunIns` (declared in + * FreeType's internal header file `src/truetype/ttinterp.h`). + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of a drop-in replacement. + * + * @inout: + * arg :: + * A typeless pointer, to be cast to the main loop function's data + * structure (which depends on the font module). For TrueType fonts + * it is bytecode interpreter's execution context, `TT_ExecContext`, + * which is declared in FreeType's internal header file `tttypes.h`. + */ + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /************************************************************************** + * + * @enum: + * FT_DEBUG_HOOK_XXX + * + * @description: + * A list of named debug hook indices. + * + * @values: + * FT_DEBUG_HOOK_TRUETYPE:: + * This hook index identifies the TrueType bytecode debugger. + */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /************************************************************************** + * + * @function: + * FT_Set_Debug_Hook + * + * @description: + * Set a debug hook function for debugging the interpreter of a font + * format. + * + * While this is a public API function, an application needs access to + * FreeType's internal header files to do something useful. + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of its usage. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * hook_index :: + * The index of the debug hook. You should use defined enumeration + * macros like @FT_DEBUG_HOOK_TRUETYPE. + * + * debug_hook :: + * The function used to debug the interpreter. + * + * @note: + * Currently, four debug hook slots are available, but only one (for the + * TrueType interpreter) is defined. + */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /************************************************************************** + * + * @function: + * FT_Add_Default_Modules + * + * @description: + * Add the set of default drivers to a given library object. This is + * only useful when you create a library object with @FT_New_Library + * (usually to plug a custom memory manager). + * + * @inout: + * library :: + * A handle to a new library object. + */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode engine is + * implemented in a given FT_Library instance. It is used by the + * @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * Deprecated and removed. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers the full + * instruction set of the TrueType virtual machine (this was governed + * by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @function: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of the + * TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMODAPI_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftmoderr.h b/linux/include/freetype2/freetype/ftmoderr.h new file mode 100644 index 00000000..e1699357 --- /dev/null +++ b/linux/include/freetype2/freetype/ftmoderr.h @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * ftmoderr.h + * + * FreeType module error offsets (specification). + * + * Copyright (C) 2001-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the FreeType module error codes. + * + * If the macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` in `ftoption.h` is + * set, the lower byte of an error value identifies the error code as + * usual. In addition, the higher byte identifies the module. For + * example, the error `FT_Err_Invalid_File_Format` has value 0x0003, the + * error `TT_Err_Invalid_File_Format` has value 0x1303, the error + * `T1_Err_Invalid_File_Format` has value 0x1403, etc. + * + * Note that `FT_Err_Ok`, `TT_Err_Ok`, etc. are always equal to zero, + * including the high byte. + * + * If `FT_CONFIG_OPTION_USE_MODULE_ERRORS` isn't set, the higher byte of an + * error value is set to zero. + * + * To hide the various `XXX_Err_` prefixes in the source code, FreeType + * provides some macros in `fttypes.h`. + * + * FT_ERR( err ) + * + * Add current error module prefix (as defined with the `FT_ERR_PREFIX` + * macro) to `err`. For example, in the BDF module the line + * + * ``` + * error = FT_ERR( Invalid_Outline ); + * ``` + * + * expands to + * + * ``` + * error = BDF_Err_Invalid_Outline; + * ``` + * + * For simplicity, you can always use `FT_Err_Ok` directly instead of + * `FT_ERR( Ok )`. + * + * FT_ERR_EQ( errcode, err ) + * FT_ERR_NEQ( errcode, err ) + * + * Compare error code `errcode` with the error `err` for equality and + * inequality, respectively. Example: + * + * ``` + * if ( FT_ERR_EQ( error, Invalid_Outline ) ) + * ... + * ``` + * + * Using this macro you don't have to think about error prefixes. Of + * course, if module errors are not active, the above example is the + * same as + * + * ``` + * if ( error == FT_Err_Invalid_Outline ) + * ... + * ``` + * + * FT_ERROR_BASE( errcode ) + * FT_ERROR_MODULE( errcode ) + * + * Get base error and module error code, respectively. + * + * It can also be used to create a module error message table easily with + * something like + * + * ``` + * #undef FTMODERR_H_ + * #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, + * #define FT_MODERR_START_LIST { + * #define FT_MODERR_END_LIST { 0, 0 } }; + * + * const struct + * { + * int mod_err_offset; + * const char* mod_err_msg + * } ft_mod_errors[] = + * + * #include FT_MODULE_ERRORS_H + * ``` + * + */ + + +#ifndef FTMODERR_H_ +#define FTMODERR_H_ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" ) + FT_MODERRDEF( Cache, 0x400, "cache module" ) + FT_MODERRDEF( CFF, 0x500, "CFF module" ) + FT_MODERRDEF( CID, 0x600, "CID module" ) + FT_MODERRDEF( Gzip, 0x700, "Gzip module" ) + FT_MODERRDEF( LZW, 0x800, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0xA00, "PCF module" ) + FT_MODERRDEF( PFR, 0xB00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xE00, "PS names module" ) + FT_MODERRDEF( Raster, 0xF00, "raster module" ) + FT_MODERRDEF( SFNT, 0x1000, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1200, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1300, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1400, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" ) + FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* FTMODERR_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftotval.h b/linux/include/freetype2/freetype/ftotval.h new file mode 100644 index 00000000..c034f489 --- /dev/null +++ b/linux/include/freetype2/freetype/ftotval.h @@ -0,0 +1,207 @@ +/**************************************************************************** + * + * ftotval.h + * + * FreeType API for validating OpenType tables (specification). + * + * Copyright (C) 2004-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * + * Warning: This module might be moved to a different library in the + * future to avoid a tight dependency between FreeType and the + * OpenType specification. + * + * + */ + + +#ifndef FTOTVAL_H_ +#define FTOTVAL_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * ot_validation + * + * @title: + * OpenType Validation + * + * @abstract: + * An API to validate OpenType tables. + * + * @description: + * This section contains the declaration of functions to validate some + * OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + * @order: + * FT_OpenType_Validate + * FT_OpenType_Free + * + * FT_VALIDATE_OTXXX + * + */ + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT ( FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH ) + + + /************************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A `NULL` value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + + /************************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOTVAL_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftoutln.h b/linux/include/freetype2/freetype/ftoutln.h new file mode 100644 index 00000000..75c3d015 --- /dev/null +++ b/linux/include/freetype2/freetype/ftoutln.h @@ -0,0 +1,593 @@ +/**************************************************************************** + * + * ftoutln.h + * + * Support for the FT_Outline type used to store glyph shapes of + * most scalable font formats (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOUTLN_H_ +#define FTOUTLN_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + * @title: + * Outline Processing + * + * @abstract: + * Functions to create, transform, and render vectorial glyph images. + * + * @description: + * This section contains routines used to create and destroy scalable + * glyph images known as 'outlines'. These can also be measured, + * transformed, and converted into bitmaps and pixmaps. + * + * @order: + * FT_Outline + * FT_Outline_New + * FT_Outline_Done + * FT_Outline_Copy + * FT_Outline_Translate + * FT_Outline_Transform + * FT_Outline_Embolden + * FT_Outline_EmboldenXY + * FT_Outline_Reverse + * FT_Outline_Check + * + * FT_Outline_Get_CBox + * FT_Outline_Get_BBox + * + * FT_Outline_Get_Bitmap + * FT_Outline_Render + * FT_Outline_Decompose + * FT_Outline_Funcs + * FT_Outline_MoveToFunc + * FT_Outline_LineToFunc + * FT_Outline_ConicToFunc + * FT_Outline_CubicToFunc + * + * FT_Orientation + * FT_Outline_Get_Orientation + * + * FT_OUTLINE_XXX + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Decompose + * + * @description: + * Walk over an outline's structure to decompose it into individual + * segments and Bezier arcs. This function also emits 'move to' + * operations to indicate the start of new contours in the outline. + * + * @input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of 'emitters', i.e., function pointers called during + * decomposition to indicate path operations. + * + * @inout: + * user :: + * A typeless pointer that is passed to each emitter during the + * decomposition. It can be used to store the state during the + * decomposition. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * A contour that contains a single point only is represented by a 'move + * to' operation followed by 'line to' to the same point. In most cases, + * it is best to filter this out before using the outline for stroking + * purposes (otherwise it would result in a visible dot when round caps + * are used). + * + * Similarly, the function returns success for an empty outline also + * (doing nothing, this is, not calling any emitter); if necessary, you + * should filter this out, too. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_Outline_New + * + * @description: + * Create a new outline of a given size. + * + * @input: + * library :: + * A handle to the library object from where the outline is allocated. + * Note however that the new outline will **not** necessarily be + * **freed**, when destroying the library, by @FT_Done_FreeType. + * + * numPoints :: + * The maximum number of points within the outline. Must be smaller + * than or equal to 0xFFFF (65535). + * + * numContours :: + * The maximum number of contours within the outline. This value must + * be in the range 0 to `numPoints`. + * + * @output: + * anoutline :: + * A handle to the new outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The reason why this function takes a `library` parameter is simply to + * use the library's memory allocator. + */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Done + * + * @description: + * Destroy an outline created with @FT_Outline_New. + * + * @input: + * library :: + * A handle of the library object used to allocate the outline. + * + * outline :: + * A pointer to the outline object to be discarded. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the outline's 'owner' field is not set, only the outline descriptor + * will be released. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Check + * + * @description: + * Check the contents of an outline descriptor. + * + * @input: + * outline :: + * A handle to a source outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An empty outline, or an outline with a single point only is also + * valid. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_CBox + * + * @description: + * Return an outline's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * outline :: + * A pointer to the source outline descriptor. + * + * @output: + * acbox :: + * The outline's control box. + * + * @note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Translate + * + * @description: + * Apply a simple translation to the points of an outline. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * xOffset :: + * The horizontal offset. + * + * yOffset :: + * The vertical offset. + */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Copy + * + * @description: + * Copy an outline into another one. Both objects must have the same + * sizes (number of points & number of contours) when this function is + * called. + * + * @input: + * source :: + * A handle to the source outline. + * + * @output: + * target :: + * A handle to the target outline. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Transform + * + * @description: + * Apply a simple 2x2 matrix to all of an outline's points. Useful for + * applying rotations, slanting, flipping, etc. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * matrix :: + * A pointer to the transformation matrix. + * + * @note: + * You can use @FT_Outline_Translate if you need to translate the + * outline's points. + */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Embolden + * + * @description: + * Embolden an outline. The new outline will be at most 4~times + * `strength` pixels wider and higher. You may think of the left and + * bottom borders as unchanged. + * + * Negative `strength` values to reduce the outline thickness are + * possible also. + * + * @inout: + * outline :: + * A handle to the target outline. + * + * @input: + * strength :: + * How strong the glyph is emboldened. Expressed in 26.6 pixel format. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The used algorithm to increase or decrease the thickness of the glyph + * doesn't change the number of points; this means that certain + * situations like acute angles or intersections are sometimes handled + * incorrectly. + * + * If you need 'better' metrics values you should call + * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. + * + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. + * + * @example: + * ``` + * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + * + * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + * FT_Outline_Embolden( &face->glyph->outline, strength ); + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_EmboldenXY + * + * @description: + * Embolden an outline. The new outline will be `xstrength` pixels wider + * and `ystrength` pixels higher. Otherwise, it is similar to + * @FT_Outline_Embolden, which uses the same strength in both directions. + * + * @since: + * 2.4.10 + */ + FT_EXPORT( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Reverse + * + * @description: + * Reverse the drawing direction of an outline. This is used to ensure + * consistent fill conventions for mirrored glyphs. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @note: + * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the + * outline's `flags` field. + * + * It shouldn't be used by a normal client application, unless it knows + * what it is doing. + */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Bitmap + * + * @description: + * Render an outline within a bitmap. The outline's image is simply + * OR-ed to the target bitmap. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * abitmap :: + * A pointer to the target bitmap descriptor. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does **not create** the bitmap, it only renders an + * outline image within the one you pass to it! Consequently, the + * various fields in `abitmap` should be set accordingly. + * + * It will use the raster corresponding to the default glyph format. + * + * The value of the `num_grays` field in `abitmap` is ignored. If you + * select the gray-level rasterizer, and you want less than 256 gray + * levels, you have to use @FT_Outline_Render directly. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Render + * + * @description: + * Render an outline within a bitmap using the current scan-convert. + * This function uses an @FT_Raster_Params structure as an argument, + * allowing advanced features like direct composition, translucency, etc. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * params :: + * A pointer to an @FT_Raster_Params structure used to describe the + * rendering operation. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should know what you are doing and how @FT_Raster_Params works to + * use this function. + * + * The field `params.source` will be set to `outline` before the scan + * converter is called, which means that the value you give to it is + * actually ignored. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * less gray levels, you have to provide your own span callback. See the + * @FT_RASTER_FLAG_DIRECT value of the `flags` field in the + * @FT_Raster_Params structure for more details. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must be + * filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise + * contours must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its fill + * orientation (see @FT_Orientation). This is done by integrating the + * total area covered by the outline. The positive integral corresponds + * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is + * returned. The negative integral corresponds to the counter-clockwise + * orientation and @FT_ORIENTATION_TRUETYPE is returned. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOUTLN_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/ftparams.h b/linux/include/freetype2/freetype/ftparams.h new file mode 100644 index 00000000..c374ee2f --- /dev/null +++ b/linux/include/freetype2/freetype/ftparams.h @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftparams.h + * + * FreeType API for possible FT_Parameter tags (specification only). + * + * Copyright (C) 2017-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPARAMS_H_ +#define FTPARAMS_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * parameter_tags + * + * @title: + * Parameter Tags + * + * @abstract: + * Macros for driver property and font loading parameter tags. + * + * @description: + * This section contains macros for the @FT_Parameter structure that are + * used with various functions to activate some special functionality or + * different behaviour of various components of FreeType. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * family names in the 'name' table (introduced in OpenType version 1.4). + * Use this for backward compatibility with legacy systems that have a + * four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * subfamily names in the 'name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * An @FT_Parameter tag to be used with @FT_Open_Face to indicate + * incremental glyph loading. + * + */ +#define FT_PARAM_TAG_INCREMENTAL \ + FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_LCD_FILTER_WEIGHTS + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding argument specifies the five LCD filter weights for a + * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the + * global default values or the values set up with + * @FT_Library_SetLcdFilterWeights. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \ + FT_MAKE_TAG( 'l', 'c', 'd', 'f' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_RANDOM_SEED + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding 32bit signed integer argument overrides the font + * driver's random seed value with a face-specific one; see @random-seed. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_RANDOM_SEED \ + FT_MAKE_TAG( 's', 'e', 'e', 'd' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_STEM_DARKENING + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding Boolean argument specifies whether to apply stem + * darkening, overriding the global default values or the values set up + * with @FT_Property_Set (see @no-stem-darkening). + * + * This is a passive setting that only takes effect if the font driver or + * autohinter honors it, which the CFF, Type~1, and CID drivers always + * do, but the autohinter only in 'light' hinting mode (as of version + * 2.9). + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_STEM_DARKENING \ + FT_MAKE_TAG( 'd', 'a', 'r', 'k' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * Deprecated, no effect. + * + * Previously: A constant used as the tag of an @FT_Parameter structure + * to indicate that unpatented methods only should be used by the + * TrueType bytecode interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING \ + FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + + /* */ + + +FT_END_HEADER + + +#endif /* FTPARAMS_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftpfr.h b/linux/include/freetype2/freetype/ftpfr.h new file mode 100644 index 00000000..b4eca76e --- /dev/null +++ b/linux/include/freetype2/freetype/ftpfr.h @@ -0,0 +1,180 @@ +/**************************************************************************** + * + * ftpfr.h + * + * FreeType API for accessing PFR-specific data (specification only). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPFR_H_ +#define FTPFR_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * pfr_fonts + * + * @title: + * PFR Fonts + * + * @abstract: + * PFR/TrueDoc-specific API. + * + * @description: + * This section contains the declaration of PFR-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: + * Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed in + * metrics units to device subpixels. This is equivalent to + * `face->size->x_scale`, but for metrics only. Optional (parameter + * can be `NULL`). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale` but for the vertical direction. + * optional (parameter can be `NULL`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: + * A handle to the input face. + * + * left :: + * Index of the left glyph. + * + * right :: + * Index of the right glyph. + * + * @output: + * avector :: + * A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics units. + * This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED mode, + * which always returns distances converted to outline units. + * + * You can use the value of the `x_scale` and `y_scale` parameters + * returned by @FT_Get_PFR_Metrics to scale these to device subpixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: + * A handle to the input face. + * + * gindex :: + * The glyph index. + * + * @output: + * aadvance :: + * The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale` or `y_scale` results of @FT_Get_PFR_Metrics + * to convert the advance to device subpixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* FTPFR_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftrender.h b/linux/include/freetype2/freetype/ftrender.h new file mode 100644 index 00000000..a01c7742 --- /dev/null +++ b/linux/include/freetype2/freetype/ftrender.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * ftrender.h + * + * FreeType renderer modules public interface (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTRENDER_H_ +#define FTRENDER_H_ + + +#include +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /************************************************************************** + * + * @struct: + * FT_Renderer_Class + * + * @description: + * The renderer module class descriptor. + * + * @fields: + * root :: + * The root @FT_Module_Class fields. + * + * glyph_format :: + * The glyph image format this renderer handles. + * + * render_glyph :: + * A method used to render the image that is in a given glyph slot into + * a bitmap. + * + * transform_glyph :: + * A method used to transform the image that is in a given glyph slot. + * + * get_glyph_cbox :: + * A method used to access the glyph's cbox. + * + * set_mode :: + * A method used to pass additional parameters. + * + * raster_class :: + * For @FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to + * its raster's class. + */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /************************************************************************** + * + * @function: + * FT_Get_Renderer + * + * @description: + * Retrieve the current renderer for a given glyph format. + * + * @input: + * library :: + * A handle to the library object. + * + * format :: + * The glyph format. + * + * @return: + * A renderer handle. 0~if none found. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + * + * To add a new renderer, simply use @FT_Add_Module. To retrieve a + * renderer by its name, use @FT_Get_Module. + */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /************************************************************************** + * + * @function: + * FT_Set_Renderer + * + * @description: + * Set the current renderer to use, and set additional mode. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * renderer :: + * A handle to the renderer object. + * + * num_params :: + * The number of additional parameters. + * + * parameters :: + * Additional parameters. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case of success, the renderer will be used to convert glyph images + * in the renderer's known format into bitmaps. + * + * This doesn't change the current renderer for other formats. + * + * Currently, no FreeType renderer module uses `parameters`; you should + * thus always pass `NULL` as the value. + */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + /* */ + + +FT_END_HEADER + +#endif /* FTRENDER_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftsizes.h b/linux/include/freetype2/freetype/ftsizes.h new file mode 100644 index 00000000..6c63cef2 --- /dev/null +++ b/linux/include/freetype2/freetype/ftsizes.h @@ -0,0 +1,160 @@ +/**************************************************************************** + * + * ftsizes.h + * + * FreeType size objects management (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * Typical application would normally not need to use these functions. + * However, they have been placed in a public API for the rare cases where + * they are needed. + * + */ + + +#ifndef FTSIZES_H_ +#define FTSIZES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sizes_management + * + * @title: + * Size Management + * + * @abstract: + * Managing multiple sizes per face. + * + * @description: + * When creating a new face object (e.g., with @FT_New_Face), an @FT_Size + * object is automatically created and used to store all pixel-size + * dependent information, available in the `face->size` field. + * + * It is however possible to create more sizes for a given face, mostly + * in order to manage several character pixel sizes of the same font + * family and style. See @FT_New_Size and @FT_Done_Size. + * + * Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only modify the + * contents of the current 'active' size; you thus need to use + * @FT_Activate_Size to change it. + * + * 99% of applications won't need the functions provided here, especially + * if they use the caching sub-system, so be cautious when using these. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Size + * + * @description: + * Create a new size object from a given face object. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * asize :: + * A handle to a new size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You need to call @FT_Activate_Size in order to select the new size for + * upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, + * @FT_Load_Glyph, @FT_Load_Char, etc. + */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /************************************************************************** + * + * @function: + * FT_Done_Size + * + * @description: + * Discard a given size object. Note that @FT_Done_Face automatically + * discards all size objects allocated with @FT_New_Size. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /************************************************************************** + * + * @function: + * FT_Activate_Size + * + * @description: + * Even though it is possible to create several size objects for a given + * face (see @FT_New_Size for details), functions like @FT_Load_Glyph or + * @FT_Load_Char only use the one that has been activated last to + * determine the 'current character pixel size'. + * + * This function can be used to 'activate' a previously created size + * object. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `face` is the size's parent face object, this function changes the + * value of `face->size` to the input size handle. + */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSIZES_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftsnames.h b/linux/include/freetype2/freetype/ftsnames.h new file mode 100644 index 00000000..4d43602a --- /dev/null +++ b/linux/include/freetype2/freetype/ftsnames.h @@ -0,0 +1,273 @@ +/**************************************************************************** + * + * ftsnames.h + * + * Simple interface to access SFNT 'name' tables (which are used + * to hold font names, copyright info, notices, etc.) (specification). + * + * This is _not_ used to retrieve glyph names! + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSNAMES_H_ +#define FTSNAMES_H_ + + +#include +#include FT_FREETYPE_H +#include FT_PARAMETER_TAGS_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sfnt_names + * + * @title: + * SFNT Names + * + * @abstract: + * Access the names embedded in TrueType and OpenType files. + * + * @description: + * The TrueType and OpenType specifications allow the inclusion of a + * special names table ('name') in font files. This table contains + * textual (and internationalized) information regarding the font, like + * family name, copyright, version, etc. + * + * The definitions below are used to access them if available. + * + * Note that this has nothing to do with glyph names! + * + */ + + + /************************************************************************** + * + * @struct: + * FT_SfntName + * + * @description: + * A structure used to model an SFNT 'name' table entry. + * + * @fields: + * platform_id :: + * The platform ID for `string`. See @TT_PLATFORM_XXX for possible + * values. + * + * encoding_id :: + * The encoding ID for `string`. See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, + * @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX for possible + * values. + * + * language_id :: + * The language ID for `string`. See @TT_MAC_LANGID_XXX and + * @TT_MS_LANGID_XXX for possible values. + * + * Registered OpenType values for `language_id` are always smaller than + * 0x8000; values equal or larger than 0x8000 usually indicate a + * language tag string (introduced in OpenType version 1.6). Use + * function @FT_Get_Sfnt_LangTag with `language_id` as its argument to + * retrieve the associated language tag. + * + * name_id :: + * An identifier for `string`. See @TT_NAME_ID_XXX for possible + * values. + * + * string :: + * The 'name' string. Note that its format differs depending on the + * (platform,encoding) pair, being either a string of bytes (without a + * terminating `NULL` byte) or containing UTF-16BE entities. + * + * string_len :: + * The length of `string` in bytes. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name_Count + * + * @description: + * Retrieve the number of name strings in the SFNT 'name' table. + * + * @input: + * face :: + * A handle to the source face. + * + * @return: + * The number of strings in the 'name' table. + * + * @note: + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name + * + * @description: + * Retrieve a string of the SFNT 'name' table for a given index. + * + * @input: + * face :: + * A handle to the source face. + * + * idx :: + * The index of the 'name' string. + * + * @output: + * aname :: + * The indexed @FT_SfntName structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `aname` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Use @FT_Get_Sfnt_Name_Count to get the total number of available + * 'name' table entries, then do a loop until you get the right platform, + * encoding, and name ID. + * + * 'name' table format~1 entries can use language tags also, see + * @FT_Get_Sfnt_LangTag. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /************************************************************************** + * + * @struct: + * FT_SfntLangTag + * + * @description: + * A structure to model a language tag entry from an SFNT 'name' table. + * + * @fields: + * string :: + * The language tag string, encoded in UTF-16BE (without trailing + * `NULL` bytes). + * + * string_len :: + * The length of `string` in **bytes**. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + * + * @since: + * 2.8 + */ + typedef struct FT_SfntLangTag_ + { + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntLangTag; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_LangTag + * + * @description: + * Retrieve the language tag associated with a language ID of an SFNT + * 'name' table entry. + * + * @input: + * face :: + * A handle to the source face. + * + * langID :: + * The language ID, as returned by @FT_Get_Sfnt_Name. This is always a + * value larger than 0x8000. + * + * @output: + * alangTag :: + * The language tag associated with the 'name' table entry's language + * ID. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `alangTag` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Only 'name' table format~1 supports language tags. For format~0 + * tables, this function always returns FT_Err_Invalid_Table. For + * invalid format~1 language ID values, FT_Err_Invalid_Argument is + * returned. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + * + * @since: + * 2.8 + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTSNAMES_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftstroke.h b/linux/include/freetype2/freetype/ftstroke.h new file mode 100644 index 00000000..01a9c181 --- /dev/null +++ b/linux/include/freetype2/freetype/ftstroke.h @@ -0,0 +1,772 @@ +/**************************************************************************** + * + * ftstroke.h + * + * FreeType path stroker (specification). + * + * Copyright (C) 2002-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSTROKE_H_ +#define FTSTROKE_H_ + +#include +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial glyph. + * It also allows you to retrieve the 'outside' and/or the 'inside' + * borders of the stroke. + * + * This can be useful to generate 'bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + * + * @order: + * FT_Stroker + * + * FT_Stroker_LineJoin + * FT_Stroker_LineCap + * FT_StrokerBorder + * + * FT_Outline_GetInsideBorder + * FT_Outline_GetOutsideBorder + * + * FT_Glyph_Stroke + * FT_Glyph_StrokeBorder + * + * FT_Stroker_New + * FT_Stroker_Set + * FT_Stroker_Rewind + * FT_Stroker_ParseOutline + * FT_Stroker_Done + * + * FT_Stroker_BeginSubPath + * FT_Stroker_EndSubPath + * + * FT_Stroker_LineTo + * FT_Stroker_ConicTo + * FT_Stroker_CubicTo + * + * FT_Stroker_GetBorderCounts + * FT_Stroker_ExportBorder + * FT_Stroker_GetCounts + * FT_Stroker_Export + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handle to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered in a + * stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used to join + * two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins. The outer corner of the joined + * lines is filled by enclosing the triangular region of the corner + * with a straight line between the outer corners of each stroke. + * + * FT_STROKER_LINEJOIN_MITER_FIXED :: + * Used to render mitered line joins, with fixed bevels if the miter + * limit is exceeded. The outer edges of the strokes for the two + * segments are extended until they meet at an angle. If the segments + * meet at too sharp an angle (such that the miter would extend from + * the intersection of the segments a distance greater than the product + * of the miter limit value and the border radius), then a bevel join + * (see above) is used instead. This prevents long spikes being + * created. `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line + * join as used in PostScript and PDF. + * + * FT_STROKER_LINEJOIN_MITER_VARIABLE :: + * FT_STROKER_LINEJOIN_MITER :: + * Used to render mitered line joins, with variable bevels if the miter + * limit is exceeded. The intersection of the strokes is clipped at a + * line perpendicular to the bisector of the angle between the strokes, + * at the distance from the intersection of the segments equal to the + * product of the miter limit value and the border radius. This + * prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` generates a mitered line join + * as used in XPS. `FT_STROKER_LINEJOIN_MITER` is an alias for + * `FT_STROKER_LINEJOIN_MITER_VARIABLE`, retained for backward + * compatibility. + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL = 1, + FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, + FT_STROKER_LINEJOIN_MITER_FIXED = 3 + + } FT_Stroker_LineJoin; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are rendered in + * a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last point + * itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border in + * @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the 'inside' and 'outside' + * borders. However, there is no direct mapping between these and the + * 'left' and 'right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'inside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'outside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the `FT_STROKER_LINEJOIN_MITER_FIXED` and + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` line join styles, expressed as + * 16.16 fixed-point value. + * + * @note: + * The radius is expressed in the same units as the outline coordinates. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. You should + * call this function before beginning a new series of calls to + * @FT_Stroker_BeginSubPath or @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with the stroker. + * The resulting outline(s) can be retrieved later by functions like + * @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead of + * a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened` is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct 'border' outlines. + * + * If `opened` is~1, the outline is processed as an open path, and the + * stroker generates a single 'stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is not + * stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. If the + * subpath was not 'opened', this function 'draws' a single line segment + * to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * 'Draw' a single line segment in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * 'Draw' a single quadratic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * 'Draw' a single cubic Bezier in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to second Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export one of the 'border' or 'stroke' outlines generated by the + * stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to retrieve + * the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export the + * corresponding border to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to get + * sure that there is enough room in your @FT_Outline object to receive + * all new data. + * + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to retrieve + * all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export all points/borders from the stroked outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export all + * borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be `NULL`. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but only + * return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise the outside + * border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* FTSTROKE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/ftsynth.h b/linux/include/freetype2/freetype/ftsynth.h new file mode 100644 index 00000000..8754f97c --- /dev/null +++ b/linux/include/freetype2/freetype/ftsynth.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * ftsynth.h + * + * FreeType synthesizing code for emboldening and slanting + * (specification). + * + * Copyright (C) 2000-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* 'standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource that should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef FTSYNTH_H_ +#define FTSYNTH_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a 'reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the height, width, and advance metrics are */ + /* increased by the strength of the emboldening -- this even affects */ + /* mono-width fonts! */ + /* */ + /* You can also call @FT_Outline_Get_CBox to get precise values. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSYNTH_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftsystem.h b/linux/include/freetype2/freetype/ftsystem.h new file mode 100644 index 00000000..889a6ba1 --- /dev/null +++ b/linux/include/freetype2/freetype/ftsystem.h @@ -0,0 +1,353 @@ +/**************************************************************************** + * + * ftsystem.h + * + * FreeType low-level system interface definition (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSYSTEM_H_ +#define FTSYSTEM_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * system_interface + * + * @title: + * System Interface + * + * @abstract: + * How FreeType manages memory and i/o. + * + * @description: + * This section contains various definitions related to memory management + * and i/o access. You need to understand this information if you want to + * use a custom memory manager or you own i/o streams. + * + */ + + + /************************************************************************** + * + * M E M O R Y M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************** + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size` bytes from `memory`. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************** + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************** + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************** + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /************************************************************************** + * + * I / O M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + * @also: + * See @FT_StreamRec for the publicly accessible fields of a given stream + * object. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************** + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*` in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************** + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation with + * a `count` of~0. A non-zero return value then indicates an error. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************** + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************** + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to `NULL` for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * In case of compressed streams where the size is unknown before + * actually doing the decompression, the value is set to 0x7FFFFFFF. + * (Note that this size value can occur for normal streams also; it is + * thus just a hint.) + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*` + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set internally + * by FreeType and shouldn't be touched by stream implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. In particular, the `FT_GET_XXX` macros use this instead of + * the `pos` field. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + /* */ + + +FT_END_HEADER + +#endif /* FTSYSTEM_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/fttrigon.h b/linux/include/freetype2/freetype/fttrigon.h new file mode 100644 index 00000000..37e1412f --- /dev/null +++ b/linux/include/freetype2/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * fttrigon.h + * + * FreeType trigonometric functions (specification). + * + * Copyright (C) 2001-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTRIGON_H_ +#define FTTRIGON_H_ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed-point value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************** + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in the 2d + * plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************** + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `angle2-angle1`. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x` will be `cos(angle)`, and the value of + * `vec.y` will be `sin(angle)`. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* FTTRIGON_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/fttypes.h b/linux/include/freetype2/freetype/fttypes.h new file mode 100644 index 00000000..10571505 --- /dev/null +++ b/linux/include/freetype2/freetype/fttypes.h @@ -0,0 +1,615 @@ +/**************************************************************************** + * + * fttypes.h + * + * FreeType simple types definitions (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTYPES_H_ +#define FTTYPES_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + * @title: + * Basic Data Types + * + * @abstract: + * The basic data types defined by the library. + * + * @description: + * This section contains the basic data types defined by FreeType~2, + * ranging from simple scalar types to bitmap descriptors. More + * font-specific structures are defined in a different section. + * + * @order: + * FT_Byte + * FT_Bytes + * FT_Char + * FT_Int + * FT_UInt + * FT_Int16 + * FT_UInt16 + * FT_Int32 + * FT_UInt32 + * FT_Int64 + * FT_UInt64 + * FT_Short + * FT_UShort + * FT_Long + * FT_ULong + * FT_Bool + * FT_Offset + * FT_PtrDist + * FT_String + * FT_Tag + * FT_Error + * FT_Fixed + * FT_Pointer + * FT_Pos + * FT_Vector + * FT_BBox + * FT_Matrix + * FT_FWord + * FT_UFWord + * FT_F2Dot14 + * FT_UnitVector + * FT_F26Dot6 + * FT_Data + * + * FT_MAKE_TAG + * + * FT_Generic + * FT_Generic_Finalizer + * + * FT_Bitmap + * FT_Pixel_Mode + * FT_Palette_Mode + * FT_Glyph_Format + * FT_IMAGE_TAG + * + */ + + + /************************************************************************** + * + * @type: + * FT_Bool + * + * @description: + * A typedef of unsigned char, used for simple booleans. As usual, + * values 1 and~0 represent true and false, respectively. + */ + typedef unsigned char FT_Bool; + + + /************************************************************************** + * + * @type: + * FT_FWord + * + * @description: + * A signed 16-bit integer used to store a distance in original font + * units. + */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /************************************************************************** + * + * @type: + * FT_UFWord + * + * @description: + * An unsigned 16-bit integer used to store a distance in original font + * units. + */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /************************************************************************** + * + * @type: + * FT_Char + * + * @description: + * A simple typedef for the _signed_ char type. + */ + typedef signed char FT_Char; + + + /************************************************************************** + * + * @type: + * FT_Byte + * + * @description: + * A simple typedef for the _unsigned_ char type. + */ + typedef unsigned char FT_Byte; + + + /************************************************************************** + * + * @type: + * FT_Bytes + * + * @description: + * A typedef for constant memory areas. + */ + typedef const FT_Byte* FT_Bytes; + + + /************************************************************************** + * + * @type: + * FT_Tag + * + * @description: + * A typedef for 32-bit tags (as used in the SFNT format). + */ + typedef FT_UInt32 FT_Tag; + + + /************************************************************************** + * + * @type: + * FT_String + * + * @description: + * A simple typedef for the char type, usually used for strings. + */ + typedef char FT_String; + + + /************************************************************************** + * + * @type: + * FT_Short + * + * @description: + * A typedef for signed short. + */ + typedef signed short FT_Short; + + + /************************************************************************** + * + * @type: + * FT_UShort + * + * @description: + * A typedef for unsigned short. + */ + typedef unsigned short FT_UShort; + + + /************************************************************************** + * + * @type: + * FT_Int + * + * @description: + * A typedef for the int type. + */ + typedef signed int FT_Int; + + + /************************************************************************** + * + * @type: + * FT_UInt + * + * @description: + * A typedef for the unsigned int type. + */ + typedef unsigned int FT_UInt; + + + /************************************************************************** + * + * @type: + * FT_Long + * + * @description: + * A typedef for signed long. + */ + typedef signed long FT_Long; + + + /************************************************************************** + * + * @type: + * FT_ULong + * + * @description: + * A typedef for unsigned long. + */ + typedef unsigned long FT_ULong; + + + /************************************************************************** + * + * @type: + * FT_F2Dot14 + * + * @description: + * A signed 2.14 fixed-point type used for unit vectors. + */ + typedef signed short FT_F2Dot14; + + + /************************************************************************** + * + * @type: + * FT_F26Dot6 + * + * @description: + * A signed 26.6 fixed-point type used for vectorial pixel coordinates. + */ + typedef signed long FT_F26Dot6; + + + /************************************************************************** + * + * @type: + * FT_Fixed + * + * @description: + * This type is used to store 16.16 fixed-point values, like scaling + * values or matrix coefficients. + */ + typedef signed long FT_Fixed; + + + /************************************************************************** + * + * @type: + * FT_Error + * + * @description: + * The FreeType error code type. A value of~0 is always interpreted as a + * successful operation. + */ + typedef int FT_Error; + + + /************************************************************************** + * + * @type: + * FT_Pointer + * + * @description: + * A simple typedef for a typeless pointer. + */ + typedef void* FT_Pointer; + + + /************************************************************************** + * + * @type: + * FT_Offset + * + * @description: + * This is equivalent to the ANSI~C `size_t` type, i.e., the largest + * _unsigned_ integer type used to express a file size or position, or a + * memory block size. + */ + typedef size_t FT_Offset; + + + /************************************************************************** + * + * @type: + * FT_PtrDist + * + * @description: + * This is equivalent to the ANSI~C `ptrdiff_t` type, i.e., the largest + * _signed_ integer type used to express the distance between two + * pointers. + */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /************************************************************************** + * + * @struct: + * FT_UnitVector + * + * @description: + * A simple structure used to store a 2D vector unit vector. Uses + * FT_F2Dot14 types. + * + * @fields: + * x :: + * Horizontal coordinate. + * + * y :: + * Vertical coordinate. + */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /************************************************************************** + * + * @struct: + * FT_Matrix + * + * @description: + * A simple structure used to store a 2x2 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is: + * + * ``` + * x' = x*xx + y*xy + * y' = x*yx + y*yy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /************************************************************************** + * + * @struct: + * FT_Data + * + * @description: + * Read-only binary data represented as a pointer and a length. + * + * @fields: + * pointer :: + * The data. + * + * length :: + * The length of the data in bytes. + */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /************************************************************************** + * + * @functype: + * FT_Generic_Finalizer + * + * @description: + * Describe a function used to destroy the 'client' data of any FreeType + * object. See the description of the @FT_Generic type for details of + * usage. + * + * @input: + * The address of the FreeType object that is under finalization. Its + * client data is accessed through its `generic` field. + */ + typedef void (*FT_Generic_Finalizer)( void* object ); + + + /************************************************************************** + * + * @struct: + * FT_Generic + * + * @description: + * Client applications often need to associate their own data to a + * variety of FreeType core objects. For example, a text layout API + * might want to associate a glyph cache to a given size object. + * + * Some FreeType object contains a `generic` field, of type `FT_Generic`, + * which usage is left to client applications and font servers. + * + * It can be used to store a pointer to client-specific data, as well as + * the address of a 'finalizer' function, which will be called by + * FreeType when the object is destroyed (for example, the previous + * client example would put the address of the glyph cache destructor in + * the `finalizer` field). + * + * @fields: + * data :: + * A typeless pointer to any client-specified data. This field is + * completely ignored by the FreeType library. + * + * finalizer :: + * A pointer to a 'generic finalizer' function, which will be called + * when the object is destroyed. If this field is set to `NULL`, no + * code will be called. + */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /************************************************************************** + * + * @macro: + * FT_MAKE_TAG + * + * @description: + * This macro converts four-letter tags that are used to label TrueType + * tables into an unsigned long, to be used within FreeType. + * + * @note: + * The produced values **must** be 32-bit integers. Don't redefine this + * macro. + */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * list_processing + * + */ + + + /************************************************************************** + * + * @type: + * FT_ListNode + * + * @description: + * Many elements and objects in FreeType are listed through an @FT_List + * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a + * handle to a single list element. + */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /************************************************************************** + * + * @type: + * FT_List + * + * @description: + * A handle to a list record (see @FT_ListRec). + */ + typedef struct FT_ListRec_* FT_List; + + + /************************************************************************** + * + * @struct: + * FT_ListNodeRec + * + * @description: + * A structure used to hold a single list element. + * + * @fields: + * prev :: + * The previous element in the list. `NULL` if first. + * + * next :: + * The next element in the list. `NULL` if last. + * + * data :: + * A typeless pointer to the listed object. + */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /************************************************************************** + * + * @struct: + * FT_ListRec + * + * @description: + * A structure used to hold a simple doubly-linked list. These are used + * in many parts of FreeType. + * + * @fields: + * head :: + * The head (first element) of doubly-linked list. + * + * tail :: + * The tail (last element) of doubly-linked list. + */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + /* */ + + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) +#define FT_BOOL( x ) ( (FT_Bool)( (x) != 0 ) ) + + /* concatenate C tokens */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* see `ftmoderr.h` for descriptions of the following macros */ + +#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_ERR_EQ( x, e ) \ + ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) +#define FT_ERR_NEQ( x, e ) \ + ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) + + +FT_END_HEADER + +#endif /* FTTYPES_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ftwinfnt.h b/linux/include/freetype2/freetype/ftwinfnt.h new file mode 100644 index 00000000..3437913d --- /dev/null +++ b/linux/include/freetype2/freetype/ftwinfnt.h @@ -0,0 +1,277 @@ +/**************************************************************************** + * + * ftwinfnt.h + * + * FreeType API for accessing Windows fnt-specific data. + * + * Copyright (C) 2003-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTWINFNT_H_ +#define FTWINFNT_H_ + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * winfnt_fonts + * + * @title: + * Window FNT Files + * + * @abstract: + * Windows FNT-specific API. + * + * @description: + * This section contains the declaration of Windows FNT-specific + * functions. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset` byte in @FT_WinFNT_HeaderRec. + * Exact mapping tables for the various 'cpXXXX' encodings (except for + * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public' in the + * `MAPPINGS/VENDORS/MICSFT/WINDOWS` subdirectory. 'cp1361' is roughly a + * superset of `MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT`. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a 'don't + * care' value. Valid font files don't contain this value. When + * querying for information about the character set of the font that is + * currently selected into a specified device context, this return + * value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Poettgen : + * + * The 'Windows Font Mapping' article says that `FT_WinFNT_ID_OEM` is + * used for the charset of vector fonts, like `modern.fon`, + * `roman.fon`, and `script.fon` on Windows. + * + * The 'CreateFont' documentation says: The `FT_WinFNT_ID_OEM` value + * specifies a character set that is operating-system dependent. + * + * The 'IFIMETRICS' documentation from the 'Windows Driver Development + * Kit' says: This font supports an OEM-specific character set. The + * OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., 'cp1252'), denotes the + * second default codepage that most international versions of Windows + * have. It is one of the OEM codepages from + * + * https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers + * , + * + * and is used for the 'DOS boxes', to support legacy applications. A + * German Windows version for example usually uses ANSI codepage 1252 + * and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different ordering + * and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_HeaderRec + * + * @description: + * Windows FNT Header info. + */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_Header + * + * @description: + * A handle to an @FT_WinFNT_HeaderRec structure. + */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /************************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * aheader :: + * The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + /* */ + + +FT_END_HEADER + +#endif /* FTWINFNT_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/linux/include/freetype2/freetype/t1tables.h b/linux/include/freetype2/freetype/t1tables.h new file mode 100644 index 00000000..645e6457 --- /dev/null +++ b/linux/include/freetype2/freetype/t1tables.h @@ -0,0 +1,774 @@ +/**************************************************************************** + * + * t1tables.h + * + * Basic Type 1/Type 2 tables definitions and interface (specification + * only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1TABLES_H_ +#define T1TABLES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * type1_tables + * + * @title: + * Type 1 Tables + * + * @abstract: + * Type~1-specific font tables. + * + * @description: + * This section contains the definition of Type~1-specific tables, + * including structures related to other PostScript font formats. + * + * @order: + * PS_FontInfoRec + * PS_FontInfo + * PS_PrivateRec + * PS_Private + * + * CID_FaceDictRec + * CID_FaceDict + * CID_FaceInfoRec + * CID_FaceInfo + * + * FT_Has_PS_Glyph_Names + * FT_Get_PS_Font_Info + * FT_Get_PS_Font_Private + * FT_Get_PS_Font_Value + * + * T1_Blend_Flags + * T1_EncodingType + * PS_Dict_Keys + * + */ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /************************************************************************** + * + * @struct: + * PS_FontInfoRec + * + * @description: + * A structure used to model a Type~1 or Type~2 FontInfo dictionary. + * Note that for Multiple Master fonts, each instance has its own + * FontInfo dictionary. + */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /************************************************************************** + * + * @struct: + * PS_FontInfo + * + * @description: + * A handle to a @PS_FontInfoRec structure. + */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /************************************************************************** + * + * @struct: + * T1_FontInfo + * + * @description: + * This type is equivalent to @PS_FontInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_FontInfoRec T1_FontInfo; + + + /************************************************************************** + * + * @struct: + * PS_PrivateRec + * + * @description: + * A structure used to model a Type~1 or Type~2 private dictionary. Note + * that for Multiple Master fonts, each instance has its own Private + * dictionary. + */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /************************************************************************** + * + * @struct: + * PS_Private + * + * @description: + * A handle to a @PS_PrivateRec structure. + */ + typedef struct PS_PrivateRec_* PS_Private; + + + /************************************************************************** + * + * @struct: + * T1_Private + * + * @description: + * This type is equivalent to @PS_PrivateRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_PrivateRec T1_Private; + + + /************************************************************************** + * + * @enum: + * T1_Blend_Flags + * + * @description: + * A set of flags used to indicate which fields are present in a given + * blend dictionary (font info or private). Used to support Multiple + * Masters fonts. + * + * @values: + * T1_BLEND_UNDERLINE_POSITION :: + * T1_BLEND_UNDERLINE_THICKNESS :: + * T1_BLEND_ITALIC_ANGLE :: + * T1_BLEND_BLUE_VALUES :: + * T1_BLEND_OTHER_BLUES :: + * T1_BLEND_STANDARD_WIDTH :: + * T1_BLEND_STANDARD_HEIGHT :: + * T1_BLEND_STEM_SNAP_WIDTHS :: + * T1_BLEND_STEM_SNAP_HEIGHTS :: + * T1_BLEND_BLUE_SCALE :: + * T1_BLEND_BLUE_SHIFT :: + * T1_BLEND_FAMILY_BLUES :: + * T1_BLEND_FAMILY_OTHER_BLUES :: + * T1_BLEND_FORCE_BOLD :: + */ + typedef enum T1_Blend_Flags_ + { + /* required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /* required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + T1_BLEND_MAX /* do not remove */ + + } T1_Blend_Flags; + + + /* these constants are deprecated; use the corresponding */ + /* `T1_Blend_Flags` values instead */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + /* */ + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backward compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backward compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /************************************************************************** + * + * @struct: + * CID_FaceDictRec + * + * @description: + * A structure used to represent data in a CID top-level dictionary. In + * most cases, they are part of the font's '/FDArray' array. Within a + * CID font file, such (internal) subfont dictionaries are enclosed by + * '%ADOBeginFontDict' and '%ADOEndFontDict' comments. + * + * Note that `CID_FaceDictRec` misses a field for the '/FontName' + * keyword, specifying the subfont's name (the top-level font name is + * given by the '/CIDFontName' keyword). This is an oversight, but it + * doesn't limit the 'cid' font module's functionality because FreeType + * neither needs this entry nor gives access to CID subfonts. + */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; /* this is a duplicate of */ + /* `private_dict->expansion_factor' */ + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceDict + * + * @description: + * A handle to a @CID_FaceDictRec structure. + */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + + /************************************************************************** + * + * @struct: + * CID_FontDict + * + * @description: + * This type is equivalent to @CID_FaceDictRec. It is deprecated but + * kept to maintain source compatibility between various versions of + * FreeType. + */ + typedef CID_FaceDictRec CID_FontDict; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfoRec + * + * @description: + * A structure used to represent CID Face information. + */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfo + * + * @description: + * A handle to a @CID_FaceInfoRec structure. + */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /************************************************************************** + * + * @struct: + * CID_Info + * + * @description: + * This type is equivalent to @CID_FaceInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************** + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph names. + * This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that + * certain fonts (mostly TrueType) contain incorrect glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * String pointers within the @PS_FontInfoRec structure are owned by the + * face and don't need to be freed by the caller. Missing entries in + * the font's FontInfo dictionary are represented by `NULL` pointers. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + + /************************************************************************** + * + * @enum: + * T1_EncodingType + * + * @description: + * An enumeration describing the 'Encoding' entry in a Type 1 dictionary. + * + * @values: + * T1_ENCODING_TYPE_NONE :: + * T1_ENCODING_TYPE_ARRAY :: + * T1_ENCODING_TYPE_STANDARD :: + * T1_ENCODING_TYPE_ISOLATIN1 :: + * T1_ENCODING_TYPE_EXPERT :: + * + * @since: + * 2.4.8 + */ + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /************************************************************************** + * + * @enum: + * PS_Dict_Keys + * + * @description: + * An enumeration used in calls to @FT_Get_PS_Font_Value to identify the + * Type~1 dictionary entry to retrieve. + * + * @values: + * PS_DICT_FONT_TYPE :: + * PS_DICT_FONT_MATRIX :: + * PS_DICT_FONT_BBOX :: + * PS_DICT_PAINT_TYPE :: + * PS_DICT_FONT_NAME :: + * PS_DICT_UNIQUE_ID :: + * PS_DICT_NUM_CHAR_STRINGS :: + * PS_DICT_CHAR_STRING_KEY :: + * PS_DICT_CHAR_STRING :: + * PS_DICT_ENCODING_TYPE :: + * PS_DICT_ENCODING_ENTRY :: + * PS_DICT_NUM_SUBRS :: + * PS_DICT_SUBR :: + * PS_DICT_STD_HW :: + * PS_DICT_STD_VW :: + * PS_DICT_NUM_BLUE_VALUES :: + * PS_DICT_BLUE_VALUE :: + * PS_DICT_BLUE_FUZZ :: + * PS_DICT_NUM_OTHER_BLUES :: + * PS_DICT_OTHER_BLUE :: + * PS_DICT_NUM_FAMILY_BLUES :: + * PS_DICT_FAMILY_BLUE :: + * PS_DICT_NUM_FAMILY_OTHER_BLUES :: + * PS_DICT_FAMILY_OTHER_BLUE :: + * PS_DICT_BLUE_SCALE :: + * PS_DICT_BLUE_SHIFT :: + * PS_DICT_NUM_STEM_SNAP_H :: + * PS_DICT_STEM_SNAP_H :: + * PS_DICT_NUM_STEM_SNAP_V :: + * PS_DICT_STEM_SNAP_V :: + * PS_DICT_FORCE_BOLD :: + * PS_DICT_RND_STEM_UP :: + * PS_DICT_MIN_FEATURE :: + * PS_DICT_LEN_IV :: + * PS_DICT_PASSWORD :: + * PS_DICT_LANGUAGE_GROUP :: + * PS_DICT_VERSION :: + * PS_DICT_NOTICE :: + * PS_DICT_FULL_NAME :: + * PS_DICT_FAMILY_NAME :: + * PS_DICT_WEIGHT :: + * PS_DICT_IS_FIXED_PITCH :: + * PS_DICT_UNDERLINE_POSITION :: + * PS_DICT_UNDERLINE_THICKNESS :: + * PS_DICT_FS_TYPE :: + * PS_DICT_ITALIC_ANGLE :: + * + * @since: + * 2.4.8 + */ + typedef enum PS_Dict_Keys_ + { + /* conventionally in the font dictionary */ + PS_DICT_FONT_TYPE, /* FT_Byte */ + PS_DICT_FONT_MATRIX, /* FT_Fixed */ + PS_DICT_FONT_BBOX, /* FT_Fixed */ + PS_DICT_PAINT_TYPE, /* FT_Byte */ + PS_DICT_FONT_NAME, /* FT_String* */ + PS_DICT_UNIQUE_ID, /* FT_Int */ + PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */ + PS_DICT_CHAR_STRING_KEY, /* FT_String* */ + PS_DICT_CHAR_STRING, /* FT_String* */ + PS_DICT_ENCODING_TYPE, /* T1_EncodingType */ + PS_DICT_ENCODING_ENTRY, /* FT_String* */ + + /* conventionally in the font Private dictionary */ + PS_DICT_NUM_SUBRS, /* FT_Int */ + PS_DICT_SUBR, /* FT_String* */ + PS_DICT_STD_HW, /* FT_UShort */ + PS_DICT_STD_VW, /* FT_UShort */ + PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */ + PS_DICT_BLUE_VALUE, /* FT_Short */ + PS_DICT_BLUE_FUZZ, /* FT_Int */ + PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */ + PS_DICT_OTHER_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */ + PS_DICT_BLUE_SCALE, /* FT_Fixed */ + PS_DICT_BLUE_SHIFT, /* FT_Int */ + PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */ + PS_DICT_STEM_SNAP_H, /* FT_Short */ + PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */ + PS_DICT_STEM_SNAP_V, /* FT_Short */ + PS_DICT_FORCE_BOLD, /* FT_Bool */ + PS_DICT_RND_STEM_UP, /* FT_Bool */ + PS_DICT_MIN_FEATURE, /* FT_Short */ + PS_DICT_LEN_IV, /* FT_Int */ + PS_DICT_PASSWORD, /* FT_Long */ + PS_DICT_LANGUAGE_GROUP, /* FT_Long */ + + /* conventionally in the font FontInfo dictionary */ + PS_DICT_VERSION, /* FT_String* */ + PS_DICT_NOTICE, /* FT_String* */ + PS_DICT_FULL_NAME, /* FT_String* */ + PS_DICT_FAMILY_NAME, /* FT_String* */ + PS_DICT_WEIGHT, /* FT_String* */ + PS_DICT_IS_FIXED_PITCH, /* FT_Bool */ + PS_DICT_UNDERLINE_POSITION, /* FT_Short */ + PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ + PS_DICT_FS_TYPE, /* FT_UShort */ + PS_DICT_ITALIC_ANGLE, /* FT_Long */ + + PS_DICT_MAX = PS_DICT_ITALIC_ANGLE + + } PS_Dict_Keys; + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Value + * + * @description: + * Retrieve the value for the supplied key from a PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * key :: + * An enumeration value representing the dictionary key to retrieve. + * + * idx :: + * For array values, this specifies the index to be returned. + * + * value :: + * A pointer to memory into which to write the value. + * + * valen_len :: + * The size, in bytes, of the memory supplied for the value. + * + * @output: + * value :: + * The value matching the above key, if it exists. + * + * @return: + * The amount of memory (in bytes) required to hold the requested value + * (if it exists, -1 otherwise). + * + * @note: + * The values returned are not pointers into the internal structures of + * the face, but are 'fresh' copies, so that the memory containing them + * belongs to the calling application. This also enforces the + * 'read-only' nature of these values, i.e., this function cannot be + * used to manipulate the face. + * + * `value` is a void pointer because the values returned can be of + * various types. + * + * If either `value` is `NULL` or `value_len` is too small, just the + * required memory size for the requested entry is returned. + * + * The `idx` parameter is used, not only to retrieve elements of, for + * example, the FontMatrix or FontBBox, but also to retrieve name keys + * from the CharStrings dictionary, and the charstrings themselves. It + * is ignored for atomic values. + * + * `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To + * get the value as in the font stream, you need to divide by 65536000.0 + * (to remove the FT_Fixed scale, and the x1000 scale). + * + * IMPORTANT: Only key/value pairs read by the FreeType interpreter can + * be retrieved. So, for example, PostScript procedures such as NP, ND, + * and RD are not available. Arbitrary keys are, obviously, not be + * available either. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + * @since: + * 2.4.8 + * + */ + FT_EXPORT( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + /* */ + +FT_END_HEADER + +#endif /* T1TABLES_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/ttnameid.h b/linux/include/freetype2/freetype/ttnameid.h new file mode 100644 index 00000000..cc677de7 --- /dev/null +++ b/linux/include/freetype2/freetype/ttnameid.h @@ -0,0 +1,1236 @@ +/**************************************************************************** + * + * ttnameid.h + * + * TrueType name ID definitions (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTNAMEID_H_ +#define TTNAMEID_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * truetype_tables + */ + + + /************************************************************************** + * + * Possible values for the 'platform' identifier code in the name records + * of an SFNT 'name' table. + * + */ + + + /************************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id` identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id` values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name + * entry. See @TT_MAC_ID_XXX for corresponding `encoding_id` values. + * Note that most TrueType fonts contain an Apple roman charmap to be + * usable on MacOS systems (even if they contain a Microsoft charmap as + * well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is + * however now deprecated. See @TT_ISO_ID_XXX for a list of + * corresponding `encoding_id` values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id` values. + * Note that most fonts contain a Unicode charmap using + * (`TT_PLATFORM_MICROSOFT`, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /************************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations on + * a real cmap. + * + * TT_APPLE_ID_FULL_UNICODE :: + * Used for fallback fonts that provide complete Unicode coverage with + * a type~13 cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_FULL_UNICODE 6 /* used with type 13 cmaps */ + + + /************************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /************************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ISO + * charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /************************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Microsoft symbol encoding. See @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Microsoft WGL4 charmap, matching Unicode. See @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Shift JIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_PRC :: + * Chinese encodings as used in the People's Republic of China (PRC). + * This means the encodings GB~2312 and its supersets GBK and GB~18030. + * See @FT_ENCODING_PRC. + * + * TT_MS_ID_BIG_5 :: + * Traditional Chinese as used in Taiwan and Hong Kong. See + * @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Korean Extended Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Korean Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * UCS-4 or UTF-32 charmaps. This has been added to the OpenType + * specification version 1.4 (mid-2001). + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_PRC 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + /* this value is deprecated */ +#define TT_MS_ID_GB2312 TT_MS_ID_PRC + + + /************************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ADOBE + * charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /************************************************************************** + * + * @enum: + * TT_MAC_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MACINTOSH. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Apple's IDs is + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + */ + +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /************************************************************************** + * + * @enum: + * TT_MS_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MICROSOFT. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Microsoft's IDs is + * + * https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings , + * + * however, we only provide macros for language identifiers present in + * the OpenType specification: Microsoft has abandoned the concept of + * LCIDs (language code identifiers), and format~1 of the 'name' table + * provides a better mechanism for languages not covered here. + * + * More legacy values not listed in the reference can be found in the + * @FT_TRUETYPE_IDS_H header file. + */ + +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1C01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2C01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_CATALAN 0x0403 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 +#define TT_MS_LANGID_CHINESE_MACAO 0x1404 +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1C09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A +#define TT_MS_LANGID_SPANISH_MEXICO 0x080A +#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT 0x0C0A +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A +#define TT_MS_LANGID_SPANISH_PANAMA 0x180A +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1C0A +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200A +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240A +#define TT_MS_LANGID_SPANISH_PERU 0x280A +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2C0A +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300A +#define TT_MS_LANGID_SPANISH_CHILE 0x340A +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380A +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3C0A +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400A +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440A +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480A +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A +#define TT_MS_LANGID_FINNISH_FINLAND 0x040B +#define TT_MS_LANGID_FRENCH_FRANCE 0x040C +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080C +#define TT_MS_LANGID_FRENCH_CANADA 0x0C0C +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C +#define TT_MS_LANGID_FRENCH_MONACO 0x180C +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040D +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_KOREA 0x0412 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_ROMANSH_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041A +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x1C1A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC 0x201A +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081D +#define TT_MS_LANGID_THAI_THAILAND 0x041E +#define TT_MS_LANGID_TURKISH_TURKEY 0x041F +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENIAN_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C +#define TT_MS_LANGID_BASQUE_BASQUE 0x042D +#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY 0x082E +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F +#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043A +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103B +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143B +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183B +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B +#define TT_MS_LANGID_IRISH_IRELAND 0x083C +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043E +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E +#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN 0x043F +#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic*/ 0x0440 +#define TT_MS_LANGID_KISWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_RUSSIA 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ODIA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044A +#define TT_MS_LANGID_KANNADA_INDIA 0x044B +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044C +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044D +#define TT_MS_LANGID_MARATHI_INDIA 0x044E +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044F +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_PRC 0x0850 +#define TT_MS_LANGID_TIBETAN_PRC 0x0451 +#define TT_MS_LANGID_WELSH_UNITED_KINGDOM 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_GALICIAN_GALICIAN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045A +#define TT_MS_LANGID_SINHALA_SRI_LANKA 0x045B +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045D +#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN 0x085D +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E +#define TT_MS_LANGID_TAMAZIGHT_ALGERIA 0x085F +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046A +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B +#define TT_MS_LANGID_QUECHUA_PERU 0x0C6B +#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA 0x046C +#define TT_MS_LANGID_BASHKIR_RUSSIA 0x046D +#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG 0x046E +#define TT_MS_LANGID_GREENLANDIC_GREENLAND 0x046F +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_YI_PRC 0x0478 +#define TT_MS_LANGID_MAPUDUNGUN_CHILE 0x047A +#define TT_MS_LANGID_MOHAWK_MOHAWK 0x047C +#define TT_MS_LANGID_BRETON_FRANCE 0x047E +#define TT_MS_LANGID_UIGHUR_PRC 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_OCCITAN_FRANCE 0x0482 +#define TT_MS_LANGID_CORSICAN_FRANCE 0x0483 +#define TT_MS_LANGID_ALSATIAN_FRANCE 0x0484 +#define TT_MS_LANGID_YAKUT_RUSSIA 0x0485 +#define TT_MS_LANGID_KICHE_GUATEMALA 0x0486 +#define TT_MS_LANGID_KINYARWANDA_RWANDA 0x0487 +#define TT_MS_LANGID_WOLOF_SENEGAL 0x0488 +#define TT_MS_LANGID_DARI_AFGHANISTAN 0x048C + + /* */ + + + /* legacy macro definitions not present in OpenType 1.8.1 */ +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_CATALAN_SPAIN \ + TT_MS_LANGID_CATALAN_CATALAN +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_MACAU \ + TT_MS_LANGID_CHINESE_MACAO +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \ + TT_MS_LANGID_GERMAN_LIECHTENSTEIN +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \ + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C +#define TT_MS_LANGID_FRENCH_REUNION 0x200C +#define TT_MS_LANGID_FRENCH_CONGO 0x240C + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE \ + TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C +#define TT_MS_LANGID_FRENCH_MALI 0x340C +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C +#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \ + TT_MS_LANGID_KOREAN_KOREA +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \ + TT_MS_LANGID_ROMANSH_SWITZERLAND +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_SLOVENE_SLOVENIA \ + TT_MS_LANGID_SLOVENIAN_SLOVENIA +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_BASQUE_SPAIN \ + TT_MS_LANGID_BASQUE_BASQUE +#define TT_MS_LANGID_SORBIAN_GERMANY \ + TT_MS_LANGID_UPPER_SORBIAN_GERMANY +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \ + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \ + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \ + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B + /* the next two values are incorrectly inverted */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_KAZAK_KAZAKSTAN \ + TT_MS_LANGID_KAZAKH_KAZAKHSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_SWAHILI_KENYA \ + TT_MS_LANGID_KISWAHILI_KENYA +#define TT_MS_LANGID_TATAR_TATARSTAN \ + TT_MS_LANGID_TATAR_RUSSIA +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_ORIYA_INDIA \ + TT_MS_LANGID_ODIA_INDIA +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \ + TT_MS_LANGID_MONGOLIAN_PRC +#define TT_MS_LANGID_TIBETAN_CHINA \ + TT_MS_LANGID_TIBETAN_PRC +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 +#define TT_MS_LANGID_TIBETAN_BHUTAN \ + TT_MS_LANGID_DZONGHKA_BHUTAN +#define TT_MS_LANGID_WELSH_WALES \ + TT_MS_LANGID_WELSH_UNITED_KINGDOM +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN \ + TT_MS_LANGID_GALICIAN_GALICIAN +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 +#define TT_MS_LANGID_SINHALESE_SRI_LANKA \ + TT_MS_LANGID_SINHALA_SRI_LANKA +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \ + TT_MS_LANGID_TAMAZIGHT_ALGERIA +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 +#define TT_MS_LANGID_KASHMIRI_INDIA \ + TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_DIVEHI_MALDIVES \ + TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 +#define TT_MS_LANGID_TIGRIGNA_ERYTREA \ + TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 +#define TT_MS_LANGID_YI_CHINA \ + TT_MS_LANGID_YI_PRC +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 +#define TT_MS_LANGID_UIGHUR_CHINA \ + TT_MS_LANGID_UIGHUR_PRC + + + /************************************************************************** + * + * @enum: + * TT_NAME_ID_XXX + * + * @description: + * Possible values of the 'name' identifier field in the name records of + * an SFNT 'name' table. These values are platform independent. + */ + +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_TYPOGRAPHIC_FAMILY 16 +#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + /* This is new in OpenType 1.7 */ +#define TT_NAME_ID_LIGHT_BACKGROUND 23 +#define TT_NAME_ID_DARK_BACKGROUND 24 + + /* This is new in OpenType 1.8 */ +#define TT_NAME_ID_VARIATIONS_PREFIX 25 + + /* these two values are deprecated */ +#define TT_NAME_ID_PREFERRED_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY +#define TT_NAME_ID_PREFERRED_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * TT_UCR_XXX + * + * @description: + * Possible bit mask values for the `ulUnicodeRangeX` fields in an SFNT + * 'OS/2' table. + */ + + /* ulUnicodeRange1 */ + /* --------------- */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + + /* ulUnicodeRange2 */ + /* --------------- */ + + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000. */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */ + + /* ulUnicodeRange3 */ + /* --------------- */ + + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + + /* ulUnicodeRange4 */ + /* --------------- */ + + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + /* */ + + /* for backward compatibility with older FreeType versions */ +#define TT_UCR_ARABIC_PRESENTATION_A \ + TT_UCR_ARABIC_PRESENTATION_FORMS_A +#define TT_UCR_ARABIC_PRESENTATION_B \ + TT_UCR_ARABIC_PRESENTATION_FORMS_B + +#define TT_UCR_COMBINING_DIACRITICS \ + TT_UCR_COMBINING_DIACRITICAL_MARKS +#define TT_UCR_COMBINING_DIACRITICS_SYMB \ + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB + + +FT_END_HEADER + +#endif /* TTNAMEID_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/tttables.h b/linux/include/freetype2/freetype/tttables.h new file mode 100644 index 00000000..d04f8102 --- /dev/null +++ b/linux/include/freetype2/freetype/tttables.h @@ -0,0 +1,856 @@ +/**************************************************************************** + * + * tttables.h + * + * Basic SFNT/TrueType tables definitions and interface + * (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTTABLES_H_ +#define TTTABLES_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * truetype_tables + * + * @title: + * TrueType Tables + * + * @abstract: + * TrueType-specific table types and functions. + * + * @description: + * This section contains definitions of some basic tables specific to + * TrueType and OpenType as well as some routines used to access and + * process them. + * + * @order: + * TT_Header + * TT_HoriHeader + * TT_VertHeader + * TT_OS2 + * TT_Postscript + * TT_PCLT + * TT_MaxProfile + * + * FT_Sfnt_Tag + * FT_Get_Sfnt_Table + * FT_Load_Sfnt_Table + * FT_Sfnt_Table_Info + * + * FT_Get_CMap_Language_ID + * FT_Get_CMap_Format + * + * FT_PARAM_TAG_UNPATENTED_HINTING + * + */ + + + /************************************************************************** + * + * @struct: + * TT_Header + * + * @description: + * A structure to model a TrueType font header table. All fields follow + * the OpenType specification. The 64-bit timestamps are stored in + * two-element arrays `Created` and `Modified`, first the upper then + * the lower 32~bits. + */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_ULong Created [2]; + FT_ULong Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /************************************************************************** + * + * @struct: + * TT_HoriHeader + * + * @description: + * A structure to model a TrueType horizontal header, the 'hhea' table, + * as well as the corresponding horizontal metrics table, 'hmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Width_Max :: + * This field is the maximum of all advance widths found in the font. + * It can be used to compute the maximum width of an arbitrary string + * of text. + * + * min_Left_Side_Bearing :: + * The minimum left side bearing of all glyphs within the font. + * + * min_Right_Side_Bearing :: + * The minimum right side bearing of all glyphs within the font. + * + * xMax_Extent :: + * The maximum horizontal extent (i.e., the 'width' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_HMetrics :: + * Number of HMetrics entries in the 'hmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'hmtx' table. + * + * short_metrics :: + * A pointer into the 'hmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `caret_Slope_Rise`, + * `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'hmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /************************************************************************** + * + * @struct: + * TT_VertHeader + * + * @description: + * A structure used to model a TrueType vertical header, the 'vhea' + * table, as well as the corresponding vertical metrics table, 'vmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Height_Max :: + * This field is the maximum of all advance heights found in the font. + * It can be used to compute the maximum height of an arbitrary string + * of text. + * + * min_Top_Side_Bearing :: + * The minimum top side bearing of all glyphs within the font. + * + * min_Bottom_Side_Bearing :: + * The minimum bottom side bearing of all glyphs within the font. + * + * yMax_Extent :: + * The maximum vertical extent (i.e., the 'height' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_VMetrics :: + * Number of VMetrics entries in the 'vmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'vmtx' table. + * + * short_metrics :: + * A pointer into the 'vmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `Ascender`, `Descender`, + * `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum bottom-sb */ + FT_Short yMax_Extent; /* ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'vmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /************************************************************************** + * + * @struct: + * TT_OS2 + * + * @description: + * A structure to model a TrueType 'OS/2' table. All fields comply to + * the OpenType specification. + * + * Note that we now support old Mac fonts that do not include an 'OS/2' + * table. In this case, the `version` field is always set to 0xFFFF. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`, + * `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`, + * `usWinDescent`, `yStrikeoutPosition`, `yStrikeoutSize`, + * `ySubscriptXOffset`, `ySubScriptXSize`, `ySubscriptYOffset`, + * `ySubscriptYSize`, `ySuperscriptXOffset`, `ySuperscriptXSize`, + * `ySuperscriptYOffset`, and `ySuperscriptYSize`. + * + * Possible values for bits in the `ulUnicodeRangeX` fields are given by + * the @TT_UCR_XXX macros. + */ + + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_UShort fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 and higher: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 and higher: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + /* only version 5 and higher: */ + + FT_UShort usLowerOpticalPointSize; /* in twips (1/20th points) */ + FT_UShort usUpperOpticalPointSize; /* in twips (1/20th points) */ + + } TT_OS2; + + + /************************************************************************** + * + * @struct: + * TT_Postscript + * + * @description: + * A structure to model a TrueType 'post' table. All fields comply to + * the OpenType specification. This structure does not reference a + * font's PostScript glyph names; use @FT_Get_Glyph_Name to retrieve + * them. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `underlinePosition` and + * `underlineThickness`. + */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the 'post' table, but we don't */ + /* load them by default. */ + + } TT_Postscript; + + + /************************************************************************** + * + * @struct: + * TT_PCLT + * + * @description: + * A structure to model a TrueType 'PCLT' table. All fields comply to + * the OpenType specification. + */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /************************************************************************** + * + * @struct: + * TT_MaxProfile + * + * @description: + * The maximum profile ('maxp') table contains many max values, which can + * be used to pre-allocate arrays for speeding up glyph loading and + * hinting. + * + * @fields: + * version :: + * The version number. + * + * numGlyphs :: + * The number of glyphs in this TrueType font. + * + * maxPoints :: + * The maximum number of points in a non-composite TrueType glyph. See + * also `maxCompositePoints`. + * + * maxContours :: + * The maximum number of contours in a non-composite TrueType glyph. + * See also `maxCompositeContours`. + * + * maxCompositePoints :: + * The maximum number of points in a composite TrueType glyph. See + * also `maxPoints`. + * + * maxCompositeContours :: + * The maximum number of contours in a composite TrueType glyph. See + * also `maxContours`. + * + * maxZones :: + * The maximum number of zones used for glyph hinting. + * + * maxTwilightPoints :: + * The maximum number of points in the twilight zone used for glyph + * hinting. + * + * maxStorage :: + * The maximum number of elements in the storage area used for glyph + * hinting. + * + * maxFunctionDefs :: + * The maximum number of function definitions in the TrueType bytecode + * for this font. + * + * maxInstructionDefs :: + * The maximum number of instruction definitions in the TrueType + * bytecode for this font. + * + * maxStackElements :: + * The maximum number of stack elements used during bytecode + * interpretation. + * + * maxSizeOfInstructions :: + * The maximum number of TrueType opcodes used for glyph hinting. + * + * maxComponentElements :: + * The maximum number of simple (i.e., non-composite) glyphs in a + * composite glyph. + * + * maxComponentDepth :: + * The maximum nesting depth of composite glyphs. + * + * @note: + * This structure is only used during font loading. + */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /************************************************************************** + * + * @enum: + * FT_Sfnt_Tag + * + * @description: + * An enumeration to specify indices of SFNT tables loaded and parsed by + * FreeType during initialization of an SFNT font. Used in the + * @FT_Get_Sfnt_Table API function. + * + * @values: + * FT_SFNT_HEAD :: + * To access the font's @TT_Header structure. + * + * FT_SFNT_MAXP :: + * To access the font's @TT_MaxProfile structure. + * + * FT_SFNT_OS2 :: + * To access the font's @TT_OS2 structure. + * + * FT_SFNT_HHEA :: + * To access the font's @TT_HoriHeader structure. + * + * FT_SFNT_VHEA :: + * To access the font's @TT_VertHeader structure. + * + * FT_SFNT_POST :: + * To access the font's @TT_Postscript structure. + * + * FT_SFNT_PCLT :: + * To access the font's @TT_PCLT structure. + */ + typedef enum FT_Sfnt_Tag_ + { + FT_SFNT_HEAD, + FT_SFNT_MAXP, + FT_SFNT_OS2, + FT_SFNT_HHEA, + FT_SFNT_VHEA, + FT_SFNT_POST, + FT_SFNT_PCLT, + + FT_SFNT_MAX + + } FT_Sfnt_Tag; + + /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag` */ + /* values instead */ +#define ft_sfnt_head FT_SFNT_HEAD +#define ft_sfnt_maxp FT_SFNT_MAXP +#define ft_sfnt_os2 FT_SFNT_OS2 +#define ft_sfnt_hhea FT_SFNT_HHEA +#define ft_sfnt_vhea FT_SFNT_VHEA +#define ft_sfnt_post FT_SFNT_POST +#define ft_sfnt_pclt FT_SFNT_PCLT + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Table + * + * @description: + * Return a pointer to a given SFNT table stored within a face. + * + * @input: + * face :: + * A handle to the source. + * + * tag :: + * The index of the SFNT table. + * + * @return: + * A type-less pointer to the table. This will be `NULL` in case of + * error, or if the corresponding table was not found **OR** loaded from + * the file. + * + * Use a typecast according to `tag` to access the structure elements. + * + * @note: + * The table is owned by the face object and disappears with it. + * + * This function is only useful to access SFNT tables that are loaded by + * the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for a + * list. + * + * @example: + * Here is an example demonstrating access to the 'vhea' table. + * + * ``` + * TT_VertHeader* vert_header; + * + * + * vert_header = + * (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA ); + * ``` + */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any SFNT font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use value~0 if you want to + * access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag~==~0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length` parameter is `NULL`, try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length` is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length` set to~0, as in the following example: + * + * ``` + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * ``` + * + * Note that structures like @TT_Header or @TT_OS2 can't be used with + * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that + * those structures depend on the processor architecture, with varying + * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). + * + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @inout: + * tag :: + * The name tag of the SFNT table. If the value is `NULL`, + * `table_index` is ignored, and `length` returns the number of SFNT + * tables in the font. + * + * @output: + * length :: + * The length of the SFNT table (or the number of SFNT tables, + * depending on `tag`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While parsing fonts, FreeType handles SFNT tables with length zero as + * missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Language_ID + * + * @description: + * Return cmap language ID as specified in the OpenType standard. + * Definitions of language ID values are in file @FT_TRUETYPE_IDS_H. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The language ID of `charmap`. If `charmap` doesn't belong to an SFNT + * face, just return~0 as the default value. + * + * For a format~14 cmap (to access Unicode IVS), the return value is + * 0xFFFFFFFF. + */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Format + * + * @description: + * Return the format of an SFNT 'cmap' table. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The format of `charmap`. If `charmap` doesn't belong to an SFNT face, + * return -1. + */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* TTTABLES_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/freetype/tttags.h b/linux/include/freetype2/freetype/tttags.h new file mode 100644 index 00000000..bd0986ef --- /dev/null +++ b/linux/include/freetype2/freetype/tttags.h @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * tttags.h + * + * Tags for TrueType and OpenType tables (specification only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTAGS_H_ +#define TTAGS_H_ + + +#include +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) +#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CFF2 FT_MAKE_TAG( 'C', 'F', 'F', '2' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_COLR FT_MAKE_TAG( 'C', 'O', 'L', 'R' ) +#define TTAG_CPAL FT_MAKE_TAG( 'C', 'P', 'A', 'L' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_HVAR FT_MAKE_TAG( 'H', 'V', 'A', 'R' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_MVAR FT_MAKE_TAG( 'M', 'V', 'A', 'R' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sbix FT_MAKE_TAG( 's', 'b', 'i', 'x' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) +#define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) +#define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) + +/* used by "Keyboard.dfont" on legacy Mac OS X */ +#define TTAG_0xA5kbd FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ) + +/* used by "LastResort.dfont" on legacy Mac OS X */ +#define TTAG_0xA5lst FT_MAKE_TAG( 0xA5, 'l', 's', 't' ) + + +FT_END_HEADER + +#endif /* TTAGS_H_ */ + + +/* END */ diff --git a/linux/include/freetype2/ft2build.h b/linux/include/freetype2/ft2build.h new file mode 100644 index 00000000..e3f48879 --- /dev/null +++ b/linux/include/freetype2/ft2build.h @@ -0,0 +1,44 @@ +/**************************************************************************** + * + * ft2build.h + * + * FreeType 2 build and setup macros. + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This is the 'entry point' for FreeType header file inclusions. It is + * the only header file which should be included directly; all other + * FreeType header files should be accessed with macro names (after + * including `ft2build.h`). + * + * A typical example is + * + * ``` + * #include + * #include FT_FREETYPE_H + * ``` + * + */ + + +#ifndef FT2BUILD_H_ +#define FT2BUILD_H_ + +#include + +#endif /* FT2BUILD_H_ */ + + +/* END */ diff --git a/linux/lib/freetype/libfreetype.a b/linux/lib/freetype/libfreetype.a new file mode 100644 index 0000000000000000000000000000000000000000..38e13955298da7f6e3da001aa72db2ef1cea059f GIT binary patch literal 1310318 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ℑ{3 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

}uf zjWg)l`{~v?G{4>6eNyh#Yl`37-dpqbo{h$Uw#W=A1o=koJ-vdOH#K>6zYDEJ$cp%p ziI-fWmPvKQ1+Il|9P2sqJknV&h)X6-lbb1>+PM>HS$|B7*U-X3wHKDf1ruV;P-2Y& zEE3O_=TT+u282GKU=2jQNFLK+4f0M1XUaEWKM67wOlPD1B3sAM_RiD>$Ite&evZ`R zUe45U=1e_{gq{>{e5~iZHIVwiwzMB%Vg5}YnQQKFAo-2xythqc^5`vgVu_Qaz&(TU zBC3sQ6>hf=4Wf=HkhTUxDjex#59zHkbRwJ?dbZpHj^XQ9(;I9o!Ef4wI&4vMW760K zgf)1tXRFTHBByC$POt`Aty>^Hz5CZmSC2q-Afs>yQ2o==Ii#yb>90r5qe!#5dNK!?+kNA@67EovYuDk~f& z#{GL>$3xUlR6;k=jyVQaJZE?w<`l6i+0&C3rqMRxeF&L0M#IKZnn(qT=0-yq9>T$P zN6v6{!9FjrD55dz+4t#Tn>bM-h$3!4MW};A-AIgR)e$UJ4@(|f!Lg7>861K^f`ypM z!B7QXk22s{46n4*oFAs<%(jqBdqPlcjhf&O9-%5_0lBq=b7-dZ$}pQ4SjO&DN5ph& zvvmQ3!NbiBTfT{S6a67k3;{O!GA3Di!OLTN61rm>YXn(ej*sHeyoVP`u;@D5QP~5| ztRp;2EtVtPW=~s))eO;`ST{m!w9_HIoRkMJ!J{|8_%zoR`vanZ1R0wYbbK)`E=7G&wQ$Ku%g zTRzywuTRW+yOQ_GQr$xwhgieIR^V_)9X3DJggXum=@A|@q{rLUC<=6yJzS4%TNxBSt$QDB7n3f>2_q!syIv zZ_53ha=kmPT%)!Aj!-j-(}eC&kZ88_9?bZoO*denqt)?r2x1^Fip?7Wn{(h{GIb+Q z$+nTOM97Ar2W9NrD!$w6vg_uXsGpXTnRXbv`Me&-AXDnIVkPOOA0brrBWYKvCtA`+ zBU1VvDRl(7z|XWsVFJ1AC?-U!!GJ)3@g&cYy}R&^qQhXyN!S6{-y(Z>)J3c@O$$Iy z9-7Bdy(h2L8@XV3E>=(@CX-)2{{<*Iu(JP1Smizvf);rSfb>7>v&o%AkO1c(u0v_V z8iqs{Q}agQbFge+F&oi)lbFI}iL{n5OIg+cuCSQ*D_1*ua|Wru zorLUR^*gPn01b~);vrF%hQVd^{zLq#tUVqBq{!L>8|rCEJZ-n5cL&P$`2vr_zo`uXF%p7{EI|_D_kgm|3nU` zfXuUj5x|;BnI$ddpUGr|Nj6p|g-_4Q9FIbnCf&lb;@z}4Wm!`R{4oopRo^esP&A@Q z-l29ONRC%Rcs7u!Bs2LA-LVve8Z(ZbNHXhmIcWoOufs%t+TLL9<3O~jlN4);iFa;9EDuzRqh8YY6=wtD35VrM>J=Jg?r;AUBN zV~k`M+k_=7LQ^w~0J`-SLH&e9&`}a7C<%m>*bOUTZb5%)_5$sPY1!eBEFfg|0us*N zgVBcS_&ZsKdOnwdsWMtIfjVIcgGA&I#HjO%;TAE5B1V0)P|AdKeal#b5$bLhDlwWx zTAUn0t_!1xQ-k6#())?LM~mqUd42ya=nHazqef7kmknavLck* zKi_io^BON=wJnSvvkL>^TeCSPauYC_1m747q6YHz0vD2+W_>T0J?)4AtBy@m(BZ=p za@IMiXR}cQ{IS$|RwV@X;K!DO)Fhdv#sCPM(<988I^x-gHcKc>Q(kQ$y=ht~pwdPF zZ8#>m{HsZX$OzLsS5)c|tE1gHm_}@rSMieRnz|LZSz4CCRN7U2Y+LPOLA30@|EmNhaJgr)2QX?^<(SS3p&kZ~HvxYOeqfSN$eHK|3|l(EzwvVBwm z6Pr!;IbVmu>8uYDHU}z{Diz9;%NW4)O6M=t!%PY-i-v?|Kfq7eK+)}i^m9e-g~U?^ zZU8AHmKnJ~UT*5``RQA;Zam?J^l&1~CPv1qf~nBDmNt)F=sLmBN`YRRt4qtTH|k9X)6gQ4cr5 zITVS-ShB1aGMYLbhJu$=Akyyaon*rc9Sdf~sP~LUG2Y$`r2mh9aVe<@zb6a$X6$DZ zPwhdfmVPn@|GLq?zc*igMqICdcO?3MbSC;3B1%2eJ4QY8o5t7Z_YnOf!=w3;-!x+K z7QylR6a6E@M`__75FEeTi3Kv;7^I#_K8uC&Gvd|oL@j->2shJHrhi`xKO(|CUigoz z_^*oax%%|V*9<`iz~q_eZ+V5ks)oxm(Ff|o$7}h^Gtp@gze-=Y7XE<{fkR&O?NjNS zCBkRv(<@)9`4@}u8_{<}gpc;ZAEn~ID#G`pH>T2OtWnRb??CDB>qh@b{zhr^4;0~# zd*Sb^;(tqo-$*__5aC0K4vF9RoO5kB9G{@E)1Z;9~fUg1tP`~wmGGd)%O=T!P; ziSXCG!e3Uyi$!>YSNJJ4{D=r=$JeO%O=|sI72ye9>Ho&k2ZN*z{`d#KQu;@xx7dwJ zz9s`^5$Cu*j`A-Sfp|Dvgx^C?iNkn@zvQ7!gwvVrTDVE&QML$Q?-ib>hPy;K9ge7_ zk5I$wML5k&tKma6`VHim;Wvr?k@P8PD*eGCJkBeeE3sg}%p&}GulxtI{3*$ee$&A7 zmhL{-2|RS>f1`z`WPHKvJOQr><#5JNysCE!&~7IDn5^JQZJym(a5n=RSR24=g}{^j zD2FrI!Rx0Y{`C7foXI?1p8=hOr=F${@MCHGOv|V6V{Hh}f608A(l;1b+W`DW z0na6G5t0De&B)=$+9sak1l)xQIQlW0fakyPM|1{@0x?|+*iQm~c3XVlH;X?E zuj9$e^&AH+qb`!S(pN3OOb`19b6U)WL~|lAd|gknp2=ptdFTM1c=n>WS?>aH((V zec)1m{Id;V*YHdGaNY+l?L(l@kCL8xVF2#+g$ui}Pv|>RW5QIi{1)E99tH`Q@^(@v zE)~C-#|x&)z|R+cfYyZR;8O1f340*pOL!50!iGGxf?1k)qn0?@U5XoQ|?gN+o37ZdG`s3NYaM4e4 z`M_m=sNM%YUFc<|fOT|Azdo20vko3?W}k*IA9%fhkMx1d{#=F+T=xGK`oN`KsPKWy z{>pJ5xa{}%3qL{fS@wIn_`qd9FU$u%^f_Lx`@25SrBk==Jsy0hZ|6Jj>UiJ1!R`NW zb30Q&o7Qb_y3N1U9k<{5=a74hN{2rN-4b~BqmMk+r+2UZbRSSu;(K(3j2M<=cg;kN zNSI)F`sHDNO-+f5jgKDo3~sl1Y7k(EHzE!f=?sgH9&Z>NpZq)?h!>t37Zy8CT#LhQ zEPBc78X`3ryMsuV8T+;-B*jilh);=(8}`!p=;*{@gXyNCS8z*DY?L=lyS<20krXX1 zGm^w7MdMDTr067ZYtf7BbJ$C`=La_#4W)~Wkhyx@4^O2Pil^2yLqM8Q7?zZf=u07k zHH-ODN_4ZB3>KCYIi8o7GGtdJCC4SC3`=B%8a5&}1@|l&21QSdMR6h$4MV6RkOllatq>kV(B5qj1_;?GyA81TSh zFGr3*6qHH5iwW->FQkgDzha?Mv{aZX@57!?81`a9YWzrCZW{O3xRGcOu_?n)Ph)Ti ztH3KSWfGtKhNhPi;}DTmph3J-9U6F6|JxTgeF?oPR4Z2`;@^}J{AIIGpfH1K+?Vi1 zFwsp>;b!qRXNU@7FG1d)hUf7uRHIi&(Cgw;e-Z)Bivc`A^wCH@Vig5lSwt3T=r z%JhXok{9=w!QZpHqP8FeXsK_-IUh)J<9NZpxQ3J)?`F4kV)f}V`A;3Z<`0+izn-;sXwIwCv5v6|eHqt;vw zeRG!0d_BtBwr?_ZnD1z9ZBm#ovC^5r~0y5#|cL4 zE~f4*2wZnqsNS;Gnr2^KHJ#n8rm4P~rSPih>>JcH)t667-HaxTk0kg3401INJBxP%o zl#M#-YJjdVTBcx^3s&XQW-S>~Ui$ zY0o6~fRc?Np?^&;^s2qp%liZ`dFO_M|I4`RtCZ3jQW? zlnWDqTUlL9Sx;X*!l&yzDIE`4b+BDa89g{Y@DD2LIuwhj4sl2ve~=!T)Sc>tpHu1# zp91|Os}76Io#Dl}dJ*=_tIpaW1@mY01jBn;%P?77-e~y2ag0j?*coyrdxnVkdz#y( zIF!TA{)P0?#E&zRKt@Xj*J137!$^Y+NUuj6)eEaG@%F+zW4vUTaZVHPaZpFhDVxxu z{`rsmGp1MmXa1QNeziY=Qqi`2t}~b)NX{PlE!CmS#bD0g3j`o12#(AlydDZIyMo1| z;Z0$V*F)%86-uXWVOcA^{s}z7ZieP}dIm$S(uOB&iqQOnNz?%pS5vS}-l$b?$y%|%KfT`44)4CH7ujJ-_TAs`)Qd=|5x-U;IQHh5cCJq`;kv% z^2+{8AoaG?n>m!<+1xczZLd$N^enFwLeikID2FIGgWrY(F^ly!w3%GxuS|{bKw`83e zr>EHK{cd2%L~EW>MmrUzz?0w_sSFqVmIcuf8ZDPcr+aCI&+n$Q1yf)u_>atwt$AMm z-ux7zKf{hW2y>=pgx$nmL+vO1LfOuq=0$W`G8jWLoS7d$0nj^p0epaEifJ;{JH@H@ zqt8hX@=qg+Ly$~b9e@bfL(5v%-ea%|E%*_P`zR1(nh`-gNA|@$KQ9x*H!bG)7!2Ao zX_@H@%mxs>F};Q2+wN3Bh0UY^L&VEPJX}ksGiJiUqYEkue=0jk?H>kxg04eWi4Iw1 z=>K8w{p0H{t~+nZ7DNs-SG0LrHEkO4bIm&0HEo)jDs3gIORlMJVhCzz5>kkX15185 z2}+%`N+hmi>&vx>Np0%%Az8I0Stp@I>4Gg%FjubE5|oFC#3kC+&sI>jxtGUnM9Kz{ z61?xvIrIH-ujC&DZ=d~Rd12j|`Ocgml7mhl@?3LUaj^-(=eEku#Y3QOfiawYx)leV+PX^xXGYJ zd~nJ3JUH1c7c1=a_Uq=odsmn)51Po1OTnAp4kQg!?vQTJ-Td<*RyN1#t42i!Hu0H3 zeoTq2m7*rG)yjl?==l_Z8xD7nHfSTq&>Pk~9W+laj_wu2Q#54Iq}cJ$U}-p>te=ty zK-u2d2W;=ZX!y-EuWWw<(MvL~G(5sE@;zI2PH0XyObA2=#76z4Bf1Q}BFoKXaF868 z;4fmcmYq;?1O`Y7J#B|9P#Z4@ z7m*ECufvd(q+E-*{K=rjL%M{JtYn*9IrBU3b@J!JG4zixEgJSC=^v4Q^ad?t0l29g ztKr=mlFoY0mAP zwE>`TKM7(oXn(9QBd1N&ysA_c+C}9F9a?h%fyP`4?kU*S(A8 za{nWx{zsU_XL!BzbZs@k!TuTJQ+2pq;CW180ZOs*sb5n>BcwPd71JY8{@HT=S$tbG z`XF4bF`AsQ$YUbt{%f3MB$orLkY~|JNS!pP?cWkhxA{z6;8EPC@Gr8id3Ig-YK}zy z?-`n~?&4X$#>#+%1S}n;$ya6s;`&pW?8(R{DQz6bt~YMkX!KZ&-*HcB4ww56)2R8* zi8+cVyNdaStvSa`rb?WvZ5P)ft8Una4V9gLofLnv`SK(4Cv)}zu7N+zrN?P=h11UL zU^KW-N`zcvgds+UyfFDhJFT37!~Aga$+i_7y;$T$CRq|W%Hhn4$MlqWl=o4+8S~9Ed6S)*ntj(YC^}5qS~iK@vF%(^xSr<#W_`0Ko`2 zQx1n9(cGT5I2;Av7Q?Yf496k~oT-T8g!~b?eJYuzOJ~xSa3Ht!*DUNV9#-X5?f!lA z`O(6KJaGF=ZcA3*AXSCLj^dG3#p!0~cDN?t&Bg~a*@ny`wQJ488_)s&2RZb&jSm8xyVd_OeGy2G^!7LGOFNF zI*2Wu{D91^%1fqnxkD;_4-xXzAU6YM)pYLADL@-r^J zX*32s`qp*>G_9oaZF59c_1=U2Csqw+7IBAQlGg#MKA-pFkD8)RySpGm9Dt*J#URd1 zR@+b=Dx;)0bK+W@LzL866zf55Ps>^5zWYo6@QUb}eFGHv){AG)3*7LM&6&dk+GNd+ zpJYc7rxdv{N`yNwNT<;bOcS#)oRl;scCpmeQ{;DL+X^khL$dxXVwI zPa-(j=|Xoid#yJ1T5)`tEHyIm^`{ z;V=&2?knw)K-rzs3srXCtA(36>y@gy%Rcm1tAC9m9B}3Bx|A~>6&QJ?r8BGkm|3lt^wHzzX?6VKSp3Rux$M01Use9n zZiam|Z0r=tUn_xx>E3GK!qRb!JJr2LVG$&}`GGuU^W6_vyI}KFpI?X{;x6^iBQ#xX z<G@>nO53Io1KMXjJ(}|Zb z<#aLEcGhe|5oWs*`p5Q^=v?HTx`CFQL{C+Bo@cb2liY`HEYMQh_L?LG%AjTlv{Y}* zrL-iN(o&IxmWtHTQoV30;LL!gcJG0y#3Y&Jkry?lN@I+)p&1%zwOF7^VA>g^XFG$} zoy)}o(Kn)&eQbtwT<8K`AE)K9hGPef28?BVc&cSPm8iaHYJ$s(bJTnM&hVdWGV_LxAa2sZY^9vcyV#f~itpkysh8Oc|v<%xe5p0n()_UA60QfuGQrYK@SV`9ghu8l(7o5$e|p_FAOm;`=p9PgrzI(}W(t*>R7q|m8g*y{RI0jEMI zz<2%8HGA}CxDMt2fbKA4;ZOkVZP|?bs-jV>Vb0c5O4VIZ;pEDhUa~;)#!-vp{3sB zTA5y{aRN$zT90h~C&DkMivw3TV5K{ph^KtSpMnusyGktwzj*tRAK(dvLsKmyN`v+T zn(h29V7WR#QdR(q->|EYZd;!CsRTa@a*@^lo}{`XoFP@I@Kh*T=S~qE_{cF2SYn0k zE3*n)iJGRcJwv29uEKWO*w!M2?JxQQ1Qo*2H=3jqubQ2Bilh^d9;=+9hEJR#I0$Dj z|4w!;;j{@wsA8$MR0437e;RYLxlb<&WzOU6o3=z+gS5q)K=>LZ&W8nLv9|4Q)aW6G^3h~l0{kH=TmKJ(rSMB1MlLYzsT})=Os9(mpfwP&r-8NW5TfBoklC;IQk1?*t#a+A`+>Nr~_`LyGatI&b z)t|#J(75%2G5CN$9eY&xHKk_SkrvX(7!NUv z)V_)cQMX=YPg5TFft{ud9;i@Tcr&pd>tU^AGXx5G|7yD$#!z29LC9Qm6ax6JiE78I?WrHX^E99=_Uu3Jur$X{lA2Bdw5}2|YVUxH(+w3y zH#8YEs1_yFQo5+eiiN&2#C+d5o>t}u^Qsq|c9WHVR@{cVFfL6Dh;ikHe@U6}Vv!a$ zOl6FaALGMV!-oJ!r40q1!#**fT>#p(G$55u=|DaPeP6Y@_2aT+bQ9!oT}5WWwKp*p zL(?nXym>2ax6Mb}NV=%9iaX@PtKo&=T49KlEiKp+a?_gY>7y$sfKJElka=TG+MQ~l zb5Q>Fa@)?~tL57k)SxCroXjnPg*VgKi4Fak_3Ws&g53YQaser>T(L zN0r8}=E_pdeT!!n?7*~m0ytfMr;K9*+tJLn|Mhk4SFAj&zmp4XkzJv+mX;$8D5y>i zz4QA%dhN$It{X+bh(fqQK7t|AjDqT}(Y{0R;2v<3@p~IT zahFP*(B8=OEZR7#^geACvZNZ`+*o*HH2iT;@N(~5;;ZiK`PVlu@%5w0S3mO4U<_o5 z3|4l?Cc;#H01%j7*ix(D#wn}a0;UfLnq?7 zWBI5FiIM-5N0l|v{94T6O9^2W)wU@|xGlbPN5ls~;YRx+MAZpGbRb34FMRJ5iL#_l z*i51Pz%^Fyy^UFBtW7q3ZB1MS&@ig3c?LNe)lXwfJaniK7<&fox{p3)OaFg79;lzc^wM7kRBHlCAwV@HpcINhU3olE9S&*%Y1Xk) z2vGBuAgmM$pzL}3WPaFKd(c-n{EuGuIIu79u=D*o=F#i}}O&Sei z&NO$(qT-S4VOljedNs(BPmhTn0J|1F<2|@$ z_hX9&udk@x0PY@m=4ki86V2VZJ(DB(zaHrSYuKuj;@eFF{oiKU{g@#oWy!<{LB3zh z-;^8;A*eHr#GtIULi1+3#EZiX*(_?#N_SS?cvQ`p7EAXQO^*~GALxIas(wrr?#chP zO|9QNalJA)6>mLJr7od=1~XjD#{LWA#EIA(1O4*xw;#xYwZ&sZApoJyV4z#IPa;|<~%nhV?~ z0tk}lYw7wG?Jjv5oxfak{(XMb`%J=wMdgOf5+##b?z&!k{nF+(W|`k$$j@(_8qg&& z1EU{rwN|u-sfZ1mVpHj>Wxc<1;W0Nrc zqAkWd`I>fKV_(@`_4w>*_&VUE5E?=bu&%pK2Bx-TqQt?0dC2E$j<-QdlzL)2t9lCc zLqpwZG&F1d$qm8SFPgerZ`p;l&4839Dj>j+xQxGP1r4FlYGplPl~y#so}&P;H4Yje zrqKXfSx*jjS~Lv>AQJI@bRY&UKpJ>ikQ_+Y<{urG0AbS!A&^mge}-XYDnd+mF6mGr zy1JD#0(w|@bsQ$M2EpL-l7dlqQ82*J8?=K@$YrH%wlGvfBKRhZMmya=9Ids$J58X? z5kw){U;WN|q(2F+$Zb+yz&c*nJM(a!mB#@^T?mBxt9L8{^|vfpDX4+|$Cieo_U)4f zPEdYx5tN;EP^=B5&8v?C3R)PbGZulmtPWI7yT_%7Bll~<V}RB6#<~T~Z2VfF7&gVq*XMMW8-Z2dbf2Mq;TF)vSMhcVn}DJ}#S~t~cvsy6jID z!F!S;(M8QVnJ&9(5vV_?0~MOZFt+Q5m*s}eRYQ}6<+&kkMZIYg z6B^{P*E!1lSW}m%f&s#w{I^T^0t>g5^~s5Cz=?_7E2G=M#&r}1C;Tz6<@Hb*gfU)7 zb^_%i@y&{Xl1GU+>!ZQns|33&Rv<$LGu#SEH~&2!iaBc?z@JV$(k3$>8S4B zU;U#b-H%0#4&dMzQQ9^&zk8fqaYsP-A_uYEZ5+goQwKYM-fx$F02y}?5zQNz)?k_( zm==^WriDnW0vWp3{2a+(D0A%nG(|e@p%@+2<~chIW}1`Y*1X!=QUnGlz8GelGa&Do zmNkHDtk~&rMt3{3V4ICb>VqGXVD(i5tGlQXK|$AwCOW$dxl!*V8@%h;1oNR~8q$wZ z<5+I*<}>|w)2ph_qur*|Sk&FBpTSSGZn)t?eYqiHmSi5>-1^=Re&S=fVc$x8)uj`v zGE0}cYFpW-4D^2$CbdPao)9AXPp6w~yy&>T?Hi}^yztH6FEoSeE>(bKZy|cTFq+>U zloW7{f-5PsOs72YLL!L-^e04eLt-*(-T2eWG#=pnIRqFI#Pa_x17uD zP%>h0h2kcm`w{m1#V&tXR}%Q66J3W+NAyg?6&ZV(;*C^omF;ph3H{6dmb8{Bf%Bj78)%cHd=)7-(@1< z@LMVD8`Kz_PxPI$2{;dp&LrS0lz?-kWJXB79ZF5vkp!>_)hhwbt>rb0Mo2RO;kwGB zt7#P7JNe{k<`#T-C2_v8@fny^+ZdeXQ9;4s^ytnm0wz^ws(it+`FZT*!s&FqU~G(< za}Vwm(Q|w6Rk7UNkE3P!6rpJ6BQ)o8rlf!F#qzz1H6M&W4o?$}=08`ySApkVOyG6% zX2S!5H2Iy=3md)xtyRz3sL)3GB}=5YA0wUFVJH?#pU@u3&#JuPrOoZ6oKK5fK}k*x znDR~|liBUvYr$_u-^O;YM#hjcRn*=F+K|l$h#wD0|9Gzebx(K?-&-M*YxgYF*r5-o z5-|CBr>%-IbXdm*yXau=y+T`I@F8bEg*L}fAENbZ46V?`ZH4nKkNCRVC41MCZd}RI z12bhv7*JZWzYAiByDiO8mYOu zU0My*x-r^55>j(}$8AzVFma6EO_Ggu4?dyN#%`|-UzqayX|jVExg|~2b4($1o2O3X z9^4)>5FA(Ph2Il~L}UtxhjmBhR=(7>ICA1C;m$00W-Iu^1pASbsNfEA*Hxgps8|Te zRq*gx0bK4u1E)p~|IiU{TqmE1lOMFUTh@5*PjR*UUx!9g2w+yhSlw8@ZQ2N4gi5zL zm5UJeYY&rpA>3Q(gHER+?fzQGLhwH82xh*re9dSN*ajJqUSJK1J9K+YfIZtK9vNFV z309rCcjR>Hj7INg4AsJFNHrsZ?5X8peG52!)?f+O+nQ{&D>$e}z@wcLWJ@`hViz6^ zcfT>vVtm@Fw?p_bf~16&R>`XrcoGU*3hSJHdQldo)Mc6XEazA{g@V>8g;E|^ zNXi73)4x#ti4QxR>Mb6K(QQ*_)tQ*s!L}-~22Bm3pW^yY)w`CcvBy^^&eU^^!%$F8a*V{pE|h#hfOOph`O?%F~{m` z4(kuMhMS5Y8B=i#a%ZX@P+b2t;5Rq&@UiWNrg1j9 zjo*EIvj3!`Q9$SINU8rw+|k`2m6`g==Z$kF9XI2MH6v%4jkCrK+uDLtuV9Io zILA)y?Rf9d$e#EJrcVd=PkR^7E!oAJHedTedV_h!QJuQ4m)=$v&sc9{@$V8GXI)Fu z-x0Ub@PAp>{M^Q=u2)(s6=IHx>V)9fA=H+H&^m=Q1h)|S$t2XCggA@|Uw<|U{ah02 zNJ8g$h_iAtBHD(6fr7?(PlWwDoc43My@mGD^If@7+7MUT-en;^y?XHZf00POMS^BJ z&f-S=OXgrb{p#I^m1M9_UEE)d)8*&?{oCJmk{$F1PIab>b_~w;PO8E03EjmcxSqyX z3kh$E!*to^gaV&TLcf=UJ{5-s22>^xYvAT=WQd6Et)XkHp0(UIZaGg1!}|kJE4nPV zO{kq@Zw_XQo|fCT`s9mVO4hXRUQQ_K_lEVZE6mqzlZp^A4K3lX9$I+uxgweTCQSSt%MVVFMPXHIz%8BwN?U?$ND$C3_ z<8t1nW5or;oQm-gg&T}egJZjC+oWd&djQFGJqqAL0=H2U-iAMVv#y!=aYy#2}n6xxHsmFBO{msukhu#wh|e zIxX*MP7Y+c>rF)z+cr9%kNZ0a z#qs+u!lh-frZhFIv(TO^{ku?{Dmp+)RkRE~tt>X%l3}#bglnr&%D1>j#|o!)2m-X? zNm4T)zoRCVuQvpaQC{1|qh5u{h0~(^9X>T^dN*CEH%!qpqNgu^ysdk};oQ4PeQ3sw z7HXIyZ9GQ+l>9_bw7x}i)j5k2%1U61-4ktJ4cig}A3PxTR_D*A%b1>;%-uyyE9AT*^$}B3eS!@Jg2%^6c>*1^&Eo696YVnKD!@~R6b7pK`gL@ z&Id!wseC2CT4-E{KJ?M|-N-sL*SHS-H}Og?&$Q%9i`EF+f<9o()Yb&LOG5#7E>Uj}7I!wGOx785( zNt?02D(+6*9Pd_?#RjZ3Jg8^}((TrJFx6H&sveKGY84u+*IDM4+ab3ke8~LrhAF)eKWekX?- z2vB!1E#Jsj0!|s zB#I4pD3q*I#Rbj~b_Hf*xz!%hq#(_#XT^ow-rJO~^aD0eKMiQ8BlWQ>QW0%6uxsB9 zA2>142h?vy&RA+3FWrd|g&`qIw z*szMyc|0|Bm_+*Ku&sr8%aJyJrrditdVFKl^0jPZMuHCJn6R-8Y zF*~NdXYu}gaQ|+@jV@nGWp?GdUtdpGpNu|bb!ZG-aUzWbBhpv+WFHyy2S|CY-=je+ zU(yG@@A~&vKZOcou|DwaT*#cZO7ki=51v)`V~3U%jEm{ZUVZcBTh~yloP-=LJ-sX% z)x&cBM6x*tIf=T?A(D0RH;&jZj;R#BYJ|8X& zKH1dN1-d_wiFu`aU{2=c)6xEs(N5}&CcE+Se2azixjhe6zxP{7O#rU`{(GtYt=1}A zZ>u~oMa?`fm7igTwL#qOX#ZNTWUW_%9lP7G=l0A-KYL#F!@vMmxYPQ`GN9R$Uc=~j z7<+S!S?mRy+CWmGw+N7?3U#G^%WyD1XRj$e|BBr3eoufF1G_B9i1ybsM;|EAvM^um zOdp!f6h?O{`93&6JoEhxrXgPoJmaX{uClT^@UKK*^COM><_%BT;&|835kVFwDUN8a8^4EKxd!@pp~Jk={%Y z3pD?YK^6bPxs<4#2`M#XsTu|}18}{~;mZ0KBzo4KCXERoB5n3LUja@9dWKvQPHG3p zb&)m!SY$4Ewi#lTqw70>J!dzT4TkGZV6lVv$ZFzcID2Vlu>Z(1AmmD6A+KnAQtm&Z z<3KB2dxy}lGRr8lhdKd|jM}P@ThGl5tl?9KeS!nMYd~WrYYW;Aj6gEAm@U*5<$ldkJ-_a?jd^0b{Pm85?`^kJD+hY*?4k zYok(|8Ri){qW|Nv1$(34{tMvab%lXIs9$)_P+8A?k5v&HBG#LU;T}+zV zTNG9EtTW%}AJgVd2ekOz)LIQ?r!#GvPBkT=>U{MeAZ<$&?x*Sf@3+$l?R3Ii)OQ%2 zWBTye95XWPJ1R7kf6SESzANzwQHd{H;*u}_2)!fx=gQk9S#gYTQAOutBg5~Y^|>uS z<)10zdk0KCZs+!wKHg$kc4Gx;%iMq0{8ojogrbD_F)>49X)?3$oci>=6J-~a{cM=r}c`BGhv*$WO|LH7_ zV@UhEy5H0N+gZ^f-EY^fR@qVRznB3nWA45I4wA=2y+|R zvTHN7vE0kXvyYA1?Xuq?sO1V)u~#w#LD+g9TedCw8Xb(4nSI;YKrX5H4}Jk$aU>be zy)Rg|oeKumc3U1LRmDq>aAs#Ye2&ssE?EO5>gtklvOUXC=5K(Tw#<8gzpN@0#D29n z$L;#j&w2}jCe@VQY5(k2HNIRKcTXb|^zJx3VZPAW-5RtjZ!%DloFt-hP_T*v1M1jP z6vBi3W1DaK;Pv5lg2z6d8~!)e7#k@R0Oox!FpNoTDxA&EJ3rw~Fw*=rscDN2=0A^_ zbN&m~o-fdz18Pr?!&_iE6k$pJLTWEuMhli7i!Wk-zPXmD1L^KB1Oea+wY$Jzp#Sp- zF%6?55w{ErNDx=E5hutS5fyRKxH0NIklXtVjy)&8gLar4xQ~g}@WbTV+{*7bzis@o zs%&mINYs8X)PAt`9{3Omj5t#b_=pRXPg^hlJ*mbcwjb#-`7CQca-rxkm7jz5A2)?+Pm?^-RH@sIVFjwZ=I zOH1g=W||x;?9Dhw13W9=u-zR{iLlkBB$veoRtl7oJ-Rv*of^=dH~u&^AiMiGM*jyC z8H>HueRhF5;OM8W!#c?jR0qSfYpUH4l9ni)k6RedY|lPM)(s#2z>@g*x3q zaYydvWMbe(v?Q&;pM!R7m3Mm8IUwD0ntCVIll$ScVe)>f$od||#h|*)dXQ;pMcDI6 zwdPLq{7842wekgfR6#zsH<_#;i)KYkP>3TYC48^2VZT!9lwX&moHtWG&JV?ML%uhD%7)lmMZ-a?;I!Qhdu#8T zHyU*@iML13;p{g&WICt8Ni9fd!e?_^f-Z2j@CK!sBR|XY-1pPBHlsmJgxWAYrmo(n zoYvnwA#YNEb&%xNWF)ZC{dqProKOOS+)si&@|n5-_dlMZu%R)u?v$a%j( zF(QFIDSnDpM*(RmsKJi#TTSK^AB%4Bu_|y{$G+xKf`gMjbRS+!Ou3T>lu88ZOAo?x zVd`?5=f`NJINX@}ga2r>qPsIuzx4-=&h_t1R}eu}OCGX|vnr}0wFd(TFT<$&atyP9 z6`IF~(c&(#>k}|DvWoAWOxByOy-s{DlQp(w2+XDq^IciY!P7aJQJ^$o6mXB}>4K+k zDT|K{J9{bWd^8`owltw`qW$7w8oCBGaH`}mRg_+OEpbB}_Y^Y#i0u0pZMMGpx?d4^ z(|?%eVj*URNfk1)&Q!5bw_FiRmaB%>?GpPO?CUc=AMMQz`FsrO+UOh7;<3GBU+2T! zEOaye{7OeQC5x#Pei~n;i7uy3Sa*DsZ&zhY&fLHHhPfOVk2oXjHgYfP8gy}oiV^?a#t710gFsxi9cxLpTh zuLm$vdK*7Fw|j#}H!ZXHzRhiR^=e84@|%m~+PC?vy3`Kk?YX6^y=NrjAX3e6xgrB8Gq#-`~;msg#P3c;@6|0 z!;%T6Oq*Xx8_6_xIwlPH{XMX#u>7hDW}?Q*cu(%ZE_Ja2g;(Y|G7sT1^Uc$1H!Pe0 z#!An=x9e3sTN^@lBT6Pkdu}8|IL!>u+xqpEH zh#a72lQv~lB>ujS>u}V*_JF{+&94BXG z-%6n{+WUxQC3UwQuX*Ob^vvUl)|Mi2Fp$x55=(6;_`2I!G^Z15N=KV>w;EbEy>vLU z+_PNmtHYw|>y*ZfsXcWzCn7VZVFT?;mTpuWga1`Bzxn5G)RFlW|7=a@iLTPRLdAhw zSi32@=>@X2>l2a9KkT0T4sYRd8_?q~66Y=4Bz}}QFkj3^-|vZ#-ST7PoTajH;RdAU z?$W_C!`Dt;6LHIxOIc9KIEMaWSMFvb;4gR*RMjGY$4M;$y9%p%#|oT?c(I)4;h1D3 z5RUBYmtFi==!EYANtoKKb_2u-ESA8DS#B5ev7Oo5W8kFb-s;JuX*2!kA4DHQOvo04-RLr%Mi zQ#TINSum24a|H|Vami_?@a7M}L+0kx$*CiL3}uc*&U;(Q`yte*_Dh=51CT}C+C{ulXIhEAaV|zh@8gI z{{J1FYiPC!*kMC3!5RzS{7qH^II)L22=6A$Xuf^i7@}?%+MEtl1BmAI>V#?@GN%tt zwUu>L^O;egSY}?o9v~NepVfP|I;Jnl;_fo&Q+#&s{ha+G5HMwt2uAx{8qlK890v8U zd7aAdRsqsDfFBUr`VZ4m-bL3N=fT3nkAgD$)oYUdriaB`C7z0oMhl?NNadd_ zV_lf|w~iOc7M9)kP}ouKMwpmL=l$sk?ml7@8iZ3&>2H(gWfVzHK^4iKf{IV7Juiip zX5T-aLHT#o5s(>_TN3$4D0Ao(%Rg`TJTveUT3oCInMQF?uy`9VW;Y z!vMCZu@2qL@<$+k0T|Rc&)2!wG(T26nZ|1_GneO7qwy&=CLLLQ*2&i|5-@H~Y5l<# z%~?f51Esu6P0=KY(5ZFWrMLKSoYU0|47FITkOzG`tv!{r5Um`p4j~)+aHFW0YDh zu*vRax^@$bN^0ko-LA&|u>C%IVlNn9@AtNb0Wr;hoJMuD0_+dwk2cjF@NVHg{^nNF zzZlw>UIBr|ItJxfXYZzE<=!K3^GfxO4NXmN&VuFs2Zg2CMFPeVFQ@d@R$lo`Lj2CXmS(nNyaYaKtZ=#skum4RULLB^ZPg%xndcjs-?6T((Qo-IGrwut{8hG#E6o zXZ)`O|0^(Nd!lxOSk})xSaft>{Fk}Xg-+_(L4+(Q6Q4!RmIaWpXnSY2eremnNs8KC znrw~=EzlJY*m+F#>+jUZ@8iv=ii`;Yz z7OPF8I7Hg6BwrjlIPmABy+W0F5lufL(a2cHyAe5sV3Q^XdE$b(yDdl9Dl++Wo3O89 zYkXn^at7tX%OvkWEg?CIMwP8m%wx}8+k#-?z$@e@G}~!y%Z-{(O{-R4qR}3vR;?{$ za#DC=d03w!bC-uPmU1)x=9UjS6^gUv+d|sx^4pXK)4TO`mP?KDZ~3|9Mk{}=pcZUV zQd1KBhIX5-9ova_b>4x{#_-(>K+*sW3ey|fe z?;7bdWT`Hbe$)15J{aPSAC~dK8qxS+IUlBJ9jrNwG86Y9tVijG@@->=2BEJV@X+ik z3*q-rDj!Kg8E(V`s*p`WjDJMc!A6p#F!q?|b-AV+j39aG} z=k}c07L9&@0hHUrb@IC{7)^ifK31+KF3p)rh?VHCa(7$sb4rsnCTS06)1(O_?V)Vi zyGe_tS6RU*SX}mvgN_~bH*riemD|(utI_b4WMs-EpPJK8>l;4lj(;e%uHn=2^pmtj zWdjR7R}lg4<%YMa;k00eZP>EzQl%-+EtzO)q~%w8{E?iVP@pHOSQ*ps)t70`mJt$- zWz_D5dX{C&2)o8I*M~Cn3e2T6xtz)V4bTErvyz>u{i5IJW_=l>Z`6aj&0reb31aY- zkUpNIL(oUUCBFZcOMI!6iQ+&aMDVAQ*n2H7VxNm-eBlqS0Cs`VT2XzmrCNEwF5I#n z4D>&j&UB957c{WK>0OY%ReG22SSkTnmC44}iJCMemKJ*{(p*u2?ezubLIJ*3Oi(oS zUVeIGxp2Y8sQ71`fc=>mz^$LAeiN{Yf5xVvR0cj#`k8StSy-;!B>%Ll3^vl8xJz*T z{92n6b~Y1>B!}$?@Xdy#sb~^ctU8@@Ppm(;#Mf&4)sJbuOP1Oke~^d&tW<3_k$C#} z*!)EdHWiQ@o2BYYu<`mnP1!(%3#YLf_T$j~h2_08pMOYETtqhMxwDt%zsl+gm%wXU zv{^xsjuX+$Yu0JIeHiUa=%AK5FXdxXO;;5xN=GGk%5htylBNDJhRQb;R3ArLcyy@U zs)d~Fxd#c2_<$;Ut}!+)9M}&9Ib{s-x*ZI*%j{ybcbmB+RGyCdJRNDC5j@)cMgnXN z`Mec*V1dVCQ0$Yk)gi9Oc?1ebP}UYn8eZ-lVJJa@vohwNU9L|^{kgEc{XS%`TB{SW zW-eUMjJ0t*;K%G|dQSMyJ^nN9KX>UzPM%}pYK|1>LC9Fa@b*y~TaSXx0_);xK1g)D z%DH@nJ+#h9i@i>%@o9VCl=)a0fY*2``3QvW?X%gDhVqv9Uo^yU~5wT^VTc(H5d+g?e? z{9_M&oKP4E)_)r~%THWaRQN(e)-Q`5Fa6W9sCT5U(IaZ~P&)u>7YND(f9yZHYpka9 zh9r2X)2H?^LXOEBl+Af;sQ>#GJZHsFpe~@DJ`LCyc{icdbq}i3?EIoQKj2-VO8qU#xAm zj)p!yoOTwqa?y70dN@Mg_b>ilZusk-n>2TibL*Fr1ULltj_Z8r-HYUfkTQqttpIs}TEYhO@@PvsYg zH-W}NR$sin{(Q$S_Xt;9zLHD1{nrtYWx49e*W8+J7> zYIY9x&s=)x+kPiE{C+-U@s|EO@#5u^CsWqlYFnOa^{)Vw-2csF`n)Po0}^p_z9zw4 zm73l1&?l)>v5gyUx+ypGfe`b%MehkQdw6PSeTZGO=@aC1rhZ%M&eS6E{7C}< z-Nu-(Zc0w#T7|{$k}pt5Uo|T2cF$z(G`roSbr_7b+|=GihHx~@u#o)mS(Pypbhzon zl1?ZRJ_=(Rl;7n=qrln}x3FxUmoYC}79VlMj5E`%2MwtM{KbO7RL9l$MdMND9Puy| zKP*S8wy=R~UQx?q>3fTl#{1&CH|qK<#ckC4FmHAWxl?FB5$&JzR*&|cxP9$bLg#5I zGRC8mlcNTY7qPr&ydisE#_!vuf}Uw|fG*1&sd7S4yUP&NU=P7HA(%GOLN>NWIgsC{ zeEKiF@v&%BZ9uSRkdD}d9Wp7On9ZHoMSzW}PUUk&kl!I2{!ai#p4(+>;2(wv8>kx| zGVytE^7X2@6SZ6E_tLMr{WdtMG03N}TKG^~k+STI4V z1Py`}f(F@A&BD@C-G1CpH_rCF@;AI_s#@TNJyCSm=NT1FqJs=wa&=c6Qy$)elca`doI%q%c z4}#BR(zrXiT2XsgLmC?VMorGO_#?h*43Sm#EJtK7XG7W%Zd@R`jIO5~^O;?p4fx1> zS&XpK7Rga-D+K2jytOiT&~x0YA|qIbvWJ;`x)t4|!+5SRDA#)os|PFxHpG48_$S(J z32UPTY=x8qTOsA>8u=v~nTFs3fR2R>^2V;o7lE^MhOUu|4358^fm^9#WgKZP->X+e z45t&pTCI%7hh6UD4Q{tTzn6i@;eeyFEO$y!r{5~nM5!MDfh>5RJ$>7`GaTh-`ppd`An$DnYOwxhi zqBI8eqBN$$qO=YhRiI(uC7anCrR*2^&58T^vISd zYrRcrJ8M#hW$-XoZ*1aG?m~TC6%_8{kNsy&*V*?jbd7}@D#l$;GZyG-*W?>>zi^td zR)1UkSTuJpS5|2u(7fCtYPSpBa`?g8yVKRW;ci5n-iGMP)?fR@Y-SEv;2{QL)n#oG zHMSb7OyIRsZY;O8)5}S@3GW$8%d}e=ZHiK`^x&w0?CfsOZE57?-WC7C-kK5)&~r!K zE3+_8v$dt}rt)%Y8g0J5uFdU*CG#3=C#nzMv@8EeU1^Ke&~F&(SgOQy`|&tI=hh1 zS&$Yjr``pd4boD}DTidR7_Ek3i@sAYR%sn7`zux%KBHWjmGoQ#>MLnHthJgPYgk{) zo|0Y{^NWXdxRGhBq)qAJA!erd2^K|ro4rt8aiXPhr-S|R6D^SUdcHTE%rco^iIdlp zLvt+|kH3TmJg*?*@mKPI=*P);;srg$bmhrnO2(7Jl#C~bDH&f1rtK$-DH%@=Q!<_$ zrer)Wrdkpbk_N{^VY4*cVZ0>!z0FpJcr#@y?L0zP0swoNvJYc1PdjMmn7;j9IYjkI;;OWN4(6-MpF^8``p+*~HO z)G>8{DVE3JFYV+GYjm=B$9T~MFTcE7C>rkytHJrno?>W~wIew3LkuP87C;3teUqIt%eAA2X=%`-6Y%cYGQ#!&Jl}ik% zK}|PCADUi<`0BV{xfZO#0#C53H4SHzC8X1d{zgo4zOxDBOa*7dW58b`QMc7@b%XX>nyrnUrCM8e#cT%Syt*r9TrbP>wi?rxL*}V`1*8Jan2ia|WYWidu_xPA0gwI}z~iONa$c-zOogON7gGi9Hj;T4wOUn{r;R*iD+MRjr>MK5 zmLt)4N#>7KaDh|NULRA~6x4objR+)I%85e?!%hS+?mJvt-)Qupd7HJcHG4`}Mb!6f z9krRo%;eLC)Uud;X=ImvODXEl)=rLF!`e%<(9&6aHhJ;6TH4&g$%oo!nG2k5zfe0b zZd%+vYVciMzFPYnJT0})5HlSh`(pd_)2^5F?Cu`t2R5I_cz7%MsAeHmoeO>Lb7-*m z5s2Nth}RxIrR+{&b&en?Ec%Pzb!7N?9X}nYC_|mUg@U0Jo4t#h4y>2hqKx1*HE>m3 z?A>*-YvP#k*kF%e??2cM&>Q_jS8>nB91rgmXle-Q)=lXEFA>$PH(j>g;P1%}`#G~iop7tyFRouvFkJ+?Xfn%0wWr)NqP>4) zD~B%N>=rSCL&u*tb}3s7+F2eSGSAoTrjO&hPDb&4Xr0t-5!q?$hkA<>_t% z;9SVmuKqdL)nWZ~uhoqHhQlUOcE8yz%>-xeC`KngZFrj_e zpLUL=&^ZD;&$)n##4Fxm*1D$J8`O0+wz~?UaGeK=X+BP;#`KDbv!A^8B6BIO8lm3*}PEo;(I+O?jr$gA&+ zZ;rp?+h|kyG2kIu&Rv(=(!j)@1|jEfrqbVX7a0Na(u54T`d?Jy_{%;v`7=G7Z1FP5 zk)F=p`*Sx-#lg)L`49Ei4K7Gf$w&ft36(gh_SM!(uKYzB;MHexNyZAds|cpIs}xCY zS1D3=yJ}aU9@K?1EWb3SF6lB1WolpeV&UTXV1qX9%A#GS-En4-3RQ^3%#EhnA9yC@ z#R|u65D7wYT>j$Z6K%PNqT)S<`O@FU!#BJXdbx7p1N;rP`0PTUrkt za$EP<{Iy7G1q4A?kY|ZrFkI7K*x-N{O{k2g2!?LmuEFjm z29mSF#ETc%PG%O)fOI3B_4Z5cdj4ekF{N{*{zE*lf0ThT&``nFbA8&AUS!hsGU>Pl z_B^i4YPRyA&-TIkX5lcEA0fMt9AS_Q7Y(T%9>RhK2bXzI!oqVx5 z<-c!MbyKDir`a^rf+*irI9GcAkI;z^$P&D4e{CQb6}7SQ6*5--+cixQ_C4;fC&io&tvM& zBw^|o$1syeMAb#}xv1qljQjsC>N&5qszVK#1nFJ|I~KA0+C}{F3$cq-4YJ?0*VC;E z`$H+U#&t&(LfUH#@f-F#vF-*FsqAJgv5y-(GDg;0>R#iZK|IC5+Z9o9dMYoegC1l} z^0jFm@yVs`KAfk0&3q|U#Sk`5b=#m;$cCFqTE_OnYF6ff$;p4<(&#fzGw2q(*cJ(~ zb=Y&c%bQS)Fp7jHxd8r6qabk<2~TnXJc*-7c#;d?-$d|yEGiz*e!|4NwH@L_T7Mu9 zByOs`1BQeROwcWK-XaM+S9-m*%%pTBxbLb9XXq!pH^2qLR$DtT0*>`%z-g+j5PS2x z(NM!A{KW5-O)!U$+%fX)97DtQ@8Q67HtWRFz64iTyEP)dWTeFN0rfFNDylAok?2Ag zbIH#9{fTLl214zF6b$KGwM{7J?_ZU#loq)Ec{Wi7s!*gkG z+|cD}C;w>Mt~YeNf75@+4Lw<(^r20;Au*XG*9YGF{*UH{?$0J|+;{^PZC_T>IDbn0 zceUh3FCdgu&DB-J`y^T}-lZF*#k*?1Z@LgY!hqhf;RNwpm96gGz5nYm| zX>@tZsyqZnwA_0U*X}H>TXw8>5GEdt0fnV;ZF_g_Zrl?Ub(=ggmv-}?>wfO}P@)x4 zDj0JO9#D~b2IKmc*pLffjlM;KRm36?Rq4beXl+juM>n0PbJ->vBZ%aCS{Z|&tsm_R zv@<7a4kTuB`^+^W@lAHm8E1%gDSTtJ`E=!njdbb5G`h?#gHZ5_;BN!{e}`7*U8F^=9FCb9B%m)niB^aD(@jVF!ugbsyel6(z;D_N2YK34+WK+n^#pcl& z#L9*$dWWF7TFmFg$V@$-)o1yAqg(RrY}VSOIg$E}eJO*B>)H9kJ$9X0E;iS;lBTQe zb2M5@3s_WHv*zf|1zeu5jydKbocCYQPH7MpPehyXTcwkT& zhwUFSC>-}23lkgTGNg{0xii=MEav$KkD7%(?wPL!SeUOnN|hg!s>^aWUzbg*w&sS` z)FrHNi`1l4^{kA3-n=~jcy6deMK0#gMcgdZNrqIaT*&t=ucE+fsbvS_C-a~y1AYSq<9!8#; zMV@MtqVf>mv=j87>)l^2BO%kunm zXa1ht)}ICgo1WXG2trg`o_>U{kl}K`Zt2|5)xZadGgf98UJTfZ zza-q6+t%gj$Z)NEp2waxF{8w5$ez_JFT(Bb6N_F|e2S%G^bG5w3TL1-1t;uN{wd-Nk|@7}8P%CT z5VLSi?~H#R=0O`L%wN)A?3<`b^5$M&XMRU+w2Ls~j1vhsQpr{eV-5|a5k9}Pf>$*A zz7%Ta5g#rFPS|TE*mZtsa-kI;zhA;-1q;B152Ky7;igZlf!|siKS z-#cpCt5tnFR)N$r-+Jhi-&dhX)VCuH<{ixb4RI41 zo17xetx!Yb2ZK+lej2<>r?;^Qc>gZM(5CJcGd&|*2k8A0yI3Qa-l2dE?5O>|v4I_Q z+1J#JK)X$G#V1R<#ndnk`Lx>JM{9qQ*8XHYfirEdX}fq*AP}v1>gB?zs6X69r65=z zljnX2Vd{k3p?>$!ecj~ zk>0yA30IxoGjjExB?;xLT1T$_( zU`}NfdH={<%6v#QYw7#TGmRSIewY@XnfmXU{LZrIXm_-*uDRm6!3M^;9pFYd`x6`} zvmKVWP}&C~c?q=%Rwq}vgw7fFRSJ0SAFxZhr45?>$+15CF;iz&Ps^3BK9JjY^`CS% z|84o|N>6TI-yioh|1%HG-H(Ic=AP(pqW_wY=BwX&N|N=2Up_Hjrp>E00o=`r!g%dX z4EeNaIE1IiY_r_HG3su~?dzq(;`rsKBQerrar`5#xqba~SRDVvE5RjChlPZmsQXN2 zT#+72Qr5CLvj`5ZFK^))SIkk8kH4ie7{<@qw(?I?5bwyzr;C`4EL>gh>VCJohGf8* z_(da+W(CaHzTldZ6fvuIl6B$tcy$)V!_p$&V;XDXm$BLw!2-8ei7uaDdVr=#a)72t z-2oabfDN1u&n^@*Mx(WKl~Qh+J_BiXMR=@L@8n|d!agy#XYDyCI2MXbHJ-NRcWo>G z)}Y0hUst{wmEo(;>xtg&dJG^nq0ea7FVb@L45kjI11As>t}ziI%zq~SYSB~9G^XZt1>{>bHdTx z>wrF!+j`jRgLd)NedRvb^%`y1=gh^JwrU2#{HNigp{spaQ|)dqsI2zYvM!&jG0s%4 zsF;?pw@VN!Hg(KHsLz z+gQFnlqt)1fx3Fb6|Dt7F+*xIk;>)Q@KR z08n+z(8Wwt&>s3W9|0vj*cD#%IbdVrHT)gu*GLf&-3#NaURuTJ3ktAKSkBg8urCY< zy}^1`_|Tl&`ZEUmsgBsxUv?1%dtf=dg5*`~g(gg}wsO9my^p^zU8N{?W9-WwR7n5v z!a(8c9wc&K9P*surb6ifok=9a`al=CYVR=k_9f12XECJ*^h4%z$fb)+P(}qn!A~~0 zFyqd#YOhW~q&FYGK27ET(Jk8S+{nkr0UICpwE(W{;6}p%$-%T0UO0UBC!Z~ex11PG zUM#!>J-SopIE7L7?mcRLh1QMQm9cfBJLLgLETjP2Xay^J7k#J&{8FERbs_l|N%kI< z+)^GkxYl*{eD1IgOM-c^cPJWeAC3PXZL*R>+v-ZP@GL9ubkpS`j``2>k?;{M4%5*` zm}?ps7g@~y9_)S%Q>-{${z!|CH7plX+m1ro<+ZOkJ$UiaPa{=rJ&T%{0n>w6vne5* zP8_f+#_t3nTMJ8eHxOR|B7UHpH`zXf0g?SsPu{PKR$f47;ftZjJ5<|J;Ps)^r%V>S zBLpbfzImi&sp9ImB`OS{_Gx;`#da8Gbwk3?_4{{AjFfewZr<&eLv{D=D- zWZW+j((FG&#R2_v4_Lw{u0Kezp?ADmz);_P# z$xu;dN6vgI8G^AsI~4CMYv$5jPKgtu=O})v(Kh-KJ*4PQlF*2}MDCD#Zwn zFbC@FpQHX4qP_)Akx>6GoHk&@c$Slla`D;8T5Iz(cf9NJ$MQFz8JhzYA?>4HQF@E+ zu``wVeK&pV!<&$F?8Ve0CW`rLd#B1Ey7_oo9uHZAH_wg$cys!`uY-)1Das#7Emw?A zdWF7e8Oxvew%5o;2Ca4V9VC#yCfN-i4dJo+McLNFAeGIJbB>r$LkVCZlnyKqM=m|$ za%tWCPwhSB)&})BxN7!ytpRVn0Z=h8i53Fu@c8X#J3hw!3$H&rCH@R4N}F}m$aoi< zVO%1T1c%&*45e-42+VsH*BvwAZ4`V9h-;%~M%QcnIzPYz9*I-did8b)VGRO<4OD`^ zx|luclqE5Zdzy--^7ja9E?a0LIC^d<=RJg?kgD(57`0qZ2HUOQQ+v#Kad>0Z9i?Tp z5di5mAe;~3iA%0Tqu#p)`|nytBXip>u*&XwL$giAyYQmQMeavYJKn1PAc|`5(Nr0b zDhd80)yDKdGxcb?lx-G5wv>6uZj<{`CbOO_bx=ekU2uc}2l`(DtG)TJ1T02x0xw2Y z;C*6SZYT6^(o?jQBkkNhD537mK>h_F2lk)`K0AwZxvf9fK-f7>^Y9&U;WK7#Ty%;t zp!%!P@CU%!I-qQRLob}gpJ2o?p6t4kiv|W!b9g{9&^(tF1f^%!d0-kjb$&s zPpq}jspX-?Z|fw_cTaHE-}{xG=$pEe@8fD^Xa*yH0+M|NK3;y~42PA8ldsJ9T4l6M zGq!lfgDq|H1^1PWU`B6$rS^Lq8)W<7i&T=*+CtgSgWmi}h&5}HWC23De-3ZhdTZk1 zS8k5eFrSs5wAN)2J{T~m!}r6$H>{un`WUf{^h%AaqtN+cqrj`#k9x2meq4b`?cxzb zb_I5DsBrSOpEx6f@pc=Gx5tCACnkiNs$zV&-ANuMXp%J5GDBu38_3=sh0pUO_n)c$+%g> z96uvxU-+pqHu4!s*rooN1GBm{LT#R;< z*HS*v_kc0j1GPWW@LfEz#(iXsyYeWv=~v#@XzXHnN{&!COGp z(#mQ#dX(O=a-$eaCem{1e93{FLwyYBCmGO3;TBI?OOzl`Y|~q7dkv1}6lb!X-K~o* zPYinoCZJ53Fn(EusRSLdrCV*`1!rE5zdqbD^Vr8-ze6>1VIs{nUaQmXCsUl&Wisjj zua)Zn(ln$VoYK%=D(kYS*W9xv6%wp(}dQralgL(i)%#KE%JE%~DB^XVz8tAoF3BhwI)w-HyF5Q-7+T)8}?gv370FY>@9 z=EAr~62!YO;vME7oe1BbQMVIjKd`EZfk;J8y&2&+^+s4~W~D}6@0-6de~3qh77EQT zGMktj{2M%|Y;iQV=TZ)ZrtLM1KD}sksb0d+^B5ShK7{|}gRH&$=`32 zwJ#H6IXq}~9q}i_u@>$n=q zfnj&%0gs|kzC8PQhn4M#*4i5zW@_ZLKfv0q=S(nSwCzWR-n_qJ%sO5(jNd>ayYhQQ zJA7MA4*B?!Ryq5UF;0KgZlPucnqzp~i?tVcxwKbSBs0Mb7x-za{SkkHB^Pw<%pcB` zKB4d0{Q03?*dVi)OwaBhSN&~{{&0T5hN7vqhCissJ90Ps+BEy=+!o(r%>Ejm*pG=s z<=#Wl<0CDcBzbops{O8W`?+%QQ1q}wBe2jK34`UIKU5O)=aZ(_sU+4`ux}vNZRFGunNsuI2yHfuIZt=(t7OW7GN>87ziHz|EQ`U%@J-NZLx~4LOX6Nr2 zNZKAJ{iC;#bD)uV(&UnLNGF%pDX~lT*;s-Pg z#P>{gEcG15_4@NphUA;vY;tg?(|g_Rb{9Os0kSTjC_HxFUqs;iv>aO=oeOj&Yo} zN?KKXDsOTQHCG$-U4HOl``mB~z|VhTCxW;OH05+`SpVk&=Um)3-S+&ooLJaN5)E5c z(_r!w7wvoX4M`w=_sSUb2LwgZPuaZ1+5-|iFNJehsKXa_-I2uUr86Lt@c7_ybF`B~ zxCFt;%xL5L(I&qJS;y)qO^mgGP~ziUwJHVrEz~w>vZM8$Jml^~CSF%sF)Pn!pd z;r29L4on6_C~d=6S~?05-zp)VM1uz2+n3bze8{)&bOlDS=^ZUTRlVRpv2WU=+oz^u zvDelU9>>lFepE$6U9iF;*u+E<95=_%UQI!xZv)4lvDfVV=~+~_c}=YT2271M$0vZg z1dhP*5`aH-9N_O^0XN{zBr`Ep( z67l^UbGm%RdWlwr=s9U#xXb_(vtx{P(SBl;b?*AE`{-i^N^<_-6FvpSz5geB-vVD( zQSE(pl9m(;CuqTlC;^KU3pIU!sp-9*Ko6YO2104HD!oaXrfqDS#5|xyA_=E~oSp_E zwpg@kK-8)zK??>ikEGT%V8x&nqV&osR>^^i0jmTk^!u+hYxbT!Iol`qe!uVc-QDh- zz5i>?nl)=?);#v?*$1eQvt{8UyeinS+r`@&RDtOfHeG`U#`0qH!aSL_4YYm?ec(h& z+hD024E2&_lM`EMoush|ZJb|I#G{}Bglp#;_o9W(%+HfB~1NV@LINQh@Qm;J8 z%P;Y5zgX8+n!v&q=W+hp5mGUi+1>Zj5VD61j;A#A)Q0UIll`3>V_n_0^nbyW8FkN1 zY^C`oTL%WwQ-lsQPsBRV1&WomFsW0ioq~kXWG7`Ay&A)hdpRh!JGABJtpg_?-nO=hBe8!dcRk23W}S`=5BXD^xA%sKdRxvG-WK0xa`@UWU@ zc+QOv(@$WD2An0i1Ns`>Igcl|(&J@% zAUZJ8N2N^hvmElopQi#2$K|{NHAp;)>d%a|yzEB+whz2VsfxXo(3ydXyhk;Pv6OAZ z0uNZajcfCGa7HH1%%IdSY@wPHj(1U9YCmi&6X>E93G$XM-eJU(Me0$=x`b4izSp#A z3b|6Qv$XiAeUDPCWn1S-if>>9yJM3aJc{87hr81E;Lgq--k%%EJ_;K0V;Zs4YCa^U z2laIfzhiioPQ5g9w$b|jsykndLB{;f=#$pBv@s%5&$Z#}F`D~9N$zbWJmZ4551}Bv ztI|a;B&%gjh;|V3!tmn0CS#*&qeh@n%J^={5Ou;kPG^JAUQT%0gD-X@9^>W&v3ifn zUSJ;Ta*%`Nr+yJ!_o*2Y~aE>YA1;Vx|1}_8A zW;@Z}nai&YwzWQq^jNJf!iCaj(jU6wr*l|nyAw9*^QLb4()6f;w^ZXSX4B*xC zatz<&t;mnfq)&V6SQ~!Ao2fSGDQ;?lAs~Tg)X^gYBlKaq0etC>OEg{~j6ZW+;&FZ; zL`(eD>!>uOoiF1B`QGn8T;6mklP3ZJMeLLRY7wKEb=W7Mh@n_wGa1?(?}iq|I81pR zerT?gBvp!|eca)A(+Uz26@uUDOSk_w6(q0tc!la8DoAerVm$-K@~YjZ57oRDzWy98 zFub+KxeGy!8mG zG1WLO*k+Fz}UsFNAY}!7&2{MOu-gn#mG_?q~w+qp=4AV%+eXV4;^Ax-Yxlesx5vy9#yIgOK zSWr}kV{-?>H_TA_BP{i}z(TFk@TM~A|3giq8i9%?H z+Y_3xrhM@D_^t_??GZ(Q@*!xQuqRb zVgwJQC>^-VNJ}}_LgOjkr81fi1&qop+ zG)hej-Nv&SFTa6VV)W|y;RgQh=WD$3iR*oMZ1~PwzxWIv50{~-ihT5*!T-CxeUCJM*;2xiPDcN zkY;0|zH~oi3>-Wu*|LA&g)s2|7|LeKn$rCcddW8)eGAaq(jFBO(;ht>php7qfJD|z z(7WC}v$5e+DV9gzE2T)ykfa8{zHFwfDIJ2)^H2NftzfGy-L697t?=yw2j7}(**@^X ziKGQAvt3z+NV7}#u}j%EaPWj=%f5jZ-bOs|F~iwRSyQ?XLf>9|*DONa{@y&bCn%ms z959{=M)5Z6W-7h%QtaO7Ms?RlKk!@egJF4N;zV?RY2qS$<9~7?P}3FW?0YvJteglN z&&K8`ePqsp?4$*SYl^Y9|?z;k&N9g&nKL{i00qRZy!HmlEkk}}MZ=3-qnv zCUCKjmQP0aV<8{&4C#w~`eHa+Lg7M%!Uc!ImM))1xuI~a`$wo?k#sCIZRbm@(cCw3 z6<_|dG4KO7d>ao6!efo#O)|Bn1XsE0U2t4Y#`vTg(PS8(sQ$#jNZ#z|QFJD2qes^~ z`h17#Rt}7u;G*Y$_j|iED!lwm!CPM8uHP*b*NkT>BfOnVbSz1GbkOF$!y_Lkr+4LK z87#JXf%~LENeiAmA4=@vJ~gF9ZIfzrpS}KV#9eB8^c?|(Khw_9M`wV{>dU;Q2knjky$?fmSi=b%SXi^xD zL}>M?w~VB#d~l=#k?M8v9V?UuexBixDwC%eH|T6Q;f}NTY8Y4a$`7ht3WW&q&@gR? z$`dYS38{MJ2V8nAwp&zn^GH9xZJ_-3^u<_6?>h|XG+u7&p~zr(dEg2ZOUmgW4N%Xg z@?dg01GLzd0`>Oeb|itxYh8Mj$yWk#I~d7W0p64)DKrzOH-H`lFo?aJ&_cUARMGa{ zyzdL1A`GJ;r#!;tD7r)30}InEImU%*kVjvQR^J|D;!EiLa-96s{f6(dqUiDcBTv=u zBBksQz6}y-^?`49a@nSI2X?-p(8E~Nu=LdE++T+~R0-RGQovt$T@&4LJaVs(Rz#}V z;XbV7;te8pr)e%IO<($jh(6>3`klKm-g<{Z@O(R#gFON9#x^O4#Q+n+KX_x{+0dj{ zu_1h-_0DALo$+V$cxU)WRp$pxx$xAAz0AQ5W|Q!6g7?zRf*AKE8+(_L5AIP!YCLqH zY$4r;I&@_H7E2aln^maxMCdTQ} zDy?Q-oKN?U#qcJoZ12Oh^kw8CEhNPh62JL^x8<)t8<f`X$)NDms#gxlCm)9pyL!on{z0Vcs9gmDmItdr_hA$_st`U2H&ZxxxSZoZeJl z%Dr*84H`$neY6j(Mm33{JI=Y2_*r7l52rz{N-|Hjl#e`AaPj;LF{w2?a_?J>7J>Mv zN@DjmW2NFS8J2@n<;V1iyoadv+{sZz7qNw~X%l!6F`7SRNKTDP8<~pIMtAh;uwEiW zck9h1La11@i9R_JtBRsZMvN6gQL3Y5<_aOy(O=C^EbCW6bBq|lxfEXw_^p)rrLW_g z0VR{3QpzlS178gA?vCMm0l14Mo|>N+hRS`Yqj1vXxM7?=7>6C_B#;x*-2?CQBt6)&Ln(JzK_doVqqSjVO}@L3lJ7URSbek z&_>dfTZ-O~Hm9rc9$<7Qw)6Ge%nmhovqUKXv&OP~z9if4OV+gB2|tBR)%2DC*uV+* zu(>vzJLQ+Y18$3WSrK};qLQR~5cD$fRPF=CcQ3^oP0|LdB17B5p-SN!YE-zm6rnDW z+0u_fsMmw>t&iZstoj!m9Q7C(fx?9|zP=JgkRGS-Z8B0xO$D6O2yM@FRDWLNRxqHG zr1~;?K3EM~F;&QlsC7K;ukcrD8kI`-Wz(k4=V>piYx zn&K2%EqNVbhzdAub9B%l-MsdWHHW9h6IblXL$nNEj=&5O62@&DyP0ZMC`GSUpk#RY zOe&B!g$!iyC<~;UYwS-^l*ChG3-n$@sCanFQCvDCZ7k&-dlqOz^FaJ|5}B0O=&1S9 zE6|yM`)f&cmOo7ts^jRG;}WO(b_%KDelrDeU~}>$o{L6z?2X=u7+4@b%$}eOhzApR zVu9)ylEsK*4Z1I*-Ee=czSZ$7s>mhr-@bv$yqmUxC>eMj8$K*k<9=BYbcDpGAA^fk zJL^rtEs7{VQP_c%qP!YPUVK%&cW}3YXV&v$6HX-U_>rGRsAsBoodgA=(Ow`BiXAZS z3da|!;CTKbzKoNCYUZuq+cs|f-UCQpw;Q6H?yRktyOH=zJ&k_!G1mr%>(L&mK&(OJKl#Y zij(?I++k35=DnsVv+y1fHPPnl1npSVf>})|(q9BwiP{c6_-9PrOfT(6ZRAbII#Gr8 zs9nd9?C8^6-DJfb?HP^L+H6yLH^8-%^u-XM!SVagc>8MTu`>@Y&O%4|`>%;4=_aO5rmk=8s1h#hd`mLF%#?4ORW*`Qo3 zbmhmY@q|-(H~wU^3Spp|r+^o;pgYxMDZK?G<*Ez>uUzq!t0mvQ+E236=c9rm8N8TyBR;c(TC+F0ok~Vq>%%B6lfaaWwy~3Hli4n2!^T&e>2r?p z7r}ySY#Pr(Q0eI5^n!deK~xD)KhPk!je+{CX_9}iC7f;!!fPC%F2P8wCc2UWdoe(|!Na9nw(PTJP%EKWvSaddn52GN@n zy*WLRDX1eH-9MKSc2Zj?C2v+LwjmXr$z>b0!=mYi_SPQdT^8^SXJfcy9&X~T+obN} z(KyXR;<3HoXYEkQ#-cRkv$i3W*WO~N9LJ0`EgGvryNFDM&DvYHspw!JK;3MwPF$$h z_2LiGA}S0Pcd&m_#a4X}+bhy+YJR0Jp2qwfEs|nas%A??S)&19DdXAz>VWgBf3PsJ zmM_CMC|9YrVpsCg?}94&g~08|4X;@JbNR|We-x-UC0`$=u>cCmGOv)JNB?UclUqgo z9VOu(JcU7kSJFR4B^^6}KZ}&wfTwGZ90c|0F>mHDEZZm&NSt&0NACKDd`WR z@#W^M8w;ZFE>Oq&(1B1){NdIj&PVNxIOj^c|D`-LD>vt?uH0z8Re4dR_3w0ZQn_J1 z5vI&HUKn<67V|M9#5efO_b{0cS<&jrIyOJ?D$NSmiWR}`&z1}vLSATLs~yPyDc)Nt znY0gAc;c{)Y6W@scb0ioFv^+gFY_Jxe-Cq)`4sR=Nk^|44ILNSxtvE_*tvaC9cQ`s_nmpI zvRb~329O2->e+5~bc^alb6-ti=>DK{r@GQKJ?8b}I0fnNv+`~JpsuRju544zH9k3L z;t<;CR&SSEw_Cjh{l|2~jmYRgcb&y3g)q>~v;YL%>MdTkx=m>dTvLDlCQ7Ece6$2Y+h2(1rq8k2CAyKvdAP}Z$&z!`5&%~e4XROESg+VL zB(Fb_>ls5uLeJ&!*r|Otb@FNJ!)0poLvMCSJ>T-i0~iP-T6VimUM-UwOvVcF!32J9 z8sqhMsZnsB8tU^S2+w1vVS~{ViuPvc22ljq$$uXF{$2QTkE8m{(O#onRf7C2YP1*k zkXMF_CDdapWa@_XRm1DG|ENFZ)x&uZ@ zw%iqe!I}GF`1*~UQ&DUhR;2o&O)fA`0m}tY1Fs$^f>RH?dc1+xHvT-s#u+#89&abQrt1AkSG&?8FzJf@OF<&n(gN}?eKEf|s)-MYC%fddmP7%nAB zFg?blBT+U-Pu+8wrUx;2&vSSBNeoRvL2W@FZNE|G^b6}U9~t52Y5Wk32AiXZ1E)?i zz75x2MAJf;KLcefSvD;(6#F-}mKqRWsS4p(GB%Bt#p9bi^o@_`SaGZ<949Bh!D3kW zaY(0O45QN+Bx0Tq5@YlDg0Y=8?HtMq<@c)n&ye^SF`0Xw{rjO;F2A1AOn1c&&C1)zIA;zrh*U2 zR0y#e-dUzXD1?FPsgNPhXCG2iY*%RISVOgWww=^|mFRQRan0;cC9QVm;NBm8mdqJE zhYH4HBk#o5!#PEqOQ%B+WRTqAlJQ05m-@L7m65#>S{zLi^thxItSA}$AlrR9tmnVu zhbvK@N9kcvXZf>xqbX)q592W*GMR$PJUd*YdPImPo%cl?ct3m_X#jEXeHMMk%(&0S zJw{5HK*CChC_b{wQ{&hOM`lOVYJl5N8Bp8ct+DuvRBmg176o`3qNO$113%gPF=K3I)P4b7QQ^Rp(}H`(no^9=ql zC^?|Wggz$EOO6ht@(~V~pL%`Z_j$CbKHt27`E~c^*ud{Y*b*O$g0Y;5rr`0ykCH=g zkI^Ljg-Q-xE_@v;W+tKf@eMxonCspg!(e98AnAmqhe&#Hbf2C*!9L{u>03C7fH5b@ z-D5n2BER)OT6{9Z>+GSHMnAy?T;@LZr5pX&cQ;J}4`Q-@I+kT&d$xz!(&xM!n>(gA zhfE>P5Wg^ts;fAiK|KF3x+5Qk}*qnX8 zza-pDaZ!W_xnoacnuCz^gqikHxv-FCfb~rTQ-fea6p;cfFO~V!6opkU0#jV5Oglyv z@7gA2!6JUwy30tVuip$4hwXvT4(CD4dD~()7AX=uUwm5!j|5*EsResJJ8+j{h7*Rj8P?X|tYXSj-{qw^9jYBV&Mc}O z`X-xdhgM(+0jb$Zh2yy@V^Xljpw4t64To?1wjzNU&Gz)tl=1-Q@S{{UuDHqKz}t}e zivu0BLI4i{;QHpGrlm34`d2!FXpYv1om?@ynGN}+LVIXn#uz4Z5A@OZxR|E9mK(Eb+t*8lzf z_8h;z?T2}kzugUU&}SLqGuYquJ2XCB%1yfUl)MC?N>X} z@blV#$lsb?bI(8KHC4>`mJB|D@eg{<2mT4KIUh+!IsccvCij>Bw!i#_=l}jLf7$5q z|9|N(*)g%JEK?bUj;-1_VB-h5(CW%ZAEAtsL*x*D-Icu$Z0xeM-!lCfZI!2S+n>pP z9ccL7{s*qS{s-N-{SUg){f`mpYf^j51E5j2jT=R?TpT?Vj(?NWgU?VMVy|+5{PmjX zfwy>FH)GyM_nj)R816=u2Ji>%IF-eVAQrra-=?_zjBOCpIj8C2F{`G&WeP~Jtw({ABUy?A^ z0R2lAV(Vh0?!LqhBhp|wv*qTxmcy>g=rXFgLUi6OBdVtMD7D7MR|e094ZVf8^1PSY zN^CU(o1*N9zs1#?RKCrumA^dYhF_EO)gV4JDEVn=xj%>BR|e|ciGIEJq+QWJ+LQ^;hD|4Jh0GUJ7v z1Id=di5JP>=&lw$L}M9zs|7n3s_!ZYbCI`9mzFhQkrj1ZWs@E1F)?VYwnC#~%%AXh zlQ;RHc+~iETpu@fR1G&rXt;?_@#^6w-{V1?9&YkIKE6H>VrXkvfCqUGPh9tzz|g zhWV!q_QUS6pFoY`#aLJ_k%ce z;}s9AYH>d&(=vv_p$b^b7{A4NgA70rCKppd*`=ci8mOQ^xY1%UBB$aAFPcOxQr|Pd z_@aR3C+RD!cr}4u^uWeVBbUF23L08k%pajg7~fs6>_?pF|NZm77WiKa{I3Q65ex9< z3cdi;lcNLE1b@dtU7i1lep0Pbv0d6U9DPO|4IC~ zM^5Mhq*vL8Y<5yE*@tX%Ch%!EJ=>g+6$_n^wGihboR@;94Ci88FTwc{oHQErA333^ zEdPY8T+ollIT>M2#BUzXx8j_F^Aw!blY@Vgv#!Uvk+Gam0o#x2h|YsN zP2oZaVL(s>a%?=GywYrqIk87tEObfe?u~ueoaZ+8R^X%6g!6RqJX( ztJZF4Sbg4#+Un-e@)avX%{rosVkL{Oh%TvE9KB@06-yR>ETnP0xxk1BJO(=m{Tvqf6f|^hM-^ zb@=Q{9AcpG4+y=IelC_^}zjG=ALXiCq(J%DFi^`}-`4`%byUgX1}J z@>-V3JDlapog=*0kmJw9yE?~BL#6Omg4N{}9VrcMLg&Uw%gSnS!}kci(HDN5OYax@ zJ|BIrt7}T=cT%Ql`DKO;Zq9XOk^i8hlKyC3L)UYK{;H4uXAWNgY?07EPjTw-CGqU+ z&ni1pdK-l2OD0eDHaAbZ|Ar2|LVwH`{t-9)kkGH8U#&xS3uhk1KPvR=&AiKQ?|p6J=(tCwYA2)L8S+BeL4GH~Olb-#I8-7&iEz~*H z>C0}INCLS06OQ96KKd72dZEw@iAjfFXD{rKkNF>GNFIVC;w}%{05;H`@&z~hVK^o zL0|X-ZunlI_xSYl{MV4srBA*J?Swvb5eUOWTG1ASt75oz>^&#REeB5|wF9 z&)(+N)dNCb?hCJ+5vB8}&}jvN8@|OWi>J{*7zb}=;L5*l0&!3}=L!7)*;LaPNjiVx z^($5g-#NZ?PIc4Ci~JxWsLi-j!UxfJ3;lDx{J6<2GlzuEFQRKbvqNrv=FkhTILgd) zWPjN82~&l>$fy4$uKx3dKF`eW><_qQdWF!}`t)1n>bFto-ytQmepx%*e7;lYabNtO zapT`D^vU$XiVmNBT$lto){}n>N)sB{^4+(vTFMq%4 z=C9fpI259#A+CK&Sv=css!Zx#;mhAk-Ta*|^pE-ScZr+7D};Wg&wlT6?YB|rH~Q$; zyYxGSev&W#$sGSQsJvU~Up3SJ;rPVO%H!NfhA5dl5u<$gKjB^I(>3bqnkN&BJZ{i= zk^L0Y3lP3g=-W)6L;f?#ZYM;e{UyS)1lO)TaY^wv2#r4V;nF_l*}7Zkn@qaVe)kHU zzFg;q&wjhB|B%pw%HpWd&oSk%@Z!&-I)r14{^;~){fQY!|3aakO#LWL&(33?Nc1wH z-|N$_*VV5<=r5ajmHm=iR=b5xYvDcl)o%D+q0`z;kA99z9}@aWKKf*rJ}UH>kA9I$ z&&z{c9HaC{r!VVyFa1KN1%NI+`wlmJnb5yaZHo?{{oP3d68d$fPolB@26jt4r*ft6 zwle1){`eM77x}PG;id1Jxx5REd5Vv77O{% zbUnNLQPfxBZ~LX<IJZN^b^L+~DAGGk(7*=`H*< z!y%n7XG{JTQu~2pqxuQGByzfEsd&F8IJIXKZ)B#zFBg2F@XM{5!^X`-)P3Ub?^hJ= zljHJX1Sh;l^y!gu#qAd8^T0>?R7&~b_7M2zwEQbbip*2sceU`Rb}<~{u>vlOFy5zlyQ%Ms zLzkayj0p&Dv&z*l?g=lm@IOFx!Xp;`2<$+3k>C^v&?t&(4ra$l-(h#>x6xlhP%x5()RosLTW8w#zL zcq2-Dh@UlpM)MaWr{OHc=;oKm?|HAnd7c-ScZmGR`xM@+enOi>ekC<>IC$O{zwIJF zGM!-_Pt(-`oD^^62c@iqv54=_4fCEmREt9u>qLgW|8=@)%?>2e^&IrO!&K( zE1*Y_L$6A@hUO?>o!}1(URa^{xy=XdW|7lF>xXf0Ujx4nOT2ki3gC`>UW`A$schQhrtk zobs9Y^TaPTikwsM%eXiK?y~}WR^)dVEBV~t1wKdg>=rruM9yqoA8Gy=MrRw?Bn)vFkJ&JdSpAYX~U>?wsesGm^r z@d}U3R{6{0Hqf5b^-lUf*9!j_(ob@F?^1yFhu;wSg%*y_fHQy3rxicXyW?_|=%4Bo zIV$?lYDsTOI$X;YIkZ61HS}Et@LVY_KdJL;lfrpU8<*=u&%*l^&U2%<{0#a7q<`B3 z3gLmv}4{h-saME!);O1ko-K{vU~7YKtquJtCi;KN7!gr{)Wu)_zhP z|1QD5C;Yu4|6IYTy`ubzd`U-SGqD74U&@P<8# zkDmeI@)W5rJtAP9BJ*E7`ZDgk%WSH58IEjT$?7N2xCBWacT7UQXTm=Q(V1`>4`srq z0nCIigZ(q%tI#fF!s+GTO!(6Q@!pMcm5G0GK)TKjz>5R$Qv&pVPk^3IfSsutWYY5; z@F$t@&!9YK!cPjY+kVv3O#Dkxo-*MV1n7Tqfc~oj?DG?p^Gx!uMm^1hUmk$}FaW3*z;onaxM(WM{2(_+4GwLji5eq*{@G`WwCjUu-_gVN{ z!BbYeZ@{0BJ~7zCl=HmcdflJaXISujOP_}XFUa-F(ftK#H>mHg=U>lOY~1ocgKKQ* z&&Owo5eKRHTbvqyH2~N16E^?Ll71U+68&tPww0&D#(B&A4EP}Omkyi1Ncz(@{z3qL z58C}qa%Q8Q%7j-2;QINy9dEW2S{wg;0DdX_Ql@y%LjGpLe~NOI2|oe#F%$k=0N#Lc zP$vFqG(m>L*8koBJa%ek{weRwj3)x{y9zS%Pd_6w{%8RH%QG|czY>67`ku`Eg8_K% z)Xe;`0DOA@{`F~@o3sD;2i<@8v*#{XlD640`T`RPm=B&uWfx9u|DUf=4208EkH*ia$&A0WGBf_GH6Cv2dE(m4_+g6xymtv-_++5pZ4@I<*zqzQ_q5HJ$}>wEDOK~1Mms0 zndJ-{xLLm@Uhnan=`Aqu$H1cVeNF%#GjKCq_Zzrrhu<2w8Sm+FPaiYh^8@e|25!dt zqTo8e^mC-w4SqAf4t03(4jAbT-QeL58+d_%_ZxVPfgdpN%M-Z4LG{ke-<|;ccLDf$ zn^?>^Iq$#O!_9gfG4Nl4Md#y{f@}Ne=dP;_e$zgM-JX0iA1e*qtY6m~xS7AZ4E(2t zK0gb<4+P-p0KEDZPfxQvobx#kA2Q;-XG>;0wAI7S`f~fN9&V=VKMmY0w}S!rFAdzZ z!!rhM>i^l#d-0n3f7QTE`@dk|rvC4~Ewh|&8TgZ6(dFa>c}_{?*2LQke2>8&`;sSr zuYrFm05AEn$8YNY2?ICn{AmL>?c5oFf62g2d%j}erk-bh#nZ>cR|ep>1mF(^;Liu( zclCJjn)&slf&Uj+biRDc$bHp@^3J3lmAu&H~A-i$CG37pJL!9|2_A3{7>Oh+xck&PaF7& zJ3W3gUH2IHh{2zAug7n;3-f>I;b!??X5dd4ay}h^|J=Y$InNuoDQD4tW{$VUz)k)o z4=Vn*;72YQNI#@-YDXTxsn;DG4Z#2HVL!iKztC*qTFzetC;wxX^LO+sIfR?(jTrdj zpy_;EZs2CV&-f9TaF86+uYSnD&33cZz|DBOce5CGoTAr>Zx@{8o9*ep|5))8Zl-I4 zfj5^*m#c#f+0PKLCG{l)z!9 z>%HU@GT>JlxS8I24BSlb?f`r^06!dnhxU2;nDPq^+_YzB0RC0Mb@|ut&D>@1J0R+O zyy<6Nyk@?C{pTKTma9DmZrZ2d7aqUqXX*`{iiVE&K?66_wTLns2jv&3ruo+juG6L8 zC%D7lrzC3rrw!b!Us+UnaFBcxKQ{os$iS(HY55;9a8u4ya#A>K`Hztiap-cM%2oGM zf2Dqj{}4_szr?_QZQwT>_$~vVM@%@heEpuyyQ%TOLGsOZr!@dSn;HWgT8>_~I9qU% zL#EYwK5gJ;Ir;cOk`fBN1tiN2Xn{p;U@9Fa>F10)`qV@Sj+?UT62406c$GMWp5H^>ouMT(6J&p5S)*48N}A zX#LAbAdb0js9)lzBCOLJJ?7y*Gw{mN&_c5gk=5QN(_C6X&iehx%LFGqsYq)5t1N!~e(EO! z_`hP{W_kXLfj@1?|6GojFMl%duN%189_=>pmkj==4BRZA&lbWxy``IC20J625$Q2y#{XT^NfN2!I1N^ft&r4ki73o=`#Ir znY>R+_>du|#lWd4)_Ts9_jQTi9H)HMz|DO8v4NZEdda{aGvuFqyqE8$o&yGM%Kwvr zoBF@wEuI|ef@%FfY~Ut;Qvm))12^M6YqBTb9PbPoxXJ&y6Fh#i-2O5Ee<=X}n7kKl z+y6-eH{<<_ftz~XEAOR~98;h7$wNfK&Gxria7qRBb9yG@4~}|+-|R2NWnsK6XS;z@ z*HY)p9}V1$cc-kUCpl)i4$As_8-GOJOLyDTEYdO*dg&d?{`8mpn|?3(GI{^m#=lH2 zq~XxGe!qDv056mm$w?oof;wG0rqew+WP&c633T-!~*um82F9=|E)aRWE=Yt+Ea`u>ZvJUM2)cI5qVvV*CAVF3PR z!L^?H{qNkfJ^7}da}33Gb-yA>Qdd5$OFEQfzS-@~aX(DLgp@bKS5hQ_Pp z{WQ`iZQwly{u2ZL#avI0IsW>+ftzwZEAQ))e6wETmJgCf_4MNps(Tqmy7h6T;CYJd z;+j9-!oMc`1r}a;Pyy2{{DaRZpwPm9FL;rK-|<@oL@YceorRc%Pk2@VWdZoo0K75) zUmbuq1mNof@U{TFGXU=nz_$h9JpuTR0KC`2wLSYR{6ZP0^;>wk;DZ)EZ&U$80r;?m z9}qby3)k_ESh$W?qH)XTA4SfX#ea&)2%0YcT2JYYjl-q+9f!+yALH->RZYj?;>O0| zg#rBfJ$tR^Iii2W;@5aA057xflV4YcS!&@C!7DBNw}P*>@HK)rSh(h2AAq+7;GGtJ ztH|%Ra4mmZ0NxXT?+Czq1Mt28ygvXR48Vs1@ZkVF6@ZTf;G+TfSOBhH?ISYze{IiP zX+Lc|F96REzzYKKX#sd)0A3V;M*{Geh5x6NpE3*one<I%W!oMx}HVglP;5`f)85wZ=`=VWZ^#*eAvPt5Ikk!-xhqt!s`VewebHCe9Xd21rKE_|EJ5j-d7;k z!u9@4c{YB93ZHM`djF~d3s>Cu{*s03eG3XLT))R(WZ{tpB`IRzdf$SWh3oh7%Pd^K z2fx(DTa^4t3)k=EueNZ#pG1R&>wN;&TX=W7lHX?G`u+G$3)lNJbX&N7uYH?^>wP17 zEL`tzvBSbEHz|F3Ej)Cy!uu?|?G}aiTeyDze$c}8{ux6SUiJkgXV}8^`}ZjeFX&PH zBNndrr5Lqvz5mCUh3ox7cp?@e-SYn(B|n!23OF>b_xZ@PaJ{cdzJ=?3J_;c`pS-AF7p$UpX+qqx(iY#33OBAtiz22|P!nF1O z-hZgU!Yd1u9_uY!?@QEa;X2-J7OwY!>#=aX58SYY>;2wR7OwY)8?|t~Ph03XrLVT9 z-XAX4!u39I5ewJ*x5aGy{Yvgq3)lOut+sHz-&=!)>wVpJSh(JgO_yt}zuxby-{RN% ziVa%0-v4aK!u7sx!xpahX-ipn_xUQlBNm>zK;fen9w}1zn1$>8+d{dDuG6LWIm@%~ z{u0HPZ{d31wP_aK9aH>;7OwZHDzfmN1&Tjn;VHrOdI8e&IQk>Uh`}#Y>`WOoaG5e^ zoc5ujgG8KY$O%ninDMZI=Nfpff#(^xJhET``35eJAQ&$&aCvmVxPD)mL{mF*38UB# zNBkn;)Q;%=CWj21_!kTRuz?f5-nTMk;KaX5_(u$!_#-DM!l;20f1~h^894Em34cg_ zwfe%`YRr^hHLma5EL^wmJr=Ip_kIi4 z?R(0?bvv%>h>q87$0uG`;c3)k)M z77N$y?@kNX?eBgI*X{2S3)k)M6zSJ#{dN00$HH~{yTrnE``c{cy8Yc^;ky0ZY2mv4 z-EZN#{XJsgy8WFZ{V1)!Zhz-kxNd)!Sh#L~n=M?ozgsL^x4%0rT(`gbEnLq(9Ivm$HMhI!x9VE^9;=vuICxHSh${N*lFQv@JF7GAbd*-iIDwElXYp-B26 z8rSm-OD$Z_GqhQ_o@eN>aCe@;!u32u%EI+LL+E&=uhvJ;GwAnIHLm9wA{Ku^j|xxw z;n1P^^*lqTh3k2S9Tu+V8T7s@T8`c?aKz%*^9;H4AlHaj&ofN3a6Qiuvv57nu-d}= z`&n$L)57(>hC3`=?~guc;d=kP5ewJrqI0ERr_-y~6;HG9N?O!|BWB@xpZnDoK17T4 zaCBO@-bZ$ah3kDo2Q6IhcQ|6o(T(6Vd zY2kWZ-+l|%>-UaWxc;ufl(1ia{T+rmHZFstB^Iu~=g@57`uiALY+N?X-D%WJzyA8W7IQ3If5&5qh3oNAvxV#N(H0BW)u~D zYvxCne&Sm8nFS)$& zQ}qqkI|Wlui90trH#;{tpL4$8-0s}!Tyu+)biU$rICnbj&Zj?$o!!ns=SR+2zjU5(e&zg^Gvxf-dDi)j^FwF9^R)Ab^Hb+h zr#)-JkDZ@6=k0R_ou;?%at=AacCK!D(%J0%#Cgo=b?$ZUcE08eI1fAh&H?8>=X=ig zoqL>}&JUdLI$6&<$KCHd=Nxukb$;i(?wowYdBHjA{Ka|EY0En1yylEKuQ)F|e|Fw* zrc8Xw`IGaK^G9dY`GfP;lfrqwa2|KE_c(i<-0wJdIr#AGjCY@Y!h7CwW=Gb>tVwS> z{?vD+oOsqduG;9_ko9}#Th4EtkN?NA>g7fAK6KG#7hiJe;<82GcFwplYjajt)=gPA zXLV*JvNmNUv%0h1`=8Fb{4S^4+2U+2WqWIpYJKFpK7XaY&OdO zB{j|ESFHA9i)*S@c;JP#%~TgIs;|4M20_{QwM`Wyt*N@Pw!t+m>_8=$Yfp83OP%o6 zqlQ(itjF!u^($9ac(*gE>({NT0WK8};a8$~RG{qER{3BS$wj&eF;umzPt)?+W@tqv-vgoRPm-7kI+!Hwx+om+`t;@R#jBPOX0S*Ze@K1oI*>rf>+ewrhY>O zs4Gld*iD!-tf{8)s#Jbwp{bX=+lXXI=e@mbLIiYpZ~G znJ*H#0GT+~bmcp#AlM{b<{0OY1Ry!S^x^X6d$Ta7yGl0im@2pas$YWH8m#9 z=e0P?bwF|nB&epb5nisLxsja&A+_~<>+^!l#T@ENo0SV>b^Y2#zarxiZF;+ya>rz~ z7n~HJ&=qT|Hq>}9LnzsB>WV<>!!^KOYu741&aJAZ>e||hm5uf5D(ah8D+0NnS)A6U zmgTDK__g&HFQZ8#+g}7np({h2SP@n= zc?i1&?MyL#h%U>L=M^jKxTaA?s>o5GDw-Rs>Y7&8H?A8;20LOy-3T!^ z6s=Mgt0IFf6Cr ztE(F8(2P~MK*q9$lo@g_K@V{e%C!Me4O1B9$knxVWH`tT(QQ>j1KKhHw8tR=S&f*q z;cDxeYZ}+mxMp=#-3nAqkJJEV>7E-LUke;sL}Q>U(95bQ1H+89Yp+^YQMF=4V^giL z>w1jJNh+6CHCL~$xT5x&8nT`$=h9DfkqdOs(M9HrLr~7`U?}G{G;17!a&9vfjzdt+ zT_)8(P@~i8we?LkhT$*bdr1d0s;O&gX=J5+9)pUlPOUrOF+l|7Ti6Gdq#8A!f~etA z&1w`xw4_G7(e<^>7mveGxU0v*l&d!H;+nNJRZTStHp>LLf0fHrLZpx67IPD0vk*Yz z0L`duB~CztkWYN7tLu-zz_b=zxtL2MT)7y5c`kvZQtq#E;pPb0izuyiVKZ<~3^gID zx8kL!zPa9l$YF5qQI%Qa=Gz=@65u{oG32>#@UE|@U00O>M=wC*zVg5+QY5N;>~Per z_&qX$k=+;5Es<15ovbMdRjKBhOB#7u=RrQBRV<+5;IYyeisv#^NGgQJE$hk5s(D3` zk!)0bFf!x#gwfyv!_5`!SU7FyaPW;PE*KMfdh!SY=`k_NYXUM#N5flzVdbj2njnS^ zXkrWwFQ?FL;V>RT{TRc}F-qNxYPUUD)mXKm z0@b5&)p8fp!(oAEppKySg=REuSjWFSztdPxt!D@$%ypO=sBKugp@M;GHDyt;968iP zk{R{tCmIray-9R<#8_>K}aO!4O z%&M3}5{eK-BmSf5Yg%0~yJF_7BFa}TiAHa@rFrGd3tUO$AQ~zF_+s{tK~w_HS7TA? zcvLl4%sPKuh;e{1j8P(Hg;uVsT|ax)-{zc&c7t<(a%bj@nf|y7)pYs4{P%v$$IB8M zpRC<4sOJ!MC;MPte`q4aMx3(D!X-uIs-jxS(FA!+q;ErMkY$OCi_yjKS5&x>a}-RE zSLs=ZEGKZk_xKp}Cr+Z7M~}p-*Kui@9seT;pDF(SM^yYh^8A6~Cq6s=GT4VWXXyy! zxA0Rc{OuO5P!)zqH^BIW+4=dngg^ang#R@Z(=tugQ3-EibZzs#3(p;aHQ4sk;maib zT8>V?zRySaO!lk%jf#oB7f1)$kCs^I@Ur|Z^eCP?XD>Qd4^kUW_bB{>3cp1Zrtoyg zt-8VA0py>pI}sx{D9&x~P^@(KFit!Ergilg8_%eoQUCq|Itux(`lGJZ-wWo*| zji!hkOGa_cjIm_v*h8dqtgHO+2on?0RJ`?YDBN+1VjYVmOH;9ggHS14j^Z*IJsgYg zE?D-Xl{3PpZ)8E?(<3TA9ao}!1R)SFPKqyqGZ`Jh?+C($PoE!R{+a!*b{wJwH^czQrTd#D3ZS9%N@0%0*XM(k zp12b$ZgVZM^mTS6C6>i3$w+=ISq`bQ;x9O{>L3djzeH+y4=$9^~s(Wx9nD(5F7c_r~wR!Mven$Q|}L^Glk(`Eq}N`H@quo3fN zxgE@wj1=LzH+>(4i?Y68j9;p9p2=TQDihr@SYo}2i2;_;X>NQ@LH8Ou$S_Mm9*ph)rC z%fC9ORj$ob0#)Yca7L2fSBZ^9P{jIT$yf}({rD}z?;w;}ia3VS%(yq&$71(J`}vn6 z&Pk9K;Di>rd_9EgzC=d>Hp_y#{fVw=d{sV}*gBQ3T80w$o{Otw2i+GlXZR+1=AP^z zytsox_=^>nqpk-j(?=%3ohPD4lhLEG_T5ww%sMFb9X3RLr@F_L0hI`Kg{$HoRX+Ac z$2bx3-Fas4ZtX8-_9q6EjB?0WoEvN3wUja}Q4Tpc_hvm0CDrAHxyl{{U&xK0;Ov0q zx_}yaxt=EcBsm{v1J1lyvIX~_S&edxSVm%rN2%r?dmP?D`5D(=nEotLei%7L-pUDg z&^pGw(ZeJ?ieT_-5IUL!3#!OSRRI*RT$WC6q0a+B;NIu~5(Ar!&QG>=tIM(Z#gPJC z8xL?PUQCpD>j)}=_{!1Pgh6J9XG-i<)@G-&@eC2D8Q@ZrGfA~r^735Gn+8)T89e|^ z3zz*!>sK(&M?(0|5_^7F0B#ir+-0&|DOx&KTvFgV?~DqO=XU+6**<8W&E6=2oFT77 z-gv`mGA43x)(T&Ek#M>HQOOVa^Wqf~c{JdC2dwPY%1{&CP8}Jfh8d+8GYZ$$ zRYpJX8HwvDD`JVR7z0#XB_0A2B{>v#vYnZd%#?6u{sjpjaxzygrpIy;T@jW*y@@tT zQY^Vu+4GrfU5(f>d)xHuN_4xojVcP8S!Bi#Wpp&b<;94HAf-j?X!2ev8zZz`P@-cV zE>&S6De(vC9&oW2RPTM+V&Zql7DdqlgBqa-4I3;n?fJ5rhk#+(FS z#2=(v$R?-44EzTj84mUdprUYW0#yx($Vdc7oQUNl#aMiwotwywq3;0M$X?cS?m#$x z>l@JV53eI}(W4NCJfxXg|wnEsdBmqg2vy-~71bZH%9FGO99j&(rdtw-PzX<@&3 zCp1O6w}S57-Wa`D#RnWcv!HXBAyB-JiQx_^TO7?MSirMLnhGJbh~URVsakN$rv0b# z?`QzEb2yTW9zl5$}E6&Od7xy7Z2!Z*E(Z(GNbEr*ijN7&s{=PWdTdi2o9KD?XDys?~t zgOjpLQ)qjHWjgh04#Zmzz>qUtk)%N}YY^W2PLa$43R(Dp65jn}q*=?&jSo1`l~|;2 zHIiOT2Y);6Sqls=m!XuEbW_JClq33+q{S?RlxIPfCA;-5KUW$N2F2Ej!l7{vtmMF<1He8Ql1eKnqxKN<9fNW%WOv&ifGP2?D z;HXr`MVIFS-Ck0BBz_>3rOPL>IalseNGln4BsMSxvFK?Gypo&PgBnNDxr;Qi2$f|) zqA!n4)tZvqe7dzdOGbO2=fy7_OVNS53JVbbLFluG>NeF^?!!?>bG-iC-)MzRsP|Vs zI`WoWVdoBtzkJd7mAi)2WopH#!jNr8zCYOu=M71H@xfoA`|4JFs>R_hE;f{DT&Ln` zR2EeI=$Pwxrb{lxIh*0$WT*lTG9oIc>ze)upHE@;wxx)IL)|eS?%1nD#}b`XN2m~h zH^IBO%S|!2JKu9U%l`gXE(F*V{o_<8eBU6|w!|hX z+kyGlez=>+_Aou!#<`B7l8D|#M&;5{x+6(<l8Qf^AgA)=N>vlD9Cix@Bi<;P<()b6!He4+({ptZuo> zqfnY*CzOWiw{o~dISL2H5DMY|iSprObZ2q2S7jiyEspL8D<_fz&18&wDy!X_h(aZD zi#wC$ca8i2O=J4kIn0zo2{@4}2aSnux(@v8A2I6eQys2oUu-&!2;p|BKTBC3b9N=v z1xAKU3*Q|bLKUU)EST;|G1H!ey4V|~;t@i`@m)@$9JY5AnE^$#=1I7@v_EOc)POFNYzlhIC4wk1pNDlXlTG2}4lZDzE%7K>80DC`s1;I=P>nA-p5Iya7ob4c@z+d zLI%>r0Lp0f_f+OSmQWWSZ77yq-Vae2!4lsOQ>2OWvxK_X8y!*w1+p;7fKnOnKZXLA zo`GI?CWUXlFGEVm&ZHa~Bu*6dB-xIbLW&JM1Fc)2^%IyNqlEQPo^;0s(nwipzgJe@ zgydk312TsoQx)6jUEEK&EB$e*C6@gyt#7{5OPMb@o0EzFFqIq2Mkb;xA&P#fVw4`t z{S1sCJ*ZQEPoYmj$86{tz8k})jMa`B1kxDU5*O@I>-8!Ja zO&vtqfyt65P?b!o4zEs1D9%rOFJhX=hm)|Q41qg2)L;9k)fZrNG4@1_RI z?Ju++uB58b)iDJB=WDhS9fJgMr%H8#l3k4OT=j_C71C%4>IF5aeqQdD0hNA}%bXA9 zG2KwPXn~-tsf$j-*h}d`Qnd2j z@?}1`_v(c2PtK@<_lodxi+pZ5H0#$pq zD)THxpnLf;`xJeZyb6JSk3cWQ&UqX&1Usm~onfjL`Rh?7Iw%OTfPWGl{pyaRNk))2 zq9*0P))S^O^ei5yCqjvyA3-Q}nY;?23`KiL(f9il{Tq=bIw%Y@<)1`HpSoj(i}^0x zrA8@=q|&mtV<-5K0qCbZNW78oP1Nav91b}!hVC|BCcB6eDNFE0dLODgSMI$Xy&@vX z!rsI8JYb*0k{%>$jeOcj%!C5EQFScYMZsAvU8H{ixzsapi+!PcRhB!l_0OC}w*Q0_ zv5FLqn%tPWpy`5YBDe3RD!%MTJRj)JT~n@8*(-^tI>*ljM&!Bx?ZQaxw)+t-6nps< z?(8KlE`;+&RaT=SX7FejwUD0y-69|w3P1$~oyf$+F}cr|0E%V>D)M4NmA8mGq!|^b zWSTjpBIBXgxh+Q7$03=nk5gzKn1R~N z`G8?BiYnd7w*{;&+JJr75!Evv@e+`b$MNe3l|>f2qht zw!geqO7OV2mB*vz+*8en+wV@t#qD>er*^^^b>!OLZDfoJ>S^xPVZ7Ox>kdb7S|$T34$&7N8*Y< zNaFkg2!U6wGz2K9gCGdtA5kQ!bS`GK!Z)3z%*_$jc2O`Cb(FSOF!zHILdQ}PTA-L% zXf5kIo(a(qFM_nuPy2)Pa|{EZ@J&3hypLL@S|+}a#3ec!h|jfao@+F+YmbkHN?;mv zngBS3jZQyStbwV~H+uozlDs`&K3TUSYpiu}i~N1{pH%)A2XNCpw53`twhs zW4*fLpJGm%B>X`%3tlo&bB*HDtpW}554krpnVpKL^-#QSGMV~UlBw9;WGZ$^W(<<; zWCn=G47pN+fBs4`pHO8)S+|RSrfX%WV-t8|SX7S--XH2fE83x@0q)-!vq&>t3A6QZ=i|Kg5(;rEQ>k1sx0floE0(R(k1a@cR^qPYehP>wgu(fEDBo31lf#20$A;4MIE++|B|Bpjs=JK-wv2}F zej--AD|XI6tQwD3@O&~+Ivm;5dN|VA`XuJ#5<{`XKrEg<4td!hzVYiMJV|5B$v?(r z=-9zc(I-)Whw0gW`z{rC`EaN6e-G|-(ocTJ`spd)tV*(N8s%mz zSJp^vya1x4IJF|PXp*lXk8Qv=dn0*Z7#H>pev*MFs4XbnZ{9dy<)^#uGe(Z5HNJgH0 z4E;D24Ot$GV)7FGc!uO)^8fNYj5T3|E{ZCaoP;O-d^LR`2*CRgs~HV$4Yh)4_voMq{e_A?{-80@9ijb1<;i&a*KbPOC_^l zRSSoYY?=e}u@-9>%1&UpO{9}ilBF24d0`!s#s#2f-oau1ddMst5-VpA8BJ#MMfxJ# z#gY$_2FS-E`l;q6eO%C#U6`B9kls&gD#&1LWW}#aq*oo&%Q0q&x9&h?{Q$0%Cqxas z5EXF>M`KmQTm=rUxiB|7aUse(RcEY`No*ZObcvUwazabKKaMI5sw4$lKvhy*mcjug z9$S>y_19~Nzj8i6ZGvc}Dkr%4uhyt%JlZ%n1_bT+1f28P(8Bp6A z^J3Lw8LQ?Qu4+cr4ARb3Y5GD`1+5+GifH$dynj?ZqhGb^T`1#WXe ztxQ=iD$WRH>d2Rl$$9T8$Z&@9E|qet{mk(bKfv7#3SdOF=7u z+jmp%Y1xm!{I4Htn_KGt5hS8m)7AgRo5?EwJf_~E2&td*)>h-a zKz^%&F0aB`rJCi~c%}d^sMW11z-Bj1we@ucGiS~yoH6sfSrjYv;^}a%SsZfK=Q;13 zd|YlfvXm+iopdaxKP4yT-H>(B2@|uHfkV;e5srhVm0WralR4~_gyW!fUoL%>N57VE z9H&s%Nz2bZDVsPb?(IaxaX$Ug^ad~d1BB!F0{zkStgXyI;SUgwBT9ct4B^<|B z=#NYPf=fS5iuRR0`bS;*JfY7s=~pvZrC;bDFzJmR{o21l-!AkjpM9=$?el=p?>6OU zeaqGFfY6uGuTEd~Qim8$19VjAbv}BnOFvDjbfZuHI#)iusX+%#;<)lRc5LnH_BSUI1EueP(D{2ZI(+u?uKkV*{gA0& z*3+*1)5z{PX8Giw=gOZa^y_{0Yjy2+rO^NEqmR1uYlZ&dNr=SN@8U_yLLBwDKaB{J z6MB)moF)-fGL(gX{WRx`gUc*_KZ%p@LUe)Y;JSj}GocgV`r9yENB$3aZv$ReRpk#S zZHfU3Cn#c6lvJp;R-B@Utr`E^lw7$*E*2zA(fJ4zDhw!<5-2(uZhDh)PcJE3O)udvK7zYH}&@$xX4sI|IF0WPV)hNWG>_X zC(SsH94Fu!i&wjW_tQrfKf>Gi|L3Ou2C-Sx)X1CyeB9Ju<1sgI!#jUIWa=5DV;Fv9 z4&nc247@N$z%?>A@OXx;hkJPZh)mK)+<^`0V?gq6CitP!&&(P#=uYCvsKTJ`Kx=B) z%}Vee0-s9o#wzvvbrtx{Rp1}3QvW$s;LifjV`kLVBnb zKkLBX@4&xq;Ot%#eyyDQCnx{=oczNM`~wdBJx1=ZUDD9fVc;aZ;D^(zi4W%I0(Krh zar{3=DENuPU#|lHdp1@f|H&T=;Vz$C z$`|~wewR-+IB>UL@8t`A;`nT?0{^&KXyW8bb5QWDTD*pPJ^t_?`OxAy7=!nl`iEn1i|0rTZtA;!a z>RE*t-0Ee;7~JZKQ!%*J`^W@P6~2iNP&D*>qcv<>!%D zeoN;<3~u>W2!=FUkEL^y>6e9DIwxXqOXv0&yxojrCI+|T+aH4$O#YD=-0Ihb7+e-0 z_K66Ze;h}vpEkwdc6<{txE%o8w|Z_N2Dkb$lv4R&GV!;1 zZc_|y_2@(lZuQ^x7<|=#Z$IwXx6Z6Pd`A6YZ&@(=sQ1o$|NB1hj$;~* zJo?@5YCQg(?>WW$(5(3<&pqkH4<2D7X(OnWntUWg*oup7RzEfDuV$oQwxEFIm*gG&XZT48!{#=`o+1dF1Ysr%u>h>^A!0naj!=PbqWZ#3X`m*A zMA^pn_*3K`IKePb(O#Wjn`_LNgjtaNJDy30`gPV7L>a#5PK- z4%g6RH-vm}uA~2#cS42$qAerD2zRWrox5!{{In+u52w0@8->+tk#Z^Xxxg6!E{g&$?YR0H zue;d*@4MvUE54IjoMRncH&sBEzwesWSB6j;UPFvaJ=!uTm1;6`^_Z^?G%gMXag75B_!8-01UZ6D08{-+wk z#C-CZ(PD$#)W%hH-aG4hN^qBoxL#yC@2TURnu>70=nW-C5< zMqWqswSZTMn9M3nR-{r)pn~DeAzzpbgirvd^7r-OkpY-QW*#lbvtXhTotQ!brNK*g z*RoGj#ZMr#8y?s!+sUvR-$Vc-XiPw;1i9pO4V#u%hF1V+R(qt3g|3P~rRegYsJvbl zyaJEC{}{9|V&M|sDvZ=%V~K?8$&?A@MLfnbJg}hUT;Gm&-gagRigI%5KFQ(dC=cP| z8eNd=cr`@E3s=~Rt6}YDy|yL|ie_U+g!$D&CY4{L3rdyPY0IMWU&t7)0T?0B$I5;6 z$}!@Ma8F1PjClaw7{?4~T0HKpeIMXx1Mlu+G)+(~ zF4eQH6<9pyf{I3XeL5&bp;psm;j*$yUR?Ua<>P`DtjUyRIEs}agUTo=Qj4)x*|><+ z6L!?$n#*7;bGC`O7>qG!tU_HOs)59wMG1y^Gi+`(VL_kOZa|>GFxr@aTkvws08qVS zQdhm=$6hC%JMzgLCW@Y!(Uw0Jl0VdUAFh)+W!Z7@)ph4;F$kcEi9MFU3dN4d#GJ!N zDl_@afIM~<@*OY3uNE^D&c&RPz9&&p5acZu3oSwZ@e!q~t%x`}Mtzt6O!y2^cmTJKoP%!XF5y;qJ zS)K?(&)5#6$1$g7LNe}5^`>{8-J9G|{O(MM?jcYTH*gqWW4Dhul(S#Mg9HKCUD^V! zDSaDNfEvp7Zvs!b5n=gW@VpQ;#_&|7&c(59JMbJSZo*kEaAZKk$~fLn98sZFDOAcw z{Q6yazs$~W=@K}@i4~|CC5Rrf>s3ML$*Y|H__b^VR*;!GA(@0ti>cnW5vpY-^wZn5 ze8H7%B?XFpI#PTYIk;N=4F7fZ39T1Vc~waz?-+up!qSiY46xQ&C_eQftI!sEvVa4x z0`f2ShU&w|Wiu8(=53&&23RqlYJ_KT>4@Opz-LKj1&Sm3DfAD#BOzYp0MVT|p#7cb1l~7v`=F^;RG?%>l6MYks7-mTGf##L+MG7OhOH2JLibaqBY5+}^fll$uy~L}ON6@I#6i zq!Ji|^V&~7<0OmtwL7qS=8f)jAgU_SU-9!hiZWovi5Wz~fcWsHh0q&Y%Y8(XwvLoG zM48w~&{lyVG!Ohgxf_AJosjz-$%(Uj)20v9d;G3xWOs1AS}IFUtsKj!y$H1D%Z!;w z-~fYSiFx*UEHlgri64`)FnrF8M3UTGq=6L*a?wh9Xr>s{n$IH`Bv#*mK_dhT?sjKT zi5Ws26gwMb3z%KAW}escdFBD!+mf44(abQzXBt=_Q-W2wM+Z`}UqZS(CGl)GZO`o8 zmw6gNpb&T_IhD&TKvgAf7Wuj}!&me8q44o!`-mxdEX2PLHpT$WTswf88Kmfb+Kf_* zw|ncTZVt;Eq6C+kOl{T5fh7mf@Bsc7q;EqxYB8w48L^Ys(IA%U>MZbDfwzvN2D{0d zOJx>KPp$O3L;)h@#xe_uG4tzd!g*bp9cCXuy*o_?gWVMm9dSQ59E%_JHjvMU`Qj(P zE%5^lb}Wf}e)`+_qzO?BQ zL1o-qNB1Pnf=kc|g@=VB6eV&&HGWr$7@)KkN9Z!r&%AX>X3~aCcB!AJuJEN2+@$B5X-6+B zGc37grztB9^luULAM>^x%NbBJ`dS??zs=XOehU^oFs|&@d;c2ge9a6$M1dN_Jf9j% zG3jmw&aL%*KcnD!0S2PfGH5O!?KYKj7gvz0+!3@;c}SI#QZTDB%DA* z5Hay&I5#zC89}m7dnAYf;T z+tos8t+x)hutfKpS}**RYkSn&(($Md%tjIWcOwfR8k%?GlhBh;OD?<cMDYy1-HW&4g?#$H$yxk7-~Qg_`Xb+MHfciHJRzMfZg1jvOhWY!!& z&NPtXb??L5VmJNACj#;T7qa3cK;G^`?tVWYGhN8-^8k4f5=;2+?hoSam*!1yy;_egu$PT*!NHL{hrJ*0Jq0ynWeCfAEul{Dn2`Fs+Pqg=@1PXY2f2#;X&?;xb)Lgt_A$P_!@m6q-wwBL*YoXn5c%l;MDg$V_G^8EAjI6ikC6X# zA#eE%AY3E@inS3k1W57I%kcEinl@2P^X+!~b_3sTv2S;EsqlNWf$`6&jRun zF64KFq-`B1LwzWnZr@Jl+bM4DG$AM0^xOG%jD35IZ!_)NOMLqu2y~&stTwzoXW!nz zxBt*LrOC$#8FL|7Lhf}TqlEmU3;7MHbc+l5$ae|(ybF1bkfko< z?H2;V`=q30@l3wWw{I6xmc84)eV%EwwMouSzVZHe@gMob8v@1e^66K2k{sXX+kcri z;fHr(<5K!J7xIBW1%z=Uq(q6*^!t(YKLZ2?e@T}*?)`H>Zge5PYzL&ng|w^ygr8eN ztrNx1UW&Ii`?iU1XWF+RzAbjk{yQNba3M2S0`hhPDJF^ITjY((fumbsu?*3C?-!8m za04keu+UHBEmr7g%`#E^uSkJkaFzNN(hx`D(N7lma8soIN0|MqHp57HhR!b{1Nca5 z7%tE7r&l8bM6YHTEYEP{YGeqykS0dR6#qjdM!#P31w#~Adb&y(*4OhHfTR#}VIxr> z_aK@FUh#|g{kKd40>$g{hp>Q{c-g~}+MFErvik@`UT;h4c-iIBXvMmWuE(_evPN&q zUVQha=RT8|&rJ!JCa0Qnv>SLgHJB7=TkG&xx-%HR%(P^M(zn8wQln4Jl2B90LAI0c zTccGC`VD+XA0pcNAaq44{)4a|G@w$!7Cj@pkvuIJF67@7Zs``U1JMx@B>M(JYR)1i zym3^zjZgU1(zApVpi=229AmLnpq*is|KXo0&4-$es_C~hF;ixkN+pzU@ER*Zk21Pv zK<8$53EIB?<8h?!H)#C&WMYYjJvCHxS}*eWSK7fp_|WgK}e z{4Uzu3=>;JnZ3P9$_Mtt%%J6;d>yt%I0{JaDIOyg?LkG)4Va3WqSmn1;5;y_4;Fk> zfL|C1ea1T;D~>Oh6FEHFV>n*g_O(sy|NOegfF$a+=V94B3j_S5J~=>);fN+sjWqEn zX5(b>qVi@Y)#!lMOb^-GY@8(WJ2RnuJD_EbwDiZ(%gFfz(<{@eGCgd5#a$7N_Lr@5 zK=u43nm@!Atjh723HFwI?h%r)ibPnRys$0zevD(+Z)+0Z&>o07vfOma+m?BsjxV~= zH39xDtu<*VGOtRJlVU|U7s{&hw)t!_2r!IyEr*~d-nNab8)>q?9GyN|M@%t5ZBiXD zAaWLIW7C;VQ4Got>?{SM{As)i$8XEAi31mSyD3m!73(!sz4t&>6=Q8T9aMpeZA(?Q z?Fd%WXhdl1_PRzCRE%HOFvqMW!9k@}z@YAqHCMp03aZvxf_`snafcrpoDtk!k6!7wz2a@_c%|zV(r_hCbz4EHm+(ov zIs^H~~vf!@|s|hgW?4L0&nroK#K@CzY(vn(%!+384$U+RaUVbaKnwr>DV% zjO1q)A$#5&t``zcmz)5vFs{vva|GehwY?G5;olKx#2cDw^@cFgZN*j|%Hq=(m$cJ= zW+M9<=7dodAUD&~`CHf}zmKSMAuImpYtp)`E|u1+1GP`pwnF>Q{6*OQ;m9IwT@|zy zT|eCQj2w@?!v6OHBxL#p@a?4OIHJ=L)&>~AEc?DuJ()F>{J_B*H9(q9EF#rz}fdKoT0SbAwJl=a9gE&#RE zyK87Lzk~G_6Ud?ap z2O_BS`SQlLn4~?i_J*~+N+oTRm5NHMgAT66gKu)YO0fgBH-Z6Y2%mn$Ou9dTt`_l& zk>~^>9RmV^I+`)ibcQOZ%yIEY)C_Ksep94p4Ne10LNA}SpmBTaJr<3~Xf9x^$lg`- z-!LPN_a43@fSCNdeB^D!hz?aqxeO_uTYQ3Hjh*6n@8LU&>%U$WNg;hn)2#0*8AB}P%A%y5C!qtN-F;)y8 zh*Gj~D3}Z{a4{Ht8W|8jUqwrm(pXz&$|)q+)2~>(rM}c;_EFd@^rHow+w6gAA@xtl zd9=ga>E{vY&&;Hm_>?V^I9t-i5bn;f^t1k>c81{-005QWGy~KEAx`lv1#R>N+vppJ5s!KWA@1IZtpBjLWp+dMp~l>7 zc(v`I6m_M!-Ooh@D@PHk2iJEe_ITQ(dFHi_1^+xpO+$azt{9Ct*D20fn)ey}0(<{#^9l4-&}uaAe6~EE9W%I zM`7LJgghePY_d?qqscoiPY|-05R!ot0@5wW6X)MhV_)g77Y-0DNpy>q{%s)*tJqU; z_6|q+;DdBfUAob3X|ZB7mFij~t}+{_cMkIr2p8?TC&=I({lqVgL0t<)D1;L#)F&ah z#xe;cW1?$s<6FPb{zQ2dT>;@&C6b)Hc(M zr|19v!`bJTW7ixJVpG}Tg?f9VM5Pe>Ht{%p*?fc+Z}3)rStOo(R8s(lnsh#q4GowmdAb4|8`pNiXIx%tnbyRcE8ZE6Zks@7~{ZO*!cPa`*1&HN9h z@TA{<$5IQU^<(hqZcH_|Gz8Yz0FBR@y4CT32pjhKgh@bX?gUm$cN8M$y)wOxt~;ux{UIi<;qHWvy;`K61X zbz*MUjR!b{b33%(#@2t*ZGSk;G3`{tNnKN904gA&o_!=t6iI&ATHI)mv=m9A5(59W zqK)e=-+l#u6Y{)pC?O(`jSPmju9ic2Dq+_yN_D-UygYkvTv>4YpE$tg)f<9U0aZe; zUdQcbD_k41+)_}_CaulZ^uW7Hp14prVm{L>t6C`4@}*EI@zwbidsQ!fQ7k#4N%l)S zZ7-a?V!NugJ5vjeHXW2gPD1`#qoEodoTVPNO6r1D*k-~cB5M+^@kPGo0MZFo(=JwB zqd7FbvNbQ=FQ7DbJC9&@{_|G<=jivuzKK(Qf)M>iDg{M>ch^oXfh@WQ->)pRctbzI zK5m@OOZg=Hn=u@T;5?>D=x@lv*{t(yiWOHp9^|5hgD74$I7}%zg~J}iw`VVm*WKd1 zUe9B|fmwsI!x07G%L$a6%pE%(q_|v*OeL;wOvgy6xFsqq`%ER|7I4cwi z24{r@IV)soiuS;>4>Xjs!h&;F$ZitesN4Vz9Q;dN7iWc^#tA>Eu(PWl)zp+ul%y~ZAdI>j)<%?GCn_<70st=Os_m~nAxU$Zm$YaT_~ zlM*?M6$9gz6)-Q_BAt91BmGvpsk0DU^<_!FgCB zIv*iyDUghwlE0hYn|pWx7#_m^e?w-T>mvw2W_f{&M{i$Wa;6&!CdCEsTX@};?N z9JxGtuCdr8&kE^gT=cp(C@82&i=zs1087QrswenWWSAA2(-XPmqh7YW%1!v%?xX9I zkMbjmf~?IFjNqjCIvOx-PEMFy9|vpO!Jf>lIUeXr=@X0)IWQAbT|@75q2KUy*fGn} zWhdSRrPLadFrPdC7n7gF>$wB`drpH;AurF3Lai=N5-M5pV1(Ud{uIr4Zhi5}&$5|- zz43@D)r38BJ)O2wzWx)g@dZK=-@Kmg$dwfmtKV`ih#s$(B=*B!oI(d;FWiqLK?0`u z{{VYE$!UXM_RD3jorX;g%wBhxoQ{nA{TRv>i=1#^D~d(VU123mdU-ICa#AEEGD1?$ zIXA*emASy|Cl)&L1s~-mv(NNgz5N^LSn1i=kgMuaAiq|W1Hgk)+j3I@GkMa>E>s#7 zLII_V-xQSIQ3WNf4@^c1S zq^q;2_a)*5jQClH%>3Bpt zkv-X(2J8jw0jF&M!zoosd0yS-4g@XuYjdO|H?$ShhuP-YT0jRhE>!C!fj`U z#cO2}NU?3X<3JeJr&4BB<@!!T`#Y15gN1}tjg%cmOG1Cdlpj)mo~9N{XJ{$mSY(q@ zvxM@ovKENJlKQ0v3xse$|IE!XT+|v%Zl%-N2r8GZqh^t1INsgr4IP`(?1KqlF@LY$ zwkzK@;(<9C4UAg3g-i>p^W)`9(Qq&BO z%N38$c@dOLc(;z>>theDPd*svYc!z2eNXH~Bc(erbMe-k+~wW4M^kXs8W6c7ZgSZS ze|Dhuyl(FDakm_`0~_F-Z`%Qe97*+dPWn6XS$Y5Ae0sQ8ID=OQBW;xaRxsJooE-Oh z#HQ6j!sOFCSho1ar)q1&Sw$!_trPHjBT#co{MY z8RZXL6t=Dera0f->TOGI<#hD6-9oOzA?!`f+=rCKyI2*@7qN#xffHM!*E`2hr>ZgG zS;+v4VsFO)E~)n8e)cf#k#8x^!IHsfEHZ6=fn32PfH`d;*d9Xk+opEhs(~qBR3$DR zg)1EcM80ku{rM*LB;S<&4BfpOCCOCpH#G$K*_mjR%hILDP@*dbJ47gTE9Tv8aHF^t_x29FEz~QAGCUZX zw#^uxK@88o6xSx5;o%+~%yOIfz0in=Nxu z2fyh)>?V6J)H=t7@XcKXysB=9O#gyR8<45n8SxDm@qT399FBM!Cmzbtp=X1cEgNLA z;+QW3I0iBtzw92JAE8Y!J3ZqdX#Y--MOMY$jwtO9YjtS<5}G?O*={TSMLZw&stF5I z9^tYQm?R;lIcCCR+ioEXWuM2;Jxr0U)V-~A7@!#H+sx#|FNYZd)hHnPmYh|M zdYpXY(CWyC-9bL}!6mF`PJoC6vH_Rj?x>uxYv2;uF~ALkkx3vk(&%nSL0scHCgA%5 zUC@Z^TbF>ZoH>q++|;Cz*-G^;EDDs>66;`K1G!a$g1-(0kb-sqI%N#!Q{FX z4RWOux6!fW6kfTJDDr=40rDyGs|l8Y&d?88#I9^a{LPX=;{1Ts`Y_#2^; zz`>%!jE92Gol>zZtJ;RR(@B?u5#;=b&1L}>Ztm-R;w=Yu&s>MbR*WDr(Fog2=QG-T zn$+l0YK)q53b@yR8tFoMK@0yQv(HYq`eXQ{aPjL>6GDEpjh_uZOy@U-2OFB8HY)v@)l*Z6_aS@ehs--zF814L6swVISCV zv$Emfe%P>3kse^bqm2q-GL+E+T*pzlSKJka9()pd4B#l49|8Ud>c-;~9^b`B^{>Pd z)}}#JRSW<#Ev3vkHA4@T&0c9 zFY#fNkQ)104ZC&_iSWGKu~$KZd_mBI78JKyt)(dEVOEw3Bk_RV)`;1mkIT+Ks0|Iz zi%nUh40=6-ramY)6yi`T;JO#^7;U8IE$5JVLmSv0M#Opveti3BGv$CCEhbJ{aNe9iX%XhPXzA*Q&Y@i?#$JXJJZctK@p>Ho7tC=pblZvG z$eDxz$plY*_GPgLjD^LD*T*%5&)yb^o`Jg^+yZxdpc*!1$QF1}s%bB>A8V?neBJc> zu+}QDRyYBICE|R;aR;ZRzk=bD>nGmO-J-i3jFEyDmrIYJ>!b*{xWalU)s}l795h$F z@+P=~ql>{V?3+lQ@{?9DxG%?W#4zLycb5FwE8@^1GvudshE$R@Uq5)wyU8`G1pYgq zllr@Xjg)HD{oSlRSoiP5K1Jq}AkEy)1;^KTrqFs80t6Qtoa6VbXrI;(ueoagkOPASr{&XH6eLq4pK7WaokWucG!+~cV)x|wD z0J3F=1|m3dXG>0xT5u@QBKt*ShsE-Ws5;O?u{w^JxX|WezzBBOBOu!dj^4(-4fRSe zW)@;%Tqgt7pErvrhV3~-m?z|1qzA_i7;h9=z+(sa@|z_yJ-lxM!U$=BFmhhavBR>8 z{2B6EMg*NK2|Nk%wwzy2)7A^T10d263^*_FKbcM~XlZI$JQ6uST#KHTxW~rwx(5ew zaBAWj2iwcdOO*)dsSS38M+tTXfw2dpQv0H`C{93#_|>*YtU!BlEBQtAWskAR>?z#= z1%(*V{|Edr^Q=V5KMNi}u0xvH|3>}MDmDFP`?x0PO^&p}@Zc|Is=TrDT-<}s_tGxU zonGqCJ}${=zQQJ5*s6K7!8li$0OM=;E^K@ zz&gVqU?L#l6<#AJ?b&VGWXF83u!jUc7X$N#k;6Xsj*$d=cw0(^l|^N`Ux=5nm6as~ zm7xTCR**sSYn4tF?7O5-Y>{0{0v(*2+mqS~g-!*OA>S&jMA923RalHLjfM4NtHL;% zfx0Sc01(CoVF70*T`QplwN1AAJej7CCW?DQeZdjV{|WIU-Kj~$wjvt~7G7l=Vxl)> zkj>7w_UL>w_iNSG%*&gU>)haAP5Bi31>yY4!$w_T#0(^w=!CcSpxN(wieL6kmubs> zx1d@>u_*cfA9If#P@QxDq^CV{mr=38LxYI5G}t13B|w}i4z9bdz;=yxKv#XRo5x6^ z3~^+-wN2{vQg}BUCu)Q4vL=izrl0mB961>b=LSk(;uME4aji8>C;7P#3ZT- z2P;+cTD2~IF6fLa1W*?b9!AtWhBt6+9wxU1yho}=OH59gpwtlp+h1`7#&iYf&{ilJ zyCn)^n4xTyTMF+Fau1?0X$7j|2<>dfQbQd5$6FB%Wdrh_y<+@q1d%p|!cb;)u=sGx zK5i-svPg!143<-L-_P!7$EqBYw++sGpeWEtrJd89k61FKSObdL^&*xZeY2+^C%X6R z%j+qbi*0NqCj;qJ@818zFz(E>V$$FqL8wD$`{tlP(`%}xV+FVo16ws+#{^u^Qty3Z zy95Q^n_2-&AaqN;zF_pT;9!DdsQJHni1}|n#QcAMi1}|l#QcbZ%pk~>`-}T1a%L3h zX`*a9dx5D`{xmS!+#5J=veStc@79qPM8!?wjBx1+D7?;~hJzQxpE=a}YYw^os6N9x zOX@c95D*rXpWZ;f!f-;@o!=C@T4kLmjHsqR-n;RY0k8XGC@qr;0j;ye<&nEq0N}0_ zt&pYj@P{`@;Rc-CQ-acqBb7b1AW``l>aR*XB$CXyinRy%YP?%VGf!b?MtNX}uu<}y zOa4k4#zEq*2=87(?Ym6DR(^FEp8A6Gy{hcunq2Z#wF-$a%&w_tE4lQm>yxhvew3Iz z(Djc)J(2mwyLWfjBC99yr`}X~4TL3~dMvd92SIGAVkIWIVO(+D?^Pag;4Jx zMlh1%K#GtqKQap~qx8=3dhJ40V2)0b-VEOv<7r)_UUjd33I(}YZv{Z*26su4Lx;CQ;e|z@%Kf`&5*Zl$F zKtymfk}ZB&9RWhX)f(lj^nPZWgFomrKIb70I*6QW9b5ovVxk7qg))_EXDf^gHDQ4C z`-ji{=YSUK7)i~gl`zF9xGZKY1veedS0>x2X(M=JeHWv?`|0X1|6%{JVN_C+`e^}i zn~;^IWd%k_yCfiXyS-b2DHR-ye@CmQMzr6v@HJt+act?To`u`vPHg{i*&==rF6RTP z8^lyoD(&!-hA|6%KmY{XE`_ILuooECXU-h2*rei?UOi zLtHlhweHkRUg$Avq-#I4>nV;gqv`ScjUse<93*;(M3WK%NGw9X@o!oE)&yWh{IXMy z8WIp7s*lL$}`7ek)oN`xs3b<}BMk0_6h#B}tVs z(Hv#Mv9}QcOuu^z8FjGV*u+)^S!@Tzw3E{M@);g<{qkZH}?AFprGE3#WDLJx)0sB_-X%Ge6TQXfwKF*W!3fF1FbJVSD^{7qeEX` z{?V2_i1h`cbW(@F9;D-TYrbyWh*+e7sjO*;O9C?otDG~r){%gW_9_8f_qzytFFwuF0*r(nrf`vzL5v@!7+DmRUn0Z9`dXm76o2<#x4yR=dVQG7B5%8olCnaH zsp3hHOI77zWqBPb|ID`ilsEEJNieG#%Her;BtOQhGRdmshe~jO{I1OBdKG_{u{847 zRa#n1&7PyQSalMxKxuhrn9n-!>2Bjyi`t=hv~{6S=|TR%ul6iBIsKM}9F%{fdva>; z3>;8UT+Ej3p)YheUKxNk^@?#Te6g0HdxTh(jv>=n?Lxe(yF73#GiXWWF~>hR-$9oh z#qswZgYTgc;43Q!RCZoo$MfMZ@;z^jeBRJjA zaABysI`{A?yyv(xb1AfgS_zUaTkSvx)f5DY2e(`P)w*f`(Jup@V3+_Kph*CmVI{uV z@`0&Y84VcJpq*H$ExBU=l-*0!Qe3NKdmps5CHK|?mcq6zRw~4BL$ob36^J1;gjlJn z7&@hzDwL{%VYq+D?r9I#%jC3;LHbi?Uedq|g1;39xx0Cg%kM4I`o4jN_9Ui~HNYdI z7~pxrf%`WHo|@m|0E)n}zD&C#MqyZ7#bP{(3NdYe7D*gIA~K)?nt^9P_bMtxE+Ybj zGkp5@NH`O@kc7tqSZ+3I6R+9?Eloe=?*FIRLahugPsGd)qrkHdR9>X97_J_Z>hmt& z#VZJ6v*=!wnk9+^?k4S-EowIeirR zg*&D(^Z;7G{>7>lBeuzo?&jV zHXhsoc3mE#Os>mM=hv?h%#f8g0*dDPJlILXz2!ITK{EW| za8+U5vGMA0VV=o`4zSW^>ko8c9v7SDqZ%oKPld)W%s+8x7v|B8ma+@;ar+Iv6{}a= zG3f%QH<^H36ll~FJ6THup3!ewfg~7?u!wM9Am1=RfpMd`Hu!>U2ozq8+T*P;1o^{o z=oT2uZ|#G$aou!WNbb23B@d|iU6+C273V{!f1(pXKk>{dRp4S#>#Y?<1CKMkb#t`( z>gw{ZG($0ki(KG=QL!Pzge-@qle&a-<|}x6@{lchz3RY=Ix&mLFV# ze$9C#k&_3&3i9#KPFl-uWLnGNdtHUIoD8mGZ5las zAJ0%GsJ!HEqorFg0#U8SHW=^7dNzWb`FaT&O*X)E%@71)lfepkMw1r)2>jY;d0f)O zKt_(GXDvxUbC025D;~{h;qhdG3Dp7`@En*W)VgPogdVmTMyG= zok`*fFCv_pi;dsM+iG-(PE&L2qUI>B8=t@fis@v``*fzVMW|TX%`Wu%MkayM-q1lh z&wr1jq#B^ zFTs4vZk|l?Vo8f}ylwR##pS8Z#eaRtw9&RXUAw)kjUO!?{UzF%Ov4Y?x=WNHU@okL zn3+;PPv_s2_8Zgr^Xge%Y2bQ*fFyF=jcnyOyIMHeg*q3?X)l|5!9?T_2bP^RiEzUPcURQ5PY*1Ayx*yr45squ^<( za=o)H59+?gVLs~vC7)#O{u=VJD)1z)Z|Y+o*%KF7dW-|uB;1%sz;*kbApCrmbz^4c zuu04f$A4i`rV_X4M8ME=QQNfY2a-STy5{_MM*!G zm5A%Ly-P6x6>!k&m0f{eMw*Z_T{BA<$9BNrS?=IF~Kfdj}8^62M+E2H+(NJF(tBQ#a9|A@pbH%+>BWY95JmWTGLs5}p@ zFcITLY+DIM{Xy+zL2SN1%#EfwvUCRg6g@C@c>IG3#a=?=@BSpJk2K$bY>exUUg<0D0gOK@d4MFO{kF_=HiF#Nv95-#df)HG-xn$Ju}dG zyw~{jm1S8FWZ7WW&_cyEv`}RYEre^Ro#-mYK&TqSPL8NC?eAaIOuC{5CH5z3Uc-V& z(Z*cZ(r-q8vrk1t4f|u1nn`i=u%c!{L?Vv>jHrQ7g)2%-)F78p6oQ^&;#OFCMA`a1 zZcw=aUc+S(3(tP;)kT&?L#c{lP_M?pxVFH(Q^@yp(HMj{ zvHpwE^KUy!U8P}A9{X>cJ>Y;qZ|*_91Ufx*iUpr)g0pd%PQNl>Eqjea)yM-~<2Yvq ztc8bkjU#?!9^bDRj_WE7zS+L~ISQ6vyGaE-+|RX}W9tui>t+C(4|h>A_)qyAduU=6 zN4%S8e8kgCZ-Y^t`K`%r0Cy($)t0`ms36#EJ|66>_Zc^&8Hqf5=Xc0mQ z`Z2!8`vss$1ffK_`28P%tw;h2x8@&(81<-26-?8K_`~~%P@%o(IT2Em78uIB~ zW_t~)^Tlkfcgfazm%Fu&)M2*PQpDL>+hW1i+8~aGv8O+XLXisV=0W}i z^{%laX(`MW5}0l3snJ&4di6!uegUDia3RD;>`O9&a}gwx^CO@7)EUv7bY=|4ukt-_G|6jC8dqIsh3%GcoU7I#RmQMQ);Yd8Q@K5R;!V(D%E0pQBO>a1*7Y! zX%_Z-Q$cgcclkq{fYq`lBr8KGNR@Tf@+}JTd3Q-id~uvby!i5nA zB;dAh!fOT}t75NGGkb_I{t+4cV_W#g8t{+B9IC-u+r%+2Q$S5}tD3^mfR^qI!-m7z z4i)!+?x>+Lzsb;f*l%F+SfUQi?8|Q=B?wT{!!X(x6n*(J77$*}bb~OD?O>4B>R}Z$ z9Z+zi0XG6H9fH|xEV%1haG8@-`T?~>Q#W`Ef{V73_qYf6n4F-|C-KRkzi^I<7~ zB`mN{?USLw1~GqH?i?iY=~^Vd0NduXn#k{;ou0^D2V*TCZ)i$&J;xMmuQsRiH7&U{ zGwtKfL>=$i^)>>Dvz3ijCdCGaoD4MtQ(E(q2JdEb41nsuQN*aZrP15aq3n6=xtig@uijdOtfhk>|0 z^^O2=wh!}Sk399J9Z{I?zqnTLlRM!DPb*Qi)lj`Ouc(?;@T)+~gkaJm2kx!yCy zW_cat2OoBAFC4lAuG!QZ*c$sL??95pAY{%Oo zq92&v2fS_>sg>^`ZhOy51IKsCe=zPHEtAv;S$7?Zq8w1Ae~ zKNMOD-B(eI@Oz5LHr6wVzx)A%5&#C6r&OQbDkq-3n+gQ?_CCRk6Zl5GfA2GR%s$A! zP&%keXf@1VI$JteR+q5-0qf$fL+fIG;h>xXDgSLReWzz=p z?dw=2U>{}RrW6PR4k$#XQ1$ipy^@{14cFWJ(nc`-G=jM6YJFZ) zkilxkMHd6Lrs;9 z)n1QGKw=VU7ug))3QQgKK=2M09VK{3ro#g=aj&cq!Vxzg#u;vIWXscP{7r*+la;ol z!B%G&dz^mavom=+*b=*5yRqpx5zt__df#3Qtl6zX9@mt5A%g5woHC0JrqcxKz%K@l z+f6yr9dE9$u-zQDN5OVidx17Lin)Q2ZyV3g2$svXjI5PO{1Yun7fR|&XZNO`kaYp0 zK7kdoUibTg;jb`rEQUl0)@eCtE#SYiTFLJ6PtZ6pA5=rdKngqLZr+gr4B{I9US7b5BB9!@W1A5Y(yQ z`>kE0Q>*|>6O!?JICt?(#Y(~}cmr5KSPE{PvFaL?Ex1c!$ zZivN&5jy7NlXcxRHGq&g78eRtp(K|;BUq6)O3BT{1NE>Xa!dmxDJONN^LFEih}}Q( z>?^$k6T#?TaX#9#3K>-G(x+bPWy($R6mXND>~}cnTiPy$OLmp2TOBSy7;?5k#}L#E ze#Q{RX~5&wbbs-6^y-v{z}Tn(vtl9GyTACi^=h#Z1C=l=cM@;PG!2=DNp)>*)`*rV&$cTwhVn+RniBj*3dZV%D5!%%@)twX|6(*W?;4 za_FZiLy0f`yW32pwk8TeM}0e?0Vb14mpjEXe1`dN)0a$F#>CN zJyMHC?nzNi1$B{*_)AcF#7jp6V>CkpGGN_fhRKRGG$O+!HHuG#Scv;F8XjXGh#DK` zS2I?Bml)k~`jSV@}SQJBV5!3BV2RYZIFlK#P2JA$V zu1Xd2OCpt|K(U39it>q+olo%=nK?>1&0LXssYtD3iBufD<>lxtFYalHptrmNddsV! z$INl`n7JZ)%VX$q7Cuhw*Xtm$^tsZGZTzABb; zRgg2}gG>g%Xg&dzXSLjHgP}7=#q-dvJ%dtbaHN$>|H63w?M(iNQvj3KO8sHJ?##%! zk)&9u=B`Uq#nsPJ`c8)H(k&3|mRnh!>}L;o7a=vspU?;;YW+p%L6``{aOSiF)3EE0 zC!mb)^KNZ|sy5ID4KM9!56kq^D@rP*#UC zcm(7Gfk0z?068LLSZ`}a4R$~D8RV{_$HLx4+aWY+Kb;ZvHJQOqXtKz5AjqMWb0;@6&so}0TO&vcCsv3pPtE7H@Q*Z}-9F%(wB!Z0`7 zVR650;iAys10$eIekoSx9qt~g-@xbPlegj{N!)pQcg>)!*6g!l`8V@Dd1pR(Cko2W zYpFJciqInM%h)@T1q5aM$GUK*NN|>*@kqr79j8 z&-b+3^r@P;U(V^PHyUZ>LAFA)GMzsJQ<@oICU33XMZJL`w4}Bj{dgH_S* z5K!d78Q@0{Au0dCc2w*;SYVY^DZwEm8CkFuF7_a-PI1HCu{>s86Gq4s32?@uF9YKu< zk^(|@!6Nc1+QU>TKRANa; z=kOK&+VGUn%_7$T*Vn=Ie>CgEG>YRlGs2pnTT5-wXz*OLNz!Q(vCY7o^X(~n5g?m!x13N`QZsxsI2B8M$b%zn z&c}k-V2<&I_AZ{Pmi;2l{&jzpg&-%qyCA&a7CDM9CBd0@U3~S>R(OpJ1qP(p_w<^i zEEV^2;&_-2@G|r6g6K<+SF7V$YjiUs%k35Q`mP+S7;5`EXj|}?A!1r+^>&XnN;$PaxSKFb)KA zMq%N7MPAW*2$vQ|3%GEq8nzvJ8MxnpDn{MV`vZmMmNnju*K3W#Qj?zL8;%xRPO5g4 z{pLJF#(di(jM4sVvZM>c=B;iVPJ_8>bPk+j(6mUg$i42waW1;d%dP`h`YeBpw-4;-a8KUM zW6Py3IpA6duNE1K4h+DxtFTk%mE_GW-d*D})4PEH#^TsF!V38%TW;BQ>ynPjoYq2? z`b$fBDH)Jo-e66GsZOP@^)JIlpmQ4bADna+X+i*8C~Cz}^m zu(?liFa3b4h&|wC=Sg3aMO8K;N|;=fGM4VrE{iP`pyuSuu16NNl(9Nab}YL#Ki#;9 z3HG3iz&l@6PMXA`&y_*Hpb|snJmkRVt~d_TyBpC) zMRh<(R`C6jdau_^(TZ8&Z0^O~bew zF!Eyj0KXw9)8daW9WB(IT|1Uqa9zC|&~*%`bNql2SwY(|#Afocn)EXfk@nPiTy zOONBU&2US29>D{M297BYApXJTkdc5j1*D(AGk$3!Nsh-x;0+cG2rcSeZ(3pFs;;FA z>fn-}{i5;yZ$Qt-*+)(TT$p;~sMv+60+<39r9R`&o+y2_ynzh|YM{|H&>#(LE`Bj+ z0Jo)hBg<{z?G>>_+|~qn3rJ%;CK80}&sdeR_kEwx-!hCWF*r0&szBT@H+ zJN6A0RjbNcev;#9EsBM!mg_xO2C3pVdZKB|bcN$zodQ=34QSkz@2F|F$ z(;DMys`xHchu|lY3z|L#4d&Lkzh^t8M)X=QMNa{TA_FK-_s)Lvf3y6L$Wu556zHm6{3>w@0g`7*5=i6!X#aIgdqGTz2MF@S@ z@r&!4djyjnsel98F(DLZ{%J^I-KuG(c5Q{6oWM-L|HD)BIc$*8R?)_Fk4k#8R&X3D zCCQfCgPd(p2oz-e<3To3Q_5Tvbsm54s z{aPFC`_*b|2x`-(-g?#{waHU3ZE!;C%$N7n>wFQ?LQ}&RsRNSn6@E;Zg?XH1q<6vZ z4O(P*Ut8!#+uTP#U~H+pNZ8EdmJfVlfhi&r!h%ta8LPo4FihiID$)4 zXcqt9nwl?Pmym!mTBt^A6&Jq}cUPva6dZ|aNQc1tZwlt4gvtYa*`&8ESNt?P?Bo2s zQuAm!2^0>Z`C&9ghr@XD>V&9Xi>wFDSLCZe(veyzf0MYg32W(7Fa4i%_~a=Zz8+3e zX9PcwO~0{A<&*aW!$jThF^I&l^~ku2bs-9&lAG`4->#>EkxBu*u_To@tTlrmO&?F_ zPbSiKX1Pk`02CcnA(2}Y$3byLE8W2g#Lh66Oe7VxT;{DUoAkmxHv(}CMIRKdRh2}L zWV%>04X`e-%c}e)!To8izoXB)>o|DE@~SL+47kGg<&QJ3{usUuC$3~rq4MHXR%922 zSO(3S1eleACXa+eAVGf>5*$Jmo2yhI=z;Ei#@85E?$G&uEQ_1*+1KJikOgeHj58qn zApe1OR3g-F1Sjs9X-vlSNa=gn+*X_bhc^G{oEDz|>aZrBe85d6fE}2cCQy{$I9mXm z$Uc6>iXZ0AiV_TU6{9sk~O{0oeL zm|vofpd7tWOI$7T$(uj}UmR4?4B@byN$I?l#-)G{;iM2{xF&*zY!dkLBnoc?;_ZWc z8ymsPzSLsD+3Vr;J*}QfO!Imw55{6GyMH4gq1K$d z$;*C65z>(WLi`H4-`h$`tmu({g8o|R{#wk>n$jg)mTH@ERZ1;_&((*7a$aKFCE!bpGhwf~agh{mHvJfUKa|}2+27(+WvENDTk0)++ z5=FUn8Wvs-)8&=rsYrM2pw=AS0LlKx?|j|I&SM2!h*m(=_wIsFFt*;&>C^FC1ire{0}V5U8(^5h!)T!%4{lvY!j_X}5;&tdUG&!R zY((g$#2ZUa15i`i3kn&Ha+oz53o06f6vXNxXLI<6MMkz?{m^mmk);xyn#^|I11X0s zEcYK;;kQsBD#A1<__eq;x|3_?F197t?sj|G>yX1m6>$=9kkR#226;p|{AbBLA-$Uj za}MERN!!lahY@jbCxRQ`=3&Pqv>n(cT7Y(|pWH?3)k?qaugz6A9MLdpes($Pdo$Ib z^5*nzPsNyHvKW^sGOj)h-;PwiC4ysHRUD7qKaK}q%|YP^6l+SIB3Gc0gQLKI*tjt? zy|u@Ye-SF8;}wiLc-Z*#2q9}RfO3UUhjp6z-!otkhnp~4@?f}!Q(|S2k4=QBrSBrM zw3z2HV3@6pCC3F(UYd<&S0kA;p{J?w7S2QwSTSFjTa(Zk(({&puW3^_4=1I&c~=z{ z<$OnxFJr0Z*>7-fe6< z1CYoMI1>4RxI||BdshTM<7KxATSQhKP&xb5=^~4FJF@siJ zoyK+MXS|L07|k8)lXnc%ns|uwQ3m9qaK@*2w%7V?l+2I7tUe_)NLm5e8}Wext*`s6g=QWJd0#WlQjFlWMsZ;>->nPs6)9u@KNy7pwFV6bst`Vjz`0<<^f& z#!GwzCCoG`f*(e<>S00^y(YM(Sb)`Lk#j%sS1LsdhIo@^GDCrU0J9h?$d8f1#mx2w zr)y#xPEX?SN5ZqsfHpSh-FPO*_C8~=rhlXG2$z*DH(kVr#>Kc#Ot&yIqI%CoE?Fa+i9UxExkQIDwf z6mz2DDW(Lfcp14Tkh=ks6bnVDEaPDEv&wo{5p8@5d)|mbgXjW21&uqvH=7GS7J|dW z|AU@{y^iGGV2mmw2E{?KjvxyG^}s?;G@UXHUN2+|C}Y}O(9$4nGngahRcgUmKpr-= zM`TJTPZ?>&zGFU&8OcH`^!`?OmSBrsTH)5w+|uA}Xm%lCt&J6GMT22wb&pwf3i<&_ zW6o^D9-~@ znlC_JET#C1*?@VN9yTY!@76Ik9Z>~sSWkqO32b?NIB|w_2K?IkpiFQE%phZ7qH{KU8YTzI@Mu`uagT;SUioC$wjIN3rW{#I z5A!+p$At148C)mts9U>0^?dZb}-i-G$5I@u&v77=#&tBVKIntI;Nk zTNkp9-ZrfoOvJUSU9pn2^>MSdZmmN`w+$13+CfZ8=a;r)iBkM%#Ehfx>-XC}=~9S>>Un#8#fxq(RZG5M<{^Y&JAUV38lyw} z6)girk6{Q&vySSKFpx)P<3-QekL+?te4A-knn4W{ys=`JGQO|GDjo+M!31yUTqL9? zn~w=Y6nR4_q=|Gv8cyAYuCDj@;_6}}o2i|^wbZp#$>9P)x|ayH4DEh#kWQpQqYnAL zW%JuY+OLBog6Z<7P>JCP&}?DxBA@~qZcb%8H=9X=K5Sm8ezPn6)NI?Di{hOsVG;d& z94y@R5H!IWU!Gym%b*F@0%z{~b?qr2AvhnW2_rJ^(Ho-($%(Mc@e$O{r7k!*7c*st z+B%K8DrS9jses9>`WGhiPaMrK^%j}3KanXLKg!xILopXwB2}Q#ajBxGiAcM(YeWcy zUw4}LZyfId{i1{~tK7tPWHH(#IIykg99i%8y0K9y;ppPD*MZ7HPZ}^{k;~#A$5BN> zzk1KWAH^wt8j8!XhTc>6D${WgreIDTx0{>Dp5P6Lh6pX#GUf<8@}cSW%!#*eNp;q- zPUH7UCD>OFr5doqR)?s@{1K2%P&?%=ncyaWu;-Bh;^dD|Z^^O2e)}M9*#>$!%w{c( z4l*A?y)i($5&S*To-_%h~u5hUs0JQ(S(qEYt>}PN2G78o(`*?bszg6=oVwU8=)DvgqB%h z$jmb`C9^(BR4gTP3Q18i2iq+SXicdND{*XCF+V;b>$6b2UMU{PX3X~i;cVG{xAimm zk8ZmBDG z;LvIDML{GvkWbZ-m6}t>R?B%txSmt|4CI&8fuS+_kguB(0j2e+cM<6;ZYlEQY-|U@ zjjd3c+wKU%3cA_r;w)(>M2#7n4QxGj`m=xF^w)gE5rdGx*o^oO=V$lXE|vKoXy;d< zX~RyI!>$M34m+`z?5w$9V;t5F!b2#K7woP|H&s7gN57)o%^!nViWbhT<1F1F>1swy zKETM?*|X!Mz{Krydj4IctjaxiwZ=e>&bk zE_t(4|57A-Taz~*O#S#)(7w`%VI$VJcIb7}t~8E`LM5u-&JDXd!$OGVzkv4K<=@6{ zbsgid@$4#HbJ?mDn0E!Q`)gn&Q!`Y6lNYX9{ROZ4x8PU@c!~hugDLC)KO(@hqQH*| z@VY4QQ~`cF3jCM=ABzG{6W|+B;Kv0Re0u`D2cC-rxEzznL20o7d!oP;AVW z@S-bM0QhJWc!>ai8U?Pria8&T0>5-Mf&Uo=t`^`gqQDiaFG0>t`^{{QQ%c;Rw3u_qQKPx+!qC2bv<*=j55P&0lp;) zyz1&}kn_kWaJ2xvDDbLFzJyP!zAXw|Ex>m~ff%D}@m1C+5R?b-geVY{2k^uw5R?b- z15qF-58#3*5R?b-kD|b9zHr$Zulu6}o{2yBx;#P(;F}R&2OnmiucblmSefUd7xx2- zsZ%UbIl}ZS;$KbaI1~hDqF7Ffm1^&Yh^#>*>R#Q|hGl1g@)c^>4REXm%)-hwNYiCF zY%H$>_=ml!VG$xdzo%;yA1? zuK|0E$~7F1gmOBh%4;CWE7GBXwe+l1?52^ZUh_8_4T+?tvttjZDLfiVXmHA@o$LVq}xzzvts@9jZ?qWh;d;dRz5 zRcXSX+k{`n5{|YB562QDHU+V|JC+czpnfud=xQ4Qci#{z5um#=mLT?Fwvmn{1U)}B zmJo2SF;51K2P}nH<&mBT)a8<;B$*=BW(ED2h$RGA4Fw6)tkl|5iluMH5`s2*VhKS% zu8buFB>8MCAt3uFVhI6t=L88#_BDKuPiSf&!OkhiIBmt^zmcV-jCH0LKDv`7%2YMFaJ%QXe( zv+$OJfggXLkiS1C5AZ91Vh4MQb}+g}^>Do@eN4p>hrS)Z^T?LuM6wYy{W4o+K@ugT z%d;pC8c%EXg~j_{=3ba)PJwBaIs?^4P>)JsD_DxJkM1nqiNy-8RT4}LOamURzJIG$KfN-4x8zgwZZnPIY-F5| zIJ4P`|MG*9gRpjpCI>#`^`Z~Q_+9wXoM-0J&y6JuED4(8dr>BWzByv#jUU=hEho~K zB-8mEnBf{z0tYC}kXf?~d1SQ!XKh8cn&LO{7ubOJG|G9)`D`L6a4rgnybgi+)cNp6 zD_tlBgREfr<>1-z(v|Tx6R6^y0G{#+`MJpN6-F9tjWpO&sliq@NMboz(O`-V0t7c8 z1|;sLI}@U6;cNq@PP8%J+|uN&rGo}DO?@A+ur4sYRDg?^|zSUwt3q#NorSniO zxZR6NpJ0uc$@Q@MgNv;+W~f9sYU0QkaZB+LM^Y=C2pBf%lBER}s&l$yT)erSDE7u1m*by62@qkQ|cm?l8+j8C$%Lo0H`@r92F-ZV44Ih+Z(jj=>u&IaQFJ80TPFQd8*!4l5SaL5TsKVLJsM zppJ9uQAx0tvL0aKNZ{Bj2372=9NK=&9Nnd)`%6dTa019r3UlC?qiz|FIU0Z%q?Sz1 zVSfw(e zrY{{%bOHfeRKt6K7iWU8?AyZj_@b>(PKjVakGLX4s;YOocpR#Vc)ZEs>Fzif@?X}iSq?pr**(% z7y_9S6wX~cGRR+1J~vtU3}%M7z;x6N4VaZ8v$LrBBW)S?zoZrU73U#W0dX=A!00SoXbwxQ_^rv4 z1KfE2Dbh>oHCt-N0rE9S4cmtMOwAbhdeC9{!yz4P=N6il_204?xKMY~=bU0-Yw$|f zumP>ivuVk+;8eDZ6dn3P(Bc)K?6J(LU47Vv+P6*4s3 zD5yS#JEv0+cwY879lR-TTW%e>j@Rv9Ku*CUpP5D`Xghj|U%$}vf3x@g@o`pF{`ixm zg%m3jTx2U-WkAXnOEDm;Wm|PpIyjX^BM_-tBoJC!7upCd7HxIXX-cL;N+P{t;+G^2I`wrDxibeKr50)!^^!-)$p!jrqOV? z_o-_Cm4gi6xQh0v}jS=q} z)-MYSl6F6{bqmXW-Kh{c@IZierwrZk0h?z9+fb~l5i77GEBn@8i=_OZ^P5V!(pH!t z1(YlNj+!PNEg=y3XQKUB!=0Y;HjTOBNx`Dsb>p-4F_K9;vlg6JYhZit&RYhzxq=u_ z@m~ru{UNoHzDC>iNK@}#JPjfA_c#v5-IJUeTAjcDH~@v1BT{SDffawOhj&eJT=VAG zTGAmjH6~}!*sIY)u3K3=76?>IK2T=-JR`XTnnCqu8>`=3#1u^Ilr&!5eLRV9e!?GI zR2vw`rB>?A9HrUP`4x0_sHNBp3uv<)qb8ZnSA811plV^mzTDEDvGNCF74u7p*WOzB97D0 z^VKKj>r}ip$g6DWEaVywps)%@FiOGH2rd+x!b95c{31nadr(`vf+S7XVF~~y+JA;| zI5`iVi~8Cw#DjCJZF5{;whJUAfWy-y#Z=cI>>O#l27m3V081eRt_>hQx8gvmVG2i%#aQN6B zqG0DtVgD`?_v4#mAbv0Ak#|t+dASZHc%<-sAwbHPgW!_IB&_RO!yf#G z7Ff?ab~GU$bv-nV!Zj#_a~_k@6R=FvXWM3hqVRpxQlrKl1%%v*1|!wHqhIt;4}IU% zf+H$-;IqdJucUXH%6x{Co##5?<=T?9Z+5S_L`%wwt`CK`vNv3K4U%2Cl`za;B`RBp z0g{m-z_9Rn^niv&VvvRBCFrG|8%?*Hz2A;@Dd2I zZku1YA7yN~!3Z{N__c5OtZxr9EfP5N(!a&nzXx@RHb*rpV~a_wAgq`$N)mHG8}w1l-_ z8oT+UO2QZ1kwGTjktZo@PMYS-L-DKxiYZ`<7YKELtTiO3hQpCC!N!ahtxNWqRgVEj zoKTq+{`(XuFRM6(MR+YWJxdv;lbEmLrAe_4&Hx1BwAyZOkw{XI4;}0Ez3iece^BN# z?E4|;|A%ZokNrM-9)IF4t>2XsuW67A3`|HnQ@9*ynj|VNFt`XJx0MOvL(Q;Hw2o-o z>WAjG_HF`j9=_c%FMHzYGE*%h^S0yE8nIlLb}cy9?$Z4rM^SF8zaM4SJ9rGt55CCk zT0nXtkQv<8x;;daAmD)zAcZ*jNSp?e;2LkA?R)}uhX81*>-R+BEQVq+zF=0_G^0EU zsVOyh)0%xMr6p737GJ2d^V?+LF{T zONL_R>eUcZLIs+^JZ2c46g_wTTggjz9 z({jRf8Z?Tidd3qAcem-eSFYiGhx=R3{5`Kb>d@AL3MfZ%CQs4232sodD--Os+Sw^g z9@U#X5TB<>i>)pvkYW=B9U+B4CAIH-0R-iw7(qfQ2EtM(g-9VxAO-H&8E{fSh)_2Z z6cmhsW7pF4#TKy#-(%0#@1N72{NGe_Bd&&hD$N{0Q+2V8`MUIAMIA0fX|I0}6$n_VwzA+v~rL{Cqoe*lSOI85;%>i%zwNHE8tu z->GP?|B`<2Pod*vx^^QD`hRJC@=NC(L8SG`FQ49 zFJ^~o=iwqL}NXe_$!_Vv6}T)Lq>$#0`yw*H(`c{1r+E5EV)@#6FFhT6{QODC)!UxD2gTiuj)4|dD13jE zB45oS@%6q0tZ|qBw^2R1V_R=K6GHRE374&c!d$QT_Ew@{c}On#EsH^eEEhxY?X7CB zckB8nqCrMUXzD1@1mE6DG!sg%z8me=XCY0W-WQ5VTbVa1VBV-3^~LQaX9br_{ILTZ z*L&@p)nFFbgSZ$T?7&w+ZQN0hFQyBSu$ezHk~{gOPP+ z79xvoSkAGn?N>vgnI|h`!b+Benz0DZ4{y*BjL=}J6}f@6dMSz}Kk9@297_dzAJ7am z0dCCz;!jEARXRQ^XwD>cw|73I)u&sW+U&X-2t@?6kS8m;y4iJ;0M&NmpUDODD!@+_ zQdY|@w>-{+5gQ495{=K*L;l_tlcNd80}K6VFt&~U|zDj3UBx| z;$s1ZP`O}y!~MiCYnh&I)L^vuHY`TILMj+>l7*{ws0>D7I%C_jPMqon;26T0va7@@{e zDTN*9NSrP)J+vtHRns<_y6TYgNnRRnIvi$o>d;RI>sP2z#Df@;<<4V!`W-6I)J1U zQWHQL6fy}AOnH3+?C`nyKDl9V9N2B_W&&Bc9}iC4`OUt1-cId?xUA(G9U-PL8y+F;M<%mGWTV(UbiN z=iZt?qjPTq_1X1`s~@P(WtlLh&wA!$e>4XxdNYJ>Un+O`z`X3gEAn#C{ky8^^6oj= zUu1t?I6=sU=E3^vv)hQ92dAb!x0P7}6zu*uCwsV1{5F#voR_-}bYD~CLePEnbgC3! z@Ox%X_Sr%ngsDv-bz5IjeEE24c=bSGDcUIpShcP?Th!i#ChI88P-`z|)Lm;-mnmSE zX}K2Z3rGT;6T8m=*PLv)QlciAM3ZZhO4|3UL^L7sTde{1aw6}B3rg+zT+Pa+0$5{m zQe*omc1#G^^)T^lTbI?BMSY1`v_)9c_{Gp$ZUts=`U=;gJp)y{Q0XJvmgZY#2Ons> z&Ximzun#kPz-3c4s5U|-eWC=54~en+3EQH7d?sG(U@1hDtf4yKLOlI)WJk$0mJa@hu*u_`br~SgpHpa?iGP29Zh&Gzm`dAYMT;-o*)EY%#%w zuL{yFJOyuZSv6d1@LTevHN6E z!+171XigN3S%i&@X4gJ#+`_Fqas#-AI=TSRld=-Reo0p(lv#?TZ3}qoL}ZjFbj7B9 zlh0E_9i2W;359sh@OfT33Qu%>`=_7V9=TsbHV0{`l<6uWD8U;r)aWooUwjl+K z*d2_$XIyo~qTGGLC?`{_4ugwuQz%km7GXexf>)vrk;C02ByUBYf>8TpTR*CJsI$2Q zdcyJquUa;ddQoN%WU~w~0qfn$ry&g|Xxc@k_c2(tR{#J6ZD;rJc zP7d`N{w8w3z{EV=(xsZ4Th~+*%eJuC ztEn#=gZhFQ_Hmgfb);OcV5>V~{q7c<9BLg*M~pekduN;`)UM?2DeUW*TOHep0rP#V z0of1gy)Cb_iZn_U5!G1L%k*Mu?oqA2NE~^DGnAd(VhSuz#p*9)s76s{@@X+?3j$_q z(m|emei1^)Z;jT7D9g$+@~u&`J_@1FQjI%GSyhguTIf*-eU|3kb~!&)O4jzWhbn)m zYwOd$O25{eTkTYIb=coM8}x5cs{7{CilKLm@cn)-N}|>eSJ$Xm85j(861=;_B1x+` zwrhRnS5b$?aIMFK=9ReC|Mx4T+c%bLy;aD@cC9xE-79dd7lJV2T3e@r+O3k&=-O9F2#$R}7n{usmTe5AF+WZTBci>24sb{1a20J9?u%@jVd%%y0ga9B>7sl@!;MlzJmqcYa77|LxV zbr=FCjv{IXT3YbshCE#gc97Y&ehISVyVFPu$N_<9$CYi{7vQBn;xitKmpYeiD+G9{ zT-p1E6fYGB-)u2_u3>R@<97Gb$pKw-KUZP#W=@S>D#yY-Nwl&tJh&G|~nHZ0CL zjSOT(Lo8)=cvc{Be8WlzlMS9eIoHj4owQ(po9dAVk z2<*85c1VIYU&$tZ#Drz4L#7pvV95=aSMKI4?nmkt)LmZp(YhZnHog~#?n&iRDc!@DYQVD}$;}7L0ikK8hB4JCb5h*NC*cHez)Lu#yxhFdkj)D* zN&`^)bWv@(%FJ&m*Fdi*%YSkZEX@HD+uF|iTcrA~QPd!atI-}~(zC@UE@z)kMV=Qo zyG;nad^7{5#LW_Dc@7qCpT|N(Bcs>paU2g3H^sKwzYEz!gG#nZKrY@#ESQutRdR4N?}7NacMcGQEe-_{V4}tw2do@!4f1{ zZCtSBVdi=^wXs_QCKFYYm~uY1sy?KK~FXF6CdrxQv#Yz5K^?Tvs2f%jRvrGXeyn$^Lx^i z{P9nSiA>6x&yd82S=qOWGCNjk<<>^qK464$B9acD)WbvJXu?Xhd|^!LZcxxa(wQTviC z0}4Fs*6ceb832}v<>x;ZrdG4v9x93jg3ztM4`o&lL2)v+dQ6KSOl+P19s}s2*r3!R z``Dq|9L*0qbY+lVEcU7L?5=_U??6>fZQauW*~sp1kk|%stu3Owi_=Kn>%7!cWt5|=qR&K z$O>fvuOft9aHHF1&@&3f3?Ll^GB(KNBduLUw<2^oW_HVdae!oAN zfL&g#y>Uk6&KsMa!!35%8crdg1*pb$5Ha@sMJ!Gn;URrANaJPI9xb|G_JwQdQN(-T0u4Y~*$IBAOHk4qEMGh}{Q+HfgsDdg6KLLos)Sx|xj2C1k= zdJ@bkwqfEJfYTRg1=^Q`h**;eA=-%`=hj}MQEw|u(?2$iY=388%eHzYR7VxnYP^1& z51yRa6`$9<3r^9%{na8%Zy^ca6PqlMI^xkx-aA#V_YG}Q;x}=~EZ5!xEup1$ev+Sv zZh2@#BJX_@F7}ob5D7ZyE&Q^^Pa(FA&c;x74f%{nrb{H1Es-ZOvX((#nr9>RB{e>z zDXA`{>ei1&XwE|#3uuvkm?kBhMf0Q3?2#2Bx9i+Lh2i|?TDA`(&kv#i+}^8w7}wz6 zia}<*@U=g)+qI8hsE!|JH_XppLF|2fX%;a8xM7EyVn+l4Lf z7Wfg@`X9IBDvyH}t2sQtj!m6xNfFwIvk7zpy@b8QB`fxFS{QSB7{ia&_;IF&F|6M{ z>yyJT()qeXuLY*Uy>PR+|I*^Wr21NGKfp55LD@^cZnb8g-)rP`z{?`jCf!YMu@w6R#N1nH za5_OqrJawG5>$><+P5evLFGvMX@5~tg7}kkF@k~i(66C3DWA_xiv176~rp^ydT8iDkFhw-|iId2P?Y{K^gQ@Y_Lvlov?Aeo;OHw@F zD^JwVsm8Pi;o4A`eWjyGXjqFdCmDKx@!%63AKBkl7DCNc5 z^CP@yJ<2Os>r=sE+tyHJkj%KHRWdweV4~}h9HNx+q?rj%^{=0ykdH}uNa=gZ7g5B|tcBQ;{j^?G{4R3)l? z1B0C22ygleS!YhBCAyIs{-tMVL^OqKv{i%|XL=Y!LCL7vPmWCUp~6cTUno}3EwE`BF`lX6cm@LDpUj^OF^oe5*nlg1&_?bq01oL@Ra1LV%=+j~O2_(u>50-Hrw!qn>>~XM33?7p&;zA5c59mI$ zRr^qV4>(eg@h0j6u>Tk;hc#3h%l|6XfHnkp)MEyq7d-k)dEoYY^7sLgDbFLXJn*Q; zsT%U=DdiDY9ygEV0m)z*jor!vkMI}pB6)%9OF1qG@xZ)MAcIGtsH=AO6)1nlcNq8El4bq#xFImKE5LP}=xj$J&|WsY zWK$~tSZQEbBP78e%?6Z>oM3ydt4Q>j6x698)drj)yh0m@Hk|ETiI=cAcHbI(8?H5h z2KyB>KIX`VwNL@u=fhaMN>}h4BSC3qOcNs_|Q}6>(UMwyGP7oAcY&_ z2GQH*=jAG;0mDQRIy?XBs60$auX@tygS~Vov4frY9f0c5DOZH%#WTC5jfvbBkzH|+ z%CQ-14bnZrt*d>>N8}ROz4G^A`P)z4*rY4M@y6*Tn0(GoS)Z*1x6_+O|t$*3~a$ zxQ6tPfGCfBX|%NMHDUmhpXh9~BZ^KZBKxI>^nPFKIU4&NAgbOiGYlpI`}Z zO}-%3QI`MXKL6k*Qn~Mn(NjKux1xw#-!6u7rc0s$G&03M$M=sL*x&O0+MugN9l%a} z{5>FlpOU|WVq&m|&@q~|e^4#>&>R-{U_QEt_XLnKkcAwHCaM0x<&lJ4%?gKw&V3++ zYNUT3lAyAYRXuv@B`1=eN9B?mP`77R^P|nOEOnjo$m43gr=ezCpIrYGTvvow3}-)x zI@S1;22rQ*rD;MxNBsjasBc=QRt%><9ja5qR;Lgd&2~y}jF7^G)7ntl{_)%xyHDt} zki``z*~Wc1f^1pKQ$o8I34_-erjZ_ix!l`r&n^0tTMjI^7)`AOxdtjhRaYLB1}lhM zD8=S7hwGCiMT?OLpgeD7(5XQ%9t0=3Ah`S27jwB3yWp7y+8T_@(49Pg3?9W6G(2?Q zaYF}?GwW8yGUt;xCj!A#(s&DQBFDWdAj71Kfiu0lT*^L7U%CVTc|`S!$0G$B5#{MN zx(9`0h1J>MGY=mtRNSR~X@?>E=@#M1x-{~Y+0Wwpg;rJ;^4pOu6{tZ-K?SzR=O z6$}aGAe&!QDsF?p%nvu)s8kXPvD%{dfQ#)uqDO&LJ5Fh;9kk`+(07z*4oc%E+OaT? zeyP8#zR%PAqlU3Pk(-^Bc162&LxRxCQx5@DH$1v1O(vdiXN$=}AFg>a5keoxvojF* z;IbXg=t%pSl~9mbv1L^qt=pAC8J;UeZRDvT*p?-Dwp;cjd^vyC`>*VwmI_pFtpQ&*1Iz`v#~vPGpDq2$<0%aAX@KWWtPVz zX4bcl{QB2GH7JX35$?$@+z;G|qU_AoZ^mY}G=@z)r28k3py5C?QBIWKlO%cmSPO4{2G$2*J>pR zpu$$d#!ao{eTZ9@+YFzZhB|7=Lq4=7p^$w{a@@4qyb(j&KH0hg-q=#I66l%9$77jK zQ%;#jO;qc?6in|28?AX^Efzox-;jA;4%Vevcl`i9#-ZJSt2x2<$M0(qW)zdF zO(z~MmHl2|inob2nWEGs$G2|r$QxR{xswdS#nk(ziaEd+mu;+4_0^e^LzGjz1S%-~_xt`r4Y1v^k{?wA ze~D(4kh$FXH>%p5s+)+UnC@Pa`!O~68gNh-cy-S zW(V^PjZLP;GCK&wo4I$C1tl#0$YU3ixWJr4M8EP%NZ;!`?e19Yb@W{d^G!&Pwe%!DaXcohCeD&!}(#25{zLt_S zMM?Nd5-`xof>4UdoAk*6tfs@#w z2sISkI(}vZ-?A|gM*u0t2q2RpP@;`fg&<2POXy@uaIsNva*3$O-9}F{&!X}feB@fD zqEX-%Y6{O3Q5iWy$~?R-w?-Vp!AhBud#A<{<*U;dTGC|t@*#?9L5)i_Kc@?*zfYk@ zKB}%zQ3M7Q;6AOg1z@iG-jB{;{FJ&V{SryPx2n5DzzbUn(i!R2NCE( zB<3629;0=z8u07}58MNI55`I#LoBPHn3>}T3NjZfqkgd%yRzufMQCH>Ty_6k?%<3Qg5ex6(v-jA!okrtSZhkBqce3`EcjfqPH^7-YfR}xGL1P_)r-q!B!tF!sIU&h zT~tV{TEMP#J987apd@sC7;D#D8!*{pqbZTQO@nS9er3*D%sx{oFC;9x_(c*w>JcnCPJ9t_*PJtZvHo>0papzmBQXxQarZ+ce0qmh#rD?W!pu;fMES*s1o!9a3T@hNs2%p&i@Q96bv5{c66LK({Rxf~L;Wv)XI&MQ8Fn7lcZ2Ij6Z z7M)-|v>N5l>H1|L6z+N?q>#$BOwu+hYtxcQIk$4E(zL`KPJE3VrS70BBF6}C$N4Zl zMhGy!!X+mX^(5hqz_IDT20XArjbvL4`ON%>RSd$R0N1R!lapaES~gpylf>!4NaC*_ zk@$R~KTFT&$l_dKv1UI2%u(XAeSs|)S!LUX1q5UE5 z++^r}bhZIm^kJ&tNjPRj9wE0W(<^g3HutE$7OS6&fol-1;<`R7WkY3V*Eo4$#wX28 zRmX02dmO$i=W1n<9LSZEGzPwi)jJLoSx6LZ)pzmXGPGDD`s6ewMM$qjjb<~pb8e;U z3E3IvKG34)$Kb%FU=0CjZ0E--aR*YW8BK`xoI-zFTC!P#1^0Fdm5YT|yd;*oa*U;} zT)9~2T}oo9KgU?=&-t+cvdrM3DVIY524a`TP_*(GCU2M_=&KfG*-u{`O2K<~92Lm4 zeL#8<_4R=7SfQI+v8!Ouh!QxAXd%lJUf!Zy`_q7<`Q44J1$(e}e>ZM`-SAB)6x(71dNbu(fcO4qv&3E-QEszS+@n$Ur>o)FkS+@>3EQseWeOuWTjkDm4D>1Uh@So||{ zKkIw!=ouXD8l>S)pkcSKZA4;!SUih4dXtGNny^+HAS}ic%TS;?k`Q3pP1stKt z@|gQ0m@O-8!<<{>>!SE9=xuZZc>H&2AOhP-IMz6Oymcb3`+lZ~&$-xk%m_0`A`w$?mMIrl;e z7WXh42Grkr9ECoSn?~>*@NDCLUPr!nX8peQ$1o~KVE#?O-|jZ&XE-4S zHeBKoDO|k;FSdZje~4P&O{MQH-0OG;T#H|mv{?FEfX~fO0K9t3NpvLF3^+WTr$RCOgzTr&V;lDv9aXH+!eM*_t`zm6$ z9t!|U0}ce*s@^BDnAndtg*^rp7y=C%)$@K!i+I@6)Qkb4?XSc~A~$gRqI?n?Ssap4 zJ~jrTW=IO*xH|G-x`=OWH@l|1B^{+@qd|e9wB3OA;HCzOyanNIx!)q2>_S*aHL|KD zR5NkIc-t{r3l-6Q67 zXY7hCgt6IFbp3p+W47uAtfTp?LW10qJwgFhOrWkh&;r-yVWg6GzX<;} zY(x9K*>(osroqso674)jF&xxD%;81Z)I>aoFwXJjKqpCDu$MfO1~ZIvi;3fjLwh=P z4x`D!KIR4h;m*$sYYbam7CXtXwPmq!!`3*g&vmL{CIM5>H04v*nx=3A1;uNaQF`8? z1^q>t^V6^tw+DBhaMun{YX(!SVTBLKd0tKGq1A-%r|Jf&Le$4)=2Nq|se;?tmL8}txL(6{5GodJ~MKy_n? zQ$&sNOpP#g8@Y&Enx(@62Z1S-P}G1gWN{Qs6%_EAzo zGp9Y>uY(r{!Lbb~Iv9zXU7}1Xg^z*8{~pE}zOceGwpH!}kg@n{fXXFz)1f`xw;7?* zFNF0zIX?5yI0)1gd!S~*!|gQ)+J#lYB(LM@Ur+UzpJ3FKGtXj{4Lgd0!x9ZGC9`Y; z;hLCv7KRa_?@SA8RK4(2TWKn=fM~4p(`O}Vp`@d+O6Jf)1L2ZGcHYIzn5TsFj)h4%1lLw+a;UW>)yI6AVvcfA?hEK2$wAQ z_Z{FYXsdtU0bg2Rd=)f5zW6sT@WsDz0XbMC_MS1@1T5FNL-)b`l1Z{0HicncKs=?wgR#72~g@T)}}=Y ze{W|y3qf|BSVd#z`lXJ-Lb9!lP`tx30&8=Qo4PGYly@V30R_* za#o`^LYR9gO!h~G3xozO4`+P1D6yhY0LV&jjmX4z(Sm81Kon|R4pXcpR_2e@-^2H7 z4#9cD*Us+YT7uH z8PL0Q3M1$<2erK9enU6o#UmF~(Ct(r9VfV2>qJ?&~;hFX6`1IJo_+8&6}boR*r)DuNLirWz)QS+KT1WO1GJ*wPXd4GS&Z!z3;6*qS~kM%;;x|1HTfmFpVDNGkNn1ZhCmpNJ%Mv!-U~P?o7^Ujun5CRP^R9a3N6()uAdkpf4f7TrzlY{q#;}i2G1UC! z#ja69#XgFrLs}_KZ8WWvEA`UkpcTn|Y5Ne#dr1X&uNAsq0d%@u45zfj*eIa_pgYQ4 ztT@Xm&Vf`GKTytmVBzPDZURSVhWD|3_Lu~!$ zI_#d{Byu>BaQhk2r}7`su*@=T{3Vs^dKt_{jT%|wSu5=OuGapSk-xlt zTxz2zhzGI5_W}Cz8SGEd%gMw=?4G>zN6pD$ybsOQcbE}OsS3TF>-Dq;RJiK_!`Mg< zSaKd(`ey6@WO4SE)13-630siu5Fg2WsiIFaO~f#o4G|i!p$$fynGyD;zCk4Y+Hm^g z<9u`LRApsht<&Qt=w_#(hPCdJNUcxF>J|?0aIRQZm0yW~{(3chf)(iBrSDe%K=l)q z@7;fid=lyZEBW3+iD=9$zoTmI+!31lOH}5c_kSh&QhBsg{l$LYwpeb(k>#mUS+SNa z&p|hhIMU!=WqHbU-xTsg^?IfDCXrg7l2~QsL%w`3x1>Upkx%W6{*~D^nix#7<+j>~ z?}k&;w#jYYRVxbaQ1!G8Df(2W^5h&^0y*bDoT^$cbbbZsh=D0|1ZH|4IPxg|l_f;q zOcOzR(>|w(ShbQlw;!dZJ)jA_#G`St3S((aD@khu_BXo>fSHeV-ahqEzCFgw%Xq>9xOk-_;$U9Si{GJHKm)Je65_WUKgjKbw8vFt+r-o03#T`Qp158sD zLAAv0Stn^?9#u5Lt{%zaHfi;9UGp=xMtuK6zb8I~i5pL5Xo4$WDg-UQbZ`%AW= zORj&G6&-=j$02;u?T$rXjlD7TLs+5XkPquKYo?eo(>)JCBwIjaKIhG4Iw=9 z%Y{%3()W1@im{CwLbhcFD`c5-GH_;^97dwJF^=YkmStrG%R#b#cEteTg9SR#$Ojp4 zEsAHz1N%~c7VSBz3~PwknC^$j$bEPdEOv1&0@RF1%RwdG{0?_X1tvDLxH$qhk>2^e zaiqj$+_+wFQ5GLp2OZ1;@BIFDU1dm?L>YewnnWVa>CGHUaJIEdE;7Mjy{26`1YT^e|=7!w^_D z8OkL$9s@p=$P&GUv5PkvS+3o2Km?V6Ztd-qA+~jSO-1aUN90X*SAm>~Z7jVA3hgLm2~%Xfr6TMu>tO*dAjeX{jfqevF8sxlLrSSLAn z9ZVmSEv%a}>n6oAY_?gz_O8cDeyiF;lfwQ67~eB(pcR< zp(2)Dp6r3--F9Zp<)iIuqM+w>TOaj!^9Cx}Np+w^1MR@HN7feG;e>2KuG@=eX+)xf zwMC-41TCH;r6Vm!nF!dS5tSX62i$Vgb68Ttz6V(;J5a=KPi*7o{6t?e%~*TdJ_8U6 zH7ql4`5jGW+d`%fSryfj-U<-mC0L{?uy8bjH|lqackE7F_+mi=mlAI!A1RykTK%dN7<%@n6Xj-|Vw zW5r%0wC?VLoYC<}q#~*E)Y$BN1Ih*J;N11QVS=H93)7B85n6w@_HOW%vM8XM%}gGQ zWfFh{?4ky$qcgC)7-n5?yD&LGMrK=OktFN3#Ot9>cIRl-M;`e1YJgO z+p5(I+?-ohw9@~%wn*tL*WYe$86)??_8Rf4P(JFxuN)0gWBcOM~O4p z#X;A;0sZo3oDy7fwnZPUPe+2dbqPe$xif=+pey5w6OHfw1VADh#7b@u@;Ot@3hnlvV}FB|KU$M1c~GHSi>+nWMKbm(g+y#EXZ0LldKxdW zwe!NDyns0AS^Ox2JCiTEd#X~+ut)Au+s4sAQAYX1OT(U(VM&p$0b#v^SU~I-3&9Oj zB&Rom8W168!#7xq231evn_PpLLQQP#Op1ViXkh_}$JV|-0;r9xZ6;t1{)n=ITQ`eK z9n8Li9CBsR1>w8ZlxOY;A}J#AZ+#-02pUc;Ni!4p-wQj&J~v2!$p{&C$?nHfOPEh* zv6-GY(kohfYLPMpECs8!V)ux;)B~?(EMFoWBGNA4SOC%cC$updR8y1Tm_j9}P>H5c z2E(ppc>GW!oq>)UCLmq5GsTNFAGk4dyp(hIvm72Db`wbmk36fNWERr(5V zKF;%IA(oHifWmLSI6)p}CE)~1UyP@;$iZaiTLPUB@gG^>Y#++I`ho%f-DEHR~_zk+{N;!So- zc)S>hzrP{;7TcOS9NYG&R@|Q0))t)SKHU3^H{qq&wwJPUeK~eS$bib?$F{CK)cedN zGDdHkc)1SOw9J{%=iU$Fy*l)M1n(Z+vq!Qp&SbuamusfZhqJlncrBECY6{O164|Z{m7{j#e`f7d6+bh?@Z6h(8CbfpZ z68x*Cd6_Ds@>l$U@IQn>c9Yv*mO0o$pHb!jwP`k+L~Z2o5G_G#?-msB1B-6D_8OYz zLHKb~SPbvvph6EAAv?U*n{@oyYqz}?F9S>t1?eq8hsAuQA7J;1I=C3M$#vG?<405& zPAMr@X_kmA^1bAbBBHjXe{-aw8Td3@S%qP*I+N z<%7IL{kgeu6oIgV_qg_EghHZdnfb&s>*BGSuKL5h(fd@A=(b84 z*l=vyy>WtMZwx+RGr;P`mPs|wx{V9@U_PI*^MkteHB*nwf+cuh|J^jP=Poo@U0!U% z$%^WdD$zl;gRl#H<@lgvL1K=N69rjhi?p1+(#@MvYv9Bv+innZhiiB2=4r|cMeOn? zipsXC8f4r)s5)Zbiiq5MK_tw~#6sk>kZTXd^H4mnCanaH5;^fUDd)PlvI9j#`La1; zP!bqF%mVY9;Da&`#)>B=+)JW!Hlt*Bk$+w}?&_nHfue>h{#0riGkZA z9zZ~T@?j{6As!&rFT9DAqQ|`6A9WSJ{C&Ejr|$_b{0Vz@VW95>hJj7uAEEk&fs4xl z=@*8L&y62+|ILtD3%Y=lV;$OIqwY4N8ZOC8Cle%4fyDsZxG!~Bm5FI~&Kx;gmuZcI z#k-;XkmDCIe|Mgu8_{q8w?n6QWMZQ4{^bCQPWQAe0}sqLE!D?$d@Sl~`xu`Xeo6pl z#6Pl~RxM7H0$5Cr2g`fT)zXqR2BQ3PswMfr=uB#tLN*x~Gl# zsVGW2_>Z9LYr7f%V7$x@hTa(K_%mKc%>_E5Tw+qHc_WG4caVM4OkqNzd1Dh%vfK2D z)XWR3V{Po)Q45R`r`i6f=otfxbH;vTk;t3anyh_y{3 zoyN-DB4x?@NHt{e%yxlS#oBzExen=xUe$0UQQD3KiouiOUJ0v7W3m$4eI=|g@3J_)ykH97N1eU zA(ip-DsYJL?HD@@)#uWA#NpcW!o?Ip=I%FNGimf{hKt_`G1e3YC z0$WINN1IfZ;*U{v;L=i2TCdiL<+(T*Eaw{c_dZpHnbz#1SnB)nQ&o+FvYw5aHXf0= zC|`gRn&~})!%oF*gt*wyl7DcpHe6=rKS=&~2LTu&vMNqatm>K!)`d6@T`?%~qfeA> zO5Hqsg*&<5&g~nLX6&p2G;APyQk@Jzk zH{OE5H&a@aZJ4Dzqj6Rq#sqI4huOqp44yiY#1Ou&_bD$qVPI}-Cq5%^Ij-Tj09mF) z;n<*VIE+*5KkNOai`~N57_~oxQTm@T&-I|iPL++l@-V2Msp~!9qAxxIc0cTW(yN=W z7isUd*bO6NYi=LveNv)A5KJ{Z2B9ZBic~Q)7n$b=jcG|p7;?C*Wf+Xn%YN+Kl^?Dr zA7F{FTh?l5r8j7=R(kN{*w3OX(lOK!4!6(B*6;0;l^t-v_;znFku(7GBt*fpp{e50 zs`|ZrnVFgxyV*t=av4{Vh0n`5V5g1xIftwu^y)5*wL_!kY1O`Eu0(&nQtFUCZ~_(^ z{BXhwxtA`eb@g7}@fz!}?d%w)?nQS+8mtDOQ{@p@ou>H3vBGxHHw5NMc?Gym3VTW}5t0V~()yyp-{!EcMmPvyf6Mvn+ob&r)w@T`Vk0Dp3%vCSScBr%?#VKA3W_DYSW>1`9jfw(2%nrXE zm#6o*jC}>HOUy8r?7@va;yC`ZW{0-Gdk|;~xB~%uD%|x4FbG_I;0$6GQkRdw@%95Y zTx8_ht~O$G@;7P~ub143ZPswA2Mq~-NRQ@9kQacQW`ojy5-NH%D#xCd2ej|d1mdYF z(tb#rdy2MVs4Li7bS6Ii+W0_LuHo(|J==d!03XuCA*h{2>H#n8(C|NO?l7Yr?|(p! z_uoec&_Ch7?h8EOk4~Y3;PQw3aXpQ70|(g+6gWKFmV5x)WOb)6Jm>Y)q;vo|JxrI& z<{@2(fO=h&S^WTbo$6~`GJ=mTDea0utRFp))hhr*ZA?bggO8%)3Jl$cHGuh@CbG!Z z=Yhn(xsaf~8{uvo!0l1WErF$>#JW+1x5P3}YRV{BNW+fBRqJZxNeUL3ve_dfw!Wsl z@#_*h4DN2PiEUl+^~}@NnZw9U`)EAB3kRS)&%4MIJnrJH7HEYin>H_L#L=8@P2NQ- z*>F18uTMe>WDaAM)?FewzQ)#Gu|9d%xFhY!yNW+zT>za|JOLpvhfXjPq}wt!;V4Ou z+t7@&)rN-3pq0KP#aA(#Wu0B+aeCpoB;kx$n;>UrEORylNcG8Z$f9DtFU1MyEmW@{KF+WT(IS> zGBr$2HQwz{ICK|x!_fx8019OBD=UyR7_mT1-S1X)yZZ=%5Ou#t)y+rdsc}bF_cXF# zM^RSYr5pQ>aUYD+_W{G+<-s(oRp zc~nOH9bNzb2l_|ffVlXwOC64a!?j@W1Uv?1fRf!n9|jY0Y}?e!JSbi!uHHk`LpYyL zpC{~U`{RkgpUoVEmmv#0DC)3J%h!-kOGB819Cbr#gi$VuI9|8(B{yrfS9jwR5FGRB zngn*?sjDQNb4p)DYk$h{38j1 znN*dC7yVrC)8<#MJYxPa99j(Al3k0kEj;^L5{-*jbY}bO%p;|5OkenCb-llYC;d|d zf6C}{vh?)2Qq8QKTVlHDZZ0y>*R~uA7g2!ME5j;ejRCG1ZcZhZ=MN=77D`erBrLEJ zlHz>LpV1{o(2Y}8MVlWNy4EMth&3YBY9j^CZw~Xh4vGXli-U+Eij>5swI{Ju_0GMA z5iO8dGj)@~O4Jx}B=ccMGPd(2vdFHKaw#pdqmN>6#Q|)Mx^I|RoZ%7v zZYm#XDFWQY;@>1E+y0uIY#TEtTaS_xhnrZ07HmIV1)rUA>^HchI@B{p3@z!jSEka~ zx^JY|q#MD#0gb^7yo~f z$Ob!QT9^j5Flw15M z=)XhsK3^lqxnIvwZ1r8}cW6~$EMYWZCZ)W_fl3={YOZl}W>-bF5uf^TZB(2MN?ZIT z_9p<>cjGdOPznR+1Zv@HEJkyJFEH>?pafX)&V#y#-|gW|6WP|dmK33U)sAZ~Cb?FI zhV58bc|Ey51wO$NgU+vK4%VQX8ir{2$3!{qam$wa73A=FEu6;<(Wmni%AyDhTgCI2 z&$*z+)f@gG6;71}0z}rgbXhe|GIxYImzaTY0pj2v#p~t{096Fv`(#IeaE8R1yzbGk z}Y1(dQofmp49fBd>MQ$Bz29ph$p; z`zQQd@&xk7cmA8hmomQz9v5Wv$L((}z7MPT>wZTL|8?w-wE*(PBZujbZOy6jJK=;H@6=OI03lz2_J80aKgK2}VNny0pHTC*Q%^-Q-iQ(+UGS?g1-PfN z8}$(%;}>xLdx#nst5q21o#>r_NrZ`&)%bUuS5sYs=Op|)8R7T{C60p~IeJdwGtR`y ziTHOs{)st7;*ft0_@7W+jem?w-f{dpP3W3imbFA8;APH*?^$yFwbL(q`}E7^zHj>M z3yBA8+499pnx`jc`{aP#wCs|_%cjp;9)hJ7E}33`_4L$57L##Pmssq}xEF*!!s?eS zZAR?NxDSNCFzg))0_>tImoSY>!s!Z(dyo8|(X9w4EwFGzP|vv#sa`XEc38kU^DglD zxBy_OD{rb_c=eJM*F|BomtA|cgMi<>3n0u0x_OW}D&M>dE?%}`>DA%bsTEgVy5!2G zh=1vlcNukNHE}rH49ThWp&iH%}$O?wghD*Z(o+D-1np4gXm5zbT==_csr68rtL5DgLg0 zHocY4uN(j7jh}sl@AHr4U(b8|*T3R=pHE->;D-d?ww+MVJL&oB*YKI-AN(%-&1Dh( zO^@Em5x957$NAUu7Qb-XV|;G6^xyZJt0MGQU;Z%}EG0Ozgx{HeY*@+X5$m^)`_1$S z{rYoHdMEM!-p0S4H}k=F{}-P>F#VnJn=2ypYaY7$Ys5eKY5w)R&)s$>CQUr=6dUiA z=6B}9wI3$FS*XySoblCv;JZa1p`VIdp1F(oOT z^!;@emC~L$d?|fq+=sav!aIMJ8gMDSatZ!6PI)N7w_h3Pm-GMqD-5m@t2AKfaq&sJ zrCvGuxBT}LXAu1{PQRAa1pq<#6K)u*b9mR?J;+fOe;3{a^&1228x=cF7>o~v&> zAeQOmIcMq~v5#*|F3>h>x>o58G<)nA{z2d{m6MP>Wg+6ttafoWcqbi-mrY(^*4CeEnI&6lI9zx-+1NqORikLWZBXiJjY}D!ll9n z*9Z6oiq<(rhp#*!1mwNS@V{YO;qX;YSCN4D&4#~#w&CO7RpId44KEF#!&kn~=fB_Z zXY=XsO9UWip&C5ja zpZ4*aE&l&75ug8n&wsn&KO4bs@bUW%e`17x%;$f|@J(zR9sjD2oInPX0ph`A{$}ux z!)x{gKg;lSVf-pdUhoSHUmwO-rhNHU8UEiQ_(eW`v*D$Ny7Vs&_-{A-sp0qw0{ni% z!~F{6zdFDlGW@JC{u2RyGVKz-XG!PMuPRoOg8G?d_`@V}_{u*C1L7ALen$k~hr(K$8R@$Iuid=K7PO9KNi7j1*Uw53@>e)jM0C z!=Dt6|A7F%-|)3z{J#bGLxvYu$?=~b;3wOdrZpVDQX4py-z>vF7r`GC2E;Egd^)1v zPx<;?W%!Rq@E`K=n+^ZX2>-i${@V@z;Yj<`=(kV%4KI@#E`L>j_W2(&{2L?jC;9Ow zn^XR?Nc#Wdr;qQc$d8+K{PL^%SD*g^!%t&7+!3@cURK{z5_B!1AoEHHdLqMv{A^|Q+G=ST48`S{I-KQ>}NmA?IKH~eV+ z-G0N%fWenvD>%#dkl|k+mcK!=r{(_|B0O(2{H!tX3k-i2nYi??3HYxX1HX9;{Pr>M z`^Uf^8UsI>`@-EkyWezft;cEit%w4ZPH+t2-me_w?ET%Z4;G4PXZ4rny}&Kd*1!0^+< z>4*HgRb${ckAdHA_|fXm{xR@}41ZIk{ax<2zx?(ve`JLmJ-)6&K6~SNb%Tzu)i;%!ISg%8P>XH~iUQd}w}PvdtNe zhM#5l(d=V^;olR<|Lh?DhJQAker3^@Z?oY?>wmTzzL$Qy%U{)Ye|)vy@Go?c-M&{__$2-0tgV zv*CZucG{(1^{a_wAnl*wPmkp96hD9a$KZd+@I8_A|Bs*k}xb!Pu@a3On z_`4$g$A9?!#{$EjzzXW(S4}*|$-m0*%Od6XF~9sa8~*wT|Lc7I+YSHqi2VQQ%fH|7 z7qFlA(|^}%T>6I$KRcYi)sj8+e{6DaXQY1J@7J$chCeqV-*jKT1%_WAiQneOUuF1< zBk}9~_?r#?|NJN-{hR3k*M6`?1RK>mvGT_4Tva@UM;Ft9|@-!|#sZcl!AKhJP`F zf6m7rGW;D8{H;EIvJ9*}Z?y6IEW`gS690ev_zMglis)5)0X|)^e?654My12#g?UA-Fh`mdHrD6H2-@PV&A z)$nU0_|N$9Q-kJl<{i4@7Kyo^RuO4gc0i{I~e=4;sE0k^exD|9>I^Yy1)U zZu8|k%kURR_}BaV=NW!CnfUq%=9{lI{2wFu-}~v`V))V8fV&NUMmYYJ5?%V6y<^}H z8vZ@u_?5H$^e3{>#cwqHS%x3Y-=1gqLuBIT|BpWZYYqQo1Ru;--D3C;M({eJOVr(l z&qwgz_xbNN{QL<15+8ri@K;ChI$$MgqD%yP-p3>OYyJ3V8UFSNzQf1Q8v}o>;Yag_ zZy6*0-DBYQ8vdn-e1X4u(C`x@_Is>vzY}Gk?|JWy;FCW7EW@vh@NW(BZ}@U;5cPYl z;dy_jZy!|``0c|jhCdYHAK1^`h98K?_XA(Py@uZq!DoH^LBn4c;jaU7DSz9ea89Is zIm>Tf&NBR}NPJx|Wc+!C|8gY$7yS6w8h&jg|DOr+Z}>eC{=L3_?;Zoc*YKxB^8dyl z|AxOI!hfmHe`1^n&s)Jie*M)2LFVtQI1$)u6p??mFaNx_puHdP;m6cPekyK z`uJN6zd3^cyx{3i-EH`L!}*&V@~6HkS(UbMpV3xuj@!vnbx3^svj7@4{MW+1V||F% z&2%H{CLV)10_J_{srZB6Kl6{{ca?}H_>|!<4C5>7gdh&sV#6%+SXVtWk-k$F$2?Ek zeBgd!@a|Tnm$n@6*I=%S^j)7(_>;!x*G4~NeDVf=5LpsAO&;mffV&-IUczf0R>Ijv zpMgyi?tNDIU+4JXDSVI)f3lYX&#R12UMh>{(Tw=}7uXBw2bSr(%)KHw&gh4hDm<CmOyeZhS;eFNdF$KsP6XN^|a~9;^{V`?mF5~kc=5hq?0LTh|lZ`&nqVK2c!#ms3 zt$l|AS`B`grJH}d0!}jcu<`G@Mgbhs@b^zn57KF3Kc%JnqVZ|^H>Hy~b_Aa_J~fuE zbxGc*oIIvC@xwvC-uQHyJm$uF3oKtWAU*WO_jNs2qPR}Z?>|FtTjnNOyQF>X^M(~{u zZuTa7DFC16Cyh^ci5>1X`D?8mo2umA468>iCdgw3zr^YPqY8M^;6Jo<2Q1z98k}>` zwDUnr_hN%zXz~n|wDWtNoYo$?cJFMHXQ)#dY&AY}O`f>H_Za-^1|MirK)b>J!Q@F> zyENV4R~tND0>9t%>^7h`7=4e?x3nnWQiBg$y7?;|$9J1NKXv6*Qod&xpPFS#=+gbID=(w3H9k)mecsaDZSeaH z-f4sm{uP5aouh;f&Kv!xw^}ny*_#NGPnewXb}bMY;{$$~@##K8`Rve#cZ$&`{#5}V zwQ}T|EctiMRQNZIezxg9{&59-*5J1reM6H1K5g&=CTGIh0jp+S&fxBRfpv#o{&oM4C_kZx|o7DsQ zL>0-dbL(46K><##_E>&0u9M8uVA9BVf7%cPL|7gGO-4 zIJKWn*cX4N>%%+S;CX|`4L;S<9kg_1EeW_c!T!j9=xa*o(*3^4KWKVbYkdA}^i4OY z{4z%k+{>ni+Ak~o2BSaS;Dg-?mw680j^H2D_0CneJIA)f=;Ly0o#)A#8fYJP_I8)j z%iIg#mm2+mEIvagmT!LUm;7t3Ud#q9e@`Gf;Vlc5kE{^@KEddR7AsuV1^}OB@a`)V zE^88i58$83zf$2c7Z2Dk4BnDd_*T60$15C3A2)qkbK|{W_St0y-lpWk5#) z0SHbs{pbHf;j-rd!5d9KwHIl+vc3X1%T4rPhW|y4=G|fKLxZ&sXBzy+W`~JW6;N;R z0qB){8gj~C=1zh8D2kBqE^F}Iyvk#+LrHg<(#v`w=m(5`=xT-A@Y4IZ)6WkzL0QX3 z@MTN4Q|H5+3AY*cx$}m_XP#WS~!Alvi5WE|0-Pe03bNQ$@5c%%iaM5 zQ^u!>28N&PS-|sv>8M8UpU&?o{CdnE@pp%nW5W~rE_)Xc{GsW2;5Dj$ zS(66*8P^Wj#FDHP1O8LMrJq7N^3!PEpH0rrAqC6c0R%6y^7714l{sL*{}FOgKiwOZ z!77dBy%A4=Tf1TIueS~KOn1=qT#fwmx5?R6m-3N0V8E9lzoZ{R{`hNweEbzmp24L` zFKc#yx0pT?A6K}n)dBvD)w_moFt+E(o*F#gZ{=7kP&;de@EOL(z;3wi-Qws?4mmpp zqHmhr=FN~Vw1^+XlX|GJioVF;1D~z(^_G8^0={GLW;{io zR$r!(8Gdvp2#^0k-(`;tf=yPxYWYzH{Jw2`K5FR>zC{7E1&jG!EBACv;j$M5xOG-8 zgYQwetlIhiSlyjg;;SU*nrq$Cfln;MR@)z?b2KTJI z5(fXd!5a)-WALv+9@gK4!BMR8I~VVSrwne%c&CAY@LB`382wMI9KCNVK=!;Lc%9Q5 z^ugcR`tVLN`j*+6udnIDo8$Cp^p_aDXY}zIN+|nKfGb+Nnzx2T_P+prBgmwDtzF6( zf3}x|55BC7W$zM#o2=Zs4E}CKdl|Fav{me)@wv~+H~w}7$i5lG`L6NrhP?d!k3PIN z7`(>pd5Xa=Gya`lRX)~jcnx@^oK0r8PH&7>1$en%70RXDugYJYh+?Ze6DA40<=}V1p3A{IN8$68QPRB!dM?N3CG>0M z;8&qOl!Je76#m~Fh5j3(=yS~|d}fbAzZ6ASPM+_Nl5Q33yd3>Wqrm@!`dg0vkx}4J zjRK#A`cjV1S72)8;Oj;y7uJ$;^p}ld5C1%hJ-lxec`~R%<@j$MMb0mbBIog=*#G_i zkGAiDkE^Km-`%E~VsV3_#(x+Uun5!?5yLC$hGyGaNZQag(1&Oe(v(EfCZtJ8kvult zEaY}s2xzq`XhhVCs8J~duw{!i3EGDNQKRBx;h|=I)fW*pAkyFWoHKLp>|`(g`Tc(T zX|prmd*;lUGiT2Hy|V%J^`!uLXq}>%JTyFh75u<3?36xg`Wm_sdLXa! zAKK3$T>lJamQmbGp}xuP%JE0{dz}g=k4s(r3%GWaK93mmuLq9o`15o1P4p)i^a+IN zLtiGnTDD@3{uYD&enn4wK49Sd>si1ErzxyUb(d+s26&61HRwfIjEnJ_27_o4@p104!^*sLj7OvMXPkXiGL+WGu zQF{L$8&`Ti|9FdD;rgt)$4BAAuPLOL80J~3e5B7eK@VD=KMlY?{dP$SQr4SZ@BD#< z>-ElGS-4&|eeH?G`K+>V&8OMIE3YOAa6gfS>vJW;7Ou~gJYwV52%leDxIS<4IyC^( z<<;j$PP1@*4&@gL*ZQaVFnxYw(I<9FzTuPQx#q9eS>I^kdOh_$7OvNW*IKwQNmY*$J&_Xg=RGaFfs3J%xO<9lAEI?C>150Hx*E?Wn`Tb$hwR z!gYIjez#vPnks5Jqo45QAwR6w@876!D%Wy@{-XwN_EU@Y`20;gNedA85FfK&o=`ZI zi}KB?0l|+9dNbc^KSNyR_k)ibxLK}e4BX7O{}!LmGNW9dG;o@_YW>_1fInv7?=k3K zd8^Og}ZX^TPg-|;!0-qhQ@25z?B$47)7EO=aWnM6Y+pD)C>D*QAHS7sL4VBrZx z|Bc%uK=oygH~w~eaeVxXK5mY$zP7hGej82j@FD&t{X_tMBmh6|tITE|pSA#eGys1t z06+Q8;{4YJ;Clk_?*-t$55QwzE1qwA0RFK6{Qdy^i2(fGZ}|C|_5SwJ;&|p;K5p9Q zrf>VWS--ywz;C(Br#IX0*A-57PX3`u`G@-qdec9=%zUpha5LXa@Av7=e&;9qecY7i z6>1%v+M}88B?fNhdyRpc`9A!B&)?*;Fze%{p06-)Q=SI`@M919d`$XN4BV8nDgZzH zU~xWW-}P~m&)Wj<#sK`ChkQO}ySUWAP5xgDz)zX<`IznKf&hHwLq5G(FC7MM^0^@Z z|7rj}8Gz3O;J1I@m*-5hU)|r$2H*`p@afI^{fvQ|e7&4ZxY-`> z2*6K&%;#gu-)G>aoIfydlfL}NJ|9!g#sK`Y25#~n55TK_;`2A{zw4(yZqE0|1MsVV z=F^+?zC|rmk)JgCssAu=+IrJ={%He`8Tii(+#K({Xy7LO>we+OWAZ;c0B$U*=b-(oaoAq_ZfBCp6&-n&!>fr_hr@c$9 z|F0OhNq@oe!=Hs+Ve#L z_*V_ww3FHweLm(m?ITBh-0UxI4!}lmNES>CG*e5t|zX9|A>M5FoFGU{s(z?T^K@;CeRH3t4s13%foAEr$##ox5gx4oq}zC8e6bCOSQ`l~Af@J|Nd zKPKUnJZ5?0?Rc6nvtF75@Gl17`2hU1SaJTpQRmfceZEOmhK)A|;MWJ>H&bDXl2e4I>J z+vf%Yr=n>5!CIf*)X%YX#qo^+_=5&+^8bZ_oAahPb>2nf|5O0}y8wK#Y7C@LauvE< zZw$a6paXM7@;&x~;`r|k+~glx=hK_`$^iW3>wS8&ojL|?@)-%h@4Lk3W47O?0`P?& zDo(%g!^QEB2H^Ju;7p`>)#2mR1!?@uE+2oB zf&XHgkDKLvMNe`3BLVoEwil=08Gx_qD^A}LfZr5=|LrQDkE#E~{XYIq1hpQn4!|$@ zkK*(Tt|^Xp2jF9_PhV~1+q+9}Juj$y8M~Lz;v0N=vtIsqqmP^Q@{Zx+_zeO0={NcG zrXDr~;J1Imr++tsT5tdJNgp@;|JV2U`1=j|t3T!ARR;d&PZ!7Eaf^?e`92$fAG)8W3{IsY)^f!Z^x;Rb${?8Gmf9^}aU%1}F%f2LZZ5FQIW9zqY z{r=p|7Ovkf{4WD92kYD-5%hNor~Zq&N-gIFBa%Pi=Nb5}&kIg}iI0At=J5dhOScuL z|3d(N&KHW)kKQgg$+HYWE$5R4Zmxg6=8HZ(O$9XldILB8{O1k)0|x#525#otyw~S% z`qeA%D2^|`)5pzrckVZR{A~zoIp2SekDGS>H3K*0|DA!G?Pb-N&nIs1?=Wza9_r-} zrFtFyeBw0{$FXAm*mzk0ULJr~1mH^o@Jb86UCC1wfX6KSZbk0|;PnO*!9t+>B@DU5|Q}|vB-=*+T z3)gquj#>EE6@AvivkITI@P`#XW#RfR+-VE{y`s-qxV{^A#=>9uIss-ayh7n~7Ji1p zdBFqEw4K)|yp#X~U#IXg3)gq)l5aHWKceU>EWA(QODues!YeKO7KM{fF!_I7;V}!( zDx7?dN&m3I>n%K|@QoJ!jKZ5Nyrf+CwpsXV72ajxCn~%z08d!>S&Dur03WvS8b!Y+ z03WgNb&7s(06uErn-u+60G_q*?TUWV!u37EQx^USML!*Y=PX>`H#}qEcPl=#7Jf+K za{;)1Ws4q@|Nn`i*YDSAT;Ee%7Loeb`16Xs+`<>XUg#<;`~-zBvG7WTS6cYF3a<*l zV-~(a(K{BtS>g2o_(luwQ}j(1zDwb47JiGu={;ilX#L!w@IDJ4Q+UF{#}z(g;g2bN z*utMu_#O+NRrrX7zo_uN7QXlmBKN3;zd_++7Jiz-vljk-g-=>|y~3v~{9=VqTX>to za~8f`;WHLKsPI_}|AfNlEPSuR@lqjwbbZ~YaQ!>N8lO~nnMMB-g_m3SjKV7{{Lczs zV&Nrk6ges_{8b9CvhWIp$1HrQ!u5R&T7He|-^;e~jRAa`EIg+8w*}x`0eD{kp0MzB zivN&>Z&LVh0KUhL923qMEU_h772ajh=M>&& z;m;^M5r7X_IA4r``WUwG_q>^_iSNNM>ua@ouV%!e|Eqd0Xs?C0DEd(gf0x3?Ec`VJ z&szACivOgA_bd7-3;(3Tr!D-6V@R`Dx3KWPD164kPkV*X&j#Rg7XE_b6I#gGc=mt1 z;!|$mw9cbHbYByFbiGR~6pC4RrFua3x6nt^*Gn|iX5lfFhrXvo(^o3GK8rr_GGUak z@SMVjEL^|ePxlGXNAuVBSd3VBNUax*T6jX?V-{XP3zGO`EnMF>px;lWd`X|`waQRc zDJNrj2v^->C}!br7qXCJ;N_s#_e|6qIPp=hL4`INIMM5JH5oY3*C_sN22S)bRo*TG zC;APFzR$pkUf)ZRFmR&3M9~i!IMM5SFGdZV#^L(@r!foH_km?CT;B&aY2n$=OU6?c zuJ8Anws3vF)U1Wqe?|Dr+4vo*U`kIAo#zpiY9d~4;riZ)Dht>525J3iK3TR5Ur!p> z_l|6|_~?5|DwJ3>>?3{ZPfP_guG?voh3j^juyEZ@M=V^o)2xN-cAB$r-A+~ULRuc( zPAinm8rSVq=dW?ko-KOaP7@Zc+v$jf>vo#8aQz;C&cZ8o113T6(emi``ztJbw1UY( zF$Vu@{hF3v-)~)E;rc%8n1xTBBIRnbaD8!A z!ou}^r6U%ec$e_WTKI^eZwObuJ0$#TDZP%IA`Jdeq!yv zwfyyKmHet-)40AzT#rXIKDANkn=E>LU$yQBG`+qbeZ->I_l0LIy#B+&KWE|ke%ufp zfW=4i*Y{^vSa^LClZ9dyKBe#`3vX%``hg*RDvR^bT?pH=vXh3nrR$XdAm{ehf?C)z|#x_^v5S{{8* ze1(PQ6n)IX_3ubDS-Aeaf`pBKMDiQ4aQ(X?J?;xP-?zh}~9;ln$GK4Ibd z{`(ON*S}AawQ&7=AUO*U?Nss~XUVDX3JXstJZ9ngzJGn6me#|pqEA@#u|dgi#KQIO zu4FA-{|-jZ!u9WO;8HLC=zR6>IaFA<{{4rTg^%7O>6PVd47z;1LVg_w{BiyiC0}p0jX$e`@IX zLizRYM^#w3z9%?l;T8X>fA$4v-+mF7d zxx&Krea|rq*Xs;T7OvMB5*Du48AdEz-?y5z@X9|a`7K=EGaY(uq5k!~(G?c1-#d$0 zxW4bR$-?!zN5aDOy2prx>vfN;h3k9Ma~7`edk(36eyx9f54}D&p>cgre9WTP_scd} z`0VkROyhICh3k82@3inr^?u7?3)lCj9U;4kEnMI4uJ?g8y}oz9%cgIWe1|Pu z-+w%6;rc%BDGS&4dCyw7zUR11?VD+N^zRr{T6m~W?}4A4$uv@2RV_aD7i*y@l(0>bh+F8l`^=*Z0(oTDZQaZpy;- zJ$17dUba*Cm#O_LEx*2BtJ1>tJ$3aKuJ7IIvT%Lx*06=^`^QEtT;C@)W#RgMuvr_w zPRV})H#2YkrGLk!(!#scdG2}(*S|y3W#RgF6^1Qb|E|KQjjMCsQx>j&e`eOg_3ufR zy`@lo{d*~u7OwB-*q`EnMF#KWgFnp7<#X*S{MuYvKBLMan7)@?hjp`fm zwc+c+vGRAE7(eHVu5I1_R`=SbRqNL83OBmpiC>TR#P z@PZRQ(sBHMRIGXR+S6bE;SEFKH}`G&!22(0`C#j--g(-on=h|??}t`6mz}-rUFWU* z_l;*wL_Qn2FZ{*um%`r(-x0n){HJg(JQVpscs%lG_jQl1%5J^OS5P3K<8h$K%d-yBizlDDsej)tz$alk;$Tz|_M{bW?ANhRvFX6fH zO_5!Zd&48)uZG9M2g3J6o(aDg{$qH5`0nsX8 zg+CeI6CMoT5Iz|BZ1`aK!SI4ixa_NuTf?7={4D%G;UnSShJP2H4u38D^YG*0|BO5v z-W~aNh>7``sDGm?y?BG*O+BZtFZ z4(|>BBK*s6Xyt~+^*!CK&08ARcC~J;Yu(b>y(6@xbxTXvj!;ieV@q3W%jJzd-R&)x z@7UV9ZCm5!<}K|VJ3{r{ogZm!>1o_S4A%DcbhK}6ZCusb)41Z?&OS=Gxw)maadUTT zYh&A{Ek4rG*}O>*q^oJ)zOub9)X=r5xu>c*Lnt9oxD(P;LAO#oyM^+0)n#?NZSPC z?e?Oi1S86&(WG4U9BFLt?P|QTv-@(8Zfk4bESy?9dYV-fhPJJhQKb(R>+0_8YVGdX z(P+mnGpM(!vPJ z(l*liDl##$00_8(Or15ct(fH-N@(e5-o`ZBTD!Nmqw+87YuwV?(bL|zrFmOVYd5o2 zt*XAWfO1PKwWV#15U9Pmr@eFQwh*eEYkW1rV!jkACfxeoOIhHe@~M`&l-p|K*5)m( z1sN-iwhKz?(W10(ZRu`={d9M?Z}Oiii#2($c#yWSuCDRI=I*7NQHbWgcKC$$){afv zNcW^?ZXcH+w3PnnhbWnqR6p^JpA3Da@Pft7b3NNOZ-qS~BW<=Td$+c*fJSjbux++! z_8z*BUgIUoO|4vMs{Ewsb!fzLJ+g6mh!X!oO`+nBj;pf!HnxeZoP~p}wRU%P zc94%#C{kZYZl$`bt7C^4VPlOX*w)jHe)-}9HLmYPt05yIlU95kC>5YtIc?ifF_c9!=f8zw=JR;~Rb&B0GXZ|Zp=MXK6(CfV z3@Js4$q*0SX1JMlbar0e+eM-%hl2Lrh!t(9pk)hxZKZENr}dY&Gr1@Sp1!NQl>v4- zYol}H^9>f+dW6bp{-F|=4l*ejS*)^#%rx@7-^!zGwdSX*WR;o9@f*{+%g{~ z|7_E)gZppZ)+#XUWMyYJwQ{i(53O$DF_wv|(Q3#H z$?vQ{dtKMO^)d!lAbSi+JP1RA##Np0RX&7d7Q*$k?NSVf+qX1>59${t#-nhm3e}-B zZ`#p#>5iUO@(&(N!?pP+)r60d@1^Xuz*M?TXhASfjDU$1sfZ1X>XB;0FF5F+X2wxi z?x?tmiAu)x@TiRf>Hgg#U~Q65fhDbLy%LSuYYk{tn{?Lblo~IE$76t6|CTL&T*|^v zmBP^{ovY(4sE&*6HFPy@=xkhtQIYChYdWvoYC(krh&jz2o6R(UYC3x%lz`At;IL+? z8sF$v*V73XqFlwMkl6+BjI9TZHp#$$#f3776X>FDG}XpJjNGIJX}?sxiIr)pm>{Z6 zYM$JHjfO>>v|)9(Hg}*q)lrFPr?|8ww3NE4=1cLtV+(yNf5TQn?uOm8YQx=~m;^Sn z%}}rgV*$ZN%qodf z{b~u-tzJ_Tm*5INSXZs+)?dW*^$qJC39a#i>#NtS5^(*>3pdnX$ds$pcg<=QUwNTd zl_9SJL%P~H%{o*m2UgauuCJHidF$3nV2%2&mFOz@TD?BLLP8g<=cLuOt5>b5-yo57 z^0ofrdI{92@AdT;u2hd!dZ85>s*y+4=gRkab@l6*^;-E_S-Vz+R@BC;1&d$66tx>v zV3iK6QNZekdZwsR-xr~%f;6aa7JQvxb?aB_kQb;?Nc~!&Sr0KJv|0g<`o5@I0yXj4 z4Juf-S_f)WU{!p>>NP9ZvQQ0c&R?_kqBR^Q)vuKxNG_~ix4L@6Y6Z}b+2nAB45Yn~cdTJnNIRj?*rzrkU!CVp&U9z8xD@NU*vZUXC5y(w1#KRpxB1@yz#_&(2i+AqK&XeN|^Qo^_`1y14!f39QqB zi|dzZWSPeS4tLp7gsR=4&>G=QZ?}u6l9!7z(#gf1CPJ!w85+UjsWk_wOhKBHfau8~v zrN3E~Z_{x;Mj<=@B+?hlf8$xgaax@lq5O%?&VK^>q5RLlfAdrEeJS^CCWx@0{&z~H zSJ`;f532OGY&yNh+XK>%tMpo4%~ec^ zH!%up`89qB=Q4qHX}L5$tI`j>RU`7P<<{r}NUwFFG5W4tEgWZ+p-}zN5lWq2+s~_U zu604}(M~){;J^2&xKz@=QVB-s>0`^^iU+prMAvsjDEBA@QjG3pvh$~z`?94iOFQ3H z!JkU`GQxtKb>^9jopsh3?>&PmrDU$M}!plop5 zUpa37oRf~vIc|Iw-?I}jJ}5!K@z^2&=p9rE*1p<9>yvN=f^P89 zjct;ZQSPn6wRT+bJg6o)*r4yr)Zm*N>-|HMe zgg^I@O^94>d<3K;-~vU{|GH_%9VnHWL*~LE-B;?TmV`oB<`Z(zjc1)?e-^r>^F*vr z{xcDOjFg>!UMm0ZGwuRoP6^4UXKq^;3c2yelKqc`qJ#9NMgE&$_?)hw+cGsECfA7 zKzbzbV#E2H{bb4KDx!nb8xjfFB%eDyN}UnMjU*Qfge*YfCy}_H#K<%MHY9jIURFca4OJvOQOvJdy;B-=LhGmq)bVTD0DjS?7 zqcvVeeHGj`xn+^j4!$w)k*)(+Etm~FM4bzCQ0^599vTppfGjws!lZ*7>EPfTte5Sr z4I~89RWSzKrC_=###uHr#E=r1qA8Gzur8B6{@;JzcgoJ{_L~+U^ES)gsQSmdR@$McWD^4^?ruVC^F*oxUkgGAY(*d( znn<%mH%C~bj32~`Ot zcQK$whrXYS86Bj9Us5BC%vY*-CrShjIs=EY2+3_hyXquwxpnk+Q&drRGh;5BiuQ;CWZ6K_I=VO;Ki2P`@*eN4ZJC-qz+(VNz7s zJaW+E2>C5v6**^up<<+a=93asjFiW`gD?!Cb`{t7pL?37!r5Q^QMY?xJ z6`N~=O38SkJOt6lR2fJ|>w#;nkv1q^jBcYvNAY5GO%@%+i_r0LXsaS(0i+IaiWqJDlQ zvw@KA508@E!a-U(vaFyi^?b(EN1B|m%p0L+8qynid{FWr zUZr?C%F+4r3}1gI`9dK&{82ctWs)SA^S=^)wHrUuOu@xwfup<6?^ z)Yc!T1!i&*Er2*YtmN?+VaGxw%&0I&VbeTSRGUM|D%b?wfhtlayBW+h$SU0dYM^=s zJq2GuB(&lIGK$h;it?m;X7j|r_bHC2brhMDNDEXs@FY<>$>%~tsZ}U-H1!6Gv#dOv zC0TbLO#I>KP==oGVyY9v(Yq&+Cb~Pz!J*8{p?asK0SuoKhR@T(Gmp~a+2o6wayB-! z?`0s}mEr{HhN+>Ql}NBFMJNVRh%ZANp_z%D!w{vTr?(U1B&r@K{VH)4SF+7fVQSM{ zzjf)vFjCc~Gh_&LX_vZ3$)hISFkOA{`LgQdQ_B zejdGh+I`cBHSUHJOILeS^jf#)#IoA-KBB2U`V%*PIN5&~Et3ZZpF*XJ-Gr?ghSr`$ z=^q)|y_?I%lBP%7AgH_V&KIdX$~Y5URAe_bS^)M5I932A1k4IZrA2#{K}CG8GS~Dd zjT+qE(RA4q&r$)s+t}vHWh;~)X39A)PW?Q47(gK zpodBnWHqYW$avXVic4`*dpNiK^;B#;)UyLPkm{I|-rrONuSXdrS%yo@iwqeqE+%(Q zI>TjkoeBiGpss^vsgrPFF%iZ?E~)EOsfXjS#o>I68~{nUkUBFcwMzuF1j#VWs~<&W z>@rFTzN*ER5li+iD=6f7J-TTT^02v_I*_9n&pmZ6B%#O=LlBEuZgpS&-OOTtTcL)G zB=#doM}kcxyrwHo?H$Z3o{Qe&ydn8qc{D?l7^0La9(V}8Dx|7(U_WV{yjL`JI*|?R zCoKy=uclzUPnChkuap?o2ijwY;^{0T2j{pGm@X14sdul070?91?u7gBObKeiX_+y8AsA63eP|Df;X$^)XKgZ0Zwq>$b9@n|&RY4A_Y+nwlZ^%(wC`Wo9n?!oI zn8Sn?M^Mq{g6azB9C@dhD6P>dpjF~mpdeMZRLjx3xwqrGUW-RaS&52*JvBiH#N>-R z$Bm58D2KZV(A4`#j1pri2qdweoH7ca)Vhabsav@?%rN?Z6LB*gpiSEIo#1OVcUNBYV{40Jw6(frD(| zF30jaFni@b7NwOMqYl&0{}eBOdOE*qeF2Wb%&e;A7V4W(A2{fG8$#GQHAN7zmym0=5bga$6$e2fi;x*DPr%12HgB_)4SR?=sKxZ)A zAQ9-pPH7@R`O_z{pT|?tLE6|uv1dp`&*i7%hcN@E;oS$TKU_GV_tx{#D*ET#-e=v0 zSw|Mx=P>fiNj{v11ijVa9H!rDYC($ucnV^kR-}8MO@j-2w~3h}Xw5t<9|7+XJ<6ojD#X0JD?!dRz<)4mA(4^7o8a663Wg>a zBKAaeU?T-G4R?yMVRs?feDAC0OpH-8l|A72pW^1V__#qwqIN6vXKSs$^01=$Yms_@C@^;47s46BKjU zW@rj^MHR%r_XRQeUhO!U{xO<2-6`df$quBYy^b*|J$=-mehn;=Srd()-$c9-|Z|s z_#_lU!TOSePn9jAbx4XVIQUel7l|BvDzxYk_aS!@ll)m{`O4C0ie8gPrOh#tZWx_e zg-V5>ESZ#(Zm0yiJ&=7A>cCWGm}@3|K^cOg;S0(U2qZmj?ejv!K2Bm z>QVFW6h6n6xkiD&bw@vu^$ty!_`WdA5w$eJ`Yj^5E37hV|kiK$}O zhrY}6!+|4}GWnZzdylvc*k*eg+i}w<+N?5_Dct~5Jj$iXkG4{trb(_X@u!`W%1AzL zFBc&+kt(6y4WBfJmd9tJ$uo!qv-xy}9=hLmCQ7D=gt_n^Ax>t)E~m;r04F#Re}Rd< zjk>1AN1Ai(7B{=DoaZdPkcx-lwdw1I*&_Ne;<%9}DNbg8Ir72`WR9Gp`~8WM6N%eI z&55P-z4|`-OP^XyN-zsyIydz!sH=}Y>ZU?So!n15>8=}vInuMtNh5{2p$+H4cxtf8%ZsJqvA)bEJ zjTP1LwI~W!M;5UDROvCgI=l=56%;0Q5-6cJYy4R^o!-s0^ApD{`9ogX;7e6m(R#bw zueWsk1$0AXXl5Uz)@x!$e}HC1Zmxf3=IEKEDb)?7tEl~JtER;z2ZF18fgBBX@Ena~ zd%crBi;_F(Ybt8tKFgMyXJ9;8{1jd>{dK(aiZ=MbsrRf2W1AESZFErX}m%Y0ib39q;fXJy|BL zF-X0{pQgqXe>#6#VT}}BFGBgC54Al{a*$tg1|FOvG2980jK^R#GkTFWe+@J_U-nUO`=@13c(Nzv$u48D z_^2s6cl{XNnX>a3fG|V$Igx!7vg5xY`**2l{Ksl*FY%Dt%1|oOsJAa)@9BSws{ z`b+|?Nzxkh$wH*;pqyj8!vXd3LO&X!v~=kzPgcT}5T&qCyXcCAbo{VMCq|OFrTIU; zLds(#DQEG#W_PWtR^S9!>U&tdNY?1mPvf=bbZEykzGVlnj0y>d_@L z)1Nuz6_Es{h%@k8WEdJRDN_T4%K5_V@P!!xF$yc_a{tYf58Uc-Dp#Aqy33+yvg+UW2ign{7Fy9eS zz{^pZ5lnHgivkYeJS|0eYN0HmNitr3hHos<#J|Dg%`_sUP~=BrEO0Z-q7TTwXcojw zY5t$m9PLn$>p&N-TW5ucsLW3tu*u@6L{=WmY(`_N|0mKtXrwDw>8R{4=?!){4%r}j zm0!Kw({1$b3!Jm3qDej(R4BFb`$}qcRw&CV*_`gFuO()iU3DbsX0Wt+qzVzzDmC>s z{6M_z#VXxD;F!K6{K%c1_>ZTezLF$Gs^4QX!E)-w{pK!bwbIo6NTRF|np*v@X{xP2 zQ*Hma6z3@^-cumOdHZUV_B=o-fYF zk;+reP4wVj6Xz*goaO(xI1|1&3;*#{<9@0iV#16<@K`hQuheZhTu_0L_0tp_Mh02ush=}w3NEzoRe&kjEM7mNV-Ou5st@;jX2bHQFd|4&Imljbi zhAI*D08^cMWAEPmPb8vqah&LV|3soHov4%&aeqkX9vo3#)=A3>w|AaZ4?f>kpk1}- zh7lOe3sB;Mf#=txg0onhECuiLJl=ik)RR53eR~0O=|c4QudCGJE*mY>k@uAqa#ts& z{weNd7WY4BVUvC3h1|<$@CXM$Q8*0xF#MAt^-IcLZgKyZ&%L6Md&R%Ny~5&711K_5 zqfr#MI9_!$<}oPBG}Z?AfbK*VYXG!`MMpXFuMmN;F2ZrFQxS}%nqfRJC+p^UmzZ9! za2uY+j1sF5yf`7piZC%w_D>-<%ucYF{{s4~Q2s9*K8(L`Er&6Ym|9*Piza`DI1*#D z9ji*$9mW)*{m~_ag{M#husrk_rOWG{R;K`N5pq~%UDjD%T^h}(g(*;C#g-4~hx1ny zQk6$mWgJTS7SwhW)Jk#SxCmgD^JiRce|`hsw3=%?=AWe`UiJft#Z;eQ^*C= zE;j-Y53o9(24_OfrTi7tFcrP~m}DNOF|d$d0+0#Hu=1o&;j~%Yo}GhJ#8I#mwhP_%d2&V!J7cUW>UCm39j1aqEuYOps)w3=8Uri}S<6 zwUk&)%Tq^c2^o1>eew2fMFCQV_E1hGNF9&A^qEMNN#H09b$Q*9X!7+UL{1Esl;EbS zK$FM$QAn2(jv2}-diQb3-$GZ=FV^kS8GdwX*!k4GkTc}`~ zW4dmVs)=(e1#4tPnL5i;6pN;4z66YfH%TiI&mYTvyMR7JQ!XrExm>(F?TK=Xij4qQ z=4750a+CWB!@`&xD&QQ*G~5*Pz7r{v`$w;=n3X7MvXSd}gNgywi4`vhTWol}p0(QLRXUt}u{7K$R_r3T%> zAIB)-HR7-S4f$qv6Nu#sm?#Xct7PUnEUUQj$CLe!!^4yROvfLm<<@f$4x0Q-{4~Z ze@Vhi!)krLDX_6pCrLdE1o3?RT?jjw-cjfaUS~{3S=c+MFPW*OWz0If@U<6z>G^U8 zt(n|2`%nHuFt_Wy*a^lHsQ1q0@x9UHNfO4mG+q0j;NFnK6L;Kk7e9jlTk4(pAEL69 zFGeb~(zhTLSfZ8QiFQL`!XTq^uFf|SLa z=fl(~f9zSRHz`V<$3|DG2YDs;(_a`4CN81;aWp{3N|^MzC|UbMmBeh|UE0p_Fl@=!=F0sN4Xqf zw7yq5FPU~Vc3+=_IKd3ol&VgRU-)nzfs!O=I7!;4%}HVK!lWUaWd8^3(Uw!~6Qz1e z>E$VF?y*!$_2i7y{$sNLS-8-bgLESPEKRT{;n_?`SX<(#3BZ~q*Q^30t7XT+0->do<6@<`J^)gSzrBq-h= zoCA;YFZTy(1dn%x_fmP;zk5SoiKcsgJc|B*ri2&U(P4n-VeDud9mdyDVlf};W{P$g ztWDj)6zwpq{mQasS?u_JU)2)r2-ZDI8pRI$JLg!TWu#Db9x7-cT&!^4A}%4V z@=j&y0t6@I)jN9M3bT^s;b>Auq0|K@$mr8`k5T=rp?dme>Xr#p>UfL|;IaJuq>exP zyv>gN*Q^K{g>wcn^f`hP&Uv&VGP3D(satm#11Ri{`T{MFV+4zXU_^l$_=m*!o?k0o zflgMLpg>x9@9YT5tqSl1r2LmgVQd8cP=G2(zYmXA*^B*5YSZRSrC0^+6Cq`;Hod$w znq*hOx}j$1mLiLnfheEGA74pYsY*{&Yknc6)>wB|bv;<9rx~hvf5bzoR)=eR1wD!+ zQdgclkOcnX1$F+R;C&YT9^Nd7=ez+9#yzq)@(~&$kat1F<4^(uG$Vtac(^=+4t9z0 zA`?bS@}kj1{Bf8c@_c-G{OM@20%1;E_c%#hGqnT&J>@!mJpY(3rO!997YqtnGeilw zCJoYx`J@CDBdwzHpqbJ$l8D~<07M_iOkY~&I)n|G2d739%L0&=Lg`ZgRw|Bu0l!?N zfK>gKCq9(tI1zSUlH(iuIv< zEiv?bEe56-amWOThg7}-@s>=Cvq0jhakEb8B#J4eZ(N@C=TJsk6rhig2Ao%+{?MNv z6*STD_z%fV+H;gt9X+}d%Y6(7+?Hjd zch~(8FDvmtHi`v>x))^S3uA|Z^E__<3ocG-wP0DS1+Vi(zi|*nB=<54jeP)Ncn$oQ zGm{H|`cKho`loq}{&P-UB*KM<^T%$wTJnQc@em(e!uj7p(Rhk8tY=CA>1jC%Ip-|k z1wf)g<|bT*$AGI#^LI$<1<};ie(EZfdWrfD;HJqcEi#Y0%GIXRY%7!$W%;*|A&Q87 zidmcb-l)DE^{ts{Cgln*#kWyX&8AB|)@`C$Cl4g z{A2j0nv#1V*c1xQrN&!NiIKnHKAkL$lF@BD=sRyzoizYi_oT@s&ZXt)-X5&F;xD`c zI=Z@9Ea_ooE~8ekeJ(9n5?@~ONc2WpyFihc71mabwNjq3HsApcEw=Q68!cP)BEG#; z6F%qA%2gVp4)&|pV6aXcYFiGTcj}oF8mz^U+w;=rOyDHrEY3N4L=T;R>N%4rBi3xy zp+`7qw_#FsYYmfVbyJXSO4ixu^3)z!WB&T>Ys5pa_^Q0d0-n+fR~avEqls(%%G^Y~ zOOTE~i|IdR_z)2*=!>w@SvLuOb5Oa1a1LSo$82L&J)R%@O^FkJ4oeNQl)a0WFlo+A zBgpI2$chpG#aQf=N1TJtm7sdyBPWfC`oSEneT+F_I2PWUm`+!^a4x(~FrB`l#QlS_ z2)UCf9hpy*=oLKF_*e4)Y415zZ_S{`N}WrSmGCQnPLkQb0h zAD_y+B8{Wc<36f-33{Ye7HO4F z8Y>{x94F$lj9XVUdGh$}L&m&06b}cn`e$gBD0;1$6A+91?f7GLmvTZZlf)C&hMW+C zv&Trjg!GPcuza(}8ljk!D|=?ul|3Xq^q`EDPK>KF%Kfk#Y9$RbY{$lF*T<~WuDWCT z2(<5y=w%ni>_B9EKX4>LS?VglnO?QOqG|%_rH+zo1)8C;j;-gT!?27iZD^60D7{ZRjn?1cjxsPID}>LAJmc>SVWf>%Ti{<>@t zJQ3kngb)6@R7aK_{B>y2Gw!2UdJ9wii9FOOWi4u_mqGE8)5URrPh32oar^2;PG+O> zp)=go>Aw1dzlpdd+MtDR`(62yf%R*$BE2i!D9fQ>}&sb8FY{^i;$Q9JJ) zVcBqm+Ysv*h{byf%5~qugS%VuABWj9#B#E?%5Zkl#T^!OXrnfc)w^0 zG~^*@Ekr+?HlC4<(D@M0f?uFPMgFb$<2^|#4+}jVRTnG0fafqE%+Y-Z=K1SNa$Z;u z9FIQ%CcJWoMZBDose58(2hu@WnF3uXxuCky&54|lH8D%Dyr!tuA3QW2YvcW2?iPVs zFDUlnP6}mxSPijn4AK6zl9t~@L<~b_q}%6VHc3I%gg$eQgn&$HH*lB*k3^cl#9j&H;qzzb%)1z)$gV;iP7(%<5^Z>lN@s=IW{!KF)#g;&`b-> zw9wG+rQ=;>$_j>i3Tskj48Hi65h-?*V&N1GV1{1AJDle;8&u`##2zqGFNc&MPKr>Q z?1>Tm2*;LDkQvu0m6!AvQ06FEVvMGd$XJb3#!!W2(sD68NiP$3R4REs#KMu%VwL1^ zoXq}7(vbTw--F06l+wd0JcK5D(YKGY`Ul2iloT&{WOmQ}3D!5|WKtA>j`@}WKHJZ8 zCY`C%g7@u&KWC2BKer9ES20Ouh=h%(ZzJQ&9#x5F z`H7bkYrdeiGa2H~<%b<`Uc9LV$Lg+)0b<@hR1b)m`p`xwj^2=hmC@4UAW13hr(ivf zn#e4q#DD*K85SC4QYUI(>Pi`I-${PmKv@!&@~U80uNAGJD!@ozHIt_$2lW!nG*<+& zRt?>oe-9jq(a?s*Pb7$H$f*k2e!(dS`dSzx?l@Ax7_~EfMNBCpSP#hTuS9U>oz%)Q zDGHP2P7G`WZ}Ni@qd}A(^RMm75a)^NKH3L?ZY6fLSeuHKl=#n_iGeI)mqa~k?1grP zM&3a}F5$fQ%NNNyO0-U zp6VFt_L%!aBxar*o1<}Ibg+g?!bZfI4iPTZ!-RCEV2~EU%^W=Pi3GFJJiOf0Td7)l zZWBG?$GDwDul)o7^~NMbx|vNG zZ^WWbU|;gpFqhuR@0C7ypp=rkyC>-}jh0gq%47lXm^sCvOomKf{3sRG9iX>Vy$0c} zNqPeMx9#PRL6c-$Po3xdhqwlj-l195pyi812{>c0(wrQ-=Sb9vOpU1Z%59R?zW zySwTI8TFAaLB@QfPZ0P!ohm_y8nNSB6^U!gA0X-Lh7!1WDfJFgQF1@s&4U;%IZ9~| zfE|!tpbEjz_b?gaa0c?CFUt>wZDdhY2dhCEEP#@4^O2H*l7#XCie3wMtJXQZruYSrtmBD6~9P4i3@Gt&$z9IxV-_wPc83 z^F)cm;;Bat5y~USd%xOokDo*dDo9xMjAuTnX>cH2Ql4nONIQ|5r3gMy13eWrs5j6u zbflCxQI+c@hK$hBR4SF@B+L+p!YIZy%F70~*-X(wV=V4&E{R)m0df-#Vjk(6r8xWO zIUPAtJRczWJjU#sw7N*8QF;{+@>438m8_qVnxogF15!`9ITI)*WHfdv6F;Ruo(#gb zGU3KgDU19Cc$(&XyykHx%7sfo@YI8<7@B3xsYXO2GiZ}K&VjzZ8Q5*~M%l?=EZNtG zV}0e2*3Vm!PsCKOs}f&bB=Ob3iMf+zrg{i)B@Q8`x%FT?L_-T}JT!2m0!qbr1Jf~D zAjMcnk2&}ye;FK=At9`Q-lb>ms2@RTcgu_RbjBA8F0{17w*>gt2h94{ z2P^>}ctgH$;2*d?fav7%0=hmx&)Q!>wJq;vzYF>vPkkL^xHaHTe6jZNt#1uDL@fjr z0tn{K{tH)w6@cu*T)8OBqhv3J@h(&HFp>N*MvW+Yd{*BYfHp`|VbX)t=tSy75(1wz zhhQs|wQg(|(}R6Pf?6V7%nba2hCQ4pIw-p>sXls6!+9*F-yofrkLf!bnLS%9CC+Db z=Os3v?@7SCKr+IuWyTWTz#*!8GKd7ps?I0kyaf+G`9>Mq1fUgt>WhBpj^8(l+7@4K zEqChu{p69@vTU{Mv+$;X|GJ z3iYwnwLq|;>)qNS1JiMCJuaVxnOLu@Y4Zu`HXwPd;X`UKl5N0Qz@{Xn zsVevlK?R4ke$fhz^opV}1-A8y)<8 z0dP!o@RtR^qUhk^0$_1;@cse-Hhf0`@UH0KrwV{2(ZQht;FRd#l?A{#(ZS6H!26?v z4F$jly~)m~l;uOw!FLx>d^9@vwgRAEUjqj1acNJArcP#x{!znYP@`m{pjIpk=F2f_ zeMzO0tKfx8L+Ku7Dt(cybO41)2T-VV0EJ2iP^feOg-QodsB{2@N(WG=bO41)2T-VV z0EJ2iP^feOg-QodsB{3umA+`c(#KH|MU*asf3kG$MQOFzP`ZaDWm>~keXOl?0EJ2i zP^feOg-QodsB{2@N(WG=bO41)2T-VV0EJ2iP^feOg-QodsB{2@N(WG=bO2C#6Pakb zz|v_2%eV9oFhLv_VjjY<0C%2p0o7ivMjwi}{1_Dj_f(4AXky~vt<>jfC`FFx?$Ttw zlJu!>vl>++Eb?wK-@D06hSb{fIi!Wt4ChA;CeN*lramn)nQkq4t-{cTA!1E5)e8Vu z9Xvqob+ApIW=`1Q&D>#-O9CGbM% zwbA4)((5o0@42N37(-V4fqf((A^sz4d8Z=Dzow!6??sZHYzyQ5K9oCpH~)sssd$i% zUyoxHX-?p{nKnFSqsB0u!Vd1uPRUjQj6cmk-$6;_<`P!huOJ2T*EY_U&u^dc;#@TT zh`YN7oYEQkOM<@LSwfA2FJI@eg8ZQ&tH~$AE$9u5vUt{u2V$!{+QM+EAu%(J#zacz zH#6#{k~_*_(eD$kc%iQx??oXp@Z4?q8%>p|2Wl*#FYO^hoG{Dp#$!V`)sPeV+TVC0 zPs<)m!FF;CqJO~%b=Qo%vf)WiFu^PT4AH$hnOQ!}@s zdoCP@A4MmRarpTAA_*FYvtv4&IB|h64qY(773|6vU(!=-lzb2P_P4wmRmbf=uytu8g1_dM;Yw0tRIj;3XNkqOFV_M^-KKK zMSh9da*e`@i+dbNLU}pQs>jF)$^|y*6(2XG>oYY4Go9?qf>f37g);I#gOE~#2_DAF zX62Y-JwmzA%~SX$vN7sLo@&@7A;hOK)@U@j#-pJg07O+jfHv2sRv(#*vw$f` z`@+^KNj}%2#&zca^>XyyZih_Rexsar7O%9QqbT`{bPby`6&mZ0ISYB{$5SF6?V|#z zaKslu9__;usXX|AEXC%Rn5y;vafxpX@UD#S&BhM^H>z9&y=&MGW$sqC>3YhPMPH2hw|>Ga^rjX zL`C&zxMnE+NpG647bQa~^jUNwgG7A#XL8_btF3 z5T`@Adx_Z6{3*JMlI-+B6dE9xsu~RU1=6TwG`jO-MMhPVZ%#h{4#ZWsO{5z&Ad3rAaO{$LfWuryyUo0zFdR@J|=kY z7*fb;j`p9FUxnmzubyK0 z7no7egtv6$iNwl5NkUAZ`gG-NxGc2pGjJ$@{LJBrK95?#gA;2LnB_o7I95~1uRz;Hy%}YjzO2+#ZMUy#b zlZCkvqLR%LhoZ?w=OrUVCEG|rFPYTZ*cd-A{7ot<9OM4UGa9oHL?4*z?93Bb1;yf9 z1!}-P?;%GnVA8arP0P__-s;dE?Iw^rWykmhVTR)qy-&eMP0!o`z}s(Nk^~Tpf}T=K zuhi|SrPsL`gqhmow;q7BB~>1kTk1V{;2(=c@%m!2Wn!Gh9mL>_h^UangxM=|dwTxq zuo`duzS0{Eb6MlFn` zy_fhZIu3vKWHhr}KhnvtD314#$XgOQ6_-Tjfza*;6VDu#WdgVNg*+*Yt1Hp}1e8Sm zHAi(D#?f=W^xxQzk+c8aZv-3nMHsfrzKsq*KrLA*fgTKG>6}HXlw?-x$`B66co)AS zntHdLKbir?mF&73&@AXCV$pa_I#yl-OU-|fn_?VqA(kc&zDPg7_%h@<7QL>WJqC3h z`llC>k9SrH%hnnEHx3`Nng_8F8DhOHEN6egm5LjQ@RDnuwp9%t3wd}>hZzew6REW317 zsygk=^K{<3 ztsA97+;yYah9fh8V}*~SEj>w-D4J$3r`fC0&}O%9?aI~p0EfgcG|k(OX8u@N^V}Hu z1l?WA-t@vzsjZx$oP|@m2BoW|8X_BSL;IgOfT?EaUK;GtvBHlh`#=7&Xhw~ead4R% zV!i_md>K*mW7ue?l5hudDu%l_;I1#PMkGFjEQavC2ef<8^4XTJ{BPT{8vRCSEdL&4oRBKYlX13-k9rF;rR`m-j02*2Lp@tB05 zWAsA;&P0}u{M}1(IMG^+*J%(>d5A+yW9Gv_o`r%j!8{@Y8HdZkJIAt}^O7Zg3zrcd zN`4Ij{(w9s&T!9_ffJ(Os>e*`{%AE@iR1iK{CPy>77>l^H4)~}$-a%S zYUOEQG_j4yVALG5QVZfPvtg1>X*bNeJF{THa?+T>mW=SO>4yDA--AyaKa==bPe94F$u8e!oZjfv=a~3ff!yo>zTi^wTSiLa(4jAsa zm*hMOKdbKuIRL2?qu|<1rm4R#G;K23=Qc%CZDI#GZ!S9>O>R(_Y-|1}<*v=x z+x7u0cU5@1x-ffM|MK^`6yWc5DZtkLr2v=&jh`X50{p!$1^9bi3h?*36yWc5 zDZtkLr2v1gO9B2~mje8~E(Kt(i+b7u*RAzQuOc1`^Hl9dTm?4Nil%^4$s6SI zzwp$nx3+fDS`k)nzQESB6VDUZoAq7ItB^SfZ>$O8cf(bA@CCVPqi2|J(m`uc3p(U2RQo_t=}sBCXrBCd!;E`w zIejIsDuQ&>|Y#*Yb#J>5K$R(Tuqq!yh0>|&e^Gxev+~!fHg4Q%t3+>zj4K0 zjjSO>?i5TEORh_z%A=bW<_pRDa9>u889Ck{W>_*+c72)0OuhP8Trv_nh#8Haq>-rA zM;hPU=79*P$6g3s{4gRk##8TqS?`DX{rjx5P!`3DkXiC$h7fkZrpf4s}elxJowxKnt9%E6G%kY2?UXKM7Ati01mnkPrgm}p zk55Ifh|Cis=IhaDFw4C@%24erUI`$B#yCofk@fo6932P4O{dhynpx&S&sqBKu2Ee$ z^2(!E)hBvtsWKWCnW$&J;xx8%>DX)x!C^$I>R@GKR3KC+S=ub|<=6N0>2xf4jMB#c zP{Zf2MX;;xbJ4pWnt9j%;>0F3UUp0$D4K_%oD+P4Dqnj=iWU3&#ZtGD7AcX>8b-m@ zirQvd!1$l;<$M?lM~&YsHC{LEPO!4l{fAw;O8|PnVuq?Q(cU}7q0J@7&LLkHy*@_* zPQ*v>1*72|6x=`J(o-^A^|s|>R1x_TI5E9CN*dJWh&hd6Vb3$4{t?jZg><7V5E#Qy z-~rP7VD!GCJ`;*Dt;EgLBq=2>x=I)GIR`#MHzDMZ$b};jBDE3u8MW zUpk5KobOAaCwfF2NQDT-Fd2yNRqt1i$3GKNup<`B^)`YzvF!aG;woOV2r{(9N1*t< zRDE)hg!r&GX|=F!zzh_8;6t1jtN`5fyulnfEFh+Aic3%oG_srV7XU=Y7yk8QpfG}g zLh|53WIE|SOf_;SiOG^0DcnJ3k$~K3h>9_3h>9_3h>9_3h>9_3V=$~ zI9vh#I9vh#I9vh#I9vh#I9vh#I9vh#I9vh#I9vh#I9vh#I9vf3hwl`90+87aPpU*e zVcwQk&685dOoq1AcorxA>bKOgRILaXOn=_tamCi#b6e$Tg;G1XU>3y{^mQXG)o84+ zM!6h$?z-%&nRt5~-t6gCqoEXu0ybcydP@ zewtnmq&oA#g7@0|F6jXj2|2@^OB)jP)Qel1R{nB2-HR!0!)Us0kcZuc zji_5#5HSt6L0K}HZWxr|wy3Wx`TSD#lh^bvt4Da|{?kSadx-6@mt_nXbr^g zQCh*i zx_1c09u`XWE7aHMXTwFin_=e^>TV#4-`%kKGPKlC(BaS>7{geGP(95dRNQcNCmpa{&Ui?j7BC>frBCX35S#tMzun3w5vYaPJMtG1~>QPT<5p=Hz zSn85fut>=pBpvw6$fF<~-r^S?mFd+bw$yJ#N>;U(r=KByW7kW__Yatznpa0&rbfbY zKjC6K$FHCQ@}I+>ME_^do6@*p*`L!T2y0RKG5_fkKwE}vVCqAz+v{{ty)eX&?-F|E*P z?HB6IZa$=IwAFjz&F0nqjldw4R}YhUf@;N>xDo%E}E9N<1n z4GG~dc$E=D!V$>FTiP{he^+0uL_;~;r3Tr-iH~1D1WpuSPDmr?4+f6VSkuX*y6E7P zmzrjT8G7?|B6SJ=A{VHE0a$w>OSb~Y>Glhr;_{W0fvOM zKq0JdLn!|+^3>1x7n3DY7QNy1^ceru2#Ry3W|{vCiK*Yl#qcTRP?j2?p=m0{2#;Z9 z$1GJ3WFpl@GWaadQPFgYLd#ip{J06LVc!&$Kxv~TLj=YR=y)fP`$zTVsf6|}6hVP+YYEFciIkRstnb@)G)>1J8K38A)6&Allws zdLOAfy_*U=vmafm%lb?1zXX6D`mU3P2Gigd_@Ot_Qoa(o3cuydFFF`l6=mSy*Aa&% zQin)*=0Tz5ELk-386aqznH1}_B}2~&6goygIwfC)3Kc9sq3|_qgEZ;OPyz7M6lryLTCU=re$|2ff7q4*EP6q}>QK{YP+MzLyK zGfp~2!7-K9dfIq5Vbmb;7!Di+(spM4_c9apqd;}!NgumkMUnMx%d%oZ*=sH zy(%)M=0;8%-UKmjYa2NVlVeXiL%*Zw#*h4;_TC1*uByr#K1o`dmX8|{F(}IAON!8v zLd9Z1Z`<5*3k?L?KvghFlN%aHlaLQckq);efm|=ajDl9hF)HKKkw>BKU(<7-J|yuXFY!DYmU+J57pMTsnbH!R)rp8az+`5`rjPP2Au%|(N$e+j_CC%)*c=%+ zzL2f{Nt%?|yxyGBmEWe{0H1j(^*BovyDmWL-YJ|_Gie`C#ekRxRK_>B0)TlyCBDHb za}YFYy%+$`NgbnCJBsjSy#~nw1WlRHw^9^~4DJ@I z^h=pE43d)5cB_pHbHM@}5_jxvU??#kX_y+EwR(az`L#(_Fq4nWI%s>ZB!O0|6^#=L zaAkSQ9G+~IMcacW(roFOc@NUdQpIQLny|3K%%sT249g!F!c=ctS4{0T^~CI4j6*)S z1jELgGv4laX+(^~`Mi0BY&_ma!Kh}l+GNqFZIk7*OVgsIy|Nady>1@}8*865)&)pL z&_3Q5!I!6*_DM7SXI3d#5iPN1VEQR^4C#1Z@Af|1+dmGvn^AXklt-YZiJHDfn%#K( zF6xgjT2{sfB7<95r3R6`hN`=AN}tUZhBFu3M&MQtH?-1_Eb2VO4mqViH<7qbjS&iR zFhb!krk>_j#bmA6Q{8;WLp3s$6Q#CG>V2F=hwSq8=WI^3Tpu?b$wTC^w^qV$nK6uz z1yu-tSwHxp^k7Y&Va~|C8y+Cvl}J}Ui=lk4QPPlJQ;Rjt8Ja`LRw<*b^n;8gTa#z0NX=x~QHnW62W%BW z)6N3gCnB-%exmoKX!bk~vn0*EK5pKEl0-k)J)M41wg8>R4Iq|S4y0uVBz-eCe6`X2 zK0XDDvTwzfi`?ee?XPma+6w2hSZ(d)o@@Q9851MOo&fa?jaok{NaHEA9498#=Pyaa z3T@6-RnyW~unrF*&V0eAhwbQ*$tHC(j)1;hGQ~ZYpV+fPl*C@o@`4I3Rc5maY%Dui z6@JVxjmK@l`>_dj2bDpRE?O|Tt<8;yFw{^5SS|^YNYHkQgEpnHd2Ot zDJzf9q|e^7Yc5mkZ2a8M`yV$|BtgLv+|S0cuzu>yge zym2r+&I0J06!G(=tRNIL9>~)7TTRttmIUWdsRkjl>ftd{g~a@*&rBF9N$QLlCY#;6v|9~leT-?{L+*-YA zvD2dXT03^BMpmHI59M4WU8YB~iY>-q7I_c{)38jkH9}9vsr>EY?BOYUV6Ut-+^;C? z$BxtB$bBBx`x3foexAaKj=UlOvxK{b@Lod4VbI6rix5Bo+4Jt}fyfjj+l{ypcQO{7 zsHcflaIiwJCOh94@_+yRZwmxP9B1IRn2Yn5O@xj;*Wq0cXH9UM%q8H>-haFQ?^%Gw zs8u3VzBKficgCC`Coeht*YK?D|0x`?&IX zBj|p&ri%cZN@ej`1}mJ{P|?L*aZ09@^xuU#Fsz$I{4l6 z+g}I2n`V!uiHkUwM!?tSHpPS)fAaA!v_xFFMnE3E*T{Syj-U07JX}hloWt>7q&$?* zIEUkBe{AI+`8xPh%46%z;pBhx4f5|-ek<2r0gI#kU3(57Odi^`PyM)r&gcIUD3-rp z{UI|vBGK%0V6u@Q2gX|_1}cVXk+VK8Zn=r?`R&1pJ}`GfiM4&pX0^>`2GBn zpY^*Er^Lsdb-YEZnwf_IN$@lG3s9b$K^M~h;KBjA1dvaOO-qzXG+0fD4-nFEu zt+i`OYyH+_aDB_R_AN^qn;W_U0h`)7w$^tA8xbR#6Q#MesV!*lXlqY)bTubCgBz0_ ztK8Qcuzn%i1~%iEw5 z7`t0qE@$@F)^BZY*(Tm~UG*)^4XawOhoI)pwaq=r#_Hy-hAlx&Yh$vbrMWd(-PYOM zMJXY&aZ7W*}CrPV10e-_1*Q?Cokz}>uwL)>pMGd zY3pGAx|17VnWXV;X>RHg-`eh5Zxzqg_2B3XuISp5>>xAbi=wXIA#UhuOk5M-@731? zRn4tyll5KQ9Z3Mmts7eF+Y_Ph>LA|JUf)VntgWY&V6u*eq!^vX6GK$jqogD^p`l^M zwi}bCR0*zL-PRLaUU_w}2EWQ=XY=)~SBur92&(E~^`0Q!+R)a>Dzc$_Gpa^)NAu0~ zUCeT_wb8_}2JLjgs`_>lT-DRuNi}S((iB#AH@7shY*%%3)Ne!9>RTJ@I~v2(kV90_ zFt~2R73=G}np>BJNF$4)yDNa=o15!fqYW)6rKr}B=(1%?E0!)>!ucs3AC=G*-Fj6} z)KgaUwxbr54xw}4Yq9*%9ps-?$CTYsyyoa5ihlVVWsl}fiQl_O~n*I`C~SIj{Hn0e@f~67$%HgEo4)^+VRF+dT}g_ zA5}W%SYiC)R7j60{bHBila*hm^wV8>ZI+%=IzNLCVk12f_U+%GG zP;yR$9JJ4r(l4eRLi&m#OShB6Ke_UYe=i9zew5_`cUDgMoF0}>Oz9~yS^32u3FFr( z{r5TamqU6=>3y8+*!U&4&$IdsEBzxm@ox^}k172vIr%#-%-@vK&vE0M>SxNI>B4c3 z|7`j@!}w99&yvaNSN!WR{g~4Kl6JQAlHss^)+zn3a^!z0l%G=iYFGYt5ij};EB%xl z`6q?)$CUoT9Qie&{3)d`&7q$a((R%~pPPQMsbEt6oG8QnoPTWoihr8TztWFmI+k8? zbXb0MO1~#3{>Q`kDW!ihhkkcRA6EJbmSZUY{ILFwDgC~j_@55rPbqy1C#YfkhEg&x zfA%J3VUB(0h4zi=O%9)AhVffPyu^zk^x+)(=R&%@33_La{8K{tQN2l;&auzWL;J*(elREg z@51iT#rzn4&-Ym=92sn4pCx4yFkvSFc%_vvm)n74!#D?%Ts6MmO2?T-6 zFMwaJ`HihJ{L*j2d#C2B>^%mT@eJNCtNgMR2A6RR-cv0eGq{W&@WvFc(+Q}IyTH4w z{%T<94}f2%`ru|woQ&h}4Whm~D)Jey!^B2&L)O@w8 z92xh4e?<9*FERpTz5(y?THnTwHn_~C;mxT2LmLe);}5*YX*oufU*_h(KZ76b-+r>; zA2OF1TQ8{m1xzovMZ+Ed0)(4wm6)Fp;d#(j7rijTw%F7pNQtDa-3p!8$Fmn#3P zDk%LQ@RzMVT0x}W1pZ02+vFD!fLmoQ!7(a7mN9_z)9^N{oS?zrGXBBK&y}Pe{+YpL zT!44d))P%v`g7nvQaNRJ7=9Ti;QfP5_X`G>{ukbV(fUx7YO{B&~( z;#wa9#kE@r_(2Bc3@Kiz{P!z9rMTRGfc73Omv+VFz6SV)BBMXoP3g+aC0GeL%$J?# zYqkP@jzoNy^4BSUmD<7f7go*(pg;L}^bg%)a|ya(XX1Q`h|bFIR5_El(xv2Y5WHLM zGqT12GH+K}3G9&1l|X(zR}vs`&#_usom~>U_k4I$0sONNosU0&{`v5qK*fA`Ujg~F zQ$GIP1?2n`<(QA3AG_qkR~C>@Q|9BpvOs<>E`a|W^(UX4PZzMyiO6t1e!fbW4}YeB zo-d=G<>Q|!AZK3ze4>DyT?O*{P=S0sQh@&}1^8PEy+c^cweN6%U`~vt_3#9v#0(y=Vu-gj-_&@V6ms`6HSh$>je$estxEQ~uTXS^g~^ ze=nKgZYse4c?y8D^1p0?!3iiYIv?MvIB)N$&)3KV$9V!B#odaZ)n~xtA0ZRmU;+L! zQP1fp=Q{kXoL@WmRStfG4iHBIqy4Rm>HP-fxcrk2&Z)bVe-1MQM}8NtDuA~Y!2i4e z{x=2ipA^84V20p)eU=r#uPuPzSpffQ2fqR7SUc=>aMuoU!dV`Djy;N6&eik60(fHq z{Nn}i-39Pl^!~@zPg~DZiqmd2_}P4Q9ZM}ueZB%$d*2g(lfZN8+jRx-UlzcNj?XXW z_5%243*Z;)#FF}d5I?K`GYycIu-KN>{Pq znG;>}>E=p(cn@mRz2CuIeb$_jpZ`t=clpcTndNu!T@LQ1`|l3!^51l3R!*~{=edis zxXb@by`l5-_4ae~^RIDmSD%kKxGVpQ4({^*lY_hbuQ|BO|DKBc`dsJWF8{p_?#e$^ z*LRrTP59Yz{K>ns@?HEhE3&xTj-Gk1!P%{Id}QBB_pIWS@7CMXRtj0(nIb>iD&1nm zeg0cLe!V>oZZE+9i;Ijr%5mG>rd3(I1zwxqzbSzKv;e+vb$&Vb6u_S^fM2>MznnV@ z;8Te#{{~0@p-Z#4o3FnufWJ@xAJl%1cKe7Uf0u*vR^8eyxICNgRtLY&!9VQazjpAA z4nFUStQ;5rGY5C&Jg7LkBYN%n)2PGGr3S0#PaNE}&ktxsIKQ6!wgA3}%H`pIT5;;b z`rJzWs(Yf2a5v^~OUvN&Kvw?gIF49lXim zKXG$bj@!?yb#QvE{C{$Aw|qavvw%@;Z@J`UI z-QqMZ+#>vFpWib8cd6o(GnEZzaH<^N3q{2gS1qduXaWAdJ5Bmb*R9XrbZ~YRHorFx7=Ek& zF(oFvO>tlU)#+URL?R_(8FI;{BISv zcPYNb!!LZN0opyh zP4ONNKjBORq&$4R;sYLDtp*$N@Bzhldia>)!yf)`itqC9KRe3+BOd-M#Ya8-?e8+c zn1{D3KH=eCR(#UKf3Ns{4?pW{15A1NTGeOT!@s5YtcTyOat?U-LyAj<0?pRvW6m** z{9vBW;+2Y*dH6pl&d=9f{?98O_3(vD4Bui8|B&Jp9)7ptD?I#3#bX{mxzxx{c=*}p z8ob)W(~58M@PARf&covsM$Q%we^vEq_wZ$^PmhN;DW3B1&nZ6O;a}Ethdlft?H_h} z_*04xd-y*qzRSa3R(!<64{EfuK#|CooLqWFY|zgzK14?mZK9^8Hp|FzC9r#$=` z<)8NOFDgFk;lEb=fQK*OO$=SJxsc5M{4~Yw^C04!Cs?<_p;Pe*2zRkB8g$Yf>I=-_sfJaQoiVkcZp%q;`7v>@g;1!#-Ya@Le8m-(wo_aQlAQ zsE6D4fb8=p!*&EYGC&Lg((MTxx7vJryZR9_C1SP2PeM{NAgV>quO+Jxib7{ z(Bc=839hunT!~Zu77dp8_ON&~DsWKe$RU5b;x>Pl-@X^q?(xS?F>-o5yj}5>hYu+};NkW? z8fzz}+hat_-<=M>-jWJ#?L>a+Z{HKN_OQ5p-*Ci{Bkk^d5fhAhxP6~)%){;bj}tz= z!pNEQaQi;peh;_rElzp3eZOzo!|nTevmRa+GwI3#1H3lB_60S&enXt~r_aQpQ+%Y4&9OFV)e1_U6(ny@c)_Nt8j3ZBj1Chi#a&??fap14o?2xlNqkv z!O3smR~>S2^7q^PIym{O@5LXuF$X6>sb?R&ma`02<-+`5>0 zLYxZ2)ydy1e^l|5hu0}S?BiOG$2{E5_oh7D&iBM%pjmzFe9xwDaXa6OY5Eqo^SwqN z*ZE$bhuis{?ax9vCm99zdHi<1_o9afQNurv0^qEiXjFp1=^oy$c%_Hi`AMUP+xbbK zhuitd{T^=TC;L3y&QD(Sa68|ar{glotS5H9ak`J|e52CC?R=xr!|i;d&&PGXaleP# z`NlpExATn`J>1SW=IJ>hIH!3~c&Nmu8+`dQL=i&DIoBKW7zQ4cE!|nV2 zFM7EBPGz2s`=S1qYW?wW`@T)3huiNh8a>=T|LyZ|`+W0$54YcW?DKH@oy3bCZoea$ zr}GD^|L}FHzlYoR;wwGeey7st;r9E3J`b;JG4k*CaQnXhJ`cCwXT0d)_IrYPIuEh> z+wTuf_i+23ex--o@v+gzbsX&Ta68`J@8Nb_+vnkS{Cd&D?Kp+A8O2%s?Ra#$hud+d z(!=fe(&*uK9O?7$=$A}-yFA=}r?s%O`fOgPQIsUb7y121+i75_BaeeN~aZ&^{_aa7g%OD?-K zvF`oB*5uZP_HDu1jkQ;FcX3OI+DnpMwQIN=Lf5j|_WF*_WNj1nN2tXf8r%W_jFrtd zV=oE%u4?OUZKNNp*CSdp_LT?&+>ApJu!>Y{aZtNXcz~?Iwg|PCCvTyks_qs@4VHE! zTk4l~C3~=4$Ff@PvQc|g61z`yb_F+ewsmxo6&p7s>$d{0Z>-s{gVH?1%5=ldWsXCKg z*xjR6Hx1cV>xW?k+5$SReWh;_e*^0ziQoP6-t)aU|z?|5rq+v_4;l|o7?rH*a z%Z4S8(`fXeP=$*o)4Zch5yU^h4dup|(VVtcJTdJnk#(+ZCQMD#? z?5rf&R2&>4uV_!U)-vzZmu(Y0uXI&Le+b`d`ca1KTUy#0U|mHJod&Cwoq=fItCAQh z*tdj;*6T1VYFIkdLM^l7oa6+V1;Au%&;(@6SlSRQg=xC#H{-f(t6XI)?PzPP@2WTT zYBRc_j%~F9KxMbdV#MvJH+mwU)oZJq#>9@ZW_?@h_3Pu(rn*}&;@9@9xS;leJKJ(h0dQWQExA8FyLzu#B|yk;xYC8^H)MhJY~7T z;BJKVmLrEU`8^YCKi*uqe89P*RYz}|gP%cvrcavdqJL#VztD9DOY_tJG2-V-KQ?7z zL^T4%kk3y)27u{@&o@l8VE(s^=LFBV)_(T-Be2n5q4DhHZM%){WDDrk#LPiU5tL8_k0u_uy)^mF^zB6A*~#ne;Zzk`1$NtH)}Y0v|`YHTzawbZTaoM{aVTT z*V;fz;TO97y0FG~{pf5l`uhJp%FowbB8&K`%dVX~WXCbE9+>^4I(^ ze)IQ&<;w*;?}GO%J5PLdi*ApvUt3(1)ujRi-8vnG-LMFM9j zU@voSL5`CXc!n&uc<(9A9%ntx7$8mIz=J95<9-5yGsNW2c>EQv0L~Ca+$lM30tbqx zSFHevY?=5g=Hvx)7M$HT9p}d79$lqpv)jGZ(>&1u+oH?)a`1nfvgnLHvj2Hg-m@I0 zz+}(KN!PrTu9{v??M(*v8Yu({Yc*lE99Q(G)aJi-L%z)>NH95m3kP}GX=LIiBnk3)sb*{X}-AAr?{ zkn;10CH4VrD76B})0BfiWKStB1Cc#t7d{*5KgFN};mNoIDMf}QLa{*NXdcI5C5WHK#QNN>G*^A)X}|LmV8an1H~A@B!VAh*H<{)YP<|rzTA0tgtxr z4^cH*)F3?cs+R|+^hF`koDJ4HQHGNiLBN?3X>;0<9G_N|!g&!-NL$IIO|siiI&xqe z+hStyA;yvxmRq%Zv+YF~Go!;uO&BH5nHuEe6Nc2WC6T^qOCrmgNzf1m@Lsq{_zRMx2-zA$WWrVBWB@a2V)$fu&;gHq8 z3o5TV&+2=RVGwY+1wW;+66336UBh=wW8^%Cqi z{1_Y^=f)^YoDn6#kHMZo2<$0(w@*OcH;|?|IHYC_2f)T~%xi_zs~Yq?_pX4qX}rG@ zmy!UUweS?7*2ZvcXm0IJWR&~X@&ry|8I%aQRpu-xf&)R$K*twc{AK)!^l><|Q15{S zdISnTz8{bO5HzO5Bp2|E=*935gH1;4iK?%qCwgZ}&;+6&M(!LHvIG*DqrOY-*Pb^@ zuD+sjmFi6q{U&cPnaG{#1*>6T*PV8OUvFn7wlPNy|5lSqGtftUKqj z63WNQml!;$_PqvIMJO<`39N4F4CfI!Qs?n8oQE$J1MVeFC?9KLE-RrttRqq2u9gh@ ze5f!Z9EL34ENsbe9==oxxT7Um3DL1;ji-8?5JtwumI8l;_#-A-Naz`e$f}h8Tw$#-zI2n!;FwM&np8SIS((QC&rdOb`zn;4 z%w`kwCm<9l!C31yCDP+)&Bk7AWxd zPAZ#W?LuK$9HKV5lTjo6r{b?^j7GCeiUd(Dy`uul#p+ML>4^z5UHkS$3XN86e*e?+vo`y9#s7$Zo|yOHD`k`kG2qP^N1C{B}8`dx=Z zohX8crf3o&D;QE#6iJU!5K0C~tJfj!%M#V=5NESQ^;#mN9}pr8B-w%btQI(-X*Kw2=MLlDntJ<1fM{QdH>T zR_;haTx9TeT29)y$j1@2NOIl;N(c2MK8-s?T=qxyR9yJmNdNnVnF?t~&iQTsSwOY@ z&$2l~E{=PJnB3<7%FJ8AD7^)$i=5~8;!G>%k2xzT7-!u6)~=^yQsoevFMrWxW3~rF zvxNdR2NFA;km{WNK_dN+kFqA9^U=!ilChJ{*XG8>-NZ-P=y3B>9SzrtC-pgAT!-9IAK#~E$UQPgVi-uuV}FY1G|dQK;LA18`&Ql`p(K@n`e z<0;N2!bB5P=1n4!UkM0IW- zmruqqB15bZd3b<_%=8|7*W4p&nK)`sF!NLV&Gb*2(^qLj+~6V-PSEA8JgPF6!=;AG zpK(zeY4A2kIOxsv^QH{vxk@3VcW@2~(41Fn!JP)&lEXP{!2Q|u(ec(9Fv#H?A~@bp zP9#Y$>Eg{uc5!Ucj-cTn8-ZDkW@|SaK7XVMXwVRb?=p&q~~3U)Qp6CO-?^y zvhxt>iS$vwRhi$WexcyLN)c?#MUzGbS;dV3(_&<6Oqw}z7uTi?!tP9LZ)y)`m8PeY zybG0?o0)~>vK7pU%S30c1T`b+sI}5NmLp#oksLxR1ky8vnLV9BB2Bay)7bwfT1-Z& zFK$uUgK`1K(V2F7~e6O8)S{A zQ!15|pv*WUCx_!(Y}wc<%<`^-WNeCQi$u)6&um?qYz zpID#49Mql)Ts4MiV0P3&r=R}V5JYJ5!;}W6L3S;43_iJIm+@|&m8^1t!C{P}6B3=> zb1XbA#q@nQAw%fw-bb#G!_(P_{B|Wg%!uL<%QSvSV1J2ydA=68C*Z zE{>Po1s{rvUn`2Okv~jELbW8D5+0W%$!(gUOaf!>fNsWfjIZE9ZImezD%uok*nWsW zt&C5O$MQthHb0Y>>3gC*BGa-6)Q67Dy_*X!`NgmS8P>@&|pNRCH zFJqPg%!8WI$irA0UmNMa!c>6K#C*9c750^aZ69@>yBv+gOr?@)Ya%h}n427K&TD3Ufho78WN^uJfbiTNDs4bM9T%SoNYZ0a&Cc)yA1snFX~Zs!e^XbbsG0*z*x zW$442ykuC_@Pr|E?aU9B5O%&c*}HvLNu;08f~;wgJFO7NrYWkKht-^7-g6`U9|_GX zO;b|4KE&WbJ%ASSJjE8ar-qZKb`ui}P@-xyan?jSeoycAdvM(J(ICNhLZr9EVUqNI zi&VzrtaF%%53P*viwypl2{+)mOY>L-y^oMcmnhnc$~XXp@S|=itXZT`{l)0~LV>y> zcetb?56dH+TY+Zc_oVm2SgAyMum`r)Rw4exg?l6YH4+u2n(0oF`H5_K8tY4^F^%4L zVEQYPgQ`iMQxCiLZeyWx+(V+1nM8TI>Xn%`1ZVgxNZZ8E>t zRh+Jxi1e{`h?OuB_fD6X2MJkVex#4D&CJBD3GGVv{+U=VG=BxdxW}A1(<7LSf^bYO zf%l_>_?aas=4N4}Pk9(x6zN}%7-n)I_krmFkr3A9$xQqiP9J0uiL(c0^IR`ZDsP-o zci~C%J7>W|=2tsjqJ(8nVKf~M=Qw654K_z*G$xrpBIPM7AR#tsu>D#-TTsf=doYg+ zUYj&s%Mp>mGSM$SjWLJ!B{S<7r+51(?&LWE!Q^6Z;%xLr=r?9c4KD)hK=4b)cY=4P z&UJFCdnoV#BkcfFP=pq9lZe1m|4jEz=_DWnf$h6o0D-slsD)thmr8WwFNf?Y(e0u`X6$5Rjj_bu z1FZR|NgT{4vO&yDcI-=mi#-bN1hhQa$K)x=X=y=bl?1IQr7tc_LMBNopw+ZADTEMT zN_q+--2TW%(QZvEk`iD9Tbh@lv=N@-h&5BudvHetQI6i5e!%Qa@c)et@*n!pnXTEN)LVJi2S z${i-wte#DfuHC~Zgl)8v$2i6Z(Jz&}b*Sk?Md$&J;ns*~&OY>t+C_$QEx+Y~L;35OC2$8n{d^zPt z&S|2BnICd$v3)etO*Kc@3p{`(V}{>M`~lSBX$;FVZ=S~j9YZ_}{bMqxxPU@f8N``J z%UThuHUh^WaQG2w_!_#!F&VGNX7*sbRzZc!vG-FlDzVa_wwQV?Gpxo)e=7tc=2T)n zJ142_y&qI8@^GT4_h2&8kESI|0E&ALHbwe%VHZ`rr)2sL%p)X|d=Q({MOmpxbLKec zU|WxA8rMbo^TjZA8Zl&C$!%JkM@Jrxe@&9(7t*QiUxRfyt%Oa|@%!vRhOA~=!hJM5 z?omw@e^z=V+@>a0Vg%C0%J$6qGxHHgP1jzD`6L_r{E9wR>>y^TKQ_rrF@9fZ;VU^) zVqGdAy%!aWp+udYCfn3rMUGgE&Ybnv3Yj_Ul+0OoA_u4$>$GMddo@#dmkU(_HMSi! zg0)^=ep$u-tY$jBx}2BZTgzcAY1H=^v5*p5j0I$fm^YEB*_nR!$$6zgre>`7iK2AP z*bIAMV`ASpS|(7z1j$P~Dc9Ckc~%NInwY&jVw=6F}+qkIh|t1`wU$$#t4}09W7@)hz#aW=cCGoSN+HbA-h-W5&;U$q{|nK0Fn7SvVYQgi^&1dH@q-sd`kzPa@%T>swaUk= z@;MDN2=i|(gVsbMTz>1e(~G`_9KGBe`zxQzxf+MgS~kYvJ(BmE_A;)^5qJdt{# zDDv>ry$6HHz3LyR`lQK!_a}Q_4fe2^e;cuaNc`3H4dd&J#tx;@kHOB^;UE|`2-ad* zc1dmjBuaiEBw{(EckDIXE+GcWT;@CbGu`*2I7c#7_w?>9^2_rhMm(80c!6`?M5g8* zGk6)T%Xe2Is0cj8@H zsxm4v>*o0>a$^@Ub(m&0!7IzM5lj7uYiz_YQ72+~HsVo!#B7Z*&1D~Wc^~84eWxJX z-hU6nn`gc z8E8-YnMWk>hl9{`1Zj>GOzCbB#6h`c7bK0~HhHJCGu-1oBNJGN*x9@N89P4nTvU_} zyGYo;y`9;_g5pvUd+fwu)$poO77K4Z(7~lSN2?mfb!6rxYO3}#izU53v=*5&jW8DZ zrH*c>I|;22;i~$aS)z&ZHzrC-Y+$NdEL)cxV?G|rw)R7op&u1ThGf3D5_5n%{SMKj zbD55^YJ0{hL62Qz`c~viCsbzrF29TgR)%a>W?nvjm$4Ewf%$gK(3X*hk1y^0BMMUo zBaEz=%Hgs2VM=+I87bWiab+;4E<6S*1VtJyoAWQOn{d2HbL z(wQG4zQcs6)V#gV&&xro=NCPTrED}=M#KUR7<%^}m1x+DI(HzEzC%9bz$%XfS4wd1 z4TLGOost}DJ@p#UmQbK)fDrUR;q2`lr3mm*ZUx zVv&d2i}wDqY~jnmb&4Ry}t|=zMOsvucXL*F{BGpSgpj{Bi;th76fVBI@@MEeV}+ea{dLuBu(Ry& zWZ2YqJT<)w7662<#m+EiK5>xQl*-9x9q2s-I4YE*?H6e1eBFjQ#ks?gq#5zh5U3`P&Aac)Mi2hjo z)zfj`FqV@(zTd>a&KE)0#ALvqr9bbR07Ah_XuRDvgAQYPZvv>K3fSQQ29>$b&!Q&1 z?FU2zUY230+n0&u9T|vE$A70O2yp@so&{#QfA`2@@ji_aYTD(XPKE>HT9z`tV+;g3 zCNsWcp9yGa)(PQ-n*+H)S>)1~pq8>`WP@D3vBB{jLna_{@p5~+rNG}KetCIRnO^6m z2xB;1O#ZrmH0glt?eJ~@4UMi&{szGc8(qWyf4k5eYT7XCrJ--G$LA;S8{sc|gZ$-h zkU#o5_}!Ya_;v8RRipy^ZWzHFNBg+)&-21L%n11WTqkzp`~0N&bU*CIp{|(JhmI}v zP~}B_SKclF#0oi||EsTqpLw>f6p0;5AJ$DQSLV3G@pGN}^*YM`zls0#>TUKq2xQxr zC1#(jw$853hK}a;t|i=dY>DgzgB_|YXm%1JMYqY?i0u-h%g+lOo(616gw3ov>$`h` ztCH7uw_x9-u8!^`Qzn$m%`Mx+Yj%qY*5SL!=7v?R*JHPu=1y#pl5DJQ?rPW) z)L_H24(_am?YCr~tt_%}OLN1Gtx0U|wRQv55EVpdb$xSdR|ts*8^W~Rn7pRBv1^O) zt>zwW)Y#`6DDwCU=>szDPdaU*Os9GVqY}wL^rOTF_7aXqzTy*PIK~Yax(c6w%P|CXlZUxF8 z9p7*YRvlAzNAa4Yk0`zY9ENrgaX3E33F%crmbljvhvSSWq_<@0w-JZ?JR6jiU$S!n zIhgi+B*Hz<4j`mIS8VBz2{ka=BwBj$ha~~Ve@^M!cn#@YA^jDla}t}S4~F!Uw4>o& zWJpg6S@gR|=`}g}Rfqart8|%vgz0BO`L`*(Q2O^NJ?^Go91G(=rgXeNlGU&HTOs{9 zrN7ywS7-HqMd@695A)ZPrJtl7@98eRHcP)q>2GoAS7qtfD!tOB-=3x4ru1suxrgbO zTsDs!EWi7dew!P=_!bdB`eRDx1AuJ&RA~R_l>QVucx(TXeI-`@D@y-kj{JWQ<)5Sj z1J_5h@oy@!@h?*P_j2e@hV*MKodaH&{*y=8__rzjs~kW=`u(MrexK5}<+P8kuzfsc z={fpm>-Td?zafWiDlqN$iqeZ+{fqxY^3N#w+`}lVdBMwa_vzB#30cMXCzERsq))*0 z3H*p#Cw&P5m6l%zPif=8r|={HB(8MQH{e=|bcst_LRk6~T;HT}W_dpkCv6qi2k|4n z-D6tX7_c6d6Xh)!oU~nB->>+XDlT;r_ysE8?vX8h3GlzikMiquux>z@?kfC8;AE}%0H&Kv~A#@RQVO}HT+Vh@cv2p zV;36S>VF6Li%^p7EPJ>y@X>ux?J&!IN#LaJ<65F}X8E28oU|ESzkr|QOF98_{vGM- zZGO*UCCS;XzVy7DXdpb#E^&s9JRb2HwTjh*tMUXZEmVZ+@ zW13&7`@lbrALR_Gp3-Lkd(PGeE%(!b(XnqN|CHKU`bgkEQTgr4Un$%{uvz)571v~f ze+Qj*u28+Tn1e6Cp2TB{YcmMAlMeBO;;aXBJllZyl!VMVChEnU9g*_567c79B{?&2 z!|^yoSl!$>D-px=p1G!)S169xFs zDOo4P)7m)u$)RTPq{docWs|Do$QvrQGTY&$J0{Z--fSkW7 zpwHhGzyasY7oQpC%P$u%^Wn=2==t3O{3{Fa^UIWDi{}MVq)#^{e}h1~O|;b@VAp5+ zpEH#X^92?7aRry|>xz?~ZGB3^yY))`O8hMUCNjcV`Inhs(4;u|*WhRQKjraXtNdSZ z_}PV8{xRg2&dT3xf;nf-xcOSg1mSpb^EKh%7l3BvzwF@WI{2TozbE-@2fuXz0&pB= zZC}W6wRV_3|BoD;PhM=gFFAP3!H-^u037AS@U#5q7QnA8fOi(aKUV;MvH<>a0sO>8 zP!7)5b5#Mnr2ziv0{FKJ;QvwpKThX8zCNFJ@OMLBYtIKA{9O+I7M-_I&Up@gzJt5< z%f3zT@EUapae1 zr{t%5k%PN(Y8-rpBj;WRclCeK!B;!{bvln>x(NsWn1j3aDbsn3ujgMCz%SqzP;lgb zKYrGp>ve)^`;$&G!9Aq3mLM#X=~>}(CB`uIPGvLepb%qZzDC^&wtJYgKHJ{`5)m8BOK)~#?Rh2EYkY{ z@~^|s%0I`!UAtX*3Yg%?e-3_@e{%u6vjE;#0Kc~Y{;v*xzLW0bry&4GePZ}oeO@Sl zUw1l~;K;uUKg<7@1@PiC$ep!wSf6P`2j{1lbSo66e7C$hJpLZ#PZi*Q)Z^zH{&W)s z_>=53;cWf4dfuQo^-17o^ZP&8DZ}~v-&EY^Pt)jd#9h1H&B+0rk5{e8kDq*D7LUPe z^?9`bzKV?#j`H~>wdJpKaJS$1XaW4b0yt&U(Y$Bk_YXQ>DJ2MJ@s#4)J%{*zD6ZW` zh<{b_3L{2v_J`J0tH;W>_$Ci;*KnPO4{12%;gcF3@bGrckd0^4wd)@{J$}1hGVI}Y zJ!Y4O+x43f54YPn@!R#4DF>(B)STwgIKq^(7(aVoJ_|n`aq{ah7aSl6 zXZd6F(CO9kpJ~v*K8Uvb_CCJM_lp`%$_wc2sZ-(hjz~V;;Ur`RzI-gDkK1DE`2;d;DCFqf0qB`R#h!u!A$*8s#5x zaPpUt2si2AgzA-l%E8HR*XN?})6v|-t&6G0;_Vu)^Y9@Jr#yU8!^0kK`>QbzxBbe--m^+h5grxb3e}9&Y=qVGpVSj^1P)2=t$_Q+_gKX!dO z=JDJ5U+3Yro~JzA*5_dlxAk_+!|giyl!x2(=0NMe)zhxWmlPi{f8J3?mM&O$^f8r@ zvek*pj*Xst>M3iMEvmTS+_T^E{&$>s!bKOx-+S@O*rn^<{I<82pLEXotKRhXCGURM zdsdvceCcuTd*^AVpK-iB0CIkghw8Q z=gRP)5IF!Pi-bpVg=%!jDM$gs=IA36-iUA*P0!>4lygRxP2U{Sh0vT+x+v8iKqRjh zm}9uY#7&TCNk%p#TkzapbTLQhmUQLJY^R&&v{r`9dOhY0^wO# z42V{pJcg{HC0Y1nC!}%sW1Mi*O;#Mw#Hrof+$BddAtCpm7jrgKRxc9s9nOSQdCn3p zU2QGSVK5tB&&f(zBPH!S3Ax7{X?3CHDchdjWy7X0q+m#1)zH;^Gtbtsbg5YqP{Xs< z@@)|u%qE=Ka_o?!wcI+^*v1o&V1aBMqdb9fPC)_-(~x>B)c=HYkRX$~!swzdTbk%* zYw8>VxlQ#IURdK2AlXBa!ZVQaA9h6h;Lx_tb{=CSnMUlxpMHd7vZo(0S~didnBN?X z1X9k)NT9Cgsbo0utkE+v57%-k5>FMf2N@MS*NDfU9Qt4*X3(wQ<{+d0^izqxjs97? zZZpv6-#6D8kA1Jx5_Ooh!C*an#B{kj#AE6^kBc>qD|7txUV@(v5jm96DifStXs%r5 zF>J6#9OTKnLhda^na`ApJ&*^ zzauf@{fuWY8?@Iuz(#+CVGsYVTW!22hlugmc=lS4j9b6Ux<%u=82vu)H7I;w?Y{kN z{BqAYHvd*GH}3RUgfwX%tZ3z;{aBPXzAe8#B%JR|qRCp50@upu7@yA9e;kSXx|1)( zMPRrU3(S@A-i4o^{w)|ITDxBVnMBK$pZA_OdL~hd3-jt?a?LrD$h^~@-GdnKw!fh> zfQBK`eiK*V3?REPYf3uBXsUjmdu%qYZ62_##Y9hiO< zGwx8kGeB{)t40Fyf%x659@wLu-Io|cEfT8ocB6_-zp1yUCC`U%KV&VR;j=u^)qK5c z<3Q(K*wT$(HsYJLRZx~+@h5ot2NxM|UPu|BU6I|@?dICv!R?jbL|T@Wjm)y9dN#vU z4g)@ye2O(34CO{fqG`v$D71>)<*~7`kWF`|nb;E*;A!(^o$m5s_NCz$HuzjAEGcRq zbBd|RXfoY%$mNx+3hkN{Z&Z{p!8HJR;G6 zP2;!kOr$TNi5UHZP3fvnHT7=)6im(%Y8sD!DnX-=xCz92K*Sz=kN5~9mxd1)BfBqc+50?ndNy(4WaRD`n6veR z8bo#{3Er;Dnv__?whgmu%ezr8R1%Jnp~UJgoC-DP zJ4jR07v$kS>sfqHkN@WDIjFWaN7;05{(_+nhF( zjt{ff0BP8M?)0SFd+b89XLg)wc|#~_loVBBzjz_IM2|7zmTXUoC6vQ3R}FKY8j~hJ z_m&(8DgC&72ge=d@2x|%F>%c|SkQQVMifb8giSscOJsyGf$!{{W|T+e-B~?V3%0ez zNPWcF0n!}(H6qoQ@0Z}yUwkjs$B|ArS*_2IZa{FZILwtWBYn;s!Ls*VJ}Cv*Av>5^ zC@Em~K{A;GaE9TNZO|+An{9LE-T{a{fZ95XFNbH*V9~1vGi&e%_$;c(D7|TZzXoZ` z@e(#X2uSaa4kaune8ClqftT?Ppx+U%e6D2A+zIz^MRGVdK+eQ7i7Z*cxmQHrYfH*CvHwxK@h(B-km7jagY=70y}0r7-7l>wnypMfnVv;HQFG$>8oO$LRc2k;x*apDLN>1W<9}G+ z@Q+nzJ-eQnIsw#dMqn3c7tGY+FExf;q(zlTC&czSq5D|rv47~2UW@F0cJB+Nq~S}^ zS0lS$-TN=W!aqiK{}Iq=x@TT$`-3njXZj{S^94Oc8sp2Cri@(u>fRU17GmQC3H%3y zhJjc1z7Q;Y)_h=!ZD0A0g%KtV#1U3dnKUb=*al^~Ke2LE!A@#3WI{NLizC@+nt2<2 zGWJ$}x{jTp#*jFj@?1+aJ+RLppbx><+10$6u`>J|`3TXQhZLk&R|tx)Yh7?fUe;;~ zc3VP55|QzW!x6R~_HMrqg~~<*0Nbo^53$k6gNu;Wr} z{tEUgBI?{^I1|5*2gyMD;xx`pxtIIb$_9Go;5@StbxDg$gf zJ|tS+al1iL;i^V6$ENYo^91Tb3W^WmI)Lj0zG6?=?ZM&`AA=3z0|Wev`YwH~sbVNk zA?cUXh%6iENdrPQr0K&FRYT#{id921x5(s!om^@$WZ@i1N;DlQ>x#QWwe8=`89ivu z-P2HFmit$rTZ0!rGew?X%3PWKB!r%kIT`lDct(c=Z0K_m%7~A$5fO4?Wl(K8bLB}e zLFB=`iTS6K^qEHzyvUXhqciN}LT)<^$B93{#uB|_QS5(p1X5*qI#b&JRJ!V0&aN4m z__yRs|7DOebA=HFR@u!2v)8>*LVFJ$!SBBN&7}MpK*0=e+9V0I&B*R68=;}kqU^kw zT_xDV;+yAm{FRw9cu}1=vz(pgyBq+`DXlr@(`5Jf#CRpuFWeLjtqGferMVXvf1fx2 zA=nGwYb$W2KIr0J6_xXV}l^fkQGnOK_AHFqMv9R5LZY-tE7`4h6>GXUBh+ z?tg&C8*q-0v7wA$IHTtKaxcj*?$b4s9P33J%nvwo>3=8U$OM3U{O+M_x`b{`tz2f_ zx&SX+jK}4vWn_1J|HV}w#F*CqL!_D=yC@38AL}$CPbw3KN#%=>mrZ5j;>+Vq)`KL%ZO`xj9{vXbc@%gN)Z%#l&-84AF5D-E+QhsocWNSSOxX-dcU zfOk*t!LqqW*3QcK{D)G_xf|*0xJ~*x6qY`|OB1#dAArQK?>JbRVwNrdu?f40BBjSd z2??Is0xh_1ur4MQDsxqW`{GG=IWlt!$S}kMH;x_EJBBSb$arN8`AOhDFMVZfrcF9J zn~UDRGX;A)sWK34hK~^C3F>GSo{1j(3lJd$+OXm(9Cc>Z4184*p0~eVZDY@p^ z<*3b*$n0Ynhj34KmzlNA%B*cn$lIsv>Vzo?X-;-^0@GIA;L`9SkC-(yS4~RCNK2Sm zs;ypc6^*fJGwEXNoQivaN)bwA_eA<>mTdZ|#6P?syNzTXHm&%Cuo%#pj8&$ez$LyX zo`!d?&-_?TrCy*QUu>f z^BFiy^Vys$Z^!lllg<+8hh&E?=F|8{Ki?Hc@ScmO=#dpA1V450k)+Pq#K)BR0*IDg zY8-KRYux`ZdL7CU4{Z7g3>SkpfJQ4M2F+$BhwfCqi7MmfANS=eWxo+^Lgzu6(3>)n zN)t90X-bQCrWaK`8yB61G|M_qqU>s9@54=}cUD$Ko-TA4lSUvA`A%V1l?h~cZoUU) zx1HVhHbGX=v$R1QTCvz5BT*9b*;Pk&57Jt3;d&oFG3 zK{|{oCqtF|#_Drx)&XkL`#7s=Db6>@>cvKaYIT4YucLOVxEuy{Xq)f@l5G1%6U6id zldhFGee0{N^Vm`6^$a3;igi~{1W+gQnzDD65%{-H0;LT1f4jz zaA`%3qD%&{$~Nq0u`tkAIZL+OITvXZ{wik6IeL5w|1k z_>R1GtY#`yP+NXID2*X?Dx-{ zw0B2SC@D;iX~+s4onLY%pQJgvL1!nQ!ewRx{1}vMk=Y^ zVCKCh?t#ND{rn6|G(Y3g50`ho&3O9PqiH;~%MJXs8+gDCd_4?6|Mk7kV>9=HIjsh7A!D1nJ1K~%M5etIT3}sn zKVyWmeaGM!^lVx4=*FC5i1my_cfB!OuF!%`jfr61@yd;iG$7u{nDsxAej8a>^f>Va zUd@&1-GHiYrdO3}r&)vgBdkYKmqft08Q+2B@@e;jTZAdln3#JPWp3`m`%(YiZXx%Q zGBa#@n}?Kfn`cgLn~FSqWfwb)^p)kfFo@;+ssm?VS&m&>4dJAm^;vVHhk1(CC6g%6 z)co$Or_(jR!}+4rZe`-6Nbf?>aUaKR)Z(*fYS(=ydj=*JTF2urQNVcI=6^O*iiZI> zvlM5O8X@Iow?hVy2C{)TXar~q_@ij1=0&EQjf9k0tCd`Wb55(KAyGuXBzBbr4D2#n zgca87zQgCacweS7;9t9w$~AatqwSW?=-SIShTEpBZfj|bnypO&`gNNVq!qd%HdMG3 z=HmRN+H}fb0)_u7`zGb6u+a<0_h1QYrA>DVnaVQz_l1Z z%o80q4{x6zS4vtbev5(=G4dZ%d{l5EL>*InOmJc=Y8^CV}_)c7hLEDAjU*q=x?EUqiyllj1cIYi|Ue_KtT*nLd=y3M1xk&T=S=^U} z^pbnSJwEJfAzR(}#am>Ljgx?}`=$E_7Jaw}$oI2*pa?Yxu4Eeu>FdKiMjlhT3{aL{ z{MAtYb4p*&Ye>H&q`#u{?_pgjq?bIohzutII!W8^i#h54EKL6*rGJldLitaI@~>6; z2Xp8(A^kR`b3PQtzg5U)4;ZC$G7!>>KW-R^<#F%DG$h|1CD)*C%AO7^D>x|=T<^w@ zcnnuMDN9_>QT}QyUC>Dx;mQG?{1s@AbW%3B-iIIYp`(cgftfUzcW{WOXizxGE3W(w zkocJ5l1E_2L;s>+K3czVOph*wANixoFE#~MulUe0@W4q~;=0c2uix}Z83F&5;&u8h zp_DCf-quilOyx+O0sbT9hgY1m1^D<40`-i6PPfxsf-_bBSq-BL5%+!kCI6TShVOta zQ90GP(j9Lu!PSblD_*WRA9z#FkmAb~PbogBcvSH};!6Ig>S^WtRPi#!%as2uDreS{ zL-HHnYlE|_T*ukV&YNG}S>?0C1K>ZlI9rai3*9@+1$E2phc>3+Gxf?Y z{cQZ~H-}iJ6Gxn7ZSk)nT{_~tL9qB1*oTfd)3W%_3*aSWg!B1tP~7Ti`;}WAetxcN zCE3+eZUR;Q5{G}x;a}?Dvkva&iwC68Q6F|qr!WB5?BQn_I7oRopLx?g=;4@V zi91L8YwAxKHecH~#=#Lk2S1C~aA_WnxU1)W?Z=6qjGyJdUHeDkt{sl%JArV-SqCit znTlKcSJMM`zQcb8!j`|&!Cg6no}6}-^BITVmGiQLyK>&7m7ID;ophHt_-PKlxd489 z0sMXkKi!e@Zw`KngMa>51mLKTTi^cP!Cn1da_}hPSi2p;*K*(}$JPJr0(h%~yZU_7 z!QFJ9QJiLHA3j76+EQq9;BLSA#{#%E_pqNgS_DB% zJ=9-S6Qs_=V;bJ#;Zxf04|%wqr;m8Jou`j_xSgkuIXJVjP{R`*uGKQ!n~?fz)`fGw z!_WRSsc^K0kVVi@pP+|KLE2sn63=lkUzKBjn7xH)&vwP(!3ZMe?Etvyp7ZtXej z;ntpG9&YV9<>7vQt)BLNC93(dxVL@l=@uH`3# zc|NSfM^jbZEtSnT2hJy!xsh7&T~mN{IrBxDelHi0rwLzn$v0(!)g;`WtnKLRXuzkG9kt2Uu8wWB zP0h)c##~x`SAAh3B4(p(y|s1=z6wja81pa(Y)#I^+LPy>R{-tAmz~(d*`}1u7QaDT zYc$5^bDi5-yS5}d`N<#lJH~d;^)0nqlla230oyaf6!L{=ZIvQw4t}3!^y9~D_A|Z~ zegoIi)^=leJ3pc1mz3F5?wp01AihOV_8vW0b6yz$nqWQPx4h5XicCJoH53zJ)G`DLlC2+Xoc%68q9#^3J|eEl~dem?yx zc+&^BMH8a_^YQcbzXcds)ZFkHHySlp-ebAW>TRzlK|kwv`F<32Ls`GidxMGJ?qxIB zuklB{2v&b9F^P!z^1t(3!y#VZe=k_RTnNjSpKm_>i`Ff=J-&WzaZy&I zBJ8G=4N3Cyhjq-ln0R8aMUlK~>Av2}^W~R~@xgVUaG7v=`zx8MSJG9lxUAu`K^G+d zb>BJ6=Jt@Rw>H6{_P3YzY}c+=W!IiB63x_(mcAxSzgFpTJ8J3cv-I1PUP%6ZhoCEI z&gIX6tEY2>7c$wn14t-ehsN#AHF8A5)vn?y% z^0B_UbvCB)EpF4P^YEyKQyw1E@UVy5d<09oWQMh|b|VJJq`)9t;Uy;?c8KHKmW@Z{^$E7X2H%E);6#