changeset 110376:cc92458a9829

ftfont.c (ftfont_check_otf): Fix the case of checking just existence of GSUB or GPOS.
author Kenichi Handa <handa@m17n.org>
date Thu, 16 Sep 2010 10:51:56 +0900
parents 6e2c9bc108c6
children 6dcf9897d91a
files src/ChangeLog src/ftfont.c
diffstat 2 files changed, 50 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Sep 08 13:08:19 2010 +0900
+++ b/src/ChangeLog	Thu Sep 16 10:51:56 2010 +0900
@@ -1,3 +1,8 @@
+2010-09-14  Kenichi Handa  <handa@m17n.org>
+
+	* ftfont.c (ftfont_check_otf): Fix the case of checking just
+	existence of GSUB or GPOS.
+
 2010-09-05  Juanma Barranquero  <lekktu@gmail.com>
 
 	* biditype.h: Regenerate.
--- a/src/ftfont.c	Wed Sep 08 13:08:19 2010 +0900
+++ b/src/ftfont.c	Thu Sep 16 10:51:56 2010 +0900
@@ -1637,32 +1637,55 @@
   OTF_Tag *tags;
   int i, n, negative;
 
+  if (spec->features[0] && spec->features[0][0] ==0
+      && spec->features[1] && spec->features[1][0] ==0)
+    /* Return 1 iff any of GSUB or GPOS support the script (and language).  */
+    return (otf
+	    && (OTF_check_features (otf, 0, spec->script, spec->langsys,
+				    NULL, 0) > 0
+		|| OTF_check_features (otf, 1, spec->script, spec->langsys,
+				       NULL, 0) > 0));
+
   for (i = 0; i < 2; i++)
-    {
-      if (! spec->features[i])
-	continue;
-      for (n = 0; spec->features[i][n]; n++);
-      tags = alloca (sizeof (OTF_Tag) * n);
-      for (n = 0, negative = 0; spec->features[i][n]; n++)
-	{
-	  if (spec->features[i][n] == 0xFFFFFFFF)
-	    negative = 1;
-	  else if (negative)
-	    tags[n - 1] = spec->features[i][n] | 0x80000000;
-	  else
-	    tags[n] = spec->features[i][n];
-	}
+    if (! spec->features[i] || spec->features[i][0] != 0)
+      {
+	int no_feature = ! otf || OTF_get_features (otf, i == 0) < 0;
+	if (! spec->features[i])
+	  {
+	    if (no_feature)
+	      continue;
+	    return 0;
+	  }
+	if (spec->features[i][0] == 0xFFFFFFFF)
+	  {
+	    if (no_feature)
+	      continue;
+	  }
+	else if (no_feature)
+	  return 0;
+	/* Now (! no_feature) */
+	for (n = 1; spec->features[i][n]; n++);
+	tags = alloca (sizeof (OTF_Tag) * n);
+	for (n = 0, negative = 0; spec->features[i][n]; n++)
+	  {
+	    if (spec->features[i][n] == 0xFFFFFFFF)
+	      negative = 1;
+	    else if (negative)
+	      tags[n - 1] = spec->features[i][n] | 0x80000000;
+	    else
+	      tags[n] = spec->features[i][n];
+	  }
 #ifdef M17N_FLT_USE_NEW_FEATURE
-      if (OTF_check_features (otf, i == 0, spec->script, spec->langsys,
-			      tags, n - negative) != 1)
-	return 0;
+	if (OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+				tags, n - negative) != 1)
+	  return 0;
 #else  /* not M17N_FLT_USE_NEW_FEATURE */
-      if (n - negative > 0
-	  && OTF_check_features (otf, i == 0, spec->script, spec->langsys,
-				 tags, n - negative) != 1)
-	return 0;
+	if (n - negative > 0
+	    && OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+				   tags, n - negative) != 1)
+	  return 0;
 #endif	/* not M17N_FLT_USE_NEW_FEATURE */
-    }
+      }
   return 1;
 }