From 25dba9cfa8418b77f2af7ee5165f0d97dff98f0b Mon Sep 17 00:00:00 2001 From: suzuki toshiya Date: Sat, 1 Aug 2009 00:32:09 +0900 Subject: [PATCH] truetype: Extend TT_Face->num_locations for broken TTFs. --- ChangeLog | 13 +++++++++++++ include/freetype/internal/tttypes.h | 2 +- src/truetype/ttpload.c | 10 +++++----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5279c9d3c..09e004857 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2009-07-31 suzuki toshiya + + truetype: Extend TT_Face->num_locations for broken TTFs. + + * include/freetype/internal/tttypes.h: + TT_Face->num_locations are extended from FT_UInt + to FT_ULong, to stand with broken huge loca table. + Some people insists there are broken TTF including + the glyphs over 16-bit limitation, in PRC market. + * src/truetype/ttpload.c (tt_face_load_loca): + Remove unrequired 16-bit truncation for FT_UInt + TT_Face->num_locations. + 2009-07-31 suzuki toshiya smooth: Fix some data types mismatching with their sources. diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 85fc27f74..737d9329b 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1401,7 +1401,7 @@ FT_BEGIN_HEADER FT_Byte* vert_metrics; FT_ULong vert_metrics_size; - FT_UInt num_locations; + FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ FT_Byte* glyph_locations; FT_Byte* hdmx_table; diff --git a/src/truetype/ttpload.c b/src/truetype/ttpload.c index f691269d2..a311b03c0 100644 --- a/src/truetype/ttpload.c +++ b/src/truetype/ttpload.c @@ -95,7 +95,7 @@ error = TT_Err_Invalid_Table; goto Exit; } - face->num_locations = (FT_UInt)( table_len >> shift ); + face->num_locations = table_len >> shift; } else { @@ -107,16 +107,16 @@ error = TT_Err_Invalid_Table; goto Exit; } - face->num_locations = (FT_UInt)( table_len >> shift ); + face->num_locations = table_len >> shift; } - if ( face->num_locations != (FT_UInt)face->root.num_glyphs ) + if ( face->num_locations != (FT_ULong)face->root.num_glyphs ) { FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", face->num_locations, face->root.num_glyphs )); /* we only handle the case where `maxp' gives a larger value */ - if ( face->num_locations < (FT_UInt)face->root.num_glyphs ) + if ( face->num_locations < (FT_ULong)face->root.num_glyphs ) { FT_Long new_loca_len = (FT_Long)face->root.num_glyphs << shift; @@ -139,7 +139,7 @@ if ( new_loca_len <= dist ) { - face->num_locations = (FT_Long)face->root.num_glyphs; + face->num_locations = face->root.num_glyphs; table_len = new_loca_len; FT_TRACE2(( "adjusting num_locations to %d\n",