ref: a42567bf66bec844db9278f86afc852db164e8e3
parent: b1be9e8b5708716819d46c913dbf7c209351a0aa
author: David Turner <[email protected]>
date: Thu Jan 25 07:23:37 EST 2007
- same CFF loader fix (stricter checking though than Werner's version) - document light auto-hinter improvements
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-01-25 David Turner <[email protected]>
+
+ * src/cff/cffload.c (cff_index_get_pointers): fixed a bug in the
+ sanity check which caused the last entry in each index to become
+ empty. since this function is only used to load local and global
+ functions, this meant that any charstring that called the last
+ local/global function would fail.
+
+ * src/cff/cffgload.c: fixed sanity check for empty functions
+
+ * docs/CHANGES: document light auto-hinting improvement
+
2007-01-25 Werner Lemberg <[email protected]>
* src/cff/cffload.c (cff_index_get_pointers): Handle last entry
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -8,6 +8,15 @@
- A typo in a security check introduced after version 2.2.1
prevented FreeType to render some glyphs in CFF fonts.
+ II. IMPORTANT CHANGES
+
+ - the light auto-hinting mode has been improved and should generate
+ less blurry text in many cases, without changing spacing. This is
+ done by slightly translating/dilating the outline in the horizontal
+ direction in order to better align its features to the pixel grid.
+
+ since the transform is entirely linear, this still provides very
+ good approximations to the original glyph shapes.
======================================================================
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -2089,7 +2089,7 @@
zone->limit = decoder->locals[idx + 1];
zone->cursor = zone->base;
- if ( !zone->base )
+ if ( !zone->base || zone->limit == zone->base )
{
FT_ERROR(( "cff_decoder_parse_charstrings:"
" invoking empty subrs!\n" ));
@@ -2131,7 +2131,7 @@
zone->limit = decoder->globals[idx + 1];
zone->cursor = zone->base;
- if ( !zone->base )
+ if ( !zone->base || zone->limit == zone->base )
{
FT_ERROR(( "cff_decoder_parse_charstrings:"
" invoking empty subrs!\n" ));
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -403,11 +403,13 @@
if ( !offset )
offset = old_offset;
- /* sanity check for invalid offset tables */
- else if ( offset < old_offset ||
- offset - 1 > idx->data_size )
+ /* two sanity checks for invalid offset tables */
+ else if ( offset < old_offset )
offset = old_offset;
+ else if ( offset-1 >= idx->data_size && n < idx->count )
+ offset = old_offset;
+
t[n] = idx->bytes + offset - 1;
old_offset = offset;