shithub: freetype+ttf2subf

Download patch

ref: 1b5bc897540e7dc3c6414dcbadd565c85271c707
parent: a42f918434ec132737b2107a2d7356d02d4919bc
author: Werner Lemberg <[email protected]>
date: Fri Jan 3 13:33:24 EST 2014

[autofit] Fix handling of default coverages.

With this commit, the implementation of coverage handling is
completed.

* src/autofit/hbshim.c (af_get_coverage): Exit early if nothing to
do.
Reject coverages which don't contain appropriate glyphs for blue
zones.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,18 @@
 
 	[autofit] Fix handling of default coverages.
 
+	With this commit, the implementation of coverage handling is
+	completed.
+
+	* src/autofit/hbshim.c (af_get_coverage): Exit early if nothing to
+	do.
+	Reject coverages which don't contain appropriate glyphs for blue
+	zones.
+
+2014-01-03  Werner Lemberg  <[email protected]>
+
+	[autofit] Fix handling of default coverages.
+
 	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
 	First handle non-default coverages, then the default coverage of the
 	default script, and finally the other default coverages.
--- a/src/autofit/hbshim.c
+++ b/src/autofit/hbshim.c
@@ -166,6 +166,10 @@
                                   NULL,
                                   coverage_tags,
                                   gsub_lookups );
+
+    if ( hb_set_is_empty( gsub_lookups ) )
+      return FT_Err_Ok; /* nothing to do */
+
     hb_ot_layout_collect_lookups( face,
                                   HB_OT_TAG_GPOS,
                                   script_tags,
@@ -234,6 +238,53 @@
       FT_TRACE4(( " (none)" ));
     FT_TRACE4(( "\n\n" ));
 #endif
+
+    /*
+     * We now check whether we can construct blue zones, using glyphs
+     * covered by the feature only.  In case there is not a single zone
+     * (this is, not a single character is covered), we skip this coverage.
+     *
+     */
+    {
+      AF_Blue_Stringset         bss = style_class->blue_stringset;
+      const AF_Blue_StringRec*  bs  = &af_blue_stringsets[bss];
+
+      FT_Bool  found = 0;
+
+
+      for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
+      {
+        const char*  p = &af_blue_strings[bs->string];
+
+
+        while ( *p )
+        {
+          hb_codepoint_t  ch;
+
+
+          GET_UTF8_CHAR( ch, p );
+
+          for ( idx = -1; hb_set_next( gsub_lookups, &idx ); )
+          {
+            hb_codepoint_t  gidx = FT_Get_Char_Index( globals->face, ch );
+
+
+            if ( hb_ot_layout_lookup_would_substitute( face, idx,
+                                                       &gidx, 1, 1 ) )
+            {
+              found = 1;
+              break;
+            }
+          }
+        }
+      }
+
+      if ( !found )
+      {
+        FT_TRACE4(( "  no blue characters found; style skipped\n" ));
+        return FT_Err_Ok;
+      }
+    }
 
     /*
      * Various OpenType features might use the same glyphs at different