From ae26c684db915db4f2dbb7892b03287ebad141b9 Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 25 Feb 2003 20:37:50 +0000 Subject: [PATCH] * src/cache/ftccmap.c: the cmap cache now supports UCS-4 charmaps when available in Asian fonts * src/sfnt/ttload.c, src/base/ftobjs.c: changed "asian" to "Asian" in comments * src/truetype/ttdriver.c (Set_Char_Sizes): fixed a rounding bug when computing the scale factors for a given character size in points with resolution. --- ChangeLog | 21 +++++++++++++---- src/base/ftobjs.c | 2 +- src/cache/ftccmap.c | 51 ++++++++++++++++++++++++++++++++++++++--- src/sfnt/ttload.c | 2 +- src/truetype/ttdriver.c | 4 ++-- 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 53da3db25..2bf5efb5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,27 +1,38 @@ +2003-02-25 Anthony Fok + + * src/cache/ftccmap.c: the cmap cache now supports UCS-4 charmaps + when available in Asian fonts + + * src/sfnt/ttload.c, src/base/ftobjs.c: changed "asian" to "Asian" in + comments + 2003-02-25 David Turner * src/gzip/ftgzip.c: fixed a bug that caused FreeType to loop endlessly when trying to read certain compressed gzip files. The following test could be used to reveal the bug: - + touch 0123456789 ; gzip 0123456789 ; ftdump 0123456789.gz * src/pfr/pfrobjs.c, src/pfr/pfrload.c, src/pfr/pfrtypes.h: several fixes to the PFR font driver: - + - the list of available embedded bitmaps was not correctly set in the root FT_FaceRec structure describing the face - + - the glyph loader always tried to load the outlines when FT_LOAD_SBITS_ONLY was specified - + - the table loaded now scans for *undocumented* elements of a physical font's auxiliary data record, this is necessary to retrieve the "real" family and style names. - + NOTE THAT THIS CHANGES THE FAMILY NAME OF MANY PFR FONTS !! + * src/truetype/ttdriver.c (Set_Char_Sizes): fixed a rounding bug when + computing the scale factors for a given character size in points with + resolution. 2003-02-18 David Turner diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 3254738c7..433ebdb5f 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -739,7 +739,7 @@ * however, recent updates to the Apple and OpenType specifications * introduced new formats that are capable of mapping 32-bit character * codes as well. And these are already used on some fonts, mainly to - * map non-BMP asian ideographs as defined in Unicode. + * map non-BMP Asian ideographs as defined in Unicode. * * for compatibility purposes, these fonts generally come with * *several* Unicode charmaps: diff --git a/src/cache/ftccmap.c b/src/cache/ftccmap.c index 4f575dbac..77e6ecbd5 100644 --- a/src/cache/ftccmap.c +++ b/src/cache/ftccmap.c @@ -23,6 +23,7 @@ #include FT_CACHE_MANAGER_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H #include "ftcerror.h" @@ -189,10 +190,54 @@ break; case FTC_CMAP_BY_ENCODING: - for ( idx = 0; idx < count; idx++, cur++ ) - if ( cur[0]->encoding == desc->u.encoding ) - break; + if (desc->u.encoding == FT_ENCODING_UNICODE) + { + /* since the `interesting' table, with id's 3,10, is normally the + * last one, we loop backwards. This looses with type1 fonts with + * non-BMP characters (<.0001%), this wins with .ttf with non-BMP + * chars (.01% ?), and this is the same about 99.99% of the time! + */ + FT_UInt unicmap_idx = count; /* some UCS-2 map, if we found it */ + + cur += count - 1; + + for ( idx = 0; idx < count; idx++, cur-- ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + unicmap_idx = idx; /* record we found a Unicode charmap */ + + /* XXX If some new encodings to represent UCS-4 are added, + * they should be added here. + */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + + /* Hurray! We found a UCS-4 charmap. We can stop the scan! */ + { + idx = count - 1 - idx; + goto Found_idx_for_FTC_CMAP_BY_ENCODING; + } + } + } + + /* We do not have any UCS-4 charmap. Sigh. + * Let's see if we have some other kind of Unicode charmap, though. + */ + if ( unicmap_idx < count ) + idx = count - 1 - unicmap_idx; + } + else + { + for ( idx = 0; idx < count; idx++, cur++ ) + if ( cur[0]->encoding == desc->u.encoding ) + break; + } + + Found_idx_for_FTC_CMAP_BY_ENCODING: hash = idx * 67; break; diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index 530dff6d7..7a79503f9 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -1106,7 +1106,7 @@ if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) goto Exit; - /* Some popular asian fonts have an invalid `storageOffset' value */ + /* Some popular Asian fonts have an invalid `storageOffset' value */ /* (it should be at least "6 + 12*num_names"). However, the string */ /* offsets, computed as "storageOffset + entry->stringOffset", are */ /* valid pointers within the name table... */ diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index c4d1de484..cc58b0606 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -208,8 +208,8 @@ /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ - dim_x = ( ( ( char_width * horz_resolution ) / 72 ) + 32 ) & -64; - dim_y = ( ( ( char_height * vert_resolution ) / 72 ) + 32 ) & -64; + dim_x = ( char_width * horz_resolution + 36 ) / 72; + dim_y = ( char_height * vert_resolution + 36 ) / 72; metrics2->x_ppem = (FT_UShort)( dim_x >> 6 ); metrics2->y_ppem = (FT_UShort)( dim_y >> 6 );