Commit 1b5bc897540e7dc3c6414dcbadd565c85271c707

Werner Lemberg 2014-01-03T18:33:24

[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.

diff --git a/ChangeLog b/ChangeLog
index 0dcd4a7..148e8d9 100644
--- 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  <wl@gnu.org>
+
+	[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.
diff --git a/src/autofit/hbshim.c b/src/autofit/hbshim.c
index b352545..844c6bb 100644
--- 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,
@@ -236,6 +240,53 @@
 #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
      * vertical positions; for example, superscript and subscript glyphs
      * could be the same.  However, FreeType's auto-hinting is completely