fontconfig: Branch 'master' - 24 commits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 Makefile.am                     |    2 
 configure.ac                    |    2 
 doc/fcblanks.fncs               |   14 -
 doc/fcconfig.fncs               |    7 
 doc/fcfreetype.fncs             |   17 -
 doc/fontconfig-devel.sgml       |   10 
 fc-blanks/Makefile.am           |   46 ----
 fc-blanks/fc-blanks.py          |  160 -------------
 fc-blanks/fcblanks.tmpl.h       |   25 --
 fc-blanks/list-unicodeset.html  |  119 ----------
 fc-glyphname/Makefile.am        |   33 --
 fc-glyphname/fc-glyphname.c     |  325 ----------------------------
 fc-glyphname/fcglyphname.tmpl.h |   25 --
 fc-glyphname/zapfdingbats.txt   |  212 ------------------
 fc-scan/fc-scan.c               |   18 -
 fc-scan/fc-scan.sgml            |   14 -
 src/Makefile.am                 |    4 
 src/fcblanks.c                  |  108 ---------
 src/fccfg.c                     |   69 +++---
 src/fcdir.c                     |   28 --
 src/fcfreetype.c                |  458 ++++++++--------------------------------
 src/fcint.h                     |   16 -
 src/fcxml.c                     |   54 ----
 23 files changed, 180 insertions(+), 1586 deletions(-)

New commits:
commit c524522bb45f71dfeaa8fd1ec277537dd6e85afa
Merge: 339de16 8b46a51
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Tue Sep 12 17:10:03 2017 -0400

    Merge branch 'faster'
    
    Results in 5x to 10x speedup in scanning.
    
    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=64766

commit 8b46a518bda8ecb3c5e2dfb0c1e5fda99e40aa3e
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Tue Sep 12 17:08:08 2017 -0400

    Update documentation for removal of blanks
    
    Patch from Jerry Casiano.

diff --git a/doc/fcblanks.fncs b/doc/fcblanks.fncs
index b0996d6..776ed70 100644
--- a/doc/fcblanks.fncs
+++ b/doc/fcblanks.fncs
@@ -26,7 +26,8 @@
 @TYPE1@		void
 @PURPOSE@	Create an FcBlanks
 @DESC@
-Creates an empty FcBlanks object.
+FcBlanks is deprecated.
+This function always returns NULL.
 @@
 
 @RET@		void
@@ -34,7 +35,8 @@ Creates an empty FcBlanks object.
 @TYPE1@		FcBlanks *			@ARG1@		b
 @PURPOSE@	Destroy and FcBlanks
 @DESC@
-Destroys an FcBlanks object, freeing any associated memory.
+FcBlanks is deprecated.
+This function does nothing.
 @@
 
 @RET@		FcBool
@@ -43,8 +45,8 @@ Destroys an FcBlanks object, freeing any associated memory.
 @TYPE2@		FcChar32% 			@ARG2@		ucs4
 @PURPOSE@	Add a character to an FcBlanks
 @DESC@
-Adds a single character to an FcBlanks object, returning FcFalse
-if this process ran out of memory.
+FcBlanks is deprecated.
+This function always returns FALSE.
 @@
 
 @RET@		FcBool
@@ -53,6 +55,6 @@ if this process ran out of memory.
 @TYPE2@		FcChar32% 			@ARG2@		ucs4
 @PURPOSE@	Query membership in an FcBlanks
 @DESC@
-Returns whether the specified FcBlanks object contains the indicated Unicode
-value.
+FcBlanks is deprecated.
+This function always returns FALSE.
 @@
diff --git a/doc/fcconfig.fncs b/doc/fcconfig.fncs
index 7377192..80f9b58 100644
--- a/doc/fcconfig.fncs
+++ b/doc/fcconfig.fncs
@@ -181,11 +181,8 @@ If <parameter>config</parameter> is NULL, the current configuration is used.
 @TYPE1@         FcConfig *                      @ARG1@          config
 @PURPOSE@	Get config blanks
 @DESC@
-Returns the FcBlanks object associated with the given configuration, if no
-blanks were present in the configuration, this function will return 0.
-The returned FcBlanks object if not NULL, is valid as long as the owning
-FcConfig is alive.
-If <parameter>config</parameter> is NULL, the current configuration is used.
+FcBlanks is deprecated.
+This function always returns NULL.
 @@
 
 @RET@           int
diff --git a/doc/fcfreetype.fncs b/doc/fcfreetype.fncs
index e4cca46..15a9fc4 100644
--- a/doc/fcfreetype.fncs
+++ b/doc/fcfreetype.fncs
@@ -47,10 +47,9 @@ higher level functions.
 @TYPE2@         FcBlanks *			@ARG2@          blanks
 @PURPOSE@	compute Unicode coverage
 @DESC@
-Scans a FreeType face and returns the set of encoded Unicode chars.  This scans
-several encoding tables to build as complete a list as possible.  
-If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs
-not in 'blanks' are not placed in the returned FcCharSet.
+Scans a FreeType face and returns the set of encoded Unicode chars.
+FcBlanks is deprecated, <parameter>blanks</parameter> is ignored and
+accepted only for compatibility with older code.
 @@
 
 @SYNOPSIS@
@@ -64,10 +63,8 @@ not in 'blanks' are not placed in the returned FcCharSet.
 @PURPOSE@	compute Unicode coverage and spacing type
 @DESC@
 Scans a FreeType face and returns the set of encoded Unicode chars.
-This scans
-several encoding tables to build as complete a list as possible.  
-If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs
-not in 'blanks' are not placed in the returned FcCharSet.
+FcBlanks is deprecated, <parameter>blanks</parameter> is ignored and
+accepted only for compatibility with older code.
 <parameter>spacing</parameter> receives the computed spacing type of the
 font, one of FC_MONO for a font where all glyphs have the same width,
 FC_DUAL, where the font has glyphs in precisely two widths, one twice as
@@ -88,6 +85,8 @@ widths.
 @DESC@
 Constructs a pattern representing the 'id'th font in 'file'.  The number
 of fonts in 'file' is returned in 'count'.
+FcBlanks is deprecated, <parameter>blanks</parameter> is ignored and
+accepted only for compatibility with older code.
 @@
 
 @SYNOPSIS@
@@ -103,4 +102,6 @@ of fonts in 'file' is returned in 'count'.
 @DESC@
 Constructs a pattern representing 'face'. 'file' and 'id' are used solely as
 data for pattern elements (FC_FILE, FC_INDEX and sometimes FC_FAMILY).
+FcBlanks is deprecated, <parameter>blanks</parameter> is ignored and
+accepted only for compatibility with older code.
 @@
diff --git a/doc/fontconfig-devel.sgml b/doc/fontconfig-devel.sgml
index d0ec8a5..6a6caef 100644
--- a/doc/fontconfig-devel.sgml
+++ b/doc/fontconfig-devel.sgml
@@ -380,6 +380,11 @@ holds a list of Unicode chars which are expected to be blank; unexpectedly
 blank chars are assumed to be invalid and are elided from the charset
 associated with the font.
     </para>
+    <para>
+        FcBlanks is deprecated and should not be used in newly written code.
+        It is still accepted by some functions for compatibility with
+        older code but will be removed in the future.
+    </para>
   </sect2>
   <sect2><title>FcFileCache</title>
     <para>
@@ -558,6 +563,11 @@ empty and not in this list will be assumed to be broken and not placed in
 the FcCharSet associated with the font.  This provides a significantly more
 accurate CharSet for applications.
     </para>
+    <para>
+        FcBlanks is deprecated and should not be used in newly written code.
+        It is still accepted by some functions for compatibility with
+        older code but will be removed in the future.
+    </para>
     &fcblanks;
   </sect2>
   <sect2><title>FcAtomic</title>
commit a8bbbfb601b6d0394525262c543a18bd7699b684
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 18:30:43 2017 +0100

    Minor

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index f2e8a59..dbfe291 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2077,6 +2077,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 {
     FcCharSet	    *fcs;
     int		    o;
+    FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
     FT_Pos	    advances[3];
     unsigned int    num_advances = 0;
 
@@ -2084,6 +2085,15 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
     if (!fcs)
 	goto bail0;
 
+    /* When using scalable fonts, only report those glyphs
+     * which can be scaled; otherwise those fonts will
+     * only be available at some sizes, and never when
+     * transformed.  Avoid this by simply reporting bitmap-only
+     * glyphs as missing
+     */
+    if (face->face_flags & FT_FACE_FLAG_SCALABLE)
+	load_flags |= FT_LOAD_NO_BITMAP;
+
 #if HAVE_FT_SELECT_SIZE
     if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
 	face->num_fixed_sizes > 0 &&
@@ -2122,17 +2132,6 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 	{
 	    FcBool good = FcTrue;
 
-	    FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-	    /* When using scalable fonts, only report those glyphs
-	     * which can be scaled; otherwise those fonts will
-	     * only be available at some sizes, and never when
-	     * transformed.  Avoid this by simply reporting bitmap-only
-	     * glyphs as missing
-	     */
-	    if (face->face_flags & FT_FACE_FLAG_SCALABLE)
-		load_flags |= FT_LOAD_NO_BITMAP;
-
 	    /* CID fonts built by Adobe used to make ASCII control chars to cid1
 	     * (space glyph). As such, always check contour for those characters. */
 	    if (ucs4 <= 0x001F)
commit 60b2cf8e4cf5036442c345c90fcf43f548d11d28
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 17:40:06 2017 +0100

    Call FT_Get_Advance() only as long as we need to determine font width type

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 256ac95..f2e8a59 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2077,7 +2077,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 {
     FcCharSet	    *fcs;
     int		    o;
-    FT_Pos	    advance, advances[3];
+    FT_Pos	    advances[3];
     unsigned int    num_advances = 0;
 
     fcs = FcCharSetCreate ();
@@ -2133,9 +2133,6 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 	    if (face->face_flags & FT_FACE_FLAG_SCALABLE)
 		load_flags |= FT_LOAD_NO_BITMAP;
 
-	    advance = 0;
-	    FT_Get_Advance (face, glyph, load_flags, &advance);
-
 	    /* CID fonts built by Adobe used to make ASCII control chars to cid1
 	     * (space glyph). As such, always check contour for those characters. */
 	    if (ucs4 <= 0x001F)
@@ -2148,14 +2145,18 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 
 	    if (good)
 	    {
-		if (num_advances < 3 && advance)
+		if (num_advances < 3)
 		{
-		    unsigned int i;
-		    for (i = 0; i < num_advances; i++)
-		      if (fc_approximately_equal (advance, advances[i]))
-		        break;
-		    if (i == num_advances)
-		      advances[num_advances++] = advance;
+		    FT_Pos advance = 0;
+		    if (!FT_Get_Advance (face, glyph, load_flags, &advance) && advance)
+		    {
+			unsigned int i;
+			for (i = 0; i < num_advances; i++)
+			  if (fc_approximately_equal (advance, advances[i]))
+			    break;
+			if (i == num_advances)
+			  advances[num_advances++] = advance;
+		    }
 		}
 
 		if ((ucs4 >> 8) != page)
commit ad0a82b8f85535862ba816d469059884564e5c58
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 17:19:42 2017 +0100

    Inline FcFreeTypeCheckGlyph()

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 538e8b4..256ac95 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2067,41 +2067,6 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
     return 0;
 }
 
-static FcBool
-FcFreeTypeCheckGlyph (FT_Face face,
-		      FcChar32 ucs4,
-		      FT_UInt glyph,
-		      FT_Pos *advance)
-{
-    FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    /* When using scalable fonts, only report those glyphs
-     * which can be scaled; otherwise those fonts will
-     * only be available at some sizes, and never when
-     * transformed.  Avoid this by simply reporting bitmap-only
-     * glyphs as missing
-     */
-    if (face->face_flags & FT_FACE_FLAG_SCALABLE)
-	load_flags |= FT_LOAD_NO_BITMAP;
-
-    *advance = 0;
-    FT_Get_Advance (face, glyph, load_flags, advance);
-
-    /* CID fonts built by Adobe used to make ASCII control chars to cid1
-     * (space glyph). As such, always check contour for those characters. */
-    if (ucs4 <= 0x001F)
-    {
-      if (FT_Load_Glyph (face, glyph, load_flags))
-	  return FcFalse;
-
-      if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE &&
-	  face->glyph->outline.n_contours == 0)
-	  return FcFalse;
-    }
-
-    return FcTrue;
-}
-
 static inline int fc_min (int a, int b) { return a <= b ? a : b; }
 static inline int fc_max (int a, int b) { return a >= b ? a : b; }
 static inline FcBool fc_approximately_equal (int x, int y)
@@ -2155,7 +2120,33 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 	ucs4 = FT_Get_First_Char (face, &glyph);
 	while (glyph != 0)
 	{
-	    if (FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
+	    FcBool good = FcTrue;
+
+	    FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+	    /* When using scalable fonts, only report those glyphs
+	     * which can be scaled; otherwise those fonts will
+	     * only be available at some sizes, and never when
+	     * transformed.  Avoid this by simply reporting bitmap-only
+	     * glyphs as missing
+	     */
+	    if (face->face_flags & FT_FACE_FLAG_SCALABLE)
+		load_flags |= FT_LOAD_NO_BITMAP;
+
+	    advance = 0;
+	    FT_Get_Advance (face, glyph, load_flags, &advance);
+
+	    /* CID fonts built by Adobe used to make ASCII control chars to cid1
+	     * (space glyph). As such, always check contour for those characters. */
+	    if (ucs4 <= 0x001F)
+	    {
+		if (FT_Load_Glyph (face, glyph, load_flags) ||
+		    (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE &&
+		     face->glyph->outline.n_contours == 0))
+		    good = FcFalse;
+	    }
+
+	    if (good)
 	    {
 		if (num_advances < 3 && advance)
 		{
@@ -2177,6 +2168,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 		off = ucs4 & 0xff;
 		leaf->map[off >> 5] |= (1 << (off & 0x1f));
 	    }
+
 	    ucs4 = FT_Get_Next_Char (face, ucs4, &glyph);
 	}
 	if (fcFontEncodings[o] == FT_ENCODING_MS_SYMBOL)
commit 1af7518583196dc0638ef80ff204936c54f19619
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 17:15:07 2017 +0100

    Simplify advance-width calculations

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 45591e3..538e8b4 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2112,8 +2112,8 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 {
     FcCharSet	    *fcs;
     int		    o;
-    FT_Pos	    advance, advance_one = 0, advance_two = 0;
-    FcBool	    has_advance = FcFalse, fixed_advance = FcTrue, dual_advance = FcFalse;
+    FT_Pos	    advance, advances[3];
+    unsigned int    num_advances = 0;
 
     fcs = FcCharSetCreate ();
     if (!fcs)
@@ -2157,24 +2157,14 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 	{
 	    if (FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
 	    {
-		if (advance)
+		if (num_advances < 3 && advance)
 		{
-		    if (!has_advance)
-		    {
-			has_advance = FcTrue;
-			advance_one = advance;
-		    }
-		    else if (!fc_approximately_equal (advance, advance_one))
-		    {
-			if (fixed_advance)
-			{
-			    dual_advance = FcTrue;
-			    fixed_advance = FcFalse;
-			    advance_two = advance;
-			}
-			else if (!fc_approximately_equal (advance, advance_two))
-			    dual_advance = FcFalse;
-		    }
+		    unsigned int i;
+		    for (i = 0; i < num_advances; i++)
+		      if (fc_approximately_equal (advance, advances[i]))
+		        break;
+		    if (i == num_advances)
+		      advances[num_advances++] = advance;
 		}
 
 		if ((ucs4 >> 8) != page)
@@ -2221,9 +2211,11 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 #endif
 	break;
     }
-    if (fixed_advance)
+    if (num_advances <= 1)
 	*spacing = FC_MONO;
-    else if (dual_advance && fc_approximately_equal (2 * fc_min (advance_one, advance_two), fc_max (advance_one, advance_two)))
+    else if (num_advances == 2 &&
+	     fc_approximately_equal (fc_min (advances[0], advances[1]) * 2,
+				     fc_max (advances[0], advances[1])))
         *spacing = FC_DUAL;
     else
 	*spacing = FC_PROPORTIONAL;
commit 6f98286e15a91bf8d76eb2c09f1edf3f1fedc633
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 17:07:23 2017 +0100

    Use inline functions instead of macros for a couple of things

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 1646dc7..45591e3 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2102,7 +2102,10 @@ FcFreeTypeCheckGlyph (FT_Face face,
     return FcTrue;
 }
 
-#define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) * 33 <= FC_MAX (FC_ABS (x), FC_ABS (y)))
+static inline int fc_min (int a, int b) { return a <= b ? a : b; }
+static inline int fc_max (int a, int b) { return a >= b ? a : b; }
+static inline FcBool fc_approximately_equal (int x, int y)
+{ return abs (x - y) * 33 <= fc_max (abs (x), abs (y)); }
 
 FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spacing)
@@ -2161,7 +2164,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 			has_advance = FcTrue;
 			advance_one = advance;
 		    }
-		    else if (!APPROXIMATELY_EQUAL (advance, advance_one))
+		    else if (!fc_approximately_equal (advance, advance_one))
 		    {
 			if (fixed_advance)
 			{
@@ -2169,7 +2172,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 			    fixed_advance = FcFalse;
 			    advance_two = advance;
 			}
-			else if (!APPROXIMATELY_EQUAL (advance, advance_two))
+			else if (!fc_approximately_equal (advance, advance_two))
 			    dual_advance = FcFalse;
 		    }
 		}
@@ -2220,7 +2223,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
     }
     if (fixed_advance)
 	*spacing = FC_MONO;
-    else if (dual_advance && APPROXIMATELY_EQUAL (2 * FC_MIN (advance_one, advance_two), FC_MAX (advance_one, advance_two)))
+    else if (dual_advance && fc_approximately_equal (2 * fc_min (advance_one, advance_two), fc_max (advance_one, advance_two)))
         *spacing = FC_DUAL;
     else
 	*spacing = FC_PROPORTIONAL;
diff --git a/src/fcint.h b/src/fcint.h
index 57c9f41..0869e9e 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -101,7 +101,6 @@ extern pfnSHGetFolderPathA pSHGetFolderPathA;
 
 #define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
 #define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
-#define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
 
 /* slim_internal.h */
 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
commit 15eba74ffe85d13ecafd032fe44bbabe26670f8c
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 17:01:56 2017 +0100

    Use multiplication instead of division

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 2f99928..1646dc7 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2102,7 +2102,7 @@ FcFreeTypeCheckGlyph (FT_Face face,
     return FcTrue;
 }
 
-#define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
+#define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) * 33 <= FC_MAX (FC_ABS (x), FC_ABS (y)))
 
 FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spacing)
commit ac802955cd26ba9175b5be36ca653c0904c9723a
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:40:40 2017 +0100

    Remove unneeded check
    
    FcFreeTypeCheckGlyph() has only one call-site left, and that checks for
    glyph != 0 already.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 712c056..2f99928 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2075,11 +2075,7 @@ FcFreeTypeCheckGlyph (FT_Face face,
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
 
-    if (!glyph)
-	return FcFalse;
-
-    /*
-     * When using scalable fonts, only report those glyphs
+    /* When using scalable fonts, only report those glyphs
      * which can be scaled; otherwise those fonts will
      * only be available at some sizes, and never when
      * transformed.  Avoid this by simply reporting bitmap-only
commit d7f5332410af2dff387dec9597c4c71ae729747b
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:39:29 2017 +0100

    Move variables to narrower scope and indent

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index d319761..712c056 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2111,11 +2111,8 @@ FcFreeTypeCheckGlyph (FT_Face face,
 FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spacing)
 {
-    FcChar32	    page, off, ucs4;
     FcCharSet	    *fcs;
-    FcCharLeaf	    *leaf;
     int		    o;
-    FT_UInt	    glyph;
     FT_Pos	    advance, advance_one = 0, advance_two = 0;
     FcBool	    has_advance = FcFalse, fixed_advance = FcTrue, dual_advance = FcFalse;
 
@@ -2147,82 +2144,83 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac
 #endif
     for (o = 0; o < NUM_DECODE; o++)
     {
+	FcChar32	page, off, ucs4;
+	FcCharLeaf	*leaf;
+	FT_UInt	 	glyph;
+
 	if (FT_Select_Charmap (face, fcFontEncodings[o]) != 0)
 	    continue;
 
+	page = ~0;
+	leaf = NULL;
+	ucs4 = FT_Get_First_Char (face, &glyph);
+	while (glyph != 0)
 	{
-            page = ~0;
-            leaf = NULL;
-            ucs4 = FT_Get_First_Char (face, &glyph);
-            while (glyph != 0)
+	    if (FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
 	    {
-		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
+		if (advance)
 		{
-		    if (advance)
+		    if (!has_advance)
 		    {
-			if (!has_advance)
-			{
-			    has_advance = FcTrue;
-			    advance_one = advance;
-			}
-			else if (!APPROXIMATELY_EQUAL (advance, advance_one))
+			has_advance = FcTrue;
+			advance_one = advance;
+		    }
+		    else if (!APPROXIMATELY_EQUAL (advance, advance_one))
+		    {
+			if (fixed_advance)
 			{
-			    if (fixed_advance)
-			    {
-				dual_advance = FcTrue;
-				fixed_advance = FcFalse;
-				advance_two = advance;
-			    }
-			    else if (!APPROXIMATELY_EQUAL (advance, advance_two))
-				dual_advance = FcFalse;
+			    dual_advance = FcTrue;
+			    fixed_advance = FcFalse;
+			    advance_two = advance;
 			}
+			else if (!APPROXIMATELY_EQUAL (advance, advance_two))
+			    dual_advance = FcFalse;
 		    }
+		}
 
-		    if ((ucs4 >> 8) != page)
-		    {
-			page = (ucs4 >> 8);
-			leaf = FcCharSetFindLeafCreate (fcs, ucs4);
-			if (!leaf)
-			    goto bail1;
-		    }
-		    off = ucs4 & 0xff;
-		    leaf->map[off >> 5] |= (1 << (off & 0x1f));
+		if ((ucs4 >> 8) != page)
+		{
+		    page = (ucs4 >> 8);
+		    leaf = FcCharSetFindLeafCreate (fcs, ucs4);
+		    if (!leaf)
+			goto bail1;
 		}
-		ucs4 = FT_Get_Next_Char (face, ucs4, &glyph);
+		off = ucs4 & 0xff;
+		leaf->map[off >> 5] |= (1 << (off & 0x1f));
 	    }
-	    if (fcFontEncodings[o] == FT_ENCODING_MS_SYMBOL)
+	    ucs4 = FT_Get_Next_Char (face, ucs4, &glyph);
+	}
+	if (fcFontEncodings[o] == FT_ENCODING_MS_SYMBOL)
+	{
+	    /* For symbol-encoded OpenType fonts, we duplicate the
+	     * U+F000..F0FF range at U+0000..U+00FF.  That's what
+	     * Windows seems to do, and that's hinted about at:
+	     * http://www.microsoft.com/typography/otspec/recom.htm
+	     * under "Non-Standard (Symbol) Fonts".
+	     *
+	     * See thread with subject "Webdings and other MS symbol
+	     * fonts don't display" on mailing list from May 2015.
+	     */
+	    for (ucs4 = 0xF000; ucs4 < 0xF100; ucs4++)
 	    {
-		/* For symbol-encoded OpenType fonts, we duplicate the
-		 * U+F000..F0FF range at U+0000..U+00FF.  That's what
-		 * Windows seems to do, and that's hinted about at:
-		 * http://www.microsoft.com/typography/otspec/recom.htm
-		 * under "Non-Standard (Symbol) Fonts".
-		 *
-		 * See thread with subject "Webdings and other MS symbol
-		 * fonts don't display" on mailing list from May 2015.
-		 */
-		for (ucs4 = 0xF000; ucs4 < 0xF100; ucs4++)
-		{
-		    if (FcCharSetHasChar (fcs, ucs4))
-			FcCharSetAddChar (fcs, ucs4 - 0xF000);
-		}
+		if (FcCharSetHasChar (fcs, ucs4))
+		    FcCharSetAddChar (fcs, ucs4 - 0xF000);
 	    }
+	}
 #ifdef CHECK
-	    for (ucs4 = 0x0020; ucs4 < 0x10000; ucs4++)
-	    {
-		FcBool	    FT_Has, FC_Has;
+	for (ucs4 = 0x0020; ucs4 < 0x10000; ucs4++)
+	{
+	    FcBool	    FT_Has, FC_Has;
 
-		FT_Has = FT_Get_Char_Index (face, ucs4) != 0;
-		FC_Has = FcCharSetHasChar (fcs, ucs4);
-		if (FT_Has != FC_Has)
-		{
-		    printf ("0x%08x FT says %d FC says %d\n", ucs4, FT_Has, FC_Has);
-		}
+	    FT_Has = FT_Get_Char_Index (face, ucs4) != 0;
+	    FC_Has = FcCharSetHasChar (fcs, ucs4);
+	    if (FT_Has != FC_Has)
+	    {
+		printf ("0x%08x FT says %d FC says %d\n", ucs4, FT_Has, FC_Has);
 	    }
-#endif
 	}
-
-       break;
+#endif
+	break;
     }
     if (fixed_advance)
 	*spacing = FC_MONO;
commit 894e5675c89cd081dcacbb6c3a0d8b81424c4ad6
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:36:12 2017 +0100

    Mark more parameters FC_UNUSED

diff --git a/src/fccfg.c b/src/fccfg.c
index 8c246c0..4f38af1 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -572,35 +572,35 @@ FcBlanksCreate (void)
 }
 
 void
-FcBlanksDestroy (FcBlanks *b)
+FcBlanksDestroy (FcBlanks *b FC_UNUSED)
 {
     /* Deprecated. */
 }
 
 FcBool
-FcBlanksAdd (FcBlanks *b, FcChar32 ucs4)
+FcBlanksAdd (FcBlanks *b FC_UNUSED, FcChar32 ucs4 FC_UNUSED)
 {
     /* Deprecated. */
     return FcFalse;
 }
 
 FcBool
-FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4)
+FcBlanksIsMember (FcBlanks *b FC_UNUSED, FcChar32 ucs4 FC_UNUSED)
 {
     /* Deprecated. */
     return FcFalse;
 }
 
 FcBlanks *
-FcConfigGetBlanks (FcConfig	*config)
+FcConfigGetBlanks (FcConfig	*config FC_UNUSED)
 {
     /* Deprecated. */
     return NULL;
 }
 
 FcBool
-FcConfigAddBlank (FcConfig	*config,
-		  FcChar32    	blank)
+FcConfigAddBlank (FcConfig	*config FC_UNUSED,
+		  FcChar32    	blank FC_UNUSED)
 {
     /* Deprecated. */
     return FcFalse;
diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index f0e2f1c..d319761 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -1158,7 +1158,7 @@ FcPattern *
 FcFreeTypeQueryFace (const FT_Face  face,
 		     const FcChar8  *file,
 		     int	    id,
-		     FcBlanks	    *blanks)
+		     FcBlanks	    *blanks FC_UNUSED)
 {
     FcPattern	    *pat;
     int		    slant = -1;
@@ -2109,7 +2109,7 @@ FcFreeTypeCheckGlyph (FT_Face face,
 #define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
 
 FcCharSet *
-FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
+FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spacing)
 {
     FcChar32	    page, off, ucs4;
     FcCharSet	    *fcs;
@@ -2238,7 +2238,7 @@ bail0:
 }
 
 FcCharSet *
-FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
+FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks FC_UNUSED)
 {
     int spacing;
 
commit f5bea1e6021bfa7d454ea774fd163039ad2c7650
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:33:53 2017 +0100

    Remove blanks support from fc-scan

diff --git a/fc-scan/fc-scan.c b/fc-scan/fc-scan.c
index 4d0b1db..1f18e80 100644
--- a/fc-scan/fc-scan.c
+++ b/fc-scan/fc-scan.c
@@ -52,7 +52,6 @@
 #define _GNU_SOURCE
 #include <getopt.h>
 static const struct option longopts[] = {
-    {"ignore-blanks", 0, 0, 'b'},
     {"format", 1, 0, 'f'},
     {"version", 0, 0, 'V'},
     {"help", 0, 0, 'h'},
@@ -70,21 +69,19 @@ usage (char *program, int error)
 {
     FILE *file = error ? stderr : stdout;
 #if HAVE_GETOPT_LONG
-    fprintf (file, "usage: %s [-Vbh] [-f FORMAT] [--ignore-blanks] [--format FORMAT] [--version] [--help] font-file...\n",
+    fprintf (file, "usage: %s [-Vh] [-f FORMAT] [--format FORMAT] [--version] [--help] font-file...\n",
 	     program);
 #else
-    fprintf (file, "usage: %s [-Vbh] [-f FORMAT] font-file...\n",
+    fprintf (file, "usage: %s [-Vh] [-f FORMAT] font-file...\n",
 	     program);
 #endif
     fprintf (file, "Scan font files and directories, and print resulting pattern(s)\n");
     fprintf (file, "\n");
 #if HAVE_GETOPT_LONG
-    fprintf (file, "  -b, --ignore-blanks  ignore blanks to compute languages\n");
     fprintf (file, "  -f, --format=FORMAT  use the given output format\n");
     fprintf (file, "  -V, --version        display font config version and exit\n");
     fprintf (file, "  -h, --help           display this help and exit\n");
 #else
-    fprintf (file, "  -b         (ignore-blanks) ignore blanks to compute languages\n");
     fprintf (file, "  -f FORMAT  (format)        use the given output format\n");
     fprintf (file, "  -V         (version)       display font config version and exit\n");
     fprintf (file, "  -h         (help)          display this help and exit\n");
@@ -97,9 +94,7 @@ main (int argc, char **argv)
 {
     FcChar8     *format = NULL;
     int		i;
-    int		ignore_blanks = 0;
     FcFontSet   *fs;
-    FcBlanks    *blanks = NULL;
 #if HAVE_GETOPT_LONG || HAVE_GETOPT
     int		c;
 
@@ -110,9 +105,6 @@ main (int argc, char **argv)
 #endif
     {
 	switch (c) {
-	case 'b':
-	    ignore_blanks = 1;
-	    break;
 	case 'f':
 	    format = (FcChar8 *) strdup (optarg);
 	    break;
@@ -135,22 +127,20 @@ main (int argc, char **argv)
 	usage (argv[0], 1);
 
     fs = FcFontSetCreate ();
-    if (!ignore_blanks)
-	blanks = FcConfigGetBlanks (NULL);
 
     for (; i < argc; i++)
     {
 	const FcChar8 *file = (FcChar8*) argv[i];
 
 	if (!FcFileIsDir (file))
-	    FcFileScan (fs, NULL, NULL, blanks, file, FcTrue);
+	    FcFileScan (fs, NULL, NULL, NULL, file, FcTrue);
 	else
 	{
 	    FcStrSet *dirs = FcStrSetCreate ();
 	    FcStrList *strlist = FcStrListCreate (dirs);
 	    do
 	    {
-		FcDirScan (fs, dirs, NULL, blanks, file, FcTrue);
+		FcDirScan (fs, dirs, NULL, NULL, file, FcTrue);
 	    }
 	    while ((file = FcStrListNext (strlist)));
 	    FcStrListDone (strlist);
diff --git a/fc-scan/fc-scan.sgml b/fc-scan/fc-scan.sgml
index 65a66c4..9af403c 100644
--- a/fc-scan/fc-scan.sgml
+++ b/fc-scan/fc-scan.sgml
@@ -62,13 +62,9 @@ manpage.1: manpage.sgml
     <cmdsynopsis>
       <command>&dhpackage;</command>
 
-      <arg><option>-Vbh</option></arg>
+      <arg><option>-Vh</option></arg>
       <sbr>
       <group>
-	<arg><option>-b</option></arg>
-	<arg><option>--ignore-blanks</option></arg>
-      </group>
-      <group>
         <arg><option>-f</option> <option><replaceable>format</replaceable></option></arg>
         <arg><option>--format</option> <option><replaceable>format</replaceable></option></arg>
       </group>
@@ -95,14 +91,6 @@ manpage.1: manpage.sgml
 
     <variablelist>
       <varlistentry>
-	<term><option>-b</option>
-	  <option>--ignore-blanks</option>
-	</term>
-	<listitem>
-	  <para>Ignore blanks to compute languages</para>
-	</listitem>
-      </varlistentry>
-      <varlistentry>
         <term><option>-f</option>
           <option>--format</option>
 	  <option><replaceable>format</replaceable></option>
commit 8f4c4d278d013f6cc69ba7d7bf0f8aed11398dfb
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:31:52 2017 +0100

    Remove blanks facility from the library
    
    XML parser does not accept it anymore either.

diff --git a/Makefile.am b/Makefile.am
index 4a8edb0..c081f67 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,7 +21,7 @@
 #  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 #  PERFORMANCE OF THIS SOFTWARE.
 
-SUBDIRS=fontconfig fc-blanks fc-case fc-lang src \
+SUBDIRS=fontconfig fc-case fc-lang src \
 	fc-cache fc-cat fc-list fc-match fc-pattern fc-query fc-scan \
 	fc-validate conf.d test
 if ENABLE_DOCS
diff --git a/configure.ac b/configure.ac
index 322fb61..22117ba 100644
--- a/configure.ac
+++ b/configure.ac
@@ -760,7 +760,6 @@ AC_CONFIG_FILES([
 Makefile
 fontconfig/Makefile
 fc-lang/Makefile
-fc-blanks/Makefile
 fc-case/Makefile
 src/Makefile
 conf.d/Makefile
diff --git a/fc-blanks/Makefile.am b/fc-blanks/Makefile.am
deleted file mode 100644
index 2b2075f..0000000
--- a/fc-blanks/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- encoding: utf-8 -*-
-#
-# Copyright © 2003  Keith Packard
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of the author(s) not be used in
-# advertising or publicity pertaining to distribution of the software without
-# specific, written prior permission.  The authors make no
-# representations about the suitability of this software for any purpose.  It
-# is provided "as is" without express or implied warranty.
-#
-# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-# PERFORMANCE OF THIS SOFTWARE.
-
-NULL =
-BLANKSPY = fc-blanks.py
-BLANKS_H = fcblanks.h
-TMPL = fcblanks.tmpl.h
-noinst_SCRIPTS = $(BLANKSPY)
-noinst_HEADERS = $(BLANKS_H)
-
-$(BLANKS_H): $(TMPL) $(BLANKSPY)
-if HAVE_PYTHON
-	$(AM_V_GEN) $(PYTHON) $(srcdir)/$(BLANKSPY) < $< > $(BLANKS_H).tmp && \
-	mv $(BLANKS_H).tmp $(BLANKS_H) || ($(RM) $(BLANKS_H).tmp && false)
-else
-	@echo "No python installed. please install python to build $(BLANKS_H)."
-	@false
-endif
-
-EXTRA_DIST = 		\
-	$(BLANKSPY)	\
-	$(BLANKS_H)	\
-	$(TMPL)		\
-	$(NULL)
-DISTCLEANFILES = $(BLANKS_H)
-
--include $(top_srcdir)/git.mk
diff --git a/fc-blanks/fc-blanks.py b/fc-blanks/fc-blanks.py
deleted file mode 100755
index 410178a..0000000
--- a/fc-blanks/fc-blanks.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#! /usr/bin/python
-
-from __future__ import absolute_import
-from __future__ import print_function
-try:
-    from urllib2 import urlopen
-    from urllib2 import URLError
-except ImportError:
-    from urllib.request import urlopen
-    from urllib.error import URLError
-
-import sys
-import os
-from lxml import html
-from six.moves import range
-
-datafile = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'list-unicodeset.html')
-try:
-    fp = urlopen('http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[%3AGC%3DZs%3A][%3ADI%3A]&abb=on&ucd=on&esc=on&g')
-    data = fp.read()
-    fp.close()
-    # check before writing if data isn't corrupted.
-    dom = html.fromstring(data)
-    x = dom.xpath('/html/body/form/p/text()')
-    p = x[1]
-    fp = open(datafile, 'wb');
-    fp.write(data);
-    fp.close();
-except (URLError, IndexError):
-    # fall back reading the static data in repo
-    try:
-        fp = open(datafile)
-        data = fp.read()
-        fp.close()
-    except IOError:
-        sys.stderr.write("Error: No static data to generate the blank data. please make sure the network connection is reachable to Unicode.org\n")
-        sys.exit(1)
-
-dom = html.fromstring(data)
-x = dom.xpath('/html/body/form/p/text()')
-p = x[1]
-if p[0] == '[' and p[-1] == ']':
-    p = p.replace('[', '').replace(']', '')
-else:
-    sys.exit(1)
-fescape = False
-funicode = False
-frange = False
-fprocess = False
-v = 0
-vbegin = 0
-vend = 0
-n = 0
-l = []
-
-def insert(db, begin, end):
-    db.append([begin, end])
-
-for i in p:
-    if i == '\\':
-        if n > 0:
-            if frange == True and funicode == True:
-                vend = v
-                insert(l, vbegin, vend)
-                fprocess = True
-            elif funicode == True:
-                vbegin = v
-                vend = v
-                insert(l, vbegin, vend)
-                fprocess = True
-        funicode = False
-        fescape = True
-    elif i.lower() == 'u' and fescape == True:
-        funicode = True
-        fescape = False
-    elif i >= '0' and i <= '9' or i.lower() >= 'a' and i.lower() <= 'f':
-        if fescape == True:
-            raise RuntimeError("Unexpected escape code")
-        if funicode == True:
-            v <<= 4
-            v += int(i, 16)
-        else:
-            raise RuntimeError("Unable to parse Unicode")
-    elif i == ' ':
-        if fescape == True:
-            funicode = True
-            fescape = False
-            v = 0x20
-        if frange == True and funicode == True:
-            vend = v
-            insert(l, vbegin, vend)
-            fprocess = True
-        elif funicode == True:
-            vbegin = v
-            vend = v
-            insert(l, vbegin, vend)
-            fprocess = True
-        funicode = False
-        frange = False
-    elif i == '-':
-        if fescape == True:
-            raise RuntimeError("Unexpected escape code")
-        vbegin = v
-        v = 0
-        funicode = False
-        frange = True
-    else:
-        raise RuntimeError("Unable to parse Unicode: %s" % i)
-
-    if fprocess == True:
-        vbegin = 0
-        vend = 0
-        v = 0
-        fprocess = False
-        funicode = False
-        frange = False
-    n += 1
-
-if frange == True and funicode == True:
-    vend = v
-    insert(l, vbegin, vend)
-elif funicode == True:
-    vbegin = vend = v
-    insert(l, vbegin, vend)
-
-ncode = 0
-for i in l:
-    ncode += (i[1] - i[0] + 1)
-
-a = int(x[0].split(' ')[0].replace(',', ''))
-if a != ncode:
-    sys.stderr.write("Unexpected the amount of code points: %d (expected %d)\n" % (ncode, a))
-    sys.exit(1)
-
-# exception; BRAILLE PATTERN BLANK
-insert(l, 0x2800, 0x2800)
-
-while True:
-    s = sys.stdin.readline().rstrip()
-    if s == "@@@":
-        break
-    print(s)
-
-print("static FcChar32 _fcBlanks[%s] = {" % (ncode + 1))
-k = 0
-for i in sorted(l, key=lambda a: a[0]):
-    for j in range(i[0], i[1] + 1):
-        if k != 0:
-            print(",")
-        print("    0x%04x" % j, end=' ')
-        k += 1
-
-print("};")
-print('''
-static FcBlanks fcBlanks = {
-    %s,
-    -1,
-    _fcBlanks
-};
-''' % (ncode + 1))
diff --git a/fc-blanks/fcblanks.tmpl.h b/fc-blanks/fcblanks.tmpl.h
deleted file mode 100644
index 2bcaa21..0000000
--- a/fc-blanks/fcblanks.tmpl.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * fontconfig/fc-blanks/fcblanks.tmpl.h
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the author(s) not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The authors make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-@@@
diff --git a/fc-blanks/list-unicodeset.html b/fc-blanks/list-unicodeset.html
deleted file mode 100644
index 6e95efa..0000000
--- a/fc-blanks/list-unicodeset.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 6.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link rel="stylesheet" type="text/css" href="index.css">
-
-
-
-
- 
- 
-
-
-
-
- 
-
-
-
-
-
-
-
-
-<title>Unicode Utilities: UnicodeSet</title>
-</head>
-<body>
-
-<h1>Unicode Utilities: UnicodeSet </h1>
-<p><a target="help" href="http://cldr.unicode.org/unicode-utilities/list-unicodeset";><b>help</b></a> |      <a target="character" href="character.jsp">character</a>
-   | <a target="properties" href="properties.jsp">properties</a>
-   | <a target="confusables" href="confusables.jsp">confusables</a>
-   | <a target="list" href="list-unicodeset.jsp">unicode-set</a>
-   | <a target="compare" href="unicodeset.jsp">compare-sets</a>
-   | <a target="regex" href="regex.jsp">regex</a>
-   | <a target="bnf" href="bnf.jsp">bnf-regex</a>
-   | <a target="breaks" href="breaks.jsp">breaks</a>
-   | <a target="transform" href="transform.jsp">transform</a>
-   | <a target="bidi" href="bidi.jsp">bidi</a>
-   | <a target="idna" href="idna.jsp">idna</a>
-   | <a target="languageid" href="languageid.jsp">languageid</a></p>
-<form name="myform">
-  <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width:100%">
-    <tr>
-      <th style="width: 50%">Input</th>
-    </tr>
-    <tr>
-      <td><textarea name="a" rows="8" cols="10" style="width: 100%">[:GC=Zs:][:DI:]</textarea></td>
-    </tr>
-    <tr>
-      <td>
-      <input id='main' type="submit" value="Show Set" onClick="window.location.href='list-unicodeset.jsp?a='+document.getElementById('main').value"/>&nbsp;&nbsp;
-      <input type="checkbox" checked name="abb"><label for="abb">Abbreviate</label>&nbsp;&nbsp;
-      <input type="checkbox"  name="c"><label for="c">Collate</label>&nbsp;&nbsp;
-      <input type="checkbox" checked name="ucd"><label for="ucd">UCD format</label>&nbsp;&nbsp;
-      <input type="checkbox" checked name="esc"><label for="esc">Escape</label>&nbsp;&nbsp;
-      <label for="g">Group by:</label>
-      <input type="text" checked name="g" size="25" value="">
-      <label for="i">Info:</label>
-      <input type="text" checked name="i" size="25" value="">
-      </td>
-    </tr>
-</table>
-  <p>4,190 Code Points</p>
-  <hr>
-  <p>[\ \u00A0\u00AD\u034F\u061C\u115F\u1160\u1680\u17B4\u17B5\u180B-\u180E\u2000-\u200F\u202A-\u202F\u205F-\u206F\u3000\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8\U0001BCA0-\U0001BCA3\U0001D173-\U0001D17A\U000E0000-\U000E0FFF]</p>
-  <hr>
-  <table width='100%'><tr><td colSpan='4'><tr><td class='charCell' width='3m'>   </td><td width='7m'><code><a target='c' href='character.jsp?a=0020'>0020</a></code></td><td>SPACE</td></tr>
-<tr><td class='charCell' width='3m'>   </td><td width='7m'><code><a target='c' href='character.jsp?a=00A0'>00A0</a></code></td><td>NO-BREAK SPACE</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=00AD'>00AD</a></code></td><td>SOFT HYPHEN</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=034F'>034F</a></code></td><td>COMBINING GRAPHEME JOINER</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=061C'>061C</a></code></td><td>ARABIC LETTER MARK</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=115F'>115F</a></code></td><td>HANGUL CHOSEONG FILLER</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=1160'>1160</a></code></td><td>HANGUL JUNGSEONG FILLER</td></tr>
-<tr><td class='charCell' width='3m'> á?? </td><td width='7m'><code><a target='c' href='character.jsp?a=1680'>1680</a></code></td><td>OGHAM SPACE MARK</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=17B4'>17B4</a></code></td><td>KHMER VOWEL INHERENT AQ</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=17B5'>17B5</a></code></td><td>KHMER VOWEL INHERENT AA</td></tr>
-<code><a target='c' href='character.jsp?a=180B'>180B</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=180E'>180E</a></code></td><td>MONGOLIAN VOWEL SEPARATOR</td></tr>
-<code><a target='c' href='character.jsp?a=2000'>2000</a></code>..<tr><td class='charCell' width='3m'> â??â??â?? </td><td width='7m'><code><a target='c' href='character.jsp?a=200F'>200F</a></code></td><td>RIGHT-TO-LEFT MARK</td></tr>
-<code><a target='c' href='character.jsp?a=202A'>202A</a></code>..<tr><td class='charCell' width='3m'> � </td><td width='7m'><code><a target='c' href='character.jsp?a=202F'>202F</a></code></td><td>NARROW NO-BREAK SPACE</td></tr>
-<code><a target='c' href='character.jsp?a=205F'>205F</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=206F'>206F</a></code></td><td>NOMINAL DIGIT SHAPES</td></tr>
-<tr><td class='charCell' width='3m'> ã?? </td><td width='7m'><code><a target='c' href='character.jsp?a=3000'>3000</a></code></td><td>IDEOGRAPHIC SPACE</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=3164'>3164</a></code></td><td>HANGUL FILLER</td></tr>
-<code><a target='c' href='character.jsp?a=FE00'>FE00</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=FE0F'>FE0F</a></code></td><td>VARIATION SELECTOR-16</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=FEFF'>FEFF</a></code></td><td>ZERO WIDTH NO-BREAK SPACE</td></tr>
-<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=FFA0'>FFA0</a></code></td><td>HALFWIDTH HANGUL FILLER</td></tr>
-<code><a target='c' href='character.jsp?a=FFF0'>FFF0</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=FFF8'>FFF8</a></code></td><td><i>&lt;unassigned-FFF8&gt;</i></td></tr>
-<code><a target='c' href='character.jsp?a=1BCA0'>1BCA0</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=1BCA3'>1BCA3</a></code></td><td>SHORTHAND FORMAT UP STEP</td></tr>
-<code><a target='c' href='character.jsp?a=1D173'>1D173</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=1D17A'>1D17A</a></code></td><td>MUSICAL SYMBOL END PHRASE</td></tr>
-<code><a target='c' href='character.jsp?a=E0000'>E0000</a></code>..<tr><td class='charCell' width='3m'>  </td><td width='7m'><code><a target='c' href='character.jsp?a=E0FFF'>E0FFF</a></code></td><td><i>&lt;unassigned-E0FFF&gt;</i></td></tr>
-</td></tr></table>
-</form>
-<hr>
-<p style="font-size:80%"><b><a name="fonts">Fonts and Display.</a></b> If you don't have a good set of Unicode fonts (and modern browser), 
-you may not be able to read some of the characters.
-Some suggested fonts that you can add for coverage are:
-<a href="http://greekfonts.teilar.gr/"; target="_blank">Unicode Fonts for Ancient Scripts</a>,
-<a href="https://www.google.com/get/noto/"; target="_blank">Noto Fonts site</a>,
-<a href="http://www.alanwood.net/unicode/fonts.html"; target="_blank">Large, multi-script Unicode fonts</a>.
-See also: <a href="http://www.unicode.org/help/display_problems.html"; target="_blank">Unicode Display Problems</a>.</p>
-<p style="font-size:80%">Version 3.7;
-ICU version: 57.0.1.0;
-Unicode version: 8.0.0.0
-</p>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl."; : "http://www.";);
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-8314904-1");
-pageTracker._trackPageview();
-} catch(err) {}
-</script>
-<hr>
-</body>
-</html>
diff --git a/src/Makefile.am b/src/Makefile.am
index a59183f..40a40f2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -127,7 +127,6 @@ libfontconfig_la_SOURCES = \
 	fcarch.h \
 	fcatomic.c \
 	fcatomic.h \
-	fcblanks.c \
 	fccache.c \
 	fccfg.c \
 	fccharset.c \
diff --git a/src/fcblanks.c b/src/fcblanks.c
deleted file mode 100644
index 5132a51..0000000
--- a/src/fcblanks.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * fontconfig/src/fcblanks.c
- *
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the author(s) not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The authors make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "fcint.h"
-
-FcBlanks *
-FcBlanksCreate (void)
-{
-    FcBlanks	*b;
-
-    b = malloc (sizeof (FcBlanks));
-    if (!b)
-	return 0;
-    b->nblank = 0;
-    b->sblank = 0;
-    b->blanks = 0;
-    return b;
-}
-
-void
-FcBlanksDestroy (FcBlanks *b)
-{
-    if (b->sblank == -1)
-	return;
-    if (b->blanks)
-	free (b->blanks);
-    free (b);
-}
-
-FcBool
-FcBlanksAdd (FcBlanks *b, FcChar32 ucs4)
-{
-    FcChar32	*c;
-    int		sblank;
-
-    for (sblank = 0; sblank < b->nblank; sblank++)
-	if (b->blanks[sblank] == ucs4)
-	    return FcTrue;
-
-    if (b->sblank == -1)
-    {
-	fprintf (stderr, "Unable to update the static FcBlanks: 0x%04x\n", ucs4);
-	return FcTrue;
-    }
-    if (b->nblank == b->sblank)
-    {
-	sblank = b->sblank + 32;
-	if (b->blanks)
-	    c = (FcChar32 *) realloc (b->blanks, sblank * sizeof (FcChar32));
-	else
-	    c = (FcChar32 *) malloc (sblank * sizeof (FcChar32));
-	if (!c)
-	    return FcFalse;
-	b->sblank = sblank;
-	b->blanks = c;
-    }
-    b->blanks[b->nblank++] = ucs4;
-    return FcTrue;
-}
-
-FcBool
-FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4)
-{
-    int lower = 0, higher = b->nblank, middle;
-
-    if (b->nblank == 0 ||
-	b->blanks[0] > ucs4 ||
-	b->blanks[b->nblank - 1] < ucs4)
-	return FcFalse;
-    while (1)
-    {
-	middle = (lower + higher) / 2;
-	if (b->blanks[middle] == ucs4)
-	    return FcTrue;
-	if (lower >= higher)
-	    break;
-	if (b->blanks[middle] < ucs4)
-	    lower = middle + 1;
-	else
-	    higher = middle - 1;
-    }
-
-    return FcFalse;
-}
-#define __fcblanks__
-#include "fcaliastail.h"
-#undef __fcblanks__
diff --git a/src/fccfg.c b/src/fccfg.c
index 9f8ee7c..8c246c0 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -27,7 +27,6 @@
 #include "fcint.h"
 #include <dirent.h>
 #include <sys/types.h>
-#include "../fc-blanks/fcblanks.h"
 
 #if defined (_WIN32) && !defined (R_OK)
 #define R_OK 4
@@ -110,8 +109,6 @@ FcConfigCreate (void)
     if (!config->cacheDirs)
 	goto bail8;
 
-    config->blanks = &fcBlanks;
-
     config->substPattern = 0;
     config->substFont = 0;
     config->substScan = 0;
@@ -276,9 +273,6 @@ FcConfigDestroy (FcConfig *config)
     FcFontSetDestroy (config->acceptPatterns);
     FcFontSetDestroy (config->rejectPatterns);
 
-    if (config->blanks)
-	FcBlanksDestroy (config->blanks);
-
     FcSubstDestroy (config->substPattern);
     FcSubstDestroy (config->substFont);
     FcSubstDestroy (config->substScan);
@@ -569,41 +563,50 @@ FcConfigSetFonts (FcConfig	*config,
     config->fonts[set] = fonts;
 }
 
+
+FcBlanks *
+FcBlanksCreate (void)
+{
+    /* Deprecated. */
+    return NULL;
+}
+
+void
+FcBlanksDestroy (FcBlanks *b)
+{
+    /* Deprecated. */
+}
+
+FcBool
+FcBlanksAdd (FcBlanks *b, FcChar32 ucs4)
+{
+    /* Deprecated. */
+    return FcFalse;
+}
+
+FcBool
+FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4)
+{
+    /* Deprecated. */
+    return FcFalse;
+}
+
 FcBlanks *
 FcConfigGetBlanks (FcConfig	*config)
 {
-    if (!config)
-    {
-	config = FcConfigGetCurrent ();
-	if (!config)
-	    return 0;
-    }
-    return config->blanks;
+    /* Deprecated. */
+    return NULL;
 }
 
 FcBool
 FcConfigAddBlank (FcConfig	*config,
 		  FcChar32    	blank)
 {
-    FcBlanks	*b, *freeme = 0;
-
-    b = config->blanks;
-    if (!b)
-    {
-	freeme = b = FcBlanksCreate ();
-	if (!b)
-	    return FcFalse;
-    }
-    if (!FcBlanksAdd (b, blank))
-    {
-        if (freeme)
-            FcBlanksDestroy (freeme);
-	return FcFalse;
-    }
-    config->blanks = b;
-    return FcTrue;
+    /* Deprecated. */
+    return FcFalse;
 }
 
+
 int
 FcConfigGetRescanInterval (FcConfig *config)
 {
@@ -2221,7 +2224,7 @@ FcConfigAppFontAddFile (FcConfig    *config,
 	FcConfigSetFonts (config, set, FcSetApplication);
     }
 	
-    if (!FcFileScanConfig (set, subdirs, config->blanks, file, config))
+    if (!FcFileScanConfig (set, subdirs, file, config))
     {
 	FcStrSetDestroy (subdirs);
 	return FcFalse;
diff --git a/src/fcdir.c b/src/fcdir.c
index c8aaf54..b6c0bf0 100644
--- a/src/fcdir.c
+++ b/src/fcdir.c
@@ -64,7 +64,6 @@ FcFileIsFile (const FcChar8 *file)
 
 static FcBool
 FcFileScanFontConfig (FcFontSet		*set,
-		      FcBlanks		*blanks,
 		      const FcChar8	*file,
 		      FcConfig		*config)
 {
@@ -99,7 +98,7 @@ FcFileScanFontConfig (FcFontSet		*set,
 	    return FcFalse;
 	num_faces = face->num_faces;
 	num_instances = face->style_flags >> 16;
-	font = FcFreeTypeQueryFace (face, file, id, blanks);
+	font = FcFreeTypeQueryFace (face, file, id, NULL);
 	FT_Done_Face (face);
 
 	if (FcDebug () & FC_DBG_SCAN)
@@ -174,7 +173,6 @@ FcFileScanFontConfig (FcFontSet		*set,
 FcBool
 FcFileScanConfig (FcFontSet	*set,
 		  FcStrSet	*dirs,
-		  FcBlanks	*blanks,
 		  const FcChar8	*file,
 		  FcConfig	*config)
 {
@@ -201,7 +199,7 @@ FcFileScanConfig (FcFontSet	*set,
     else
     {
 	if (set)
-	    return FcFileScanFontConfig (set, blanks, file, config);
+	    return FcFileScanFontConfig (set, file, config);
 	else
 	    return FcTrue;
     }
@@ -211,11 +209,11 @@ FcBool
 FcFileScan (FcFontSet	    *set,
 	    FcStrSet	    *dirs,
 	    FcFileCache	    *cache FC_UNUSED,
-	    FcBlanks	    *blanks,
+	    FcBlanks	    *blanks FC_UNUSED,
 	    const FcChar8   *file,
 	    FcBool	    force FC_UNUSED)
 {
-    return FcFileScanConfig (set, dirs, blanks, file, FcConfigGetCurrent ());
+    return FcFileScanConfig (set, dirs, file, FcConfigGetCurrent ());
 }
 
 /*
@@ -230,7 +228,6 @@ cmpstringp(const void *p1, const void *p2)
 FcBool
 FcDirScanConfig (FcFontSet	*set,
 		 FcStrSet	*dirs,
-		 FcBlanks	*blanks,
 		 const FcChar8	*dir,
 		 FcBool		force, /* XXX unused */
 		 FcConfig	*config)
@@ -249,9 +246,6 @@ FcDirScanConfig (FcFontSet	*set,
     if (!set && !dirs)
 	return FcTrue;
 
-    if (!blanks)
-	blanks = FcConfigGetBlanks (config);
-
     /* freed below */
     file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
     if (!file) {
@@ -302,7 +296,7 @@ FcDirScanConfig (FcFontSet	*set,
      * Scan file files to build font patterns
      */
     for (i = 0; i < files->num; i++)
-	FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
+	FcFileScanConfig (set, dirs, files->strs[i], config);
 
 bail2:
     FcStrSetDestroy (files);
@@ -318,15 +312,15 @@ bail:
 FcBool
 FcDirScan (FcFontSet	    *set,
 	   FcStrSet	    *dirs,
-	   FcFileCache	    *cache, /* XXX unused */
-	   FcBlanks	    *blanks,
+	   FcFileCache	    *cache FC_UNUSED,
+	   FcBlanks	    *blanks FC_UNUSED,
 	   const FcChar8    *dir,
-	   FcBool	    force /* XXX unused */)
+	   FcBool	    force FC_UNUSED)
 {
     if (cache || !force)
 	return FcFalse;
 
-    return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent ());
+    return FcDirScanConfig (set, dirs, dir, force, FcConfigGetCurrent ());
 }
 
 /*
@@ -368,7 +362,7 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     /*
      * Scan the dir
      */
-    if (!FcDirScanConfig (set, dirs, NULL, d, FcTrue, config))
+    if (!FcDirScanConfig (set, dirs, d, FcTrue, config))
 	goto bail2;
 
     /*
@@ -427,7 +421,7 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
     /*
      * Scan the dir
      */
-    if (!FcDirScanConfig (NULL, dirs, NULL, d, FcTrue, config))
+    if (!FcDirScanConfig (NULL, dirs, d, FcTrue, config))
 	goto bail1;
     /*
      * Rebuild the cache object
diff --git a/src/fcint.h b/src/fcint.h
index 360d80d..57c9f41 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -471,12 +471,6 @@ struct _FcAtomic {
     FcChar8	*tmp;		/* tmpfile name (used for locking) */
 };
 
-struct _FcBlanks {
-    int		nblank;
-    int		sblank;
-    FcChar32	*blanks;
-};
-
 struct _FcConfig {
     /*
      * File names loaded from the configuration -- saved here as the
@@ -485,11 +479,6 @@ struct _FcConfig {
      */
     FcStrSet	*configDirs;	    /* directories to scan for fonts */
     /*
-     * Set of allowed blank chars -- used to
-     * trim fonts of bogus glyphs
-     */
-    FcBlanks	*blanks;
-    /*
      * List of directories containing fonts,
      * built by recursively scanning the set
      * of configured directories
@@ -568,8 +557,6 @@ struct _FcValuePromotionBuffer {
   } u;
 };
 
-/* fcblanks.c */
-
 /* fccache.c */
 
 FcPrivate FcCache *
@@ -841,14 +828,12 @@ FcFileIsFile (const FcChar8 *file);
 FcPrivate FcBool
 FcFileScanConfig (FcFontSet	*set,
 		  FcStrSet	*dirs,
-		  FcBlanks	*blanks,
 		  const FcChar8 *file,
 		  FcConfig	*config);
 
 FcPrivate FcBool
 FcDirScanConfig (FcFontSet	*set,
 		 FcStrSet	*dirs,
-		 FcBlanks	*blanks,
 		 const FcChar8	*dir,
 		 FcBool		force,
 		 FcConfig	*config);
diff --git a/src/fcxml.c b/src/fcxml.c
index 9a061c8..842d609 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -352,7 +352,6 @@ typedef enum _FcElement {
     FcElementMatch,
     FcElementAlias,
 	
-    FcElementBlank,
     FcElementRescan,
 
     FcElementPrefer,
@@ -415,7 +414,6 @@ static const struct {
     { "match",		FcElementMatch },
     { "alias",		FcElementAlias },
 
-    { "blank",		FcElementBlank },
     { "rescan",		FcElementRescan },
 
     { "prefer",		FcElementPrefer },
@@ -1257,55 +1255,6 @@ FcStartElement(void *userData, const XML_Char *name, const XML_Char **attr)
 }
 
 static void
-FcParseBlank (FcConfigParse *parse)
-{
-    int		n = FcVStackElements (parse);
-#if 0
-    FcChar32	i, begin, end;
-#endif
-
-    FcConfigMessage (parse, FcSevereWarning, "blank doesn't take any effect anymore. please remove it from your fonts.conf");
-    while (n-- > 0)
-    {
-	FcVStack    *v = FcVStackFetch (parse, n);
-	if (!parse->config->blanks)
-	{
-	    parse->config->blanks = FcBlanksCreate ();
-	    if (!parse->config->blanks)
-		goto bail;
-	}
-	switch ((int) v->tag) {
-	case FcVStackInteger:
-#if 0
-	    if (!FcBlanksAdd (parse->config->blanks, v->u.integer))
-		goto bail;
-	    break;
-#endif
-	case FcVStackRange:
-#if 0
-	    begin = (FcChar32) v->u.range->begin;
-	    end = (FcChar32) v->u.range->end;
-	    if (begin <= end)
-	    {
-	      for (i = begin; i <= end; i++)
-	      {
-		  if (!FcBlanksAdd (parse->config->blanks, i))
-		      goto bail;
-	      }
-	    }
-#endif
-	    break;
-	default:
-	    FcConfigMessage (parse, FcSevereError, "invalid element in blank");
-	    break;
-	}
-    }
-    return;
-  bail:
-    FcConfigMessage (parse, FcSevereError, "out of memory");
-}
-
-static void
 FcParseRescan (FcConfigParse *parse)
 {
     int	    n = FcVStackElements (parse);
@@ -2936,9 +2885,6 @@ FcEndElement(void *userData, const XML_Char *name FC_UNUSED)
 	FcParseAlias (parse);
 	break;
 
-    case FcElementBlank:
-	FcParseBlank (parse);
-	break;
     case FcElementRescan:
 	FcParseRescan (parse);
 	break;
commit 3bd4dd27bd673950e47ccdfd58b798abc580b6a0
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 16:17:17 2017 +0100

    Remove fc-glyphname

diff --git a/Makefile.am b/Makefile.am
index 2b4a5b8..4a8edb0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,7 +21,7 @@
 #  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 #  PERFORMANCE OF THIS SOFTWARE.
 
-SUBDIRS=fontconfig fc-blanks fc-case fc-lang fc-glyphname src \
+SUBDIRS=fontconfig fc-blanks fc-case fc-lang src \
 	fc-cache fc-cat fc-list fc-match fc-pattern fc-query fc-scan \
 	fc-validate conf.d test
 if ENABLE_DOCS
diff --git a/configure.ac b/configure.ac
index 3cd7c47..322fb61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -760,7 +760,6 @@ AC_CONFIG_FILES([
 Makefile
 fontconfig/Makefile
 fc-lang/Makefile
-fc-glyphname/Makefile
 fc-blanks/Makefile
 fc-case/Makefile
 src/Makefile
diff --git a/fc-glyphname/Makefile.am b/fc-glyphname/Makefile.am
deleted file mode 100644
index 1272567..0000000
--- a/fc-glyphname/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- encoding: utf-8 -*-
-#
-# Copyright © 2003  Keith Packard
-# Copyright © 2013  Google, Inc.
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of the author(s) not be used in
-# advertising or publicity pertaining to distribution of the software without
-# specific, written prior permission.  The authors make no
-# representations about the suitability of this software for any purpose.  It
-# is provided "as is" without express or implied warranty.
-#
-# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
-# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-# PERFORMANCE OF THIS SOFTWARE.
-#
-# Google Author(s): Behdad Esfahbod
-
-TAG = glyphname
-DEPS = $(srcdir)/zapfdingbats.txt
-ARGS = $(srcdir)/zapfdingbats.txt
-DIST = $(srcdir)/zapfdingbats.txt
-
-include $(top_srcdir)/Tools.mk
-
--include $(top_srcdir)/git.mk
diff --git a/fc-glyphname/fc-glyphname.c b/fc-glyphname/fc-glyphname.c
deleted file mode 100644
index 078490a..0000000
--- a/fc-glyphname/fc-glyphname.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * fontconfig/fc-glyphname/fc-glyphname.c
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the author(s) not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The authors make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "fcint.h"
-
-static int
-rawindex (const FcGlyphName *gn);
-
-static void
-scan (FILE *f, char *filename);
-
-static int
-isprime (int i);
-
-static void
-find_hash (void);
-
-static FcChar32
-FcHashGlyphName (const FcChar8 *name);
-
-static void
-insert (FcGlyphName *gn, FcGlyphName **table, FcChar32 h);
-
-static void
-dump (FcGlyphName * const *table, const char *name);
-
-static FcGlyphName *
-FcAllocGlyphName (FcChar32 ucs, FcChar8 *name)
-{
-    FcGlyphName	*gn;
-
-    gn = malloc (sizeof (FcGlyphName) + strlen ((char *) name));
-    if (!gn)
-	return 0;
-    gn->ucs = ucs;
-    strcpy ((char *) gn->name, (char *) name);
-    return gn;
-}
-
-static void
-fatal (const char *file, int lineno, const char *msg)
-{
-    if (lineno)
-        fprintf (stderr, "%s:%d: %s\n", file, lineno, msg);
-    else
-	fprintf (stderr, "%s: %s\n", file, msg);
-
-    exit (1);
-}
-
-#define MAX_GLYPHFILE	    256
-#define MAX_GLYPHNAME	    10240
-#define MAX_NAMELEN	    1024
-
-static FcGlyphName *raw[MAX_GLYPHNAME];
-static int	    nraw;
-static int	    max_name_len;
-static FcGlyphName *name_to_ucs[MAX_GLYPHNAME*2];
-static FcGlyphName *ucs_to_name[MAX_GLYPHNAME*2];
-static unsigned int hash, rehash;
-
-static int
-rawindex (const FcGlyphName *gn)
-{
-    int	i;
-
-    for (i = 0; i < nraw; i++)
-	if (raw[i] == gn)
-	    return i;
-    return -1;
-}
-
-static void
-scan (FILE *f, char *filename)
-{
-    char	    buf[MAX_NAMELEN];
-    char	    name[MAX_NAMELEN];
-    unsigned long   ucs;
-    FcGlyphName	    *gn;
-    int		    lineno = 0;
-    int		    len;
-
-    while (fgets (buf, sizeof (buf), f))
-    {
-	lineno++;
-	if (sscanf (buf, "%[^;];%lx\n", name, &ucs) != 2)
-	    continue;
-	gn = FcAllocGlyphName ((FcChar32) ucs, (FcChar8 *) name);
-	if (!gn)
-	    fatal (filename, lineno, "out of memory");
-	len = strlen (name);
-	if (len > max_name_len)
-	    max_name_len = len;
-	raw[nraw++] = gn;
-    }
-}
-
-static int compare_string (const void *a, const void *b)
-{
-    const char    *const *as = a, *const *bs = b;
-    return strcmp (*as, *bs);
-}
-
-static int compare_glyphname (const void *a, const void *b)
-{
-    const FcGlyphName	*const *ag = a, *const *bg = b;
-
-    return strcmp ((char *) (*ag)->name, (char *) (*bg)->name);
-}
-
-static int
-isqrt (int a)
-{
-    int	    l, h, m;
-
-    l = 2;
-    h = a/2;
-    while ((h-l) > 1)
-    {
-	m = (h+l) >> 1;
-	if (m * m < a)
-	    l = m;
-	else
-	    h = m;
-    }
-    return h;
-}
-
-static int
-isprime (int i)
-{
-    int	l, t;
-
-    if (i < 2)
-	return FcFalse;
-    if ((i & 1) == 0)
-    {
-	if (i == 2)
-	    return FcTrue;
-	return FcFalse;
-    }
-    l = isqrt (i) + 1;
-    for (t = 3; t <= l; t += 2)
-	if (i % t == 0)
-	    return 0;
-    return 1;
-}
-
-/*
- * Find a prime pair that leaves at least 25% of the hash table empty
- */
-
-static void
-find_hash (void)
-{
-    int	h;
-
-    h = nraw + nraw / 4;
-    if ((h & 1) == 0)
-	h++;
-    while (!isprime(h-2) || !isprime(h))
-	h += 2;
-    hash = h;
-    rehash = h-2;
-}
-
-static FcChar32
-FcHashGlyphName (const FcChar8 *name)
-{
-    FcChar32	h = 0;
-    FcChar8	c;
-
-    while ((c = *name++))
-    {
-	h = ((h << 1) | (h >> 31)) ^ c;
-    }
-    return h;
-}
-
-static void
-insert (FcGlyphName *gn, FcGlyphName **table, FcChar32 h)
-{
-    unsigned int	i, r = 0;
-
-    i = (int) (h % hash);
-    while (table[i])
-    {
-	if (!r) r = (h % rehash + 1);
-	i += r;
-	if (i >= hash)
-	    i -= hash;
-    }
-    table[i] = gn;
-}
-
-static void
-dump (FcGlyphName * const *table, const char *name)
-{
-    unsigned int	    i;
-
-    printf ("static const FcGlyphId %s[%d] = {\n", name, hash);
-
-    for (i = 0; i < hash; i++)
-	if (table[i])
-	    printf ("    %d,\n", rawindex(table[i]));
-	else
-	    printf ("    -1,\n");
-
-    printf ("};\n");
-}
-
-int
-main (int argc FC_UNUSED, char **argv)
-{
-    char	*files[MAX_GLYPHFILE + 1];
-    char	line[1024];
-    FILE	*f;
-    int		i;
-    const char	*type;
-
-    i = 0;
-    while (argv[i+1])
-    {
-	if (i == MAX_GLYPHFILE)
-	    fatal (*argv, 0, "Too many glyphname files");
-	files[i] = argv[i+1];
-	i++;
-    }
-    files[i] = 0;
-    qsort (files, i, sizeof (char *), compare_string);
-    for (i = 0; files[i]; i++)
-    {
-	f = fopen (files[i], "r");
-	if (!f)
-	    fatal (files[i], 0, strerror (errno));
-	scan (f, files[i]);
-	fclose (f);
-    }
-    qsort (raw, nraw, sizeof (FcGlyphName *), compare_glyphname);
-
-    find_hash ();
-
-    for (i = 0; i < nraw; i++)
-    {
-	insert (raw[i], name_to_ucs, FcHashGlyphName (raw[i]->name));
-	insert (raw[i], ucs_to_name, raw[i]->ucs);
-    }
-
-    /*
-     * Scan the input until the marker is found
-     */
-
-    while (fgets (line, sizeof (line), stdin))
-    {
-	if (!strncmp (line, "@@@", 3))
-	    break;
-	fputs (line, stdout);
-    }
-
-    printf ("/* %d glyphnames in %d entries, %d%% occupancy */\n\n",
-	    nraw, hash, nraw * 100 / hash);
-
-    printf ("#define FC_GLYPHNAME_HASH %u\n", hash);
-    printf ("#define FC_GLYPHNAME_REHASH %u\n", rehash);
-    printf ("#define FC_GLYPHNAME_MAXLEN %d\n\n", max_name_len);
-    if (nraw < 128)
-	type = "int8_t";
-    else if (nraw < 32768)
-	type = "int16_t";
-    else
-	type = "int32_t";
-
-    printf ("typedef %s FcGlyphId;\n\n", type);
-
-    /*
-     * Dump out entries
-     */
-
-    printf ("static const struct { const FcChar32 ucs; const FcChar8 name[%d]; } _fc_glyph_names[%d] = {\n",
-	    max_name_len + 1, nraw);
-
-    for (i = 0; i < nraw; i++)
-	printf ("    { 0x%lx, \"%s\" },\n",
-		(unsigned long) raw[i]->ucs, raw[i]->name);
-
-    printf ("};\n");
-
-    /*
-     * Dump out name_to_ucs table
-     */
-
-    dump (name_to_ucs, "_fc_name_to_ucs");
-
-    /*
-     * Dump out ucs_to_name table
-     */
-    dump (ucs_to_name, "_fc_ucs_to_name");
-
-    while (fgets (line, sizeof (line), stdin))
-	fputs (line, stdout);
-
-    fflush (stdout);
-    exit (ferror (stdout));
-}
diff --git a/fc-glyphname/fcglyphname.tmpl.h b/fc-glyphname/fcglyphname.tmpl.h
deleted file mode 100644
index d4f8a95..0000000
--- a/fc-glyphname/fcglyphname.tmpl.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * fontconfig/fc-glyphname/fcglyphname.tmpl.h
- *
- * Copyright © 2003 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the author(s) not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The authors make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-@@@
diff --git a/fc-glyphname/zapfdingbats.txt b/fc-glyphname/zapfdingbats.txt
deleted file mode 100644
index bcad2e2..0000000
--- a/fc-glyphname/zapfdingbats.txt
+++ /dev/null
@@ -1,212 +0,0 @@
-# Name:          ITC Zapf Dingbats Glyph List
-# Table version: 2.0
-# Date:          September 20, 2002
-#
-# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
-#
-# Format: Semicolon-delimited fields:
-#            (1) glyph name
-#            (2) Unicode scalar value
-#
-a100;275E
-a101;2761
-a102;2762
-a103;2763
-a104;2764
-a105;2710
-a106;2765
-a107;2766
-a108;2767
-a109;2660
-a10;2721
-a110;2665
-a111;2666
-a112;2663
-a117;2709
-a118;2708
-a119;2707
-a11;261B
-a120;2460
-a121;2461
-a122;2462
-a123;2463
-a124;2464
-a125;2465
-a126;2466
-a127;2467
-a128;2468
-a129;2469
-a12;261E
-a130;2776
-a131;2777
-a132;2778
-a133;2779
-a134;277A
-a135;277B
-a136;277C
-a137;277D
-a138;277E
-a139;277F
-a13;270C
-a140;2780
-a141;2781
-a142;2782
-a143;2783
-a144;2784
-a145;2785
-a146;2786
-a147;2787
-a148;2788
-a149;2789
-a14;270D
-a150;278A
-a151;278B
-a152;278C
-a153;278D
-a154;278E
-a155;278F
-a156;2790
-a157;2791
-a158;2792
-a159;2793
-a15;270E
-a160;2794
-a161;2192
-a162;27A3
-a163;2194
-a164;2195
-a165;2799
-a166;279B
-a167;279C
-a168;279D
-a169;279E
-a16;270F
-a170;279F
-a171;27A0
-a172;27A1
-a173;27A2
-a174;27A4
-a175;27A5
-a176;27A6
-a177;27A7
-a178;27A8
-a179;27A9
-a17;2711
-a180;27AB
-a181;27AD
-a182;27AF
-a183;27B2
-a184;27B3
-a185;27B5
-a186;27B8
-a187;27BA
-a188;27BB
-a189;27BC
-a18;2712
-a190;27BD
-a191;27BE
-a192;279A
-a193;27AA
-a194;27B6
-a195;27B9
-a196;2798
-a197;27B4
-a198;27B7
-a199;27AC
-a19;2713
-a1;2701
-a200;27AE
-a201;27B1
-a202;2703
-a203;2750
-a204;2752
-a205;276E
-a206;2770
-a20;2714
-a21;2715
-a22;2716
-a23;2717
-a24;2718
-a25;2719
-a26;271A
-a27;271B
-a28;271C
-a29;2722
-a2;2702
-a30;2723
-a31;2724
-a32;2725
-a33;2726
-a34;2727
-a35;2605
-a36;2729
-a37;272A
-a38;272B
-a39;272C
-a3;2704
-a40;272D
-a41;272E
-a42;272F
-a43;2730
-a44;2731
-a45;2732
-a46;2733
-a47;2734
-a48;2735
-a49;2736
-a4;260E
-a50;2737
-a51;2738
-a52;2739
-a53;273A
-a54;273B
-a55;273C
-a56;273D
-a57;273E
-a58;273F
-a59;2740
-a5;2706
-a60;2741
-a61;2742
-a62;2743
-a63;2744
-a64;2745
-a65;2746
-a66;2747
-a67;2748
-a68;2749
-a69;274A
-a6;271D
-a70;274B
-a71;25CF
-a72;274D
-a73;25A0
-a74;274F
-a75;2751
-a76;25B2
-a77;25BC
-a78;25C6
-a79;2756
-a7;271E
-a81;25D7
-a82;2758
-a83;2759
-a84;275A
-a85;276F
-a86;2771
-a87;2772
-a88;2773
-a89;2768
-a8;271F
-a90;2769
-a91;276C
-a92;276D
-a93;276A
-a94;276B
-a95;2774
-a96;2775
-a97;275B
-a98;275C
-a99;275D
-a9;2720
-#-- end
diff --git a/src/Makefile.am b/src/Makefile.am
index 726c435..a59183f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -89,7 +89,6 @@ ALIAS_FILES = fcalias.h fcaliastail.h fcftalias.h fcftaliastail.h
 
 BUILT_SOURCES = $(ALIAS_FILES) \
 	../fc-case/fccase.h \
-	../fc-glyphname/fcglyphname.h \
 	../fc-lang/fclang.h \
 	stamp-fcstdint \
 	fcobjshash.h \
@@ -99,8 +98,6 @@ noinst_PROGRAMS = fcarch
 
 ../fc-case/fccase.h:
 	cd ../fc-case && $(MAKE) $(AM_MAKEFLAGS) fccase.h
-../fc-glyphname/fcglyphname.h:
-	cd ../fc-glyphname && $(MAKE) $(AM_MAKEFLAGS) fcglyphname.h
 ../fc-lang/fclang.h:
 	cd ../fc-lang && $(MAKE) $(AM_MAKEFLAGS) fclang.h
 
commit c7ef8808c441c89fe16183fbfdca291f50fc3ec1
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 15:17:34 2017 +0100

    Remove unused variable

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 1115463..f0e2f1c 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2112,9 +2112,6 @@ FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 {
     FcChar32	    page, off, ucs4;
-#ifdef CHECK
-    FcChar32	    font_max = 0;
-#endif
     FcCharSet	    *fcs;
     FcCharLeaf	    *leaf;
     int		    o;
@@ -2190,10 +2187,6 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 		    }
 		    off = ucs4 & 0xff;
 		    leaf->map[off >> 5] |= (1 << (off & 0x1f));
-#ifdef CHECK
-		    if (ucs4 > font_max)
-			font_max = ucs4;
-#endif
 		}
 		ucs4 = FT_Get_Next_Char (face, ucs4, &glyph);
 	    }
commit 16d779115982012db0c93d8c4c735a9fb7a57dfb
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 15:13:34 2017 +0100

    Remove use of psnames for charset construction
    
    This is ancient.  No font we care baout uses them.  Kill.
    
    This also makes fc-glyphname machinery obsolete.  Should be removed.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 6224ca6..1115463 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2007,122 +2007,6 @@ static const FT_Encoding fcFontEncodings[] = {
 
 #define NUM_DECODE  (int) (sizeof (fcFontEncodings) / sizeof (fcFontEncodings[0]))
 
-#include "../fc-glyphname/fcglyphname.h"
-
-static FcChar32
-FcHashGlyphName (const FcChar8 *name)
-{
-    FcChar32	h = 0;
-    FcChar8	c;
-
-    while ((c = *name++))
-    {
-	h = ((h << 1) | (h >> 31)) ^ c;
-    }
-    return h;
-}
-
-#if HAVE_FT_HAS_PS_GLYPH_NAMES
-/*
- * Use Type1 glyph names for fonts which have reliable names
- * and which export an Adobe Custom mapping
- */
-static FcBool
-FcFreeTypeUseNames (FT_Face face)
-{
-    FT_Int  map;
-
-    if (!FT_Has_PS_Glyph_Names (face))
-	return FcFalse;
-    for (map = 0; map < face->num_charmaps; map++)
-	if (face->charmaps[map]->encoding == ft_encoding_adobe_custom)
-	    return FcTrue;
-    return FcFalse;
-}
-
-static const FcChar8 *
-FcUcs4ToGlyphName (FcChar32 ucs4)
-{
-    int		i = (int) (ucs4 % FC_GLYPHNAME_HASH);
-    int		r = 0;
-    FcGlyphId	gn;
-
-    while ((gn = _fc_ucs_to_name[i]) != -1)
-    {
-	if (_fc_glyph_names[gn].ucs == ucs4)
-	    return _fc_glyph_names[gn].name;
-	if (!r)
-	{
-	    r = (int) (ucs4 % FC_GLYPHNAME_REHASH);
-	    if (!r)
-		r = 1;
-	}
-	i += r;
-	if (i >= FC_GLYPHNAME_HASH)
-	    i -= FC_GLYPHNAME_HASH;
-    }
-    return 0;
-}
-
-static FcChar32
-FcGlyphNameToUcs4 (FcChar8 *name)
-{
-    FcChar32	h = FcHashGlyphName (name);
-    int		i = (int) (h % FC_GLYPHNAME_HASH);
-    int		r = 0;
-    FcGlyphId	gn;
-
-    while ((gn = _fc_name_to_ucs[i]) != -1)
-    {
-	if (!strcmp ((char *) name, (char *) _fc_glyph_names[gn].name))
-	    return _fc_glyph_names[gn].ucs;
-	if (!r)
-	{
-	    r = (int) (h % FC_GLYPHNAME_REHASH);
-	    if (!r)
-		r = 1;
-	}
-	i += r;
-	if (i >= FC_GLYPHNAME_HASH)
-	    i -= FC_GLYPHNAME_HASH;
-    }
-    return 0xffff;
-}
-
-/*
- * Work around a bug in some FreeType versions which fail
- * to correctly bounds check glyph name buffers and overwrite
- * the stack. As Postscript names have a limit of 127 characters,
- * this should be sufficient.
- */
-
-#if FC_GLYPHNAME_MAXLEN < 127
-# define FC_GLYPHNAME_BUFLEN 127
-#else
-# define FC_GLYPHNAME_BUFLEN FC_GLYPHNAME_MAXLEN
-#endif
-
-/*
- * Search through a font for a glyph by name.  This is
- * currently a linear search as there doesn't appear to be
- * any defined order within the font
- */
-static FT_UInt
-FcFreeTypeGlyphNameIndex (FT_Face face, const FcChar8 *name)
-{
-    FT_UInt gindex;
-    FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
-
-    for (gindex = 0; gindex < (FT_UInt) face->num_glyphs; gindex++)
-    {
-	if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
-	    if (!strcmp ((char *) name, (char *) name_buf))
-		return gindex;
-    }
-    return 0;
-}
-#endif
-
 /*
  * Map a UCS4 glyph to a glyph index.  Use all available encoding
  * tables to try and find one that works.  This information is expected
@@ -2180,21 +2064,6 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
 		return glyphindex;
 	}
     }
-#if HAVE_FT_HAS_PS_GLYPH_NAMES
-    /*
-     * Check postscript name table if present
-     */
-    if (FcFreeTypeUseNames (face))
-    {
-	const FcChar8	*name = FcUcs4ToGlyphName (ucs4);
-	if (name)
-	{
-	    glyphindex = FcFreeTypeGlyphNameIndex (face, name);
-	    if (glyphindex)
-		return glyphindex;
-	}
-    }
-#endif
     return 0;
 }
 
@@ -2362,54 +2231,6 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 
        break;
     }
-#if HAVE_FT_HAS_PS_GLYPH_NAMES
-    /*
-     * Add mapping from PS glyph names if available
-     */
-    if (FcFreeTypeUseNames (face))
-    {
-	FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2];
-
-	for (glyph = 0; glyph < (FT_UInt) face->num_glyphs; glyph++)
-	{
-	    if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
-	    {
-		ucs4 = FcGlyphNameToUcs4 (name_buf);
-		if (ucs4 != 0xffff &&
-		    FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
-		{
-		    if (advance)
-		    {
-			if (!has_advance)
-			{
-			    has_advance = FcTrue;
-			    advance_one = advance;
-			}
-			else if (!APPROXIMATELY_EQUAL (advance, advance_one))
-			{
-			    if (fixed_advance)
-			    {
-				dual_advance = FcTrue;
-				fixed_advance = FcFalse;
-				advance_two = advance;
-			    }
-			    else if (!APPROXIMATELY_EQUAL (advance, advance_two))
-				dual_advance = FcFalse;
-			}
-		    }
-		    leaf = FcCharSetFindLeafCreate (fcs, ucs4);
-		    if (!leaf)
-			goto bail1;
-		    leaf->map[(ucs4 & 0xff) >> 5] |= (1 << (ucs4 & 0x1f));
-#ifdef CHECK
-		    if (ucs4 > font_max)
-			font_max = ucs4;
-#endif
-		}
-	    }
-	}
-    }
-#endif
     if (fixed_advance)
 	*spacing = FC_MONO;
     else if (dual_advance && APPROXIMATELY_EQUAL (2 * FC_MIN (advance_one, advance_two), FC_MAX (advance_one, advance_two)))
commit 82d6286657dc12ce42a9c67cae1546543e44f89e
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 15:03:57 2017 +0100

    Remove check that cannot fail

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 6fd7285..6224ca6 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2410,24 +2410,6 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 	}
     }
 #endif
-#ifdef CHECK
-    printf ("%d glyphs %d encoded\n", (int) face->num_glyphs, FcCharSetCount (fcs));
-    for (ucs4 = 0x0020; ucs4 <= font_max; ucs4++)
-    {
-	FcBool	has_char = (glyph = FcFreeTypeCharIndex (face, ucs4)) != 0;
-	FcBool	has_bit = FcCharSetHasChar (fcs, ucs4);
-
-	if (has_char && !has_bit)
-	{
-	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
-		printf ("Bitmap missing broken char 0x%x\n", ucs4);
-	    else
-		printf ("Bitmap missing char 0x%x\n", ucs4);
-	}
-	else if (!has_char && has_bit)
-	    printf ("Bitmap extra char 0x%x\n", ucs4);
-    }
-#endif
     if (fixed_advance)
 	*spacing = FC_MONO;
     else if (dual_advance && APPROXIMATELY_EQUAL (2 * FC_MIN (advance_one, advance_two), FC_MAX (advance_one, advance_two)))
commit f309819d77bffaf802bdd9cd227c2a5bcbda0334
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 15:00:55 2017 +0100

    Remove a few unused blanks parameters
    
    The entire blanks thingy is now unused.  We should remove more of it.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 026948f..6fd7285 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2201,7 +2201,7 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
 static FcBool
 FcFreeTypeCheckGlyph (FT_Face face,
 		      FcChar32 ucs4,
-		      FT_UInt glyph, FcBlanks *blanks,
+		      FT_UInt glyph,
 		      FT_Pos *advance)
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
@@ -2290,7 +2290,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
             ucs4 = FT_Get_First_Char (face, &glyph);
             while (glyph != 0)
 	    {
-		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
 		{
 		    if (advance)
 		    {
@@ -2376,7 +2376,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 	    {
 		ucs4 = FcGlyphNameToUcs4 (name_buf);
 		if (ucs4 != 0xffff &&
-		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+		    FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
 		{
 		    if (advance)
 		    {
@@ -2419,7 +2419,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 
 	if (has_char && !has_bit)
 	{
-	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
+	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, &advance))
 		printf ("Bitmap missing broken char 0x%x\n", ucs4);
 	    else
 		printf ("Bitmap missing char 0x%x\n", ucs4);
commit e517886dedb4013951325a6b8670c39c2c69c837
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 14:59:26 2017 +0100

    Remove unnecessary check
    
    Argument advance is never set to NULL coming into this function.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index f0a2368..026948f 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2219,11 +2219,8 @@ FcFreeTypeCheckGlyph (FT_Face face,
     if (face->face_flags & FT_FACE_FLAG_SCALABLE)
 	load_flags |= FT_LOAD_NO_BITMAP;
 
-    if (advance)
-    {
-	*advance = 0;
-	FT_Get_Advance (face, glyph, load_flags, advance);
-    }
+    *advance = 0;
+    FT_Get_Advance (face, glyph, load_flags, advance);
 
     /* CID fonts built by Adobe used to make ASCII control chars to cid1
      * (space glyph). As such, always check contour for those characters. */
commit 5f6c0594f97f53e9b0be8341c790bd97023ef443
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 14:57:03 2017 +0100

    Minor: adjust debug output
    
    Ignore control chars for purpose of emptiness check.  I *think* U+0000 and U+000D
    are rendered empty, but since they are not in blanks, for now just ignore them.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index a3bdf85..f0a2368 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2349,7 +2349,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 		}
 	    }
 #ifdef CHECK
-	    for (ucs4 = 0; ucs4 < 0x10000; ucs4++)
+	    for (ucs4 = 0x0020; ucs4 < 0x10000; ucs4++)
 	    {
 		FcBool	    FT_Has, FC_Has;
 
@@ -2415,7 +2415,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 #endif
 #ifdef CHECK
     printf ("%d glyphs %d encoded\n", (int) face->num_glyphs, FcCharSetCount (fcs));
-    for (ucs4 = 0; ucs4 <= font_max; ucs4++)
+    for (ucs4 = 0x0020; ucs4 <= font_max; ucs4++)
     {
 	FcBool	has_char = (glyph = FcFreeTypeCharIndex (face, ucs4)) != 0;
 	FcBool	has_bit = FcCharSetHasChar (fcs, ucs4);
commit 659afb2987b5fdc202690678b563ef05acdb9686
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 14:43:16 2017 +0100

    Add back code for choosing strike, and cleanup
    
    The FT_Select_Size() call is important for bitmap-only fonts.
    Put it back.  It was removed in e327c4e54544dac5415e8864e80d6b75a0c900fd
    Remove some unused abstractions.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index c59f203..a3bdf85 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2202,17 +2202,13 @@ static FcBool
 FcFreeTypeCheckGlyph (FT_Face face,
 		      FcChar32 ucs4,
 		      FT_UInt glyph, FcBlanks *blanks,
-		      FT_Pos *advance,
-		      FcBool using_strike)
+		      FT_Pos *advance)
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
 
     if (!glyph)
 	return FcFalse;
 
-    if (using_strike)
-	load_flags &= ~FT_LOAD_NO_SCALE;
-
     /*
      * When using scalable fonts, only report those glyphs
      * which can be scaled; otherwise those fonts will
@@ -2246,11 +2242,8 @@ FcFreeTypeCheckGlyph (FT_Face face,
 
 #define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
 
-static FcCharSet *
-FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
-				    FcBlanks *blanks,
-				    int *spacing,
-				    FT_Int strike_index)
+FcCharSet *
+FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 {
     FcChar32	    page, off, ucs4;
 #ifdef CHECK
@@ -2262,17 +2255,27 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
     FT_UInt	    glyph;
     FT_Pos	    advance, advance_one = 0, advance_two = 0;
     FcBool	    has_advance = FcFalse, fixed_advance = FcTrue, dual_advance = FcFalse;
-    FcBool	    using_strike = FcFalse;
 
     fcs = FcCharSetCreate ();
     if (!fcs)
 	goto bail0;
 
 #if HAVE_FT_SELECT_SIZE
-    if (strike_index >= 0) {
+    if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
+	face->num_fixed_sizes > 0 &&
+	FT_Get_Sfnt_Table (face, ft_sfnt_head))
+    {
+	FT_Int strike_index = 0, i;
+	/* Select the face closest to 16 pixels tall */
+	for (i = 1; i < face->num_fixed_sizes; i++)
+	{
+	    if (abs (face->available_sizes[i].height - 16) <
+		abs (face->available_sizes[strike_index].height - 16))
+		strike_index = i;
+	}
+
 	if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
 	    goto bail1;
-	using_strike = FcTrue;
     }
 #endif
 
@@ -2290,7 +2293,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
             ucs4 = FT_Get_First_Char (face, &glyph);
             while (glyph != 0)
 	    {
-		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
 		{
 		    if (advance)
 		    {
@@ -2376,7 +2379,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
 	    {
 		ucs4 = FcGlyphNameToUcs4 (name_buf);
 		if (ucs4 != 0xffff &&
-		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
 		{
 		    if (advance)
 		    {
@@ -2419,7 +2422,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
 
 	if (has_char && !has_bit)
 	{
-	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance))
 		printf ("Bitmap missing broken char 0x%x\n", ucs4);
 	    else
 		printf ("Bitmap missing char 0x%x\n", ucs4);
@@ -2442,17 +2445,6 @@ bail0:
 }
 
 FcCharSet *
-FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
-{
-    FcCharSet	*cs;
-    FT_Int	strike_index = -1;
-
-    cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, strike_index);
-
-    return cs;
-}
-
-FcCharSet *
 FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
 {
     int spacing;
commit cd4043da0dfd61da73473b2f00d5e3a78ad13bec
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Fri Aug 4 12:22:42 2017 +0100

    Check for non-empty outline for U+0000..U+001F
    
    See comment for reason.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 7e37de5..c59f203 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -2229,6 +2229,18 @@ FcFreeTypeCheckGlyph (FT_Face face,
 	FT_Get_Advance (face, glyph, load_flags, advance);
     }
 
+    /* CID fonts built by Adobe used to make ASCII control chars to cid1
+     * (space glyph). As such, always check contour for those characters. */
+    if (ucs4 <= 0x001F)
+    {
+      if (FT_Load_Glyph (face, glyph, load_flags))
+	  return FcFalse;
+
+      if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE &&
+	  face->glyph->outline.n_contours == 0)
+	  return FcFalse;
+    }
+
     return FcTrue;
 }
 
commit 028b91c781681be077066f1f1e86386f3106792f
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Thu Aug 3 17:40:01 2017 +0100

    Don't even check loca for glyph outline detection
    
    Basically we trust the font cmap table now...
    
    New numbers:
    
    behdad:src 0$ time fc-scan ~/fonts/ > after-noloca
    
    real    0m55.788s
    user    0m15.836s
    sys     0m17.008s
    behdad:src 0$
    behdad:src 0$ time fc-scan ~/fonts/ > after-noloca
    
    real    0m24.794s
    user    0m12.164s
    sys     0m12.420s
    
    Before this change it was:
    
    behdad:src 130$ time fc-scan ~/fonts/ > after
    
    real    0m24.825s
    user    0m12.408s
    sys     0m11.356s
    
    Not any faster!  I suppose most time is being spent in loading cmap and advances now.
    I'll see about loading hmtx ourselves.
    
    With I/O numbers.  Before:
    
    behdad:src 0$ \time fc-scan ~/fonts/ > after
    11.66user 12.17system 0:24.03elapsed 99%CPU (0avgtext+0avgdata 487684maxresident)k
    2320inputs+50480outputs (21major+11468549minor)pagefaults 0swaps
    
    after:
    
    behdad:src 130$ \time fc-scan ~/fonts/ > after-noloca
    11.94user 11.99system 0:24.11elapsed 99%CPU (0avgtext+0avgdata 487704maxresident)k
    16inputs+50688outputs (0major+11464386minor)pagefaults 0swaps
    
    We are definitely doing a lot less I/O.  Surprisingly less in fact.  I don't get it.

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index a11e20b..7e37de5 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -53,7 +53,6 @@
 #include FT_FREETYPE_H
 #include FT_ADVANCES_H
 #include FT_TRUETYPE_TABLES_H
-#include FT_TRUETYPE_TAGS_H
 #include FT_SFNT_NAMES_H
 #include FT_TRUETYPE_IDS_H
 #include FT_TYPE1_TABLES_H
@@ -2199,19 +2198,8 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
     return 0;
 }
 
-typedef struct _FcFreeTypeCheckGlyphInfo
-{
-  unsigned int num_glyphs;
-  FcBool long_offset;
-  union {
-    FcChar32 u32[1];
-    FcChar16 u16[1];
-  } offsets;
-} FcFreeTypeCheckGlyphInfo;
-
 static FcBool
 FcFreeTypeCheckGlyph (FT_Face face,
-		      FcFreeTypeCheckGlyphInfo *info,
 		      FcChar32 ucs4,
 		      FT_UInt glyph, FcBlanks *blanks,
 		      FT_Pos *advance,
@@ -2219,6 +2207,9 @@ FcFreeTypeCheckGlyph (FT_Face face,
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
 
+    if (!glyph)
+	return FcFalse;
+
     if (using_strike)
 	load_flags &= ~FT_LOAD_NO_SCALE;
 
@@ -2232,44 +2223,12 @@ FcFreeTypeCheckGlyph (FT_Face face,
     if (face->face_flags & FT_FACE_FLAG_SCALABLE)
 	load_flags |= FT_LOAD_NO_BITMAP;
 
-    /*
-     * Previously, we used to load glyphs here...
-     * If the load succeeded, then for bitmap fonts we were
-     * accepting, and for outline glyphs, we'd check whether
-     * the outline is non-empty...
-     *
-     * The new logic skips much of that and only checks for
-     * outline non-emptiness for TrueType outlines.  We might
-     * want to add logic to load glyphs for bitmap-only fonts
-     * again.  If not, there's a whole lot more cruft that can
-     * be removed...
-     */
-
     if (advance)
     {
 	*advance = 0;
 	FT_Get_Advance (face, glyph, load_flags, advance);
     }
 
-    if (info)
-    {
-	if (glyph >= info->num_glyphs)
-	    return FcFalse;
-
-	if ((info->long_offset ?
-	     info->offsets.u32[glyph] == info->offsets.u32[glyph+1] :
-	     info->offsets.u16[glyph] == info->offsets.u16[glyph+1]))
-	{
-	    /*
-	     * Glyphs with no contours are only OK if
-	     * they're members of the Blanks set specified
-	     * in the configuration.  If blanks isn't set,
-	     * then allow any glyph to be blank
-	     */
-	    return !blanks || FcBlanksIsMember (blanks, ucs4);
-	}
-    }
-
     return FcTrue;
 }
 
@@ -2277,7 +2236,6 @@ FcFreeTypeCheckGlyph (FT_Face face,
 
 static FcCharSet *
 FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
-				    FcFreeTypeCheckGlyphInfo *info,
 				    FcBlanks *blanks,
 				    int *spacing,
 				    FT_Int strike_index)
@@ -2320,7 +2278,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
             ucs4 = FT_Get_First_Char (face, &glyph);
             while (glyph != 0)
 	    {
-		if (FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
+		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
 		{
 		    if (advance)
 		    {
@@ -2406,7 +2364,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
 	    {
 		ucs4 = FcGlyphNameToUcs4 (name_buf);
 		if (ucs4 != 0xffff &&
-		    FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
+		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
 		{
 		    if (advance)
 		    {
@@ -2449,7 +2407,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
 
 	if (has_char && !has_bit)
 	{
-	    if (!FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
+	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
 		printf ("Bitmap missing broken char 0x%x\n", ucs4);
 	    else
 		printf ("Bitmap missing char 0x%x\n", ucs4);
@@ -2476,61 +2434,8 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 {
     FcCharSet	*cs;
     FT_Int	strike_index = -1;
-    TT_Header	*head_table = FT_Get_Sfnt_Table (face, ft_sfnt_head);
-    FcFreeTypeCheckGlyphInfo	*info = NULL;
-
-    if (head_table)
-    {
-	/*
-	 * Check for bitmap-only ttf fonts that are missing the glyf table.
-	 * In that case, pick a size and look for glyphs in that size instead
-	 */
-	if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) && face->num_fixed_sizes > 0)
-	{
-	    int	    i;
-
-	    strike_index = 0;
-
-	    /* Select the face closest to 16 pixels tall */
-	    for (i = 1; i < face->num_fixed_sizes; i++) {
-		if (abs (face->available_sizes[i].height - 16) <
-		    abs (face->available_sizes[strike_index].height - 16))
-		    strike_index = i;
-	    }
-	}
-	else if (head_table->Glyph_Data_Format == 0)
-	{
-	    /* Try loading the 'loca' table, which we will later use to detect
-	     * glyphs without outline (to reject them).  If font is other than
-	     * TrueType outlines, we bypass that check. */
-	    unsigned int num_glyphs = face->num_glyphs;
-	    FcBool long_offset = head_table->Index_To_Loc_Format > 0;
-	    FT_ULong needed_len = (num_glyphs + 1) * (long_offset ? 4 : 2);
-	    FT_ULong table_len = 0;
-	    if (FT_Err_Ok == FT_Load_Sfnt_Table (face, TTAG_loca, 0, NULL, &table_len) &&
-		(table_len = FC_MIN(needed_len, table_len)) >= (long_offset ? 4 : 2) &&
-		(info = malloc (sizeof (*info) + table_len)))
-	    {
-		if (FT_Err_Ok != FT_Load_Sfnt_Table (face, TTAG_loca, 0,
-						     (FT_Byte *)&info->offsets, &table_len))
-		{
-		    free (info);
-		    info = NULL;
-		}
-		else
-		{
-		    info->num_glyphs = FC_MIN(num_glyphs,
-					      (table_len / (long_offset ? 4 : 2)) - 1);
-		    info->long_offset = long_offset;
-		}
-	    }
-	}
-    }
-
-    cs = FcFreeTypeCharSetAndSpacingForSize (face, info, blanks, spacing, strike_index);
 
-    if (info)
-	free (info);
+    cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, strike_index);
 
     return cs;
 }
commit ab02a49490ec0b0c8fc8f73ee5b4198a174b456d
Author: Behdad Esfahbod <behdad@xxxxxxxxxx>
Date:   Thu Aug 3 16:49:49 2017 +0100

    Instead of loading glyphs (with FreeType), just check loca table
    
    Part of https://bugs.freedesktop.org/show_bug.cgi?id=64766#c47
    
    This is the approach introduced in
    https://bugs.freedesktop.org/show_bug.cgi?id=64766#c30
    
    Testing it with 11GB worth of stuff, before/after:
    
    behdad:src 130$ time fc-scan ~/fonts/ > before
    
    real    2m18.428s
    user    1m17.008s
    sys     0m20.576s
    
    behdad:src 0$ time fc-scan ~/fonts/ > after
    
    real    1m12.130s
    user    0m18.180s
    sys     0m19.952s
    
    Running the after case a second time is significantly faster:
    
    behdad:src 130$ time fc-scan ~/fonts/ > after
    
    real    0m24.825s
    user    0m12.408s
    sys     0m11.356s
    
    Next I'm going to try to not even read loca...

diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index 4be025a..a11e20b 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -51,7 +51,9 @@
 #include <string.h>
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_ADVANCES_H
 #include FT_TRUETYPE_TABLES_H
+#include FT_TRUETYPE_TAGS_H
 #include FT_SFNT_NAMES_H
 #include FT_TRUETYPE_IDS_H
 #include FT_TYPE1_TABLES_H
@@ -2197,14 +2199,25 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
     return 0;
 }
 
+typedef struct _FcFreeTypeCheckGlyphInfo
+{
+  unsigned int num_glyphs;
+  FcBool long_offset;
+  union {
+    FcChar32 u32[1];
+    FcChar16 u16[1];
+  } offsets;
+} FcFreeTypeCheckGlyphInfo;
+
 static FcBool
-FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
+FcFreeTypeCheckGlyph (FT_Face face,
+		      FcFreeTypeCheckGlyphInfo *info,
+		      FcChar32 ucs4,
 		      FT_UInt glyph, FcBlanks *blanks,
 		      FT_Pos *advance,
 		      FcBool using_strike)
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-    FT_GlyphSlot    slot;
 
     if (using_strike)
 	load_flags &= ~FT_LOAD_NO_SCALE;
@@ -2219,48 +2232,55 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
     if (face->face_flags & FT_FACE_FLAG_SCALABLE)
 	load_flags |= FT_LOAD_NO_BITMAP;
 
-    if (FT_Load_Glyph (face, glyph, load_flags))
-	return FcFalse;
+    /*
+     * Previously, we used to load glyphs here...
+     * If the load succeeded, then for bitmap fonts we were
+     * accepting, and for outline glyphs, we'd check whether
+     * the outline is non-empty...
+     *
+     * The new logic skips much of that and only checks for
+     * outline non-emptiness for TrueType outlines.  We might
+     * want to add logic to load glyphs for bitmap-only fonts
+     * again.  If not, there's a whole lot more cruft that can
+     * be removed...
+     */
 
-    slot = face->glyph;
-    if (!glyph)
-	return FcFalse;
+    if (advance)
+    {
+	*advance = 0;
+	FT_Get_Advance (face, glyph, load_flags, advance);
+    }
 
-    *advance = slot->metrics.horiAdvance;
+    if (info)
+    {
+	if (glyph >= info->num_glyphs)
+	    return FcFalse;
 
-    switch ((int) slot->format) {
-    case ft_glyph_format_bitmap:
-	/*
-	 * Bitmaps are assumed to be reasonable; if
-	 * this proves to be a rash assumption, this
-	 * code can be easily modified
-	 */
-	return FcTrue;
-    case ft_glyph_format_outline:
-	/*
-	 * Glyphs with contours are always OK
-	 */
-	if (slot->outline.n_contours != 0)
-	    return FcTrue;
-	/*
-	 * Glyphs with no contours are only OK if
-	 * they're members of the Blanks set specified
-	 * in the configuration.  If blanks isn't set,
-	 * then allow any glyph to be blank
-	 */
-	if (!blanks || FcBlanksIsMember (blanks, ucs4))
-	    return FcTrue;
-	/* fall through ... */
-    default:
-	break;
+	if ((info->long_offset ?
+	     info->offsets.u32[glyph] == info->offsets.u32[glyph+1] :
+	     info->offsets.u16[glyph] == info->offsets.u16[glyph+1]))
+	{
+	    /*
+	     * Glyphs with no contours are only OK if
+	     * they're members of the Blanks set specified
+	     * in the configuration.  If blanks isn't set,
+	     * then allow any glyph to be blank
+	     */
+	    return !blanks || FcBlanksIsMember (blanks, ucs4);
+	}
     }
-    return FcFalse;
+
+    return FcTrue;
 }
 
 #define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
 
 static FcCharSet *
-FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing, FT_Int strike_index)
+FcFreeTypeCharSetAndSpacingForSize (FT_Face face,
+				    FcFreeTypeCheckGlyphInfo *info,
+				    FcBlanks *blanks,
+				    int *spacing,
+				    FT_Int strike_index)
 {
     FcChar32	    page, off, ucs4;
 #ifdef CHECK
@@ -2300,7 +2320,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
             ucs4 = FT_Get_First_Char (face, &glyph);
             while (glyph != 0)
 	    {
-		if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+		if (FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
 		{
 		    if (advance)
 		    {
@@ -2386,7 +2406,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
 	    {
 		ucs4 = FcGlyphNameToUcs4 (name_buf);
 		if (ucs4 != 0xffff &&
-		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+		    FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
 		{
 		    if (advance)
 		    {
@@ -2429,7 +2449,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
 
 	if (has_char && !has_bit)
 	{
-	    if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
+	    if (!FcFreeTypeCheckGlyph (face, info, ucs4, glyph, blanks, &advance, using_strike))
 		printf ("Bitmap missing broken char 0x%x\n", ucs4);
 	    else
 		printf ("Bitmap missing char 0x%x\n", ucs4);
@@ -2455,28 +2475,63 @@ FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 {
     FcCharSet	*cs;
+    FT_Int	strike_index = -1;
+    TT_Header	*head_table = FT_Get_Sfnt_Table (face, ft_sfnt_head);
+    FcFreeTypeCheckGlyphInfo	*info = NULL;
 
-    /*
-     * Check for bitmap-only ttf fonts that are missing the glyf table.
-     * In that case, pick a size and look for glyphs in that size instead
-     */
-    if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
-	face->num_fixed_sizes > 0 &&
-	FT_Get_Sfnt_Table (face, ft_sfnt_head))
+    if (head_table)
     {
-	FT_Int  strike_index = 0;
-	int	    i;
-
-	/* Select the face closest to 16 pixels tall */
-	for (i = 1; i < face->num_fixed_sizes; i++) {
-	    if (abs (face->available_sizes[i].height - 16) <
-		abs (face->available_sizes[strike_index].height - 16))
-		strike_index = i;
+	/*
+	 * Check for bitmap-only ttf fonts that are missing the glyf table.
+	 * In that case, pick a size and look for glyphs in that size instead
+	 */
+	if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) && face->num_fixed_sizes > 0)
+	{
+	    int	    i;
+
+	    strike_index = 0;
+
+	    /* Select the face closest to 16 pixels tall */
+	    for (i = 1; i < face->num_fixed_sizes; i++) {
+		if (abs (face->available_sizes[i].height - 16) <
+		    abs (face->available_sizes[strike_index].height - 16))
+		    strike_index = i;
+	    }
+	}
+	else if (head_table->Glyph_Data_Format == 0)
+	{
+	    /* Try loading the 'loca' table, which we will later use to detect
+	     * glyphs without outline (to reject them).  If font is other than
+	     * TrueType outlines, we bypass that check. */
+	    unsigned int num_glyphs = face->num_glyphs;
+	    FcBool long_offset = head_table->Index_To_Loc_Format > 0;
+	    FT_ULong needed_len = (num_glyphs + 1) * (long_offset ? 4 : 2);
+	    FT_ULong table_len = 0;
+	    if (FT_Err_Ok == FT_Load_Sfnt_Table (face, TTAG_loca, 0, NULL, &table_len) &&
+		(table_len = FC_MIN(needed_len, table_len)) >= (long_offset ? 4 : 2) &&
+		(info = malloc (sizeof (*info) + table_len)))
+	    {
+		if (FT_Err_Ok != FT_Load_Sfnt_Table (face, TTAG_loca, 0,
+						     (FT_Byte *)&info->offsets, &table_len))
+		{
+		    free (info);
+		    info = NULL;
+		}
+		else
+		{
+		    info->num_glyphs = FC_MIN(num_glyphs,
+					      (table_len / (long_offset ? 4 : 2)) - 1);
+		    info->long_offset = long_offset;
+		}
+	    }
 	}
-	cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, strike_index);
     }
-    else
-	cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, -1);
+
+    cs = FcFreeTypeCharSetAndSpacingForSize (face, info, blanks, spacing, strike_index);
+
+    if (info)
+	free (info);
+
     return cs;
 }
 
_______________________________________________
Fontconfig mailing list
Fontconfig@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/fontconfig

[Index of Archives]     [Fedora Fonts]     [Fedora Users]     [Fedora Cloud]     [Kernel]     [Fedora Packaging]     [Fedora Desktop]     [PAM]     [Gimp Graphics Editor]     [Yosemite News]

  Powered by Linux