| Index: core/src/fxge/freetype/fx_freetype.c
|
| diff --git a/core/src/fxge/freetype/fx_freetype.c b/core/src/fxge/freetype/fx_freetype.c
|
| index fe144d69a6edb377d2093b5c6981037e1cc551c3..78dec9ad9932141e72fab31a03c9a0fd4f99a5c5 100644
|
| --- a/core/src/fxge/freetype/fx_freetype.c
|
| +++ b/core/src/fxge/freetype/fx_freetype.c
|
| @@ -7,176 +7,176 @@
|
| #include "../../../include/fxge/fx_freetype.h"
|
| #include "../../../../third_party/freetype/src/psnames/pstables.h"
|
|
|
| -static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, wchar_t unicode)
|
| -{
|
| - int i, count;
|
| -
|
| - // copy letters
|
| - while (1) {
|
| - glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
|
| - name_offset++;
|
| - table_offset++;
|
| - if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) break;
|
| - }
|
| - glyph_name[name_offset] = 0;
|
| -
|
| - // get child count
|
| - count = ft_adobe_glyph_list[table_offset] & 0x7f;
|
| -
|
| - // check if we have value for this node
|
| - if (ft_adobe_glyph_list[table_offset] & 0x80) {
|
| - unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + ft_adobe_glyph_list[table_offset + 2];
|
| - if (thiscode == (unsigned short)unicode) // found it!
|
| - return 1;
|
| - table_offset += 3;
|
| - }
|
| - else
|
| - table_offset++;
|
| -
|
| - // now search in sub-nodes
|
| - if (count == 0) return 0;
|
| - for (i = 0; i < count; i++) {
|
| - int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + ft_adobe_glyph_list[table_offset + i * 2 + 1];
|
| - if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
|
| - // found in child
|
| - return 1;
|
| - }
|
| - return 0;
|
| +static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, wchar_t unicode)
|
| +{
|
| + int i, count;
|
| +
|
| + // copy letters
|
| + while (1) {
|
| + glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
|
| + name_offset++;
|
| + table_offset++;
|
| + if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) break;
|
| + }
|
| + glyph_name[name_offset] = 0;
|
| +
|
| + // get child count
|
| + count = ft_adobe_glyph_list[table_offset] & 0x7f;
|
| +
|
| + // check if we have value for this node
|
| + if (ft_adobe_glyph_list[table_offset] & 0x80) {
|
| + unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + ft_adobe_glyph_list[table_offset + 2];
|
| + if (thiscode == (unsigned short)unicode) // found it!
|
| + return 1;
|
| + table_offset += 3;
|
| + }
|
| + else
|
| + table_offset++;
|
| +
|
| + // now search in sub-nodes
|
| + if (count == 0) return 0;
|
| + for (i = 0; i < count; i++) {
|
| + int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + ft_adobe_glyph_list[table_offset + i * 2 + 1];
|
| + if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
|
| + // found in child
|
| + return 1;
|
| + }
|
| + return 0;
|
| }
|
|
|
| #define VARIANT_BIT 0x80000000UL
|
|
|
| -int FXFT_unicode_from_adobe_name(const char* glyph_name)
|
| -{
|
| - /* If the name begins with `uni', then the glyph name may be a */
|
| - /* hard-coded unicode character code. */
|
| - if (glyph_name[0] == 'u' &&
|
| - glyph_name[1] == 'n' &&
|
| - glyph_name[2] == 'i')
|
| - {
|
| - /* determine whether the next four characters following are */
|
| - /* hexadecimal. */
|
| -
|
| - /* XXX: Add code to deal with ligatures, i.e. glyph names like */
|
| - /* `uniXXXXYYYYZZZZ'... */
|
| -
|
| - FT_Int count;
|
| - FT_UInt32 value = 0;
|
| - const char* p = glyph_name + 3;
|
| -
|
| -
|
| - for (count = 4; count > 0; count--, p++)
|
| - {
|
| - char c = *p;
|
| - unsigned int d;
|
| -
|
| -
|
| - d = (unsigned char)c - '0';
|
| - if (d >= 10)
|
| - {
|
| - d = (unsigned char)c - 'A';
|
| - if (d >= 6)
|
| - d = 16;
|
| - else
|
| - d += 10;
|
| - }
|
| -
|
| - /* Exit if a non-uppercase hexadecimal character was found */
|
| - /* -- this also catches character codes below `0' since such */
|
| - /* negative numbers cast to `unsigned int' are far too big. */
|
| - if (d >= 16)
|
| - break;
|
| -
|
| - value = (value << 4) + d;
|
| - }
|
| -
|
| - /* there must be exactly four hex digits */
|
| - if (count == 0)
|
| - {
|
| - if (*p == '\0')
|
| - return value;
|
| - if (*p == '.')
|
| - return (FT_UInt32)(value | VARIANT_BIT);
|
| - }
|
| - }
|
| -
|
| - /* If the name begins with `u', followed by four to six uppercase */
|
| - /* hexadecimal digits, it is a hard-coded unicode character code. */
|
| - if (glyph_name[0] == 'u')
|
| - {
|
| - FT_Int count;
|
| - FT_UInt32 value = 0;
|
| - const char* p = glyph_name + 1;
|
| -
|
| -
|
| - for (count = 6; count > 0; count--, p++)
|
| - {
|
| - char c = *p;
|
| - unsigned int d;
|
| -
|
| -
|
| - d = (unsigned char)c - '0';
|
| - if (d >= 10)
|
| - {
|
| - d = (unsigned char)c - 'A';
|
| - if (d >= 6)
|
| - d = 16;
|
| - else
|
| - d += 10;
|
| - }
|
| -
|
| - if (d >= 16)
|
| - break;
|
| -
|
| - value = (value << 4) + d;
|
| - }
|
| -
|
| - if (count <= 2)
|
| - {
|
| - if (*p == '\0')
|
| - return value;
|
| - if (*p == '.')
|
| - return (FT_UInt32)(value | VARIANT_BIT);
|
| - }
|
| - }
|
| -
|
| - /* Look for a non-initial dot in the glyph name in order to */
|
| - /* find variants like `A.swash', `e.final', etc. */
|
| - {
|
| - const char* p = glyph_name;
|
| - const char* dot = NULL;
|
| -
|
| -
|
| - for (; *p; p++)
|
| - {
|
| - if (*p == '.' && p > glyph_name)
|
| - {
|
| - dot = p;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - /* now look up the glyph in the Adobe Glyph List */
|
| - if (!dot)
|
| - return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p);
|
| - else
|
| - return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) |
|
| - VARIANT_BIT);
|
| - }
|
| -}
|
| -
|
| -void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode)
|
| -{
|
| - int i, count;
|
| -
|
| - // start from top level node
|
| - count = ft_adobe_glyph_list[1];
|
| - for (i = 0; i < count; i++) {
|
| - int child_offset = ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3];
|
| - if (xyq_search_node(glyph_name, 0, child_offset, unicode))
|
| - return;
|
| - }
|
| -
|
| - // failed, clear the buffer
|
| - glyph_name[0] = 0;
|
| -}
|
| +int FXFT_unicode_from_adobe_name(const char* glyph_name)
|
| +{
|
| + /* If the name begins with `uni', then the glyph name may be a */
|
| + /* hard-coded unicode character code. */
|
| + if (glyph_name[0] == 'u' &&
|
| + glyph_name[1] == 'n' &&
|
| + glyph_name[2] == 'i')
|
| + {
|
| + /* determine whether the next four characters following are */
|
| + /* hexadecimal. */
|
| +
|
| + /* XXX: Add code to deal with ligatures, i.e. glyph names like */
|
| + /* `uniXXXXYYYYZZZZ'... */
|
| +
|
| + FT_Int count;
|
| + FT_UInt32 value = 0;
|
| + const char* p = glyph_name + 3;
|
| +
|
| +
|
| + for (count = 4; count > 0; count--, p++)
|
| + {
|
| + char c = *p;
|
| + unsigned int d;
|
| +
|
| +
|
| + d = (unsigned char)c - '0';
|
| + if (d >= 10)
|
| + {
|
| + d = (unsigned char)c - 'A';
|
| + if (d >= 6)
|
| + d = 16;
|
| + else
|
| + d += 10;
|
| + }
|
| +
|
| + /* Exit if a non-uppercase hexadecimal character was found */
|
| + /* -- this also catches character codes below `0' since such */
|
| + /* negative numbers cast to `unsigned int' are far too big. */
|
| + if (d >= 16)
|
| + break;
|
| +
|
| + value = (value << 4) + d;
|
| + }
|
| +
|
| + /* there must be exactly four hex digits */
|
| + if (count == 0)
|
| + {
|
| + if (*p == '\0')
|
| + return value;
|
| + if (*p == '.')
|
| + return (FT_UInt32)(value | VARIANT_BIT);
|
| + }
|
| + }
|
| +
|
| + /* If the name begins with `u', followed by four to six uppercase */
|
| + /* hexadecimal digits, it is a hard-coded unicode character code. */
|
| + if (glyph_name[0] == 'u')
|
| + {
|
| + FT_Int count;
|
| + FT_UInt32 value = 0;
|
| + const char* p = glyph_name + 1;
|
| +
|
| +
|
| + for (count = 6; count > 0; count--, p++)
|
| + {
|
| + char c = *p;
|
| + unsigned int d;
|
| +
|
| +
|
| + d = (unsigned char)c - '0';
|
| + if (d >= 10)
|
| + {
|
| + d = (unsigned char)c - 'A';
|
| + if (d >= 6)
|
| + d = 16;
|
| + else
|
| + d += 10;
|
| + }
|
| +
|
| + if (d >= 16)
|
| + break;
|
| +
|
| + value = (value << 4) + d;
|
| + }
|
| +
|
| + if (count <= 2)
|
| + {
|
| + if (*p == '\0')
|
| + return value;
|
| + if (*p == '.')
|
| + return (FT_UInt32)(value | VARIANT_BIT);
|
| + }
|
| + }
|
| +
|
| + /* Look for a non-initial dot in the glyph name in order to */
|
| + /* find variants like `A.swash', `e.final', etc. */
|
| + {
|
| + const char* p = glyph_name;
|
| + const char* dot = NULL;
|
| +
|
| +
|
| + for (; *p; p++)
|
| + {
|
| + if (*p == '.' && p > glyph_name)
|
| + {
|
| + dot = p;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + /* now look up the glyph in the Adobe Glyph List */
|
| + if (!dot)
|
| + return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p);
|
| + else
|
| + return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) |
|
| + VARIANT_BIT);
|
| + }
|
| +}
|
| +
|
| +void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode)
|
| +{
|
| + int i, count;
|
| +
|
| + // start from top level node
|
| + count = ft_adobe_glyph_list[1];
|
| + for (i = 0; i < count; i++) {
|
| + int child_offset = ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3];
|
| + if (xyq_search_node(glyph_name, 0, child_offset, unicode))
|
| + return;
|
| + }
|
| +
|
| + // failed, clear the buffer
|
| + glyph_name[0] = 0;
|
| +}
|
|
|