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; |
+} |