diff options
author | chai <chaifix@163.com> | 2021-10-30 13:28:39 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-30 13:28:39 +0800 |
commit | c3e259f4d29e9bdcb73617ad8e4d71f117b4d289 (patch) | |
tree | 893ed7b892d0b3b49db2d3e219da28fc2eea4769 /ThirdParty/freetype/src/autofit | |
parent | b2433cf2faf5c5c3d82d61c7b44928923c5fdcda (diff) |
+freetype
Diffstat (limited to 'ThirdParty/freetype/src/autofit')
41 files changed, 0 insertions, 20262 deletions
diff --git a/ThirdParty/freetype/src/autofit/Jamfile b/ThirdParty/freetype/src/autofit/Jamfile deleted file mode 100644 index ea69dee..0000000 --- a/ThirdParty/freetype/src/autofit/Jamfile +++ /dev/null @@ -1,53 +0,0 @@ -# FreeType 2 src/autofit Jamfile -# -# 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. - -SubDir FT2_TOP src autofit ; - -{ - local _sources ; - - # define FT2_AUTOFIT2 to enable experimental latin hinter replacement - if $(FT2_AUTOFIT2) - { - CCFLAGS += FT_OPTION_AUTOFIT2 ; - } - if $(FT2_MULTI) - { - _sources = afangles - afblue - afcjk - afdummy - afglobal - afhints - afindic - aflatin - afloader - afmodule - afpic - afranges - afshaper - afwarp - ; - - if $(FT2_AUTOFIT2) - { - _sources += aflatin2 ; - } - } - else - { - _sources = autofit ; - } - - Library $(FT2_LIB) : $(_sources).c ; -} - -# end of src/autofit Jamfile diff --git a/ThirdParty/freetype/src/autofit/afangles.c b/ThirdParty/freetype/src/autofit/afangles.c deleted file mode 100644 index 9e1f7a2..0000000 --- a/ThirdParty/freetype/src/autofit/afangles.c +++ /dev/null @@ -1,285 +0,0 @@ -/**************************************************************************** - * - * afangles.c - * - * Routines used to compute vector angles with limited accuracy - * and very high speed. It also contains sorting routines (body). - * - * 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. - * - */ - - -#include "aftypes.h" - - - /* - * We are not using `af_angle_atan' anymore, but we keep the source - * code below just in case... - */ - - -#if 0 - - - /* - * The trick here is to realize that we don't need a very accurate angle - * approximation. We are going to use the result of `af_angle_atan' to - * only compare the sign of angle differences, or check whether its - * magnitude is very small. - * - * The approximation - * - * dy * PI / (|dx|+|dy|) - * - * should be enough, and much faster to compute. - */ - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - FT_Fixed ax = dx; - FT_Fixed ay = dy; - - - if ( ax < 0 ) - ax = -ax; - if ( ay < 0 ) - ay = -ay; - - ax += ay; - - if ( ax == 0 ) - angle = 0; - else - { - angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); - if ( dx < 0 ) - { - if ( angle >= 0 ) - angle = AF_ANGLE_PI - angle; - else - angle = -AF_ANGLE_PI - angle; - } - } - - return angle; - } - - -#elif 0 - - - /* the following table has been automatically generated with */ - /* the `mather.py' Python script */ - -#define AF_ATAN_BITS 8 - - static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = - { - 0, 0, 1, 1, 1, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 5, - 5, 5, 6, 6, 6, 7, 7, 7, - 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 12, 12, 12, - 13, 13, 13, 14, 14, 14, 14, 15, - 15, 15, 16, 16, 16, 17, 17, 17, - 18, 18, 18, 18, 19, 19, 19, 20, - 20, 20, 21, 21, 21, 21, 22, 22, - 22, 23, 23, 23, 24, 24, 24, 24, - 25, 25, 25, 26, 26, 26, 26, 27, - 27, 27, 28, 28, 28, 28, 29, 29, - 29, 30, 30, 30, 30, 31, 31, 31, - 31, 32, 32, 32, 33, 33, 33, 33, - 34, 34, 34, 34, 35, 35, 35, 35, - 36, 36, 36, 36, 37, 37, 37, 38, - 38, 38, 38, 39, 39, 39, 39, 40, - 40, 40, 40, 41, 41, 41, 41, 42, - 42, 42, 42, 42, 43, 43, 43, 43, - 44, 44, 44, 44, 45, 45, 45, 45, - 46, 46, 46, 46, 46, 47, 47, 47, - 47, 48, 48, 48, 48, 48, 49, 49, - 49, 49, 50, 50, 50, 50, 50, 51, - 51, 51, 51, 51, 52, 52, 52, 52, - 52, 53, 53, 53, 53, 53, 54, 54, - 54, 54, 54, 55, 55, 55, 55, 55, - 56, 56, 56, 56, 56, 57, 57, 57, - 57, 57, 57, 58, 58, 58, 58, 58, - 59, 59, 59, 59, 59, 59, 60, 60, - 60, 60, 60, 61, 61, 61, 61, 61, - 61, 62, 62, 62, 62, 62, 62, 63, - 63, 63, 63, 63, 63, 64, 64, 64 - }; - - - FT_LOCAL_DEF( AF_Angle ) - af_angle_atan( FT_Fixed dx, - FT_Fixed dy ) - { - AF_Angle angle; - - - /* check trivial cases */ - if ( dy == 0 ) - { - angle = 0; - if ( dx < 0 ) - angle = AF_ANGLE_PI; - return angle; - } - else if ( dx == 0 ) - { - angle = AF_ANGLE_PI2; - if ( dy < 0 ) - angle = -AF_ANGLE_PI2; - return angle; - } - - angle = 0; - if ( dx < 0 ) - { - dx = -dx; - dy = -dy; - angle = AF_ANGLE_PI; - } - - if ( dy < 0 ) - { - FT_Pos tmp; - - - tmp = dx; - dx = -dy; - dy = tmp; - angle -= AF_ANGLE_PI2; - } - - if ( dx == 0 && dy == 0 ) - return 0; - - if ( dx == dy ) - angle += AF_ANGLE_PI4; - else if ( dx > dy ) - angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; - else - angle += AF_ANGLE_PI2 - - af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; - - if ( angle > AF_ANGLE_PI ) - angle -= AF_ANGLE_2PI; - - return angle; - } - - -#endif /* 0 */ - - - FT_LOCAL_DEF( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ) - { - FT_UInt i, j; - FT_Pos swap; - - - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j] >= table[j - 1] ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - - FT_LOCAL_DEF( void ) - af_sort_and_quantize_widths( FT_UInt* count, - AF_Width table, - FT_Pos threshold ) - { - FT_UInt i, j; - FT_UInt cur_idx; - FT_Pos cur_val; - FT_Pos sum; - AF_WidthRec swap; - - - if ( *count == 1 ) - return; - - /* sort */ - for ( i = 1; i < *count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - if ( table[j].org >= table[j - 1].org ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - - cur_idx = 0; - cur_val = table[cur_idx].org; - - /* compute and use mean values for clusters not larger than */ - /* `threshold'; this is very primitive and might not yield */ - /* the best result, but normally, using reference character */ - /* `o', `*count' is 2, so the code below is fully sufficient */ - for ( i = 1; i < *count; i++ ) - { - if ( table[i].org - cur_val > threshold || - i == *count - 1 ) - { - sum = 0; - - /* fix loop for end of array */ - if ( table[i].org - cur_val <= threshold && - i == *count - 1 ) - i++; - - for ( j = cur_idx; j < i; j++ ) - { - sum += table[j].org; - table[j].org = 0; - } - table[cur_idx].org = sum / (FT_Pos)j; - - if ( i < *count - 1 ) - { - cur_idx = i + 1; - cur_val = table[cur_idx].org; - } - } - } - - cur_idx = 1; - - /* compress array to remove zero values */ - for ( i = 1; i < *count; i++ ) - { - if ( table[i].org ) - table[cur_idx++] = table[i]; - } - - *count = cur_idx; - } - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afangles.h b/ThirdParty/freetype/src/autofit/afangles.h deleted file mode 100644 index 18d7dae..0000000 --- a/ThirdParty/freetype/src/autofit/afangles.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * afangles.h - * - * This is a dummy file, used to please the build system. It is never - * included by the auto-fitter sources. - * - */ diff --git a/ThirdParty/freetype/src/autofit/afblue.c b/ThirdParty/freetype/src/autofit/afblue.c deleted file mode 100644 index 28da159..0000000 --- a/ThirdParty/freetype/src/autofit/afblue.c +++ /dev/null @@ -1,739 +0,0 @@ -/* This file has been generated by the Perl script `afblue.pl', */ -/* using data from file `afblue.dat'. */ - -/**************************************************************************** - * - * afblue.c - * - * Auto-fitter data for blue strings (body). - * - * Copyright (C) 2013-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. - * - */ - - -#include "aftypes.h" - - - FT_LOCAL_ARRAY_DEF( char ) - af_blue_strings[] = - { - /* */ - '\xF0', '\x9E', '\xA4', '\x8C', ' ', '\xF0', '\x9E', '\xA4', '\x85', ' ', '\xF0', '\x9E', '\xA4', '\x88', ' ', '\xF0', '\x9E', '\xA4', '\x8F', ' ', '\xF0', '\x9E', '\xA4', '\x94', ' ', '\xF0', '\x9E', '\xA4', '\x9A', /* 𞤌 𞤅 𞤈 𞤏 𞤔 𞤚 */ - '\0', - '\xF0', '\x9E', '\xA4', '\x82', ' ', '\xF0', '\x9E', '\xA4', '\x96', /* 𞤂 𞤖 */ - '\0', - '\xF0', '\x9E', '\xA4', '\xAC', ' ', '\xF0', '\x9E', '\xA4', '\xAE', ' ', '\xF0', '\x9E', '\xA4', '\xBB', ' ', '\xF0', '\x9E', '\xA4', '\xBC', ' ', '\xF0', '\x9E', '\xA4', '\xBE', /* 𞤬 𞤮 𞤻 𞤼 𞤾 */ - '\0', - '\xF0', '\x9E', '\xA4', '\xA4', ' ', '\xF0', '\x9E', '\xA4', '\xA8', ' ', '\xF0', '\x9E', '\xA4', '\xA9', ' ', '\xF0', '\x9E', '\xA4', '\xAD', ' ', '\xF0', '\x9E', '\xA4', '\xB4', ' ', '\xF0', '\x9E', '\xA4', '\xB8', ' ', '\xF0', '\x9E', '\xA4', '\xBA', ' ', '\xF0', '\x9E', '\xA5', '\x80', /* 𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀 */ - '\0', - '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', /* ا إ ل ك ط ظ */ - '\0', - '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83', /* ت ث ط ظ ك */ - '\0', - '\xD9', '\x80', /* ـ */ - '\0', - '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x8D', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95', /* Ա Մ Ւ Ս Բ Գ Դ Օ */ - '\0', - '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95', /* Ւ Ո Դ Ճ Շ Ս Տ Օ */ - '\0', - '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x86', ' ', '\xD5', '\xB3', /* ե է ի մ վ ֆ ճ */ - '\0', - '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xB7', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85', /* ա յ ւ ս գ շ ր օ */ - '\0', - '\xD5', '\xB0', ' ', '\xD5', '\xB8', ' ', '\xD5', '\xB3', ' ', '\xD5', '\xA1', ' ', '\xD5', '\xA5', ' ', '\xD5', '\xAE', ' ', '\xD5', '\xBD', ' ', '\xD6', '\x85', /* հ ո ճ ա ե ծ ս օ */ - '\0', - '\xD5', '\xA2', ' ', '\xD5', '\xA8', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xAC', ' ', '\xD5', '\xB2', ' ', '\xD5', '\xBA', ' ', '\xD6', '\x83', ' ', '\xD6', '\x81', /* բ ը ի լ ղ պ փ ց */ - '\0', - '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', ' ', '\xF0', '\x90', '\xAC', '\x90', ' ', '\xF0', '\x90', '\xAC', '\x9B', /* 𐬀 𐬁 𐬐 𐬛 */ - '\0', - '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', /* 𐬀 𐬁 */ - '\0', - '\xEA', '\x9A', '\xA7', ' ', '\xEA', '\x9A', '\xA8', ' ', '\xEA', '\x9B', '\x9B', ' ', '\xEA', '\x9B', '\x89', ' ', '\xEA', '\x9B', '\x81', ' ', '\xEA', '\x9B', '\x88', ' ', '\xEA', '\x9B', '\xAB', ' ', '\xEA', '\x9B', '\xAF', /* ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ */ - '\0', - '\xEA', '\x9A', '\xAD', ' ', '\xEA', '\x9A', '\xB3', ' ', '\xEA', '\x9A', '\xB6', ' ', '\xEA', '\x9B', '\xAC', ' ', '\xEA', '\x9A', '\xA2', ' ', '\xEA', '\x9A', '\xBD', ' ', '\xEA', '\x9B', '\xAF', ' ', '\xEA', '\x9B', '\xB2', /* ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲ */ - '\0', - '\xE0', '\xA6', '\x85', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xAD', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* অ ড ত ন ব ভ ল ক */ - '\0', - '\xE0', '\xA6', '\x87', ' ', '\xE0', '\xA6', '\x9F', ' ', '\xE0', '\xA6', '\xA0', ' ', '\xE0', '\xA6', '\xBF', ' ', '\xE0', '\xA7', '\x80', ' ', '\xE0', '\xA7', '\x88', ' ', '\xE0', '\xA7', '\x97', /* ই ট ঠ ি ী ৈ ৗ */ - '\0', - '\xE0', '\xA6', '\x93', ' ', '\xE0', '\xA6', '\x8F', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* ও এ ড ত ন ব ল ক */ - '\0', - '\xE1', '\x9D', '\x90', ' ', '\xE1', '\x9D', '\x88', /* ᝐ ᝈ */ - '\0', - '\xE1', '\x9D', '\x85', ' ', '\xE1', '\x9D', '\x8A', ' ', '\xE1', '\x9D', '\x8E', /* ᝅ ᝊ ᝎ */ - '\0', - '\xE1', '\x9D', '\x82', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8C', /* ᝂ ᝃ ᝉ ᝌ */ - '\0', - '\xE1', '\x9D', '\x80', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x86', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8B', ' ', '\xE1', '\x9D', '\x8F', ' ', '\xE1', '\x9D', '\x91', /* ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ */ - '\0', - '\xE1', '\x97', '\x9C', ' ', '\xE1', '\x96', '\xB4', ' ', '\xE1', '\x90', '\x81', ' ', '\xE1', '\x92', '\xA3', ' ', '\xE1', '\x91', '\xAB', ' ', '\xE1', '\x91', '\x8E', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xB0', /* ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ */ - '\0', - '\xE1', '\x97', '\xB6', ' ', '\xE1', '\x96', '\xB5', ' ', '\xE1', '\x92', '\xA7', ' ', '\xE1', '\x90', '\x83', ' ', '\xE1', '\x91', '\x8C', ' ', '\xE1', '\x92', '\x8D', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xA2', /* ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ */ - '\0', - '\xE1', '\x93', '\x93', ' ', '\xE1', '\x93', '\x95', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x84', ' ', '\xE1', '\x95', '\x84', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ */ - '\0', - '\xE1', '\x95', '\x83', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x95', '\x82', ' ', '\xE1', '\x93', '\x97', ' ', '\xE1', '\x93', '\x9A', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ */ - '\0', - '\xE1', '\x90', '\xAA', ' ', '\xE1', '\x99', '\x86', ' ', '\xE1', '\xA3', '\x98', ' ', '\xE1', '\x90', '\xA2', ' ', '\xE1', '\x92', '\xBE', ' ', '\xE1', '\xA3', '\x97', ' ', '\xE1', '\x94', '\x86', /* ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ */ - '\0', - '\xE1', '\x99', '\x86', ' ', '\xE1', '\x97', '\xAE', ' ', '\xE1', '\x92', '\xBB', ' ', '\xE1', '\x90', '\x9E', ' ', '\xE1', '\x94', '\x86', ' ', '\xE1', '\x92', '\xA1', ' ', '\xE1', '\x92', '\xA2', ' ', '\xE1', '\x93', '\x91', /* ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ */ - '\0', - '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xAC', ' ', '\xF0', '\x90', '\x8A', '\xAD', ' ', '\xF0', '\x90', '\x8A', '\xB1', ' ', '\xF0', '\x90', '\x8A', '\xBA', ' ', '\xF0', '\x90', '\x8A', '\xBC', ' ', '\xF0', '\x90', '\x8A', '\xBF', /* 𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿 */ - '\0', - '\xF0', '\x90', '\x8A', '\xA3', ' ', '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xB7', ' ', '\xF0', '\x90', '\x8B', '\x80', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xB8', ' ', '\xF0', '\x90', '\x8B', '\x89', /* 𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉 */ - '\0', - '\xF0', '\x91', '\x84', '\x83', ' ', '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x89', ' ', '\xF0', '\x91', '\x84', '\x99', ' ', '\xF0', '\x91', '\x84', '\x97', /* 𑄃 𑄅 𑄉 𑄙 𑄗 */ - '\0', - '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x9B', ' ', '\xF0', '\x91', '\x84', '\x9D', ' ', '\xF0', '\x91', '\x84', '\x97', ' ', '\xF0', '\x91', '\x84', '\x93', /* 𑄅 𑄛 𑄝 𑄗 𑄓 */ - '\0', - '\xF0', '\x91', '\x84', '\x96', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x98', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x99', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA4', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA5', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', /* 𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢 */ - '\0', - '\xE1', '\x8F', '\x86', ' ', '\xE1', '\x8E', '\xBB', ' ', '\xE1', '\x8E', '\xAC', ' ', '\xE1', '\x8F', '\x83', ' ', '\xE1', '\x8E', '\xA4', ' ', '\xE1', '\x8F', '\xA3', ' ', '\xE1', '\x8E', '\xA6', ' ', '\xE1', '\x8F', '\x95', /* Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ */ - '\0', - '\xEA', '\xAE', '\x92', ' ', '\xEA', '\xAE', '\xA4', ' ', '\xEA', '\xAE', '\xB6', ' ', '\xEA', '\xAD', '\xB4', ' ', '\xEA', '\xAD', '\xBE', ' ', '\xEA', '\xAE', '\x97', ' ', '\xEA', '\xAE', '\x9D', ' ', '\xEA', '\xAE', '\xBF', /* ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ */ - '\0', - '\xEA', '\xAE', '\x96', ' ', '\xEA', '\xAD', '\xBC', ' ', '\xEA', '\xAE', '\x93', ' ', '\xEA', '\xAE', '\xA0', ' ', '\xEA', '\xAE', '\xB3', ' ', '\xEA', '\xAD', '\xB6', ' ', '\xEA', '\xAE', '\xA5', ' ', '\xEA', '\xAE', '\xBB', /* ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ */ - '\0', - '\xE1', '\x8F', '\xB8', ' ', '\xEA', '\xAE', '\x90', ' ', '\xEA', '\xAD', '\xB9', ' ', '\xEA', '\xAD', '\xBB', /* ᏸ ꮐ ꭹ ꭻ */ - '\0', - '\xE2', '\xB2', '\x8C', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\xA0', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB2', '\xA4', ' ', '\xE2', '\xB3', '\x8A', /* Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ */ - '\0', - '\xE2', '\xB3', '\x90', ' ', '\xE2', '\xB3', '\x98', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB3', '\x9C', ' ', '\xE2', '\xB2', '\xB0', /* Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ */ - '\0', - '\xE2', '\xB2', '\x8D', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\xA1', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB2', '\xA5', ' ', '\xE2', '\xB3', '\x8B', /* ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ */ - '\0', - '\xE2', '\xB3', '\x91', ' ', '\xE2', '\xB3', '\x99', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB3', '\x9D', ' ', '\xE2', '\xB3', '\x92', /* ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ */ - '\0', - '\xF0', '\x90', '\xA0', '\x8D', ' ', '\xF0', '\x90', '\xA0', '\x99', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB1', ' ', '\xF0', '\x90', '\xA0', '\x85', ' ', '\xF0', '\x90', '\xA0', '\x93', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xA6', /* 𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦 */ - '\0', - '\xF0', '\x90', '\xA0', '\x83', ' ', '\xF0', '\x90', '\xA0', '\x8A', ' ', '\xF0', '\x90', '\xA0', '\x9B', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB5', ' ', '\xF0', '\x90', '\xA0', '\x90', /* 𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐 */ - '\0', - '\xF0', '\x90', '\xA0', '\x88', ' ', '\xF0', '\x90', '\xA0', '\x8F', ' ', '\xF0', '\x90', '\xA0', '\x96', /* 𐠈 𐠏 𐠖 */ - '\0', - '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е П З О С Э */ - '\0', - '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е Ш З О С Э */ - '\0', - '\xD1', '\x85', ' ', '\xD0', '\xBF', ' ', '\xD0', '\xBD', ' ', '\xD1', '\x88', ' ', '\xD0', '\xB5', ' ', '\xD0', '\xB7', ' ', '\xD0', '\xBE', ' ', '\xD1', '\x81', /* х п н ш е з о с */ - '\0', - '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84', /* р у ф */ - '\0', - '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x8B', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x91', /* 𐐂 𐐄 𐐋 𐐗 𐐑 */ - '\0', - '\xF0', '\x90', '\x90', '\x80', ' ', '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x9B', /* 𐐀 𐐂 𐐄 𐐗 𐐛 */ - '\0', - '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xB3', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x90', '\xB9', /* 𐐪 𐐬 𐐳 𐐿 𐐹 */ - '\0', - '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83', /* 𐐨 𐐪 𐐬 𐐿 𐑃 */ - '\0', - '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ - '\0', - '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */ - '\0', - '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ - '\0', - '\xE0', '\xA5', '\x81', ' ', '\xE0', '\xA5', '\x83', /* ु ृ */ - '\0', - '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\x83', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x8D', '\x90', ' ', '\xE1', '\x88', '\x9B', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x8B', ' ', '\xE1', '\x8B', '\x90', /* ሀ ሃ ዘ ፐ ማ በ ዋ ዐ */ - '\0', - '\xE1', '\x88', '\x88', ' ', '\xE1', '\x88', '\x90', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\xAA', ' ', '\xE1', '\x8B', '\x90', ' ', '\xE1', '\x8C', '\xA8', /* ለ ሐ በ ዘ ሀ ሪ ዐ ጨ */ - '\0', - '\xE1', '\x83', '\x92', ' ', '\xE1', '\x83', '\x93', ' ', '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x97', ' ', '\xE1', '\x83', '\x98', ' ', '\xE1', '\x83', '\x9D', ' ', '\xE1', '\x83', '\xA6', /* გ დ ე ვ თ ი ო ღ */ - '\0', - '\xE1', '\x83', '\x90', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xAB', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\x9E', /* ა ზ მ ს შ ძ ხ პ */ - '\0', - '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xA9', ' ', '\xE1', '\x83', '\xAC', /* ს ხ ქ ზ მ შ ჩ წ */ - '\0', - '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x9F', ' ', '\xE1', '\x83', '\xA2', ' ', '\xE1', '\x83', '\xA3', ' ', '\xE1', '\x83', '\xA4', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\xA7', /* ე ვ ჟ ტ უ ფ ქ ყ */ - '\0', - '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xB9', ' ', '\xE1', '\x82', '\xBC', ' ', '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xB3', ' ', '\xE1', '\x82', '\xBA', /* Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ */ - '\0', - '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xA8', ' ', '\xE1', '\x82', '\xA6', ' ', '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xAA', ' ', '\xE1', '\x82', '\xAB', /* Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ */ - '\0', - '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x97', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x87', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x96', /* ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ */ - '\0', - '\xE2', '\xB4', '\x88', ' ', '\xE2', '\xB4', '\x8C', ' ', '\xE2', '\xB4', '\x96', ' ', '\xE2', '\xB4', '\x8E', ' ', '\xE2', '\xB4', '\x83', ' ', '\xE2', '\xB4', '\x86', ' ', '\xE2', '\xB4', '\x8B', ' ', '\xE2', '\xB4', '\xA2', /* ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ */ - '\0', - '\xE2', '\xB4', '\x90', ' ', '\xE2', '\xB4', '\x91', ' ', '\xE2', '\xB4', '\x93', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x99', ' ', '\xE2', '\xB4', '\x9B', ' ', '\xE2', '\xB4', '\xA1', ' ', '\xE2', '\xB4', '\xA3', /* ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ */ - '\0', - '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x98', ' ', '\xE2', '\xB4', '\x9D', /* ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ */ - '\0', - '\xE1', '\xB2', '\x9C', ' ', '\xE1', '\xB2', '\x9F', ' ', '\xE1', '\xB2', '\xB3', ' ', '\xE1', '\xB2', '\xB8', ' ', '\xE1', '\xB2', '\x92', ' ', '\xE1', '\xB2', '\x94', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xB4', /* Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ */ - '\0', - '\xE1', '\xB2', '\x98', ' ', '\xE1', '\xB2', '\xB2', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xA9', ' ', '\xE1', '\xB2', '\x9B', ' ', '\xE1', '\xB2', '\xA8', ' ', '\xE1', '\xB2', '\xAF', ' ', '\xE1', '\xB2', '\xBD', /* Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ */ - '\0', - '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x94', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\xAB', ' ', '\xE2', '\xB0', '\x8B', /* Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ */ - '\0', - '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x9E', ' ', '\xE2', '\xB0', '\xA1', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\x94', /* Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ */ - '\0', - '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB1', '\x84', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x9B', ' ', '\xE2', '\xB0', '\xBB', /* ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ */ - '\0', - '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB1', '\x8E', ' ', '\xE2', '\xB1', '\x91', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x84', /* ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ */ - '\0', - '\xF0', '\x90', '\x8C', '\xB2', ' ', '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8D', '\x80', ' ', '\xF0', '\x90', '\x8D', '\x84', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', ' ', '\xF0', '\x90', '\x8C', '\xBE', /* 𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾 */ - '\0', - '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', /* 𐌶 𐌴 𐍃 𐍈 */ - '\0', - '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9', /* Γ Β Ε Ζ Θ Ο Ω */ - '\0', - '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', /* Β Δ Ζ Ξ Θ Ο */ - '\0', - '\xCE', '\xB2', ' ', '\xCE', '\xB8', ' ', '\xCE', '\xB4', ' ', '\xCE', '\xB6', ' ', '\xCE', '\xBB', ' ', '\xCE', '\xBE', /* β θ δ ζ λ ξ */ - '\0', - '\xCE', '\xB1', ' ', '\xCE', '\xB5', ' ', '\xCE', '\xB9', ' ', '\xCE', '\xBF', ' ', '\xCF', '\x80', ' ', '\xCF', '\x83', ' ', '\xCF', '\x84', ' ', '\xCF', '\x89', /* α ε ι ο π σ τ ω */ - '\0', - '\xCE', '\xB2', ' ', '\xCE', '\xB3', ' ', '\xCE', '\xB7', ' ', '\xCE', '\xBC', ' ', '\xCF', '\x81', ' ', '\xCF', '\x86', ' ', '\xCF', '\x87', ' ', '\xCF', '\x88', /* β γ η μ ρ φ χ ψ */ - '\0', - '\xE0', '\xAA', '\xA4', ' ', '\xE0', '\xAA', '\xA8', ' ', '\xE0', '\xAA', '\x8B', ' ', '\xE0', '\xAA', '\x8C', ' ', '\xE0', '\xAA', '\x9B', ' ', '\xE0', '\xAA', '\x9F', ' ', '\xE0', '\xAA', '\xB0', ' ', '\xE0', '\xAB', '\xA6', /* ત ન ઋ ઌ છ ટ ર ૦ */ - '\0', - '\xE0', '\xAA', '\x96', ' ', '\xE0', '\xAA', '\x97', ' ', '\xE0', '\xAA', '\x98', ' ', '\xE0', '\xAA', '\x9E', ' ', '\xE0', '\xAA', '\x87', ' ', '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\xA0', ' ', '\xE0', '\xAA', '\x9C', /* ખ ગ ઘ ઞ ઇ ઈ ઠ જ */ - '\0', - '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\x8A', ' ', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB2', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB6', '\xE0', '\xAB', '\x8D', '\xE0', '\xAA', '\x9A', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\x9C', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\xB8', '\xE0', '\xAB', '\x80', /* ઈ ઊ િ ી લી શ્ચિ જિ સી */ - '\0', - '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAB', '\x84', ' ', '\xE0', '\xAA', '\x96', '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x84', /* ુ ૃ ૄ ખુ છૃ છૄ */ - '\0', - '\xE0', '\xAB', '\xA6', ' ', '\xE0', '\xAB', '\xA7', ' ', '\xE0', '\xAB', '\xA8', ' ', '\xE0', '\xAB', '\xA9', ' ', '\xE0', '\xAB', '\xAD', /* ૦ ૧ ૨ ૩ ૭ */ - '\0', - '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ - '\0', - '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ - '\0', - '\xE0', '\xA8', '\x87', ' ', '\xE0', '\xA8', '\x88', ' ', '\xE0', '\xA8', '\x89', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA9', '\xB3', ' ', '\xE0', '\xA8', '\xBF', ' ', '\xE0', '\xA9', '\x80', /* ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ */ - '\0', - '\xE0', '\xA8', '\x85', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA0', ' ', '\xE0', '\xA8', '\xB0', ' ', '\xE0', '\xA8', '\xB8', /* ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ */ - '\0', - '\xE0', '\xA9', '\xA6', ' ', '\xE0', '\xA9', '\xA7', ' ', '\xE0', '\xA9', '\xA8', ' ', '\xE0', '\xA9', '\xA9', ' ', '\xE0', '\xA9', '\xAD', /* ੦ ੧ ੨ ੩ ੭ */ - '\0', - '\xD7', '\x91', ' ', '\xD7', '\x93', ' ', '\xD7', '\x94', ' ', '\xD7', '\x97', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', /* ב ד ה ח ך כ ם ס */ - '\0', - '\xD7', '\x91', ' ', '\xD7', '\x98', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', ' ', '\xD7', '\xA6', /* ב ט כ ם ס צ */ - '\0', - '\xD7', '\xA7', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9F', ' ', '\xD7', '\xA3', ' ', '\xD7', '\xA5', /* ק ך ן ף ץ */ - '\0', - '\xE0', '\xB2', '\x87', ' ', '\xE0', '\xB2', '\x8A', ' ', '\xE0', '\xB2', '\x90', ' ', '\xE0', '\xB2', '\xA3', ' ', '\xE0', '\xB2', '\xB8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA6', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xB0', '\xE0', '\xB2', '\xBE', /* ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ */ - '\0', - '\xE0', '\xB2', '\x85', ' ', '\xE0', '\xB2', '\x89', ' ', '\xE0', '\xB2', '\x8E', ' ', '\xE0', '\xB2', '\xB2', ' ', '\xE0', '\xB3', '\xA6', ' ', '\xE0', '\xB3', '\xA8', ' ', '\xE0', '\xB3', '\xAC', ' ', '\xE0', '\xB3', '\xAD', /* ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭ */ - '\0', - '\xEA', '\xA4', '\x85', ' ', '\xEA', '\xA4', '\x8F', ' ', '\xEA', '\xA4', '\x81', ' ', '\xEA', '\xA4', '\x8B', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', /* ꤅ ꤏ ꤁ ꤋ ꤀ ꤍ */ - '\0', - '\xEA', '\xA4', '\x88', ' ', '\xEA', '\xA4', '\x98', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', ' ', '\xEA', '\xA4', '\xA2', /* ꤈ ꤘ ꤀ ꤍ ꤢ */ - '\0', - '\xEA', '\xA4', '\x96', ' ', '\xEA', '\xA4', '\xA1', /* ꤖ ꤡ */ - '\0', - '\xEA', '\xA4', '\x91', ' ', '\xEA', '\xA4', '\x9C', ' ', '\xEA', '\xA4', '\x9E', /* ꤑ ꤜ ꤞ */ - '\0', - '\xEA', '\xA4', '\x91', '\xEA', '\xA4', '\xAC', ' ', '\xEA', '\xA4', '\x9C', '\xEA', '\xA4', '\xAD', ' ', '\xEA', '\xA4', '\x94', '\xEA', '\xA4', '\xAC', /* ꤑ꤬ ꤜ꤭ ꤔ꤬ */ - '\0', - '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x91', ' ', '\xE1', '\x9E', '\x93', ' ', '\xE1', '\x9E', '\xA7', ' ', '\xE1', '\x9E', '\xA9', ' ', '\xE1', '\x9E', '\xB6', /* ខ ទ ន ឧ ឩ ា */ - '\0', - '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x80', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x82', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x90', /* ក្ក ក្ខ ក្គ ក្ថ */ - '\0', - '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x83', ' ', '\xE1', '\x9E', '\x85', ' ', '\xE1', '\x9E', '\x8B', ' ', '\xE1', '\x9E', '\x94', ' ', '\xE1', '\x9E', '\x98', ' ', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xB2', /* ខ ឃ ច ឋ ប ម យ ឲ */ - '\0', - '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', ' ', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\xB2', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xA2', '\xE1', '\x9E', '\xBF', /* ត្រ រៀ ឲ្យ អឿ */ - '\0', - '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x83', ' ', '\xE1', '\x9E', '\x84', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x85', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9E', '\xBF', ' ', '\xE1', '\x9E', '\x9B', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9E', '\xBF', /* ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ */ - '\0', - '\xE1', '\xA7', '\xA0', ' ', '\xE1', '\xA7', '\xA1', /* ᧠ ᧡ */ - '\0', - '\xE1', '\xA7', '\xB6', ' ', '\xE1', '\xA7', '\xB9', /* ᧶ ᧹ */ - '\0', - '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\x94', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\xA1', ' ', '\xE0', '\xBA', '\xA5', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\x87', /* າ ດ ອ ມ ລ ວ ຣ ງ */ - '\0', - '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\x9A', ' ', '\xE0', '\xBA', '\x8D', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\xAE', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA2', /* າ ອ ບ ຍ ຣ ຮ ວ ຢ */ - '\0', - '\xE0', '\xBA', '\x9B', ' ', '\xE0', '\xBA', '\xA2', ' ', '\xE0', '\xBA', '\x9F', ' ', '\xE0', '\xBA', '\x9D', /* ປ ຢ ຟ ຝ */ - '\0', - '\xE0', '\xBB', '\x82', ' ', '\xE0', '\xBB', '\x84', ' ', '\xE0', '\xBB', '\x83', /* ໂ ໄ ໃ */ - '\0', - '\xE0', '\xBA', '\x87', ' ', '\xE0', '\xBA', '\x8A', ' ', '\xE0', '\xBA', '\x96', ' ', '\xE0', '\xBA', '\xBD', ' ', '\xE0', '\xBB', '\x86', ' ', '\xE0', '\xBA', '\xAF', /* ງ ຊ ຖ ຽ ໆ ຯ */ - '\0', - 'T', ' ', 'H', ' ', 'E', ' ', 'Z', ' ', 'O', ' ', 'C', ' ', 'Q', ' ', 'S', /* T H E Z O C Q S */ - '\0', - 'H', ' ', 'E', ' ', 'Z', ' ', 'L', ' ', 'O', ' ', 'C', ' ', 'U', ' ', 'S', /* H E Z L O C U S */ - '\0', - 'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h', /* f i j k d b h */ - '\0', - 'u', ' ', 'v', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* u v x z o e s c */ - '\0', - 'n', ' ', 'r', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* n r x z o e s c */ - '\0', - 'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y', /* p q g j y */ - '\0', - '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x85', ' ', '\xE2', '\x82', '\x87', ' ', '\xE2', '\x82', '\x88', /* ₀ ₃ ₅ ₇ ₈ */ - '\0', - '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x81', ' ', '\xE2', '\x82', '\x82', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x88', /* ₀ ₁ ₂ ₃ ₈ */ - '\0', - '\xE1', '\xB5', '\xA2', ' ', '\xE2', '\xB1', '\xBC', ' ', '\xE2', '\x82', '\x95', ' ', '\xE2', '\x82', '\x96', ' ', '\xE2', '\x82', '\x97', /* ᵢ ⱼ ₕ ₖ ₗ */ - '\0', - '\xE2', '\x82', '\x90', ' ', '\xE2', '\x82', '\x91', ' ', '\xE2', '\x82', '\x92', ' ', '\xE2', '\x82', '\x93', ' ', '\xE2', '\x82', '\x99', ' ', '\xE2', '\x82', '\x9B', ' ', '\xE1', '\xB5', '\xA5', ' ', '\xE1', '\xB5', '\xA4', ' ', '\xE1', '\xB5', '\xA3', /* ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ */ - '\0', - '\xE1', '\xB5', '\xA6', ' ', '\xE1', '\xB5', '\xA7', ' ', '\xE1', '\xB5', '\xA8', ' ', '\xE1', '\xB5', '\xA9', ' ', '\xE2', '\x82', '\x9A', /* ᵦ ᵧ ᵨ ᵩ ₚ */ - '\0', - '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB3', ' ', '\xE2', '\x81', '\xB5', ' ', '\xE2', '\x81', '\xB7', ' ', '\xE1', '\xB5', '\x80', ' ', '\xE1', '\xB4', '\xB4', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xBC', /* ⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ */ - '\0', - '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB9', ' ', '\xC2', '\xB2', ' ', '\xC2', '\xB3', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xB8', ' ', '\xE1', '\xB4', '\xBC', ' ', '\xE1', '\xB5', '\x81', /* ⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ */ - '\0', - '\xE1', '\xB5', '\x87', ' ', '\xE1', '\xB5', '\x88', ' ', '\xE1', '\xB5', '\x8F', ' ', '\xCA', '\xB0', ' ', '\xCA', '\xB2', ' ', '\xE1', '\xB6', '\xA0', ' ', '\xE2', '\x81', '\xB1', /* ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ */ - '\0', - '\xE1', '\xB5', '\x89', ' ', '\xE1', '\xB5', '\x92', ' ', '\xCA', '\xB3', ' ', '\xCB', '\xA2', ' ', '\xCB', '\xA3', ' ', '\xE1', '\xB6', '\x9C', ' ', '\xE1', '\xB6', '\xBB', /* ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ */ - '\0', - '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D', /* ᵖ ʸ ᵍ */ - '\0', - '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\xA7', ' ', '\xEA', '\x93', '\xB1', ' ', '\xEA', '\x93', '\xB6', ' ', '\xEA', '\x93', '\xA9', ' ', '\xEA', '\x93', '\x9A', ' ', '\xEA', '\x93', '\xB5', ' ', '\xEA', '\x93', '\xB3', /* ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ */ - '\0', - '\xEA', '\x93', '\x95', ' ', '\xEA', '\x93', '\x9C', ' ', '\xEA', '\x93', '\x9E', ' ', '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\x9B', ' ', '\xEA', '\x93', '\xA2', ' ', '\xEA', '\x93', '\xB3', ' ', '\xEA', '\x93', '\xB4', /* ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ */ - '\0', - '\xE0', '\xB4', '\x92', ' ', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xB1', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', ' ', '\xE0', '\xB4', '\x9A', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\xAA', /* ഒ ട ഠ റ ച പ ച്ച പ്പ */ - '\0', - '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* ട ഠ ധ ശ ഘ ച ഥ ല */ - '\0', - '\xE1', '\x80', '\x81', ' ', '\xE1', '\x80', '\x82', ' ', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\xA5', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* ခ ဂ င ဒ ဝ ၥ ၊ ။ */ - '\0', - '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x8E', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x95', ' ', '\xE1', '\x80', '\x97', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* င ဎ ဒ ပ ဗ ဝ ၊ ။ */ - '\0', - '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xBC', ' ', '\xE1', '\x81', '\x8D', ' ', '\xE1', '\x81', '\x8F', ' ', '\xE1', '\x81', '\x86', ' ', '\xE1', '\x80', '\xAB', ' ', '\xE1', '\x80', '\xAD', /* ဩ ြ ၍ ၏ ၆ ါ ိ */ - '\0', - '\xE1', '\x80', '\x89', ' ', '\xE1', '\x80', '\x8A', ' ', '\xE1', '\x80', '\xA5', ' ', '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xA8', ' ', '\xE1', '\x81', '\x82', ' ', '\xE1', '\x81', '\x85', ' ', '\xE1', '\x81', '\x89', /* ဉ ည ဥ ဩ ဨ ၂ ၅ ၉ */ - '\0', - '\xDF', '\x90', ' ', '\xDF', '\x89', ' ', '\xDF', '\x92', ' ', '\xDF', '\x9F', ' ', '\xDF', '\x96', ' ', '\xDF', '\x9C', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ */ - '\0', - '\xDF', '\x80', ' ', '\xDF', '\x98', ' ', '\xDF', '\xA1', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߀ ߘ ߡ ߠ ߥ */ - '\0', - '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߏ ߛ ߋ */ - '\0', - '\xDF', '\x8E', ' ', '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߎ ߏ ߛ ߋ */ - '\0', - '\xE1', '\xB1', '\x9B', ' ', '\xE1', '\xB1', '\x9C', ' ', '\xE1', '\xB1', '\x9D', ' ', '\xE1', '\xB1', '\xA1', ' ', '\xE1', '\xB1', '\xA2', ' ', '\xE1', '\xB1', '\xA5', /* ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ */ - '\0', - '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\x98', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* 𐰗 𐰘 𐰧 */ - '\0', - '\xF0', '\x90', '\xB0', '\x89', ' ', '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\xA6', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* 𐰉 𐰗 𐰦 𐰧 */ - '\0', - '\xF0', '\x90', '\x92', '\xBE', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x92', ' ', '\xF0', '\x90', '\x93', '\x93', ' ', '\xF0', '\x90', '\x92', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xB5', ' ', '\xF0', '\x90', '\x93', '\x86', /* 𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆 */ - '\0', - '\xF0', '\x90', '\x92', '\xB0', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xBF', ' ', '\xF0', '\x90', '\x93', '\x8E', ' ', '\xF0', '\x90', '\x92', '\xB9', /* 𐒰 𐓍 𐓂 𐒿 𐓎 𐒹 */ - '\0', - '\xF0', '\x90', '\x92', '\xBC', ' ', '\xF0', '\x90', '\x92', '\xBD', ' ', '\xF0', '\x90', '\x92', '\xBE', /* 𐒼 𐒽 𐒾 */ - '\0', - '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xB6', ' ', '\xF0', '\x90', '\x93', '\xBA', ' ', '\xF0', '\x90', '\x93', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x9D', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xAE', /* 𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮 */ - '\0', - '\xF0', '\x90', '\x93', '\x98', ' ', '\xF0', '\x90', '\x93', '\x9A', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xA1', ' ', '\xF0', '\x90', '\x93', '\xA7', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xB6', /* 𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶 */ - '\0', - '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA6', ' ', '\xF0', '\x90', '\x93', '\xB8', ' ', '\xF0', '\x90', '\x93', '\xB9', ' ', '\xF0', '\x90', '\x93', '\x9B', /* 𐓤 𐓦 𐓸 𐓹 𐓛 */ - '\0', - '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA5', ' ', '\xF0', '\x90', '\x93', '\xA6', /* 𐓤 𐓥 𐓦 */ - '\0', - '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x89', ' ', '\xF0', '\x90', '\x92', '\x90', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\x98', ' ', '\xF0', '\x90', '\x92', '\x9B', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA3', /* 𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣 */ - '\0', - '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9', /* 𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩 */ - '\0', - '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B', /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ */ - '\0', - '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E', /* ꢂ ꢨ ꢺ ꢤ ꢎ */ - '\0', - '\xF0', '\x90', '\x91', '\x95', ' ', '\xF0', '\x90', '\x91', '\x99', /* 𐑕 𐑙 */ - '\0', - '\xF0', '\x90', '\x91', '\x94', ' ', '\xF0', '\x90', '\x91', '\x96', ' ', '\xF0', '\x90', '\x91', '\x97', ' ', '\xF0', '\x90', '\x91', '\xB9', ' ', '\xF0', '\x90', '\x91', '\xBB', /* 𐑔 𐑖 𐑗 𐑹 𐑻 */ - '\0', - '\xF0', '\x90', '\x91', '\x9F', ' ', '\xF0', '\x90', '\x91', '\xA3', /* 𐑟 𐑣 */ - '\0', - '\xF0', '\x90', '\x91', '\xB1', ' ', '\xF0', '\x90', '\x91', '\xB2', ' ', '\xF0', '\x90', '\x91', '\xB3', ' ', '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xB8', ' ', '\xF0', '\x90', '\x91', '\xBA', ' ', '\xF0', '\x90', '\x91', '\xBC', /* 𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼 */ - '\0', - '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xBB', ' ', '\xF0', '\x90', '\x91', '\xB9', /* 𐑴 𐑻 𐑹 */ - '\0', - '\xE0', '\xB6', '\x89', ' ', '\xE0', '\xB6', '\x9A', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\xB4', ' ', '\xE0', '\xB6', '\xBA', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB7', '\x86', /* ඉ ක ඝ ඳ ප ය ල ෆ */ - '\0', - '\xE0', '\xB6', '\x91', ' ', '\xE0', '\xB6', '\x94', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xA2', ' ', '\xE0', '\xB6', '\xA7', ' ', '\xE0', '\xB6', '\xAE', ' ', '\xE0', '\xB6', '\xB0', ' ', '\xE0', '\xB6', '\xBB', /* එ ඔ ඝ ජ ට ථ ධ ර */ - '\0', - '\xE0', '\xB6', '\xAF', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\x8B', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x96', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xB6', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xAF', '\xE0', '\xB7', '\x94', /* ද ඳ උ ල තූ තු බු දු */ - '\0', - '\xE1', '\xAE', '\x8B', ' ', '\xE1', '\xAE', '\x9E', ' ', '\xE1', '\xAE', '\xAE', ' ', '\xE1', '\xAE', '\xBD', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x88', /* ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ */ - '\0', - '\xE1', '\xAE', '\x84', ' ', '\xE1', '\xAE', '\x94', ' ', '\xE1', '\xAE', '\x95', ' ', '\xE1', '\xAE', '\x97', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x86', ' ', '\xE1', '\xAE', '\x88', ' ', '\xE1', '\xAE', '\x89', /* ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ */ - '\0', - '\xE1', '\xAE', '\xBC', ' ', '\xE1', '\xB3', '\x84', /* ᮼ ᳄ */ - '\0', - '\xEA', '\xAA', '\x86', ' ', '\xEA', '\xAA', '\x94', ' ', '\xEA', '\xAA', '\x92', ' ', '\xEA', '\xAA', '\x96', ' ', '\xEA', '\xAA', '\xAB', /* ꪆ ꪔ ꪒ ꪖ ꪫ */ - '\0', - '\xEA', '\xAA', '\x89', ' ', '\xEA', '\xAA', '\xAB', ' ', '\xEA', '\xAA', '\xAE', /* ꪉ ꪫ ꪮ */ - '\0', - '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x92', ' ', '\xE0', '\xAE', '\x93', ' ', '\xE0', '\xAE', '\xB1', ' ', '\xE0', '\xAE', '\x88', ' ', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9A', /* உ ஒ ஓ ற ஈ க ங ச */ - '\0', - '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x9A', ' ', '\xE0', '\xAE', '\xB2', ' ', '\xE0', '\xAE', '\xB6', ' ', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9F', ' ', '\xE0', '\xAE', '\xAA', /* க ச ல ஶ உ ங ட ப */ - '\0', - '\xE0', '\xB0', '\x87', ' ', '\xE0', '\xB0', '\x8C', ' ', '\xE0', '\xB0', '\x99', ' ', '\xE0', '\xB0', '\x9E', ' ', '\xE0', '\xB0', '\xA3', ' ', '\xE0', '\xB0', '\xB1', ' ', '\xE0', '\xB1', '\xAF', /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */ - '\0', - '\xE0', '\xB0', '\x85', ' ', '\xE0', '\xB0', '\x95', ' ', '\xE0', '\xB0', '\x9A', ' ', '\xE0', '\xB0', '\xB0', ' ', '\xE0', '\xB0', '\xBD', ' ', '\xE0', '\xB1', '\xA8', ' ', '\xE0', '\xB1', '\xAC', /* అ క చ ర ఽ ౨ ౬ */ - '\0', - '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB9', '\x80', ' ', '\xE0', '\xB9', '\x81', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\x81', ' ', '\xE0', '\xB8', '\xB2', /* บ เ แ อ ก า */ - '\0', - '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\xA9', ' ', '\xE0', '\xB8', '\xAF', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\xA2', ' ', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */ - '\0', - '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\x9D', ' ', '\xE0', '\xB8', '\x9F', /* ป ฝ ฟ */ - '\0', - '\xE0', '\xB9', '\x82', ' ', '\xE0', '\xB9', '\x83', ' ', '\xE0', '\xB9', '\x84', /* โ ใ ไ */ - '\0', - '\xE0', '\xB8', '\x8E', ' ', '\xE0', '\xB8', '\x8F', ' ', '\xE0', '\xB8', '\xA4', ' ', '\xE0', '\xB8', '\xA6', /* ฎ ฏ ฤ ฦ */ - '\0', - '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90', /* ญ ฐ */ - '\0', - '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93', /* ๐ ๑ ๓ */ - '\0', - '\xE2', '\xB5', '\x94', ' ', '\xE2', '\xB5', '\x99', ' ', '\xE2', '\xB5', '\x9B', ' ', '\xE2', '\xB5', '\x9E', ' ', '\xE2', '\xB4', '\xB5', ' ', '\xE2', '\xB4', '\xBC', ' ', '\xE2', '\xB4', '\xB9', ' ', '\xE2', '\xB5', '\x8E', /* ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ */ - '\0', - '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x98', '\x9C', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x96', '\x9D', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', /* ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ */ - '\0', - '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x97', '\x9E', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x94', '\x86', /* ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ */ -#ifdef AF_CONFIG_OPTION_CJK - '\0', - '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 他 们 你 來 們 到 和 地 */ - ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB8', '\xAD', ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x83', /* 对 對 就 席 我 时 時 會 */ - ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\x88', '\xB0', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 来 為 能 舰 說 说 这 這 */ - ' ', '\xE9', '\xBD', '\x8A', ' ', '|', /* 齊 | */ - ' ', '\xE5', '\x86', '\x9B', ' ', '\xE5', '\x90', '\x8C', ' ', '\xE5', '\xB7', '\xB2', ' ', '\xE6', '\x84', '\xBF', ' ', '\xE6', '\x97', '\xA2', ' ', '\xE6', '\x98', '\x9F', ' ', '\xE6', '\x98', '\xAF', ' ', '\xE6', '\x99', '\xAF', /* 军 同 已 愿 既 星 是 景 */ - ' ', '\xE6', '\xB0', '\x91', ' ', '\xE7', '\x85', '\xA7', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\xA8', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\xA6', '\x81', /* 民 照 现 現 理 用 置 要 */ - ' ', '\xE8', '\xBB', '\x8D', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x85', '\x8D', ' ', '\xE9', '\x87', '\x8C', ' ', '\xE9', '\x96', '\x8B', ' ', '\xE9', '\x9B', '\xB7', ' ', '\xE9', '\x9C', '\xB2', ' ', '\xE9', '\x9D', '\xA2', /* 軍 那 配 里 開 雷 露 面 */ - ' ', '\xE9', '\xA1', '\xBE', /* 顾 */ - '\0', - '\xE4', '\xB8', '\xAA', ' ', '\xE4', '\xB8', '\xBA', ' ', '\xE4', '\xBA', '\xBA', ' ', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xA5', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', /* 个 为 人 他 以 们 你 來 */ - ' ', '\xE5', '\x80', '\x8B', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\xA4', '\xA7', ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', /* 個 們 到 和 大 对 對 就 */ - ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x89', ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\xA6', '\x81', ' ', '\xE8', '\xAA', '\xAA', /* 我 时 時 有 来 為 要 說 */ - ' ', '\xE8', '\xAF', '\xB4', ' ', '|', /* 说 | */ - ' ', '\xE4', '\xB8', '\xBB', ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE5', '\x9B', '\xA0', ' ', '\xE5', '\xAE', '\x83', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x84', '\x8F', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\x9F', /* 主 些 因 它 想 意 理 生 */ - ' ', '\xE7', '\x95', '\xB6', ' ', '\xE7', '\x9C', '\x8B', ' ', '\xE7', '\x9D', '\x80', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\x80', '\x85', ' ', '\xE8', '\x87', '\xAA', ' ', '\xE8', '\x91', '\x97', ' ', '\xE8', '\xA3', '\xA1', /* 當 看 着 置 者 自 著 裡 */ - ' ', '\xE8', '\xBF', '\x87', ' ', '\xE8', '\xBF', '\x98', ' ', '\xE8', '\xBF', '\x9B', ' ', '\xE9', '\x80', '\xB2', ' ', '\xE9', '\x81', '\x8E', ' ', '\xE9', '\x81', '\x93', ' ', '\xE9', '\x82', '\x84', ' ', '\xE9', '\x87', '\x8C', /* 过 还 进 進 過 道 還 里 */ - ' ', '\xE9', '\x9D', '\xA2', /* 面 */ -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - '\0', - ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 些 们 你 來 們 到 和 地 */ - ' ', '\xE5', '\xA5', '\xB9', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB9', '\xB4', ' ', '\xE5', '\xBE', '\x97', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x9C', '\x80', /* 她 将 將 就 年 得 情 最 */ - ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE7', '\x90', '\x86', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 样 樣 理 能 說 说 这 這 */ - ' ', '\xE9', '\x80', '\x9A', ' ', '|', /* 通 | */ - ' ', '\xE5', '\x8D', '\xB3', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x90', '\xA7', ' ', '\xE5', '\x90', '\xAC', ' ', '\xE5', '\x91', '\xA2', ' ', '\xE5', '\x93', '\x81', ' ', '\xE5', '\x93', '\x8D', ' ', '\xE5', '\x97', '\x8E', /* 即 吗 吧 听 呢 品 响 嗎 */ - ' ', '\xE5', '\xB8', '\x88', ' ', '\xE5', '\xB8', '\xAB', ' ', '\xE6', '\x94', '\xB6', ' ', '\xE6', '\x96', '\xAD', ' ', '\xE6', '\x96', '\xB7', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE7', '\x9C', '\xBC', ' ', '\xE9', '\x96', '\x93', /* 师 師 收 断 斷 明 眼 間 */ - ' ', '\xE9', '\x97', '\xB4', ' ', '\xE9', '\x99', '\x85', ' ', '\xE9', '\x99', '\x88', ' ', '\xE9', '\x99', '\x90', ' ', '\xE9', '\x99', '\xA4', ' ', '\xE9', '\x99', '\xB3', ' ', '\xE9', '\x9A', '\x8F', ' ', '\xE9', '\x9A', '\x9B', /* 间 际 陈 限 除 陳 随 際 */ - ' ', '\xE9', '\x9A', '\xA8', /* 隨 */ - '\0', - '\xE4', '\xBA', '\x8B', ' ', '\xE5', '\x89', '\x8D', ' ', '\xE5', '\xAD', '\xB8', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x88', '\x96', /* 事 前 學 将 將 情 想 或 */ - ' ', '\xE6', '\x94', '\xBF', ' ', '\xE6', '\x96', '\xAF', ' ', '\xE6', '\x96', '\xB0', ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE6', '\xB0', '\x91', ' ', '\xE6', '\xB2', '\x92', ' ', '\xE6', '\xB2', '\xA1', /* 政 斯 新 样 樣 民 沒 没 */ - ' ', '\xE7', '\x84', '\xB6', ' ', '\xE7', '\x89', '\xB9', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x83', ' ', '\xE7', '\xAC', '\xAC', ' ', '\xE7', '\xB6', '\x93', ' ', '\xE8', '\xB0', '\x81', /* 然 特 现 現 球 第 經 谁 */ - ' ', '\xE8', '\xB5', '\xB7', ' ', '|', /* 起 | */ - ' ', '\xE4', '\xBE', '\x8B', ' ', '\xE5', '\x88', '\xA5', ' ', '\xE5', '\x88', '\xAB', ' ', '\xE5', '\x88', '\xB6', ' ', '\xE5', '\x8A', '\xA8', ' ', '\xE5', '\x8B', '\x95', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x97', '\x8E', /* 例 別 别 制 动 動 吗 嗎 */ - ' ', '\xE5', '\xA2', '\x9E', ' ', '\xE6', '\x8C', '\x87', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE6', '\x9C', '\x9D', ' ', '\xE6', '\x9C', '\x9F', ' ', '\xE6', '\x9E', '\x84', ' ', '\xE7', '\x89', '\xA9', ' ', '\xE7', '\xA1', '\xAE', /* 增 指 明 朝 期 构 物 确 */ - ' ', '\xE7', '\xA7', '\x8D', ' ', '\xE8', '\xAA', '\xBF', ' ', '\xE8', '\xB0', '\x83', ' ', '\xE8', '\xB2', '\xBB', ' ', '\xE8', '\xB4', '\xB9', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x83', '\xBD', ' ', '\xE9', '\x96', '\x93', /* 种 調 调 費 费 那 都 間 */ - ' ', '\xE9', '\x97', '\xB4', /* 间 */ -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ -#endif /* AF_CONFIG_OPTION_CJK */ - '\0', - - }; - - - /* stringsets are specific to styles */ - FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) - af_blue_stringsets[] = - { - /* */ - { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ARABIC_BOTTOM, 0 }, - { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_BAMUM_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_BENGALI_BASE, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_BUHID_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 }, - { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CARIAN_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 }, - { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_CHEROKEE_SMALL, 0 }, - { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 }, - { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CYPRIOT_SMALL, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }, - { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_DEVANAGARI_BASE, 0 }, - { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 }, - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 }, - { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 }, - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 }, - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GREEK_SMALL, 0 }, - { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 }, - { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 }, - { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 }, - { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_LONG }, - { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, - { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 }, - { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 }, - { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP }, - { AF_BLUE_STRING_KHMER_BOTTOM, 0 }, - { AF_BLUE_STRING_KHMER_DESCENDER, 0 }, - { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LAO_BOTTOM, 0 }, - { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LAO_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 }, - { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }, - { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LISU_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 }, - { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_NKO_BOTTOM, 0 }, - { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_OL_CHIKI, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 }, - { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }, - { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }, - { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }, - { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_SINHALA_BOTTOM, 0 }, - { AF_BLUE_STRING_SINHALA_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 }, - { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TAMIL_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_TIFINAGH, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_THAI_BOTTOM, 0 }, - { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_THAI_DESCENDER, 0 }, - { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, - { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, - { AF_BLUE_STRING_MAX, 0 }, - { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_VAI_BOTTOM, 0 }, - { AF_BLUE_STRING_MAX, 0 }, -#ifdef AF_CONFIG_OPTION_CJK - { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP }, - { AF_BLUE_STRING_CJK_BOTTOM, 0 }, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ }, - { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | - AF_BLUE_PROPERTY_CJK_RIGHT }, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - { AF_BLUE_STRING_MAX, 0 }, -#endif /* AF_CONFIG_OPTION_CJK */ - - }; - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afblue.cin b/ThirdParty/freetype/src/autofit/afblue.cin deleted file mode 100644 index 6545d1f..0000000 --- a/ThirdParty/freetype/src/autofit/afblue.cin +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** - * - * afblue.c - * - * Auto-fitter data for blue strings (body). - * - * Copyright (C) 2013-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. - * - */ - - -#include "aftypes.h" - - - FT_LOCAL_ARRAY_DEF( char ) - af_blue_strings[] = - { - /* */ -@AF_BLUE_STRINGS_ARRAY@ - }; - - - /* stringsets are specific to styles */ - FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) - af_blue_stringsets[] = - { - /* */ -@AF_BLUE_STRINGSETS_ARRAY@ - }; - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afblue.dat b/ThirdParty/freetype/src/autofit/afblue.dat deleted file mode 100644 index 14a0993..0000000 --- a/ThirdParty/freetype/src/autofit/afblue.dat +++ /dev/null @@ -1,1072 +0,0 @@ -// afblue.dat -// -// Auto-fitter data for blue strings. -// -// Copyright (C) 2013-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 data specific to blue zones. It gets processed by -// a script to simulate `jagged arrays', with enumeration values holding -// offsets into the arrays. -// -// The format of the file is rather simple: A section starts with three -// labels separated by whitespace and followed by a colon (everything in a -// single line); the first label gives the name of the enumeration template, -// the second the name of the array template, and the third the name of the -// `maximum' template. The script then fills the corresponding templates -// (indicated by `@' characters around the name). -// -// A section contains one or more data records. Each data record consists -// of two or more lines. The first line holds the enumeration name, and the -// remaining lines the corresponding array data. -// -// There are two possible representations for array data. -// -// - A string of characters or character clusters (for example, representing -// Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double -// quotes, using C syntax, where the elements are separated by spaces. -// There can be only one string per line, thus the starting and ending -// double quote must be the first and last character in the line, -// respectively, ignoring whitespace before and after the string. If -// there are multiple strings (in multiple lines), they are concatenated -// to a single string. In the output, a string gets represented as a -// series of singles bytes, followed by a zero byte. The enumeration -// values simply hold byte offsets to the start of the corresponding -// strings. -// -// For strings, the `maximum' template holds the maximum number of -// non-space characters in all strings. -// -// - Data blocks enclosed in balanced braces, which get copied verbatim and -// which can span multiple lines. The opening brace of a block must be -// the first character of a line (ignoring whitespace), and the closing -// brace the last (ignoring whitespace also). The script appends a comma -// character after each block and counts the number of blocks to set the -// enumeration values. -// -// For data blocks, the `maximum' template holds the maximum number of -// array elements. -// -// A section can contain either strings only or data blocks only. -// -// A comment line starts with `//'; it gets removed. A preprocessor -// directive line (using the standard syntax of `cpp') starts with `#' and -// gets copied verbatim to both the enumeration and the array. Whitespace -// outside of a string is insignificant. -// -// Preprocessor directives are ignored while the script computes maximum -// values; this essentially means that the maximum values can easily be too -// large. Given that the purpose of those values is to create local -// fixed-size arrays at compile time for further processing of the blue zone -// data, this isn't a problem. Note the final zero byte of a string is not -// counted. Note also that the count holds the number of UTF-8 encoded -// characters, not bytes. - - -// The blue zone string data, to be used in the blue stringsets below. - -AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: - - AF_BLUE_STRING_ADLAM_CAPITAL_TOP - "𞤌 𞤅 𞤈 𞤏 𞤔 𞤚" - AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM - "𞤂 𞤖" - AF_BLUE_STRING_ADLAM_SMALL_TOP - "𞤬 𞤮 𞤻 𞤼 𞤾" - AF_BLUE_STRING_ADLAM_SMALL_BOTTOM - "𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀" - - AF_BLUE_STRING_ARABIC_TOP - "ا إ ل ك ط ظ" - AF_BLUE_STRING_ARABIC_BOTTOM - "ت ث ط ظ ك" - // We don't necessarily have access to medial forms via Unicode in case - // Arabic presentational forms are missing. The only character that is - // guaranteed to have the same vertical position with joining (this is, - // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both - // round and flat curves. - AF_BLUE_STRING_ARABIC_JOIN - "ـ" - - AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP - "Ա Մ Ւ Ս Բ Գ Դ Օ" - AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM - "Ւ Ո Դ Ճ Շ Ս Տ Օ" - AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER - "ե է ի մ վ ֆ ճ" - AF_BLUE_STRING_ARMENIAN_SMALL_TOP - "ա յ ւ ս գ շ ր օ" - AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM - "հ ո ճ ա ե ծ ս օ" - AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER - "բ ը ի լ ղ պ փ ց" - - AF_BLUE_STRING_AVESTAN_TOP - "𐬀 𐬁 𐬐 𐬛" - AF_BLUE_STRING_AVESTAN_BOTTOM - "𐬀 𐬁" - - AF_BLUE_STRING_BAMUM_TOP - "ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ" - AF_BLUE_STRING_BAMUM_BOTTOM - "ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲" - - AF_BLUE_STRING_BENGALI_BASE - "অ ড ত ন ব ভ ল ক" - AF_BLUE_STRING_BENGALI_TOP - "ই ট ঠ ি ী ৈ ৗ" - AF_BLUE_STRING_BENGALI_HEAD - "ও এ ড ত ন ব ল ক" - - AF_BLUE_STRING_BUHID_TOP - "ᝐ ᝈ" - AF_BLUE_STRING_BUHID_LARGE - "ᝅ ᝊ ᝎ" - AF_BLUE_STRING_BUHID_SMALL - "ᝂ ᝃ ᝉ ᝌ" - AF_BLUE_STRING_BUHID_BOTTOM - "ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ" - - AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP - "ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ" - AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM - "ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ" - AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP - "ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ" - AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM - "ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ" - AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP - "ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ" - AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM - "ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ" - - AF_BLUE_STRING_CARIAN_TOP - "𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿" - AF_BLUE_STRING_CARIAN_BOTTOM - "𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉" - - AF_BLUE_STRING_CHAKMA_TOP - "𑄃 𑄅 𑄉 𑄙 𑄗" - AF_BLUE_STRING_CHAKMA_BOTTOM - "𑄅 𑄛 𑄝 𑄗 𑄓" - AF_BLUE_STRING_CHAKMA_DESCENDER - "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢" - - AF_BLUE_STRING_CHEROKEE_CAPITAL - "Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ" - AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER - "ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ" - AF_BLUE_STRING_CHEROKEE_SMALL - "ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ" - AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER - "ᏸ ꮐ ꭹ ꭻ" - - AF_BLUE_STRING_COPTIC_CAPITAL_TOP - "Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ" - AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM - "Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ" - AF_BLUE_STRING_COPTIC_SMALL_TOP - "ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ" - AF_BLUE_STRING_COPTIC_SMALL_BOTTOM - "ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ" - - AF_BLUE_STRING_CYPRIOT_TOP - "𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦" - AF_BLUE_STRING_CYPRIOT_BOTTOM - "𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐" - AF_BLUE_STRING_CYPRIOT_SMALL - "𐠈 𐠏 𐠖" - - AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP - "Б В Е П З О С Э" - AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM - "Б В Е Ш З О С Э" - AF_BLUE_STRING_CYRILLIC_SMALL - "х п н ш е з о с" - AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER - "р у ф" - - AF_BLUE_STRING_DESERET_CAPITAL_TOP - "𐐂 𐐄 𐐋 𐐗 𐐑" - AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM - "𐐀 𐐂 𐐄 𐐗 𐐛" - AF_BLUE_STRING_DESERET_SMALL_TOP - "𐐪 𐐬 𐐳 𐐿 𐐹" - AF_BLUE_STRING_DESERET_SMALL_BOTTOM - "𐐨 𐐪 𐐬 𐐿 𐑃" - - AF_BLUE_STRING_DEVANAGARI_BASE - "क म अ आ थ ध भ श" - AF_BLUE_STRING_DEVANAGARI_TOP - "ई ऐ ओ औ ि ी ो ौ" - // note that some fonts have extreme variation in the height of the - // round head elements; for this reason we also define the `base' - // blue zone, which must be always present - AF_BLUE_STRING_DEVANAGARI_HEAD - "क म अ आ थ ध भ श" - AF_BLUE_STRING_DEVANAGARI_BOTTOM - "ु ृ" - - AF_BLUE_STRING_ETHIOPIC_TOP - "ሀ ሃ ዘ ፐ ማ በ ዋ ዐ" - AF_BLUE_STRING_ETHIOPIC_BOTTOM - "ለ ሐ በ ዘ ሀ ሪ ዐ ጨ" - - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP - "გ დ ე ვ თ ი ო ღ" - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM - "ა ზ მ ს შ ძ ხ პ" - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER - "ს ხ ქ ზ მ შ ჩ წ" - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER - "ე ვ ჟ ტ უ ფ ქ ყ" - - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP - "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ" - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM - "Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ" - - AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP - "ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ" - AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM - "ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ" - AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER - "ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ" - AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER - "ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ" - - AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP - "Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ" - AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM - "Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ" - - AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP - "Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ" - AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM - "Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ" - AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP - "ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ" - AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM - "ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ" - - AF_BLUE_STRING_GOTHIC_TOP - "𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾" - AF_BLUE_STRING_GOTHIC_BOTTOM - "𐌶 𐌴 𐍃 𐍈" - - AF_BLUE_STRING_GREEK_CAPITAL_TOP - "Γ Β Ε Ζ Θ Ο Ω" - AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM - "Β Δ Ζ Ξ Θ Ο" - AF_BLUE_STRING_GREEK_SMALL_BETA_TOP - "β θ δ ζ λ ξ" - AF_BLUE_STRING_GREEK_SMALL - "α ε ι ο π σ τ ω" - AF_BLUE_STRING_GREEK_SMALL_DESCENDER - "β γ η μ ρ φ χ ψ" - - AF_BLUE_STRING_GUJARATI_TOP - "ત ન ઋ ઌ છ ટ ર ૦" - AF_BLUE_STRING_GUJARATI_BOTTOM - "ખ ગ ઘ ઞ ઇ ઈ ઠ જ" - AF_BLUE_STRING_GUJARATI_ASCENDER - "ઈ ઊ િ ી લી શ્ચિ જિ સી" - AF_BLUE_STRING_GUJARATI_DESCENDER - "ુ ૃ ૄ ખુ છૃ છૄ" - AF_BLUE_STRING_GUJARATI_DIGIT_TOP - "૦ ૧ ૨ ૩ ૭" - - AF_BLUE_STRING_GURMUKHI_BASE - "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" - AF_BLUE_STRING_GURMUKHI_HEAD - "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" - AF_BLUE_STRING_GURMUKHI_TOP - "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ" - AF_BLUE_STRING_GURMUKHI_BOTTOM - "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ" - AF_BLUE_STRING_GURMUKHI_DIGIT_TOP - "੦ ੧ ੨ ੩ ੭" - - AF_BLUE_STRING_HEBREW_TOP - "ב ד ה ח ך כ ם ס" - AF_BLUE_STRING_HEBREW_BOTTOM - "ב ט כ ם ס צ" - AF_BLUE_STRING_HEBREW_DESCENDER - "ק ך ן ף ץ" - - AF_BLUE_STRING_KANNADA_TOP - "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ" - AF_BLUE_STRING_KANNADA_BOTTOM - "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭" - - AF_BLUE_STRING_KAYAH_LI_TOP - "꤅ ꤏ ꤁ ꤋ ꤀ ꤍ" - AF_BLUE_STRING_KAYAH_LI_BOTTOM - "꤈ ꤘ ꤀ ꤍ ꤢ" - AF_BLUE_STRING_KAYAH_LI_ASCENDER - "ꤖ ꤡ" - AF_BLUE_STRING_KAYAH_LI_DESCENDER - "ꤑ ꤜ ꤞ" - AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER - "ꤑ꤬ ꤜ꤭ ꤔ꤬" - - AF_BLUE_STRING_KHMER_TOP - "ខ ទ ន ឧ ឩ ា" - AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP - "ក្ក ក្ខ ក្គ ក្ថ" - AF_BLUE_STRING_KHMER_BOTTOM - "ខ ឃ ច ឋ ប ម យ ឲ" - AF_BLUE_STRING_KHMER_DESCENDER - "ត្រ រៀ ឲ្យ អឿ" - AF_BLUE_STRING_KHMER_LARGE_DESCENDER - "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ" - - AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP - "᧠ ᧡" - AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM - "᧶ ᧹" - - AF_BLUE_STRING_LAO_TOP - "າ ດ ອ ມ ລ ວ ຣ ງ" - AF_BLUE_STRING_LAO_BOTTOM - "າ ອ ບ ຍ ຣ ຮ ວ ຢ" - AF_BLUE_STRING_LAO_ASCENDER - "ປ ຢ ຟ ຝ" - AF_BLUE_STRING_LAO_LARGE_ASCENDER - "ໂ ໄ ໃ" - AF_BLUE_STRING_LAO_DESCENDER - "ງ ຊ ຖ ຽ ໆ ຯ" - - AF_BLUE_STRING_LATIN_CAPITAL_TOP - "T H E Z O C Q S" - AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM - "H E Z L O C U S" - AF_BLUE_STRING_LATIN_SMALL_F_TOP - "f i j k d b h" - AF_BLUE_STRING_LATIN_SMALL_TOP - "u v x z o e s c" - AF_BLUE_STRING_LATIN_SMALL_BOTTOM - "n r x z o e s c" - AF_BLUE_STRING_LATIN_SMALL_DESCENDER - "p q g j y" - - // we assume that both the subscript and superscript ranges - // don't contain oldstyle digits (actually, most fonts probably - // have digits only in those ranges) - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP - "₀ ₃ ₅ ₇ ₈" - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM - "₀ ₁ ₂ ₃ ₈" - AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP - "ᵢ ⱼ ₕ ₖ ₗ" - AF_BLUE_STRING_LATIN_SUBS_SMALL - "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ" - AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER - "ᵦ ᵧ ᵨ ᵩ ₚ" - - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP - "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ" - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM - "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ" - AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP - "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ" - AF_BLUE_STRING_LATIN_SUPS_SMALL - "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ" - AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER - "ᵖ ʸ ᵍ" - - AF_BLUE_STRING_LISU_TOP - "ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ" - AF_BLUE_STRING_LISU_BOTTOM - "ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ" - - AF_BLUE_STRING_MALAYALAM_TOP - "ഒ ട ഠ റ ച പ ച്ച പ്പ" - AF_BLUE_STRING_MALAYALAM_BOTTOM - "ട ഠ ധ ശ ഘ ച ഥ ല" - - AF_BLUE_STRING_MYANMAR_TOP - "ခ ဂ င ဒ ဝ ၥ ၊ ။" - AF_BLUE_STRING_MYANMAR_BOTTOM - "င ဎ ဒ ပ ဗ ဝ ၊ ။" - AF_BLUE_STRING_MYANMAR_ASCENDER - "ဩ ြ ၍ ၏ ၆ ါ ိ" - AF_BLUE_STRING_MYANMAR_DESCENDER - "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉" - - AF_BLUE_STRING_NKO_TOP - "ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ" - AF_BLUE_STRING_NKO_BOTTOM - "߀ ߘ ߡ ߠ ߥ" - AF_BLUE_STRING_NKO_SMALL_TOP - "ߏ ߛ ߋ" - AF_BLUE_STRING_NKO_SMALL_BOTTOM - "ߎ ߏ ߛ ߋ" - - AF_BLUE_STRING_OL_CHIKI - "ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ" - - AF_BLUE_STRING_OLD_TURKIC_TOP - "𐰗 𐰘 𐰧" - AF_BLUE_STRING_OLD_TURKIC_BOTTOM - "𐰉 𐰗 𐰦 𐰧" - - AF_BLUE_STRING_OSAGE_CAPITAL_TOP - "𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆" - AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM - "𐒰 𐓍 𐓂 𐒿 𐓎 𐒹" - AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER - "𐒼 𐒽 𐒾" - AF_BLUE_STRING_OSAGE_SMALL_TOP - "𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮" - AF_BLUE_STRING_OSAGE_SMALL_BOTTOM - "𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶" - AF_BLUE_STRING_OSAGE_SMALL_ASCENDER - "𐓤 𐓦 𐓸 𐓹 𐓛" - AF_BLUE_STRING_OSAGE_SMALL_DESCENDER - "𐓤 𐓥 𐓦" - - AF_BLUE_STRING_OSMANYA_TOP - "𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣" - AF_BLUE_STRING_OSMANYA_BOTTOM - "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩" - - AF_BLUE_STRING_SAURASHTRA_TOP - "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ" - AF_BLUE_STRING_SAURASHTRA_BOTTOM - "ꢂ ꢨ ꢺ ꢤ ꢎ" - - AF_BLUE_STRING_SHAVIAN_TOP - "𐑕 𐑙" - AF_BLUE_STRING_SHAVIAN_BOTTOM - "𐑔 𐑖 𐑗 𐑹 𐑻" - AF_BLUE_STRING_SHAVIAN_DESCENDER - "𐑟 𐑣" - AF_BLUE_STRING_SHAVIAN_SMALL_TOP - "𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼" - AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM - "𐑴 𐑻 𐑹" - - AF_BLUE_STRING_SINHALA_TOP - "ඉ ක ඝ ඳ ප ය ල ෆ" - AF_BLUE_STRING_SINHALA_BOTTOM - "එ ඔ ඝ ජ ට ථ ධ ර" - AF_BLUE_STRING_SINHALA_DESCENDER - "ද ඳ උ ල තූ තු බු දු" - - AF_BLUE_STRING_SUNDANESE_TOP - "ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ" - AF_BLUE_STRING_SUNDANESE_BOTTOM - "ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ" - AF_BLUE_STRING_SUNDANESE_DESCENDER - "ᮼ ᳄" - - AF_BLUE_STRING_TAI_VIET_TOP - "ꪆ ꪔ ꪒ ꪖ ꪫ" - AF_BLUE_STRING_TAI_VIET_BOTTOM - "ꪉ ꪫ ꪮ" - - AF_BLUE_STRING_TAMIL_TOP - "உ ஒ ஓ ற ஈ க ங ச" - AF_BLUE_STRING_TAMIL_BOTTOM - "க ச ல ஶ உ ங ட ப" - - AF_BLUE_STRING_TELUGU_TOP - "ఇ ఌ ఙ ఞ ణ ఱ ౯" - AF_BLUE_STRING_TELUGU_BOTTOM - "అ క చ ర ఽ ౨ ౬" - - AF_BLUE_STRING_THAI_TOP - "บ เ แ อ ก า" - AF_BLUE_STRING_THAI_BOTTOM - "บ ป ษ ฯ อ ย ฮ" - AF_BLUE_STRING_THAI_ASCENDER - "ป ฝ ฟ" - AF_BLUE_STRING_THAI_LARGE_ASCENDER - "โ ใ ไ" - AF_BLUE_STRING_THAI_DESCENDER - "ฎ ฏ ฤ ฦ" - AF_BLUE_STRING_THAI_LARGE_DESCENDER - "ญ ฐ" - AF_BLUE_STRING_THAI_DIGIT_TOP - "๐ ๑ ๓" - - AF_BLUE_STRING_TIFINAGH - "ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ" - - AF_BLUE_STRING_VAI_TOP - "ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ" - AF_BLUE_STRING_VAI_BOTTOM - "ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ" - - -#ifdef AF_CONFIG_OPTION_CJK - - AF_BLUE_STRING_CJK_TOP - "他 们 你 來 們 到 和 地" - " 对 對 就 席 我 时 時 會" - " 来 為 能 舰 說 说 这 這" - " 齊 |" - " 军 同 已 愿 既 星 是 景" - " 民 照 现 現 理 用 置 要" - " 軍 那 配 里 開 雷 露 面" - " 顾" - AF_BLUE_STRING_CJK_BOTTOM - "个 为 人 他 以 们 你 來" - " 個 們 到 和 大 对 對 就" - " 我 时 時 有 来 為 要 說" - " 说 |" - " 主 些 因 它 想 意 理 生" - " 當 看 着 置 者 自 著 裡" - " 过 还 进 進 過 道 還 里" - " 面" - -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - - AF_BLUE_STRING_CJK_LEFT - " 些 们 你 來 們 到 和 地" - " 她 将 將 就 年 得 情 最" - " 样 樣 理 能 說 说 这 這" - " 通 |" - " 即 吗 吧 听 呢 品 响 嗎" - " 师 師 收 断 斷 明 眼 間" - " 间 际 陈 限 除 陳 随 際" - " 隨" - AF_BLUE_STRING_CJK_RIGHT - "事 前 學 将 將 情 想 或" - " 政 斯 新 样 樣 民 沒 没" - " 然 特 现 現 球 第 經 谁" - " 起 |" - " 例 別 别 制 动 動 吗 嗎" - " 增 指 明 朝 期 构 物 确" - " 种 調 调 費 费 那 都 間" - " 间" - -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - -#endif /* AF_CONFIG_OPTION_CJK */ - - -// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'. -// -// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some -// explanations. -// -// A blue zone in general is defined by a reference and an overshoot line. -// During the hinting process, all coordinate values between those two lines -// are set equal to the reference value, provided that the blue zone is not -// wider than 0.75 pixels (otherwise the blue zone gets ignored). All -// entries must have `AF_BLUE_STRING_MAX' as the final line. -// -// During the glyph analysis, edges are sorted from bottom to top, and then -// sequentially checked, edge by edge, against the blue zones in the order -// given below. -// -// -// latin auto-hinter -// ----------------- -// -// Characters in a blue string are automatically classified as having a flat -// (reference) or a round (overshoot) extremum. The blue zone is then set -// up by the mean values of all flat extrema and all round extrema, -// respectively. Only horizontal blue zones (i.e., adjusting vertical -// coordinate values) are supported. -// -// Some scripts like Khmer need character composition to get all necessary -// blue zones, since Unicode only provides an abstract data model that -// doesn't represent all possible glyph shapes. For such character -// clusters, the HarfBuzz library is used to convert them into the -// corresponding glyphs. The largest glyph element (where `largest' can be -// either `largest ascender' or `largest descender') then defines the -// corresponding flat or round extremum. -// -// For the latin auto-hinter, the overshoot should be larger than the -// reference for top zones, and vice versa for bottom zones. -// -// LATIN_TOP -// Take the maximum flat and round coordinate values of the blue string -// characters for computing the blue zone's reference and overshoot -// values. -// -// If not set, take the minimum values. -// -// Mutually exclusive with `LATIN_SUB_TOP'. -// -// LATIN_SUB_TOP -// For all glyphs of a character cluster, compute the maximum flat -// and round coordinate values of each component, then take the -// smallest of the maximum values. The idea is to get the top of -// subscript glyphs, as used in Khmer, for example. Note that -// this mechanism doesn't work for ordinary ligatures. -// -// This flags indicates a secondary blue zone: It gets removed if -// there is a non-LATIN_SUB_TOP blue zone at the same coordinate -// value (after scaling). -// -// Mutually exclusive with `LATIN_TOP'. -// -// LATIN_NEUTRAL -// Ignore round extrema and define the blue zone with flat values only. -// Both top and bottom of contours can match. This is useful for -// scripts like Devanagari where vowel signs attach to the base -// character and are implemented as components of composite glyphs. -// -// If not set, both round and flat extrema are taken into account. -// Additionally, only the top or the bottom of a contour can match, -// depending on the LATIN_TOP flag. -// -// Neutral blue zones should always follow non-neutral blue zones. -// -// LATIN_X_HEIGHT -// Scale all glyphs vertically from the corresponding script to make the -// reference line of this blue zone align on the grid. The scaling -// takes place before all other blue zones get aligned to the grid. -// Only one blue character string of a script style can have this flag. -// -// LATIN_LONG -// Apply an additional constraint for blue zone values: Don't -// necessarily use the extremum as-is but a segment of the topmost (or -// bottommost) contour that is longer than a heuristic threshold, and -// which is not too far away vertically from the real extremum. This -// ensures that small bumps in the outline are ignored (for example, the -// `vertical serifs' found in many Hebrew glyph designs). -// -// The segment must be at least EM/25 font units long, and the distance -// to the extremum must be smaller than EM/4. -// -// -// cjk auto-hinter -// --------------- -// -// Characters in a blue string are *not* automatically classified. Instead, -// first come the characters used for the overshoot value, then the -// character `|', then the characters used for the reference value -// (everything separated by space characters). The blue zone is then set up -// by the mean values of all reference values and all overshoot values, -// respectively. Both horizontal and vertical blue zones (i.e., adjusting -// vertical and horizontal coordinate values, respectively) are supported. -// -// For the cjk auto-hinter, the overshoot should be smaller than the -// reference for top zones, and vice versa for bottom zones. -// -// CJK_TOP -// Take the maximum flat and round coordinate values of the blue string -// characters. If not set, take the minimum values. -// -// CJK_RIGHT -// A synonym for CJK_TOP. If CJK_HORIZ is set, this flag indicates the -// right blue zone, taking horizontal maximum values. -// -// CJK_HORIZ -// Define a blue zone for horizontal hinting (i.e., vertical blue -// zones). If not set, this is a blue zone for vertical hinting. - - -AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: - - AF_BLUE_STRINGSET_ADLM - { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_ARAB - { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } - { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_ARMN - { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_AVST - { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_BAMU - { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_BAMUM_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_BENG - { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_BENGALI_BASE, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_BUHD - { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_BUHID_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CAKM - { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 } - { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CANS - { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CARI - { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CARIAN_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CHER - { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 } - { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_CHEROKEE_SMALL, 0 } - { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_COPT - { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CPRT - { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 } - { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CYPRIOT_SMALL, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_CYRL - { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_CYRILLIC_SMALL, 0 } - { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_DEVA - { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_DEVANAGARI_BASE, 0 } - { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_DSRT - { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_ETHI - { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GEOR - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 } - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 } - { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GEOK - { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 } - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 } - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GLAG - { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GOTH - { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GREK - { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GREEK_SMALL, 0 } - { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GUJR - { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 } - { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 } - { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_GURU - { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_NEUTRAL | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 } - { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_HEBR - { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_LONG } - { AF_BLUE_STRING_HEBREW_BOTTOM, 0 } - { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_KALI - { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 } - { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 } - { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_KHMR - { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP } - { AF_BLUE_STRING_KHMER_BOTTOM, 0 } - { AF_BLUE_STRING_KHMER_DESCENDER, 0 } - { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_KHMS - { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_KNDA - { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LAO - { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LAO_BOTTOM, 0 } - { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LAO_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LATN - { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LATB - { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 } - { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LATP - { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 } - { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_LISU - { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LISU_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_MLYM - { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_MYMR - { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 } - { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_NKOO - { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_NKO_BOTTOM, 0 } - { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_NONE - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_OLCK - { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_OL_CHIKI, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_ORKH - { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_OSGE - { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 } - { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 } - { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_OSMA - { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_SAUR - { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_SHAW - { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 } - { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 } - { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_SINH - { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_SINHALA_BOTTOM, 0 } - { AF_BLUE_STRING_SINHALA_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_SUND - { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 } - { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_TAML - { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TAMIL_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_TAVT - { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_TELU - { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_TFNG - { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_TIFINAGH, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_THAI - { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | - AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_THAI_BOTTOM, 0 } - { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_THAI_DESCENDER, 0 } - { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 } - { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } - { AF_BLUE_STRING_MAX, 0 } - - AF_BLUE_STRINGSET_VAII - { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_VAI_BOTTOM, 0 } - { AF_BLUE_STRING_MAX, 0 } - -#ifdef AF_CONFIG_OPTION_CJK - - AF_BLUE_STRINGSET_HANI - { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP } - { AF_BLUE_STRING_CJK_BOTTOM, 0 } -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ } - { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | - AF_BLUE_PROPERTY_CJK_RIGHT } -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - { AF_BLUE_STRING_MAX, 0 } - -#endif /* AF_CONFIG_OPTION_CJK */ - - -// END diff --git a/ThirdParty/freetype/src/autofit/afblue.h b/ThirdParty/freetype/src/autofit/afblue.h deleted file mode 100644 index a2ff597..0000000 --- a/ThirdParty/freetype/src/autofit/afblue.h +++ /dev/null @@ -1,414 +0,0 @@ -/* This file has been generated by the Perl script `afblue.pl', */ -/* using data from file `afblue.dat'. */ - -/**************************************************************************** - * - * afblue.h - * - * Auto-fitter data for blue strings (specification). - * - * Copyright (C) 2013-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 AFBLUE_H_ -#define AFBLUE_H_ - - -FT_BEGIN_HEADER - - - /* an auxiliary macro to decode a UTF-8 character -- since we only use */ - /* hard-coded, self-converted data, no error checking is performed */ -#define GET_UTF8_CHAR( ch, p ) \ - do \ - { \ - ch = (unsigned char)*p++; \ - if ( ch >= 0x80 ) \ - { \ - FT_UInt len_; \ - \ - \ - if ( ch < 0xE0 ) \ - { \ - len_ = 1; \ - ch &= 0x1F; \ - } \ - else if ( ch < 0xF0 ) \ - { \ - len_ = 2; \ - ch &= 0x0F; \ - } \ - else \ - { \ - len_ = 3; \ - ch &= 0x07; \ - } \ - \ - for ( ; len_ > 0; len_-- ) \ - ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ - } \ - } while ( 0 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* At the bottommost level, we define strings for finding blue zones. */ - - -#define AF_BLUE_STRING_MAX_LEN 51 - - /* The AF_Blue_String enumeration values are offsets into the */ - /* `af_blue_strings' array. */ - - typedef enum AF_Blue_String_ - { - AF_BLUE_STRING_ADLAM_CAPITAL_TOP = 0, - AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM = 30, - AF_BLUE_STRING_ADLAM_SMALL_TOP = 40, - AF_BLUE_STRING_ADLAM_SMALL_BOTTOM = 65, - AF_BLUE_STRING_ARABIC_TOP = 105, - AF_BLUE_STRING_ARABIC_BOTTOM = 123, - AF_BLUE_STRING_ARABIC_JOIN = 138, - AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 141, - AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 165, - AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 189, - AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 210, - AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 234, - AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 258, - AF_BLUE_STRING_AVESTAN_TOP = 282, - AF_BLUE_STRING_AVESTAN_BOTTOM = 302, - AF_BLUE_STRING_BAMUM_TOP = 312, - AF_BLUE_STRING_BAMUM_BOTTOM = 344, - AF_BLUE_STRING_BENGALI_BASE = 376, - AF_BLUE_STRING_BENGALI_TOP = 408, - AF_BLUE_STRING_BENGALI_HEAD = 436, - AF_BLUE_STRING_BUHID_TOP = 468, - AF_BLUE_STRING_BUHID_LARGE = 476, - AF_BLUE_STRING_BUHID_SMALL = 488, - AF_BLUE_STRING_BUHID_BOTTOM = 504, - AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP = 532, - AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM = 564, - AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP = 596, - AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM = 628, - AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP = 660, - AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM = 688, - AF_BLUE_STRING_CARIAN_TOP = 720, - AF_BLUE_STRING_CARIAN_BOTTOM = 760, - AF_BLUE_STRING_CHAKMA_TOP = 795, - AF_BLUE_STRING_CHAKMA_BOTTOM = 820, - AF_BLUE_STRING_CHAKMA_DESCENDER = 845, - AF_BLUE_STRING_CHEROKEE_CAPITAL = 910, - AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 942, - AF_BLUE_STRING_CHEROKEE_SMALL = 974, - AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 1006, - AF_BLUE_STRING_COPTIC_CAPITAL_TOP = 1022, - AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM = 1054, - AF_BLUE_STRING_COPTIC_SMALL_TOP = 1086, - AF_BLUE_STRING_COPTIC_SMALL_BOTTOM = 1118, - AF_BLUE_STRING_CYPRIOT_TOP = 1150, - AF_BLUE_STRING_CYPRIOT_BOTTOM = 1190, - AF_BLUE_STRING_CYPRIOT_SMALL = 1225, - AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 1240, - AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 1264, - AF_BLUE_STRING_CYRILLIC_SMALL = 1288, - AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 1312, - AF_BLUE_STRING_DESERET_CAPITAL_TOP = 1321, - AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM = 1346, - AF_BLUE_STRING_DESERET_SMALL_TOP = 1371, - AF_BLUE_STRING_DESERET_SMALL_BOTTOM = 1396, - AF_BLUE_STRING_DEVANAGARI_BASE = 1421, - AF_BLUE_STRING_DEVANAGARI_TOP = 1453, - AF_BLUE_STRING_DEVANAGARI_HEAD = 1485, - AF_BLUE_STRING_DEVANAGARI_BOTTOM = 1517, - AF_BLUE_STRING_ETHIOPIC_TOP = 1525, - AF_BLUE_STRING_ETHIOPIC_BOTTOM = 1557, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 1589, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 1621, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 1653, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 1685, - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 1717, - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 1749, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 1781, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 1813, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 1845, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 1877, - AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP = 1909, - AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM = 1941, - AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP = 1973, - AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM = 2005, - AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP = 2037, - AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM = 2069, - AF_BLUE_STRING_GOTHIC_TOP = 2101, - AF_BLUE_STRING_GOTHIC_BOTTOM = 2141, - AF_BLUE_STRING_GREEK_CAPITAL_TOP = 2161, - AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 2182, - AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 2200, - AF_BLUE_STRING_GREEK_SMALL = 2218, - AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 2242, - AF_BLUE_STRING_GUJARATI_TOP = 2266, - AF_BLUE_STRING_GUJARATI_BOTTOM = 2298, - AF_BLUE_STRING_GUJARATI_ASCENDER = 2330, - AF_BLUE_STRING_GUJARATI_DESCENDER = 2380, - AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 2413, - AF_BLUE_STRING_GURMUKHI_BASE = 2433, - AF_BLUE_STRING_GURMUKHI_HEAD = 2465, - AF_BLUE_STRING_GURMUKHI_TOP = 2497, - AF_BLUE_STRING_GURMUKHI_BOTTOM = 2529, - AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 2561, - AF_BLUE_STRING_HEBREW_TOP = 2581, - AF_BLUE_STRING_HEBREW_BOTTOM = 2605, - AF_BLUE_STRING_HEBREW_DESCENDER = 2623, - AF_BLUE_STRING_KANNADA_TOP = 2638, - AF_BLUE_STRING_KANNADA_BOTTOM = 2682, - AF_BLUE_STRING_KAYAH_LI_TOP = 2714, - AF_BLUE_STRING_KAYAH_LI_BOTTOM = 2738, - AF_BLUE_STRING_KAYAH_LI_ASCENDER = 2758, - AF_BLUE_STRING_KAYAH_LI_DESCENDER = 2766, - AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER = 2778, - AF_BLUE_STRING_KHMER_TOP = 2799, - AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 2823, - AF_BLUE_STRING_KHMER_BOTTOM = 2863, - AF_BLUE_STRING_KHMER_DESCENDER = 2895, - AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 2929, - AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 3016, - AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 3024, - AF_BLUE_STRING_LAO_TOP = 3032, - AF_BLUE_STRING_LAO_BOTTOM = 3064, - AF_BLUE_STRING_LAO_ASCENDER = 3096, - AF_BLUE_STRING_LAO_LARGE_ASCENDER = 3112, - AF_BLUE_STRING_LAO_DESCENDER = 3124, - AF_BLUE_STRING_LATIN_CAPITAL_TOP = 3148, - AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 3164, - AF_BLUE_STRING_LATIN_SMALL_F_TOP = 3180, - AF_BLUE_STRING_LATIN_SMALL_TOP = 3194, - AF_BLUE_STRING_LATIN_SMALL_BOTTOM = 3210, - AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 3226, - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 3236, - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 3256, - AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 3276, - AF_BLUE_STRING_LATIN_SUBS_SMALL = 3296, - AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 3332, - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 3352, - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 3383, - AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 3412, - AF_BLUE_STRING_LATIN_SUPS_SMALL = 3438, - AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 3463, - AF_BLUE_STRING_LISU_TOP = 3474, - AF_BLUE_STRING_LISU_BOTTOM = 3506, - AF_BLUE_STRING_MALAYALAM_TOP = 3538, - AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582, - AF_BLUE_STRING_MYANMAR_TOP = 3614, - AF_BLUE_STRING_MYANMAR_BOTTOM = 3646, - AF_BLUE_STRING_MYANMAR_ASCENDER = 3678, - AF_BLUE_STRING_MYANMAR_DESCENDER = 3706, - AF_BLUE_STRING_NKO_TOP = 3738, - AF_BLUE_STRING_NKO_BOTTOM = 3762, - AF_BLUE_STRING_NKO_SMALL_TOP = 3777, - AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3786, - AF_BLUE_STRING_OL_CHIKI = 3798, - AF_BLUE_STRING_OLD_TURKIC_TOP = 3822, - AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3837, - AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3857, - AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3897, - AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3927, - AF_BLUE_STRING_OSAGE_SMALL_TOP = 3942, - AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 3982, - AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4022, - AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4047, - AF_BLUE_STRING_OSMANYA_TOP = 4062, - AF_BLUE_STRING_OSMANYA_BOTTOM = 4102, - AF_BLUE_STRING_SAURASHTRA_TOP = 4142, - AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4174, - AF_BLUE_STRING_SHAVIAN_TOP = 4194, - AF_BLUE_STRING_SHAVIAN_BOTTOM = 4204, - AF_BLUE_STRING_SHAVIAN_DESCENDER = 4229, - AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4239, - AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4274, - AF_BLUE_STRING_SINHALA_TOP = 4289, - AF_BLUE_STRING_SINHALA_BOTTOM = 4321, - AF_BLUE_STRING_SINHALA_DESCENDER = 4353, - AF_BLUE_STRING_SUNDANESE_TOP = 4397, - AF_BLUE_STRING_SUNDANESE_BOTTOM = 4421, - AF_BLUE_STRING_SUNDANESE_DESCENDER = 4453, - AF_BLUE_STRING_TAI_VIET_TOP = 4461, - AF_BLUE_STRING_TAI_VIET_BOTTOM = 4481, - AF_BLUE_STRING_TAMIL_TOP = 4493, - AF_BLUE_STRING_TAMIL_BOTTOM = 4525, - AF_BLUE_STRING_TELUGU_TOP = 4557, - AF_BLUE_STRING_TELUGU_BOTTOM = 4585, - AF_BLUE_STRING_THAI_TOP = 4613, - AF_BLUE_STRING_THAI_BOTTOM = 4637, - AF_BLUE_STRING_THAI_ASCENDER = 4665, - AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4677, - AF_BLUE_STRING_THAI_DESCENDER = 4689, - AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4705, - AF_BLUE_STRING_THAI_DIGIT_TOP = 4713, - AF_BLUE_STRING_TIFINAGH = 4725, - AF_BLUE_STRING_VAI_TOP = 4757, - AF_BLUE_STRING_VAI_BOTTOM = 4789, - af_blue_1_1 = 4820, -#ifdef AF_CONFIG_OPTION_CJK - AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, - AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, - af_blue_1_1_1 = af_blue_1_1 + 404, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1, - AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 204, - af_blue_1_1_2 = af_blue_1_1_1 + 405, -#else - af_blue_1_1_2 = af_blue_1_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - af_blue_1_2 = af_blue_1_1_2 + 0, -#else - af_blue_1_2 = af_blue_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK */ - - - AF_BLUE_STRING_MAX /* do not remove */ - - } AF_Blue_String; - - - FT_LOCAL_ARRAY( char ) - af_blue_strings[]; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S E T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* The next level is to group blue strings into style-specific sets. */ - - - /* Properties are specific to a writing system. We assume that a given */ - /* blue string can't be used in more than a single writing system, which */ - /* is a safe bet. */ -#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) -#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) -#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) -#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) - -#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ -#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP - - -#define AF_BLUE_STRINGSET_MAX_LEN 8 - - /* The AF_Blue_Stringset enumeration values are offsets into the */ - /* `af_blue_stringsets' array. */ - - typedef enum AF_Blue_Stringset_ - { - AF_BLUE_STRINGSET_ADLM = 0, - AF_BLUE_STRINGSET_ARAB = 5, - AF_BLUE_STRINGSET_ARMN = 9, - AF_BLUE_STRINGSET_AVST = 16, - AF_BLUE_STRINGSET_BAMU = 19, - AF_BLUE_STRINGSET_BENG = 22, - AF_BLUE_STRINGSET_BUHD = 27, - AF_BLUE_STRINGSET_CAKM = 32, - AF_BLUE_STRINGSET_CANS = 36, - AF_BLUE_STRINGSET_CARI = 43, - AF_BLUE_STRINGSET_CHER = 46, - AF_BLUE_STRINGSET_COPT = 53, - AF_BLUE_STRINGSET_CPRT = 58, - AF_BLUE_STRINGSET_CYRL = 63, - AF_BLUE_STRINGSET_DEVA = 69, - AF_BLUE_STRINGSET_DSRT = 75, - AF_BLUE_STRINGSET_ETHI = 80, - AF_BLUE_STRINGSET_GEOR = 83, - AF_BLUE_STRINGSET_GEOK = 90, - AF_BLUE_STRINGSET_GLAG = 97, - AF_BLUE_STRINGSET_GOTH = 102, - AF_BLUE_STRINGSET_GREK = 105, - AF_BLUE_STRINGSET_GUJR = 112, - AF_BLUE_STRINGSET_GURU = 118, - AF_BLUE_STRINGSET_HEBR = 124, - AF_BLUE_STRINGSET_KALI = 128, - AF_BLUE_STRINGSET_KHMR = 134, - AF_BLUE_STRINGSET_KHMS = 140, - AF_BLUE_STRINGSET_KNDA = 143, - AF_BLUE_STRINGSET_LAO = 146, - AF_BLUE_STRINGSET_LATN = 152, - AF_BLUE_STRINGSET_LATB = 159, - AF_BLUE_STRINGSET_LATP = 166, - AF_BLUE_STRINGSET_LISU = 173, - AF_BLUE_STRINGSET_MLYM = 176, - AF_BLUE_STRINGSET_MYMR = 179, - AF_BLUE_STRINGSET_NKOO = 184, - AF_BLUE_STRINGSET_NONE = 189, - AF_BLUE_STRINGSET_OLCK = 190, - AF_BLUE_STRINGSET_ORKH = 193, - AF_BLUE_STRINGSET_OSGE = 196, - AF_BLUE_STRINGSET_OSMA = 204, - AF_BLUE_STRINGSET_SAUR = 207, - AF_BLUE_STRINGSET_SHAW = 210, - AF_BLUE_STRINGSET_SINH = 216, - AF_BLUE_STRINGSET_SUND = 220, - AF_BLUE_STRINGSET_TAML = 224, - AF_BLUE_STRINGSET_TAVT = 227, - AF_BLUE_STRINGSET_TELU = 230, - AF_BLUE_STRINGSET_TFNG = 233, - AF_BLUE_STRINGSET_THAI = 236, - AF_BLUE_STRINGSET_VAII = 244, - af_blue_2_1 = 247, -#ifdef AF_CONFIG_OPTION_CJK - AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, - af_blue_2_1_1 = af_blue_2_1 + 2, -#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - af_blue_2_1_2 = af_blue_2_1_1 + 2, -#else - af_blue_2_1_2 = af_blue_2_1_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ - af_blue_2_2 = af_blue_2_1_2 + 1, -#else - af_blue_2_2 = af_blue_2_1 + 0, -#endif /* AF_CONFIG_OPTION_CJK */ - - - AF_BLUE_STRINGSET_MAX /* do not remove */ - - } AF_Blue_Stringset; - - - typedef struct AF_Blue_StringRec_ - { - AF_Blue_String string; - FT_UShort properties; - - } AF_Blue_StringRec; - - - FT_LOCAL_ARRAY( AF_Blue_StringRec ) - af_blue_stringsets[]; - -/* */ - -FT_END_HEADER - - -#endif /* AFBLUE_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afblue.hin b/ThirdParty/freetype/src/autofit/afblue.hin deleted file mode 100644 index 30a28da..0000000 --- a/ThirdParty/freetype/src/autofit/afblue.hin +++ /dev/null @@ -1,146 +0,0 @@ -/**************************************************************************** - * - * afblue.h - * - * Auto-fitter data for blue strings (specification). - * - * Copyright (C) 2013-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 AFBLUE_H_ -#define AFBLUE_H_ - - -FT_BEGIN_HEADER - - - /* an auxiliary macro to decode a UTF-8 character -- since we only use */ - /* hard-coded, self-converted data, no error checking is performed */ -#define GET_UTF8_CHAR( ch, p ) \ - do \ - { \ - ch = (unsigned char)*p++; \ - if ( ch >= 0x80 ) \ - { \ - FT_UInt len_; \ - \ - \ - if ( ch < 0xE0 ) \ - { \ - len_ = 1; \ - ch &= 0x1F; \ - } \ - else if ( ch < 0xF0 ) \ - { \ - len_ = 2; \ - ch &= 0x0F; \ - } \ - else \ - { \ - len_ = 3; \ - ch &= 0x07; \ - } \ - \ - for ( ; len_ > 0; len_-- ) \ - ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ - } \ - } while ( 0 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* At the bottommost level, we define strings for finding blue zones. */ - - -#define AF_BLUE_STRING_MAX_LEN @AF_BLUE_STRING_MAX_LEN@ - - /* The AF_Blue_String enumeration values are offsets into the */ - /* `af_blue_strings' array. */ - - typedef enum AF_Blue_String_ - { -@AF_BLUE_STRING_ENUM@ - - AF_BLUE_STRING_MAX /* do not remove */ - - } AF_Blue_String; - - - FT_LOCAL_ARRAY( char ) - af_blue_strings[]; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** B L U E S T R I N G S E T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* The next level is to group blue strings into style-specific sets. */ - - - /* Properties are specific to a writing system. We assume that a given */ - /* blue string can't be used in more than a single writing system, which */ - /* is a safe bet. */ -#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) -#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) -#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) -#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) - -#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ -#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ -#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP - - -#define AF_BLUE_STRINGSET_MAX_LEN @AF_BLUE_STRINGSET_MAX_LEN@ - - /* The AF_Blue_Stringset enumeration values are offsets into the */ - /* `af_blue_stringsets' array. */ - - typedef enum AF_Blue_Stringset_ - { -@AF_BLUE_STRINGSET_ENUM@ - - AF_BLUE_STRINGSET_MAX /* do not remove */ - - } AF_Blue_Stringset; - - - typedef struct AF_Blue_StringRec_ - { - AF_Blue_String string; - FT_UShort properties; - - } AF_Blue_StringRec; - - - FT_LOCAL_ARRAY( AF_Blue_StringRec ) - af_blue_stringsets[]; - -/* */ - -FT_END_HEADER - - -#endif /* AFBLUE_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afcjk.c b/ThirdParty/freetype/src/autofit/afcjk.c deleted file mode 100644 index 3b2b1cf..0000000 --- a/ThirdParty/freetype/src/autofit/afcjk.c +++ /dev/null @@ -1,2405 +0,0 @@ -/**************************************************************************** - * - * afcjk.c - * - * Auto-fitter hinting routines for CJK writing system (body). - * - * 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. - * - */ - - /* - * The algorithm is based on akito's autohint patch, archived at - * - * https://web.archive.org/web/20051219160454/http://www.kde.gr.jp:80/~akito/patch/freetype2/2.1.7/ - * - */ - -#include <ft2build.h> -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H - -#include "afglobal.h" -#include "aflatin.h" -#include "afcjk.h" - - -#ifdef AF_CONFIG_OPTION_CJK - -#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT - -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afcjk - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Basically the Latin version with AF_CJKMetrics */ - /* to replace AF_LatinMetrics. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_init_widths( AF_CJKMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - FT_TRACE5(( "\n" - "cjk standard widths computation (style `%s')\n" - "===================================================\n" - "\n", - af_style_names[metrics->root.style_class->style] )); - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_ULong glyph_index; - int dim; - AF_CJKMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - AF_StyleClass style_class = metrics->root.style_class; - AF_ScriptClass script_class = af_script_classes[style_class->script]; - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - const char* p; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_ULong ch = 0; -#endif - - p = script_class->standard_charstring; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - - /* We check a list of standard characters. The first match wins. */ - - glyph_index = 0; - while ( *p ) - { - unsigned int num_idx; - -#ifdef FT_DEBUG_LEVEL_TRACE - const char* p_old; -#endif - - - while ( *p == ' ' ) - p++; - -#ifdef FT_DEBUG_LEVEL_TRACE - p_old = p; - GET_UTF8_CHAR( ch, p_old ); -#endif - - /* reject input that maps to more than a single glyph */ - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - if ( num_idx > 1 ) - continue; - - /* otherwise exit loop if we have a result */ - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - 0, - NULL, - NULL ); - if ( glyph_index ) - break; - } - - af_shaper_buf_destroy( face, shaper_buf ); - - if ( !glyph_index ) - goto Exit; - - if ( !glyph_index ) - goto Exit; - - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", - ch, glyph_index )); - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - - scaler->x_scale = 0x10000L; - scaler->y_scale = 0x10000L; - scaler->x_delta = 0; - scaler->y_delta = 0; - - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_CJKAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - /* - * We assume that the glyphs selected for the stem width - * computation are `featureless' enough so that the linking - * algorithm works fine without adjustments of its scoring - * function. - */ - af_latin_hints_link_segments( hints, - 0, - NULL, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_CJK_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - /* this also replaces multiple almost identical stem widths */ - /* with a single one (the value 100 is heuristic) */ - af_sort_and_quantize_widths( &num_widths, axis->widths, - dummy->units_per_em / 100 ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_CJKAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt i; - - - FT_TRACE5(( "%s widths:\n", - dim == AF_DIMENSION_VERT ? "horizontal" - : "vertical" )); - - FT_TRACE5(( " %d (standard)", axis->standard_width )); - for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); - - FT_TRACE5(( "\n" )); - } -#endif - } - } - - FT_TRACE5(( "\n" )); - - af_glyph_hints_done( hints ); - } - - - /* Find all blue zones. */ - - static void - af_cjk_metrics_init_blues( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_Pos fills[AF_BLUE_STRING_MAX_LEN]; - FT_Pos flats[AF_BLUE_STRING_MAX_LEN]; - - FT_UInt num_fills; - FT_UInt num_flats; - - FT_Bool fill; - - AF_CJKBlue blue; - FT_Error error; - AF_CJKAxis axis; - FT_Outline outline; - - AF_StyleClass sc = metrics->root.style_class; - - AF_Blue_Stringset bss = sc->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - - /* we walk over the blue character strings as specified in the */ - /* style's entry in the `af_blue_stringset' array, computing its */ - /* extremum points (depending on the string properties) */ - - FT_TRACE5(( "cjk blue zones computation\n" - "==========================\n" - "\n" )); - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) - axis = &metrics->axis[AF_DIMENSION_HORZ]; - else - axis = &metrics->axis[AF_DIMENSION_VERT]; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_String* cjk_blue_name[4] = - { - (FT_String*)"bottom", /* -- , -- */ - (FT_String*)"top", /* -- , TOP */ - (FT_String*)"left", /* HORIZ, -- */ - (FT_String*)"right" /* HORIZ, TOP */ - }; - - - FT_TRACE5(( "blue zone %d (%s):\n", - axis->blue_count, - cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) | - AF_CJK_IS_TOP_BLUE( bs ) ] )); - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - num_fills = 0; - num_flats = 0; - - fill = 1; /* start with characters that define fill values */ - FT_TRACE5(( " [overshoot values]\n" )); - - while ( *p ) - { - FT_ULong glyph_index; - FT_Pos best_pos; /* same as points.y or points.x, resp. */ - FT_Int best_point; - FT_Vector* points; - - unsigned int num_idx; - -#ifdef FT_DEBUG_LEVEL_TRACE - const char* p_old; - FT_ULong ch; -#endif - - - while ( *p == ' ' ) - p++; - -#ifdef FT_DEBUG_LEVEL_TRACE - p_old = p; - GET_UTF8_CHAR( ch, p_old ); -#endif - - /* switch to characters that define flat values */ - if ( *p == '|' ) - { - fill = 0; - FT_TRACE5(( " [reference values]\n" )); - p++; - continue; - } - - /* reject input that maps to more than a single glyph */ - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - if ( num_idx > 1 ) - continue; - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - 0, - NULL, - NULL ); - if ( glyph_index == 0 ) - { - FT_TRACE5(( " U+%04lX unavailable\n", ch )); - continue; - } - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - outline = face->glyph->outline; - if ( error || outline.n_points <= 2 ) - { - FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); - continue; - } - - /* now compute min or max point indices and coordinates */ - points = outline.points; - best_point = -1; - best_pos = 0; /* make compiler happy */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) - { - FT_Int pp; - - - last = outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last <= first ) - continue; - - if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) - { - if ( AF_CJK_IS_RIGHT_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].x > best_pos ) - { - best_point = pp; - best_pos = points[pp].x; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].x < best_pos ) - { - best_point = pp; - best_pos = points[pp].x; - } - } - } - else - { - if ( AF_CJK_IS_TOP_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_pos ) - { - best_point = pp; - best_pos = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_pos ) - { - best_point = pp; - best_pos = points[pp].y; - } - } - } - } - - FT_TRACE5(( " U+%04lX: best_pos = %5ld\n", ch, best_pos )); - } - - if ( fill ) - fills[num_fills++] = best_pos; - else - flats[num_flats++] = best_pos; - - } /* end while loop */ - - if ( num_flats == 0 && num_fills == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `fill' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_fills, fills ); - af_sort_pos( num_flats, flats ); - - blue = &axis->blues[axis->blue_count]; - blue_ref = &blue->ref.org; - blue_shoot = &blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = fills[num_fills / 2]; - } - else if ( num_fills == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = fills[num_fills / 2]; - *blue_shoot = flats[num_flats / 2]; - } - - /* make sure blue_ref >= blue_shoot for top/right or */ - /* vice versa for bottom/left */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool under_ref = FT_BOOL( shoot < ref ); - - - /* AF_CJK_IS_TOP_BLUE covers `right' and `top' */ - if ( AF_CJK_IS_TOP_BLUE( bs ) ^ under_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [reference smaller than overshoot," - " taking mean value]\n" )); - } - } - - blue->flags = 0; - if ( AF_CJK_IS_TOP_BLUE( bs ) ) - blue->flags |= AF_CJK_BLUE_TOP; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - - } /* end for loop */ - - af_shaper_buf_destroy( face, shaper_buf ); - - FT_TRACE5(( "\n" )); - - return; - } - - - /* Basically the Latin version with type AF_CJKMetrics for metrics. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_check_digits( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_Bool started = 0, same_width = 1; - FT_Fixed advance = 0, old_advance = 0; - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - /* in all supported charmaps, digits have character codes 0x30-0x39 */ - const char digits[] = "0 1 2 3 4 5 6 7 8 9"; - const char* p; - - - p = digits; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - - while ( *p ) - { - FT_ULong glyph_index; - unsigned int num_idx; - - - /* reject input that maps to more than a single glyph */ - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - if ( num_idx > 1 ) - continue; - - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - 0, - &advance, - NULL ); - if ( !glyph_index ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - af_shaper_buf_destroy( face, shaper_buf ); - - metrics->root.digits_have_same_width = same_width; - } - - - /* Initialize global metrics. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) - { - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - { - af_cjk_metrics_init_widths( metrics, face ); - af_cjk_metrics_init_blues( metrics, face ); - af_cjk_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - /* Adjust scaling value, then scale and shift widths */ - /* and blue zones (if applicable) for given dimension. */ - - static void - af_cjk_metrics_scale_dim( AF_CJKMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_CJKAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - axis->scale = scale; - axis->delta = delta; - - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_CJKBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_CJK_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - - /* shoot is under shoot for cjk */ - delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - FT_TRACE5(( "delta: %d", delta1 )); - if ( delta2 < 32 ) - delta2 = 0; -#if 0 - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); -#endif - else - delta2 = FT_PIX_ROUND( delta2 ); - FT_TRACE5(( "/%d\n", delta2 )); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->shoot.fit = blue->ref.fit - delta2; - - FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n" - " ref: cur=%.2f fit=%.2f\n" - " shoot: cur=%.2f fit=%.2f\n", - ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V', - nn, blue->ref.org, blue->shoot.org, - blue->ref.cur / 64.0, blue->ref.fit / 64.0, - blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); - - blue->flags |= AF_CJK_BLUE_ACTIVE; - } - } - } - - - /* Scale global values in both directions. */ - - FT_LOCAL_DEF( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) - { - /* we copy the whole structure since the x and y scaling values */ - /* are not modified, contrary to e.g. the `latin' auto-hinter */ - metrics->root.scaler = *scaler; - - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /* Extract standard_width from writing system/script specific */ - /* metrics class. */ - - FT_LOCAL_DEF( void ) - af_cjk_get_standard_widths( AF_CJKMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) - { - if ( stdHW ) - *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; - - if ( stdVW ) - *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Walk over all contours and compute its segments. */ - - static FT_Error - af_cjk_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Error error; - AF_Segment seg; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( error ) - return error; - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Point pt = seg->first; - AF_Point last = seg->last; - FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; - FT_UInt f1; - - - seg->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = pt->flags & AF_FLAG_CONTROL; - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - seg->flags |= AF_EDGE_ROUND; - } - } - - return FT_Err_Ok; - } - - - static void - af_cjk_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Direction major_dir = axis->major_dir; - AF_Segment seg1, seg2; - FT_Pos len_threshold; - FT_Pos dist_threshold; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - - dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) - { - FT_Pos dist = seg2->pos - seg1->pos; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - if ( dist * 8 < seg1->score * 9 && - ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) - { - seg1->score = dist; - seg1->len = len; - seg1->link = seg2; - } - - if ( dist * 8 < seg2->score * 9 && - ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) - { - seg2->score = dist; - seg2->len = len; - seg2->link = seg1; - } - } - } - } - } - - /* - * now compute the `serif' segments - * - * In Hanzi, some strokes are wider on one or both of the ends. - * We either identify the stems on the ends as serifs or remove - * the linkage, depending on the length of the stems. - * - */ - - { - AF_Segment link1, link2; - - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - link1 = seg1->link; - if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) - continue; - - if ( seg1->score >= dist_threshold ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - { - if ( seg2->pos > seg1->pos || seg1 == seg2 ) - continue; - - link2 = seg2->link; - if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) - continue; - - if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) - continue; - - if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) - continue; - - /* seg2 < seg1 < link1 < link2 */ - - if ( seg1->len >= seg2->len * 3 ) - { - AF_Segment seg; - - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Segment link = seg->link; - - - if ( link == seg2 ) - { - seg->link = NULL; - seg->serif = link1; - } - else if ( link == link2 ) - { - seg->link = NULL; - seg->serif = seg1; - } - } - } - else - { - seg1->link = link1->link = NULL; - - break; - } - } - } - } - - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = NULL; - - if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) - seg1->serif = seg2->link; - } - } - } - } - - - static FT_Error - af_cjk_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_CJKAxis laxis = &((AF_CJKMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - FT_Fixed scale; - FT_Pos edge_distance_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - /********************************************************************** - * - * We begin by generating a sorted table of edges for the current - * direction. To do so, we simply scan each segment and try to find - * an edge in our table that corresponds to its position. - * - * If no edge is found, we create and insert a new edge in the - * sorted table. Otherwise, we simply add the segment to the edge's - * list which is then processed in the second step to compute the - * edge's properties. - * - * Note that the edges table is sorted along the segment/edge - * position. - * - */ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = FT_DivFix( 64 / 4, scale ); - else - edge_distance_threshold = laxis->edge_distance_threshold; - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Pos best = 0xFFFFU; - FT_Int ee; - - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - if ( edge->dir != seg->dir ) - continue; - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && dist < best ) - { - AF_Segment link = seg->link; - - - /* check whether all linked segments of the candidate edge */ - /* can make a single edge. */ - if ( link ) - { - AF_Segment seg1 = edge->first; - FT_Pos dist2 = 0; - - - do - { - AF_Segment link1 = seg1->link; - - - if ( link1 ) - { - dist2 = AF_SEGMENT_DIST( link, link1 ); - if ( dist2 >= edge_distance_threshold ) - break; - } - - } while ( ( seg1 = seg1->edge_next ) != edge->first ); - - if ( dist2 >= edge_distance_threshold ) - continue; - } - - best = dist; - found = edge; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, 0, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - /******************************************************************* - * - * Good, we now compute each edge's properties according to the - * segments found on its position. Basically, these are - * - * - the edge's main direction - * - stem edge, serif edge or both (which defaults to stem then) - * - rounded edge, straight or both (which defaults to straight) - * - link for edge - * - */ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = FT_BOOL( seg->serif && seg->serif->edge != edge ); - - if ( seg->link || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = AF_SEGMENT_DIST( seg, seg2 ); - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - - /* get rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - /* Detect segments and edges for given dimension. */ - - static FT_Error - af_cjk_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_cjk_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_cjk_hints_link_segments( hints, dim ); - - error = af_cjk_hints_compute_edges( hints, dim ); - } - return error; - } - - - /* Compute all edges which lie within blue zones. */ - - static void - af_cjk_hints_compute_blue_edges( AF_GlyphHints hints, - AF_CJKMetrics metrics, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_CJKAxis cjk = &metrics->axis[dim]; - FT_Fixed scale = cjk->scale; - FT_Pos best_dist0; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */ - best_dist0 = 64 / 2; - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* If the distant between an edge and a blue zone is shorter than */ - /* best_dist0, set the blue zone for the edge. Then search for */ - /* the blue zone with the smallest best_dist to the edge. */ - - for ( ; edge < edge_limit; edge++ ) - { - FT_UInt bb; - AF_Width best_blue = NULL; - FT_Pos best_dist = best_dist0; - - - for ( bb = 0; bb < cjk->blue_count; bb++ ) - { - AF_CJKBlue blue = cjk->blues + bb; - FT_Bool is_top_right_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_right_blue = - (FT_Byte)( ( blue->flags & AF_CJK_BLUE_TOP ) != 0 ); - is_major_dir = - FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_right_blue ^ is_major_dir ) - { - FT_Pos dist; - AF_Width compare; - - - /* Compare the edge to the closest blue zone type */ - if ( FT_ABS( edge->fpos - blue->ref.org ) > - FT_ABS( edge->fpos - blue->shoot.org ) ) - compare = &blue->shoot; - else - compare = &blue->ref; - - dist = edge->fpos - compare->org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = compare; - } - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - /* Initalize hinting engine. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale when needed, since they may have - * been modified af_cjk_scale_dim above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels unless in `light' or `lcd' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* Snap a given width in scaled coordinates to one of the */ - /* current standard widths. */ - - static FT_Pos - af_cjk_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* Compute the snapped width of a given stem. */ - /* There is a lot of voodoo in this function; changing the hard-coded */ - /* parameters influence the whole hinting process. */ - - static FT_Pos - af_cjk_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_CJKMetrics metrics = (AF_CJKMetrics)hints->metrics; - AF_CJKAxis axis = &metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Bool vertical = FT_BOOL( dim == AF_DIMENSION_VERT ); - - FT_UNUSED( base_flags ); - FT_UNUSED( stem_flags ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - if ( axis->width_count > 0 ) - { - if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 54 ) - dist += ( 54 - dist ) / 2; - else if ( dist < 3 * 64 ) - { - FT_Pos delta; - - - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - else if ( delta < 22 ) - dist += 10; - else if ( delta < 42 ) - dist += delta; - else if ( delta < 54 ) - dist += 54; - else - dist += delta; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - - dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - dist = ( dist + 22 ) & ~63; - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* Align one stem edge relative to the previous stem edge. */ - - static void - af_cjk_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_cjk_compute_stem_width( hints, dim, dist, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( " CJKLINK: edge %d @%d (opos=%.2f) linked to %.2f," - " dist was %.2f, now %.2f\n", - stem_edge - hints->axis[dim].edges, stem_edge->fpos, - stem_edge->opos / 64.0, stem_edge->pos / 64.0, - dist / 64.0, fitted_width / 64.0 )); - } - - - /* Shift the coordinates of the `serif' edge by the same amount */ - /* as the corresponding `base' edge has been moved already. */ - - static void - af_cjk_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - -#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 -#define AF_LIGHT_MODE_MAX_VERT_GAP 15 -#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 - - - static FT_Pos - af_hint_normal_stem( AF_GlyphHints hints, - AF_Edge edge, - AF_Edge edge2, - FT_Pos anchor, - AF_Dimension dim ) - { - FT_Pos org_len, cur_len, org_center; - FT_Pos cur_pos1, cur_pos2; - FT_Pos d_off1, u_off1, d_off2, u_off2, delta; - FT_Pos offset; - FT_Pos threshold = 64; - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( ( edge->flags & AF_EDGE_ROUND ) && - ( edge2->flags & AF_EDGE_ROUND ) ) - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; - } - else - { - if ( dim == AF_DIMENSION_VERT ) - threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; - else - threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; - } - } - - org_len = edge2->opos - edge->opos; - cur_len = af_cjk_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - org_center = ( edge->opos + edge2->opos ) / 2 + anchor; - cur_pos1 = org_center - cur_len / 2; - cur_pos2 = cur_pos1 + cur_len; - d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); - d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); - u_off1 = 64 - d_off1; - u_off2 = 64 - d_off2; - delta = 0; - - - if ( d_off1 == 0 || d_off2 == 0 ) - goto Exit; - - if ( cur_len <= threshold ) - { - if ( d_off2 < cur_len ) - { - if ( u_off1 <= d_off2 ) - delta = u_off1; - else - delta = -d_off2; - } - - goto Exit; - } - - if ( threshold < 64 ) - { - if ( d_off1 >= threshold || u_off1 >= threshold || - d_off2 >= threshold || u_off2 >= threshold ) - goto Exit; - } - - offset = cur_len & 63; - - if ( offset < 32 ) - { - if ( u_off1 <= offset || d_off2 <= offset ) - goto Exit; - } - else - offset = 64 - threshold; - - d_off1 = threshold - u_off1; - u_off1 = u_off1 - offset; - u_off2 = threshold - d_off2; - d_off2 = d_off2 - offset; - - if ( d_off1 <= u_off1 ) - u_off1 = -d_off1; - - if ( d_off2 <= u_off2 ) - u_off2 = -d_off2; - - if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) - delta = u_off1; - else - delta = u_off2; - - Exit: - -#if 1 - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) - { - if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = AF_LIGHT_MODE_MAX_DELTA_ABS; - else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) - delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; - } -#endif - - cur_pos1 += delta; - - if ( edge->opos < edge2->opos ) - { - edge->pos = cur_pos1; - edge2->pos = cur_pos1 + cur_len; - } - else - { - edge->pos = cur_pos1 + cur_len; - edge2->pos = cur_pos1; - } - - return delta; - } - - - /* The main grid-fitting routine. */ - - static void - af_cjk_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Pos delta = 0; - FT_Int skipped = 0; - FT_Bool has_last_stem = FALSE; - FT_Pos last_stem_pos = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt num_actions = 0; -#endif - - - FT_TRACE5(( "cjk %s edge hinting (style `%s')\n", - dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", - af_style_names[hints->metrics->style_class->style] )); - - /* we begin by aligning all stems relative to the blue zone */ - - if ( AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " CJKBLUE: edge %d @%d (opos=%.2f) snapped to %.2f," - " was %.2f\n", - edge1 - edges, edge1->fpos, edge1->opos / 64.0, - blue->fit / 64.0, edge1->pos / 64.0 )); - - num_actions++; -#endif - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_cjk_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we align all stem edges. */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - skipped++; - continue; - } - - /* Some CJK characters have so many stems that - * the hinter is likely to merge two adjacent ones. - * To solve this problem, if either edge of a stem - * is too close to the previous one, we avoid - * aligning the two edges, but rather interpolate - * their locations at the end of this function in - * order to preserve the space between the stems. - */ - if ( has_last_stem && - ( edge->pos < last_stem_pos + 64 || - edge2->pos < last_stem_pos + 64 ) ) - { - skipped++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_cjk_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - continue; - } - - if ( edge2 < edge ) - { - af_cjk_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - /* We rarely reaches here it seems; - * usually the two edges belonging - * to one stem are marked as DONE together - */ - has_last_stem = TRUE; - last_stem_pos = edge->pos; - continue; - } - - if ( dim != AF_DIMENSION_VERT && !anchor ) - { - -#if 0 - if ( fixedpitch ) - { - AF_Edge left = edge; - AF_Edge right = edge_limit - 1; - AF_EdgeRec left1, left2, right1, right2; - FT_Pos target, center1, center2; - FT_Pos delta1, delta2, d1, d2; - - - while ( right > left && !right->link ) - right--; - - left1 = *left; - left2 = *left->link; - right1 = *right->link; - right2 = *right; - - delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; - target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; - - delta1 = delta; - delta1 += af_hint_normal_stem( hints, left, left->link, - delta1, 0 ); - - if ( left->link != right ) - af_hint_normal_stem( hints, right->link, right, delta1, 0 ); - - center1 = left->pos + ( right->pos - left->pos ) / 2; - - if ( center1 >= target ) - delta2 = delta - 32; - else - delta2 = delta + 32; - - delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); - - if ( delta1 != delta2 ) - { - if ( left->link != right ) - af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); - - center2 = left1.pos + ( right2.pos - left1.pos ) / 2; - - d1 = center1 - target; - d2 = center2 - target; - - if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) - { - left->pos = left1.pos; - left->link->pos = left2.pos; - - if ( left->link != right ) - { - right->link->pos = right1.pos; - right->pos = right2.pos; - } - - delta1 = delta2; - } - } - - delta = delta1; - right->link->flags |= AF_EDGE_DONE; - right->flags |= AF_EDGE_DONE; - } - else - -#endif /* 0 */ - - delta = af_hint_normal_stem( hints, edge, edge2, 0, - AF_DIMENSION_HORZ ); - } - else - af_hint_normal_stem( hints, edge, edge2, delta, dim ); - -#if 0 - printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", - edge - edges, edge2 - edges, - ( edge->pos - edge->opos ) / 64.0, - ( edge2->pos - edge2->opos ) / 64.0 ); -#endif - - anchor = edge; - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - has_last_stem = TRUE; - last_stem_pos = edge2->pos; - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( edge1->link == edge1 + 1 && - edge2->link == edge2 + 1 && - edge3->link == edge3 + 1 && span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( !skipped ) - goto Exit; - - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - if ( edge->flags & AF_EDGE_DONE ) - continue; - - if ( edge->serif ) - { - af_cjk_align_serif_edge( hints, edge->serif, edge ); - edge->flags |= AF_EDGE_DONE; - skipped--; - } - } - - if ( !skipped ) - goto Exit; - - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge before, after; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - before = after = edge; - - while ( --before >= edges ) - if ( before->flags & AF_EDGE_DONE ) - break; - - while ( ++after < edge_limit ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges || after < edge_limit ) - { - if ( before < edges ) - af_cjk_align_serif_edge( hints, after, edge ); - else if ( after >= edge_limit ) - af_cjk_align_serif_edge( hints, before, edge ); - else - { - if ( after->fpos == before->fpos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->fpos - before->fpos, - after->pos - before->pos, - after->fpos - before->fpos ); - } - } - } - - Exit: - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !num_actions ) - FT_TRACE5(( " (none)\n" )); - FT_TRACE5(( "\n" )); -#endif - - return; - } - - - static void - af_cjk_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - FT_Bool snapping; - - - snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && - AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || - ( dim == AF_DIMENSION_VERT && - AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); - - for ( edge = edges; edge < edge_limit; edge++ ) - { - /* move the points of each segment */ - /* in each edge to the edge's position */ - AF_Segment seg = edge->first; - - - if ( snapping ) - { - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - else - { - FT_Pos delta = edge->pos - edge->opos; - - - do - { - AF_Point point = seg->first; - - - for (;;) - { - if ( dim == AF_DIMENSION_HORZ ) - { - point->x += delta; - point->flags |= AF_FLAG_TOUCH_X; - } - else - { - point->y += delta; - point->flags |= AF_FLAG_TOUCH_Y; - } - - if ( point == seg->last ) - break; - - point = point->next; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - } - } - - - /* Apply the complete hinting algorithm to a CJK glyph. */ - - FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) - { - FT_Error error; - int dim; - - FT_UNUSED( metrics ); - FT_UNUSED( glyph_index ); - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - - af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ ); - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, (AF_Dimension)dim, - &scale, &delta ); - af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, - scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - af_cjk_hint_edges( hints, (AF_Dimension)dim ); - af_cjk_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_cjk_writing_system_class, - - AF_WRITING_SYSTEM_CJK, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply /* style_hints_apply */ - ) - - -#else /* !AF_CONFIG_OPTION_CJK */ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_cjk_writing_system_class, - - AF_WRITING_SYSTEM_CJK, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ - ) - - -#endif /* !AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afcjk.h b/ThirdParty/freetype/src/autofit/afcjk.h deleted file mode 100644 index 59acae5..0000000 --- a/ThirdParty/freetype/src/autofit/afcjk.h +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** - * - * afcjk.h - * - * Auto-fitter hinting routines for CJK writing system (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 AFCJK_H_ -#define AFCJK_H_ - -#include "afhints.h" -#include "aflatin.h" - - -FT_BEGIN_HEADER - - - /* the CJK-specific writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C J K G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * CJK glyphs tend to fill the square. So we have both vertical and - * horizontal blue zones. But some glyphs have flat bounding strokes that - * leave some space between neighbour glyphs. - */ - -#define AF_CJK_IS_TOP_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) -#define AF_CJK_IS_HORIZ_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) -#define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE - -#define AF_CJK_MAX_WIDTHS 16 - - -#define AF_CJK_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ -#define AF_CJK_BLUE_TOP ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */ -#define AF_CJK_BLUE_ADJUSTMENT ( 1U << 2 ) /* used for scale adjustment */ - /* optimization */ - - - typedef struct AF_CJKBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; /* undershoot */ - FT_UInt flags; - - } AF_CJKBlueRec, *AF_CJKBlue; - - - typedef struct AF_CJKAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; /* number of used widths */ - AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ - FT_Pos edge_distance_threshold; /* used for creating edges */ - FT_Pos standard_width; /* the default stem thickness */ - FT_Bool extra_light; /* is standard width very light? */ - - /* used for horizontal metrics too for CJK */ - FT_Bool control_overshoot; - FT_UInt blue_count; - AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_CJKAxisRec, *AF_CJKAxis; - - - typedef struct AF_CJKMetricsRec_ - { - AF_StyleMetricsRec root; - FT_UInt units_per_em; - AF_CJKAxisRec axis[AF_DIMENSION_MAX]; - - } AF_CJKMetricsRec, *AF_CJKMetrics; - - -#ifdef AF_CONFIG_OPTION_CJK - FT_LOCAL( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_cjk_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ); - - /* shared; called from afindic.c */ - FT_LOCAL( void ) - af_cjk_metrics_check_digits( AF_CJKMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_cjk_metrics_init_widths( AF_CJKMetrics metrics, - FT_Face face ); -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* */ - -FT_END_HEADER - -#endif /* AFCJK_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afcover.h b/ThirdParty/freetype/src/autofit/afcover.h deleted file mode 100644 index ff207a9..0000000 --- a/ThirdParty/freetype/src/autofit/afcover.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** - * - * afcover.h - * - * Auto-fitter coverages (specification only). - * - * Copyright (C) 2013-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 can be included multiple times. */ - /* Define `COVERAGE' as needed. */ - - - /* Add new coverages here. The first and second arguments are the */ - /* coverage name in lowercase and uppercase, respectively, followed */ - /* by a description string. The last four arguments are the four */ - /* characters defining the corresponding OpenType feature. */ - -#if 0 - /* XXX: It's not possible to define blue zone characters in advance. */ - COVERAGE( alternative_fractions, ALTERNATIVE_FRACTIONS, - "alternative fractions", - 'a', 'f', 'r', 'c' ) -#endif - - COVERAGE( petite_capitals_from_capitals, PETITE_CAPITALS_FROM_CAPITALS, - "petite capitals from capitals", - 'c', '2', 'c', 'p' ) - - COVERAGE( small_capitals_from_capitals, SMALL_CAPITALS_FROM_CAPITALS, - "small capitals from capitals", - 'c', '2', 's', 'c' ) - -#if 0 - /* XXX: Only digits are in this coverage, however, both normal style */ - /* and oldstyle representation forms are possible. */ - COVERAGE( denominators, DENOMINATORS, - "denominators", - 'd', 'n', 'o', 'm' ) -#endif - -#if 0 - /* XXX: It's not possible to define blue zone characters in advance. */ - COVERAGE( fractions, FRACTIONS, - "fractions", - 'f', 'r', 'a', 'c' ) -#endif - -#if 0 - /* XXX: Only digits are in this coverage, however, both normal style */ - /* and oldstyle representation forms are possible. */ - COVERAGE( numerators, NUMERATORS, - "numerators", - 'n', 'u', 'm', 'r' ) -#endif - - COVERAGE( ordinals, ORDINALS, - "ordinals", - 'o', 'r', 'd', 'n' ) - - COVERAGE( petite_capitals, PETITE_CAPITALS, - "petite capitals", - 'p', 'c', 'a', 'p' ) - - COVERAGE( ruby, RUBY, - "ruby", - 'r', 'u', 'b', 'y' ) - - COVERAGE( scientific_inferiors, SCIENTIFIC_INFERIORS, - "scientific inferiors", - 's', 'i', 'n', 'f' ) - - COVERAGE( small_capitals, SMALL_CAPITALS, - "small capitals", - 's', 'm', 'c', 'p' ) - - COVERAGE( subscript, SUBSCRIPT, - "subscript", - 's', 'u', 'b', 's' ) - - COVERAGE( superscript, SUPERSCRIPT, - "superscript", - 's', 'u', 'p', 's' ) - - COVERAGE( titling, TITLING, - "titling", - 't', 'i', 't', 'l' ) - -#if 0 - /* to be always excluded */ - COVERAGE(nalt, 'n', 'a', 'l', 't'); /* Alternate Annotation Forms (?) */ - COVERAGE(ornm, 'o', 'r', 'n', 'm'); /* Ornaments (?) */ -#endif - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afdummy.c b/ThirdParty/freetype/src/autofit/afdummy.c deleted file mode 100644 index 7e07a41..0000000 --- a/ThirdParty/freetype/src/autofit/afdummy.c +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** - * - * afdummy.c - * - * Auto-fitter dummy routines to be used if no hinting should be - * performed (body). - * - * 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. - * - */ - - -#include "afdummy.h" -#include "afhints.h" -#include "aferrors.h" - - - static FT_Error - af_dummy_hints_init( AF_GlyphHints hints, - AF_StyleMetrics metrics ) - { - af_glyph_hints_rescale( hints, metrics ); - - hints->x_scale = metrics->scaler.x_scale; - hints->y_scale = metrics->scaler.y_scale; - hints->x_delta = metrics->scaler.x_delta; - hints->y_delta = metrics->scaler.y_delta; - - return FT_Err_Ok; - } - - - static FT_Error - af_dummy_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_StyleMetrics metrics ) - { - FT_Error error; - - FT_UNUSED( glyph_index ); - FT_UNUSED( metrics ); - - - error = af_glyph_hints_reload( hints, outline ); - if ( !error ) - af_glyph_hints_save( hints, outline ); - - return error; - } - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_dummy_writing_system_class, - - AF_WRITING_SYSTEM_DUMMY, - - sizeof ( AF_StyleMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply /* style_hints_apply */ - ) - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afdummy.h b/ThirdParty/freetype/src/autofit/afdummy.h deleted file mode 100644 index ab9227d..0000000 --- a/ThirdParty/freetype/src/autofit/afdummy.h +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** - * - * afdummy.h - * - * Auto-fitter dummy routines to be used if no hinting should be - * performed (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFDUMMY_H_ -#define AFDUMMY_H_ - -#include "aftypes.h" - - -FT_BEGIN_HEADER - - /* A dummy writing system used when no hinting should be performed. */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_dummy_writing_system_class ) - -/* */ - -FT_END_HEADER - - -#endif /* AFDUMMY_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aferrors.h b/ThirdParty/freetype/src/autofit/aferrors.h deleted file mode 100644 index 2ec336f..0000000 --- a/ThirdParty/freetype/src/autofit/aferrors.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - * - * aferrors.h - * - * Autofitter error codes (specification only). - * - * Copyright (C) 2005-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 Autofitter error enumeration - * constants. - * - */ - -#ifndef AFERRORS_H_ -#define AFERRORS_H_ - -#include FT_MODULE_ERRORS_H - -#undef FTERRORS_H_ - -#undef FT_ERR_PREFIX -#define FT_ERR_PREFIX AF_Err_ -#define FT_ERR_BASE FT_Mod_Err_Autofit - -#include FT_ERRORS_H - -#endif /* AFERRORS_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afglobal.c b/ThirdParty/freetype/src/autofit/afglobal.c deleted file mode 100644 index 7183ce4..0000000 --- a/ThirdParty/freetype/src/autofit/afglobal.c +++ /dev/null @@ -1,498 +0,0 @@ -/**************************************************************************** - * - * afglobal.c - * - * Auto-fitter routines to compute global hinting values (body). - * - * 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. - * - */ - - -#include "afglobal.h" -#include "afranges.h" -#include "afshaper.h" -#include FT_INTERNAL_DEBUG_H - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afglobal - - - /* get writing system specific header files */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) /* empty */ -#include "afwrtsys.h" - -#include "aferrors.h" - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - AF_DEFINE_SCRIPT_CLASS( \ - af_ ## s ## _script_class, \ - AF_SCRIPT_ ## S, \ - af_ ## s ## _uniranges, \ - af_ ## s ## _nonbase_uniranges, \ - AF_ ## H, \ - ss ) - -#include "afscript.h" - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_DEFINE_STYLE_CLASS( \ - af_ ## s ## _style_class, \ - AF_STYLE_ ## S, \ - ws, \ - sc, \ - ss, \ - c ) - -#include "afstyles.h" - - -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - &af_ ## ws ## _writing_system_class, - - FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass ) - af_writing_system_classes[] = - { - -#include "afwrtsys.h" - - NULL /* do not remove */ - }; - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - &af_ ## s ## _script_class, - - FT_LOCAL_ARRAY_DEF( AF_ScriptClass ) - af_script_classes[] = - { - -#include "afscript.h" - - NULL /* do not remove */ - }; - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - &af_ ## s ## _style_class, - - FT_LOCAL_ARRAY_DEF( AF_StyleClass ) - af_style_classes[] = - { - -#include "afstyles.h" - - NULL /* do not remove */ - }; - - -#ifdef FT_DEBUG_LEVEL_TRACE - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) #s, - - FT_LOCAL_ARRAY_DEF( char* ) - af_style_names[] = - { - -#include "afstyles.h" - - }; - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - - /* Compute the style index of each glyph within a given face. */ - - static FT_Error - af_face_globals_compute_style_coverage( AF_FaceGlobals globals ) - { - FT_Error error; - FT_Face face = globals->face; - FT_CharMap old_charmap = face->charmap; - FT_UShort* gstyles = globals->glyph_styles; - FT_UInt ss; - FT_UInt i; - FT_UInt dflt = ~0U; /* a non-valid value */ - - - /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */ - for ( i = 0; i < (FT_UInt)globals->glyph_count; i++ ) - gstyles[i] = AF_STYLE_UNASSIGNED; - - error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); - if ( error ) - { - /* - * Ignore this error; we simply use the fallback style. - * XXX: Shouldn't we rather disable hinting? - */ - error = FT_Err_Ok; - goto Exit; - } - - /* scan each style in a Unicode charmap */ - for ( ss = 0; af_style_classes[ss]; ss++ ) - { - AF_StyleClass style_class = - af_style_classes[ss]; - AF_ScriptClass script_class = - af_script_classes[style_class->script]; - AF_Script_UniRange range; - - - if ( !script_class->script_uni_ranges ) - continue; - - /* - * Scan all Unicode points in the range and set the corresponding - * glyph style index. - */ - if ( style_class->coverage == AF_COVERAGE_DEFAULT ) - { - if ( (FT_UInt)style_class->script == - globals->module->default_script ) - dflt = ss; - - for ( range = script_class->script_uni_ranges; - range->first != 0; - range++ ) - { - FT_ULong charcode = range->first; - FT_UInt gindex; - - - gindex = FT_Get_Char_Index( face, charcode ); - - if ( gindex != 0 && - gindex < (FT_ULong)globals->glyph_count && - ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) - gstyles[gindex] = (FT_UShort)ss; - - for (;;) - { - charcode = FT_Get_Next_Char( face, charcode, &gindex ); - - if ( gindex == 0 || charcode > range->last ) - break; - - if ( gindex < (FT_ULong)globals->glyph_count && - ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) - gstyles[gindex] = (FT_UShort)ss; - } - } - - /* do the same for the script's non-base characters */ - for ( range = script_class->script_uni_nonbase_ranges; - range->first != 0; - range++ ) - { - FT_ULong charcode = range->first; - FT_UInt gindex; - - - gindex = FT_Get_Char_Index( face, charcode ); - - if ( gindex != 0 && - gindex < (FT_ULong)globals->glyph_count && - ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss ) - gstyles[gindex] |= AF_NONBASE; - - for (;;) - { - charcode = FT_Get_Next_Char( face, charcode, &gindex ); - - if ( gindex == 0 || charcode > range->last ) - break; - - if ( gindex < (FT_ULong)globals->glyph_count && - ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss ) - gstyles[gindex] |= AF_NONBASE; - } - } - } - else - { - /* get glyphs not directly addressable by cmap */ - af_shaper_get_coverage( globals, style_class, gstyles, 0 ); - } - } - - /* handle the remaining default OpenType features ... */ - for ( ss = 0; af_style_classes[ss]; ss++ ) - { - AF_StyleClass style_class = af_style_classes[ss]; - - - if ( style_class->coverage == AF_COVERAGE_DEFAULT ) - af_shaper_get_coverage( globals, style_class, gstyles, 0 ); - } - - /* ... and finally the default OpenType features of the default script */ - af_shaper_get_coverage( globals, af_style_classes[dflt], gstyles, 1 ); - - /* mark ASCII digits */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt gindex = FT_Get_Char_Index( face, i ); - - - if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) - gstyles[gindex] |= AF_DIGIT; - } - - Exit: - /* - * By default, all uncovered glyphs are set to the fallback style. - * XXX: Shouldn't we disable hinting or do something similar? - */ - if ( globals->module->fallback_style != AF_STYLE_UNASSIGNED ) - { - FT_Long nn; - - - for ( nn = 0; nn < globals->glyph_count; nn++ ) - { - if ( ( gstyles[nn] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) - { - gstyles[nn] &= ~AF_STYLE_MASK; - gstyles[nn] |= globals->module->fallback_style; - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - - FT_TRACE4(( "\n" - "style coverage\n" - "==============\n" - "\n" )); - - for ( ss = 0; af_style_classes[ss]; ss++ ) - { - AF_StyleClass style_class = af_style_classes[ss]; - FT_UInt count = 0; - FT_Long idx; - - - FT_TRACE4(( "%s:\n", af_style_names[style_class->style] )); - - for ( idx = 0; idx < globals->glyph_count; idx++ ) - { - if ( ( gstyles[idx] & AF_STYLE_MASK ) == style_class->style ) - { - if ( !( count % 10 ) ) - FT_TRACE4(( " " )); - - FT_TRACE4(( " %d", idx )); - count++; - - if ( !( count % 10 ) ) - FT_TRACE4(( "\n" )); - } - } - - if ( !count ) - FT_TRACE4(( " (none)\n" )); - if ( count % 10 ) - FT_TRACE4(( "\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ - - FT_Set_Charmap( face, old_charmap ); - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals, - AF_Module module ) - { - FT_Error error; - FT_Memory memory; - AF_FaceGlobals globals = NULL; - - - memory = face->memory; - - /* we allocate an AF_FaceGlobals structure together */ - /* with the glyph_styles array */ - if ( FT_ALLOC( globals, - sizeof ( *globals ) + - (FT_ULong)face->num_glyphs * sizeof ( FT_UShort ) ) ) - goto Exit; - - globals->face = face; - globals->glyph_count = face->num_glyphs; - /* right after the globals structure come the glyph styles */ - globals->glyph_styles = (FT_UShort*)( globals + 1 ); - globals->module = module; - globals->stem_darkening_for_ppem = 0; - globals->darken_x = 0; - globals->darken_y = 0; - globals->standard_vertical_width = 0; - globals->standard_horizontal_width = 0; - globals->scale_down_factor = 0; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - globals->hb_font = hb_ft_font_create( face, NULL ); - globals->hb_buf = hb_buffer_create(); -#endif - - error = af_face_globals_compute_style_coverage( globals ); - if ( error ) - { - af_face_globals_free( globals ); - globals = NULL; - } - else - globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX; - - Exit: - *aglobals = globals; - return error; - } - - - FT_LOCAL_DEF( void ) - af_face_globals_free( AF_FaceGlobals globals ) - { - if ( globals ) - { - FT_Memory memory = globals->face->memory; - FT_UInt nn; - - - for ( nn = 0; nn < AF_STYLE_MAX; nn++ ) - { - if ( globals->metrics[nn] ) - { - AF_StyleClass style_class = - af_style_classes[nn]; - AF_WritingSystemClass writing_system_class = - af_writing_system_classes[style_class->writing_system]; - - - if ( writing_system_class->style_metrics_done ) - writing_system_class->style_metrics_done( globals->metrics[nn] ); - - FT_FREE( globals->metrics[nn] ); - } - } - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - hb_font_destroy( globals->hb_font ); - hb_buffer_destroy( globals->hb_buf ); -#endif - - /* no need to free `globals->glyph_styles'; */ - /* it is part of the `globals' array */ - FT_FREE( globals ); - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_StyleMetrics *ametrics ) - { - AF_StyleMetrics metrics = NULL; - - AF_Style style = (AF_Style)options; - AF_WritingSystemClass writing_system_class; - AF_StyleClass style_class; - - FT_Error error = FT_Err_Ok; - - - if ( gindex >= (FT_ULong)globals->glyph_count ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* if we have a forced style (via `options'), use it, */ - /* otherwise look into `glyph_styles' array */ - if ( style == AF_STYLE_NONE_DFLT || style + 1 >= AF_STYLE_MAX ) - style = (AF_Style)( globals->glyph_styles[gindex] & - AF_STYLE_UNASSIGNED ); - - style_class = af_style_classes[style]; - writing_system_class = af_writing_system_classes - [style_class->writing_system]; - - metrics = globals->metrics[style]; - if ( !metrics ) - { - /* create the global metrics object if necessary */ - FT_Memory memory = globals->face->memory; - - - if ( FT_ALLOC( metrics, writing_system_class->style_metrics_size ) ) - goto Exit; - - metrics->style_class = style_class; - metrics->globals = globals; - - if ( writing_system_class->style_metrics_init ) - { - error = writing_system_class->style_metrics_init( metrics, - globals->face ); - if ( error ) - { - if ( writing_system_class->style_metrics_done ) - writing_system_class->style_metrics_done( metrics ); - - FT_FREE( metrics ); - goto Exit; - } - } - - globals->metrics[style] = metrics; - } - - Exit: - *ametrics = metrics; - - return error; - } - - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ) - { - if ( gindex < (FT_ULong)globals->glyph_count ) - return FT_BOOL( globals->glyph_styles[gindex] & AF_DIGIT ); - - return FT_BOOL( 0 ); - } - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afglobal.h b/ThirdParty/freetype/src/autofit/afglobal.h deleted file mode 100644 index 52f3835..0000000 --- a/ThirdParty/freetype/src/autofit/afglobal.h +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************************** - * - * afglobal.h - * - * Auto-fitter routines to compute global hinting values - * (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFGLOBAL_H_ -#define AFGLOBAL_H_ - - -#include "aftypes.h" -#include "afmodule.h" -#include "afshaper.h" - - -FT_BEGIN_HEADER - - - FT_LOCAL_ARRAY( AF_WritingSystemClass ) - af_writing_system_classes[]; - - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class ) - -#include "afscript.h" - - FT_LOCAL_ARRAY( AF_ScriptClass ) - af_script_classes[]; - - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_DECLARE_STYLE_CLASS( af_ ## s ## _style_class ) - -#include "afstyles.h" - - FT_LOCAL_ARRAY( AF_StyleClass ) - af_style_classes[]; - - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_LOCAL_ARRAY( char* ) - af_style_names[]; -#endif - - - /* - * Default values and flags for both autofitter globals (found in - * AF_ModuleRec) and face globals (in AF_FaceGlobalsRec). - */ - - /* index of fallback style in `af_style_classes' */ -#ifdef AF_CONFIG_OPTION_CJK -#define AF_STYLE_FALLBACK AF_STYLE_HANI_DFLT -#else -#define AF_STYLE_FALLBACK AF_STYLE_NONE_DFLT -#endif - /* default script for OpenType; ignored if HarfBuzz isn't used */ -#define AF_SCRIPT_DEFAULT AF_SCRIPT_LATN - - /* a bit mask for AF_DIGIT and AF_NONBASE */ -#define AF_STYLE_MASK 0x3FFF - /* an uncovered glyph */ -#define AF_STYLE_UNASSIGNED AF_STYLE_MASK - - /* if this flag is set, we have an ASCII digit */ -#define AF_DIGIT 0x8000U - /* if this flag is set, we have a non-base character */ -#define AF_NONBASE 0x4000U - - /* `increase-x-height' property */ -#define AF_PROP_INCREASE_X_HEIGHT_MIN 6 -#define AF_PROP_INCREASE_X_HEIGHT_MAX 0 - - - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** F A C E G L O B A L S *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - - - /* - * Note that glyph_styles[] maps each glyph to an index into the - * `af_style_classes' array. - * - */ - typedef struct AF_FaceGlobalsRec_ - { - FT_Face face; - FT_Long glyph_count; /* same as face->num_glyphs */ - FT_UShort* glyph_styles; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - hb_font_t* hb_font; - hb_buffer_t* hb_buf; /* for feature comparison */ -#endif - - /* per-face auto-hinter properties */ - FT_UInt increase_x_height; - - AF_StyleMetrics metrics[AF_STYLE_MAX]; - - /* Compute darkening amount once per size. Use this to check whether */ - /* darken_{x,y} needs to be recomputed. */ - FT_UShort stem_darkening_for_ppem; - /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_HORZ] */ - /* to compute the darkening amount. */ - FT_Pos standard_vertical_width; - /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_VERT] */ - /* to compute the darkening amount. */ - FT_Pos standard_horizontal_width; - /* The actual amount to darken a glyph along the X axis. */ - FT_Pos darken_x; - /* The actual amount to darken a glyph along the Y axis. */ - FT_Pos darken_y; - /* Amount to scale down by to keep emboldened points */ - /* on the Y-axis in pre-computed blue zones. */ - FT_Fixed scale_down_factor; - AF_Module module; /* to access global properties */ - - } AF_FaceGlobalsRec; - - - /* - * model the global hints data for a given face, decomposed into - * style-specific items - */ - - FT_LOCAL( FT_Error ) - af_face_globals_new( FT_Face face, - AF_FaceGlobals *aglobals, - AF_Module module ); - - FT_LOCAL( FT_Error ) - af_face_globals_get_metrics( AF_FaceGlobals globals, - FT_UInt gindex, - FT_UInt options, - AF_StyleMetrics *ametrics ); - - FT_LOCAL( void ) - af_face_globals_free( AF_FaceGlobals globals ); - - FT_LOCAL_DEF( FT_Bool ) - af_face_globals_is_digit( AF_FaceGlobals globals, - FT_UInt gindex ); - - /* */ - - -FT_END_HEADER - -#endif /* AFGLOBAL_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afhints.c b/ThirdParty/freetype/src/autofit/afhints.c deleted file mode 100644 index ed111c4..0000000 --- a/ThirdParty/freetype/src/autofit/afhints.c +++ /dev/null @@ -1,1720 +0,0 @@ -/**************************************************************************** - * - * afhints.c - * - * Auto-fitter hinting routines (body). - * - * 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. - * - */ - - -#include "afhints.h" -#include "aferrors.h" -#include FT_INTERNAL_CALC_H -#include FT_INTERNAL_DEBUG_H - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afhints - - - /* Get new segment for given axis. */ - - FT_LOCAL_DEF( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ) - { - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - - - if ( axis->num_segments < AF_SEGMENTS_EMBEDDED ) - { - if ( !axis->segments ) - { - axis->segments = axis->embedded.segments; - axis->max_segments = AF_SEGMENTS_EMBEDDED; - } - } - else if ( axis->num_segments >= axis->max_segments ) - { - FT_Int old_max = axis->max_segments; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); - - - if ( old_max >= big_max ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( axis->segments == axis->embedded.segments ) - { - if ( FT_NEW_ARRAY( axis->segments, new_max ) ) - goto Exit; - ft_memcpy( axis->segments, axis->embedded.segments, - sizeof ( axis->embedded.segments ) ); - } - else - { - if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) - goto Exit; - } - - axis->max_segments = new_max; - } - - segment = axis->segments + axis->num_segments++; - - Exit: - *asegment = segment; - return error; - } - - - /* Get new edge for given axis, direction, and position, */ - /* without initializing the edge itself. */ - - FT_LOCAL( FT_Error ) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Bool top_to_bottom_hinting, - FT_Memory memory, - AF_Edge *anedge ) - { - FT_Error error = FT_Err_Ok; - AF_Edge edge = NULL; - AF_Edge edges; - - - if ( axis->num_edges < AF_EDGES_EMBEDDED ) - { - if ( !axis->edges ) - { - axis->edges = axis->embedded.edges; - axis->max_edges = AF_EDGES_EMBEDDED; - } - } - else if ( axis->num_edges >= axis->max_edges ) - { - FT_Int old_max = axis->max_edges; - FT_Int new_max = old_max; - FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); - - - if ( old_max >= big_max ) - { - error = FT_THROW( Out_Of_Memory ); - goto Exit; - } - - new_max += ( new_max >> 2 ) + 4; - if ( new_max < old_max || new_max > big_max ) - new_max = big_max; - - if ( axis->edges == axis->embedded.edges ) - { - if ( FT_NEW_ARRAY( axis->edges, new_max ) ) - goto Exit; - ft_memcpy( axis->edges, axis->embedded.edges, - sizeof ( axis->embedded.edges ) ); - } - else - { - if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) - goto Exit; - } - - axis->max_edges = new_max; - } - - edges = axis->edges; - edge = edges + axis->num_edges; - - while ( edge > edges ) - { - if ( top_to_bottom_hinting ? ( edge[-1].fpos > fpos ) - : ( edge[-1].fpos < fpos ) ) - break; - - /* we want the edge with same position and minor direction */ - /* to appear before those in the major one in the list */ - if ( edge[-1].fpos == fpos && dir == axis->major_dir ) - break; - - edge[0] = edge[-1]; - edge--; - } - - axis->num_edges++; - - Exit: - *anedge = edge; - return error; - } - - -#ifdef FT_DEBUG_AUTOFIT - -#include FT_CONFIG_STANDARD_LIBRARY_H - - /* The dump functions are used in the `ftgrid' demo program, too. */ -#define AF_DUMP( varformat ) \ - do \ - { \ - if ( to_stdout ) \ - printf varformat; \ - else \ - FT_TRACE7( varformat ); \ - } while ( 0 ) - - - static const char* - af_dir_str( AF_Direction dir ) - { - const char* result; - - - switch ( dir ) - { - case AF_DIR_UP: - result = "up"; - break; - case AF_DIR_DOWN: - result = "down"; - break; - case AF_DIR_LEFT: - result = "left"; - break; - case AF_DIR_RIGHT: - result = "right"; - break; - default: - result = "none"; - } - - return result; - } - - -#define AF_INDEX_NUM( ptr, base ) (int)( (ptr) ? ( (ptr) - (base) ) : -1 ) - - - static char* - af_print_idx( char* p, - int idx ) - { - if ( idx == -1 ) - { - p[0] = '-'; - p[1] = '-'; - p[2] = '\0'; - } - else - ft_sprintf( p, "%d", idx ); - - return p; - } - - - static int - af_get_segment_index( AF_GlyphHints hints, - int point_idx, - int dimension ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Point point = hints->points + point_idx; - AF_Segment segments = axis->segments; - AF_Segment limit = segments + axis->num_segments; - AF_Segment segment; - - - for ( segment = segments; segment < limit; segment++ ) - { - if ( segment->first <= segment->last ) - { - if ( point >= segment->first && point <= segment->last ) - break; - } - else - { - AF_Point p = segment->first; - - - for (;;) - { - if ( point == p ) - goto Exit; - - if ( p == segment->last ) - break; - - p = p->next; - } - } - } - - Exit: - if ( segment == limit ) - return -1; - - return (int)( segment - segments ); - } - - - static int - af_get_edge_index( AF_GlyphHints hints, - int segment_idx, - int dimension ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Edge edges = axis->edges; - AF_Segment segment = axis->segments + segment_idx; - - - return segment_idx == -1 ? -1 : AF_INDEX_NUM( segment->edge, edges ); - } - - - static int - af_get_strong_edge_index( AF_GlyphHints hints, - AF_Edge* strong_edges, - int dimension ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Edge edges = axis->edges; - - - return AF_INDEX_NUM( strong_edges[dimension], edges ); - } - - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_points( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - AF_Point points = hints->points; - AF_Point limit = points + hints->num_points; - AF_Point* contour = hints->contours; - AF_Point* climit = contour + hints->num_contours; - AF_Point point; - - - AF_DUMP(( "Table of points:\n" )); - - if ( hints->num_points ) - { - AF_DUMP(( " index hedge hseg vedge vseg flags " - /* " XXXXX XXXXX XXXXX XXXXX XXXXX XXXXXX" */ - " xorg yorg xscale yscale xfit yfit " - /* " XXXXX XXXXX XXXX.XX XXXX.XX XXXX.XX XXXX.XX" */ - " hbef haft vbef vaft" )); - /* " XXXXX XXXXX XXXXX XXXXX" */ - } - else - AF_DUMP(( " (none)\n" )); - - for ( point = points; point < limit; point++ ) - { - int point_idx = AF_INDEX_NUM( point, points ); - int segment_idx_0 = af_get_segment_index( hints, point_idx, 0 ); - int segment_idx_1 = af_get_segment_index( hints, point_idx, 1 ); - - char buf1[16], buf2[16], buf3[16], buf4[16]; - char buf5[16], buf6[16], buf7[16], buf8[16]; - - - /* insert extra newline at the beginning of a contour */ - if ( contour < climit && *contour == point ) - { - AF_DUMP(( "\n" )); - contour++; - } - - AF_DUMP(( " %5d %5s %5s %5s %5s %s" - " %5d %5d %7.2f %7.2f %7.2f %7.2f" - " %5s %5s %5s %5s\n", - point_idx, - af_print_idx( buf1, - af_get_edge_index( hints, segment_idx_1, 1 ) ), - af_print_idx( buf2, segment_idx_1 ), - af_print_idx( buf3, - af_get_edge_index( hints, segment_idx_0, 0 ) ), - af_print_idx( buf4, segment_idx_0 ), - ( point->flags & AF_FLAG_NEAR ) - ? " near " - : ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) - ? " weak " - : "strong", - - point->fx, - point->fy, - point->ox / 64.0, - point->oy / 64.0, - point->x / 64.0, - point->y / 64.0, - - af_print_idx( buf5, af_get_strong_edge_index( hints, - point->before, - 1 ) ), - af_print_idx( buf6, af_get_strong_edge_index( hints, - point->after, - 1 ) ), - af_print_idx( buf7, af_get_strong_edge_index( hints, - point->before, - 0 ) ), - af_print_idx( buf8, af_get_strong_edge_index( hints, - point->after, - 0 ) ) )); - } - AF_DUMP(( "\n" )); - } -#ifdef __cplusplus - } -#endif - - - static const char* - af_edge_flags_to_string( FT_UInt flags ) - { - static char temp[32]; - int pos = 0; - - - if ( flags & AF_EDGE_ROUND ) - { - ft_memcpy( temp + pos, "round", 5 ); - pos += 5; - } - if ( flags & AF_EDGE_SERIF ) - { - if ( pos > 0 ) - temp[pos++] = ' '; - ft_memcpy( temp + pos, "serif", 5 ); - pos += 5; - } - if ( pos == 0 ) - return "normal"; - - temp[pos] = '\0'; - - return temp; - } - - - /* Dump the array of linked segments. */ - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_segments( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Point points = hints->points; - AF_Edge edges = axis->edges; - AF_Segment segments = axis->segments; - AF_Segment limit = segments + axis->num_segments; - AF_Segment seg; - - char buf1[16], buf2[16], buf3[16]; - - - AF_DUMP(( "Table of %s segments:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" - : "horizontal" )); - if ( axis->num_segments ) - { - AF_DUMP(( " index pos delta dir from to " - /* " XXXXX XXXXX XXXXX XXXXX XXXX XXXX" */ - " link serif edge" - /* " XXXX XXXXX XXXX" */ - " height extra flags\n" )); - /* " XXXXXX XXXXX XXXXXXXXXXX" */ - } - else - AF_DUMP(( " (none)\n" )); - - for ( seg = segments; seg < limit; seg++ ) - AF_DUMP(( " %5d %5d %5d %5s %4d %4d" - " %4s %5s %4s" - " %6d %5d %11s\n", - AF_INDEX_NUM( seg, segments ), - seg->pos, - seg->delta, - af_dir_str( (AF_Direction)seg->dir ), - AF_INDEX_NUM( seg->first, points ), - AF_INDEX_NUM( seg->last, points ), - - af_print_idx( buf1, AF_INDEX_NUM( seg->link, segments ) ), - af_print_idx( buf2, AF_INDEX_NUM( seg->serif, segments ) ), - af_print_idx( buf3, AF_INDEX_NUM( seg->edge, edges ) ), - - seg->height, - seg->height - ( seg->max_coord - seg->min_coord ), - af_edge_flags_to_string( seg->flags ) )); - AF_DUMP(( "\n" )); - } - } -#ifdef __cplusplus - } -#endif - - - /* Fetch number of segments. */ - -#ifdef __cplusplus - extern "C" { -#endif - FT_Error - af_glyph_hints_get_num_segments( AF_GlyphHints hints, - FT_Int dimension, - FT_Int* num_segments ) - { - AF_Dimension dim; - AF_AxisHints axis; - - - dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; - - axis = &hints->axis[dim]; - *num_segments = axis->num_segments; - - return FT_Err_Ok; - } -#ifdef __cplusplus - } -#endif - - - /* Fetch offset of segments into user supplied offset array. */ - -#ifdef __cplusplus - extern "C" { -#endif - FT_Error - af_glyph_hints_get_segment_offset( AF_GlyphHints hints, - FT_Int dimension, - FT_Int idx, - FT_Pos *offset, - FT_Bool *is_blue, - FT_Pos *blue_offset ) - { - AF_Dimension dim; - AF_AxisHints axis; - AF_Segment seg; - - - if ( !offset ) - return FT_THROW( Invalid_Argument ); - - dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; - - axis = &hints->axis[dim]; - - if ( idx < 0 || idx >= axis->num_segments ) - return FT_THROW( Invalid_Argument ); - - seg = &axis->segments[idx]; - *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->fx - : seg->first->fy; - if ( seg->edge ) - *is_blue = FT_BOOL( seg->edge->blue_edge ); - else - *is_blue = FALSE; - - if ( *is_blue ) - *blue_offset = seg->edge->blue_edge->org; - else - *blue_offset = 0; - - return FT_Err_Ok; - } -#ifdef __cplusplus - } -#endif - - - /* Dump the array of linked edges. */ - -#ifdef __cplusplus - extern "C" { -#endif - void - af_glyph_hints_dump_edges( AF_GlyphHints hints, - FT_Bool to_stdout ) - { - FT_Int dimension; - - - for ( dimension = 1; dimension >= 0; dimension-- ) - { - AF_AxisHints axis = &hints->axis[dimension]; - AF_Edge edges = axis->edges; - AF_Edge limit = edges + axis->num_edges; - AF_Edge edge; - - char buf1[16], buf2[16]; - - - /* - * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges - * since they have a constant X coordinate. - */ - if ( dimension == AF_DIMENSION_HORZ ) - AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", - "vertical", - 65536.0 * 64.0 / hints->x_scale, - 10.0 * hints->x_scale / 65536.0 / 64.0 )); - else - AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", - "horizontal", - 65536.0 * 64.0 / hints->y_scale, - 10.0 * hints->y_scale / 65536.0 / 64.0 )); - - if ( axis->num_edges ) - { - AF_DUMP(( " index pos dir link serif" - /* " XXXXX XXXX.XX XXXXX XXXX XXXXX" */ - " blue opos pos flags\n" )); - /* " X XXXX.XX XXXX.XX XXXXXXXXXXX" */ - } - else - AF_DUMP(( " (none)\n" )); - - for ( edge = edges; edge < limit; edge++ ) - AF_DUMP(( " %5d %7.2f %5s %4s %5s" - " %c %7.2f %7.2f %11s\n", - AF_INDEX_NUM( edge, edges ), - (int)edge->opos / 64.0, - af_dir_str( (AF_Direction)edge->dir ), - af_print_idx( buf1, AF_INDEX_NUM( edge->link, edges ) ), - af_print_idx( buf2, AF_INDEX_NUM( edge->serif, edges ) ), - - edge->blue_edge ? 'y' : 'n', - edge->opos / 64.0, - edge->pos / 64.0, - af_edge_flags_to_string( edge->flags ) )); - AF_DUMP(( "\n" )); - } - } -#ifdef __cplusplus - } -#endif - -#undef AF_DUMP - -#endif /* !FT_DEBUG_AUTOFIT */ - - - /* Compute the direction value of a given vector. */ - - FT_LOCAL_DEF( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ) - { - FT_Pos ll, ss; /* long and short arm lengths */ - AF_Direction dir; /* candidate direction */ - - - if ( dy >= dx ) - { - if ( dy >= -dx ) - { - dir = AF_DIR_UP; - ll = dy; - ss = dx; - } - else - { - dir = AF_DIR_LEFT; - ll = -dx; - ss = dy; - } - } - else /* dy < dx */ - { - if ( dy >= -dx ) - { - dir = AF_DIR_RIGHT; - ll = dx; - ss = dy; - } - else - { - dir = AF_DIR_DOWN; - ll = -dy; - ss = dx; - } - } - - /* return no direction if arm lengths do not differ enough */ - /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */ - /* the long arm is never negative */ - if ( ll <= 14 * FT_ABS( ss ) ) - dir = AF_DIR_NONE; - - return dir; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ) - { - /* no need to initialize the embedded items */ - FT_MEM_ZERO( hints, sizeof ( *hints ) - sizeof ( hints->embedded ) ); - hints->memory = memory; - } - - - FT_LOCAL_DEF( void ) - af_glyph_hints_done( AF_GlyphHints hints ) - { - FT_Memory memory; - int dim; - - - if ( !( hints && hints->memory ) ) - return; - - memory = hints->memory; - - /* - * note that we don't need to free the segment and edge - * buffers since they are really within the hints->points array - */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_AxisHints axis = &hints->axis[dim]; - - - axis->num_segments = 0; - axis->max_segments = 0; - if ( axis->segments != axis->embedded.segments ) - FT_FREE( axis->segments ); - - axis->num_edges = 0; - axis->max_edges = 0; - if ( axis->edges != axis->embedded.edges ) - FT_FREE( axis->edges ); - } - - if ( hints->contours != hints->embedded.contours ) - FT_FREE( hints->contours ); - hints->max_contours = 0; - hints->num_contours = 0; - - if ( hints->points != hints->embedded.points ) - FT_FREE( hints->points ); - hints->max_points = 0; - hints->num_points = 0; - - hints->memory = NULL; - } - - - /* Reset metrics. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_StyleMetrics metrics ) - { - hints->metrics = metrics; - hints->scaler_flags = metrics->scaler.flags; - } - - - /* Recompute all AF_Point in AF_GlyphHints from the definitions */ - /* in a source outline. */ - - FT_LOCAL_DEF( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ) - { - FT_Error error = FT_Err_Ok; - AF_Point points; - FT_UInt old_max, new_max; - FT_Fixed x_scale = hints->x_scale; - FT_Fixed y_scale = hints->y_scale; - FT_Pos x_delta = hints->x_delta; - FT_Pos y_delta = hints->y_delta; - FT_Memory memory = hints->memory; - - - hints->num_points = 0; - hints->num_contours = 0; - - hints->axis[0].num_segments = 0; - hints->axis[0].num_edges = 0; - hints->axis[1].num_segments = 0; - hints->axis[1].num_edges = 0; - - /* first of all, reallocate the contours array if necessary */ - new_max = (FT_UInt)outline->n_contours; - old_max = (FT_UInt)hints->max_contours; - - if ( new_max <= AF_CONTOURS_EMBEDDED ) - { - if ( !hints->contours ) - { - hints->contours = hints->embedded.contours; - hints->max_contours = AF_CONTOURS_EMBEDDED; - } - } - else if ( new_max > old_max ) - { - if ( hints->contours == hints->embedded.contours ) - hints->contours = NULL; - - new_max = ( new_max + 3 ) & ~3U; /* round up to a multiple of 4 */ - - if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) - goto Exit; - - hints->max_contours = (FT_Int)new_max; - } - - /* - * then reallocate the points arrays if necessary -- - * note that we reserve two additional point positions, used to - * hint metrics appropriately - */ - new_max = (FT_UInt)( outline->n_points + 2 ); - old_max = (FT_UInt)hints->max_points; - - if ( new_max <= AF_POINTS_EMBEDDED ) - { - if ( !hints->points ) - { - hints->points = hints->embedded.points; - hints->max_points = AF_POINTS_EMBEDDED; - } - } - else if ( new_max > old_max ) - { - if ( hints->points == hints->embedded.points ) - hints->points = NULL; - - new_max = ( new_max + 2 + 7 ) & ~7U; /* round up to a multiple of 8 */ - - if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) - goto Exit; - - hints->max_points = (FT_Int)new_max; - } - - hints->num_points = outline->n_points; - hints->num_contours = outline->n_contours; - - /* We can't rely on the value of `FT_Outline.flags' to know the fill */ - /* direction used for a glyph, given that some fonts are broken (e.g., */ - /* the Arphic ones). We thus recompute it each time we need to. */ - /* */ - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; - - if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) - { - hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; - hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; - } - - hints->x_scale = x_scale; - hints->y_scale = y_scale; - hints->x_delta = x_delta; - hints->y_delta = y_delta; - - hints->xmin_delta = 0; - hints->xmax_delta = 0; - - points = hints->points; - if ( hints->num_points == 0 ) - goto Exit; - - { - AF_Point point; - AF_Point point_limit = points + hints->num_points; - - /* value 20 in `near_limit' is heuristic */ - FT_UInt units_per_em = hints->metrics->scaler.face->units_per_EM; - FT_Int near_limit = 20 * units_per_em / 2048; - - - /* compute coordinates & Bezier flags, next and prev */ - { - FT_Vector* vec = outline->points; - char* tag = outline->tags; - FT_Short endpoint = outline->contours[0]; - AF_Point end = points + endpoint; - AF_Point prev = end; - FT_Int contour_index = 0; - - - for ( point = points; point < point_limit; point++, vec++, tag++ ) - { - FT_Pos out_x, out_y; - - - point->in_dir = (FT_Char)AF_DIR_NONE; - point->out_dir = (FT_Char)AF_DIR_NONE; - - point->fx = (FT_Short)vec->x; - point->fy = (FT_Short)vec->y; - point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; - point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; - - end->fx = (FT_Short)outline->points[endpoint].x; - end->fy = (FT_Short)outline->points[endpoint].y; - - switch ( FT_CURVE_TAG( *tag ) ) - { - case FT_CURVE_TAG_CONIC: - point->flags = AF_FLAG_CONIC; - break; - case FT_CURVE_TAG_CUBIC: - point->flags = AF_FLAG_CUBIC; - break; - default: - point->flags = AF_FLAG_NONE; - } - - out_x = point->fx - prev->fx; - out_y = point->fy - prev->fy; - - if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) - prev->flags |= AF_FLAG_NEAR; - - point->prev = prev; - prev->next = point; - prev = point; - - if ( point == end ) - { - if ( ++contour_index < outline->n_contours ) - { - endpoint = outline->contours[contour_index]; - end = points + endpoint; - prev = end; - } - } - -#ifdef FT_DEBUG_AUTOFIT - point->before[0] = NULL; - point->before[1] = NULL; - point->after[0] = NULL; - point->after[1] = NULL; -#endif - - } - } - - /* set up the contours array */ - { - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - short* end = outline->contours; - short idx = 0; - - - for ( ; contour < contour_limit; contour++, end++ ) - { - contour[0] = points + idx; - idx = (short)( end[0] + 1 ); - } - } - - { - /* - * Compute directions of `in' and `out' vectors. - * - * Note that distances between points that are very near to each - * other are accumulated. In other words, the auto-hinter either - * prepends the small vectors between near points to the first - * non-near vector, or the sum of small vector lengths exceeds a - * threshold, thus `grouping' the small vectors. All intermediate - * points are tagged as weak; the directions are adjusted also to - * be equal to the accumulated one. - */ - - FT_Int near_limit2 = 2 * near_limit - 1; - - AF_Point* contour; - AF_Point* contour_limit = hints->contours + hints->num_contours; - - - for ( contour = hints->contours; contour < contour_limit; contour++ ) - { - AF_Point first = *contour; - AF_Point next, prev, curr; - - FT_Pos out_x, out_y; - - - /* since the first point of a contour could be part of a */ - /* series of near points, go backwards to find the first */ - /* non-near point and adjust `first' */ - - point = first; - prev = first->prev; - - while ( prev != first ) - { - out_x = point->fx - prev->fx; - out_y = point->fy - prev->fy; - - /* - * We use Taxicab metrics to measure the vector length. - * - * Note that the accumulated distances so far could have the - * opposite direction of the distance measured here. For this - * reason we use `near_limit2' for the comparison to get a - * non-near point even in the worst case. - */ - if ( FT_ABS( out_x ) + FT_ABS( out_y ) >= near_limit2 ) - break; - - point = prev; - prev = prev->prev; - } - - /* adjust first point */ - first = point; - - /* now loop over all points of the contour to get */ - /* `in' and `out' vector directions */ - - curr = first; - - /* - * We abuse the `u' and `v' fields to store index deltas to the - * next and previous non-near point, respectively. - * - * To avoid problems with not having non-near points, we point to - * `first' by default as the next non-near point. - * - */ - curr->u = (FT_Pos)( first - curr ); - first->v = -curr->u; - - out_x = 0; - out_y = 0; - - next = first; - do - { - AF_Direction out_dir; - - - point = next; - next = point->next; - - out_x += next->fx - point->fx; - out_y += next->fy - point->fy; - - if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) - { - next->flags |= AF_FLAG_WEAK_INTERPOLATION; - continue; - } - - curr->u = (FT_Pos)( next - curr ); - next->v = -curr->u; - - out_dir = af_direction_compute( out_x, out_y ); - - /* adjust directions for all points inbetween; */ - /* the loop also updates position of `curr' */ - curr->out_dir = (FT_Char)out_dir; - for ( curr = curr->next; curr != next; curr = curr->next ) - { - curr->in_dir = (FT_Char)out_dir; - curr->out_dir = (FT_Char)out_dir; - } - next->in_dir = (FT_Char)out_dir; - - curr->u = (FT_Pos)( first - curr ); - first->v = -curr->u; - - out_x = 0; - out_y = 0; - - } while ( next != first ); - } - - /* - * The next step is to `simplify' an outline's topology so that we - * can identify local extrema more reliably: A series of - * non-horizontal or non-vertical vectors pointing into the same - * quadrant are handled as a single, long vector. From a - * topological point of the view, the intermediate points are of no - * interest and thus tagged as weak. - */ - - for ( point = points; point < point_limit; point++ ) - { - if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) - continue; - - if ( point->in_dir == AF_DIR_NONE && - point->out_dir == AF_DIR_NONE ) - { - /* check whether both vectors point into the same quadrant */ - - FT_Pos in_x, in_y; - FT_Pos out_x, out_y; - - AF_Point next_u = point + point->u; - AF_Point prev_v = point + point->v; - - - in_x = point->fx - prev_v->fx; - in_y = point->fy - prev_v->fy; - - out_x = next_u->fx - point->fx; - out_y = next_u->fy - point->fy; - - if ( ( in_x ^ out_x ) >= 0 && ( in_y ^ out_y ) >= 0 ) - { - /* yes, so tag current point as weak */ - /* and update index deltas */ - - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - - prev_v->u = (FT_Pos)( next_u - prev_v ); - next_u->v = -prev_v->u; - } - } - } - - /* - * Finally, check for remaining weak points. Everything else not - * collected in edges so far is then implicitly classified as strong - * points. - */ - - for ( point = points; point < point_limit; point++ ) - { - if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) - continue; - - if ( point->flags & AF_FLAG_CONTROL ) - { - /* control points are always weak */ - Is_Weak_Point: - point->flags |= AF_FLAG_WEAK_INTERPOLATION; - } - else if ( point->out_dir == point->in_dir ) - { - if ( point->out_dir != AF_DIR_NONE ) - { - /* current point lies on a horizontal or */ - /* vertical segment (but doesn't start or end it) */ - goto Is_Weak_Point; - } - - { - AF_Point next_u = point + point->u; - AF_Point prev_v = point + point->v; - - - if ( ft_corner_is_flat( point->fx - prev_v->fx, - point->fy - prev_v->fy, - next_u->fx - point->fx, - next_u->fy - point->fy ) ) - { - /* either the `in' or the `out' vector is much more */ - /* dominant than the other one, so tag current point */ - /* as weak and update index deltas */ - - prev_v->u = (FT_Pos)( next_u - prev_v ); - next_u->v = -prev_v->u; - - goto Is_Weak_Point; - } - } - } - else if ( point->in_dir == -point->out_dir ) - { - /* current point forms a spike */ - goto Is_Weak_Point; - } - } - } - } - - Exit: - return error; - } - - - /* Store the hinted outline in an FT_Outline structure. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - FT_Vector* vec = outline->points; - char* tag = outline->tags; - - - for ( ; point < limit; point++, vec++, tag++ ) - { - vec->x = point->x; - vec->y = point->y; - - if ( point->flags & AF_FLAG_CONIC ) - tag[0] = FT_CURVE_TAG_CONIC; - else if ( point->flags & AF_FLAG_CUBIC ) - tag[0] = FT_CURVE_TAG_CUBIC; - else - tag[0] = FT_CURVE_TAG_ON; - } - } - - - /**************************************************************** - * - * EDGE POINT GRID-FITTING - * - ****************************************************************/ - - - /* Align all points of an edge to the same coordinate value, */ - /* either horizontally or vertically. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = & hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( !edge ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->x = edge->pos; - point->flags |= AF_FLAG_TOUCH_X; - - if ( point == last ) - break; - - point = point->next; - } - } - } - else - { - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge edge = seg->edge; - AF_Point point, first, last; - - - if ( !edge ) - continue; - - first = seg->first; - last = seg->last; - point = first; - for (;;) - { - point->y = edge->pos; - point->flags |= AF_FLAG_TOUCH_Y; - - if ( point == last ) - break; - - point = point->next; - } - } - } - } - - - /**************************************************************** - * - * STRONG POINT INTERPOLATION - * - ****************************************************************/ - - - /* Hint the strong points -- this is equivalent to the TrueType `IP' */ - /* hinting instruction. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_UInt touch_flag; - - - if ( dim == AF_DIMENSION_HORZ ) - touch_flag = AF_FLAG_TOUCH_X; - else - touch_flag = AF_FLAG_TOUCH_Y; - - if ( edges < edge_limit ) - { - AF_Point point; - AF_Edge edge; - - - for ( point = points; point < point_limit; point++ ) - { - FT_Pos u, ou, fu; /* point position */ - FT_Pos delta; - - - if ( point->flags & touch_flag ) - continue; - - /* if this point is candidate to weak interpolation, we */ - /* interpolate it after all strong points have been processed */ - - if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ) - continue; - - if ( dim == AF_DIMENSION_VERT ) - { - u = point->fy; - ou = point->oy; - } - else - { - u = point->fx; - ou = point->ox; - } - - fu = u; - - /* is the point before the first edge? */ - edge = edges; - delta = edge->fpos - u; - if ( delta >= 0 ) - { - u = edge->pos - ( edge->opos - ou ); - -#ifdef FT_DEBUG_AUTOFIT - point->before[dim] = edge; - point->after[dim] = NULL; -#endif - - goto Store_Point; - } - - /* is the point after the last edge? */ - edge = edge_limit - 1; - delta = u - edge->fpos; - if ( delta >= 0 ) - { - u = edge->pos + ( ou - edge->opos ); - -#ifdef FT_DEBUG_AUTOFIT - point->before[dim] = NULL; - point->after[dim] = edge; -#endif - - goto Store_Point; - } - - { - FT_PtrDist min, max, mid; - FT_Pos fpos; - - - /* find enclosing edges */ - min = 0; - max = edge_limit - edges; - -#if 1 - /* for a small number of edges, a linear search is better */ - if ( max <= 8 ) - { - FT_PtrDist nn; - - - for ( nn = 0; nn < max; nn++ ) - if ( edges[nn].fpos >= u ) - break; - - if ( edges[nn].fpos == u ) - { - u = edges[nn].pos; - goto Store_Point; - } - min = nn; - } - else -#endif - while ( min < max ) - { - mid = ( max + min ) >> 1; - edge = edges + mid; - fpos = edge->fpos; - - if ( u < fpos ) - max = mid; - else if ( u > fpos ) - min = mid + 1; - else - { - /* we are on the edge */ - u = edge->pos; - -#ifdef FT_DEBUG_AUTOFIT - point->before[dim] = NULL; - point->after[dim] = NULL; -#endif - - goto Store_Point; - } - } - - /* point is not on an edge */ - { - AF_Edge before = edges + min - 1; - AF_Edge after = edges + min + 0; - - -#ifdef FT_DEBUG_AUTOFIT - point->before[dim] = before; - point->after[dim] = after; -#endif - - /* assert( before && after && before != after ) */ - if ( before->scale == 0 ) - before->scale = FT_DivFix( after->pos - before->pos, - after->fpos - before->fpos ); - - u = before->pos + FT_MulFix( fu - before->fpos, - before->scale ); - } - } - - Store_Point: - /* save the point position */ - if ( dim == AF_DIMENSION_HORZ ) - point->x = u; - else - point->y = u; - - point->flags |= touch_flag; - } - } - } - - - /**************************************************************** - * - * WEAK POINT INTERPOLATION - * - ****************************************************************/ - - - /* Shift the original coordinates of all points between `p1' and */ - /* `p2' to get hinted coordinates, using the same difference as */ - /* given by `ref'. */ - - static void - af_iup_shift( AF_Point p1, - AF_Point p2, - AF_Point ref ) - { - AF_Point p; - FT_Pos delta = ref->u - ref->v; - - - if ( delta == 0 ) - return; - - for ( p = p1; p < ref; p++ ) - p->u = p->v + delta; - - for ( p = ref + 1; p <= p2; p++ ) - p->u = p->v + delta; - } - - - /* Interpolate the original coordinates of all points between `p1' and */ - /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the */ - /* reference points. The `u' and `v' members are the current and */ - /* original coordinate values, respectively. */ - /* */ - /* Details can be found in the TrueType bytecode specification. */ - - static void - af_iup_interp( AF_Point p1, - AF_Point p2, - AF_Point ref1, - AF_Point ref2 ) - { - AF_Point p; - FT_Pos u, v1, v2, u1, u2, d1, d2; - - - if ( p1 > p2 ) - return; - - if ( ref1->v > ref2->v ) - { - p = ref1; - ref1 = ref2; - ref2 = p; - } - - v1 = ref1->v; - v2 = ref2->v; - u1 = ref1->u; - u2 = ref2->u; - d1 = u1 - v1; - d2 = u2 - v2; - - if ( u1 == u2 || v1 == v2 ) - { - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = u1; - - p->u = u; - } - } - else - { - FT_Fixed scale = FT_DivFix( u2 - u1, v2 - v1 ); - - - for ( p = p1; p <= p2; p++ ) - { - u = p->v; - - if ( u <= v1 ) - u += d1; - else if ( u >= v2 ) - u += d2; - else - u = u1 + FT_MulFix( u - v1, scale ); - - p->u = u; - } - } - } - - - /* Hint the weak points -- this is equivalent to the TrueType `IUP' */ - /* hinting instruction. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_Point points = hints->points; - AF_Point point_limit = points + hints->num_points; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - FT_UInt touch_flag; - AF_Point point; - AF_Point end_point; - AF_Point first_point; - - - /* PASS 1: Move segment points to edge positions */ - - if ( dim == AF_DIMENSION_HORZ ) - { - touch_flag = AF_FLAG_TOUCH_X; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->x; - point->v = point->ox; - } - } - else - { - touch_flag = AF_FLAG_TOUCH_Y; - - for ( point = points; point < point_limit; point++ ) - { - point->u = point->y; - point->v = point->oy; - } - } - - for ( ; contour < contour_limit; contour++ ) - { - AF_Point first_touched, last_touched; - - - point = *contour; - end_point = point->prev; - first_point = point; - - /* find first touched point */ - for (;;) - { - if ( point > end_point ) /* no touched point in contour */ - goto NextContour; - - if ( point->flags & touch_flag ) - break; - - point++; - } - - first_touched = point; - - for (;;) - { - FT_ASSERT( point <= end_point && - ( point->flags & touch_flag ) != 0 ); - - /* skip any touched neighbours */ - while ( point < end_point && - ( point[1].flags & touch_flag ) != 0 ) - point++; - - last_touched = point; - - /* find the next touched point, if any */ - point++; - for (;;) - { - if ( point > end_point ) - goto EndContour; - - if ( ( point->flags & touch_flag ) != 0 ) - break; - - point++; - } - - /* interpolate between last_touched and point */ - af_iup_interp( last_touched + 1, point - 1, - last_touched, point ); - } - - EndContour: - /* special case: only one point was touched */ - if ( last_touched == first_touched ) - af_iup_shift( first_point, end_point, first_touched ); - - else /* interpolate the last part */ - { - if ( last_touched < end_point ) - af_iup_interp( last_touched + 1, end_point, - last_touched, first_touched ); - - if ( first_touched > points ) - af_iup_interp( first_point, first_touched - 1, - last_touched, first_touched ); - } - - NextContour: - ; - } - - /* now save the interpolated values back to x/y */ - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < point_limit; point++ ) - point->x = point->u; - } - else - { - for ( point = points; point < point_limit; point++ ) - point->y = point->u; - } - } - - -#ifdef AF_CONFIG_OPTION_USE_WARPER - - /* Apply (small) warp scale and warp delta for given dimension. */ - - FT_LOCAL_DEF( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ) - { - AF_Point points = hints->points; - AF_Point points_limit = points + hints->num_points; - AF_Point point; - - - if ( dim == AF_DIMENSION_HORZ ) - { - for ( point = points; point < points_limit; point++ ) - point->x = FT_MulFix( point->fx, scale ) + delta; - } - else - { - for ( point = points; point < points_limit; point++ ) - point->y = FT_MulFix( point->fy, scale ) + delta; - } - } - -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afhints.h b/ThirdParty/freetype/src/autofit/afhints.h deleted file mode 100644 index e0cf612..0000000 --- a/ThirdParty/freetype/src/autofit/afhints.h +++ /dev/null @@ -1,487 +0,0 @@ -/**************************************************************************** - * - * afhints.h - * - * Auto-fitter hinting routines (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFHINTS_H_ -#define AFHINTS_H_ - -#include "aftypes.h" - -#define xxAF_SORT_SEGMENTS - -FT_BEGIN_HEADER - - /* - * The definition of outline glyph hints. These are shared by all - * writing system analysis routines (until now). - */ - - typedef enum AF_Dimension_ - { - AF_DIMENSION_HORZ = 0, /* x coordinates, */ - /* i.e., vertical segments & edges */ - AF_DIMENSION_VERT = 1, /* y coordinates, */ - /* i.e., horizontal segments & edges */ - - AF_DIMENSION_MAX /* do not remove */ - - } AF_Dimension; - - - /* hint directions -- the values are computed so that two vectors are */ - /* in opposite directions iff `dir1 + dir2 == 0' */ - typedef enum AF_Direction_ - { - AF_DIR_NONE = 4, - AF_DIR_RIGHT = 1, - AF_DIR_LEFT = -1, - AF_DIR_UP = 2, - AF_DIR_DOWN = -2 - - } AF_Direction; - - - /* - * The following explanations are mostly taken from the article - * - * Real-Time Grid Fitting of Typographic Outlines - * - * by David Turner and Werner Lemberg - * - * https://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf - * - * with appropriate updates. - * - * - * Segments - * - * `af_{cjk,latin,...}_hints_compute_segments' are the functions to - * find segments in an outline. - * - * A segment is a series of at least two consecutive points that are - * approximately aligned along a coordinate axis. The analysis to do - * so is specific to a writing system. - * - * - * Edges - * - * `af_{cjk,latin,...}_hints_compute_edges' are the functions to find - * edges. - * - * As soon as segments are defined, the auto-hinter groups them into - * edges. An edge corresponds to a single position on the main - * dimension that collects one or more segments (allowing for a small - * threshold). - * - * As an example, the `latin' writing system first tries to grid-fit - * edges, then to align segments on the edges unless it detects that - * they form a serif. - * - * - * A H - * | | - * | | - * | | - * | | - * C | | F - * +------<-----+ +-----<------+ - * | B G | - * | | - * | | - * +--------------->------------------+ - * D E - * - * - * Stems - * - * Stems are detected by `af_{cjk,latin,...}_hint_edges'. - * - * Segments need to be `linked' to other ones in order to detect stems. - * A stem is made of two segments that face each other in opposite - * directions and that are sufficiently close to each other. Using - * vocabulary from the TrueType specification, stem segments form a - * `black distance'. - * - * In the above ASCII drawing, the horizontal segments are BC, DE, and - * FG; the vertical segments are AB, CD, EF, and GH. - * - * Each segment has at most one `best' candidate to form a black - * distance, or no candidate at all. Notice that two distinct segments - * can have the same candidate, which frequently means a serif. - * - * A stem is recognized by the following condition: - * - * best segment_1 = segment_2 && best segment_2 = segment_1 - * - * The best candidate is stored in field `link' in structure - * `AF_Segment'. - * - * In the above ASCII drawing, the best candidate for both AB and CD is - * GH, while the best candidate for GH is AB. Similarly, the best - * candidate for EF and GH is AB, while the best candidate for AB is - * GH. - * - * The detection and handling of stems is dependent on the writing - * system. - * - * - * Serifs - * - * Serifs are detected by `af_{cjk,latin,...}_hint_edges'. - * - * In comparison to a stem, a serif (as handled by the auto-hinter - * module that takes care of the `latin' writing system) has - * - * best segment_1 = segment_2 && best segment_2 != segment_1 - * - * where segment_1 corresponds to the serif segment (CD and EF in the - * above ASCII drawing). - * - * The best candidate is stored in field `serif' in structure - * `AF_Segment' (and `link' is set to NULL). - * - * - * Touched points - * - * A point is called `touched' if it has been processed somehow by the - * auto-hinter. It basically means that it shouldn't be moved again - * (or moved only under certain constraints to preserve the already - * applied processing). - * - * - * Flat and round segments - * - * Segments are `round' or `flat', depending on the series of points - * that define them. A segment is round if the next and previous point - * of an extremum (which can be either a single point or sequence of - * points) are both conic or cubic control points. Otherwise, a - * segment with an extremum is flat. - * - * - * Strong Points - * - * Experience has shown that points not part of an edge need to be - * interpolated linearly between their two closest edges, even if these - * are not part of the contour of those particular points. Typical - * candidates for this are - * - * - angle points (i.e., points where the `in' and `out' direction - * differ greatly) - * - * - inflection points (i.e., where the `in' and `out' angles are the - * same, but the curvature changes sign) [currently, such points - * aren't handled specially in the auto-hinter] - * - * `af_glyph_hints_align_strong_points' is the function that takes - * care of such situations; it is equivalent to the TrueType `IP' - * hinting instruction. - * - * - * Weak Points - * - * Other points in the outline must be interpolated using the - * coordinates of their previous and next unfitted contour neighbours. - * These are called `weak points' and are touched by the function - * `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP' - * hinting instruction. Typical candidates are control points and - * points on the contour without a major direction. - * - * The major effect is to reduce possible distortion caused by - * alignment of edges and strong points, thus weak points are processed - * after strong points. - */ - - - /* point hint flags */ -#define AF_FLAG_NONE 0 - - /* point type flags */ -#define AF_FLAG_CONIC ( 1U << 0 ) -#define AF_FLAG_CUBIC ( 1U << 1 ) -#define AF_FLAG_CONTROL ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) - - /* point touch flags */ -#define AF_FLAG_TOUCH_X ( 1U << 2 ) -#define AF_FLAG_TOUCH_Y ( 1U << 3 ) - - /* candidates for weak interpolation have this flag set */ -#define AF_FLAG_WEAK_INTERPOLATION ( 1U << 4 ) - - /* the distance to the next point is very small */ -#define AF_FLAG_NEAR ( 1U << 5 ) - - - /* edge hint flags */ -#define AF_EDGE_NORMAL 0 -#define AF_EDGE_ROUND ( 1U << 0 ) -#define AF_EDGE_SERIF ( 1U << 1 ) -#define AF_EDGE_DONE ( 1U << 2 ) -#define AF_EDGE_NEUTRAL ( 1U << 3 ) /* edge aligns to a neutral blue zone */ - - - typedef struct AF_PointRec_* AF_Point; - typedef struct AF_SegmentRec_* AF_Segment; - typedef struct AF_EdgeRec_* AF_Edge; - - - typedef struct AF_PointRec_ - { - FT_UShort flags; /* point flags used by hinter */ - FT_Char in_dir; /* direction of inwards vector */ - FT_Char out_dir; /* direction of outwards vector */ - - FT_Pos ox, oy; /* original, scaled position */ - FT_Short fx, fy; /* original, unscaled position (in font units) */ - FT_Pos x, y; /* current position */ - FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ - - AF_Point next; /* next point in contour */ - AF_Point prev; /* previous point in contour */ - -#ifdef FT_DEBUG_AUTOFIT - /* track `before' and `after' edges for strong points */ - AF_Edge before[2]; - AF_Edge after[2]; -#endif - - } AF_PointRec; - - - typedef struct AF_SegmentRec_ - { - FT_Byte flags; /* edge/segment flags for this segment */ - FT_Char dir; /* segment direction */ - FT_Short pos; /* position of segment */ - FT_Short delta; /* deviation from segment position */ - FT_Short min_coord; /* minimum coordinate of segment */ - FT_Short max_coord; /* maximum coordinate of segment */ - FT_Short height; /* the hinted segment height */ - - AF_Edge edge; /* the segment's parent edge */ - AF_Segment edge_next; /* link to next segment in parent edge */ - - AF_Segment link; /* (stem) link segment */ - AF_Segment serif; /* primary segment for serifs */ - FT_Pos score; /* used during stem matching */ - FT_Pos len; /* used during stem matching */ - - AF_Point first; /* first point in edge segment */ - AF_Point last; /* last point in edge segment */ - - } AF_SegmentRec; - - - typedef struct AF_EdgeRec_ - { - FT_Short fpos; /* original, unscaled position (in font units) */ - FT_Pos opos; /* original, scaled position */ - FT_Pos pos; /* current position */ - - FT_Byte flags; /* edge flags */ - FT_Char dir; /* edge direction */ - FT_Fixed scale; /* used to speed up interpolation between edges */ - - AF_Width blue_edge; /* non-NULL if this is a blue edge */ - AF_Edge link; /* link edge */ - AF_Edge serif; /* primary edge for serifs */ - FT_Int score; /* used during stem matching */ - - AF_Segment first; /* first segment in edge */ - AF_Segment last; /* last segment in edge */ - - } AF_EdgeRec; - -#define AF_SEGMENTS_EMBEDDED 18 /* number of embedded segments */ -#define AF_EDGES_EMBEDDED 12 /* number of embedded edges */ - - typedef struct AF_AxisHintsRec_ - { - FT_Int num_segments; /* number of used segments */ - FT_Int max_segments; /* number of allocated segments */ - AF_Segment segments; /* segments array */ -#ifdef AF_SORT_SEGMENTS - FT_Int mid_segments; -#endif - - FT_Int num_edges; /* number of used edges */ - FT_Int max_edges; /* number of allocated edges */ - AF_Edge edges; /* edges array */ - - AF_Direction major_dir; /* either vertical or horizontal */ - - /* two arrays to avoid allocation penalty */ - struct - { - AF_SegmentRec segments[AF_SEGMENTS_EMBEDDED]; - AF_EdgeRec edges[AF_EDGES_EMBEDDED]; - } embedded; - - - } AF_AxisHintsRec, *AF_AxisHints; - - -#define AF_POINTS_EMBEDDED 96 /* number of embedded points */ -#define AF_CONTOURS_EMBEDDED 8 /* number of embedded contours */ - - typedef struct AF_GlyphHintsRec_ - { - FT_Memory memory; - - FT_Fixed x_scale; - FT_Pos x_delta; - - FT_Fixed y_scale; - FT_Pos y_delta; - - FT_Int max_points; /* number of allocated points */ - FT_Int num_points; /* number of used points */ - AF_Point points; /* points array */ - - FT_Int max_contours; /* number of allocated contours */ - FT_Int num_contours; /* number of used contours */ - AF_Point* contours; /* contours array */ - - AF_AxisHintsRec axis[AF_DIMENSION_MAX]; - - FT_UInt32 scaler_flags; /* copy of scaler flags */ - FT_UInt32 other_flags; /* free for style-specific */ - /* implementations */ - AF_StyleMetrics metrics; - - FT_Pos xmin_delta; /* used for warping */ - FT_Pos xmax_delta; - - /* Two arrays to avoid allocation penalty. */ - /* The `embedded' structure must be the last element! */ - struct - { - AF_Point contours[AF_CONTOURS_EMBEDDED]; - AF_PointRec points[AF_POINTS_EMBEDDED]; - } embedded; - - } AF_GlyphHintsRec; - - -#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) -#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) - - -#ifdef FT_DEBUG_AUTOFIT - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - ( !_af_debug_disable_horz_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - ( !_af_debug_disable_vert_hints && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) - -#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) - -#else /* !FT_DEBUG_AUTOFIT */ - -#define AF_HINTS_DO_HORIZONTAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) - -#define AF_HINTS_DO_VERTICAL( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) - -#define AF_HINTS_DO_BLUES( h ) 1 - -#endif /* !FT_DEBUG_AUTOFIT */ - - -#define AF_HINTS_DO_ADVANCE( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) - -#define AF_HINTS_DO_WARP( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_WARPER ) - - - - FT_LOCAL( AF_Direction ) - af_direction_compute( FT_Pos dx, - FT_Pos dy ); - - - FT_LOCAL( FT_Error ) - af_axis_hints_new_segment( AF_AxisHints axis, - FT_Memory memory, - AF_Segment *asegment ); - - FT_LOCAL( FT_Error) - af_axis_hints_new_edge( AF_AxisHints axis, - FT_Int fpos, - AF_Direction dir, - FT_Bool top_to_bottom_hinting, - FT_Memory memory, - AF_Edge *edge ); - - FT_LOCAL( void ) - af_glyph_hints_init( AF_GlyphHints hints, - FT_Memory memory ); - - FT_LOCAL( void ) - af_glyph_hints_rescale( AF_GlyphHints hints, - AF_StyleMetrics metrics ); - - FT_LOCAL( FT_Error ) - af_glyph_hints_reload( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_save( AF_GlyphHints hints, - FT_Outline* outline ); - - FT_LOCAL( void ) - af_glyph_hints_align_edge_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_strong_points( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_glyph_hints_align_weak_points( AF_GlyphHints hints, - AF_Dimension dim ); - -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_LOCAL( void ) - af_glyph_hints_scale_dim( AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed scale, - FT_Pos delta ); -#endif - - FT_LOCAL( void ) - af_glyph_hints_done( AF_GlyphHints hints ); - -/* */ - -#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) - -#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ - ? (seg1)->pos - (seg2)->pos \ - : (seg2)->pos - (seg1)->pos ) - - -FT_END_HEADER - -#endif /* AFHINTS_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afindic.c b/ThirdParty/freetype/src/autofit/afindic.c deleted file mode 100644 index a17117c..0000000 --- a/ThirdParty/freetype/src/autofit/afindic.c +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** - * - * afindic.c - * - * Auto-fitter hinting routines for Indic writing system (body). - * - * Copyright (C) 2007-2019 by - * Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#include "aftypes.h" -#include "aflatin.h" -#include "afcjk.h" - - -#ifdef AF_CONFIG_OPTION_INDIC - -#include "afindic.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - static FT_Error - af_indic_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) - { - /* skip blue zone init in CJK routines */ - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - face->charmap = NULL; - else - { - af_cjk_metrics_init_widths( metrics, face ); -#if 0 - /* either need indic specific blue_chars[] or just skip blue zones */ - af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars ); -#endif - af_cjk_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - - return FT_Err_Ok; - } - - - static void - af_indic_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) - { - /* use CJK routines */ - af_cjk_metrics_scale( metrics, scaler ); - } - - - static FT_Error - af_indic_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) - { - /* use CJK routines */ - return af_cjk_hints_init( hints, metrics ); - } - - - static FT_Error - af_indic_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) - { - /* use CJK routines */ - return af_cjk_hints_apply( glyph_index, hints, outline, metrics ); - } - - - /* Extract standard_width from writing system/script specific */ - /* metrics class. */ - - static void - af_indic_get_standard_widths( AF_CJKMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) - { - if ( stdHW ) - *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; - - if ( stdVW ) - *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** I N D I C S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_indic_writing_system_class, - - AF_WRITING_SYSTEM_INDIC, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply /* style_hints_apply */ - ) - - -#else /* !AF_CONFIG_OPTION_INDIC */ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_indic_writing_system_class, - - AF_WRITING_SYSTEM_INDIC, - - sizeof ( AF_CJKMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ - ) - - -#endif /* !AF_CONFIG_OPTION_INDIC */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afindic.h b/ThirdParty/freetype/src/autofit/afindic.h deleted file mode 100644 index bc5bc59..0000000 --- a/ThirdParty/freetype/src/autofit/afindic.h +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** - * - * afindic.h - * - * Auto-fitter hinting routines for Indic writing system - * (specification). - * - * Copyright (C) 2007-2019 by - * Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.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 AFINDIC_H_ -#define AFINDIC_H_ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the `indic' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_indic_writing_system_class ) - - -/* */ - -FT_END_HEADER - -#endif /* AFINDIC_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aflatin.c b/ThirdParty/freetype/src/autofit/aflatin.c deleted file mode 100644 index dccdcaf..0000000 --- a/ThirdParty/freetype/src/autofit/aflatin.c +++ /dev/null @@ -1,3604 +0,0 @@ -/**************************************************************************** - * - * aflatin.c - * - * Auto-fitter hinting routines for latin writing system (body). - * - * 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. - * - */ - - -#include <ft2build.h> -#include FT_ADVANCES_H -#include FT_INTERNAL_DEBUG_H - -#include "afglobal.h" -#include "aflatin.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT aflatin - - - /* needed for computation of round vs. flat segments */ -#define FLAT_THRESHOLD( x ) ( x / 14 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Find segments and links, compute all stem widths, and initialize */ - /* standard width and height for the glyph with given charcode. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - FT_TRACE5(( "\n" - "latin standard widths computation (style `%s')\n" - "=====================================================\n" - "\n", - af_style_names[metrics->root.style_class->style] )); - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_ULong glyph_index; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - AF_StyleClass style_class = metrics->root.style_class; - AF_ScriptClass script_class = af_script_classes[style_class->script]; - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - const char* p; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_ULong ch = 0; -#endif - - - p = script_class->standard_charstring; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - /* - * We check a list of standard characters to catch features like - * `c2sc' (small caps from caps) that don't contain lowercase letters - * by definition, or other features that mainly operate on numerals. - * The first match wins. - */ - - glyph_index = 0; - while ( *p ) - { - unsigned int num_idx; - -#ifdef FT_DEBUG_LEVEL_TRACE - const char* p_old; -#endif - - - while ( *p == ' ' ) - p++; - -#ifdef FT_DEBUG_LEVEL_TRACE - p_old = p; - GET_UTF8_CHAR( ch, p_old ); -#endif - - /* reject input that maps to more than a single glyph */ - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - if ( num_idx > 1 ) - continue; - - /* otherwise exit loop if we have a result */ - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - 0, - NULL, - NULL ); - if ( glyph_index ) - break; - } - - af_shaper_buf_destroy( face, shaper_buf ); - - if ( !glyph_index ) - goto Exit; - - FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", - ch, glyph_index )); - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - - scaler->x_scale = 0x10000L; - scaler->y_scale = 0x10000L; - scaler->x_delta = 0; - scaler->y_delta = 0; - - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - /* - * We assume that the glyphs selected for the stem width - * computation are `featureless' enough so that the linking - * algorithm works fine without adjustments of its scoring - * function. - */ - af_latin_hints_link_segments( hints, - 0, - NULL, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - /* this also replaces multiple almost identical stem widths */ - /* with a single one (the value 100 is heuristic) */ - af_sort_and_quantize_widths( &num_widths, axis->widths, - dummy->units_per_em / 100 ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_UInt i; - - - FT_TRACE5(( "%s widths:\n", - dim == AF_DIMENSION_VERT ? "horizontal" - : "vertical" )); - - FT_TRACE5(( " %d (standard)", axis->standard_width )); - for ( i = 1; i < axis->width_count; i++ ) - FT_TRACE5(( " %d", axis->widths[i].org )); - - FT_TRACE5(( "\n" )); - } -#endif - } - } - - FT_TRACE5(( "\n" )); - - af_glyph_hints_done( hints ); - } - - - static void - af_latin_sort_blue( FT_UInt count, - AF_LatinBlue* table ) - { - FT_UInt i, j; - AF_LatinBlue swap; - - - /* we sort from bottom to top */ - for ( i = 1; i < count; i++ ) - { - for ( j = i; j > 0; j-- ) - { - FT_Pos a, b; - - - if ( table[j - 1]->flags & ( AF_LATIN_BLUE_TOP | - AF_LATIN_BLUE_SUB_TOP ) ) - a = table[j - 1]->ref.org; - else - a = table[j - 1]->shoot.org; - - if ( table[j]->flags & ( AF_LATIN_BLUE_TOP | - AF_LATIN_BLUE_SUB_TOP ) ) - b = table[j]->ref.org; - else - b = table[j]->shoot.org; - - if ( b >= a ) - break; - - swap = table[j]; - table[j] = table[j - 1]; - table[j - 1] = swap; - } - } - } - - - /* Find all blue zones. Flat segments give the reference points, */ - /* round segments the overshoot positions. */ - - static void - af_latin_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_BLUE_STRING_MAX_LEN]; - FT_Pos rounds[AF_BLUE_STRING_MAX_LEN]; - - FT_UInt num_flats; - FT_UInt num_rounds; - - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_Outline outline; - - AF_StyleClass sc = metrics->root.style_class; - - AF_Blue_Stringset bss = sc->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - - /* we walk over the blue character strings as specified in the */ - /* style's entry in the `af_blue_stringset' array */ - - FT_TRACE5(( "latin blue zones computation\n" - "============================\n" - "\n" )); - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - FT_Pos ascender; - FT_Pos descender; - - -#ifdef FT_DEBUG_LEVEL_TRACE - { - FT_Bool have_flag = 0; - - - FT_TRACE5(( "blue zone %d", axis->blue_count )); - - if ( bs->properties ) - { - FT_TRACE5(( " (" )); - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - { - FT_TRACE5(( "top" )); - have_flag = 1; - } - else if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) - { - FT_TRACE5(( "sub top" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "neutral" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "small top" )); - have_flag = 1; - } - - if ( AF_LATIN_IS_LONG_BLUE( bs ) ) - { - if ( have_flag ) - FT_TRACE5(( ", " )); - FT_TRACE5(( "long" )); - } - - FT_TRACE5(( ")" )); - } - - FT_TRACE5(( ":\n" )); - } -#endif /* FT_DEBUG_LEVEL_TRACE */ - - num_flats = 0; - num_rounds = 0; - ascender = 0; - descender = 0; - - while ( *p ) - { - FT_ULong glyph_index; - FT_Long y_offset; - FT_Int best_point, best_contour_first, best_contour_last; - FT_Vector* points; - - FT_Pos best_y_extremum; /* same as points.y */ - FT_Bool best_round = 0; - - unsigned int i, num_idx; - -#ifdef FT_DEBUG_LEVEL_TRACE - const char* p_old; - FT_ULong ch; -#endif - - - while ( *p == ' ' ) - p++; - -#ifdef FT_DEBUG_LEVEL_TRACE - p_old = p; - GET_UTF8_CHAR( ch, p_old ); -#endif - - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - - if ( !num_idx ) - { - FT_TRACE5(( " U+%04lX unavailable\n", ch )); - continue; - } - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - best_y_extremum = FT_INT_MIN; - else - best_y_extremum = FT_INT_MAX; - - /* iterate over all glyph elements of the character cluster */ - /* and get the data of the `biggest' one */ - for ( i = 0; i < num_idx; i++ ) - { - FT_Pos best_y; - FT_Bool round = 0; - - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - i, - NULL, - &y_offset ); - if ( glyph_index == 0 ) - { - FT_TRACE5(( " U+%04lX unavailable\n", ch )); - continue; - } - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - outline = face->glyph->outline; - /* reject glyphs that don't produce any rendering */ - if ( error || outline.n_points <= 2 ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( num_idx == 1 ) - FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); - else - FT_TRACE5(( " component %d of cluster starting with U+%04lX" - " contains no (usable) outlines\n", i, ch )); -#endif - continue; - } - - /* now compute min or max point indices and coordinates */ - points = outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_contour_first = 0; /* ditto */ - best_contour_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = outline.contours[nn]; - - /* Avoid single-point contours since they are never */ - /* rasterized. In some fonts, they correspond to mark */ - /* attachment points that are way outside of the glyph's */ - /* real outline. */ - if ( last <= first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bs ) || - AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) - { - for ( pp = first; pp <= last; pp++ ) - { - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - ascender = FT_MAX( ascender, best_y + y_offset ); - } - else - descender = FT_MIN( descender, points[pp].y + y_offset ); - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - { - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - descender = FT_MIN( descender, best_y + y_offset ); - } - else - ascender = FT_MAX( ascender, points[pp].y + y_offset ); - } - } - - if ( best_point != old_best_point ) - { - best_contour_first = first; - best_contour_last = last; - } - } - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - if ( best_point >= 0 ) - { - FT_Pos best_x = points[best_point].x; - FT_Int prev, next; - FT_Int best_segment_first, best_segment_last; - FT_Int best_on_point_first, best_on_point_last; - FT_Pos dist; - - - best_segment_first = best_point; - best_segment_last = best_point; - - if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON ) - { - best_on_point_first = best_point; - best_on_point_last = best_point; - } - else - { - best_on_point_first = -1; - best_on_point_last = -1; - } - - /* look for the previous and next points on the contour */ - /* that are not on the same Y coordinate, then threshold */ - /* the `closeness'... */ - prev = best_point; - next = prev; - - do - { - if ( prev > best_contour_first ) - prev--; - else - prev = best_contour_last; - - dist = FT_ABS( points[prev].y - best_y ); - /* accept a small distance or a small angle (both values are */ - /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ - if ( dist > 5 ) - if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) - break; - - best_segment_first = prev; - - if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON ) - { - best_on_point_first = prev; - if ( best_on_point_last < 0 ) - best_on_point_last = prev; - } - - } while ( prev != best_point ); - - do - { - if ( next < best_contour_last ) - next++; - else - next = best_contour_first; - - dist = FT_ABS( points[next].y - best_y ); - if ( dist > 5 ) - if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) - break; - - best_segment_last = next; - - if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON ) - { - best_on_point_last = next; - if ( best_on_point_first < 0 ) - best_on_point_first = next; - } - - } while ( next != best_point ); - - if ( AF_LATIN_IS_LONG_BLUE( bs ) ) - { - /* If this flag is set, we have an additional constraint to */ - /* get the blue zone distance: Find a segment of the topmost */ - /* (or bottommost) contour that is longer than a heuristic */ - /* threshold. This ensures that small bumps in the outline */ - /* are ignored (for example, the `vertical serifs' found in */ - /* many Hebrew glyph designs). */ - - /* If this segment is long enough, we are done. Otherwise, */ - /* search the segment next to the extremum that is long */ - /* enough, has the same direction, and a not too large */ - /* vertical distance from the extremum. Note that the */ - /* algorithm doesn't check whether the found segment is */ - /* actually the one (vertically) nearest to the extremum. */ - - /* heuristic threshold value */ - FT_Pos length_threshold = metrics->units_per_em / 25; - - - dist = FT_ABS( points[best_segment_last].x - - points[best_segment_first].x ); - - if ( dist < length_threshold && - best_segment_last - best_segment_first + 2 <= - best_contour_last - best_contour_first ) - { - /* heuristic threshold value */ - FT_Pos height_threshold = metrics->units_per_em / 4; - - FT_Int first; - FT_Int last; - FT_Bool hit; - - /* we intentionally declare these two variables */ - /* outside of the loop since various compilers emit */ - /* incorrect warning messages otherwise, talking about */ - /* `possibly uninitialized variables' */ - FT_Int p_first = 0; /* make compiler happy */ - FT_Int p_last = 0; - - FT_Bool left2right; - - - /* compute direction */ - prev = best_point; - - do - { - if ( prev > best_contour_first ) - prev--; - else - prev = best_contour_last; - - if ( points[prev].x != best_x ) - break; - - } while ( prev != best_point ); - - /* skip glyph for the degenerate case */ - if ( prev == best_point ) - continue; - - left2right = FT_BOOL( points[prev].x < points[best_point].x ); - - first = best_segment_last; - last = first; - hit = 0; - - do - { - FT_Bool l2r; - FT_Pos d; - - - if ( !hit ) - { - /* no hit; adjust first point */ - first = last; - - /* also adjust first and last on point */ - if ( FT_CURVE_TAG( outline.tags[first] ) == - FT_CURVE_TAG_ON ) - { - p_first = first; - p_last = first; - } - else - { - p_first = -1; - p_last = -1; - } - - hit = 1; - } - - if ( last < best_contour_last ) - last++; - else - last = best_contour_first; - - if ( FT_ABS( best_y - points[first].y ) > height_threshold ) - { - /* vertical distance too large */ - hit = 0; - continue; - } - - /* same test as above */ - dist = FT_ABS( points[last].y - points[first].y ); - if ( dist > 5 ) - if ( FT_ABS( points[last].x - points[first].x ) <= - 20 * dist ) - { - hit = 0; - continue; - } - - if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON ) - { - p_last = last; - if ( p_first < 0 ) - p_first = last; - } - - l2r = FT_BOOL( points[first].x < points[last].x ); - d = FT_ABS( points[last].x - points[first].x ); - - if ( l2r == left2right && - d >= length_threshold ) - { - /* all constraints are met; update segment after */ - /* finding its end */ - do - { - if ( last < best_contour_last ) - last++; - else - last = best_contour_first; - - d = FT_ABS( points[last].y - points[first].y ); - if ( d > 5 ) - if ( FT_ABS( points[next].x - points[first].x ) <= - 20 * dist ) - { - if ( last > best_contour_first ) - last--; - else - last = best_contour_last; - break; - } - - p_last = last; - - if ( FT_CURVE_TAG( outline.tags[last] ) == - FT_CURVE_TAG_ON ) - { - p_last = last; - if ( p_first < 0 ) - p_first = last; - } - - } while ( last != best_segment_first ); - - best_y = points[first].y; - - best_segment_first = first; - best_segment_last = last; - - best_on_point_first = p_first; - best_on_point_last = p_last; - - break; - } - - } while ( last != best_segment_first ); - } - } - - /* for computing blue zones, we add the y offset as returned */ - /* by the currently used OpenType feature -- for example, */ - /* superscript glyphs might be identical to subscript glyphs */ - /* with a vertical shift */ - best_y += y_offset; - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( num_idx == 1 ) - FT_TRACE5(( " U+%04lX: best_y = %5ld", ch, best_y )); - else - FT_TRACE5(( " component %d of cluster starting with U+%04lX:" - " best_y = %5ld", i, ch, best_y )); -#endif - - /* now set the `round' flag depending on the segment's kind: */ - /* */ - /* - if the horizontal distance between the first and last */ - /* `on' point is larger than a heuristic threshold */ - /* we have a flat segment */ - /* - if either the first or the last point of the segment is */ - /* an `off' point, the segment is round, otherwise it is */ - /* flat */ - if ( best_on_point_first >= 0 && - best_on_point_last >= 0 && - ( FT_ABS( points[best_on_point_last].x - - points[best_on_point_first].x ) ) > - flat_threshold ) - round = 0; - else - round = FT_BOOL( - FT_CURVE_TAG( outline.tags[best_segment_first] ) != - FT_CURVE_TAG_ON || - FT_CURVE_TAG( outline.tags[best_segment_last] ) != - FT_CURVE_TAG_ON ); - - if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - { - /* only use flat segments for a neutral blue zone */ - FT_TRACE5(( " (round, skipped)\n" )); - continue; - } - - FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); - } - - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - { - if ( best_y > best_y_extremum ) - { - best_y_extremum = best_y; - best_round = round; - } - } - else - { - if ( best_y < best_y_extremum ) - { - best_y_extremum = best_y; - best_round = round; - } - } - - } /* end for loop */ - - if ( !( best_y_extremum == FT_INT_MIN || - best_y_extremum == FT_INT_MAX ) ) - { - if ( best_round ) - rounds[num_rounds++] = best_y_extremum; - else - flats[num_flats++] = best_y_extremum; - } - - } /* end while loop */ - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = &axis->blues[axis->blue_count]; - blue_ref = &blue->ref.org; - blue_shoot = &blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats [num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( ( AF_LATIN_IS_TOP_BLUE( bs ) || - AF_LATIN_IS_SUB_TOP_BLUE( bs) ) ^ over_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [overshoot smaller than reference," - " taking mean value]\n" )); - } - } - - blue->ascender = ascender; - blue->descender = descender; - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_SUB_TOP; - if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_NEUTRAL; - - /* - * The following flag is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - - } /* end for loop */ - - af_shaper_buf_destroy( face, shaper_buf ); - - /* we finally check whether blue zones are ordered; */ - /* `ref' and `shoot' values of two blue zones must not overlap */ - if ( axis->blue_count ) - { - FT_UInt i; - AF_LatinBlue blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2]; - - - for ( i = 0; i < axis->blue_count; i++ ) - blue_sorted[i] = &axis->blues[i]; - - /* sort bottoms of blue zones... */ - af_latin_sort_blue( axis->blue_count, blue_sorted ); - - /* ...and adjust top values if necessary */ - for ( i = 0; i < axis->blue_count - 1; i++ ) - { - FT_Pos* a; - FT_Pos* b; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Bool a_is_top = 0; -#endif - - - if ( blue_sorted[i]->flags & ( AF_LATIN_BLUE_TOP | - AF_LATIN_BLUE_SUB_TOP ) ) - { - a = &blue_sorted[i]->shoot.org; -#ifdef FT_DEBUG_LEVEL_TRACE - a_is_top = 1; -#endif - } - else - a = &blue_sorted[i]->ref.org; - - if ( blue_sorted[i + 1]->flags & ( AF_LATIN_BLUE_TOP | - AF_LATIN_BLUE_SUB_TOP ) ) - b = &blue_sorted[i + 1]->shoot.org; - else - b = &blue_sorted[i + 1]->ref.org; - - if ( *a > *b ) - { - *a = *b; - FT_TRACE5(( "blue zone overlap:" - " adjusting %s %d to %ld\n", - a_is_top ? "overshoot" : "reference", - blue_sorted[i] - axis->blues, - *a )); - } - } - } - - FT_TRACE5(( "\n" )); - - return; - } - - - /* Check whether all ASCII digits have the same advance width. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Bool started = 0, same_width = 1; - FT_Fixed advance = 0, old_advance = 0; - - /* If HarfBuzz is not available, we need a pointer to a single */ - /* unsigned long value. */ -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - void* shaper_buf; -#else - FT_ULong shaper_buf_; - void* shaper_buf = &shaper_buf_; -#endif - - /* in all supported charmaps, digits have character codes 0x30-0x39 */ - const char digits[] = "0 1 2 3 4 5 6 7 8 9"; - const char* p; - - - p = digits; - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - shaper_buf = af_shaper_buf_create( face ); -#endif - - while ( *p ) - { - FT_ULong glyph_index; - unsigned int num_idx; - - - /* reject input that maps to more than a single glyph */ - p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); - if ( num_idx > 1 ) - continue; - - glyph_index = af_shaper_get_elem( &metrics->root, - shaper_buf, - 0, - &advance, - NULL ); - if ( !glyph_index ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - af_shaper_buf_destroy( face, shaper_buf ); - - metrics->root.digits_have_same_width = same_width; - } - - - /* Initialize global metrics. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_CharMap oldmap = face->charmap; - - - metrics->units_per_em = face->units_per_EM; - - if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) - { - af_latin_metrics_init_widths( metrics, face ); - af_latin_metrics_init_blues( metrics, face ); - af_latin_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - /* Adjust scaling value, then scale and shift widths */ - /* and blue zones (if applicable) for given dimension. */ - - static void - af_latin_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct X and Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - { - AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < Axis->blue_count; nn++ ) - { - if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &Axis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled; - FT_Pos threshold; - FT_Pos fitted; - FT_UInt limit; - FT_UInt ppem; - - - scaled = FT_MulFix( blue->shoot.org, scale ); - ppem = metrics->root.scaler.face->size->metrics.x_ppem; - limit = metrics->root.globals->increase_x_height; - threshold = 40; - - /* if the `increase-x-height' property is active, */ - /* we round up much more often */ - if ( limit && - ppem <= limit && - ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) - threshold = 52; - - fitted = ( scaled + threshold ) & ~63; - - if ( scaled != fitted ) - { -#if 0 - if ( dim == AF_DIMENSION_HORZ ) - { - if ( fitted < scaled ) - scale -= scale / 50; /* scale *= 0.98 */ - } - else -#endif - if ( dim == AF_DIMENSION_VERT ) - { - FT_Pos max_height; - FT_Pos dist; - FT_Fixed new_scale; - - - new_scale = FT_MulDiv( scale, fitted, scaled ); - - /* the scaling should not change the result by more than two pixels */ - max_height = metrics->units_per_em; - - for ( nn = 0; nn < Axis->blue_count; nn++ ) - { - max_height = FT_MAX( max_height, Axis->blues[nn].ascender ); - max_height = FT_MAX( max_height, -Axis->blues[nn].descender ); - } - - dist = FT_ABS( FT_MulFix( max_height, new_scale - scale ) ); - dist &= ~127; - - if ( dist == 0 ) - { - FT_TRACE5(( - "af_latin_metrics_scale_dim:" - " x height alignment (style `%s'):\n" - " " - " vertical scaling changed from %.5f to %.5f (by %d%%)\n" - "\n", - af_style_names[metrics->root.style_class->style], - scale / 65536.0, - new_scale / 65536.0, - ( fitted - scaled ) * 100 / scaled )); - - scale = new_scale; - } -#ifdef FT_DEBUG_LEVEL_TRACE - else - { - FT_TRACE5(( - "af_latin_metrics_scale_dim:" - " x height alignment (style `%s'):\n" - " " - " excessive vertical scaling abandoned\n" - "\n", - af_style_names[metrics->root.style_class->style] )); - } -#endif - } - } - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - FT_TRACE5(( "%s widths (style `%s')\n", - dim == AF_DIMENSION_HORZ ? "horizontal" : "vertical", - af_style_names[metrics->root.style_class->style] )); - - /* scale the widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - - FT_TRACE5(( " %d scaled to %.2f\n", - width->org, - width->cur / 64.0 )); - } - - FT_TRACE5(( "\n" )); - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 5/8 pixels */ - axis->extra_light = - FT_BOOL( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( axis->extra_light ) - FT_TRACE5(( "`%s' style is extra light (at current resolution)\n" - "\n", - af_style_names[metrics->root.style_class->style] )); -#endif - - if ( dim == AF_DIMENSION_VERT ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( axis->blue_count ) - FT_TRACE5(( "blue zones (style `%s')\n", - af_style_names[metrics->root.style_class->style] )); -#endif - - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { -#if 0 - FT_Pos delta1; -#endif - FT_Pos delta2; - - - /* use discrete values for blue zone widths */ - -#if 0 - - /* generic, original code */ - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - -#else - - /* simplified version due to abs(dist) <= 48 */ - delta2 = dist; - if ( dist < 0 ) - delta2 = -delta2; - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 48 ) - delta2 = 32; - else - delta2 = 64; - - if ( dist < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit - delta2; - -#endif - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - } - } - - /* use sub-top blue zone only if it doesn't overlap with */ - /* another (non-sup-top) blue zone; otherwise, the */ - /* effect would be similar to a neutral blue zone, which */ - /* is not desired here */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_UInt i; - - - if ( !( blue->flags & AF_LATIN_BLUE_SUB_TOP ) ) - continue; - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - for ( i = 0; i < axis->blue_count; i++ ) - { - AF_LatinBlue b = &axis->blues[i]; - - - if ( b->flags & AF_LATIN_BLUE_SUB_TOP ) - continue; - if ( !( b->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - if ( b->ref.fit <= blue->shoot.fit && - b->shoot.fit >= blue->ref.fit ) - { - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - break; - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - - - FT_TRACE5(( " reference %d: %d scaled to %.2f%s\n" - " overshoot %d: %d scaled to %.2f%s\n", - nn, - blue->ref.org, - blue->ref.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)", - nn, - blue->shoot.org, - blue->shoot.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)" )); - } -#endif - } - } - - - /* Scale global values in both directions. */ - - FT_LOCAL_DEF( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - metrics->root.scaler.flags = scaler->flags; - - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /* Extract standard_width from writing system/script specific */ - /* metrics class. */ - - FT_LOCAL_DEF( void ) - af_latin_get_standard_widths( AF_LatinMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) - { - if ( stdHW ) - *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; - - if ( stdVW ) - *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* Walk over all contours and compute its segments. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point last = point->prev; - int on_edge = 0; - - /* we call values measured along a segment (point->v) */ - /* `coordinates', and values orthogonal to it (point->u) */ - /* `positions' */ - FT_Pos min_pos = 32000; - FT_Pos max_pos = -32000; - FT_Pos min_coord = 32000; - FT_Pos max_coord = -32000; - FT_UShort min_flags = AF_FLAG_NONE; - FT_UShort max_flags = AF_FLAG_NONE; - FT_Pos min_on_coord = 32000; - FT_Pos max_on_coord = -32000; - - FT_Bool passed; - - AF_Segment prev_segment = NULL; - - FT_Pos prev_min_pos = min_pos; - FT_Pos prev_max_pos = max_pos; - FT_Pos prev_min_coord = min_coord; - FT_Pos prev_max_coord = max_coord; - FT_UShort prev_min_flags = min_flags; - FT_UShort prev_max_flags = max_flags; - FT_Pos prev_min_on_coord = min_on_coord; - FT_Pos prev_max_on_coord = max_on_coord; - - - if ( FT_ABS( last->out_dir ) == major_dir && - FT_ABS( point->out_dir ) == major_dir ) - { - /* we are already on an edge, try to locate its start */ - last = point; - - for (;;) - { - point = point->prev; - if ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - break; - } - if ( point == last ) - break; - } - } - - last = point; - passed = 0; - - for (;;) - { - FT_Pos u, v; - - - if ( on_edge ) - { - /* get minimum and maximum position */ - u = point->u; - if ( u < min_pos ) - min_pos = u; - if ( u > max_pos ) - max_pos = u; - - /* get minimum and maximum coordinate together with flags */ - v = point->v; - if ( v < min_coord ) - { - min_coord = v; - min_flags = point->flags; - } - if ( v > max_coord ) - { - max_coord = v; - max_flags = point->flags; - } - - /* get minimum and maximum coordinate of `on' points */ - if ( !( point->flags & AF_FLAG_CONTROL ) ) - { - v = point->v; - if ( v < min_on_coord ) - min_on_coord = v; - if ( v > max_on_coord ) - max_on_coord = v; - } - - if ( point->out_dir != segment_dir || point == last ) - { - /* check whether the new segment's start point is identical to */ - /* the previous segment's end point; for example, this might */ - /* happen for spikes */ - - if ( !prev_segment || segment->first != prev_segment->last ) - { - /* points are different: we are just leaving an edge, thus */ - /* record a new segment */ - - segment->last = point; - segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); - segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); - - /* a segment is round if either its first or last point */ - /* is a control point, and the length of the on points */ - /* inbetween doesn't exceed a heuristic limit */ - if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && - ( max_on_coord - min_on_coord ) < flat_threshold ) - segment->flags |= AF_EDGE_ROUND; - - segment->min_coord = (FT_Short)min_coord; - segment->max_coord = (FT_Short)max_coord; - segment->height = segment->max_coord - segment->min_coord; - - prev_segment = segment; - prev_min_pos = min_pos; - prev_max_pos = max_pos; - prev_min_coord = min_coord; - prev_max_coord = max_coord; - prev_min_flags = min_flags; - prev_max_flags = max_flags; - prev_min_on_coord = min_on_coord; - prev_max_on_coord = max_on_coord; - } - else - { - /* points are the same: we don't create a new segment but */ - /* merge the current segment with the previous one */ - - if ( prev_segment->last->in_dir == point->in_dir ) - { - /* we have identical directions (this can happen for */ - /* degenerate outlines that move zig-zag along the main */ - /* axis without changing the coordinate value of the other */ - /* axis, and where the segments have just been merged): */ - /* unify segments */ - - /* update constraints */ - - if ( prev_min_pos < min_pos ) - min_pos = prev_min_pos; - if ( prev_max_pos > max_pos ) - max_pos = prev_max_pos; - - if ( prev_min_coord < min_coord ) - { - min_coord = prev_min_coord; - min_flags = prev_min_flags; - } - if ( prev_max_coord > max_coord ) - { - max_coord = prev_max_coord; - max_flags = prev_max_flags; - } - - if ( prev_min_on_coord < min_on_coord ) - min_on_coord = prev_min_on_coord; - if ( prev_max_on_coord > max_on_coord ) - max_on_coord = prev_max_on_coord; - - prev_segment->last = point; - prev_segment->pos = (FT_Short)( ( min_pos + - max_pos ) >> 1 ); - prev_segment->delta = (FT_Short)( ( max_pos - - min_pos ) >> 1 ); - - if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && - ( max_on_coord - min_on_coord ) < flat_threshold ) - prev_segment->flags |= AF_EDGE_ROUND; - else - prev_segment->flags &= ~AF_EDGE_ROUND; - - prev_segment->min_coord = (FT_Short)min_coord; - prev_segment->max_coord = (FT_Short)max_coord; - prev_segment->height = prev_segment->max_coord - - prev_segment->min_coord; - } - else - { - /* we have different directions; use the properties of the */ - /* longer segment and discard the other one */ - - if ( FT_ABS( prev_max_coord - prev_min_coord ) > - FT_ABS( max_coord - min_coord ) ) - { - /* discard current segment */ - - if ( min_pos < prev_min_pos ) - prev_min_pos = min_pos; - if ( max_pos > prev_max_pos ) - prev_max_pos = max_pos; - - prev_segment->last = point; - prev_segment->pos = (FT_Short)( ( prev_min_pos + - prev_max_pos ) >> 1 ); - prev_segment->delta = (FT_Short)( ( prev_max_pos - - prev_min_pos ) >> 1 ); - } - else - { - /* discard previous segment */ - - if ( prev_min_pos < min_pos ) - min_pos = prev_min_pos; - if ( prev_max_pos > max_pos ) - max_pos = prev_max_pos; - - segment->last = point; - segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); - segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); - - if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && - ( max_on_coord - min_on_coord ) < flat_threshold ) - segment->flags |= AF_EDGE_ROUND; - - segment->min_coord = (FT_Short)min_coord; - segment->max_coord = (FT_Short)max_coord; - segment->height = segment->max_coord - - segment->min_coord; - - *prev_segment = *segment; - - prev_min_pos = min_pos; - prev_max_pos = max_pos; - prev_min_coord = min_coord; - prev_max_coord = max_coord; - prev_min_flags = min_flags; - prev_max_flags = max_flags; - prev_min_on_coord = min_on_coord; - prev_max_on_coord = max_on_coord; - } - } - - axis->num_segments--; - } - - on_edge = 0; - segment = NULL; - - /* fall through */ - } - } - - /* now exit if we are at the start/end point */ - if ( point == last ) - { - if ( passed ) - break; - passed = 1; - } - - /* if we are not on an edge, check whether the major direction */ - /* coincides with the current point's `out' direction, or */ - /* whether we have a single-point contour */ - if ( !on_edge && - ( FT_ABS( point->out_dir ) == major_dir || - point == point->prev ) ) - { - /* this is the start of a new segment! */ - segment_dir = (AF_Direction)point->out_dir; - - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - /* clear all segment fields */ - segment[0] = seg0; - - segment->dir = (FT_Char)segment_dir; - segment->first = point; - segment->last = point; - - /* `af_axis_hints_new_segment' reallocates memory, */ - /* thus we have to refresh the `prev_segment' pointer */ - if ( prev_segment ) - prev_segment = segment - 1; - - min_pos = max_pos = point->u; - min_coord = max_coord = point->v; - min_flags = max_flags = point->flags; - - if ( point->flags & AF_FLAG_CONTROL ) - { - min_on_coord = 32000; - max_on_coord = -32000; - } - else - min_on_coord = max_on_coord = point->v; - - on_edge = 1; - - if ( point == point->prev ) - { - /* we have a one-point segment: this is a one-point */ - /* contour with `in' and `out' direction set to */ - /* AF_DIR_NONE */ - segment->pos = (FT_Short)min_pos; - - if (point->flags & AF_FLAG_CONTROL) - segment->flags |= AF_EDGE_ROUND; - - segment->min_coord = (FT_Short)point->v; - segment->max_coord = (FT_Short)point->v; - segment->height = 0; - - on_edge = 0; - segment = NULL; - } - } - - point = point->next; - } - - } /* contours */ - - - /* now slightly increase the height of segments if this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first_v < last_v ) - { - AF_Point p; - - - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - AF_Point p; - - - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - - Exit: - return error; - } - - - /* Link segments to form stems and serifs. If `width_count' and */ - /* `widths' are non-zero, use them to fine-tune the scoring function. */ - - FT_LOCAL_DEF( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - FT_Pos len_threshold, len_score, dist_score, max_width; - AF_Segment seg1, seg2; - - - if ( width_count ) - max_width = widths[width_count - 1].org; - else - max_width = 0; - - /* a heuristic value to set up a minimum value for overlapping */ - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - /* a heuristic value to weight lengths */ - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - - /* a heuristic value to weight distances (no call to */ - /* AF_LATIN_CONSTANT needed, since we work on multiples */ - /* of the stem width) */ - dist_score = 3000; - - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - /* search for stems having opposite directions, */ - /* with seg1 to the `left' of seg2 */ - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - - - if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 ) - { - /* compute distance between the two segments */ - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - /* compute maximum coordinate difference of the two segments */ - /* (this is, how much they overlap) */ - len = max - min; - if ( len >= len_threshold ) - { - /* - * The score is the sum of two demerits indicating the - * `badness' of a fit, measured along the segments' main axis - * and orthogonal to it, respectively. - * - * - The less overlapping along the main axis, the worse it - * is, causing a larger demerit. - * - * - The nearer the orthogonal distance to a stem width, the - * better it is, causing a smaller demerit. For simplicity, - * however, we only increase the demerit for values that - * exceed the largest stem width. - */ - - FT_Pos dist = pos2 - pos1; - - FT_Pos dist_demerit, score; - - - if ( max_width ) - { - /* distance demerits are based on multiples of `max_width'; */ - /* we scale by 1024 for getting more precision */ - FT_Pos delta = ( dist << 10 ) / max_width - ( 1 << 10 ); - - - if ( delta > 10000 ) - dist_demerit = 32000; - else if ( delta > 0 ) - dist_demerit = delta * delta / dist_score; - else - dist_demerit = 0; - } - else - dist_demerit = dist; /* default if no widths available */ - - score = dist_demerit + len_score / len; - - /* and we search for the smallest score */ - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } - - /* now compute the `serif' segments, cf. explanations in `afhints.h' */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = 0; - seg1->serif = seg2->link; - } - } - } - } - - - /* Link segments to edges, using feature analysis for selection. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_StyleClass style_class = hints->metrics->style_class; - AF_ScriptClass script_class = af_script_classes[style_class->script]; - - FT_Bool top_to_bottom_hinting = 0; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - -#if 0 - AF_Direction up_dir; -#endif - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - FT_Pos segment_width_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - -#if 0 - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; -#endif - - if ( dim == AF_DIMENSION_VERT ) - top_to_bottom_hinting = script_class->top_to_bottom_hinting; - - /* - * We ignore all segments that are less than 1 pixel in length - * to avoid many problems with serif fonts. We compute the - * corresponding threshold in font units. - */ - if ( dim == AF_DIMENSION_HORZ ) - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - else - segment_length_threshold = 0; - - /* - * Similarly, we ignore segments that have a width delta - * larger than 0.5px (i.e., a width larger than 1px). - */ - segment_width_threshold = FT_DivFix( 32, scale ); - - /********************************************************************** - * - * We begin by generating a sorted table of edges for the current - * direction. To do so, we simply scan each segment and try to find - * an edge in our table that corresponds to its position. - * - * If no edge is found, we create and insert a new edge in the - * sorted table. Otherwise, we simply add the segment to the edge's - * list which gets processed in the second step to compute the - * edge's properties. - * - * Note that the table of edges is sorted along the segment/edge - * position. - * - */ - - /* assure that edge distance threshold is at most 0.25px */ - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Int ee; - - - /* ignore too short segments, too wide ones, and, in this loop, */ - /* one-point segments without a direction */ - if ( seg->height < segment_length_threshold || - seg->delta > segment_width_threshold || - seg->dir == AF_DIR_NONE ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif && - 2 * seg->height < 3 * segment_length_threshold ) - continue; - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, - (AF_Direction)seg->dir, - top_to_bottom_hinting, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - /* we loop again over all segments to catch one-point segments */ - /* without a direction: if possible, link them to existing edges */ - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Int ee; - - - if ( seg->dir != AF_DIR_NONE ) - continue; - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold ) - { - found = edge; - break; - } - } - - /* one-point segments without a match are ignored */ - if ( found ) - { - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /******************************************************************* - * - * Good, we now compute each edge's properties according to the - * segments found on its position. Basically, these are - * - * - the edge's main direction - * - stem edge, serif edge or both (which defaults to stem then) - * - rounded edge, straight or both (which defaults to straight) - * - link for edge - * - */ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ -#if 0 - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ -#endif - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - -#if 0 - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord - seg->min_coord; - else - downs += seg->max_coord - seg->min_coord; -#endif - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = FT_BOOL( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* get rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - /* Detect segments and edges for given dimension. */ - - FT_LOCAL_DEF( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin_hints_link_segments( hints, width_count, widths, dim ); - - error = af_latin_hints_compute_edges( hints, dim ); - } - - return error; - } - - - /* Compute all edges which lie within blue zones. */ - - static void - af_latin_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; - FT_Fixed scale = latin->scale; - - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_UInt bb; - AF_Width best_blue = NULL; - FT_Bool best_blue_is_neutral = 0; - FT_Pos best_dist; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - /* (the value 40 is heuristic) */ - best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); - - /* assure a minimum distance of 0.5px */ - if ( best_dist > 64 / 2 ) - best_dist = 64 / 2; - - for ( bb = 0; bb < latin->blue_count; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_neutral_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too large) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges (against the major */ - /* direction); if it is a bottom zone, check for left edges (in */ - /* the major direction) -- this assumes the TrueType convention */ - /* for the orientation of contours */ - is_top_blue = - (FT_Byte)( ( blue->flags & ( AF_LATIN_BLUE_TOP | - AF_LATIN_BLUE_SUB_TOP ) ) != 0 ); - is_neutral_blue = - (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_NEUTRAL ) != 0); - is_major_dir = - FT_BOOL( edge->dir == axis->major_dir ); - - /* neutral blue zones are handled for both directions */ - if ( is_top_blue ^ is_major_dir || is_neutral_blue ) - { - FT_Pos dist; - - - /* first of all, compare it to the reference position */ - dist = edge->fpos - blue->ref.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = &blue->ref; - best_blue_is_neutral = is_neutral_blue; - } - - /* now compare it to the overshoot position and check whether */ - /* the edge is rounded, and whether the edge is over the */ - /* reference position of a top zone, or under the reference */ - /* position of a bottom zone (provided we don't have a */ - /* neutral blue zone) */ - if ( edge->flags & AF_EDGE_ROUND && - dist != 0 && - !is_neutral_blue ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = &blue->shoot; - best_blue_is_neutral = is_neutral_blue; - } - } - } - } - } - - if ( best_blue ) - { - edge->blue_edge = best_blue; - if ( best_blue_is_neutral ) - edge->flags |= AF_EDGE_NEUTRAL; - } - } - } - - - /* Initalize hinting engine. */ - - static FT_Error - af_latin_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified by `af_latin_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels unless in `light' or `lcd' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' or `lcd' mode we disable horizontal hinting completely. - * We also do it if the face is italic. - * - * However, if warping is enabled (which only works in `light' hinting - * mode), advance widths get adjusted, too. - */ - if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return FT_Err_Ok; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* Snap a given width in scaled coordinates to one of the */ - /* current standard widths. */ - - static FT_Pos - af_latin_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* Compute the snapped width of a given stem, ignoring very thin ones. */ - /* There is a lot of voodoo in this function; changing the hard-coded */ - /* parameters influence the whole hinting process. */ - - static FT_Pos - af_latin_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_Pos base_delta, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - if ( ( stem_flags & AF_EDGE_SERIF ) && - vertical && - ( dist < 3 * 64 ) ) - goto Done_Width; - - else if ( base_flags & AF_EDGE_ROUND ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; - - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - { - /* A stem's end position depends on two values: the start */ - /* position and the stem length. The former gets usually */ - /* rounded to the grid, while the latter gets rounded also if it */ - /* exceeds a certain length (see below in this function). This */ - /* `double rounding' can lead to a great difference to the */ - /* original, unhinted position; this normally doesn't matter for */ - /* large PPEM values, but for small sizes it can easily make */ - /* outlines collide. For this reason, we adjust the stem length */ - /* by a small amount depending on the PPEM value in case the */ - /* former and latter rounding both point into the same */ - /* direction. */ - - FT_Pos bdelta = 0; - - - if ( ( ( width > 0 ) && ( base_delta > 0 ) ) || - ( ( width < 0 ) && ( base_delta < 0 ) ) ) - { - FT_UInt ppem = metrics->root.scaler.face->size->metrics.x_ppem; - - - if ( ppem < 10 ) - bdelta = base_delta; - else if ( ppem < 30 ) - bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20; - - if ( bdelta < 0 ) - bdelta = -bdelta; - } - - dist = ( dist - bdelta + 32 ) & ~63; - } - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - - FT_Pos org_dist = dist; - - - dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Pos delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if ( delta >= 16 ) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* Align one stem edge relative to the previous stem edge. */ - - static void - af_latin_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist, base_delta; - FT_Pos fitted_width; - - - dist = stem_edge->opos - base_edge->opos; - base_delta = base_edge->pos - base_edge->opos; - - fitted_width = af_latin_compute_stem_width( hints, dim, - dist, base_delta, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( " LINK: edge %d (opos=%.2f) linked to %.2f," - " dist was %.2f, now %.2f\n", - stem_edge - hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - /* Shift the coordinates of the `serif' edge by the same amount */ - /* as the corresponding `base' edge has been moved already. */ - - static void - af_latin_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - /* The main grid-fitting routine. */ - - static void - af_latin_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - FT_PtrDist n_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Int has_serifs = 0; - - AF_StyleClass style_class = hints->metrics->style_class; - AF_ScriptClass script_class = af_script_classes[style_class->script]; - - FT_Bool top_to_bottom_hinting = 0; - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_UInt num_actions = 0; -#endif - - - FT_TRACE5(( "latin %s edge hinting (style `%s')\n", - dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", - af_style_names[hints->metrics->style_class->style] )); - - if ( dim == AF_DIMENSION_VERT ) - top_to_bottom_hinting = script_class->top_to_bottom_hinting; - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; /* these edges form the stem to check */ - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - edge1 = NULL; - edge2 = edge->link; - - /* - * If a stem contains both a neutral and a non-neutral blue zone, - * skip the neutral one. Otherwise, outlines with different - * directions might be incorrectly aligned at the same vertical - * position. - * - * If we have two neutral blue zones, skip one of them. - * - */ - if ( edge->blue_edge && edge2 && edge2->blue_edge ) - { - FT_Byte neutral = edge->flags & AF_EDGE_NEUTRAL; - FT_Byte neutral2 = edge2->flags & AF_EDGE_NEUTRAL; - - - if ( neutral2 ) - { - edge2->blue_edge = NULL; - edge2->flags &= ~AF_EDGE_NEUTRAL; - } - else if ( neutral ) - { - edge->blue_edge = NULL; - edge->flags &= ~AF_EDGE_NEUTRAL; - } - } - - blue = edge->blue_edge; - if ( blue ) - edge1 = edge; - - /* flip edges if the other edge is aligned to a blue zone */ - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !anchor ) - FT_TRACE5(( " BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f," - " was %.2f (anchor=edge %d)\n", - edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0, edge - edges )); - else - FT_TRACE5(( " BLUE: edge %d (opos=%.2f) snapped to %.2f," - " was %.2f\n", - edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - num_actions++; -#endif - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - } - - if ( !anchor ) - anchor = edge; - } - } - - /* now we align all other stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( " ASSERTION FAILED for edge %d\n", edge2 - edges )); - - af_latin_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - continue; - } - - if ( !anchor ) - { - /* if we reach this if clause, no stem has been aligned yet */ - - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin_compute_stem_width( hints, dim, - org_len, 0, - edge->flags, - edge2->flags ); - - /* some voodoo to specially round edges for small stem widths; */ - /* the idea is to align the center of a stem, then shifting */ - /* the stem edges to suitable positions */ - if ( cur_len <= 64 ) - { - /* width <= 1px */ - u_off = 32; - d_off = 32; - } - else - { - /* 1px < width < 1.5px */ - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - anchor = edge; - edge->flags |= AF_EDGE_DONE; - - FT_TRACE5(( " ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - - af_latin_align_linked_edge( hints, dim, edge, edge2 ); - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions += 2; -#endif - } - else - { - FT_Pos org_pos, org_len, org_center, cur_len; - FT_Pos cur_pos1, cur_pos2, delta1, delta2; - - - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, - org_len, 0, - edge->flags, - edge2->flags ); - - if ( edge2->flags & AF_EDGE_DONE ) - { - FT_TRACE5(( " ADJUST: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, edge->pos / 64.0, - ( edge2->pos - cur_len ) / 64.0 )); - - edge->pos = edge2->pos - cur_len; - } - - else if ( cur_len < 96 ) - { - FT_Pos u_off, d_off; - - - cur_pos1 = FT_PIX_ROUND( org_center ); - - if ( cur_len <= 64 ) - { - u_off = 32; - d_off = 32; - } - else - { - u_off = 38; - d_off = 26; - } - - delta1 = org_center - ( cur_pos1 - u_off ); - if ( delta1 < 0 ) - delta1 = -delta1; - - delta2 = org_center - ( cur_pos1 + d_off ); - if ( delta2 < 0 ) - delta2 = -delta2; - - if ( delta1 < delta2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = cur_pos1 + cur_len / 2; - - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - - else - { - org_pos = anchor->pos + ( edge->opos - anchor->opos ); - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin_compute_stem_width( hints, dim, - org_len, 0, - edge->flags, - edge2->flags ); - - cur_pos1 = FT_PIX_ROUND( org_pos ); - delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; - if ( delta1 < 0 ) - delta1 = -delta1; - - cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; - delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; - if ( delta2 < 0 ) - delta2 = -delta2; - - edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; - edge2->pos = edge->pos + cur_len; - - FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" - " snapped to %.2f and %.2f\n", - edge - edges, edge->opos / 64.0, - edge2 - edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && - ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) - : ( edge->pos < edge[-1].pos ) ) ) - { - /* don't move if stem would (almost) disappear otherwise; */ - /* the ad-hoc value 16 corresponds to 1/4px */ - if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, - edge->pos / 64.0, - edge[-1].pos / 64.0 )); - - num_actions++; -#endif - - edge->pos = edge[-1].pos; - } - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - - n_edges = edge_limit - edges; - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( " SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" - " aligned to %.2f\n", - edge - edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - FT_TRACE5(( " SERIF_ANCHOR: edge %d (opos=%.2f)" - " snapped to %.2f\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - - FT_TRACE5(( " SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f" - " from %d (opos=%.2f)\n", - edge - edges, edge->opos / 64.0, - edge->pos / 64.0, - before - edges, before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + - ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - FT_TRACE5(( " SERIF_LINK2: edge %d (opos=%.2f)" - " snapped to %.2f\n", - edge - edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - num_actions++; -#endif - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && - ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) - : ( edge->pos < edge[-1].pos ) ) ) - { - /* don't move if stem would (almost) disappear otherwise; */ - /* the ad-hoc value 16 corresponds to 1/4px */ - if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, - edge->pos / 64.0, - edge[-1].pos / 64.0 )); - - num_actions++; -#endif - edge->pos = edge[-1].pos; - } - } - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - ( top_to_bottom_hinting ? ( edge->pos < edge[1].pos ) - : ( edge->pos > edge[1].pos ) ) ) - { - /* don't move if stem would (almost) disappear otherwise; */ - /* the ad-hoc value 16 corresponds to 1/4px */ - if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", - edge - edges, - edge->pos / 64.0, - edge[1].pos / 64.0 )); - - num_actions++; -#endif - - edge->pos = edge[1].pos; - } - } - } - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !num_actions ) - FT_TRACE5(( " (none)\n" )); - FT_TRACE5(( "\n" )); -#endif - } - - - /* Apply the complete hinting algorithm to a latin glyph. */ - - static FT_Error - af_latin_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - AF_LatinAxis axis; - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) - { - axis = &metrics->axis[AF_DIMENSION_HORZ]; - error = af_latin_hints_detect_features( hints, - axis->width_count, - axis->widths, - AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - axis = &metrics->axis[AF_DIMENSION_VERT]; - error = af_latin_hints_detect_features( hints, - axis->width_count, - axis->widths, - AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - /* apply blue zones to base characters only */ - if ( !( metrics->root.globals->glyph_styles[glyph_index] & AF_NONBASE ) ) - af_latin_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, (AF_Dimension)dim, - &scale, &delta ); - af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, - scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_latin_writing_system_class, - - AF_WRITING_SYSTEM_LATIN, - - sizeof ( AF_LatinMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply /* style_hints_apply */ - ) - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aflatin.h b/ThirdParty/freetype/src/autofit/aflatin.h deleted file mode 100644 index 4047953..0000000 --- a/ThirdParty/freetype/src/autofit/aflatin.h +++ /dev/null @@ -1,194 +0,0 @@ -/**************************************************************************** - * - * aflatin.h - * - * Auto-fitter hinting routines for latin writing system - * (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFLATIN_H_ -#define AFLATIN_H_ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - /* the `latin' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) - - - /* constants are given with units_per_em == 2048 in mind */ -#define AF_LATIN_CONSTANT( metrics, c ) \ - ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - /* - * The following declarations could be embedded in the file `aflatin.c'; - * they have been made semi-public to allow alternate writing system - * hinters to re-use some of them. - */ - - -#define AF_LATIN_IS_TOP_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) -#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP ) -#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) -#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) -#define AF_LATIN_IS_LONG_BLUE( b ) \ - ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) - -#define AF_LATIN_MAX_WIDTHS 16 - - -#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ -#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ -#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */ - /* blue zone */ -#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */ -#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */ - /* optimization */ - - - typedef struct AF_LatinBlueRec_ - { - AF_WidthRec ref; - AF_WidthRec shoot; - FT_Pos ascender; - FT_Pos descender; - FT_UInt flags; - - } AF_LatinBlueRec, *AF_LatinBlue; - - - typedef struct AF_LatinAxisRec_ - { - FT_Fixed scale; - FT_Pos delta; - - FT_UInt width_count; /* number of used widths */ - AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ - FT_Pos edge_distance_threshold; /* used for creating edges */ - FT_Pos standard_width; /* the default stem thickness */ - FT_Bool extra_light; /* is standard width very light? */ - - /* ignored for horizontal metrics */ - FT_UInt blue_count; - AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; - - FT_Fixed org_scale; - FT_Pos org_delta; - - } AF_LatinAxisRec, *AF_LatinAxis; - - - typedef struct AF_LatinMetricsRec_ - { - AF_StyleMetricsRec root; - FT_UInt units_per_em; - AF_LatinAxisRec axis[AF_DIMENSION_MAX]; - - } AF_LatinMetricsRec, *AF_LatinMetrics; - - - FT_LOCAL( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ); - - FT_LOCAL( void ) - af_latin_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ); - - FT_LOCAL( void ) - af_latin_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ -#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ -#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ - /* adjustment */ -#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ - - -#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) - -#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) - -#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) - -#define AF_LATIN_HINTS_DO_MONO( h ) \ - AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) - - - /* - * The next functions shouldn't normally be exported. However, other - * writing systems might like to use these functions as-is. - */ - FT_LOCAL( FT_Error ) - af_latin_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( void ) - af_latin_hints_link_segments( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ); - - FT_LOCAL( FT_Error ) - af_latin_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL( FT_Error ) - af_latin_hints_detect_features( AF_GlyphHints hints, - FT_UInt width_count, - AF_WidthRec* widths, - AF_Dimension dim ); - -/* */ - -FT_END_HEADER - -#endif /* AFLATIN_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aflatin2.c b/ThirdParty/freetype/src/autofit/aflatin2.c deleted file mode 100644 index c601ab8..0000000 --- a/ThirdParty/freetype/src/autofit/aflatin2.c +++ /dev/null @@ -1,2428 +0,0 @@ -/* ATTENTION: This file doesn't compile. It is only here as a reference */ -/* of an alternative latin hinting algorithm that was always */ -/* marked as experimental. */ - - -/**************************************************************************** - * - * aflatin2.c - * - * Auto-fitter hinting routines for latin writing system (body). - * - * 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. - * - */ - - -#include FT_ADVANCES_H - - -#ifdef FT_OPTION_AUTOFIT2 - -#include "afglobal.h" -#include "aflatin.h" -#include "aflatin2.h" -#include "aferrors.h" - - -#ifdef AF_CONFIG_OPTION_USE_WARPER -#include "afwarp.h" -#endif - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT aflatin2 - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ); - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L O B A L M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - FT_LOCAL_DEF( void ) - af_latin2_metrics_init_widths( AF_LatinMetrics metrics, - FT_Face face ) - { - /* scan the array of segments in each direction */ - AF_GlyphHintsRec hints[1]; - - - af_glyph_hints_init( hints, face->memory ); - - metrics->axis[AF_DIMENSION_HORZ].width_count = 0; - metrics->axis[AF_DIMENSION_VERT].width_count = 0; - - { - FT_Error error; - FT_UInt glyph_index; - int dim; - AF_LatinMetricsRec dummy[1]; - AF_Scaler scaler = &dummy->root.scaler; - - - glyph_index = FT_Get_Char_Index( - face, - metrics->root.style_class->standard_char ); - if ( glyph_index == 0 ) - goto Exit; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || face->glyph->outline.n_points <= 0 ) - goto Exit; - - FT_ZERO( dummy ); - - dummy->units_per_em = metrics->units_per_em; - scaler->x_scale = scaler->y_scale = 0x10000L; - scaler->x_delta = scaler->y_delta = 0; - scaler->face = face; - scaler->render_mode = FT_RENDER_MODE_NORMAL; - scaler->flags = 0; - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); - - error = af_glyph_hints_reload( hints, &face->glyph->outline ); - if ( error ) - goto Exit; - - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - AF_AxisHints axhints = &hints->axis[dim]; - AF_Segment seg, limit, link; - FT_UInt num_widths = 0; - - - error = af_latin2_hints_compute_segments( hints, - (AF_Dimension)dim ); - if ( error ) - goto Exit; - - af_latin2_hints_link_segments( hints, - (AF_Dimension)dim ); - - seg = axhints->segments; - limit = seg + axhints->num_segments; - - for ( ; seg < limit; seg++ ) - { - link = seg->link; - - /* we only consider stem segments there! */ - if ( link && link->link == seg && link > seg ) - { - FT_Pos dist; - - - dist = seg->pos - link->pos; - if ( dist < 0 ) - dist = -dist; - - if ( num_widths < AF_LATIN_MAX_WIDTHS ) - axis->widths[num_widths++].org = dist; - } - } - - af_sort_widths( num_widths, axis->widths ); - axis->width_count = num_widths; - } - - Exit: - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { - AF_LatinAxis axis = &metrics->axis[dim]; - FT_Pos stdw; - - - stdw = ( axis->width_count > 0 ) - ? axis->widths[0].org - : AF_LATIN_CONSTANT( metrics, 50 ); - - /* let's try 20% of the smallest width */ - axis->edge_distance_threshold = stdw / 5; - axis->standard_width = stdw; - axis->extra_light = 0; - } - } - - af_glyph_hints_done( hints ); - } - - - -#define AF_LATIN_MAX_TEST_CHARACTERS 12 - - - static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES] - [AF_LATIN_MAX_TEST_CHARACTERS+1] = - { - "THEZOCQS", - "HEZLOCUS", - "fijkdbh", - "xzroesc", - "xzroesc", - "pqgjy" - }; - - - static void - af_latin2_metrics_init_blues( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; - FT_Int num_flats; - FT_Int num_rounds; - FT_Int bb; - AF_LatinBlue blue; - FT_Error error; - AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; - FT_GlyphSlot glyph = face->glyph; - - - /* we compute the blues simply by loading each character from the */ - /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ - /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ - - FT_TRACE5(( "blue zones computation\n" - "======================\n\n" )); - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - const char* p = af_latin2_blue_chars[bb]; - const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; - FT_Pos* blue_ref; - FT_Pos* blue_shoot; - - - FT_TRACE5(( "blue zone %d:\n", bb )); - - num_flats = 0; - num_rounds = 0; - - for ( ; p < limit && *p; p++ ) - { - FT_UInt glyph_index; - FT_Int best_point, best_y, best_first, best_last; - FT_Vector* points; - FT_Bool round; - - - /* load the character in the face -- skip unknown or empty ones */ - glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); - if ( glyph_index == 0 ) - continue; - - error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); - if ( error || glyph->outline.n_points <= 0 ) - continue; - - /* now compute min or max point indices and coordinates */ - points = glyph->outline.points; - best_point = -1; - best_y = 0; /* make compiler happy */ - best_first = 0; /* ditto */ - best_last = 0; /* ditto */ - - { - FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; - - - for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) - { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = glyph->outline.contours[nn]; - - /* Avoid single-point contours since they are never rasterized. */ - /* In some fonts, they correspond to mark attachment points */ - /* which are way outside of the glyph's real outline. */ - if ( last <= first ) - continue; - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y > best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - else - { - for ( pp = first; pp <= last; pp++ ) - if ( best_point < 0 || points[pp].y < best_y ) - { - best_point = pp; - best_y = points[pp].y; - } - } - - if ( best_point != old_best_point ) - { - best_first = first; - best_last = last; - } - } - FT_TRACE5(( " %c %d", *p, best_y )); - } - - /* now check whether the point belongs to a straight or round */ - /* segment; we first need to find in which contour the extremum */ - /* lies, then inspect its previous and next points */ - if ( best_point >= 0 ) - { - FT_Pos best_x = points[best_point].x; - FT_Int start, end, prev, next; - FT_Pos dist; - - - /* now look for the previous and next points that are not on the */ - /* same Y coordinate. Threshold the `closeness'... */ - start = end = best_point; - - do - { - prev = start - 1; - if ( prev < best_first ) - prev = best_last; - - dist = FT_ABS( points[prev].y - best_y ); - /* accept a small distance or a small angle (both values are */ - /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ - if ( dist > 5 ) - if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) - break; - - start = prev; - - } while ( start != best_point ); - - do - { - next = end + 1; - if ( next > best_last ) - next = best_first; - - dist = FT_ABS( points[next].y - best_y ); - if ( dist > 5 ) - if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) - break; - - end = next; - - } while ( end != best_point ); - - /* now, set the `round' flag depending on the segment's kind */ - round = FT_BOOL( - FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || - FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); - - FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); - } - - if ( round ) - rounds[num_rounds++] = best_y; - else - flats[num_flats++] = best_y; - } - - if ( num_flats == 0 && num_rounds == 0 ) - { - /* - * we couldn't find a single glyph to compute this blue zone, - * we will simply ignore it then - */ - FT_TRACE5(( " empty\n" )); - continue; - } - - /* we have computed the contents of the `rounds' and `flats' tables, */ - /* now determine the reference and overshoot position of the blue -- */ - /* we simply take the median value after a simple sort */ - af_sort_pos( num_rounds, rounds ); - af_sort_pos( num_flats, flats ); - - blue = & axis->blues[axis->blue_count]; - blue_ref = & blue->ref.org; - blue_shoot = & blue->shoot.org; - - axis->blue_count++; - - if ( num_flats == 0 ) - { - *blue_ref = - *blue_shoot = rounds[num_rounds / 2]; - } - else if ( num_rounds == 0 ) - { - *blue_ref = - *blue_shoot = flats[num_flats / 2]; - } - else - { - *blue_ref = flats[num_flats / 2]; - *blue_shoot = rounds[num_rounds / 2]; - } - - /* there are sometimes problems: if the overshoot position of top */ - /* zones is under its reference position, or the opposite for bottom */ - /* zones. We must thus check everything there and correct the errors */ - if ( *blue_shoot != *blue_ref ) - { - FT_Pos ref = *blue_ref; - FT_Pos shoot = *blue_shoot; - FT_Bool over_ref = FT_BOOL( shoot > ref ); - - - if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) - { - *blue_ref = - *blue_shoot = ( shoot + ref ) / 2; - - FT_TRACE5(( " [overshoot smaller than reference," - " taking mean value]\n" )); - } - } - - blue->flags = 0; - if ( AF_LATIN_IS_TOP_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_TOP; - - /* - * The following flag is used later to adjust the y and x scales - * in order to optimize the pixel grid alignment of the top of small - * letters. - */ - if ( AF_LATIN_IS_X_HEIGHT_BLUE( bb ) ) - blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; - - FT_TRACE5(( " -> reference = %ld\n" - " overshoot = %ld\n", - *blue_ref, *blue_shoot )); - } - - return; - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_check_digits( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_UInt i; - FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; - - - /* check whether all ASCII digits have the same advance width; */ - /* digit `0' is 0x30 in all supported charmaps */ - for ( i = 0x30; i <= 0x39; i++ ) - { - FT_UInt glyph_index; - - - glyph_index = FT_Get_Char_Index( face, i ); - if ( glyph_index == 0 ) - continue; - - if ( FT_Get_Advance( face, glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - &advance ) ) - continue; - - if ( started ) - { - if ( advance != old_advance ) - { - same_width = 0; - break; - } - } - else - { - old_advance = advance; - started = 1; - } - } - - metrics->root.digits_have_same_width = same_width; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_metrics_init( AF_LatinMetrics metrics, - FT_Face face ) - { - FT_Error error = FT_Err_Ok; - FT_CharMap oldmap = face->charmap; - FT_UInt ee; - - static const FT_Encoding latin_encodings[] = - { - FT_ENCODING_UNICODE, - FT_ENCODING_APPLE_ROMAN, - FT_ENCODING_ADOBE_STANDARD, - FT_ENCODING_ADOBE_LATIN_1, - FT_ENCODING_NONE /* end of list */ - }; - - - metrics->units_per_em = face->units_per_EM; - - /* do we have a latin charmap in there? */ - for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) - { - error = FT_Select_Charmap( face, latin_encodings[ee] ); - if ( !error ) - break; - } - - if ( !error ) - { - af_latin2_metrics_init_widths( metrics, face ); - af_latin2_metrics_init_blues( metrics, face ); - af_latin2_metrics_check_digits( metrics, face ); - } - - FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; - } - - - static void - af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, - AF_Scaler scaler, - AF_Dimension dim ) - { - FT_Fixed scale; - FT_Pos delta; - AF_LatinAxis axis; - FT_UInt nn; - - - if ( dim == AF_DIMENSION_HORZ ) - { - scale = scaler->x_scale; - delta = scaler->x_delta; - } - else - { - scale = scaler->y_scale; - delta = scaler->y_delta; - } - - axis = &metrics->axis[dim]; - - if ( axis->org_scale == scale && axis->org_delta == delta ) - return; - - axis->org_scale = scale; - axis->org_delta = delta; - - /* - * correct Y scale to optimize the alignment of the top of small - * letters to the pixel grid - */ - if ( dim == AF_DIMENSION_VERT ) - { - AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; - - - for ( nn = 0; nn < vaxis->blue_count; nn++ ) - { - if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) - { - blue = &vaxis->blues[nn]; - break; - } - } - - if ( blue ) - { - FT_Pos scaled; - FT_Pos threshold; - FT_Pos fitted; - FT_UInt limit; - FT_UInt ppem; - - - scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); - ppem = metrics->root.scaler.face->size->metrics.x_ppem; - limit = metrics->root.globals->increase_x_height; - threshold = 40; - - /* if the `increase-x-height' property is active, */ - /* we round up much more often */ - if ( limit && - ppem <= limit && - ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) - threshold = 52; - - fitted = ( scaled + threshold ) & ~63; - -#if 1 - if ( scaled != fitted ) - { - scale = FT_MulDiv( scale, fitted, scaled ); - FT_TRACE5(( "== scaled x-top = %.2g" - " fitted = %.2g, scaling = %.4g\n", - scaled / 64.0, fitted / 64.0, - ( fitted * 1.0 ) / scaled )); - } -#endif - } - } - - axis->scale = scale; - axis->delta = delta; - - if ( dim == AF_DIMENSION_HORZ ) - { - metrics->root.scaler.x_scale = scale; - metrics->root.scaler.x_delta = delta; - } - else - { - metrics->root.scaler.y_scale = scale; - metrics->root.scaler.y_delta = delta; - } - - /* scale the standard widths */ - for ( nn = 0; nn < axis->width_count; nn++ ) - { - AF_Width width = axis->widths + nn; - - - width->cur = FT_MulFix( width->org, scale ); - width->fit = width->cur; - } - - /* an extra-light axis corresponds to a standard width that is */ - /* smaller than 5/8 pixels */ - axis->extra_light = - FT_BOOL( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); - - if ( dim == AF_DIMENSION_VERT ) - { - /* scale the blue zones */ - for ( nn = 0; nn < axis->blue_count; nn++ ) - { - AF_LatinBlue blue = &axis->blues[nn]; - FT_Pos dist; - - - blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; - blue->ref.fit = blue->ref.cur; - blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; - blue->shoot.fit = blue->shoot.cur; - blue->flags &= ~AF_LATIN_BLUE_ACTIVE; - - /* a blue zone is only active if it is less than 3/4 pixels tall */ - dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); - if ( dist <= 48 && dist >= -48 ) - { - FT_Pos delta1, delta2; - - delta1 = blue->shoot.org - blue->ref.org; - delta2 = delta1; - if ( delta1 < 0 ) - delta2 = -delta2; - - delta2 = FT_MulFix( delta2, scale ); - - if ( delta2 < 32 ) - delta2 = 0; - else if ( delta2 < 64 ) - delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); - else - delta2 = FT_PIX_ROUND( delta2 ); - - if ( delta1 < 0 ) - delta2 = -delta2; - - blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); - blue->shoot.fit = blue->ref.fit + delta2; - - FT_TRACE5(( ">> activating blue zone %d:" - " ref.cur=%.2g ref.fit=%.2g" - " shoot.cur=%.2g shoot.fit=%.2g\n", - nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0, - blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); - - blue->flags |= AF_LATIN_BLUE_ACTIVE; - } - } - } - } - - - FT_LOCAL_DEF( void ) - af_latin2_metrics_scale( AF_LatinMetrics metrics, - AF_Scaler scaler ) - { - metrics->root.scaler.render_mode = scaler->render_mode; - metrics->root.scaler.face = scaler->face; - metrics->root.scaler.flags = scaler->flags; - - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); - af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); - } - - - /* Extract standard_width from writing system/script specific */ - /* metrics class. */ - - FT_LOCAL_DEF( void ) - af_latin2_get_standard_widths( AF_LatinMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) - { - if ( stdHW ) - *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; - - if ( stdVW ) - *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H A N A L Y S I S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#define SORT_SEGMENTS - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Memory memory = hints->memory; - FT_Error error = FT_Err_Ok; - AF_Segment segment = NULL; - AF_SegmentRec seg0; - AF_Point* contour = hints->contours; - AF_Point* contour_limit = contour + hints->num_contours; - AF_Direction major_dir, segment_dir; - - - FT_ZERO( &seg0 ); - seg0.score = 32000; - seg0.flags = AF_EDGE_NORMAL; - - major_dir = (AF_Direction)FT_ABS( axis->major_dir ); - segment_dir = major_dir; - - axis->num_segments = 0; - - /* set up (u,v) in each point */ - if ( dim == AF_DIMENSION_HORZ ) - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fx; - point->v = point->fy; - } - } - else - { - AF_Point point = hints->points; - AF_Point limit = point + hints->num_points; - - - for ( ; point < limit; point++ ) - { - point->u = point->fy; - point->v = point->fx; - } - } - - /* do each contour separately */ - for ( ; contour < contour_limit; contour++ ) - { - AF_Point point = contour[0]; - AF_Point start = point; - AF_Point last = point->prev; - - - if ( point == last ) /* skip singletons -- just in case */ - continue; - - /* already on an edge ?, backtrack to find its start */ - if ( FT_ABS( point->in_dir ) == major_dir ) - { - point = point->prev; - - while ( point->in_dir == start->in_dir ) - point = point->prev; - } - else /* otherwise, find first segment start, if any */ - { - while ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - start = point; - - for (;;) - { - AF_Point first; - FT_Pos min_u, min_v, max_u, max_v; - - /* we're at the start of a new segment */ - FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && - point->in_dir != point->out_dir ); - first = point; - - min_u = max_u = point->u; - min_v = max_v = point->v; - - point = point->next; - - while ( point->out_dir == first->out_dir ) - { - point = point->next; - - if ( point->u < min_u ) - min_u = point->u; - - if ( point->u > max_u ) - max_u = point->u; - } - - if ( point->v < min_v ) - min_v = point->v; - - if ( point->v > max_v ) - max_v = point->v; - - /* record new segment */ - error = af_axis_hints_new_segment( axis, memory, &segment ); - if ( error ) - goto Exit; - - segment[0] = seg0; - segment->dir = first->out_dir; - segment->first = first; - segment->last = point; - segment->pos = (FT_Short)( ( min_u + max_u ) >> 1 ); - segment->min_coord = (FT_Short) min_v; - segment->max_coord = (FT_Short) max_v; - segment->height = (FT_Short)( max_v - min_v ); - - /* a segment is round if it doesn't have successive */ - /* on-curve points. */ - { - AF_Point pt = first; - AF_Point last = point; - FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; - FT_UInt f1; - - - segment->flags &= ~AF_EDGE_ROUND; - - for ( ; pt != last; f0 = f1 ) - { - pt = pt->next; - f1 = pt->flags & AF_FLAG_CONTROL; - - if ( !f0 && !f1 ) - break; - - if ( pt == last ) - segment->flags |= AF_EDGE_ROUND; - } - } - - /* this can happen in the case of a degenerate contour - * e.g. a 2-point vertical contour - */ - if ( point == start ) - break; - - /* jump to the start of the next segment, if any */ - while ( FT_ABS( point->out_dir ) != major_dir ) - { - point = point->next; - - if ( point == start ) - goto NextContour; - } - } - - NextContour: - ; - } /* contours */ - - /* now slightly increase the height of segments when this makes */ - /* sense -- this is used to better detect and ignore serifs */ - { - AF_Segment segments = axis->segments; - AF_Segment segments_end = segments + axis->num_segments; - - - for ( segment = segments; segment < segments_end; segment++ ) - { - AF_Point first = segment->first; - AF_Point last = segment->last; - AF_Point p; - FT_Pos first_v = first->v; - FT_Pos last_v = last->v; - - - if ( first_v < last_v ) - { - p = first->prev; - if ( p->v < first_v ) - segment->height = (FT_Short)( segment->height + - ( ( first_v - p->v ) >> 1 ) ); - - p = last->next; - if ( p->v > last_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - last_v ) >> 1 ) ); - } - else - { - p = first->prev; - if ( p->v > first_v ) - segment->height = (FT_Short)( segment->height + - ( ( p->v - first_v ) >> 1 ) ); - - p = last->next; - if ( p->v < last_v ) - segment->height = (FT_Short)( segment->height + - ( ( last_v - p->v ) >> 1 ) ); - } - } - } - -#ifdef AF_SORT_SEGMENTS - /* place all segments with a negative direction to the start - * of the array, used to speed up segment linking later... - */ - { - AF_Segment segments = axis->segments; - FT_UInt count = axis->num_segments; - FT_UInt ii, jj; - - for ( ii = 0; ii < count; ii++ ) - { - if ( segments[ii].dir > 0 ) - { - for ( jj = ii + 1; jj < count; jj++ ) - { - if ( segments[jj].dir < 0 ) - { - AF_SegmentRec tmp; - - - tmp = segments[ii]; - segments[ii] = segments[jj]; - segments[jj] = tmp; - - break; - } - } - - if ( jj == count ) - break; - } - } - axis->mid_segments = ii; - } -#endif - - Exit: - return error; - } - - - FT_LOCAL_DEF( void ) - af_latin2_hints_link_segments( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; -#ifdef AF_SORT_SEGMENTS - AF_Segment segment_mid = segments + axis->mid_segments; -#endif - FT_Pos len_threshold, len_score; - AF_Segment seg1, seg2; - - - len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); - if ( len_threshold == 0 ) - len_threshold = 1; - - len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); - -#ifdef AF_SORT_SEGMENTS - for ( seg1 = segments; seg1 < segment_mid; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) -#else - /* now compare each segment to the others */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - if ( seg1->dir != axis->major_dir ) - continue; - - for ( seg2 = segments; seg2 < segment_limit; seg2++ ) - if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) -#endif - { - FT_Pos pos1 = seg1->pos; - FT_Pos pos2 = seg2->pos; - FT_Pos dist = pos2 - pos1; - - - if ( dist < 0 ) - continue; - - { - FT_Pos min = seg1->min_coord; - FT_Pos max = seg1->max_coord; - FT_Pos len, score; - - - if ( min < seg2->min_coord ) - min = seg2->min_coord; - - if ( max > seg2->max_coord ) - max = seg2->max_coord; - - len = max - min; - if ( len >= len_threshold ) - { - score = dist + len_score / len; - if ( score < seg1->score ) - { - seg1->score = score; - seg1->link = seg2; - } - - if ( score < seg2->score ) - { - seg2->score = score; - seg2->link = seg1; - } - } - } - } - } -#if 0 - } -#endif - - /* now, compute the `serif' segments */ - for ( seg1 = segments; seg1 < segment_limit; seg1++ ) - { - seg2 = seg1->link; - - if ( seg2 ) - { - if ( seg2->link != seg1 ) - { - seg1->link = NULL; - seg1->serif = seg2->link; - } - } - } - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_compute_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - FT_Error error = FT_Err_Ok; - FT_Memory memory = hints->memory; - AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; - - AF_Segment segments = axis->segments; - AF_Segment segment_limit = segments + axis->num_segments; - AF_Segment seg; - - AF_Direction up_dir; - FT_Fixed scale; - FT_Pos edge_distance_threshold; - FT_Pos segment_length_threshold; - - - axis->num_edges = 0; - - scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale - : hints->y_scale; - - up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP - : AF_DIR_RIGHT; - - /* - * We want to ignore very small (mostly serif) segments, we do that - * by ignoring those that whose length is less than a given fraction - * of the standard width. If there is no standard width, we ignore - * those that are less than a given size in pixels - * - * also, unlink serif segments that are linked to segments farther - * than 50% of the standard width - */ - if ( dim == AF_DIMENSION_HORZ ) - { - if ( laxis->width_count > 0 ) - segment_length_threshold = ( laxis->standard_width * 10 ) >> 4; - else - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); - } - else - segment_length_threshold = 0; - - /********************************************************************** - * - * We will begin by generating a sorted table of edges for the - * current direction. To do so, we simply scan each segment and try - * to find an edge in our table that corresponds to its position. - * - * If no edge is found, we create and insert a new edge in the - * sorted table. Otherwise, we simply add the segment to the edge's - * list which will be processed in the second step to compute the - * edge's properties. - * - * Note that the edges table is sorted along the segment/edge - * position. - * - */ - - edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, - scale ); - if ( edge_distance_threshold > 64 / 4 ) - edge_distance_threshold = 64 / 4; - - edge_distance_threshold = FT_DivFix( edge_distance_threshold, - scale ); - - for ( seg = segments; seg < segment_limit; seg++ ) - { - AF_Edge found = NULL; - FT_Int ee; - - - if ( seg->height < segment_length_threshold ) - continue; - - /* A special case for serif edges: If they are smaller than */ - /* 1.5 pixels we ignore them. */ - if ( seg->serif ) - { - FT_Pos dist = seg->serif->pos - seg->pos; - - - if ( dist < 0 ) - dist = -dist; - - if ( dist >= laxis->standard_width >> 1 ) - { - /* unlink this serif, it is too distant from its reference stem */ - seg->serif = NULL; - } - else if ( 2*seg->height < 3 * segment_length_threshold ) - continue; - } - - /* look for an edge corresponding to the segment */ - for ( ee = 0; ee < axis->num_edges; ee++ ) - { - AF_Edge edge = axis->edges + ee; - FT_Pos dist; - - - dist = seg->pos - edge->fpos; - if ( dist < 0 ) - dist = -dist; - - if ( dist < edge_distance_threshold && edge->dir == seg->dir ) - { - found = edge; - break; - } - } - - if ( !found ) - { - AF_Edge edge; - - - /* insert a new edge in the list and */ - /* sort according to the position */ - error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, 0, - memory, &edge ); - if ( error ) - goto Exit; - - /* add the segment to the new edge's list */ - FT_ZERO( edge ); - - edge->first = seg; - edge->last = seg; - edge->dir = seg->dir; - edge->fpos = seg->pos; - edge->opos = FT_MulFix( seg->pos, scale ); - edge->pos = edge->opos; - seg->edge_next = seg; - } - else - { - /* if an edge was found, simply add the segment to the edge's */ - /* list */ - seg->edge_next = found->first; - found->last->edge_next = seg; - found->last = seg; - } - } - - - /********************************************************************** - * - * Good, we will now compute each edge's properties according to - * segments found on its position. Basically, these are: - * - * - edge's main direction - * - stem edge, serif edge or both (which defaults to stem then) - * - rounded edge, straight or both (which defaults to straight) - * - link for edge - * - */ - - /* first of all, set the `edge' field in each segment -- this is */ - /* required in order to compute edge links */ - - /* - * Note that removing this loop and setting the `edge' field of each - * segment directly in the code above slows down execution speed for - * some reasons on platforms like the Sun. - */ - { - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - - - for ( edge = edges; edge < edge_limit; edge++ ) - { - seg = edge->first; - if ( seg ) - do - { - seg->edge = edge; - seg = seg->edge_next; - - } while ( seg != edge->first ); - } - - /* now, compute each edge properties */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Int is_round = 0; /* does it contain round segments? */ - FT_Int is_straight = 0; /* does it contain straight segments? */ -#if 0 - FT_Pos ups = 0; /* number of upwards segments */ - FT_Pos downs = 0; /* number of downwards segments */ -#endif - - - seg = edge->first; - - do - { - FT_Bool is_serif; - - - /* check for roundness of segment */ - if ( seg->flags & AF_EDGE_ROUND ) - is_round++; - else - is_straight++; - -#if 0 - /* check for segment direction */ - if ( seg->dir == up_dir ) - ups += seg->max_coord-seg->min_coord; - else - downs += seg->max_coord-seg->min_coord; -#endif - - /* check for links -- if seg->serif is set, then seg->link must */ - /* be ignored */ - is_serif = FT_BOOL( seg->serif && - seg->serif->edge && - seg->serif->edge != edge ); - - if ( ( seg->link && seg->link->edge ) || is_serif ) - { - AF_Edge edge2; - AF_Segment seg2; - - - edge2 = edge->link; - seg2 = seg->link; - - if ( is_serif ) - { - seg2 = seg->serif; - edge2 = edge->serif; - } - - if ( edge2 ) - { - FT_Pos edge_delta; - FT_Pos seg_delta; - - - edge_delta = edge->fpos - edge2->fpos; - if ( edge_delta < 0 ) - edge_delta = -edge_delta; - - seg_delta = seg->pos - seg2->pos; - if ( seg_delta < 0 ) - seg_delta = -seg_delta; - - if ( seg_delta < edge_delta ) - edge2 = seg2->edge; - } - else - edge2 = seg2->edge; - - if ( is_serif ) - { - edge->serif = edge2; - edge2->flags |= AF_EDGE_SERIF; - } - else - edge->link = edge2; - } - - seg = seg->edge_next; - - } while ( seg != edge->first ); - - /* set the round/straight flags */ - edge->flags = AF_EDGE_NORMAL; - - if ( is_round > 0 && is_round >= is_straight ) - edge->flags |= AF_EDGE_ROUND; - -#if 0 - /* set the edge's main direction */ - edge->dir = AF_DIR_NONE; - - if ( ups > downs ) - edge->dir = (FT_Char)up_dir; - - else if ( ups < downs ) - edge->dir = (FT_Char)-up_dir; - - else if ( ups == downs ) - edge->dir = 0; /* both up and down! */ -#endif - - /* gets rid of serifs if link is set */ - /* XXX: This gets rid of many unpleasant artefacts! */ - /* Example: the `c' in cour.pfa at size 13 */ - - if ( edge->serif && edge->link ) - edge->serif = NULL; - } - } - - Exit: - return error; - } - - - FT_LOCAL_DEF( FT_Error ) - af_latin2_hints_detect_features( AF_GlyphHints hints, - AF_Dimension dim ) - { - FT_Error error; - - - error = af_latin2_hints_compute_segments( hints, dim ); - if ( !error ) - { - af_latin2_hints_link_segments( hints, dim ); - - error = af_latin2_hints_compute_edges( hints, dim ); - } - return error; - } - - - static void - af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; - AF_Edge edge = axis->edges; - AF_Edge edge_limit = edge + axis->num_edges; - AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; - FT_Fixed scale = latin->scale; - FT_Pos best_dist0; /* initial threshold */ - - - /* compute the initial threshold as a fraction of the EM size */ - best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); - - if ( best_dist0 > 64 / 2 ) - best_dist0 = 64 / 2; - - /* compute which blue zones are active, i.e. have their scaled */ - /* size < 3/4 pixels */ - - /* for each horizontal edge search the blue zone which is closest */ - for ( ; edge < edge_limit; edge++ ) - { - FT_Int bb; - AF_Width best_blue = NULL; - FT_Pos best_dist = best_dist0; - - for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) - { - AF_LatinBlue blue = latin->blues + bb; - FT_Bool is_top_blue, is_major_dir; - - - /* skip inactive blue zones (i.e., those that are too small) */ - if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) - continue; - - /* if it is a top zone, check for right edges -- if it is a bottom */ - /* zone, check for left edges */ - /* */ - /* of course, that's for TrueType */ - is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); - is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); - - /* if it is a top zone, the edge must be against the major */ - /* direction; if it is a bottom zone, it must be in the major */ - /* direction */ - if ( is_top_blue ^ is_major_dir ) - { - FT_Pos dist; - AF_Width compare; - - - /* if it's a rounded edge, compare it to the overshoot position */ - /* if it's a flat edge, compare it to the reference position */ - if ( edge->flags & AF_EDGE_ROUND ) - compare = &blue->shoot; - else - compare = &blue->ref; - - dist = edge->fpos - compare->org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = compare; - } - -#if 0 - /* now, compare it to the overshoot position if the edge is */ - /* rounded, and if the edge is over the reference position of a */ - /* top zone, or under the reference position of a bottom zone */ - if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) - { - FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); - - - if ( is_top_blue ^ is_under_ref ) - { - blue = latin->blues + bb; - dist = edge->fpos - blue->shoot.org; - if ( dist < 0 ) - dist = -dist; - - dist = FT_MulFix( dist, scale ); - if ( dist < best_dist ) - { - best_dist = dist; - best_blue = & blue->shoot; - } - } - } -#endif - } - } - - if ( best_blue ) - edge->blue_edge = best_blue; - } - } - - - static FT_Error - af_latin2_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) - { - FT_Render_Mode mode; - FT_UInt32 scaler_flags, other_flags; - FT_Face face = metrics->root.scaler.face; - - - af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); - - /* - * correct x_scale and y_scale if needed, since they may have - * been modified `af_latin2_metrics_scale_dim' above - */ - hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; - hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; - hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; - hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - - /* compute flags depending on render mode, etc. */ - mode = metrics->root.scaler.render_mode; - -#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ - if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) - metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; -#endif - - scaler_flags = hints->scaler_flags; - other_flags = 0; - - /* - * We snap the width of vertical stems for the monochrome and - * horizontal LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_HORZ_SNAP; - - /* - * We snap the width of horizontal stems for the monochrome and - * vertical LCD rendering targets only. - */ - if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) - other_flags |= AF_LATIN_HINTS_VERT_SNAP; - - /* - * We adjust stems to full pixels unless in `light' or `lcd' mode. - */ - if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) - other_flags |= AF_LATIN_HINTS_STEM_ADJUST; - - if ( mode == FT_RENDER_MODE_MONO ) - other_flags |= AF_LATIN_HINTS_MONO; - - /* - * In `light' or `lcd' mode we disable horizontal hinting completely. - * We also do it if the face is italic. - */ - if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) - scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; - -#ifdef AF_CONFIG_OPTION_USE_WARPER - /* get (global) warper flag */ - if ( !metrics->root.globals->module->warping ) - scaler_flags |= AF_SCALER_FLAG_NO_WARPER; -#endif - - hints->scaler_flags = scaler_flags; - hints->other_flags = other_flags; - - return 0; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* snap a given width in scaled coordinates to one of the */ - /* current standard widths */ - - static FT_Pos - af_latin2_snap_width( AF_Width widths, - FT_UInt count, - FT_Pos width ) - { - FT_UInt n; - FT_Pos best = 64 + 32 + 2; - FT_Pos reference = width; - FT_Pos scaled; - - - for ( n = 0; n < count; n++ ) - { - FT_Pos w; - FT_Pos dist; - - - w = widths[n].cur; - dist = width - w; - if ( dist < 0 ) - dist = -dist; - if ( dist < best ) - { - best = dist; - reference = w; - } - } - - scaled = FT_PIX_ROUND( reference ); - - if ( width >= reference ) - { - if ( width < scaled + 48 ) - width = reference; - } - else - { - if ( width > scaled - 48 ) - width = reference; - } - - return width; - } - - - /* compute the snapped width of a given stem */ - - static FT_Pos - af_latin2_compute_stem_width( AF_GlyphHints hints, - AF_Dimension dim, - FT_Pos width, - FT_UInt base_flags, - FT_UInt stem_flags ) - { - AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; - AF_LatinAxis axis = & metrics->axis[dim]; - FT_Pos dist = width; - FT_Int sign = 0; - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - FT_UNUSED( base_flags ); - - - if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || - axis->extra_light ) - return width; - - if ( dist < 0 ) - { - dist = -width; - sign = 1; - } - - if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || - ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - - /* leave the widths of serifs alone */ - - if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) - goto Done_Width; - -#if 0 - else if ( ( base_flags & AF_EDGE_ROUND ) ) - { - if ( dist < 80 ) - dist = 64; - } - else if ( dist < 56 ) - dist = 56; -#endif - if ( axis->width_count > 0 ) - { - FT_Pos delta; - - - /* compare to standard width */ - if ( axis->width_count > 0 ) - { - delta = dist - axis->widths[0].cur; - - if ( delta < 0 ) - delta = -delta; - - if ( delta < 40 ) - { - dist = axis->widths[0].cur; - if ( dist < 48 ) - dist = 48; - - goto Done_Width; - } - } - - if ( dist < 3 * 64 ) - { - delta = dist & 63; - dist &= -64; - - if ( delta < 10 ) - dist += delta; - - else if ( delta < 32 ) - dist += 10; - - else if ( delta < 54 ) - dist += 54; - - else - dist += delta; - } - else - dist = ( dist + 32 ) & ~63; - } - } - else - { - /* strong hinting process: snap the stem width to integer pixels */ - FT_Pos org_dist = dist; - - - dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); - - if ( vertical ) - { - /* in the case of vertical hinting, always round */ - /* the stem heights to integer pixels */ - - if ( dist >= 64 ) - dist = ( dist + 16 ) & ~63; - else - dist = 64; - } - else - { - if ( AF_LATIN_HINTS_DO_MONO( hints ) ) - { - /* monochrome horizontal hinting: snap widths to integer pixels */ - /* with a different threshold */ - - if ( dist < 64 ) - dist = 64; - else - dist = ( dist + 32 ) & ~63; - } - else - { - /* for horizontal anti-aliased hinting, we adopt a more subtle */ - /* approach: we strengthen small stems, round stems whose size */ - /* is between 1 and 2 pixels to an integer, otherwise nothing */ - - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - - else if ( dist < 128 ) - { - /* We only round to an integer width if the corresponding */ - /* distortion is less than 1/4 pixel. Otherwise this */ - /* makes everything worse since the diagonals, which are */ - /* not hinted, appear a lot bolder or thinner than the */ - /* vertical stems. */ - - FT_Int delta; - - - dist = ( dist + 22 ) & ~63; - delta = dist - org_dist; - if ( delta < 0 ) - delta = -delta; - - if ( delta >= 16 ) - { - dist = org_dist; - if ( dist < 48 ) - dist = ( dist + 64 ) >> 1; - } - } - else - /* round otherwise to prevent color fringes in LCD mode */ - dist = ( dist + 32 ) & ~63; - } - } - } - - Done_Width: - if ( sign ) - dist = -dist; - - return dist; - } - - - /* align one stem edge relative to the previous stem edge */ - - static void - af_latin2_align_linked_edge( AF_GlyphHints hints, - AF_Dimension dim, - AF_Edge base_edge, - AF_Edge stem_edge ) - { - FT_Pos dist = stem_edge->opos - base_edge->opos; - - FT_Pos fitted_width = af_latin2_compute_stem_width( hints, dim, dist, - base_edge->flags, - stem_edge->flags ); - - - stem_edge->pos = base_edge->pos + fitted_width; - - FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " - "dist was %.2f, now %.2f\n", - stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, - stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); - } - - - static void - af_latin2_align_serif_edge( AF_GlyphHints hints, - AF_Edge base, - AF_Edge serif ) - { - FT_UNUSED( hints ); - - serif->pos = base->pos + ( serif->opos - base->opos ); - } - - - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /**** ****/ - /**** E D G E H I N T I N G ****/ - /**** ****/ - /*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - - - static void - af_latin2_hint_edges( AF_GlyphHints hints, - AF_Dimension dim ) - { - AF_AxisHints axis = &hints->axis[dim]; - AF_Edge edges = axis->edges; - AF_Edge edge_limit = edges + axis->num_edges; - AF_Edge edge; - AF_Edge anchor = NULL; - FT_Int has_serifs = 0; - FT_Pos anchor_drift = 0; - - - - FT_TRACE5(( "==== hinting %s edges =====\n", - dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); - - /* we begin by aligning all stems relative to the blue zone */ - /* if needed -- that's only for horizontal edges */ - - if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) - { - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Width blue; - AF_Edge edge1, edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - blue = edge->blue_edge; - edge1 = NULL; - edge2 = edge->link; - - if ( blue ) - { - edge1 = edge; - } - else if ( edge2 && edge2->blue_edge ) - { - blue = edge2->blue_edge; - edge1 = edge2; - edge2 = edge; - } - - if ( !edge1 ) - continue; - - FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " - "was (%.2f)\n", - edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, - edge1->pos / 64.0 )); - - edge1->pos = blue->fit; - edge1->flags |= AF_EDGE_DONE; - - if ( edge2 && !edge2->blue_edge ) - { - af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); - edge2->flags |= AF_EDGE_DONE; - } - - if ( !anchor ) - { - anchor = edge; - - anchor_drift = ( anchor->pos - anchor->opos ); - if ( edge2 ) - anchor_drift = ( anchor_drift + - ( edge2->pos - edge2->opos ) ) >> 1; - } - } - } - - /* now we will align all stem edges, trying to maintain the */ - /* relative order of stems in the glyph */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - AF_Edge edge2; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - /* skip all non-stem edges */ - edge2 = edge->link; - if ( !edge2 ) - { - has_serifs++; - continue; - } - - /* now align the stem */ - - /* this should not happen, but it's better to be safe */ - if ( edge2->blue_edge ) - { - FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); - - af_latin2_align_linked_edge( hints, dim, edge2, edge ); - edge->flags |= AF_EDGE_DONE; - continue; - } - - if ( !anchor ) - { - FT_Pos org_len, org_center, cur_len; - FT_Pos cur_pos1, error1, error2, u_off, d_off; - - - org_len = edge2->opos - edge->opos; - cur_len = af_latin2_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - if ( cur_len <= 64 ) - u_off = d_off = 32; - else - { - u_off = 38; - d_off = 26; - } - - if ( cur_len < 96 ) - { - org_center = edge->opos + ( org_len >> 1 ); - - cur_pos1 = FT_PIX_ROUND( org_center ); - - error1 = org_center - ( cur_pos1 - u_off ); - if ( error1 < 0 ) - error1 = -error1; - - error2 = org_center - ( cur_pos1 + d_off ); - if ( error2 < 0 ) - error2 = -error2; - - if ( error1 < error2 ) - cur_pos1 -= u_off; - else - cur_pos1 += d_off; - - edge->pos = cur_pos1 - cur_len / 2; - edge2->pos = edge->pos + cur_len; - } - else - edge->pos = FT_PIX_ROUND( edge->opos ); - - FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" - " snapped to (%.2f) (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0 )); - anchor = edge; - - edge->flags |= AF_EDGE_DONE; - - af_latin2_align_linked_edge( hints, dim, edge, edge2 ); - - edge2->flags |= AF_EDGE_DONE; - - anchor_drift = ( ( anchor->pos - anchor->opos ) + - ( edge2->pos - edge2->opos ) ) >> 1; - - FT_TRACE5(( "DRIFT: %.2f\n", anchor_drift/64.0 )); - } - else - { - FT_Pos org_pos, org_len, org_center, cur_center, cur_len; - FT_Pos org_left, org_right; - - - org_pos = edge->opos + anchor_drift; - org_len = edge2->opos - edge->opos; - org_center = org_pos + ( org_len >> 1 ); - - cur_len = af_latin2_compute_stem_width( hints, dim, org_len, - edge->flags, - edge2->flags ); - - org_left = org_pos + ( ( org_len - cur_len ) >> 1 ); - org_right = org_pos + ( ( org_len + cur_len ) >> 1 ); - - FT_TRACE5(( "ALIGN: left=%.2f right=%.2f ", - org_left / 64.0, org_right / 64.0 )); - cur_center = org_center; - - if ( edge2->flags & AF_EDGE_DONE ) - { - FT_TRACE5(( "\n" )); - edge->pos = edge2->pos - cur_len; - } - else - { - /* we want to compare several displacement, and choose - * the one that increases fitness while minimizing - * distortion as well - */ - FT_Pos displacements[6], scores[6], org, fit, delta; - FT_UInt count = 0; - - /* note: don't even try to fit tiny stems */ - if ( cur_len < 32 ) - { - FT_TRACE5(( "tiny stem\n" )); - goto AlignStem; - } - - /* if the span is within a single pixel, don't touch it */ - if ( FT_PIX_FLOOR( org_left ) == FT_PIX_CEIL( org_right ) ) - { - FT_TRACE5(( "single pixel stem\n" )); - goto AlignStem; - } - - if ( cur_len <= 96 ) - { - /* we want to avoid the absolute worst case which is - * when the left and right edges of the span each represent - * about 50% of the gray. we'd better want to change this - * to 25/75%, since this is much more pleasant to the eye with - * very acceptable distortion - */ - FT_Pos frac_left = org_left & 63; - FT_Pos frac_right = org_right & 63; - - if ( frac_left >= 22 && frac_left <= 42 && - frac_right >= 22 && frac_right <= 42 ) - { - org = frac_left; - fit = ( org <= 32 ) ? 16 : 48; - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispA=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - org = frac_right; - fit = ( org <= 32 ) ? 16 : 48; - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispB=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - } - } - - /* snapping the left edge to the grid */ - org = org_left; - fit = FT_PIX_ROUND( org ); - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispC=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - /* snapping the right edge to the grid */ - org = org_right; - fit = FT_PIX_ROUND( org ); - delta = FT_ABS( fit - org ); - displacements[count] = fit - org; - scores[count++] = delta; - FT_TRACE5(( "dispD=%.2f (%d) ", ( fit - org ) / 64.0, delta )); - - /* now find the best displacement */ - { - FT_Pos best_score = scores[0]; - FT_Pos best_disp = displacements[0]; - FT_UInt nn; - - for ( nn = 1; nn < count; nn++ ) - { - if ( scores[nn] < best_score ) - { - best_score = scores[nn]; - best_disp = displacements[nn]; - } - } - - cur_center = org_center + best_disp; - } - FT_TRACE5(( "\n" )); - } - - AlignStem: - edge->pos = cur_center - ( cur_len >> 1 ); - edge2->pos = edge->pos + cur_len; - - FT_TRACE5(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)" - " snapped to (%.2f) and (%.2f)," - " org_len=%.2f cur_len=%.2f\n", - edge-edges, edge->opos / 64.0, - edge2-edges, edge2->opos / 64.0, - edge->pos / 64.0, edge2->pos / 64.0, - org_len / 64.0, cur_len / 64.0 )); - - edge->flags |= AF_EDGE_DONE; - edge2->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - { - FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n", - edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); - edge->pos = edge[-1].pos; - } - } - } - - /* make sure that lowercase m's maintain their symmetry */ - - /* In general, lowercase m's have six vertical edges if they are sans */ - /* serif, or twelve if they are with serifs. This implementation is */ - /* based on that assumption, and seems to work very well with most */ - /* faces. However, if for a certain face this assumption is not */ - /* true, the m is just rendered like before. In addition, any stem */ - /* correction will only be applied to symmetrical glyphs (even if the */ - /* glyph is not an m), so the potential for unwanted distortion is */ - /* relatively low. */ - - /* We don't handle horizontal edges since we can't easily assure that */ - /* the third (lowest) stem aligns with the base line; it might end up */ - /* one pixel higher or lower. */ - -#if 0 - { - FT_Int n_edges = edge_limit - edges; - - - if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) - { - AF_Edge edge1, edge2, edge3; - FT_Pos dist1, dist2, span, delta; - - - if ( n_edges == 6 ) - { - edge1 = edges; - edge2 = edges + 2; - edge3 = edges + 4; - } - else - { - edge1 = edges + 1; - edge2 = edges + 5; - edge3 = edges + 9; - } - - dist1 = edge2->opos - edge1->opos; - dist2 = edge3->opos - edge2->opos; - - span = dist1 - dist2; - if ( span < 0 ) - span = -span; - - if ( span < 8 ) - { - delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); - edge3->pos -= delta; - if ( edge3->link ) - edge3->link->pos -= delta; - - /* move the serifs along with the stem */ - if ( n_edges == 12 ) - { - ( edges + 8 )->pos -= delta; - ( edges + 11 )->pos -= delta; - } - - edge3->flags |= AF_EDGE_DONE; - if ( edge3->link ) - edge3->link->flags |= AF_EDGE_DONE; - } - } - } -#endif - - if ( has_serifs || !anchor ) - { - /* - * now hint the remaining edges (serifs and single) in order - * to complete our processing - */ - for ( edge = edges; edge < edge_limit; edge++ ) - { - FT_Pos delta; - - - if ( edge->flags & AF_EDGE_DONE ) - continue; - - delta = 1000; - - if ( edge->serif ) - { - delta = edge->serif->opos - edge->opos; - if ( delta < 0 ) - delta = -delta; - } - - if ( delta < 64 + 16 ) - { - af_latin2_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" - " aligned to (%.2f)\n", - edge-edges, edge->opos / 64.0, - edge->serif - edges, edge->serif->opos / 64.0, - edge->pos / 64.0 )); - } - else if ( !anchor ) - { - FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)" - " snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - edge->pos = FT_PIX_ROUND( edge->opos ); - anchor = edge; - } - else - { - AF_Edge before, after; - - - for ( before = edge - 1; before >= edges; before-- ) - if ( before->flags & AF_EDGE_DONE ) - break; - - for ( after = edge + 1; after < edge_limit; after++ ) - if ( after->flags & AF_EDGE_DONE ) - break; - - if ( before >= edges && before < edge && - after < edge_limit && after > edge ) - { - if ( after->opos == before->opos ) - edge->pos = before->pos; - else - edge->pos = before->pos + - FT_MulDiv( edge->opos - before->opos, - after->pos - before->pos, - after->opos - before->opos ); - FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)" - " from %d (opos=%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0, - before - edges, before->opos / 64.0 )); - } - else - { - edge->pos = anchor->pos + - ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - - FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)" - " snapped to (%.2f)\n", - edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); - } - } - - edge->flags |= AF_EDGE_DONE; - - if ( edge > edges && edge->pos < edge[-1].pos ) - edge->pos = edge[-1].pos; - - if ( edge + 1 < edge_limit && - edge[1].flags & AF_EDGE_DONE && - edge->pos > edge[1].pos ) - edge->pos = edge[1].pos; - } - } - } - - - static FT_Error - af_latin2_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_LatinMetrics metrics ) - { - FT_Error error; - int dim; - - FT_UNUSED( glyph_index ); - - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) - goto Exit; - - /* analyze glyph outline */ - if ( AF_HINTS_DO_HORIZONTAL( hints ) ) - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); - if ( error ) - goto Exit; - } - - if ( AF_HINTS_DO_VERTICAL( hints ) ) - { - error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); - if ( error ) - goto Exit; - - af_latin2_hints_compute_blue_edges( hints, metrics ); - } - - /* grid-fit the outline */ - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) - { -#ifdef AF_CONFIG_OPTION_USE_WARPER - if ( dim == AF_DIMENSION_HORZ && - metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && - AF_HINTS_DO_WARP( hints ) ) - { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; - - - af_warper_compute( &warper, hints, dim, &scale, &delta ); - af_glyph_hints_scale_dim( hints, dim, scale, delta ); - continue; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - - if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || - ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin2_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); - af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); - } - } - af_glyph_hints_save( hints, outline ); - - Exit: - return error; - } - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** L A T I N S C R I P T C L A S S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - - AF_DEFINE_WRITING_SYSTEM_CLASS( - af_latin2_writing_system_class, - - AF_WRITING_SYSTEM_LATIN2, - - sizeof ( AF_LatinMetricsRec ), - - (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init, /* style_metrics_init */ - (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale, /* style_metrics_scale */ - (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ - (AF_WritingSystem_GetStdWidthsFunc)af_latin2_get_standard_widths, /* style_metrics_getstdw */ - - (AF_WritingSystem_InitHintsFunc) af_latin2_hints_init, /* style_hints_init */ - (AF_WritingSystem_ApplyHintsFunc) af_latin2_hints_apply /* style_hints_apply */ - ) - -#else /* !FT_OPTION_AUTOFIT2 */ - - /* ANSI C doesn't like empty source files */ - typedef int _af_latin2_dummy; - -#endif /* !FT_OPTION_AUTOFIT2 */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aflatin2.h b/ThirdParty/freetype/src/autofit/aflatin2.h deleted file mode 100644 index 507cef3..0000000 --- a/ThirdParty/freetype/src/autofit/aflatin2.h +++ /dev/null @@ -1,46 +0,0 @@ -/* ATTENTION: This file doesn't compile. It is only here as a reference */ -/* of an alternative latin hinting algorithm that was always */ -/* marked as experimental. */ - - -/**************************************************************************** - * - * aflatin2.h - * - * Auto-fitter hinting routines for latin writing system - * (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFLATIN2_H_ -#define AFLATIN2_H_ - -#include "afhints.h" - - -FT_BEGIN_HEADER - - - /* the `latin' writing system */ - - AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin2_writing_system_class ) - - -/* */ - -FT_END_HEADER - -#endif /* AFLATIN_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afloader.c b/ThirdParty/freetype/src/autofit/afloader.c deleted file mode 100644 index 83743b7..0000000 --- a/ThirdParty/freetype/src/autofit/afloader.c +++ /dev/null @@ -1,720 +0,0 @@ -/**************************************************************************** - * - * afloader.c - * - * Auto-fitter glyph loading routines (body). - * - * 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. - * - */ - - -#include "afglobal.h" -#include "afloader.h" -#include "afhints.h" -#include "aferrors.h" -#include "afmodule.h" - -#include FT_INTERNAL_CALC_H - - - /* Initialize glyph loader. */ - - FT_LOCAL_DEF( void ) - af_loader_init( AF_Loader loader, - AF_GlyphHints hints ) - { - FT_ZERO( loader ); - - loader->hints = hints; - } - - - /* Reset glyph loader and compute globals if necessary. */ - - FT_LOCAL_DEF( FT_Error ) - af_loader_reset( AF_Loader loader, - AF_Module module, - FT_Face face ) - { - FT_Error error = FT_Err_Ok; - - - loader->face = face; - loader->globals = (AF_FaceGlobals)face->autohint.data; - - if ( !loader->globals ) - { - error = af_face_globals_new( face, &loader->globals, module ); - if ( !error ) - { - face->autohint.data = - (FT_Pointer)loader->globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; - } - } - - return error; - } - - - /* Finalize glyph loader. */ - - FT_LOCAL_DEF( void ) - af_loader_done( AF_Loader loader ) - { - loader->face = NULL; - loader->globals = NULL; - loader->hints = NULL; - } - - -#define af_intToFixed( i ) \ - ( (FT_Fixed)( (FT_UInt32)(i) << 16 ) ) -#define af_fixedToInt( x ) \ - ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) -#define af_floatToFixed( f ) \ - ( (FT_Fixed)( (f) * 65536.0 + 0.5 ) ) - - - static FT_Error - af_loader_embolden_glyph_in_slot( AF_Loader loader, - FT_Face face, - AF_StyleMetrics style_metrics ) - { - FT_Error error = FT_Err_Ok; - - FT_GlyphSlot slot = face->glyph; - AF_FaceGlobals globals = loader->globals; - AF_WritingSystemClass writing_system_class; - - FT_Size_Metrics* size_metrics = &face->size->internal->autohint_metrics; - - FT_Pos stdVW = 0; - FT_Pos stdHW = 0; - - FT_Bool size_changed = size_metrics->x_ppem != - globals->stem_darkening_for_ppem; - - FT_Fixed em_size = af_intToFixed( face->units_per_EM ); - FT_Fixed em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size ); - - FT_Matrix scale_down_matrix = { 0x10000L, 0, 0, 0x10000L }; - - - /* Skip stem darkening for broken fonts. */ - if ( !face->units_per_EM ) - { - error = FT_ERR( Corrupted_Font_Header ); - goto Exit; - } - - /* - * We depend on the writing system (script analyzers) to supply - * standard widths for the script of the glyph we are looking at. If - * it can't deliver, stem darkening is disabled. - */ - writing_system_class = - af_writing_system_classes[style_metrics->style_class->writing_system]; - - if ( writing_system_class->style_metrics_getstdw ) - writing_system_class->style_metrics_getstdw( style_metrics, - &stdHW, - &stdVW ); - else - { - error = FT_ERR( Unimplemented_Feature ); - goto Exit; - } - - if ( size_changed || - ( stdVW > 0 && stdVW != globals->standard_vertical_width ) ) - { - FT_Fixed darken_by_font_units_x, darken_x; - - - darken_by_font_units_x = - af_intToFixed( af_loader_compute_darkening( loader, - face, - stdVW ) ); - darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x, - size_metrics->x_scale ), - em_ratio ); - - globals->standard_vertical_width = stdVW; - globals->stem_darkening_for_ppem = size_metrics->x_ppem; - globals->darken_x = af_fixedToInt( darken_x ); - } - - if ( size_changed || - ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) ) - { - FT_Fixed darken_by_font_units_y, darken_y; - - - darken_by_font_units_y = - af_intToFixed( af_loader_compute_darkening( loader, - face, - stdHW ) ); - darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y, - size_metrics->y_scale ), - em_ratio ); - - globals->standard_horizontal_width = stdHW; - globals->stem_darkening_for_ppem = size_metrics->x_ppem; - globals->darken_y = af_fixedToInt( darken_y ); - - /* - * Scale outlines down on the Y-axis to keep them inside their blue - * zones. The stronger the emboldening, the stronger the downscaling - * (plus heuristical padding to prevent outlines still falling out - * their zones due to rounding). - * - * Reason: `FT_Outline_Embolden' works by shifting the rightmost - * points of stems farther to the right, and topmost points farther - * up. This positions points on the Y-axis outside their - * pre-computed blue zones and leads to distortion when applying the - * hints in the code further below. Code outside this emboldening - * block doesn't know we are presenting it with modified outlines the - * analyzer didn't see! - * - * An unfortunate side effect of downscaling is that the emboldening - * effect is slightly decreased. The loss becomes more pronounced - * versus the CFF driver at smaller sizes, e.g., at 9ppem and below. - */ - globals->scale_down_factor = - FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ), - em_size ); - } - - FT_Outline_EmboldenXY( &slot->outline, - globals->darken_x, - globals->darken_y ); - - scale_down_matrix.yy = globals->scale_down_factor; - FT_Outline_Transform( &slot->outline, &scale_down_matrix ); - - Exit: - return error; - } - - - /* Load the glyph at index into the current slot of a face and hint it. */ - - FT_LOCAL_DEF( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - AF_Module module, - FT_Face face, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error; - - FT_Size size = face->size; - FT_Size_Internal size_internal = size->internal; - FT_GlyphSlot slot = face->glyph; - FT_Slot_Internal slot_internal = slot->internal; - FT_GlyphLoader gloader = slot_internal->loader; - - AF_GlyphHints hints = loader->hints; - AF_ScalerRec scaler; - AF_StyleMetrics style_metrics; - FT_UInt style_options = AF_STYLE_NONE_DFLT; - AF_StyleClass style_class; - AF_WritingSystemClass writing_system_class; - - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - FT_ZERO( &scaler ); - - if ( !size_internal->autohint_metrics.x_scale || - size_internal->autohint_mode != FT_LOAD_TARGET_MODE( load_flags ) ) - { - /* switching between hinting modes usually means different scaling */ - /* values; this later on enforces recomputation of everything */ - /* related to the current size */ - - size_internal->autohint_mode = FT_LOAD_TARGET_MODE( load_flags ); - size_internal->autohint_metrics = size->metrics; - -#ifdef AF_CONFIG_OPTION_TT_SIZE_METRICS - { - FT_Size_Metrics* size_metrics = &size_internal->autohint_metrics; - - - /* set metrics to integer values and adjust scaling accordingly; */ - /* this is the same setup as with TrueType fonts, cf. function */ - /* `tt_size_reset' in file `ttobjs.c' */ - size_metrics->ascender = FT_PIX_ROUND( - FT_MulFix( face->ascender, - size_metrics->y_scale ) ); - size_metrics->descender = FT_PIX_ROUND( - FT_MulFix( face->descender, - size_metrics->y_scale ) ); - size_metrics->height = FT_PIX_ROUND( - FT_MulFix( face->height, - size_metrics->y_scale ) ); - - size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, - face->units_per_EM ); - size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, - face->units_per_EM ); - size_metrics->max_advance = FT_PIX_ROUND( - FT_MulFix( face->max_advance_width, - size_metrics->x_scale ) ); - } -#endif /* AF_CONFIG_OPTION_TT_SIZE_METRICS */ - } - - /* - * TODO: This code currently doesn't support fractional advance widths, - * i.e., placing hinted glyphs at anything other than integer - * x-positions. This is only relevant for the warper code, which - * scales and shifts glyphs to optimize blackness of stems (hinting on - * the x-axis by nature places things on pixel integers, hinting on the - * y-axis only, i.e., LIGHT mode, doesn't touch the x-axis). The delta - * values of the scaler would need to be adjusted. - */ - scaler.face = face; - scaler.x_scale = size_internal->autohint_metrics.x_scale; - scaler.x_delta = 0; - scaler.y_scale = size_internal->autohint_metrics.y_scale; - scaler.y_delta = 0; - - scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); - scaler.flags = 0; - - /* note that the fallback style can't be changed anymore */ - /* after the first call of `af_loader_load_glyph' */ - error = af_loader_reset( loader, module, face ); - if ( error ) - goto Exit; - -#ifdef FT_OPTION_AUTOFIT2 - /* XXX: undocumented hook to activate the latin2 writing system. */ - if ( load_flags & ( 1UL << 20 ) ) - style_options = AF_STYLE_LTN2_DFLT; -#endif - - /* - * Glyphs (really code points) are assigned to scripts. Script - * analysis is done lazily: For each glyph that passes through here, - * the corresponding script analyzer is called, but returns immediately - * if it has been run already. - */ - error = af_face_globals_get_metrics( loader->globals, glyph_index, - style_options, &style_metrics ); - if ( error ) - goto Exit; - - style_class = style_metrics->style_class; - writing_system_class = - af_writing_system_classes[style_class->writing_system]; - - loader->metrics = style_metrics; - - if ( writing_system_class->style_metrics_scale ) - writing_system_class->style_metrics_scale( style_metrics, &scaler ); - else - style_metrics->scaler = scaler; - - if ( writing_system_class->style_hints_init ) - { - error = writing_system_class->style_hints_init( hints, - style_metrics ); - if ( error ) - goto Exit; - } - - /* - * Do the main work of `af_loader_load_glyph'. Note that we never have - * to deal with composite glyphs as those get loaded into - * FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. - * In the rare cases where FT_LOAD_NO_RECURSE is set, it implies - * FT_LOAD_NO_SCALE and as such the auto-hinter is never called. - */ - load_flags |= FT_LOAD_NO_SCALE | - FT_LOAD_IGNORE_TRANSFORM | - FT_LOAD_LINEAR_DESIGN; - load_flags &= ~FT_LOAD_RENDER; - - error = FT_Load_Glyph( face, glyph_index, load_flags ); - if ( error ) - goto Exit; - - /* - * Apply stem darkening (emboldening) here before hints are applied to - * the outline. Glyphs are scaled down proportionally to the - * emboldening so that curve points don't fall outside their - * precomputed blue zones. - * - * Any emboldening done by the font driver (e.g., the CFF driver) - * doesn't reach here because the autohinter loads the unprocessed - * glyphs in font units for analysis (functions `af_*_metrics_init_*') - * and then above to prepare it for the rasterizers by itself, - * independently of the font driver. So emboldening must be done here, - * within the autohinter. - * - * All glyphs to be autohinted pass through here one by one. The - * standard widths can therefore change from one glyph to the next, - * depending on what script a glyph is assigned to (each script has its - * own set of standard widths and other metrics). The darkening amount - * must therefore be recomputed for each size and - * `standard_{vertical,horizontal}_width' change. - * - * Ignore errors and carry on without emboldening. - * - */ - - /* stem darkening only works well in `light' mode */ - if ( scaler.render_mode == FT_RENDER_MODE_LIGHT && - ( !face->internal->no_stem_darkening || - ( face->internal->no_stem_darkening < 0 && - !module->no_stem_darkening ) ) ) - af_loader_embolden_glyph_in_slot( loader, face, style_metrics ); - - loader->transformed = slot_internal->glyph_transformed; - if ( loader->transformed ) - { - FT_Matrix inverse; - - - loader->trans_matrix = slot_internal->glyph_matrix; - loader->trans_delta = slot_internal->glyph_delta; - - inverse = loader->trans_matrix; - if ( !FT_Matrix_Invert( &inverse ) ) - FT_Vector_Transform( &loader->trans_delta, &inverse ); - } - - switch ( slot->format ) - { - case FT_GLYPH_FORMAT_OUTLINE: - /* translate the loaded glyph when an internal transform is needed */ - if ( loader->transformed ) - FT_Outline_Translate( &slot->outline, - loader->trans_delta.x, - loader->trans_delta.y ); - - /* compute original horizontal phantom points */ - /* (and ignore vertical ones) */ - loader->pp1.x = hints->x_delta; - loader->pp1.y = hints->y_delta; - loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, - hints->x_scale ) + hints->x_delta; - loader->pp2.y = hints->y_delta; - - /* be sure to check for spacing glyphs */ - if ( slot->outline.n_points == 0 ) - goto Hint_Metrics; - - /* now load the slot image into the auto-outline */ - /* and run the automatic hinting process */ - if ( writing_system_class->style_hints_apply ) - { - error = writing_system_class->style_hints_apply( - glyph_index, - hints, - &gloader->base.outline, - style_metrics ); - if ( error ) - goto Exit; - } - - /* we now need to adjust the metrics according to the change in */ - /* width/positioning that occurred during the hinting process */ - if ( scaler.render_mode != FT_RENDER_MODE_LIGHT ) - { - AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; - - - if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) - { - AF_Edge edge1 = axis->edges; /* leftmost edge */ - AF_Edge edge2 = edge1 + - axis->num_edges - 1; /* rightmost edge */ - - FT_Pos old_rsb = loader->pp2.x - edge2->opos; - /* loader->pp1.x is always zero at this point of time */ - FT_Pos old_lsb = edge1->opos; /* - loader->pp1.x */ - FT_Pos new_lsb = edge1->pos; - - /* remember unhinted values to later account */ - /* for rounding errors */ - FT_Pos pp1x_uh = new_lsb - old_lsb; - FT_Pos pp2x_uh = edge2->pos + old_rsb; - - - /* prefer too much space over too little space */ - /* for very small sizes */ - - if ( old_lsb < 24 ) - pp1x_uh -= 8; - - if ( old_rsb < 24 ) - pp2x_uh += 8; - - loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); - loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); - - if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) - loader->pp1.x -= 64; - - if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) - loader->pp2.x += 64; - - slot->lsb_delta = loader->pp1.x - pp1x_uh; - slot->rsb_delta = loader->pp2.x - pp2x_uh; - } - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); - loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - } - /* `light' mode uses integer advance widths */ - /* but sets `lsb_delta' and `rsb_delta' */ - else - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; - - - loader->pp1.x = FT_PIX_ROUND( pp1x ); - loader->pp2.x = FT_PIX_ROUND( pp2x ); - - slot->lsb_delta = loader->pp1.x - pp1x; - slot->rsb_delta = loader->pp2.x - pp2x; - } - - break; - - default: - /* we don't support other formats (yet?) */ - error = FT_THROW( Unimplemented_Feature ); - } - - Hint_Metrics: - { - FT_BBox bbox; - FT_Vector vvector; - - - vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; - vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; - vvector.x = FT_MulFix( vvector.x, style_metrics->scaler.x_scale ); - vvector.y = FT_MulFix( vvector.y, style_metrics->scaler.y_scale ); - - /* transform the hinted outline if needed */ - if ( loader->transformed ) - { - FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); - FT_Vector_Transform( &vvector, &loader->trans_matrix ); - } - - /* we must translate our final outline by -pp1.x and compute */ - /* the new metrics */ - if ( loader->pp1.x ) - FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); - - FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); - - bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); - bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); - bbox.xMax = FT_PIX_CEIL( bbox.xMax ); - bbox.yMax = FT_PIX_CEIL( bbox.yMax ); - - slot->metrics.width = bbox.xMax - bbox.xMin; - slot->metrics.height = bbox.yMax - bbox.yMin; - slot->metrics.horiBearingX = bbox.xMin; - slot->metrics.horiBearingY = bbox.yMax; - - slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); - slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); - - /* for mono-width fonts (like Andale, Courier, etc.) we need */ - /* to keep the original rounded advance width; ditto for */ - /* digits if all have the same advance width */ - if ( scaler.render_mode != FT_RENDER_MODE_LIGHT && - ( FT_IS_FIXED_WIDTH( slot->face ) || - ( af_face_globals_is_digit( loader->globals, glyph_index ) && - style_metrics->digits_have_same_width ) ) ) - { - slot->metrics.horiAdvance = - FT_MulFix( slot->metrics.horiAdvance, - style_metrics->scaler.x_scale ); - - /* Set delta values to 0. Otherwise code that uses them is */ - /* going to ruin the fixed advance width. */ - slot->lsb_delta = 0; - slot->rsb_delta = 0; - } - else - { - /* non-spacing glyphs must stay as-is */ - if ( slot->metrics.horiAdvance ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - } - - slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, - style_metrics->scaler.y_scale ); - - slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); - slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); - - slot->format = FT_GLYPH_FORMAT_OUTLINE; - } - - Exit: - return error; - } - - - /* - * Compute amount of font units the face should be emboldened by, in - * analogy to the CFF driver's `cf2_computeDarkening' function. See there - * for details of the algorithm. - * - * XXX: Currently a crude adaption of the original algorithm. Do better? - */ - FT_LOCAL_DEF( FT_Int32 ) - af_loader_compute_darkening( AF_Loader loader, - FT_Face face, - FT_Pos standard_width ) - { - AF_Module module = loader->globals->module; - - FT_UShort units_per_EM; - FT_Fixed ppem, em_ratio; - FT_Fixed stem_width, stem_width_per_1000, scaled_stem, darken_amount; - FT_Int log_base_2; - FT_Int x1, y1, x2, y2, x3, y3, x4, y4; - - - ppem = FT_MAX( af_intToFixed( 4 ), - af_intToFixed( face->size->metrics.x_ppem ) ); - units_per_EM = face->units_per_EM; - - em_ratio = FT_DivFix( af_intToFixed( 1000 ), - af_intToFixed ( units_per_EM ) ); - if ( em_ratio < af_floatToFixed( .01 ) ) - { - /* If something goes wrong, don't embolden. */ - return 0; - } - - x1 = module->darken_params[0]; - y1 = module->darken_params[1]; - x2 = module->darken_params[2]; - y2 = module->darken_params[3]; - x3 = module->darken_params[4]; - y3 = module->darken_params[5]; - x4 = module->darken_params[6]; - y4 = module->darken_params[7]; - - if ( standard_width <= 0 ) - { - stem_width = af_intToFixed( 75 ); /* taken from cf2font.c */ - stem_width_per_1000 = stem_width; - } - else - { - stem_width = af_intToFixed( standard_width ); - stem_width_per_1000 = FT_MulFix( stem_width, em_ratio ); - } - - log_base_2 = FT_MSB( (FT_UInt32)stem_width_per_1000 ) + - FT_MSB( (FT_UInt32)ppem ); - - if ( log_base_2 >= 46 ) - { - /* possible overflow */ - scaled_stem = af_intToFixed( x4 ); - } - else - scaled_stem = FT_MulFix( stem_width_per_1000, ppem ); - - /* now apply the darkening parameters */ - if ( scaled_stem < af_intToFixed( x1 ) ) - darken_amount = FT_DivFix( af_intToFixed( y1 ), ppem ); - - else if ( scaled_stem < af_intToFixed( x2 ) ) - { - FT_Int xdelta = x2 - x1; - FT_Int ydelta = y2 - y1; - FT_Int x = stem_width_per_1000 - - FT_DivFix( af_intToFixed( x1 ), ppem ); - - - if ( !xdelta ) - goto Try_x3; - - darken_amount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( af_intToFixed( y1 ), ppem ); - } - - else if ( scaled_stem < af_intToFixed( x3 ) ) - { - Try_x3: - { - FT_Int xdelta = x3 - x2; - FT_Int ydelta = y3 - y2; - FT_Int x = stem_width_per_1000 - - FT_DivFix( af_intToFixed( x2 ), ppem ); - - - if ( !xdelta ) - goto Try_x4; - - darken_amount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( af_intToFixed( y2 ), ppem ); - } - } - - else if ( scaled_stem < af_intToFixed( x4 ) ) - { - Try_x4: - { - FT_Int xdelta = x4 - x3; - FT_Int ydelta = y4 - y3; - FT_Int x = stem_width_per_1000 - - FT_DivFix( af_intToFixed( x3 ), ppem ); - - - if ( !xdelta ) - goto Use_y4; - - darken_amount = FT_MulDiv( x, ydelta, xdelta ) + - FT_DivFix( af_intToFixed( y3 ), ppem ); - } - } - - else - { - Use_y4: - darken_amount = FT_DivFix( af_intToFixed( y4 ), ppem ); - } - - /* Convert darken_amount from per 1000 em to true character space. */ - return af_fixedToInt( FT_DivFix( darken_amount, em_ratio ) ); - } - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afloader.h b/ThirdParty/freetype/src/autofit/afloader.h deleted file mode 100644 index d1e0f3c..0000000 --- a/ThirdParty/freetype/src/autofit/afloader.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** - * - * afloader.h - * - * Auto-fitter glyph loading routines (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFLOADER_H_ -#define AFLOADER_H_ - -#include "afhints.h" -#include "afmodule.h" -#include "afglobal.h" - - -FT_BEGIN_HEADER - - /* - * The autofitter module's (global) data structure to communicate with - * actual fonts. If necessary, `local' data like the current face, the - * current face's auto-hint data, or the current glyph's parameters - * relevant to auto-hinting are `swapped in'. Cf. functions like - * `af_loader_reset' and `af_loader_load_g'. - */ - - typedef struct AF_LoaderRec_ - { - /* current face data */ - FT_Face face; - AF_FaceGlobals globals; - - /* current glyph data */ - AF_GlyphHints hints; - AF_StyleMetrics metrics; - FT_Bool transformed; - FT_Matrix trans_matrix; - FT_Vector trans_delta; - FT_Vector pp1; - FT_Vector pp2; - /* we don't handle vertical phantom points */ - - } AF_LoaderRec, *AF_Loader; - - - FT_LOCAL( void ) - af_loader_init( AF_Loader loader, - AF_GlyphHints hints ); - - - FT_LOCAL( FT_Error ) - af_loader_reset( AF_Loader loader, - AF_Module module, - FT_Face face ); - - - FT_LOCAL( void ) - af_loader_done( AF_Loader loader ); - - - FT_LOCAL( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - AF_Module module, - FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags ); - - FT_LOCAL_DEF( FT_Int32 ) - af_loader_compute_darkening( AF_Loader loader, - FT_Face face, - FT_Pos standard_width ); - -/* */ - - -FT_END_HEADER - -#endif /* AFLOADER_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afmodule.c b/ThirdParty/freetype/src/autofit/afmodule.c deleted file mode 100644 index 3e46a36..0000000 --- a/ThirdParty/freetype/src/autofit/afmodule.c +++ /dev/null @@ -1,574 +0,0 @@ -/**************************************************************************** - * - * afmodule.c - * - * Auto-fitter module implementation (body). - * - * 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. - * - */ - - -#include "afglobal.h" -#include "afmodule.h" -#include "afloader.h" -#include "aferrors.h" - -#ifdef FT_DEBUG_AUTOFIT - -#ifndef FT_MAKE_OPTION_SINGLE_OBJECT - -#ifdef __cplusplus - extern "C" { -#endif - extern void - af_glyph_hints_dump_segments( AF_GlyphHints hints, - FT_Bool to_stdout ); - extern void - af_glyph_hints_dump_points( AF_GlyphHints hints, - FT_Bool to_stdout ); - extern void - af_glyph_hints_dump_edges( AF_GlyphHints hints, - FT_Bool to_stdout ); -#ifdef __cplusplus - } -#endif - -#endif - - int _af_debug_disable_horz_hints; - int _af_debug_disable_vert_hints; - int _af_debug_disable_blue_hints; - - /* we use a global object instead of a local one for debugging */ - AF_GlyphHintsRec _af_debug_hints_rec[1]; - - void* _af_debug_hints = _af_debug_hints_rec; -#endif - -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H -#include FT_DRIVER_H -#include FT_SERVICE_PROPERTIES_H - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afmodule - - - static FT_Error - af_property_get_face_globals( FT_Face face, - AF_FaceGlobals* aglobals, - AF_Module module ) - { - FT_Error error = FT_Err_Ok; - AF_FaceGlobals globals; - - - if ( !face ) - return FT_THROW( Invalid_Face_Handle ); - - globals = (AF_FaceGlobals)face->autohint.data; - if ( !globals ) - { - /* trigger computation of the global style data */ - /* in case it hasn't been done yet */ - error = af_face_globals_new( face, &globals, module ); - if ( !error ) - { - face->autohint.data = - (FT_Pointer)globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; - } - } - - if ( !error ) - *aglobals = globals; - - return error; - } - - - static FT_Error - af_property_set( FT_Module ft_module, - const char* property_name, - const void* value, - FT_Bool value_is_string ) - { - FT_Error error = FT_Err_Ok; - AF_Module module = (AF_Module)ft_module; - -#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - FT_UNUSED( value_is_string ); -#endif - - - if ( !ft_strcmp( property_name, "fallback-script" ) ) - { - FT_UInt* fallback_script; - FT_UInt ss; - - -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - if ( value_is_string ) - return FT_THROW( Invalid_Argument ); -#endif - - fallback_script = (FT_UInt*)value; - - /* We translate the fallback script to a fallback style that uses */ - /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */ - /* coverage value. */ - for ( ss = 0; af_style_classes[ss]; ss++ ) - { - AF_StyleClass style_class = af_style_classes[ss]; - - - if ( (FT_UInt)style_class->script == *fallback_script && - style_class->coverage == AF_COVERAGE_DEFAULT ) - { - module->fallback_style = ss; - break; - } - } - - if ( !af_style_classes[ss] ) - { - FT_TRACE0(( "af_property_set: Invalid value %d for property `%s'\n", - fallback_script, property_name )); - return FT_THROW( Invalid_Argument ); - } - - return error; - } - else if ( !ft_strcmp( property_name, "default-script" ) ) - { - FT_UInt* default_script; - - -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - if ( value_is_string ) - return FT_THROW( Invalid_Argument ); -#endif - - default_script = (FT_UInt*)value; - - module->default_script = *default_script; - - return error; - } - else if ( !ft_strcmp( property_name, "increase-x-height" ) ) - { - FT_Prop_IncreaseXHeight* prop; - AF_FaceGlobals globals; - - -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - if ( value_is_string ) - return FT_THROW( Invalid_Argument ); -#endif - - prop = (FT_Prop_IncreaseXHeight*)value; - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - globals->increase_x_height = prop->limit; - - return error; - } -#ifdef AF_CONFIG_OPTION_USE_WARPER - else if ( !ft_strcmp( property_name, "warping" ) ) - { -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - if ( value_is_string ) - { - const char* s = (const char*)value; - long w = ft_strtol( s, NULL, 10 ); - - - if ( w == 0 ) - module->warping = 0; - else if ( w == 1 ) - module->warping = 1; - else - return FT_THROW( Invalid_Argument ); - } - else -#endif - { - FT_Bool* warping = (FT_Bool*)value; - - - module->warping = *warping; - } - - return error; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) - { - FT_Int* darken_params; - FT_Int x1, y1, x2, y2, x3, y3, x4, y4; - -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - FT_Int dp[8]; - - - if ( value_is_string ) - { - const char* s = (const char*)value; - char* ep; - int i; - - - /* eight comma-separated numbers */ - for ( i = 0; i < 7; i++ ) - { - dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); - if ( *ep != ',' || s == ep ) - return FT_THROW( Invalid_Argument ); - - s = ep + 1; - } - - dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); - if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) - return FT_THROW( Invalid_Argument ); - - darken_params = dp; - } - else -#endif - darken_params = (FT_Int*)value; - - x1 = darken_params[0]; - y1 = darken_params[1]; - x2 = darken_params[2]; - y2 = darken_params[3]; - x3 = darken_params[4]; - y3 = darken_params[5]; - x4 = darken_params[6]; - y4 = darken_params[7]; - - if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || - y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || - x1 > x2 || x2 > x3 || x3 > x4 || - y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) - return FT_THROW( Invalid_Argument ); - - module->darken_params[0] = x1; - module->darken_params[1] = y1; - module->darken_params[2] = x2; - module->darken_params[3] = y2; - module->darken_params[4] = x3; - module->darken_params[5] = y3; - module->darken_params[6] = x4; - module->darken_params[7] = y4; - - return error; - } - else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) - { -#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES - if ( value_is_string ) - { - const char* s = (const char*)value; - long nsd = ft_strtol( s, NULL, 10 ); - - - if ( !nsd ) - module->no_stem_darkening = FALSE; - else - module->no_stem_darkening = TRUE; - } - else -#endif - { - FT_Bool* no_stem_darkening = (FT_Bool*)value; - - - module->no_stem_darkening = *no_stem_darkening; - } - - return error; - } - - FT_TRACE0(( "af_property_set: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - static FT_Error - af_property_get( FT_Module ft_module, - const char* property_name, - void* value ) - { - FT_Error error = FT_Err_Ok; - AF_Module module = (AF_Module)ft_module; - FT_UInt fallback_style = module->fallback_style; - FT_UInt default_script = module->default_script; -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_Bool warping = module->warping; -#endif - - - if ( !ft_strcmp( property_name, "glyph-to-script-map" ) ) - { - FT_Prop_GlyphToScriptMap* prop = (FT_Prop_GlyphToScriptMap*)value; - AF_FaceGlobals globals; - - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - prop->map = globals->glyph_styles; - - return error; - } - else if ( !ft_strcmp( property_name, "fallback-script" ) ) - { - FT_UInt* val = (FT_UInt*)value; - - AF_StyleClass style_class = af_style_classes[fallback_style]; - - - *val = style_class->script; - - return error; - } - else if ( !ft_strcmp( property_name, "default-script" ) ) - { - FT_UInt* val = (FT_UInt*)value; - - - *val = default_script; - - return error; - } - else if ( !ft_strcmp( property_name, "increase-x-height" ) ) - { - FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; - AF_FaceGlobals globals; - - - error = af_property_get_face_globals( prop->face, &globals, module ); - if ( !error ) - prop->limit = globals->increase_x_height; - - return error; - } -#ifdef AF_CONFIG_OPTION_USE_WARPER - else if ( !ft_strcmp( property_name, "warping" ) ) - { - FT_Bool* val = (FT_Bool*)value; - - - *val = warping; - - return error; - } -#endif /* AF_CONFIG_OPTION_USE_WARPER */ - else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) - { - FT_Int* darken_params = module->darken_params; - FT_Int* val = (FT_Int*)value; - - - val[0] = darken_params[0]; - val[1] = darken_params[1]; - val[2] = darken_params[2]; - val[3] = darken_params[3]; - val[4] = darken_params[4]; - val[5] = darken_params[5]; - val[6] = darken_params[6]; - val[7] = darken_params[7]; - - return error; - } - else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) - { - FT_Bool no_stem_darkening = module->no_stem_darkening; - FT_Bool* val = (FT_Bool*)value; - - - *val = no_stem_darkening; - - return error; - } - - FT_TRACE0(( "af_property_get: missing property `%s'\n", - property_name )); - return FT_THROW( Missing_Property ); - } - - - FT_DEFINE_SERVICE_PROPERTIESREC( - af_service_properties, - - (FT_Properties_SetFunc)af_property_set, /* set_property */ - (FT_Properties_GetFunc)af_property_get ) /* get_property */ - - - FT_DEFINE_SERVICEDESCREC1( - af_services, - - FT_SERVICE_ID_PROPERTIES, &af_service_properties ) - - - FT_CALLBACK_DEF( FT_Module_Interface ) - af_get_interface( FT_Module module, - const char* module_interface ) - { - FT_UNUSED( module ); - - return ft_service_list_lookup( af_services, module_interface ); - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_init( FT_Module ft_module ) /* AF_Module */ - { - AF_Module module = (AF_Module)ft_module; - - - module->fallback_style = AF_STYLE_FALLBACK; - module->default_script = AF_SCRIPT_DEFAULT; -#ifdef AF_CONFIG_OPTION_USE_WARPER - module->warping = 0; -#endif - module->no_stem_darkening = TRUE; - - module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; - module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; - module->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; - module->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; - module->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; - module->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; - module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; - module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; - - return FT_Err_Ok; - } - - - FT_CALLBACK_DEF( void ) - af_autofitter_done( FT_Module ft_module ) /* AF_Module */ - { - FT_UNUSED( ft_module ); - -#ifdef FT_DEBUG_AUTOFIT - if ( _af_debug_hints_rec->memory ) - af_glyph_hints_done( _af_debug_hints_rec ); -#endif - } - - - FT_CALLBACK_DEF( FT_Error ) - af_autofitter_load_glyph( AF_Module module, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) - { - FT_Error error = FT_Err_Ok; - FT_Memory memory = module->root.library->memory; - -#ifdef FT_DEBUG_AUTOFIT - - /* in debug mode, we use a global object that survives this routine */ - - AF_GlyphHints hints = _af_debug_hints_rec; - AF_LoaderRec loader[1]; - - FT_UNUSED( size ); - - - if ( hints->memory ) - af_glyph_hints_done( hints ); - - af_glyph_hints_init( hints, memory ); - af_loader_init( loader, hints ); - - error = af_loader_load_glyph( loader, module, slot->face, - glyph_index, load_flags ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] ) - { -#endif - af_glyph_hints_dump_points( hints, 0 ); - af_glyph_hints_dump_segments( hints, 0 ); - af_glyph_hints_dump_edges( hints, 0 ); -#ifdef FT_DEBUG_LEVEL_TRACE - } -#endif - - af_loader_done( loader ); - - return error; - -#else /* !FT_DEBUG_AUTOFIT */ - - AF_GlyphHintsRec hints[1]; - AF_LoaderRec loader[1]; - - FT_UNUSED( size ); - - - af_glyph_hints_init( hints, memory ); - af_loader_init( loader, hints ); - - error = af_loader_load_glyph( loader, module, slot->face, - glyph_index, load_flags ); - - af_loader_done( loader ); - af_glyph_hints_done( hints ); - - return error; - -#endif /* !FT_DEBUG_AUTOFIT */ - } - - - FT_DEFINE_AUTOHINTER_INTERFACE( - af_autofitter_interface, - - NULL, /* reset_face */ - NULL, /* get_global_hints */ - NULL, /* done_global_hints */ - (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph ) /* load_glyph */ - - - FT_DEFINE_MODULE( - autofit_module_class, - - FT_MODULE_HINTER, - sizeof ( AF_ModuleRec ), - - "autofitter", - 0x10000L, /* version 1.0 of the autofitter */ - 0x20000L, /* requires FreeType 2.0 or above */ - - (const void*)&af_autofitter_interface, - - (FT_Module_Constructor)af_autofitter_init, /* module_init */ - (FT_Module_Destructor) af_autofitter_done, /* module_done */ - (FT_Module_Requester) af_get_interface /* get_interface */ - ) - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afmodule.h b/ThirdParty/freetype/src/autofit/afmodule.h deleted file mode 100644 index b410809..0000000 --- a/ThirdParty/freetype/src/autofit/afmodule.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * - * afmodule.h - * - * Auto-fitter module implementation (specification). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef AFMODULE_H_ -#define AFMODULE_H_ - -#include <ft2build.h> -#include FT_INTERNAL_OBJECTS_H -#include FT_MODULE_H - - -FT_BEGIN_HEADER - - - /* - * This is the `extended' FT_Module structure that holds the - * autofitter's global data. - */ - - typedef struct AF_ModuleRec_ - { - FT_ModuleRec root; - - FT_UInt fallback_style; - FT_UInt default_script; -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_Bool warping; -#endif - FT_Bool no_stem_darkening; - FT_Int darken_params[8]; - - } AF_ModuleRec, *AF_Module; - - -FT_DECLARE_MODULE( autofit_module_class ) - - -FT_END_HEADER - -#endif /* AFMODULE_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afranges.c b/ThirdParty/freetype/src/autofit/afranges.c deleted file mode 100644 index c0dba81..0000000 --- a/ThirdParty/freetype/src/autofit/afranges.c +++ /dev/null @@ -1,1033 +0,0 @@ -/**************************************************************************** - * - * afranges.c - * - * Auto-fitter Unicode script ranges (body). - * - * Copyright (C) 2013-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. - * - */ - - -#include "afranges.h" - - /* - * The algorithm for assigning properties and styles to the `glyph_styles' - * array is as follows (cf. the implementation in - * `af_face_globals_compute_style_coverage'). - * - * Walk over all scripts (as listed in `afscript.h'). - * - * For a given script, walk over all styles (as listed in `afstyles.h'). - * The order of styles is important and should be as follows. - * - * - First come styles based on OpenType features (small caps, for - * example). Since features rely on glyph indices, thus completely - * bypassing character codes, no properties are assigned. - * - * - Next comes the default style, using the character ranges as defined - * below. This also assigns properties. - * - * Note that there also exist fallback scripts, mainly covering - * superscript and subscript glyphs of a script that are not present as - * OpenType features. Fallback scripts are defined below, also - * assigning properties; they are applied after the corresponding - * script. - * - */ - - - /* XXX Check base character ranges again: */ - /* Right now, they are quickly derived by visual inspection. */ - /* I can imagine that fine-tuning is necessary. */ - - /* for the auto-hinter, a `non-base character' is something that should */ - /* not be affected by blue zones, regardless of whether this is a */ - /* spacing or no-spacing glyph */ - - /* the `af_xxxx_nonbase_uniranges' ranges must be strict subsets */ - /* of the corresponding `af_xxxx_uniranges' ranges */ - - - const AF_Script_UniRangeRec af_adlm_uniranges[] = - { - AF_UNIRANGE_REC( 0x1E900, 0x1E95F ), /* Adlam */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_adlm_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1D944, 0x1E94A ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_arab_uniranges[] = - { - AF_UNIRANGE_REC( 0x0600, 0x06FF ), /* Arabic */ - AF_UNIRANGE_REC( 0x0750, 0x07FF ), /* Arabic Supplement */ - AF_UNIRANGE_REC( 0x08A0, 0x08FF ), /* Arabic Extended-A */ - AF_UNIRANGE_REC( 0xFB50, 0xFDFF ), /* Arabic Presentation Forms-A */ - AF_UNIRANGE_REC( 0xFE70, 0xFEFF ), /* Arabic Presentation Forms-B */ - AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ), /* Arabic Mathematical Alphabetic Symbols */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_arab_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0600, 0x0605 ), - AF_UNIRANGE_REC( 0x0610, 0x061A ), - AF_UNIRANGE_REC( 0x064B, 0x065F ), - AF_UNIRANGE_REC( 0x0670, 0x0670 ), - AF_UNIRANGE_REC( 0x06D6, 0x06DC ), - AF_UNIRANGE_REC( 0x06DF, 0x06E4 ), - AF_UNIRANGE_REC( 0x06E7, 0x06E8 ), - AF_UNIRANGE_REC( 0x06EA, 0x06ED ), - AF_UNIRANGE_REC( 0x08D4, 0x08E1 ), - AF_UNIRANGE_REC( 0x08D3, 0x08FF ), - AF_UNIRANGE_REC( 0xFBB2, 0xFBC1 ), - AF_UNIRANGE_REC( 0xFE70, 0xFE70 ), - AF_UNIRANGE_REC( 0xFE72, 0xFE72 ), - AF_UNIRANGE_REC( 0xFE74, 0xFE74 ), - AF_UNIRANGE_REC( 0xFE76, 0xFE76 ), - AF_UNIRANGE_REC( 0xFE78, 0xFE78 ), - AF_UNIRANGE_REC( 0xFE7A, 0xFE7A ), - AF_UNIRANGE_REC( 0xFE7C, 0xFE7C ), - AF_UNIRANGE_REC( 0xFE7E, 0xFE7E ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_armn_uniranges[] = - { - AF_UNIRANGE_REC( 0x0530, 0x058F ), /* Armenian */ - AF_UNIRANGE_REC( 0xFB13, 0xFB17 ), /* Alphab. Present. Forms (Armenian) */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_armn_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0559, 0x055F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_avst_uniranges[] = - { - AF_UNIRANGE_REC( 0x10B00, 0x10B3F ), /* Avestan */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_avst_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x10B39, 0x10B3F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_bamu_uniranges[] = - { - AF_UNIRANGE_REC( 0xA6A0, 0xA6FF ), /* Bamum */ -#if 0 - /* The characters in the Bamum supplement are pictograms, */ - /* not (directly) related to the syllabic Bamum script */ - AF_UNIRANGE_REC( 0x16800, 0x16A3F ), /* Bamum Supplement */ -#endif - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_bamu_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0xA6F0, 0xA6F1 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_beng_uniranges[] = - { - AF_UNIRANGE_REC( 0x0980, 0x09FF ), /* Bengali */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_beng_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0981, 0x0981 ), - AF_UNIRANGE_REC( 0x09BC, 0x09BC ), - AF_UNIRANGE_REC( 0x09C1, 0x09C4 ), - AF_UNIRANGE_REC( 0x09CD, 0x09CD ), - AF_UNIRANGE_REC( 0x09E2, 0x09E3 ), - AF_UNIRANGE_REC( 0x09FE, 0x09FE ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_buhd_uniranges[] = - { - AF_UNIRANGE_REC( 0x1740, 0x175F ), /* Buhid */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_buhd_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1752, 0x1753 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cakm_uniranges[] = - { - AF_UNIRANGE_REC( 0x11100, 0x1114F ), /* Chakma */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cakm_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x11100, 0x11102 ), - AF_UNIRANGE_REC( 0x11127, 0x11134 ), - AF_UNIRANGE_REC( 0x11146, 0x11146 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cans_uniranges[] = - { - AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */ - AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cans_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cari_uniranges[] = - { - AF_UNIRANGE_REC( 0x102A0, 0x102DF ), /* Carian */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cari_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cher_uniranges[] = - { - AF_UNIRANGE_REC( 0x13A0, 0x13FF ), /* Cherokee */ - AF_UNIRANGE_REC( 0xAB70, 0xABBF ), /* Cherokee Supplement */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cher_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_copt_uniranges[] = - { - AF_UNIRANGE_REC( 0x2C80, 0x2CFF ), /* Coptic */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_copt_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x2CEF, 0x2CF1 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cprt_uniranges[] = - { - AF_UNIRANGE_REC( 0x10800, 0x1083F ), /* Cypriot */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cprt_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_cyrl_uniranges[] = - { - AF_UNIRANGE_REC( 0x0400, 0x04FF ), /* Cyrillic */ - AF_UNIRANGE_REC( 0x0500, 0x052F ), /* Cyrillic Supplement */ - AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), /* Cyrillic Extended-A */ - AF_UNIRANGE_REC( 0xA640, 0xA69F ), /* Cyrillic Extended-B */ - AF_UNIRANGE_REC( 0x1C80, 0x1C8F ), /* Cyrillic Extended-C */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_cyrl_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0483, 0x0489 ), - AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), - AF_UNIRANGE_REC( 0xA66F, 0xA67F ), - AF_UNIRANGE_REC( 0xA69E, 0xA69F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - /* There are some characters in the Devanagari Unicode block that are */ - /* generic to Indic scripts; we omit them so that their presence doesn't */ - /* trigger Devanagari. */ - - const AF_Script_UniRangeRec af_deva_uniranges[] = - { - AF_UNIRANGE_REC( 0x0900, 0x093B ), /* Devanagari */ - /* omitting U+093C nukta */ - AF_UNIRANGE_REC( 0x093D, 0x0950 ), /* ... continued */ - /* omitting U+0951 udatta, U+0952 anudatta */ - AF_UNIRANGE_REC( 0x0953, 0x0963 ), /* ... continued */ - /* omitting U+0964 danda, U+0965 double danda */ - AF_UNIRANGE_REC( 0x0966, 0x097F ), /* ... continued */ - AF_UNIRANGE_REC( 0x20B9, 0x20B9 ), /* (new) Rupee sign */ - AF_UNIRANGE_REC( 0xA8E0, 0xA8FF ), /* Devanagari Extended */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_deva_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0900, 0x0902 ), - AF_UNIRANGE_REC( 0x093A, 0x093A ), - AF_UNIRANGE_REC( 0x0941, 0x0948 ), - AF_UNIRANGE_REC( 0x094D, 0x094D ), - AF_UNIRANGE_REC( 0x0953, 0x0957 ), - AF_UNIRANGE_REC( 0x0962, 0x0963 ), - AF_UNIRANGE_REC( 0xA8E0, 0xA8F1 ), - AF_UNIRANGE_REC( 0xA8FF, 0xA8FF ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_dsrt_uniranges[] = - { - AF_UNIRANGE_REC( 0x10400, 0x1044F ), /* Deseret */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_dsrt_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_ethi_uniranges[] = - { - AF_UNIRANGE_REC( 0x1200, 0x137F ), /* Ethiopic */ - AF_UNIRANGE_REC( 0x1380, 0x139F ), /* Ethiopic Supplement */ - AF_UNIRANGE_REC( 0x2D80, 0x2DDF ), /* Ethiopic Extended */ - AF_UNIRANGE_REC( 0xAB00, 0xAB2F ), /* Ethiopic Extended-A */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_ethi_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x135D, 0x135F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_geor_uniranges[] = - { - AF_UNIRANGE_REC( 0x10D0, 0x10FF ), /* Georgian (Mkhedruli) */ - AF_UNIRANGE_REC( 0x1C90, 0x1CBF ), /* Georgian Extended (Mtavruli) */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_geor_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_geok_uniranges[] = - { - /* Khutsuri */ - AF_UNIRANGE_REC( 0x10A0, 0x10CD ), /* Georgian (Asomtavruli) */ - AF_UNIRANGE_REC( 0x2D00, 0x2D2D ), /* Georgian Supplement (Nuskhuri) */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_geok_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_glag_uniranges[] = - { - AF_UNIRANGE_REC( 0x2C00, 0x2C5F ), /* Glagolitic */ - AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), /* Glagolitic Supplement */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_glag_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_goth_uniranges[] = - { - AF_UNIRANGE_REC( 0x10330, 0x1034F ), /* Gothic */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_goth_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_grek_uniranges[] = - { - AF_UNIRANGE_REC( 0x0370, 0x03FF ), /* Greek and Coptic */ - AF_UNIRANGE_REC( 0x1F00, 0x1FFF ), /* Greek Extended */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_grek_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x037A, 0x037A ), - AF_UNIRANGE_REC( 0x0384, 0x0385 ), - AF_UNIRANGE_REC( 0x1FBD, 0x1FC1 ), - AF_UNIRANGE_REC( 0x1FCD, 0x1FCF ), - AF_UNIRANGE_REC( 0x1FDD, 0x1FDF ), - AF_UNIRANGE_REC( 0x1FED, 0x1FEF ), - AF_UNIRANGE_REC( 0x1FFD, 0x1FFE ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_gujr_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A80, 0x0AFF ), /* Gujarati */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_gujr_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A81, 0x0A82 ), - AF_UNIRANGE_REC( 0x0ABC, 0x0ABC ), - AF_UNIRANGE_REC( 0x0AC1, 0x0AC8 ), - AF_UNIRANGE_REC( 0x0ACD, 0x0ACD ), - AF_UNIRANGE_REC( 0x0AE2, 0x0AE3 ), - AF_UNIRANGE_REC( 0x0AFA, 0x0AFF ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_guru_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A00, 0x0A7F ), /* Gurmukhi */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_guru_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0A01, 0x0A02 ), - AF_UNIRANGE_REC( 0x0A3C, 0x0A3C ), - AF_UNIRANGE_REC( 0x0A41, 0x0A51 ), - AF_UNIRANGE_REC( 0x0A70, 0x0A71 ), - AF_UNIRANGE_REC( 0x0A75, 0x0A75 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_hebr_uniranges[] = - { - AF_UNIRANGE_REC( 0x0590, 0x05FF ), /* Hebrew */ - AF_UNIRANGE_REC( 0xFB1D, 0xFB4F ), /* Alphab. Present. Forms (Hebrew) */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_hebr_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0591, 0x05BF ), - AF_UNIRANGE_REC( 0x05C1, 0x05C2 ), - AF_UNIRANGE_REC( 0x05C4, 0x05C5 ), - AF_UNIRANGE_REC( 0x05C7, 0x05C7 ), - AF_UNIRANGE_REC( 0xFB1E, 0xFB1E ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_kali_uniranges[] = - { - AF_UNIRANGE_REC( 0xA900, 0xA92F ), /* Kayah Li */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_kali_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0xA926, 0xA92D ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_knda_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C80, 0x0CFF ), /* Kannada */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_knda_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C81, 0x0C81 ), - AF_UNIRANGE_REC( 0x0CBC, 0x0CBC ), - AF_UNIRANGE_REC( 0x0CBF, 0x0CBF ), - AF_UNIRANGE_REC( 0x0CC6, 0x0CC6 ), - AF_UNIRANGE_REC( 0x0CCC, 0x0CCD ), - AF_UNIRANGE_REC( 0x0CE2, 0x0CE3 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_khmr_uniranges[] = - { - AF_UNIRANGE_REC( 0x1780, 0x17FF ), /* Khmer */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_khmr_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x17B7, 0x17BD ), - AF_UNIRANGE_REC( 0x17C6, 0x17C6 ), - AF_UNIRANGE_REC( 0x17C9, 0x17D3 ), - AF_UNIRANGE_REC( 0x17DD, 0x17DD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_khms_uniranges[] = - { - AF_UNIRANGE_REC( 0x19E0, 0x19FF ), /* Khmer Symbols */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_khms_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_lao_uniranges[] = - { - AF_UNIRANGE_REC( 0x0E80, 0x0EFF ), /* Lao */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_lao_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0EB1, 0x0EB1 ), - AF_UNIRANGE_REC( 0x0EB4, 0x0EBC ), - AF_UNIRANGE_REC( 0x0EC8, 0x0ECD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_latn_uniranges[] = - { - AF_UNIRANGE_REC( 0x0020, 0x007F ), /* Basic Latin (no control chars) */ - AF_UNIRANGE_REC( 0x00A0, 0x00A9 ), /* Latin-1 Supplement (no control chars) */ - AF_UNIRANGE_REC( 0x00AB, 0x00B1 ), /* ... continued */ - AF_UNIRANGE_REC( 0x00B4, 0x00B8 ), /* ... continued */ - AF_UNIRANGE_REC( 0x00BB, 0x00FF ), /* ... continued */ - AF_UNIRANGE_REC( 0x0100, 0x017F ), /* Latin Extended-A */ - AF_UNIRANGE_REC( 0x0180, 0x024F ), /* Latin Extended-B */ - AF_UNIRANGE_REC( 0x0250, 0x02AF ), /* IPA Extensions */ - AF_UNIRANGE_REC( 0x02B9, 0x02DF ), /* Spacing Modifier Letters */ - AF_UNIRANGE_REC( 0x02E5, 0x02FF ), /* ... continued */ - AF_UNIRANGE_REC( 0x0300, 0x036F ), /* Combining Diacritical Marks */ - AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), /* Combining Diacritical Marks Extended */ - AF_UNIRANGE_REC( 0x1D00, 0x1D2B ), /* Phonetic Extensions */ - AF_UNIRANGE_REC( 0x1D6B, 0x1D77 ), /* ... continued */ - AF_UNIRANGE_REC( 0x1D79, 0x1D7F ), /* ... continued */ - AF_UNIRANGE_REC( 0x1D80, 0x1D9A ), /* Phonetic Extensions Supplement */ - AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), /* Combining Diacritical Marks Supplement */ - AF_UNIRANGE_REC( 0x1E00, 0x1EFF ), /* Latin Extended Additional */ - AF_UNIRANGE_REC( 0x2000, 0x206F ), /* General Punctuation */ - AF_UNIRANGE_REC( 0x20A0, 0x20B8 ), /* Currency Symbols ... */ - AF_UNIRANGE_REC( 0x20BA, 0x20CF ), /* ... except new Rupee sign */ - AF_UNIRANGE_REC( 0x2150, 0x218F ), /* Number Forms */ - AF_UNIRANGE_REC( 0x2C60, 0x2C7B ), /* Latin Extended-C */ - AF_UNIRANGE_REC( 0x2C7E, 0x2C7F ), /* ... continued */ - AF_UNIRANGE_REC( 0x2E00, 0x2E7F ), /* Supplemental Punctuation */ - AF_UNIRANGE_REC( 0xA720, 0xA76F ), /* Latin Extended-D */ - AF_UNIRANGE_REC( 0xA771, 0xA7F7 ), /* ... continued */ - AF_UNIRANGE_REC( 0xA7FA, 0xA7FF ), /* ... continued */ - AF_UNIRANGE_REC( 0xAB30, 0xAB5B ), /* Latin Extended-E */ - AF_UNIRANGE_REC( 0xAB60, 0xAB6F ), /* ... continued */ - AF_UNIRANGE_REC( 0xFB00, 0xFB06 ), /* Alphab. Present. Forms (Latin Ligs) */ - AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ), /* Mathematical Alphanumeric Symbols */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_latn_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x005E, 0x0060 ), - AF_UNIRANGE_REC( 0x007E, 0x007E ), - AF_UNIRANGE_REC( 0x00A8, 0x00A9 ), - AF_UNIRANGE_REC( 0x00AE, 0x00B0 ), - AF_UNIRANGE_REC( 0x00B4, 0x00B4 ), - AF_UNIRANGE_REC( 0x00B8, 0x00B8 ), - AF_UNIRANGE_REC( 0x00BC, 0x00BE ), - AF_UNIRANGE_REC( 0x02B9, 0x02DF ), - AF_UNIRANGE_REC( 0x02E5, 0x02FF ), - AF_UNIRANGE_REC( 0x0300, 0x036F ), - AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), - AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), - AF_UNIRANGE_REC( 0x2017, 0x2017 ), - AF_UNIRANGE_REC( 0x203E, 0x203E ), - AF_UNIRANGE_REC( 0xA788, 0xA788 ), - AF_UNIRANGE_REC( 0xA7F8, 0xA7FA ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_latb_uniranges[] = - { - AF_UNIRANGE_REC( 0x1D62, 0x1D6A ), /* some small subscript letters */ - AF_UNIRANGE_REC( 0x2080, 0x209C ), /* subscript digits and letters */ - AF_UNIRANGE_REC( 0x2C7C, 0x2C7C ), /* latin subscript small letter j */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_latb_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_latp_uniranges[] = - { - AF_UNIRANGE_REC( 0x00AA, 0x00AA ), /* feminine ordinal indicator */ - AF_UNIRANGE_REC( 0x00B2, 0x00B3 ), /* superscript two and three */ - AF_UNIRANGE_REC( 0x00B9, 0x00BA ), /* superscript one, masc. ord. indic. */ - AF_UNIRANGE_REC( 0x02B0, 0x02B8 ), /* some latin superscript mod. letters */ - AF_UNIRANGE_REC( 0x02E0, 0x02E4 ), /* some IPA modifier letters */ - AF_UNIRANGE_REC( 0x1D2C, 0x1D61 ), /* latin superscript modifier letters */ - AF_UNIRANGE_REC( 0x1D78, 0x1D78 ), /* modifier letter cyrillic en */ - AF_UNIRANGE_REC( 0x1D9B, 0x1DBF ), /* more modifier letters */ - AF_UNIRANGE_REC( 0x2070, 0x207F ), /* superscript digits and letters */ - AF_UNIRANGE_REC( 0x2C7D, 0x2C7D ), /* modifier letter capital v */ - AF_UNIRANGE_REC( 0xA770, 0xA770 ), /* modifier letter us */ - AF_UNIRANGE_REC( 0xA7F8, 0xA7F9 ), /* more modifier letters */ - AF_UNIRANGE_REC( 0xAB5C, 0xAB5F ), /* more modifier letters */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_latp_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_lisu_uniranges[] = - { - AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_lisu_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_mlym_uniranges[] = - { - AF_UNIRANGE_REC( 0x0D00, 0x0D7F ), /* Malayalam */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_mlym_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0D00, 0x0D01 ), - AF_UNIRANGE_REC( 0x0D3B, 0x0D3C ), - AF_UNIRANGE_REC( 0x0D4D, 0x0D4E ), - AF_UNIRANGE_REC( 0x0D62, 0x0D63 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_mymr_uniranges[] = - { - AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ - AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */ - AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_mymr_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x102D, 0x1030 ), - AF_UNIRANGE_REC( 0x1032, 0x1037 ), - AF_UNIRANGE_REC( 0x103A, 0x103A ), - AF_UNIRANGE_REC( 0x103D, 0x103E ), - AF_UNIRANGE_REC( 0x1058, 0x1059 ), - AF_UNIRANGE_REC( 0x105E, 0x1060 ), - AF_UNIRANGE_REC( 0x1071, 0x1074 ), - AF_UNIRANGE_REC( 0x1082, 0x1082 ), - AF_UNIRANGE_REC( 0x1085, 0x1086 ), - AF_UNIRANGE_REC( 0x108D, 0x108D ), - AF_UNIRANGE_REC( 0xA9E5, 0xA9E5 ), - AF_UNIRANGE_REC( 0xAA7C, 0xAA7C ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_nkoo_uniranges[] = - { - AF_UNIRANGE_REC( 0x07C0, 0x07FF ), /* N'Ko */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_nkoo_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x07EB, 0x07F5 ), - AF_UNIRANGE_REC( 0x07FD, 0x07FD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_none_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_none_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_olck_uniranges[] = - { - AF_UNIRANGE_REC( 0x1C50, 0x1C7F ), /* Ol Chiki */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_olck_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_orkh_uniranges[] = - { - AF_UNIRANGE_REC( 0x10C00, 0x10C4F ), /* Old Turkic */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_orkh_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_osge_uniranges[] = - { - AF_UNIRANGE_REC( 0x104B0, 0x104FF ), /* Osage */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_osge_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_osma_uniranges[] = - { - AF_UNIRANGE_REC( 0x10480, 0x104AF ), /* Osmanya */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_osma_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_saur_uniranges[] = - { - AF_UNIRANGE_REC( 0xA880, 0xA8DF ), /* Saurashtra */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_saur_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0xA880, 0xA881 ), - AF_UNIRANGE_REC( 0xA8B4, 0xA8C5 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_shaw_uniranges[] = - { - AF_UNIRANGE_REC( 0x10450, 0x1047F ), /* Shavian */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_shaw_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_sinh_uniranges[] = - { - AF_UNIRANGE_REC( 0x0D80, 0x0DFF ), /* Sinhala */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_sinh_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0DCA, 0x0DCA ), - AF_UNIRANGE_REC( 0x0DD2, 0x0DD6 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_sund_uniranges[] = - { - AF_UNIRANGE_REC( 0x1B80, 0x1BBF ), /* Sundanese */ - AF_UNIRANGE_REC( 0x1CC0, 0x1CCF ), /* Sundanese Supplement */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_sund_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1B80, 0x1B82 ), - AF_UNIRANGE_REC( 0x1BA1, 0x1BAD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_taml_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_taml_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B82, 0x0B82 ), - AF_UNIRANGE_REC( 0x0BC0, 0x0BC2 ), - AF_UNIRANGE_REC( 0x0BCD, 0x0BCD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_tavt_uniranges[] = - { - AF_UNIRANGE_REC( 0xAA80, 0xAADF ), /* Tai Viet */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_tavt_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0xAAB0, 0xAAB0 ), - AF_UNIRANGE_REC( 0xAAB2, 0xAAB4 ), - AF_UNIRANGE_REC( 0xAAB7, 0xAAB8 ), - AF_UNIRANGE_REC( 0xAABE, 0xAABF ), - AF_UNIRANGE_REC( 0xAAC1, 0xAAC1 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_telu_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C00, 0x0C7F ), /* Telugu */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_telu_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0C00, 0x0C00 ), - AF_UNIRANGE_REC( 0x0C04, 0x0C04 ), - AF_UNIRANGE_REC( 0x0C3E, 0x0C40 ), - AF_UNIRANGE_REC( 0x0C46, 0x0C56 ), - AF_UNIRANGE_REC( 0x0C62, 0x0C63 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_thai_uniranges[] = - { - AF_UNIRANGE_REC( 0x0E00, 0x0E7F ), /* Thai */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_thai_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0E31, 0x0E31 ), - AF_UNIRANGE_REC( 0x0E34, 0x0E3A ), - AF_UNIRANGE_REC( 0x0E47, 0x0E4E ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_tfng_uniranges[] = - { - AF_UNIRANGE_REC( 0x2D30, 0x2D7F ), /* Tifinagh */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_tfng_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_vaii_uniranges[] = - { - AF_UNIRANGE_REC( 0xA500, 0xA63F ), /* Vai */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_vaii_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0, 0 ) - }; - - -#ifdef AF_CONFIG_OPTION_INDIC - - const AF_Script_UniRangeRec af_limb_uniranges[] = - { - AF_UNIRANGE_REC( 0x1900, 0x194F ), /* Limbu */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_limb_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1920, 0x1922 ), - AF_UNIRANGE_REC( 0x1927, 0x1934 ), - AF_UNIRANGE_REC( 0x1937, 0x193B ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_orya_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B00, 0x0B7F ), /* Oriya */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_orya_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0B01, 0x0B02 ), - AF_UNIRANGE_REC( 0x0B3C, 0x0B3C ), - AF_UNIRANGE_REC( 0x0B3F, 0x0B3F ), - AF_UNIRANGE_REC( 0x0B41, 0x0B44 ), - AF_UNIRANGE_REC( 0x0B4D, 0x0B56 ), - AF_UNIRANGE_REC( 0x0B62, 0x0B63 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_sylo_uniranges[] = - { - AF_UNIRANGE_REC( 0xA800, 0xA82F ), /* Syloti Nagri */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_sylo_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0xA802, 0xA802 ), - AF_UNIRANGE_REC( 0xA806, 0xA806 ), - AF_UNIRANGE_REC( 0xA80B, 0xA80B ), - AF_UNIRANGE_REC( 0xA825, 0xA826 ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - - const AF_Script_UniRangeRec af_tibt_uniranges[] = - { - AF_UNIRANGE_REC( 0x0F00, 0x0FFF ), /* Tibetan */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_tibt_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x0F18, 0x0F19 ), - AF_UNIRANGE_REC( 0x0F35, 0x0F35 ), - AF_UNIRANGE_REC( 0x0F37, 0x0F37 ), - AF_UNIRANGE_REC( 0x0F39, 0x0F39 ), - AF_UNIRANGE_REC( 0x0F3E, 0x0F3F ), - AF_UNIRANGE_REC( 0x0F71, 0x0F7E ), - AF_UNIRANGE_REC( 0x0F80, 0x0F84 ), - AF_UNIRANGE_REC( 0x0F86, 0x0F87 ), - AF_UNIRANGE_REC( 0x0F8D, 0x0FBC ), - AF_UNIRANGE_REC( 0, 0 ) - }; - -#endif /* !AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - /* this corresponds to Unicode 6.0 */ - - const AF_Script_UniRangeRec af_hani_uniranges[] = - { - AF_UNIRANGE_REC( 0x1100, 0x11FF ), /* Hangul Jamo */ - AF_UNIRANGE_REC( 0x2E80, 0x2EFF ), /* CJK Radicals Supplement */ - AF_UNIRANGE_REC( 0x2F00, 0x2FDF ), /* Kangxi Radicals */ - AF_UNIRANGE_REC( 0x2FF0, 0x2FFF ), /* Ideographic Description Characters */ - AF_UNIRANGE_REC( 0x3000, 0x303F ), /* CJK Symbols and Punctuation */ - AF_UNIRANGE_REC( 0x3040, 0x309F ), /* Hiragana */ - AF_UNIRANGE_REC( 0x30A0, 0x30FF ), /* Katakana */ - AF_UNIRANGE_REC( 0x3100, 0x312F ), /* Bopomofo */ - AF_UNIRANGE_REC( 0x3130, 0x318F ), /* Hangul Compatibility Jamo */ - AF_UNIRANGE_REC( 0x3190, 0x319F ), /* Kanbun */ - AF_UNIRANGE_REC( 0x31A0, 0x31BF ), /* Bopomofo Extended */ - AF_UNIRANGE_REC( 0x31C0, 0x31EF ), /* CJK Strokes */ - AF_UNIRANGE_REC( 0x31F0, 0x31FF ), /* Katakana Phonetic Extensions */ - AF_UNIRANGE_REC( 0x3300, 0x33FF ), /* CJK Compatibility */ - AF_UNIRANGE_REC( 0x3400, 0x4DBF ), /* CJK Unified Ideographs Extension A */ - AF_UNIRANGE_REC( 0x4DC0, 0x4DFF ), /* Yijing Hexagram Symbols */ - AF_UNIRANGE_REC( 0x4E00, 0x9FFF ), /* CJK Unified Ideographs */ - AF_UNIRANGE_REC( 0xA960, 0xA97F ), /* Hangul Jamo Extended-A */ - AF_UNIRANGE_REC( 0xAC00, 0xD7AF ), /* Hangul Syllables */ - AF_UNIRANGE_REC( 0xD7B0, 0xD7FF ), /* Hangul Jamo Extended-B */ - AF_UNIRANGE_REC( 0xF900, 0xFAFF ), /* CJK Compatibility Ideographs */ - AF_UNIRANGE_REC( 0xFE10, 0xFE1F ), /* Vertical forms */ - AF_UNIRANGE_REC( 0xFE30, 0xFE4F ), /* CJK Compatibility Forms */ - AF_UNIRANGE_REC( 0xFF00, 0xFFEF ), /* Halfwidth and Fullwidth Forms */ - AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ), /* Kana Supplement */ - AF_UNIRANGE_REC( 0x1B100, 0x1B12F ), /* Kana Extended-A */ - AF_UNIRANGE_REC( 0x1D300, 0x1D35F ), /* Tai Xuan Hing Symbols */ - AF_UNIRANGE_REC( 0x20000, 0x2A6DF ), /* CJK Unified Ideographs Extension B */ - AF_UNIRANGE_REC( 0x2A700, 0x2B73F ), /* CJK Unified Ideographs Extension C */ - AF_UNIRANGE_REC( 0x2B740, 0x2B81F ), /* CJK Unified Ideographs Extension D */ - AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ), /* CJK Unified Ideographs Extension E */ - AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ), /* CJK Unified Ideographs Extension F */ - AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ), /* CJK Compatibility Ideographs Supplement */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_hani_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x302A, 0x302F ), - AF_UNIRANGE_REC( 0x3190, 0x319F ), - AF_UNIRANGE_REC( 0, 0 ) - }; - -#endif /* !AF_CONFIG_OPTION_CJK */ - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afranges.h b/ThirdParty/freetype/src/autofit/afranges.h deleted file mode 100644 index d5917ae..0000000 --- a/ThirdParty/freetype/src/autofit/afranges.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** - * - * afranges.h - * - * Auto-fitter Unicode script ranges (specification). - * - * Copyright (C) 2013-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 AFRANGES_H_ -#define AFRANGES_H_ - - -#include "aftypes.h" - - -FT_BEGIN_HEADER - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - extern const AF_Script_UniRangeRec af_ ## s ## _uniranges[]; - -#include "afscript.h" - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - extern const AF_Script_UniRangeRec af_ ## s ## _nonbase_uniranges[]; - -#include "afscript.h" - - /* */ - -FT_END_HEADER - -#endif /* AFRANGES_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afscript.h b/ThirdParty/freetype/src/autofit/afscript.h deleted file mode 100644 index c2f0c7a..0000000 --- a/ThirdParty/freetype/src/autofit/afscript.h +++ /dev/null @@ -1,390 +0,0 @@ -/**************************************************************************** - * - * afscript.h - * - * Auto-fitter scripts (specification only). - * - * Copyright (C) 2013-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - - /* The following part can be included multiple times. */ - /* Define `SCRIPT' as needed. */ - - - /* Add new scripts here. The first and second arguments are the */ - /* script name in lowercase and uppercase, respectively, followed */ - /* by a description string. Then comes the corresponding HarfBuzz */ - /* script name tag, followed by a string of standard characters (to */ - /* derive the standard width and height of stems). */ - /* */ - /* Note that fallback scripts only have a default style, thus we */ - /* use `HB_SCRIPT_INVALID' as the HarfBuzz script name tag for */ - /* them. */ - - SCRIPT( adlm, ADLM, - "Adlam", - HB_SCRIPT_ADLAM, - HINTING_BOTTOM_TO_TOP, - "\xF0\x9E\xA4\x8C \xF0\x9E\xA4\xAE" ) /* 𞤌 𞤮 */ - - SCRIPT( arab, ARAB, - "Arabic", - HB_SCRIPT_ARABIC, - HINTING_BOTTOM_TO_TOP, - "\xD9\x84 \xD8\xAD \xD9\x80" ) /* ل ح ـ */ - - SCRIPT( armn, ARMN, - "Armenian", - HB_SCRIPT_ARMENIAN, - HINTING_BOTTOM_TO_TOP, - "\xD5\xBD \xD5\x8D" ) /* ս Ս */ - - SCRIPT( avst, AVST, - "Avestan", - HB_SCRIPT_AVESTAN, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\xAC\x9A" ) /* 𐬚 */ - - SCRIPT( bamu, BAMU, - "Bamum", - HB_SCRIPT_BAMUM, - HINTING_BOTTOM_TO_TOP, - "\xEA\x9B\x81 \xEA\x9B\xAF" ) /* ꛁ ꛯ */ - - /* there are no simple forms for letters; we thus use two digit shapes */ - SCRIPT( beng, BENG, - "Bengali", - HB_SCRIPT_BENGALI, - HINTING_TOP_TO_BOTTOM, - "\xE0\xA7\xA6 \xE0\xA7\xAA" ) /* ০ ৪ */ - - SCRIPT( buhd, BUHD, - "Buhid", - HB_SCRIPT_BUHID, - HINTING_BOTTOM_TO_TOP, - "\xE1\x9D\x8B \xE1\x9D\x8F" ) /* ᝋ ᝏ */ - - SCRIPT( cakm, CAKM, - "Chakma", - HB_SCRIPT_CHAKMA, - HINTING_BOTTOM_TO_TOP, - "\xF0\x91\x84\xA4 \xF0\x91\x84\x89 \xF0\x91\x84\x9B" ) /* 𑄤 𑄉 𑄛 */ - - SCRIPT( cans, CANS, - "Canadian Syllabics", - HB_SCRIPT_CANADIAN_SYLLABICS, - HINTING_BOTTOM_TO_TOP, - "\xE1\x91\x8C \xE1\x93\x9A" ) /* ᑌ ᓚ */ - - SCRIPT( cari, CARI, - "Carian", - HB_SCRIPT_CARIAN, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\x8A\xAB \xF0\x90\x8B\x89" ) /* 𐊫 𐋉 */ - - SCRIPT( cher, CHER, - "Cherokee", - HB_SCRIPT_CHEROKEE, - HINTING_BOTTOM_TO_TOP, - "\xE1\x8E\xA4 \xE1\x8F\x85 \xEA\xAE\x95" ) /* Ꭴ Ꮕ ꮕ */ - - SCRIPT( copt, COPT, - "Coptic", - HB_SCRIPT_COPTIC, - HINTING_BOTTOM_TO_TOP, - "\xE2\xB2\x9E \xE2\xB2\x9F" ) /* Ⲟ ⲟ */ - - SCRIPT( cprt, CPRT, - "Cypriot", - HB_SCRIPT_CYPRIOT, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\xA0\x85 \xF0\x90\xA0\xA3" ) /* 𐠅 𐠣 */ - - SCRIPT( cyrl, CYRL, - "Cyrillic", - HB_SCRIPT_CYRILLIC, - HINTING_BOTTOM_TO_TOP, - "\xD0\xBE \xD0\x9E" ) /* о О */ - - SCRIPT( deva, DEVA, - "Devanagari", - HB_SCRIPT_DEVANAGARI, - HINTING_TOP_TO_BOTTOM, - "\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठ व ट */ - - SCRIPT( dsrt, DSRT, - "Deseret", - HB_SCRIPT_DESERET, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\x90\x84 \xF0\x90\x90\xAC" ) /* 𐐄 𐐬 */ - - SCRIPT( ethi, ETHI, - "Ethiopic", - HB_SCRIPT_ETHIOPIC, - HINTING_BOTTOM_TO_TOP, - "\xE1\x8B\x90" ) /* ዐ */ - - SCRIPT( geor, GEOR, - "Georgian (Mkhedruli)", - HB_SCRIPT_GEORGIAN, - HINTING_BOTTOM_TO_TOP, - "\xE1\x83\x98 \xE1\x83\x94 \xE1\x83\x90 \xE1\xB2\xBF" ) /* ი ე ა Ი */ - - SCRIPT( geok, GEOK, - "Georgian (Khutsuri)", - HB_SCRIPT_INVALID, - HINTING_BOTTOM_TO_TOP, - "\xE1\x82\xB6 \xE1\x82\xB1 \xE2\xB4\x99" ) /* Ⴖ Ⴑ ⴙ */ - - SCRIPT( glag, GLAG, - "Glagolitic", - HB_SCRIPT_GLAGOLITIC, - HINTING_BOTTOM_TO_TOP, - "\xE2\xB0\x95 \xE2\xB1\x85" ) /* Ⱅ ⱅ */ - - SCRIPT( goth, GOTH, - "Gothic", - HB_SCRIPT_GOTHIC, - HINTING_TOP_TO_BOTTOM, - "\xF0\x90\x8C\xB4 \xF0\x90\x8C\xBE \xF0\x90\x8D\x83" ) /* 𐌴 𐌾 𐍃 */ - - SCRIPT( grek, GREK, - "Greek", - HB_SCRIPT_GREEK, - HINTING_BOTTOM_TO_TOP, - "\xCE\xBF \xCE\x9F" ) /* ο Ο */ - - SCRIPT( gujr, GUJR, - "Gujarati", - HB_SCRIPT_GUJARATI, - HINTING_BOTTOM_TO_TOP, - "\xE0\xAA\x9F \xE0\xAB\xA6" ) /* ટ ૦ */ - - SCRIPT( guru, GURU, - "Gurmukhi", - HB_SCRIPT_GURMUKHI, - HINTING_TOP_TO_BOTTOM, - "\xE0\xA8\xA0 \xE0\xA8\xB0 \xE0\xA9\xA6" ) /* ਠ ਰ ੦ */ - - SCRIPT( hebr, HEBR, - "Hebrew", - HB_SCRIPT_HEBREW, - HINTING_BOTTOM_TO_TOP, - "\xD7\x9D" ) /* ם */ - - SCRIPT( kali, KALI, - "Kayah Li", - HB_SCRIPT_KAYAH_LI, - HINTING_BOTTOM_TO_TOP, - "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ꤍ ꤀ */ - - /* only digit zero has a simple shape in the Khmer script */ - SCRIPT( khmr, KHMR, - "Khmer", - HB_SCRIPT_KHMER, - HINTING_BOTTOM_TO_TOP, - "\xE1\x9F\xA0" ) /* ០ */ - - SCRIPT( khms, KHMS, - "Khmer Symbols", - HB_SCRIPT_INVALID, - HINTING_BOTTOM_TO_TOP, - "\xE1\xA7\xA1 \xE1\xA7\xAA" ) /* ᧡ ᧪ */ - - SCRIPT( knda, KNDA, - "Kannada", - HB_SCRIPT_KANNADA, - HINTING_BOTTOM_TO_TOP, - "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */ - - /* only digit zero has a simple shape in the Lao script */ - SCRIPT( lao, LAO, - "Lao", - HB_SCRIPT_LAO, - HINTING_BOTTOM_TO_TOP, - "\xE0\xBB\x90" ) /* ໐ */ - - SCRIPT( latn, LATN, - "Latin", - HB_SCRIPT_LATIN, - HINTING_BOTTOM_TO_TOP, - "o O 0" ) - - SCRIPT( latb, LATB, - "Latin Subscript Fallback", - HB_SCRIPT_INVALID, - HINTING_BOTTOM_TO_TOP, - "\xE2\x82\x92 \xE2\x82\x80" ) /* ₒ ₀ */ - - SCRIPT( latp, LATP, - "Latin Superscript Fallback", - HB_SCRIPT_INVALID, - HINTING_BOTTOM_TO_TOP, - "\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* ᵒ ᴼ ⁰ */ - - SCRIPT( lisu, LISU, - "Lisu", - HB_SCRIPT_LISU, - HINTING_BOTTOM_TO_TOP, - "\xEA\x93\xB3" ) /* ꓳ */ - - SCRIPT( mlym, MLYM, - "Malayalam", - HB_SCRIPT_MALAYALAM, - HINTING_BOTTOM_TO_TOP, - "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* ഠ റ */ - - SCRIPT( mymr, MYMR, - "Myanmar", - HB_SCRIPT_MYANMAR, - HINTING_BOTTOM_TO_TOP, - "\xE1\x80\x9D \xE1\x80\x84 \xE1\x80\x82" ) /* ဝ င ဂ */ - - SCRIPT( nkoo, NKOO, - "N'Ko", - HB_SCRIPT_NKO, - HINTING_BOTTOM_TO_TOP, - "\xDF\x8B \xDF\x80" ) /* ߋ ߀ */ - - SCRIPT( none, NONE, - "no script", - HB_SCRIPT_INVALID, - HINTING_BOTTOM_TO_TOP, - "" ) - - SCRIPT( olck, OLCK, - "Ol Chiki", - HB_SCRIPT_OL_CHIKI, - HINTING_BOTTOM_TO_TOP, - "\xE1\xB1\x9B" ) /* ᱛ */ - - SCRIPT( orkh, ORKH, - "Old Turkic", - HB_SCRIPT_OLD_TURKIC, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\xB0\x97" ) /* 𐰗 */ - - SCRIPT( osge, OSGE, - "Osage", - HB_SCRIPT_OSAGE, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\x93\x82 \xF0\x90\x93\xAA" ) /* 𐓂 𐓪 */ - - SCRIPT( osma, OSMA, - "Osmanya", - HB_SCRIPT_OSMANYA, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* 𐒆 𐒠 */ - - SCRIPT( saur, SAUR, - "Saurashtra", - HB_SCRIPT_SAURASHTRA, - HINTING_BOTTOM_TO_TOP, - "\xEA\xA2\x9D \xEA\xA3\x90" ) /* ꢝ ꣐ */ - - SCRIPT( shaw, SHAW, - "Shavian", - HB_SCRIPT_SHAVIAN, - HINTING_BOTTOM_TO_TOP, - "\xF0\x90\x91\xB4" ) /* 𐑴 */ - - SCRIPT( sinh, SINH, - "Sinhala", - HB_SCRIPT_SINHALA, - HINTING_BOTTOM_TO_TOP, - "\xE0\xB6\xA7" ) /* ට */ - - /* only digit zero has a simple (round) shape in the Sundanese script */ - SCRIPT( sund, SUND, - "Sundanese", - HB_SCRIPT_SUNDANESE, - HINTING_BOTTOM_TO_TOP, - "\xE1\xAE\xB0" ) /* ᮰ */ - - /* only digit zero has a simple (round) shape in the Tamil script */ - SCRIPT( taml, TAML, - "Tamil", - HB_SCRIPT_TAMIL, - HINTING_BOTTOM_TO_TOP, - "\xE0\xAF\xA6" ) /* ௦ */ - - SCRIPT( tavt, TAVT, - "Tai Viet", - HB_SCRIPT_TAI_VIET, - HINTING_BOTTOM_TO_TOP, - "\xEA\xAA\x92 \xEA\xAA\xAB" ) /* ꪒ ꪫ */ - - /* there are no simple forms for letters; we thus use two digit shapes */ - SCRIPT( telu, TELU, - "Telugu", - HB_SCRIPT_TELUGU, - HINTING_BOTTOM_TO_TOP, - "\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౦ ౧ */ - - SCRIPT( tfng, TFNG, - "Tifinagh", - HB_SCRIPT_TIFINAGH, - HINTING_BOTTOM_TO_TOP, - "\xE2\xB5\x94" ) /* ⵔ */ - - SCRIPT( thai, THAI, - "Thai", - HB_SCRIPT_THAI, - HINTING_BOTTOM_TO_TOP, - "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๐ */ - - SCRIPT( vaii, VAII, - "Vai", - HB_SCRIPT_VAI, - HINTING_BOTTOM_TO_TOP, - "\xEA\x98\x93 \xEA\x96\x9C \xEA\x96\xB4" ) /* ꘓ ꖜ ꖴ */ - -#ifdef AF_CONFIG_OPTION_INDIC - - SCRIPT( limb, LIMB, - "Limbu", - HB_SCRIPT_LIMBU, - HINTING_BOTTOM_TO_TOP, - "o" ) /* XXX */ - - SCRIPT( orya, ORYA, - "Oriya", - HB_SCRIPT_ORIYA, - HINTING_BOTTOM_TO_TOP, - "o" ) /* XXX */ - - SCRIPT( sylo, SYLO, - "Syloti Nagri", - HB_SCRIPT_SYLOTI_NAGRI, - HINTING_BOTTOM_TO_TOP, - "o" ) /* XXX */ - - SCRIPT( tibt, TIBT, - "Tibetan", - HB_SCRIPT_TIBETAN, - HINTING_BOTTOM_TO_TOP, - "o" ) /* XXX */ - -#endif /* AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - SCRIPT( hani, HANI, - "CJKV ideographs", - HB_SCRIPT_HAN, - HINTING_BOTTOM_TO_TOP, - "\xE7\x94\xB0 \xE5\x9B\x97" ) /* 田 囗 */ - -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afshaper.c b/ThirdParty/freetype/src/autofit/afshaper.c deleted file mode 100644 index a5191c6..0000000 --- a/ThirdParty/freetype/src/autofit/afshaper.c +++ /dev/null @@ -1,676 +0,0 @@ -/**************************************************************************** - * - * afshaper.c - * - * HarfBuzz interface for accessing OpenType features (body). - * - * Copyright (C) 2013-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. - * - */ - - -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_ADVANCES_H -#include "afglobal.h" -#include "aftypes.h" -#include "afshaper.h" - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afshaper - - - /* - * We use `sets' (in the HarfBuzz sense, which comes quite near to the - * usual mathematical meaning) to manage both lookups and glyph indices. - * - * 1. For each coverage, collect lookup IDs in a set. Note that an - * auto-hinter `coverage' is represented by one `feature', and a - * feature consists of an arbitrary number of (font specific) `lookup's - * that actually do the mapping job. Please check the OpenType - * specification for more details on features and lookups. - * - * 2. Create glyph ID sets from the corresponding lookup sets. - * - * 3. The glyph set corresponding to AF_COVERAGE_DEFAULT is computed - * with all lookups specific to the OpenType script activated. It - * relies on the order of AF_DEFINE_STYLE_CLASS entries so that - * special coverages (like `oldstyle figures') don't get overwritten. - * - */ - - - /* load coverage tags */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_tag_t name ## _coverage[] = \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - HB_TAG_NONE \ - }; - - -#include "afcover.h" - - - /* define mapping between coverage tags and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _coverage, - - - static const hb_tag_t* coverages[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - /* load HarfBuzz script tags */ -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) h, - - - static const hb_script_t scripts[] = - { -#include "afscript.h" - }; - - - FT_Error - af_shaper_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles, - FT_Bool default_script ) - { - hb_face_t* face; - - hb_set_t* gsub_lookups = NULL; /* GSUB lookups for a given script */ - hb_set_t* gsub_glyphs = NULL; /* glyphs covered by GSUB lookups */ - hb_set_t* gpos_lookups = NULL; /* GPOS lookups for a given script */ - hb_set_t* gpos_glyphs = NULL; /* glyphs covered by GPOS lookups */ - - hb_script_t script; - const hb_tag_t* coverage_tags; - hb_tag_t script_tags[] = { HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE, - HB_TAG_NONE }; - - hb_codepoint_t idx; -#ifdef FT_DEBUG_LEVEL_TRACE - int count; -#endif - - - if ( !globals || !style_class || !gstyles ) - return FT_THROW( Invalid_Argument ); - - face = hb_font_get_face( globals->hb_font ); - - coverage_tags = coverages[style_class->coverage]; - script = scripts[style_class->script]; - - /* Convert a HarfBuzz script tag into the corresponding OpenType */ - /* tag or tags -- some Indic scripts like Devanagari have an old */ - /* and a new set of features. */ - hb_ot_tags_from_script( script, - &script_tags[0], - &script_tags[1] ); - - /* `hb_ot_tags_from_script' usually returns HB_OT_TAG_DEFAULT_SCRIPT */ - /* as the second tag. We change that to HB_TAG_NONE except for the */ - /* default script. */ - if ( default_script ) - { - if ( script_tags[0] == HB_TAG_NONE ) - script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT; - else - { - if ( script_tags[1] == HB_TAG_NONE ) - script_tags[1] = HB_OT_TAG_DEFAULT_SCRIPT; - else if ( script_tags[1] != HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[2] = HB_OT_TAG_DEFAULT_SCRIPT; - } - } - else - { - /* we use non-standard tags like `khms' for special purposes; */ - /* HarfBuzz maps them to `DFLT', which we don't want to handle here */ - if ( script_tags[0] == HB_OT_TAG_DEFAULT_SCRIPT ) - goto Exit; - - if ( script_tags[1] == HB_OT_TAG_DEFAULT_SCRIPT ) - script_tags[1] = HB_TAG_NONE; - } - - gsub_lookups = hb_set_create(); - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GSUB, - script_tags, - NULL, - coverage_tags, - gsub_lookups ); - - if ( hb_set_is_empty( gsub_lookups ) ) - goto Exit; /* nothing to do */ - - FT_TRACE4(( "GSUB lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - gsub_glyphs = hb_set_create(); - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get output coverage of GSUB feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GSUB, - idx, - NULL, - NULL, - NULL, - gsub_glyphs ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - FT_TRACE4(( "GPOS lookups (style `%s'):\n" - " ", - af_style_names[style_class->style] )); - - gpos_lookups = hb_set_create(); - hb_ot_layout_collect_lookups( face, - HB_OT_TAG_GPOS, - script_tags, - NULL, - coverage_tags, - gpos_lookups ); - -#ifdef FT_DEBUG_LEVEL_TRACE - count = 0; -#endif - - gpos_glyphs = hb_set_create(); - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* get input coverage of GPOS feature */ - hb_ot_layout_lookup_collect_glyphs( face, - HB_OT_TAG_GPOS, - idx, - NULL, - gpos_glyphs, - NULL, - NULL ); - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - /* - * We now check whether we can construct blue zones, using glyphs - * covered by the feature only. In case there is not a single zone - * (this is, not a single character is covered), we skip this coverage. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - { - AF_Blue_Stringset bss = style_class->blue_stringset; - const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; - - FT_Bool found = 0; - - - for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) - { - const char* p = &af_blue_strings[bs->string]; - - - while ( *p ) - { - hb_codepoint_t ch; - - - GET_UTF8_CHAR( ch, p ); - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, - &idx ); ) - { - hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch ); - - - if ( hb_ot_layout_lookup_would_substitute( face, idx, - &gidx, 1, 1 ) ) - { - found = 1; - break; - } - } - } - } - - if ( !found ) - { - FT_TRACE4(( " no blue characters found; style skipped\n" )); - goto Exit; - } - } - - /* - * Various OpenType features might use the same glyphs at different - * vertical positions; for example, superscript and subscript glyphs - * could be the same. However, the auto-hinter is completely - * agnostic of OpenType features after the feature analysis has been - * completed: The engine then simply receives a glyph index and returns a - * hinted and usually rendered glyph. - * - * Consider the superscript feature of font `pala.ttf': Some of the - * glyphs are `real', this is, they have a zero vertical offset, but - * most of them are small caps glyphs shifted up to the superscript - * position (this is, the `sups' feature is present in both the GSUB and - * GPOS tables). The code for blue zones computation actually uses a - * feature's y offset so that the `real' glyphs get correct hints. But - * later on it is impossible to decide whether a glyph index belongs to, - * say, the small caps or superscript feature. - * - * For this reason, we don't assign a style to a glyph if the current - * feature covers the glyph in both the GSUB and the GPOS tables. This - * is quite a broad condition, assuming that - * - * (a) glyphs that get used in multiple features are present in a - * feature without vertical shift, - * - * and - * - * (b) a feature's GPOS data really moves the glyph vertically. - * - * Not fulfilling condition (a) makes a font larger; it would also - * reduce the number of glyphs that could be addressed directly without - * using OpenType features, so this assumption is rather strong. - * - * Condition (b) is much weaker, and there might be glyphs which get - * missed. However, the OpenType features we are going to handle are - * primarily located in GSUB, and HarfBuzz doesn't provide an API to - * directly get the necessary information from the GPOS table. A - * possible solution might be to directly parse the GPOS table to find - * out whether a glyph gets shifted vertically, but this is something I - * would like to avoid if not really necessary. - * - * Note that we don't follow this logic for the default coverage. - * Complex scripts like Devanagari have mandatory GPOS features to - * position many glyph elements, using mark-to-base or mark-to-ligature - * tables; the number of glyphs missed due to condition (b) would be far - * too large. - * - */ - if ( style_class->coverage != AF_COVERAGE_DEFAULT ) - hb_set_subtract( gsub_glyphs, gpos_glyphs ); - -#ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" )); - count = 0; -#endif - - for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); ) - { -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !( count % 10 ) ) - FT_TRACE4(( "\n" - " " )); - - FT_TRACE4(( " %d", idx )); - count++; -#endif - - /* glyph indices returned by `hb_ot_layout_lookup_collect_glyphs' */ - /* can be arbitrary: some fonts use fake indices for processing */ - /* internal to GSUB or GPOS, which is fully valid */ - if ( idx >= (hb_codepoint_t)globals->glyph_count ) - continue; - - if ( gstyles[idx] == AF_STYLE_UNASSIGNED ) - gstyles[idx] = (FT_UShort)style_class->style; -#ifdef FT_DEBUG_LEVEL_TRACE - else - FT_TRACE4(( "*" )); -#endif - } - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( !count ) - FT_TRACE4(( "\n" - " (none)" )); - FT_TRACE4(( "\n\n" )); -#endif - - Exit: - hb_set_destroy( gsub_lookups ); - hb_set_destroy( gsub_glyphs ); - hb_set_destroy( gpos_lookups ); - hb_set_destroy( gpos_glyphs ); - - return FT_Err_Ok; - } - - - /* construct HarfBuzz features */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - static const hb_feature_t name ## _feature[] = \ - { \ - { \ - HB_TAG( tag1, tag2, tag3, tag4 ), \ - 1, 0, (unsigned int)-1 \ - } \ - }; - - -#include "afcover.h" - - - /* define mapping between HarfBuzz features and AF_Coverage */ -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - name ## _feature, - - - static const hb_feature_t* features[] = - { -#include "afcover.h" - - NULL /* AF_COVERAGE_DEFAULT */ - }; - - - void* - af_shaper_buf_create( FT_Face face ) - { - FT_UNUSED( face ); - - return (void*)hb_buffer_create(); - } - - - void - af_shaper_buf_destroy( FT_Face face, - void* buf ) - { - FT_UNUSED( face ); - - hb_buffer_destroy( (hb_buffer_t*)buf ); - } - - - const char* - af_shaper_get_cluster( const char* p, - AF_StyleMetrics metrics, - void* buf_, - unsigned int* count ) - { - AF_StyleClass style_class; - const hb_feature_t* feature; - FT_Int upem; - const char* q; - int len; - - hb_buffer_t* buf = (hb_buffer_t*)buf_; - hb_font_t* font; - hb_codepoint_t dummy; - - - upem = (FT_Int)metrics->globals->face->units_per_EM; - style_class = metrics->style_class; - feature = features[style_class->coverage]; - - font = metrics->globals->hb_font; - - /* we shape at a size of units per EM; this means font units */ - hb_font_set_scale( font, upem, upem ); - - while ( *p == ' ' ) - p++; - - /* count bytes up to next space (or end of buffer) */ - q = p; - while ( !( *q == ' ' || *q == '\0' ) ) - GET_UTF8_CHAR( dummy, q ); - len = (int)( q - p ); - - /* feed character(s) to the HarfBuzz buffer */ - hb_buffer_clear_contents( buf ); - hb_buffer_add_utf8( buf, p, len, 0, len ); - - /* we let HarfBuzz guess the script and writing direction */ - hb_buffer_guess_segment_properties( buf ); - - /* shape buffer, which means conversion from character codes to */ - /* glyph indices, possibly applying a feature */ - hb_shape( font, buf, feature, feature ? 1 : 0 ); - - if ( feature ) - { - hb_buffer_t* hb_buf = metrics->globals->hb_buf; - - unsigned int gcount; - hb_glyph_info_t* ginfo; - - unsigned int hb_gcount; - hb_glyph_info_t* hb_ginfo; - - - /* we have to check whether applying a feature does actually change */ - /* glyph indices; otherwise the affected glyph or glyphs aren't */ - /* available at all in the feature */ - - hb_buffer_clear_contents( hb_buf ); - hb_buffer_add_utf8( hb_buf, p, len, 0, len ); - hb_buffer_guess_segment_properties( hb_buf ); - hb_shape( font, hb_buf, NULL, 0 ); - - ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); - hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount ); - - if ( gcount == hb_gcount ) - { - unsigned int i; - - - for (i = 0; i < gcount; i++ ) - if ( ginfo[i].codepoint != hb_ginfo[i].codepoint ) - break; - - if ( i == gcount ) - { - /* both buffers have identical glyph indices */ - hb_buffer_clear_contents( buf ); - } - } - } - - *count = hb_buffer_get_length( buf ); - -#ifdef FT_DEBUG_LEVEL_TRACE - if ( feature && *count > 1 ) - FT_TRACE1(( "af_shaper_get_cluster:" - " input character mapped to multiple glyphs\n" )); -#endif - - return q; - } - - - FT_ULong - af_shaper_get_elem( AF_StyleMetrics metrics, - void* buf_, - unsigned int idx, - FT_Long* advance, - FT_Long* y_offset ) - { - hb_buffer_t* buf = (hb_buffer_t*)buf_; - hb_glyph_info_t* ginfo; - hb_glyph_position_t* gpos; - unsigned int gcount; - - FT_UNUSED( metrics ); - - - ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); - gpos = hb_buffer_get_glyph_positions( buf, &gcount ); - - if ( idx >= gcount ) - return 0; - - if ( advance ) - *advance = gpos[idx].x_advance; - if ( y_offset ) - *y_offset = gpos[idx].y_offset; - - return ginfo[idx].codepoint; - } - - -#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - - FT_Error - af_shaper_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles, - FT_Bool default_script ) - { - FT_UNUSED( globals ); - FT_UNUSED( style_class ); - FT_UNUSED( gstyles ); - FT_UNUSED( default_script ); - - return FT_Err_Ok; - } - - - void* - af_shaper_buf_create( FT_Face face ) - { - FT_UNUSED( face ); - - return NULL; - } - - - void - af_shaper_buf_destroy( FT_Face face, - void* buf ) - { - FT_UNUSED( face ); - FT_UNUSED( buf ); - } - - - const char* - af_shaper_get_cluster( const char* p, - AF_StyleMetrics metrics, - void* buf_, - unsigned int* count ) - { - FT_Face face = metrics->globals->face; - FT_ULong ch, dummy = 0; - FT_ULong* buf = (FT_ULong*)buf_; - - - while ( *p == ' ' ) - p++; - - GET_UTF8_CHAR( ch, p ); - - /* since we don't have an engine to handle clusters, */ - /* we scan the characters but return zero */ - while ( !( *p == ' ' || *p == '\0' ) ) - GET_UTF8_CHAR( dummy, p ); - - if ( dummy ) - { - *buf = 0; - *count = 0; - } - else - { - *buf = FT_Get_Char_Index( face, ch ); - *count = 1; - } - - return p; - } - - - FT_ULong - af_shaper_get_elem( AF_StyleMetrics metrics, - void* buf_, - unsigned int idx, - FT_Long* advance, - FT_Long* y_offset ) - { - FT_Face face = metrics->globals->face; - FT_ULong glyph_index = *(FT_ULong*)buf_; - - FT_UNUSED( idx ); - - - if ( advance ) - FT_Get_Advance( face, - glyph_index, - FT_LOAD_NO_SCALE | - FT_LOAD_NO_HINTING | - FT_LOAD_IGNORE_TRANSFORM, - advance ); - - if ( y_offset ) - *y_offset = 0; - - return glyph_index; - } - - -#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afshaper.h b/ThirdParty/freetype/src/autofit/afshaper.h deleted file mode 100644 index 06a1e06..0000000 --- a/ThirdParty/freetype/src/autofit/afshaper.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * - * afshaper.h - * - * HarfBuzz interface for accessing OpenType features (specification). - * - * Copyright (C) 2013-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 AFSHAPER_H_ -#define AFSHAPER_H_ - - -#include <ft2build.h> -#include FT_FREETYPE_H - - -#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ - -#include <hb.h> -#include <hb-ot.h> -#include <hb-ft.h> - -#endif - - -FT_BEGIN_HEADER - - FT_Error - af_shaper_get_coverage( AF_FaceGlobals globals, - AF_StyleClass style_class, - FT_UShort* gstyles, - FT_Bool default_script ); - - - void* - af_shaper_buf_create( FT_Face face ); - - void - af_shaper_buf_destroy( FT_Face face, - void* buf ); - - const char* - af_shaper_get_cluster( const char* p, - AF_StyleMetrics metrics, - void* buf_, - unsigned int* count ); - - FT_ULong - af_shaper_get_elem( AF_StyleMetrics metrics, - void* buf_, - unsigned int idx, - FT_Long* x_advance, - FT_Long* y_offset ); - - /* */ - -FT_END_HEADER - -#endif /* AFSHAPER_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afstyles.h b/ThirdParty/freetype/src/autofit/afstyles.h deleted file mode 100644 index edf4f54..0000000 --- a/ThirdParty/freetype/src/autofit/afstyles.h +++ /dev/null @@ -1,475 +0,0 @@ -/**************************************************************************** - * - * afstyles.h - * - * Auto-fitter styles (specification only). - * - * Copyright (C) 2013-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - - /* The following part can be included multiple times. */ - /* Define `STYLE' as needed. */ - - - /* Add new styles here. The first and second arguments are the */ - /* style name in lowercase and uppercase, respectively, followed */ - /* by a description string. The next arguments are the */ - /* corresponding writing system, script, blue stringset, and */ - /* coverage. */ - /* */ - /* Note that styles using `AF_COVERAGE_DEFAULT' should always */ - /* come after styles with other coverages. Also note that */ - /* fallback scripts only use `AF_COVERAGE_DEFAULT' for its */ - /* style. */ - /* */ - /* Example: */ - /* */ - /* STYLE( cyrl_dflt, CYRL_DFLT, */ - /* "Cyrillic default style", */ - /* AF_WRITING_SYSTEM_LATIN, */ - /* AF_SCRIPT_CYRL, */ - /* AF_BLUE_STRINGSET_CYRL, */ - /* AF_COVERAGE_DEFAULT ) */ - -#undef STYLE_LATIN -#define STYLE_LATIN( s, S, f, F, ds, df, C ) \ - STYLE( s ## _ ## f, S ## _ ## F, \ - ds " " df " style", \ - AF_WRITING_SYSTEM_LATIN, \ - AF_SCRIPT_ ## S, \ - AF_BLUE_STRINGSET_ ## S, \ - AF_COVERAGE_ ## C ) - -#undef META_STYLE_LATIN -#define META_STYLE_LATIN( s, S, ds ) \ - STYLE_LATIN( s, S, c2cp, C2CP, ds, \ - "petite capitals from capitals", \ - PETITE_CAPITALS_FROM_CAPITALS ) \ - STYLE_LATIN( s, S, c2sc, C2SC, ds, \ - "small capitals from capitals", \ - SMALL_CAPITALS_FROM_CAPITALS ) \ - STYLE_LATIN( s, S, ordn, ORDN, ds, \ - "ordinals", \ - ORDINALS ) \ - STYLE_LATIN( s, S, pcap, PCAP, ds, \ - "petite capitals", \ - PETITE_CAPITALS ) \ - STYLE_LATIN( s, S, sinf, SINF, ds, \ - "scientific inferiors", \ - SCIENTIFIC_INFERIORS ) \ - STYLE_LATIN( s, S, smcp, SMCP, ds, \ - "small capitals", \ - SMALL_CAPITALS ) \ - STYLE_LATIN( s, S, subs, SUBS, ds, \ - "subscript", \ - SUBSCRIPT ) \ - STYLE_LATIN( s, S, sups, SUPS, ds, \ - "superscript", \ - SUPERSCRIPT ) \ - STYLE_LATIN( s, S, titl, TITL, ds, \ - "titling", \ - TITLING ) \ - STYLE_LATIN( s, S, dflt, DFLT, ds, \ - "default", \ - DEFAULT ) - - - STYLE( adlm_dflt, ADLM_DFLT, - "Adlam default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ADLM, - AF_BLUE_STRINGSET_ADLM, - AF_COVERAGE_DEFAULT ) - - STYLE( arab_dflt, ARAB_DFLT, - "Arabic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ARAB, - AF_BLUE_STRINGSET_ARAB, - AF_COVERAGE_DEFAULT ) - - STYLE( armn_dflt, ARMN_DFLT, - "Armenian default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ARMN, - AF_BLUE_STRINGSET_ARMN, - AF_COVERAGE_DEFAULT ) - - STYLE( avst_dflt, AVST_DFLT, - "Avestan default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_AVST, - AF_BLUE_STRINGSET_AVST, - AF_COVERAGE_DEFAULT ) - - STYLE( bamu_dflt, BAMU_DFLT, - "Bamum default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_BAMU, - AF_BLUE_STRINGSET_BAMU, - AF_COVERAGE_DEFAULT ) - - STYLE( beng_dflt, BENG_DFLT, - "Bengali default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_BENG, - AF_BLUE_STRINGSET_BENG, - AF_COVERAGE_DEFAULT ) - - STYLE( buhd_dflt, BUHD_DFLT, - "Buhid default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_BUHD, - AF_BLUE_STRINGSET_BUHD, - AF_COVERAGE_DEFAULT ) - - STYLE( cakm_dflt, CAKM_DFLT, - "Chakma default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_CAKM, - AF_BLUE_STRINGSET_CAKM, - AF_COVERAGE_DEFAULT ) - - STYLE( cans_dflt, CANS_DFLT, - "Canadian Syllabics default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_CANS, - AF_BLUE_STRINGSET_CANS, - AF_COVERAGE_DEFAULT ) - - STYLE( cari_dflt, CARI_DFLT, - "Carian default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_CARI, - AF_BLUE_STRINGSET_CARI, - AF_COVERAGE_DEFAULT ) - - STYLE( cher_dflt, CHER_DFLT, - "Cherokee default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_CHER, - AF_BLUE_STRINGSET_CHER, - AF_COVERAGE_DEFAULT ) - - STYLE( copt_dflt, COPT_DFLT, - "Coptic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_COPT, - AF_BLUE_STRINGSET_COPT, - AF_COVERAGE_DEFAULT ) - - STYLE( cprt_dflt, CPRT_DFLT, - "Cypriot default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_CPRT, - AF_BLUE_STRINGSET_CPRT, - AF_COVERAGE_DEFAULT ) - - META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" ) - - STYLE( deva_dflt, DEVA_DFLT, - "Devanagari default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_DEVA, - AF_BLUE_STRINGSET_DEVA, - AF_COVERAGE_DEFAULT ) - - STYLE( dsrt_dflt, DSRT_DFLT, - "Deseret default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_DSRT, - AF_BLUE_STRINGSET_DSRT, - AF_COVERAGE_DEFAULT ) - - STYLE( ethi_dflt, ETHI_DFLT, - "Ethiopic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ETHI, - AF_BLUE_STRINGSET_ETHI, - AF_COVERAGE_DEFAULT ) - - STYLE( geor_dflt, GEOR_DFLT, - "Georgian (Mkhedruli) default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GEOR, - AF_BLUE_STRINGSET_GEOR, - AF_COVERAGE_DEFAULT ) - - STYLE( geok_dflt, GEOK_DFLT, - "Georgian (Khutsuri) default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GEOK, - AF_BLUE_STRINGSET_GEOK, - AF_COVERAGE_DEFAULT ) - - STYLE( glag_dflt, GLAG_DFLT, - "Glagolitic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GLAG, - AF_BLUE_STRINGSET_GLAG, - AF_COVERAGE_DEFAULT ) - - STYLE( goth_dflt, GOTH_DFLT, - "Gothic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GOTH, - AF_BLUE_STRINGSET_GOTH, - AF_COVERAGE_DEFAULT ) - - META_STYLE_LATIN( grek, GREK, "Greek" ) - - STYLE( gujr_dflt, GUJR_DFLT, - "Gujarati default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GUJR, - AF_BLUE_STRINGSET_GUJR, - AF_COVERAGE_DEFAULT ) - - STYLE( guru_dflt, GURU_DFLT, - "Gurmukhi default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_GURU, - AF_BLUE_STRINGSET_GURU, - AF_COVERAGE_DEFAULT ) - - STYLE( hebr_dflt, HEBR_DFLT, - "Hebrew default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_HEBR, - AF_BLUE_STRINGSET_HEBR, - AF_COVERAGE_DEFAULT ) - - STYLE( kali_dflt, KALI_DFLT, - "Kayah Li default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_KALI, - AF_BLUE_STRINGSET_KALI, - AF_COVERAGE_DEFAULT ) - - STYLE( khmr_dflt, KHMR_DFLT, - "Khmer default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_KHMR, - AF_BLUE_STRINGSET_KHMR, - AF_COVERAGE_DEFAULT ) - - STYLE( khms_dflt, KHMS_DFLT, - "Khmer Symbols default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_KHMS, - AF_BLUE_STRINGSET_KHMS, - AF_COVERAGE_DEFAULT ) - - STYLE( knda_dflt, KNDA_DFLT, - "Kannada default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_KNDA, - AF_BLUE_STRINGSET_KNDA, - AF_COVERAGE_DEFAULT ) - - STYLE( lao_dflt, LAO_DFLT, - "Lao default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_LAO, - AF_BLUE_STRINGSET_LAO, - AF_COVERAGE_DEFAULT ) - - META_STYLE_LATIN( latn, LATN, "Latin" ) - - STYLE( latb_dflt, LATB_DFLT, - "Latin subscript fallback default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_LATB, - AF_BLUE_STRINGSET_LATB, - AF_COVERAGE_DEFAULT ) - - STYLE( latp_dflt, LATP_DFLT, - "Latin superscript fallback default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_LATP, - AF_BLUE_STRINGSET_LATP, - AF_COVERAGE_DEFAULT ) - -#ifdef FT_OPTION_AUTOFIT2 - STYLE( ltn2_dflt, LTN2_DFLT, - "Latin 2 default style", - AF_WRITING_SYSTEM_LATIN2, - AF_SCRIPT_LATN, - AF_BLUE_STRINGSET_LATN, - AF_COVERAGE_DEFAULT ) -#endif - - STYLE( lisu_dflt, LISU_DFLT, - "Lisu default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_LISU, - AF_BLUE_STRINGSET_LISU, - AF_COVERAGE_DEFAULT ) - - STYLE( mlym_dflt, MLYM_DFLT, - "Malayalam default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_MLYM, - AF_BLUE_STRINGSET_MLYM, - AF_COVERAGE_DEFAULT ) - - STYLE( mymr_dflt, MYMR_DFLT, - "Myanmar default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_MYMR, - AF_BLUE_STRINGSET_MYMR, - AF_COVERAGE_DEFAULT ) - - STYLE( nkoo_dflt, NKOO_DFLT, - "N'Ko default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_NKOO, - AF_BLUE_STRINGSET_NKOO, - AF_COVERAGE_DEFAULT ) - - STYLE( none_dflt, NONE_DFLT, - "no style", - AF_WRITING_SYSTEM_DUMMY, - AF_SCRIPT_NONE, - AF_BLUE_STRINGSET_NONE, - AF_COVERAGE_DEFAULT ) - - STYLE( olck_dflt, OLCK_DFLT, - "Ol Chiki default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_OLCK, - AF_BLUE_STRINGSET_OLCK, - AF_COVERAGE_DEFAULT ) - - STYLE( orkh_dflt, ORKH_DFLT, - "Old Turkic default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_ORKH, - AF_BLUE_STRINGSET_ORKH, - AF_COVERAGE_DEFAULT ) - - STYLE( osge_dflt, OSGE_DFLT, - "Osage default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_OSGE, - AF_BLUE_STRINGSET_OSGE, - AF_COVERAGE_DEFAULT ) - - STYLE( osma_dflt, OSMA_DFLT, - "Osmanya default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_OSMA, - AF_BLUE_STRINGSET_OSMA, - AF_COVERAGE_DEFAULT ) - - STYLE( saur_dflt, SAUR_DFLT, - "Saurashtra default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_SAUR, - AF_BLUE_STRINGSET_SAUR, - AF_COVERAGE_DEFAULT ) - - STYLE( shaw_dflt, SHAW_DFLT, - "Shavian default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_SHAW, - AF_BLUE_STRINGSET_SHAW, - AF_COVERAGE_DEFAULT ) - - STYLE( sinh_dflt, SINH_DFLT, - "Sinhala default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_SINH, - AF_BLUE_STRINGSET_SINH, - AF_COVERAGE_DEFAULT ) - - STYLE( sund_dflt, SUND_DFLT, - "Sundanese default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_SUND, - AF_BLUE_STRINGSET_SUND, - AF_COVERAGE_DEFAULT ) - - STYLE( taml_dflt, TAML_DFLT, - "Tamil default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_TAML, - AF_BLUE_STRINGSET_TAML, - AF_COVERAGE_DEFAULT ) - - STYLE( tavt_dflt, TAVT_DFLT, - "Tai Viet default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_TAVT, - AF_BLUE_STRINGSET_TAVT, - AF_COVERAGE_DEFAULT ) - - STYLE( telu_dflt, TELU_DFLT, - "Telugu default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_TELU, - AF_BLUE_STRINGSET_TELU, - AF_COVERAGE_DEFAULT ) - - STYLE( tfng_dflt, TFNG_DFLT, - "Tifinagh default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_TFNG, - AF_BLUE_STRINGSET_TFNG, - AF_COVERAGE_DEFAULT ) - - STYLE( thai_dflt, THAI_DFLT, - "Thai default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_THAI, - AF_BLUE_STRINGSET_THAI, - AF_COVERAGE_DEFAULT ) - - STYLE( vaii_dflt, VAII_DFLT, - "Vai default style", - AF_WRITING_SYSTEM_LATIN, - AF_SCRIPT_VAII, - AF_BLUE_STRINGSET_VAII, - AF_COVERAGE_DEFAULT ) - -#ifdef AF_CONFIG_OPTION_INDIC - - /* no blue stringset support for the Indic writing system yet */ -#undef STYLE_DEFAULT_INDIC -#define STYLE_DEFAULT_INDIC( s, S, d ) \ - STYLE( s ## _dflt, S ## _DFLT, \ - d " default style", \ - AF_WRITING_SYSTEM_INDIC, \ - AF_SCRIPT_ ## S, \ - (AF_Blue_Stringset)0, \ - AF_COVERAGE_DEFAULT ) - - STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" ) - STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" ) - STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" ) - STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" ) - -#endif /* AF_CONFIG_OPTION_INDIC */ - -#ifdef AF_CONFIG_OPTION_CJK - - STYLE( hani_dflt, HANI_DFLT, - "CJKV ideographs default style", - AF_WRITING_SYSTEM_CJK, - AF_SCRIPT_HANI, - AF_BLUE_STRINGSET_HANI, - AF_COVERAGE_DEFAULT ) - -#endif /* AF_CONFIG_OPTION_CJK */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/aftypes.h b/ThirdParty/freetype/src/autofit/aftypes.h deleted file mode 100644 index 579003d..0000000 --- a/ThirdParty/freetype/src/autofit/aftypes.h +++ /dev/null @@ -1,573 +0,0 @@ -/**************************************************************************** - * - * aftypes.h - * - * Auto-fitter types (specification only). - * - * Copyright (C) 2003-2019 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - - /************************************************************************* - * - * The auto-fitter is a complete rewrite of the old auto-hinter. - * Its main feature is the ability to differentiate between different - * writing systems and scripts in order to apply specific rules. - * - * The code has also been compartmentalized into several entities that - * should make algorithmic experimentation easier than with the old - * code. - * - *************************************************************************/ - - -#ifndef AFTYPES_H_ -#define AFTYPES_H_ - -#include <ft2build.h> - -#include FT_FREETYPE_H -#include FT_OUTLINE_H -#include FT_INTERNAL_OBJECTS_H -#include FT_INTERNAL_DEBUG_H - -#include "afblue.h" - -#ifdef FT_DEBUG_AUTOFIT -#include FT_CONFIG_STANDARD_LIBRARY_H -#endif - - -FT_BEGIN_HEADER - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** D E B U G G I N G *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - -#ifdef FT_DEBUG_AUTOFIT - -extern int _af_debug_disable_horz_hints; -extern int _af_debug_disable_vert_hints; -extern int _af_debug_disable_blue_hints; -extern void* _af_debug_hints; - -#endif /* FT_DEBUG_AUTOFIT */ - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** U T I L I T Y S T U F F *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AF_WidthRec_ - { - FT_Pos org; /* original position/width in font units */ - FT_Pos cur; /* current/scaled position/width in device subpixels */ - FT_Pos fit; /* current/fitted position/width in device subpixels */ - - } AF_WidthRec, *AF_Width; - - - FT_LOCAL( void ) - af_sort_pos( FT_UInt count, - FT_Pos* table ); - - FT_LOCAL( void ) - af_sort_and_quantize_widths( FT_UInt* count, - AF_Width widths, - FT_Pos threshold ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** A N G L E T Y P E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The auto-fitter doesn't need a very high angular accuracy; - * this allows us to speed up some computations considerably with a - * light Cordic algorithm (see afangles.c). - */ - - typedef FT_Int AF_Angle; - - -#define AF_ANGLE_PI 256 -#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) -#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) -#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) - - -#if 0 - /* - * compute the angle of a given 2-D vector - */ - FT_LOCAL( AF_Angle ) - af_angle_atan( FT_Pos dx, - FT_Pos dy ); - - - /* - * compute `angle2 - angle1'; the result is always within - * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] - */ - FT_LOCAL( AF_Angle ) - af_angle_diff( AF_Angle angle1, - AF_Angle angle2 ); -#endif /* 0 */ - - -#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ - FT_BEGIN_STMNT \ - AF_Angle _delta = (angle2) - (angle1); \ - \ - \ - while ( _delta <= -AF_ANGLE_PI ) \ - _delta += AF_ANGLE_2PI; \ - \ - while ( _delta > AF_ANGLE_PI ) \ - _delta -= AF_ANGLE_2PI; \ - \ - result = _delta; \ - FT_END_STMNT - - - /* - * opaque handle to glyph-specific hints -- see `afhints.h' for more - * details - */ - typedef struct AF_GlyphHintsRec_* AF_GlyphHints; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C A L E R S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * A scaler models the target pixel device that will receive the - * auto-hinted glyph image. - */ - -#define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */ -#define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */ -#define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */ -#define AF_SCALER_FLAG_NO_WARPER 8U /* disable warper */ - - - typedef struct AF_ScalerRec_ - { - FT_Face face; /* source font face */ - FT_Fixed x_scale; /* from font units to 1/64th device pixels */ - FT_Fixed y_scale; /* from font units to 1/64th device pixels */ - FT_Pos x_delta; /* in 1/64th device pixels */ - FT_Pos y_delta; /* in 1/64th device pixels */ - FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ - FT_UInt32 flags; /* additional control flags, see above */ - - } AF_ScalerRec, *AF_Scaler; - - -#define AF_SCALER_EQUAL_SCALES( a, b ) \ - ( (a)->x_scale == (b)->x_scale && \ - (a)->y_scale == (b)->y_scale && \ - (a)->x_delta == (b)->x_delta && \ - (a)->y_delta == (b)->y_delta ) - - - typedef struct AF_StyleMetricsRec_* AF_StyleMetrics; - - /* - * This function parses an FT_Face to compute global metrics for - * a specific style. - */ - typedef FT_Error - (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics, - FT_Face face ); - - typedef void - (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics, - AF_Scaler scaler ); - - typedef void - (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics ); - - typedef void - (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ); - - - typedef FT_Error - (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints, - AF_StyleMetrics metrics ); - - typedef FT_Error - (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_StyleMetrics metrics ); - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** W R I T I N G S Y S T E M S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * For the auto-hinter, a writing system consists of multiple scripts that - * can be handled similarly *in a typographical way*; the relationship is - * not based on history. For example, both the Greek and the unrelated - * Armenian scripts share the same features like ascender, descender, - * x-height, etc. Essentially, a writing system is covered by a - * submodule of the auto-fitter; it contains - * - * - a specific global analyzer that computes global metrics specific to - * the script (based on script-specific characters to identify ascender - * height, x-height, etc.), - * - * - a specific glyph analyzer that computes segments and edges for each - * glyph covered by the script, - * - * - a specific grid-fitting algorithm that distorts the scaled glyph - * outline according to the results of the glyph analyzer. - */ - -#define AFWRTSYS_H_ /* don't load header files */ -#undef WRITING_SYSTEM -#define WRITING_SYSTEM( ws, WS ) \ - AF_WRITING_SYSTEM_ ## WS, - - /* The list of known writing systems. */ - typedef enum AF_WritingSystem_ - { - -#include "afwrtsys.h" - - AF_WRITING_SYSTEM_MAX /* do not remove */ - - } AF_WritingSystem; - -#undef AFWRTSYS_H_ - - - typedef struct AF_WritingSystemClassRec_ - { - AF_WritingSystem writing_system; - - FT_Offset style_metrics_size; - AF_WritingSystem_InitMetricsFunc style_metrics_init; - AF_WritingSystem_ScaleMetricsFunc style_metrics_scale; - AF_WritingSystem_DoneMetricsFunc style_metrics_done; - AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw; - - AF_WritingSystem_InitHintsFunc style_hints_init; - AF_WritingSystem_ApplyHintsFunc style_hints_apply; - - } AF_WritingSystemClassRec; - - typedef const AF_WritingSystemClassRec* AF_WritingSystemClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S C R I P T S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * Each script is associated with two sets of Unicode ranges to test - * whether the font face supports the script, and which non-base - * characters the script contains. - * - * We use four-letter script tags from the OpenType specification, - * extended by `NONE', which indicates `no script'. - */ - -#undef SCRIPT -#define SCRIPT( s, S, d, h, H, ss ) \ - AF_SCRIPT_ ## S, - - /* The list of known scripts. */ - typedef enum AF_Script_ - { - -#include "afscript.h" - - AF_SCRIPT_MAX /* do not remove */ - - } AF_Script; - - - typedef struct AF_Script_UniRangeRec_ - { - FT_UInt32 first; - FT_UInt32 last; - - } AF_Script_UniRangeRec; - -#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } - - typedef const AF_Script_UniRangeRec* AF_Script_UniRange; - - - typedef struct AF_ScriptClassRec_ - { - AF_Script script; - - /* last element in the ranges must be { 0, 0 } */ - AF_Script_UniRange script_uni_ranges; - AF_Script_UniRange script_uni_nonbase_ranges; - - FT_Bool top_to_bottom_hinting; - - const char* standard_charstring; /* for default width and height */ - - } AF_ScriptClassRec; - - typedef const AF_ScriptClassRec* AF_ScriptClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** C O V E R A G E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * Usually, a font contains more glyphs than can be addressed by its - * character map. - * - * In the PostScript font world, encoding vectors specific to a given - * task are used to select such glyphs, and these glyphs can be often - * recognized by having a suffix in its glyph names. For example, a - * superscript glyph `A' might be called `A.sup'. Unfortunately, this - * naming scheme is not standardized and thus unusable for us. - * - * In the OpenType world, a better solution was invented, namely - * `features', which cleanly separate a character's input encoding from - * the corresponding glyph's appearance, and which don't use glyph names - * at all. For our purposes, and slightly generalized, an OpenType - * feature is a name of a mapping that maps character codes to - * non-standard glyph indices (features get used for other things also). - * For example, the `sups' feature provides superscript glyphs, thus - * mapping character codes like `A' or `B' to superscript glyph - * representation forms. How this mapping happens is completely - * uninteresting to us. - * - * For the auto-hinter, a `coverage' represents all glyphs of an OpenType - * feature collected in a set (as listed below) that can be hinted - * together. To continue the above example, superscript glyphs must not - * be hinted together with normal glyphs because the blue zones - * completely differ. - * - * Note that FreeType itself doesn't compute coverages; it only provides - * the glyphs addressable by the default Unicode character map. Instead, - * we use the HarfBuzz library (if available), which has many functions - * exactly for this purpose. - * - * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't - * listed separately (including the glyphs addressable by the character - * map). In case HarfBuzz isn't available, it exactly covers the glyphs - * addressable by the character map. - * - */ - -#undef COVERAGE -#define COVERAGE( name, NAME, description, \ - tag1, tag2, tag3, tag4 ) \ - AF_COVERAGE_ ## NAME, - - - typedef enum AF_Coverage_ - { -#include "afcover.h" - - AF_COVERAGE_DEFAULT - - } AF_Coverage; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S T Y L E S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - /* - * The topmost structure for modelling the auto-hinter glyph input data - * is a `style class', grouping everything together. - */ - -#undef STYLE -#define STYLE( s, S, d, ws, sc, ss, c ) \ - AF_STYLE_ ## S, - - /* The list of known styles. */ - typedef enum AF_Style_ - { - -#include "afstyles.h" - - AF_STYLE_MAX /* do not remove */ - - } AF_Style; - - - typedef struct AF_StyleClassRec_ - { - AF_Style style; - - AF_WritingSystem writing_system; - AF_Script script; - AF_Blue_Stringset blue_stringset; - AF_Coverage coverage; - - } AF_StyleClassRec; - - typedef const AF_StyleClassRec* AF_StyleClass; - - - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** S T Y L E M E T R I C S *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ - - typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; - - /* This is the main structure that combines everything. Autofit modules */ - /* specific to writing systems derive their structures from it, for */ - /* example `AF_LatinMetrics'. */ - - typedef struct AF_StyleMetricsRec_ - { - AF_StyleClass style_class; - AF_ScalerRec scaler; - FT_Bool digits_have_same_width; - - AF_FaceGlobals globals; /* to access properties */ - - } AF_StyleMetricsRec; - - -#define AF_HINTING_BOTTOM_TO_TOP 0 -#define AF_HINTING_TOP_TO_BOTTOM 1 - - - /* Declare and define vtables for classes */ -#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ - FT_CALLBACK_TABLE const AF_WritingSystemClassRec \ - writing_system_class; - -#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ - writing_system_class, \ - system, \ - m_size, \ - m_init, \ - m_scale, \ - m_done, \ - m_stdw, \ - h_init, \ - h_apply ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_WritingSystemClassRec writing_system_class = \ - { \ - system, \ - \ - m_size, \ - \ - m_init, \ - m_scale, \ - m_done, \ - m_stdw, \ - \ - h_init, \ - h_apply \ - }; - - -#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ - FT_CALLBACK_TABLE const AF_ScriptClassRec \ - script_class; - -#define AF_DEFINE_SCRIPT_CLASS( \ - script_class, \ - script, \ - ranges, \ - nonbase_ranges, \ - top_to_bottom, \ - std_charstring ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_ScriptClassRec script_class = \ - { \ - script, \ - ranges, \ - nonbase_ranges, \ - top_to_bottom, \ - std_charstring, \ - }; - - -#define AF_DECLARE_STYLE_CLASS( style_class ) \ - FT_CALLBACK_TABLE const AF_StyleClassRec \ - style_class; - -#define AF_DEFINE_STYLE_CLASS( \ - style_class, \ - style, \ - writing_system, \ - script, \ - blue_stringset, \ - coverage ) \ - FT_CALLBACK_TABLE_DEF \ - const AF_StyleClassRec style_class = \ - { \ - style, \ - writing_system, \ - script, \ - blue_stringset, \ - coverage \ - }; - -/* */ - - -FT_END_HEADER - -#endif /* AFTYPES_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afwarp.c b/ThirdParty/freetype/src/autofit/afwarp.c deleted file mode 100644 index 84e9753..0000000 --- a/ThirdParty/freetype/src/autofit/afwarp.c +++ /dev/null @@ -1,373 +0,0 @@ -/**************************************************************************** - * - * afwarp.c - * - * Auto-fitter warping algorithm (body). - * - * 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. - * - */ - - - /* - * 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. - */ - -#include "afwarp.h" - -#ifdef AF_CONFIG_OPTION_USE_WARPER - - /************************************************************************** - * - * The macro FT_COMPONENT is used in trace mode. It is an implicit - * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log - * messages during execution. - */ -#undef FT_COMPONENT -#define FT_COMPONENT afwarp - - - /* The weights cover the range 0/64 - 63/64 of a pixel. Obviously, */ - /* values around a half pixel (which means exactly between two grid */ - /* lines) gets the worst weight. */ -#if 1 - static const AF_WarpScore - af_warper_weights[64] = - { - 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, - - -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, - }; -#else - static const AF_WarpScore - af_warper_weights[64] = - { - 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, - - -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, - }; -#endif - - - /* Score segments for a given `scale' and `delta' in the range */ - /* `xx1' to `xx2', and store the best result in `warper'. If */ - /* the new best score is equal to the old one, prefer the */ - /* value with a smaller distortion (around `base_distort'). */ - - static void - af_warper_compute_line_best( AF_Warper warper, - FT_Fixed scale, - FT_Pos delta, - FT_Pos xx1, - FT_Pos xx2, - AF_WarpScore base_distort, - AF_Segment segments, - FT_Int num_segments ) - { - FT_Int idx_min, idx_max, idx0; - FT_Int nn; - AF_WarpScore scores[65]; - - - for ( nn = 0; nn < 65; nn++ ) - scores[nn] = 0; - - idx0 = xx1 - warper->t1; - - /* compute minimum and maximum indices */ - { - FT_Pos xx1min = warper->x1min; - FT_Pos xx1max = warper->x1max; - FT_Pos w = xx2 - xx1; - - - if ( xx1min + w < warper->x2min ) - xx1min = warper->x2min - w; - - if ( xx1max + w > warper->x2max ) - xx1max = warper->x2max - w; - - idx_min = xx1min - warper->t1; - idx_max = xx1max - warper->t1; - - if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) - { - FT_TRACE5(( "invalid indices:\n" - " min=%d max=%d, xx1=%ld xx2=%ld,\n" - " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", - idx_min, idx_max, xx1, xx2, - warper->x1min, warper->x1max, - warper->x2min, warper->x2max )); - return; - } - } - - for ( nn = 0; nn < num_segments; nn++ ) - { - FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; - FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; - FT_Pos y = y0 + ( idx_min - idx0 ); - FT_Int idx; - - - /* score the length of the segments for the given range */ - for ( idx = idx_min; idx <= idx_max; idx++, y++ ) - scores[idx] += af_warper_weights[y & 63] * len; - } - - /* find best score */ - { - FT_Int idx; - - - for ( idx = idx_min; idx <= idx_max; idx++ ) - { - AF_WarpScore score = scores[idx]; - AF_WarpScore distort = base_distort + ( idx - idx0 ); - - - if ( score > warper->best_score || - ( score == warper->best_score && - distort < warper->best_distort ) ) - { - warper->best_score = score; - warper->best_distort = distort; - warper->best_scale = scale; - warper->best_delta = delta + ( idx - idx0 ); - } - } - } - } - - - /* Compute optimal scaling and delta values for a given glyph and */ - /* dimension. */ - - FT_LOCAL_DEF( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Pos *a_delta ) - { - AF_AxisHints axis; - AF_Point points; - - FT_Fixed org_scale; - FT_Pos org_delta; - - FT_Int nn, num_points, num_segments; - FT_Int X1, X2; - FT_Int w; - - AF_WarpScore base_distort; - AF_Segment segments; - - - /* get original scaling transformation */ - if ( dim == AF_DIMENSION_VERT ) - { - org_scale = hints->y_scale; - org_delta = hints->y_delta; - } - else - { - org_scale = hints->x_scale; - org_delta = hints->x_delta; - } - - warper->best_scale = org_scale; - warper->best_delta = org_delta; - warper->best_score = FT_INT_MIN; - warper->best_distort = 0; - - axis = &hints->axis[dim]; - segments = axis->segments; - num_segments = axis->num_segments; - points = hints->points; - num_points = hints->num_points; - - *a_scale = org_scale; - *a_delta = org_delta; - - /* get X1 and X2, minimum and maximum in original coordinates */ - if ( num_segments < 1 ) - return; - -#if 1 - X1 = X2 = points[0].fx; - for ( nn = 1; nn < num_points; nn++ ) - { - FT_Int X = points[nn].fx; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#else - X1 = X2 = segments[0].pos; - for ( nn = 1; nn < num_segments; nn++ ) - { - FT_Int X = segments[nn].pos; - - - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } -#endif - - if ( X1 >= X2 ) - return; - - warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; - warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; - - warper->t1 = AF_WARPER_FLOOR( warper->x1 ); - warper->t2 = AF_WARPER_CEIL( warper->x2 ); - - /* examine a half pixel wide range around the maximum coordinates */ - warper->x1min = warper->x1 & ~31; - warper->x1max = warper->x1min + 32; - warper->x2min = warper->x2 & ~31; - warper->x2max = warper->x2min + 32; - - if ( warper->x1max > warper->x2 ) - warper->x1max = warper->x2; - - if ( warper->x2min < warper->x1 ) - warper->x2min = warper->x1; - - warper->w0 = warper->x2 - warper->x1; - - if ( warper->w0 <= 64 ) - { - warper->x1max = warper->x1; - warper->x2min = warper->x2; - } - - /* examine (at most) a pixel wide range around the natural width */ - warper->wmin = warper->x2min - warper->x1max; - warper->wmax = warper->x2max - warper->x1min; - -#if 1 - /* some heuristics to reduce the number of widths to be examined */ - { - int margin = 16; - - - if ( warper->w0 <= 128 ) - { - margin = 8; - if ( warper->w0 <= 96 ) - margin = 4; - } - - if ( warper->wmin < warper->w0 - margin ) - warper->wmin = warper->w0 - margin; - - if ( warper->wmax > warper->w0 + margin ) - warper->wmax = warper->w0 + margin; - } - - if ( warper->wmin < warper->w0 * 3 / 4 ) - warper->wmin = warper->w0 * 3 / 4; - - if ( warper->wmax > warper->w0 * 5 / 4 ) - warper->wmax = warper->w0 * 5 / 4; -#else - /* no scaling, just translation */ - warper->wmin = warper->wmax = warper->w0; -#endif - - for ( w = warper->wmin; w <= warper->wmax; w++ ) - { - FT_Fixed new_scale; - FT_Pos new_delta; - FT_Pos xx1, xx2; - - - /* compute min and max positions for given width, */ - /* assuring that they stay within the coordinate ranges */ - xx1 = warper->x1; - xx2 = warper->x2; - if ( w >= warper->w0 ) - { - xx1 -= w - warper->w0; - if ( xx1 < warper->x1min ) - { - xx2 += warper->x1min - xx1; - xx1 = warper->x1min; - } - } - else - { - xx1 -= w - warper->w0; - if ( xx1 > warper->x1max ) - { - xx2 -= xx1 - warper->x1max; - xx1 = warper->x1max; - } - } - - if ( xx1 < warper->x1 ) - base_distort = warper->x1 - xx1; - else - base_distort = xx1 - warper->x1; - - if ( xx2 < warper->x2 ) - base_distort += warper->x2 - xx2; - else - base_distort += xx2 - warper->x2; - - /* give base distortion a greater weight while scoring */ - base_distort *= 10; - - new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); - new_delta = xx1 - FT_MulFix( X1, new_scale ); - - af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, - base_distort, - segments, num_segments ); - } - - { - FT_Fixed best_scale = warper->best_scale; - FT_Pos best_delta = warper->best_delta; - - - hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) - + best_delta; - hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) - + best_delta; - - *a_scale = best_scale; - *a_delta = best_delta; - } - } - -#else /* !AF_CONFIG_OPTION_USE_WARPER */ - - /* ANSI C doesn't like empty source files */ - typedef int _af_warp_dummy; - -#endif /* !AF_CONFIG_OPTION_USE_WARPER */ - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afwarp.h b/ThirdParty/freetype/src/autofit/afwarp.h deleted file mode 100644 index 9a2c9a4..0000000 --- a/ThirdParty/freetype/src/autofit/afwarp.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** - * - * afwarp.h - * - * Auto-fitter warping algorithm (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 AFWARP_H_ -#define AFWARP_H_ - -#include "afhints.h" - -FT_BEGIN_HEADER - -#define AF_WARPER_SCALE - -#define AF_WARPER_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) -#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) - - - typedef FT_Int32 AF_WarpScore; - - typedef struct AF_WarperRec_ - { - FT_Pos x1, x2; - FT_Pos t1, t2; - FT_Pos x1min, x1max; - FT_Pos x2min, x2max; - FT_Pos w0, wmin, wmax; - - FT_Fixed best_scale; - FT_Pos best_delta; - AF_WarpScore best_score; - AF_WarpScore best_distort; - - } AF_WarperRec, *AF_Warper; - - -#ifdef AF_CONFIG_OPTION_USE_WARPER - FT_LOCAL( void ) - af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Pos *a_delta ); -#endif - - -FT_END_HEADER - - -#endif /* AFWARP_H_ */ - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/afwrtsys.h b/ThirdParty/freetype/src/autofit/afwrtsys.h deleted file mode 100644 index 5611cf4..0000000 --- a/ThirdParty/freetype/src/autofit/afwrtsys.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** - * - * afwrtsys.h - * - * Auto-fitter writing systems (specification only). - * - * Copyright (C) 2013-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 AFWRTSYS_H_ -#define AFWRTSYS_H_ - - /* Since preprocessor directives can't create other preprocessor */ - /* directives, we have to include the header files manually. */ - -#include "afdummy.h" -#include "aflatin.h" -#include "afcjk.h" -#include "afindic.h" -#ifdef FT_OPTION_AUTOFIT2 -#include "aflatin2.h" -#endif - -#endif /* AFWRTSYS_H_ */ - - - /* The following part can be included multiple times. */ - /* Define `WRITING_SYSTEM' as needed. */ - - - /* Add new writing systems here. The arguments are the writing system */ - /* name in lowercase and uppercase, respectively. */ - - WRITING_SYSTEM( dummy, DUMMY ) - WRITING_SYSTEM( latin, LATIN ) - WRITING_SYSTEM( cjk, CJK ) - WRITING_SYSTEM( indic, INDIC ) -#ifdef FT_OPTION_AUTOFIT2 - WRITING_SYSTEM( latin2, LATIN2 ) -#endif - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/autofit.c b/ThirdParty/freetype/src/autofit/autofit.c deleted file mode 100644 index facfec1..0000000 --- a/ThirdParty/freetype/src/autofit/autofit.c +++ /dev/null @@ -1,38 +0,0 @@ -/**************************************************************************** - * - * autofit.c - * - * Auto-fitter module (body). - * - * 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. - * - */ - - -#define FT_MAKE_OPTION_SINGLE_OBJECT -#include <ft2build.h> - -#include "afangles.c" -#include "afblue.c" -#include "afcjk.c" -#include "afdummy.c" -#include "afglobal.c" -#include "afhints.c" -#include "afindic.c" -#include "aflatin.c" -#include "aflatin2.c" -#include "afloader.c" -#include "afmodule.c" -#include "afranges.c" -#include "afshaper.c" -#include "afwarp.c" - - -/* END */ diff --git a/ThirdParty/freetype/src/autofit/module.mk b/ThirdParty/freetype/src/autofit/module.mk deleted file mode 100644 index cf77b16..0000000 --- a/ThirdParty/freetype/src/autofit/module.mk +++ /dev/null @@ -1,23 +0,0 @@ -# -# FreeType 2 auto-fitter module definition -# - - -# 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. - - -FTMODULE_H_COMMANDS += AUTOFIT_MODULE - -define AUTOFIT_MODULE -$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER) -$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) -endef - -# EOF diff --git a/ThirdParty/freetype/src/autofit/rules.mk b/ThirdParty/freetype/src/autofit/rules.mk deleted file mode 100644 index c59da33..0000000 --- a/ThirdParty/freetype/src/autofit/rules.mk +++ /dev/null @@ -1,88 +0,0 @@ -# -# FreeType 2 auto-fitter module configuration rules -# - - -# 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. - - -# AUTOF driver directory -# -AUTOF_DIR := $(SRC_DIR)/autofit - - -# compilation flags for the driver -# -AUTOF_COMPILE := $(CC) $(ANSIFLAGS) \ - $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR)) \ - $(INCLUDE_FLAGS) \ - $(FT_CFLAGS) - - -# AUTOF driver sources (i.e., C files) -# -AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \ - $(AUTOF_DIR)/afblue.c \ - $(AUTOF_DIR)/afcjk.c \ - $(AUTOF_DIR)/afdummy.c \ - $(AUTOF_DIR)/afglobal.c \ - $(AUTOF_DIR)/afhints.c \ - $(AUTOF_DIR)/afindic.c \ - $(AUTOF_DIR)/aflatin.c \ - $(AUTOF_DIR)/afloader.c \ - $(AUTOF_DIR)/afmodule.c \ - $(AUTOF_DIR)/afranges.c \ - $(AUTOF_DIR)/afshaper.c \ - $(AUTOF_DIR)/afwarp.c - -# AUTOF driver headers -# -AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h) \ - $(AUTOF_DIR)/afcover.h \ - $(AUTOF_DIR)/aferrors.h \ - $(AUTOF_DIR)/afscript.h \ - $(AUTOF_DIR)/afstyles.h \ - $(AUTOF_DIR)/aftypes.h \ - $(AUTOF_DIR)/afwrtsys.h - - -# AUTOF driver object(s) -# -# AUTOF_DRV_OBJ_M is used during `multi' builds. -# AUTOF_DRV_OBJ_S is used during `single' builds. -# -AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O) -AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O - -# AUTOF driver source file for single build -# -AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c - - -# AUTOF driver - single object -# -$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \ - $(FREETYPE_H) $(AUTOF_DRV_H) - $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S)) - - -# AUTOF driver - multiple objects -# -$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H) - $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) - - -# update main driver object lists -# -DRV_OBJS_S += $(AUTOF_DRV_OBJ_S) -DRV_OBJS_M += $(AUTOF_DRV_OBJ_M) - - -# EOF |