[Fontconfig] fontconfig: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Sep 12 21:17:42 UTC 2017


 fc-query/Makefile.am    |    2 -
 fc-query/fc-query.c     |   88 ++++++++++++++----------------------------------
 fc-scan/fc-scan.c       |    4 --
 fontconfig/fontconfig.h |    3 +
 src/fcdir.c             |   86 ++++++++++------------------------------------
 src/fcfreetype.c        |   64 ++++++++++++++++++++++++++++++++++
 6 files changed, 114 insertions(+), 133 deletions(-)

New commits:
commit 27a6a299e0fefca9c244213784d3c78b34281cd5
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Sep 12 16:43:33 2017 -0400

    Add FcFreeTypeQueryAll()
    
    Like FcFreeTypeQuery(), but adds patterns for all fonts found, including named
    instances of variable fonts.  If id is -1, then all collection faces are queried.
    Returns number of fonts added.
    
    This merges the same face loop that was in fc-query. and fcdir.c.
    
    Needs documentation update.

diff --git a/fc-query/Makefile.am b/fc-query/Makefile.am
index 6fe357b..73b3f11 100644
--- a/fc-query/Makefile.am
+++ b/fc-query/Makefile.am
@@ -41,7 +41,7 @@ EXTRA_DIST=fc-query.sgml $(BUILT_MANS)
 
 CLEANFILES =
 
-fc_query_LDADD = ${top_builddir}/src/libfontconfig.la $(FREETYPE_LIBS)
+fc_query_LDADD = ${top_builddir}/src/libfontconfig.la
 
 if USEDOCBOOK
 
diff --git a/fc-query/fc-query.c b/fc-query/fc-query.c
index 6cd5abd..a5b2cda 100644
--- a/fc-query/fc-query.c
+++ b/fc-query/fc-query.c
@@ -98,12 +98,9 @@ usage (char *program, int error)
 int
 main (int argc, char **argv)
 {
-    FT_Library	ftLibrary;
-    int		index_set = 0;
-    int		set_index = 0;
-    int		set_face_num = 0;
-    int		set_instance_num = 0;
+    int		id = -1;
     int		ignore_blanks = 0;
+    FcFontSet   *fs;
     FcChar8     *format = NULL;
     FcBlanks    *blanks = NULL;
     int		err = 0;
@@ -122,8 +119,7 @@ main (int argc, char **argv)
 	    ignore_blanks = 1;
 	    break;
 	case 'i':
-	    index_set = 1;
-	    set_index = atoi (optarg);
+	    id = atoi (optarg);
 	    break;
 	case 'f':
 	    format = (FcChar8 *) strdup (optarg);
@@ -146,74 +142,42 @@ main (int argc, char **argv)
     if (i == argc)
 	usage (argv[0], 1);
 
-    if (FT_Init_FreeType (&ftLibrary))
-	return 1;
-
+    fs = FcFontSetCreate ();
     if (!ignore_blanks)
 	blanks = FcConfigGetBlanks (NULL);
+
     for (; i < argc; i++)
     {
-	FT_Face face;
-	int num_faces = 0;
-	int num_instances = 0;
-	int face_num = 0;
-	int instance_num = 0;
-	int id;
-
-	if (index_set)
+	if (!FcFreeTypeQueryAll ((FcChar8*) argv[i], id, blanks, NULL, fs))
 	{
-	    face_num = set_face_num = set_index & 0xFFFF;
-	    instance_num = set_instance_num = set_index >> 16;
+	    fprintf (stderr, "Can't query face %d of font file %s\n", id, argv[i]);
+	    err = 1;
 	}
+    }
 
-	do {
-	    FcPattern *pat;
-
-	    id = ((instance_num << 16) + face_num);
-	    if (FT_New_Face (ftLibrary, argv[i], id, &face))
-	      break;
-	    num_faces = face->num_faces;
-	    num_instances = face->style_flags >> 16;
-	    pat = FcFreeTypeQueryFace (face, (const FcChar8 *) argv[i], id, blanks);
-	    FT_Done_Face (face);
-
-	    if (pat)
-	    {
-		if (format)
-		{
-		    FcChar8 *s;
-
-		    s = FcPatternFormat (pat, format);
-		    if (s)
-		    {
-			printf ("%s", s);
-			FcStrFree (s);
-		    }
-		}
-		else
-		{
-		    FcPatternPrint (pat);
-		}
+    for (i = 0; i < fs->nfont; i++)
+    {
+	FcPattern *pat = fs->fonts[i];
 
-		FcPatternDestroy (pat);
-	    }
-	    else
-	    {
-		fprintf (stderr, "Can't query face %d of font file %s\n", id, argv[i]);
-		err = 1;
-	    }
+	if (format)
+	{
+	    FcChar8 *s;
 
-	    if (instance_num < num_instances && !set_instance_num)
-		instance_num++;
-	    else
+	    s = FcPatternFormat (pat, format);
+	    if (s)
 	    {
-		face_num++;
-		instance_num = 0;
+		printf ("%s", s);
+		FcStrFree (s);
 	    }
-	} while (!err && (!index_set || face_num == set_face_num) && face_num < num_faces);
+	}
+	else
+	{
+	    FcPatternPrint (pat);
+	}
     }
 
-    FT_Done_FreeType (ftLibrary);
+    FcFontSetDestroy (fs);
+
     FcFini ();
     return err;
 }
diff --git a/fc-scan/fc-scan.c b/fc-scan/fc-scan.c
index 1f18e80..58a0b15 100644
--- a/fc-scan/fc-scan.c
+++ b/fc-scan/fc-scan.c
@@ -150,9 +150,7 @@ main (int argc, char **argv)
 
     for (i = 0; i < fs->nfont; i++)
     {
-	FcPattern *pat;
-
-	pat = fs->fonts[i];
+	FcPattern *pat = fs->fonts[i];
 
 	if (format)
 	{
diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index ecc1d90..f085aa0 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -577,6 +577,9 @@ FcDirCacheUnload (FcCache *cache);
 FcPublic FcPattern *
 FcFreeTypeQuery (const FcChar8 *file, int id, FcBlanks *blanks, int *count);
 
+FcPublic unsigned int
+FcFreeTypeQueryAll(const FcChar8 *file, int id, FcBlanks *blanks, int *count, FcFontSet *set);
+
 /* fcfs.c */
 
 FcPublic FcFontSet *
diff --git a/src/fcdir.c b/src/fcdir.c
index b6c0bf0..4f38f4b 100644
--- a/src/fcdir.c
+++ b/src/fcdir.c
@@ -23,9 +23,6 @@
  */
 
 #include "fcint.h"
-#include "fcftint.h"
-#include <ft2build.h>
-#include FT_FREETYPE_H
 #include <dirent.h>
 
 FcBool
@@ -67,47 +64,32 @@ FcFileScanFontConfig (FcFontSet		*set,
 		      const FcChar8	*file,
 		      FcConfig		*config)
 {
-    FT_Library	ftLibrary;
-    FT_Face	face;
-    FcPattern	*font;
+    int		i;
     FcBool	ret = FcTrue;
-    int		num_faces = 0;
-    int		num_instances = 0;
-    int		face_num = 0;
-    int		instance_num = 0;
-    int		id;
+    int		old_nfont = set->nfont;
     const FcChar8 *sysroot = FcConfigGetSysRoot (config);
 
-    if (FT_Init_FreeType (&ftLibrary))
+    if (FcDebug () & FC_DBG_SCAN)
+    {
+	printf ("\tScanning file %s...", file);
+	fflush (stdout);
+    }
+
+    if (!FcFreeTypeQueryAll (file, -1, NULL, NULL, set))
 	return FcFalse;
 
-    do
-    {
-	font = 0;
-	/*
-	 * Nothing in the cache, scan the file
-	 */
-	if (FcDebug () & FC_DBG_SCAN)
-	{
-	    printf ("\tScanning file %s...", file);
-	    fflush (stdout);
-	}
+    if (FcDebug () & FC_DBG_SCAN)
+	printf ("done\n");
 
-	id = ((instance_num << 16) + face_num);
-	if (FT_New_Face (ftLibrary, (char *) file, id, &face))
-	    return FcFalse;
-	num_faces = face->num_faces;
-	num_instances = face->style_flags >> 16;
-	font = FcFreeTypeQueryFace (face, file, id, NULL);
-	FT_Done_Face (face);
+    for (i = old_nfont; i < set->nfont; i++)
+    {
+	FcPattern *font = set->fonts[i];
 
-	if (FcDebug () & FC_DBG_SCAN)
-	    printf ("done\n");
 	/*
 	 * Get rid of sysroot here so that targeting scan rule may contains FC_FILE pattern
 	 * and they should usually expect without sysroot.
 	 */
-	if (font && sysroot)
+	if (sysroot)
 	{
 	    size_t len = strlen ((const char *)sysroot);
 	    FcChar8 *f = NULL;
@@ -129,43 +111,15 @@ FcFileScanFontConfig (FcFontSet		*set,
 	/*
 	 * Edit pattern with user-defined rules
 	 */
-	if (font && config && !FcConfigSubstitute (config, font, FcMatchScan))
-	{
-	    FcPatternDestroy (font);
-	    font = NULL;
+	if (config && !FcConfigSubstitute (config, font, FcMatchScan))
 	    ret = FcFalse;
-	}
 
-	/*
-	 * Add the font
-	 */
-	if (font)
-	{
-	    if (FcDebug() & FC_DBG_SCANV)
-	    {
-		printf ("Final font pattern:\n");
-		FcPatternPrint (font);
-	    }
-	    if (!FcFontSetAdd (set, font))
-	    {
-		FcPatternDestroy (font);
-		font = NULL;
-		ret = FcFalse;
-	    }
-	}
-	else
-	    ret = FcFalse;
-
-	if (instance_num < num_instances)
-	    instance_num++;
-	else
+	if (FcDebug() & FC_DBG_SCANV)
 	{
-	    face_num++;
-	    instance_num = 0;
+	    printf ("Final font pattern:\n");
+	    FcPatternPrint (font);
 	}
-    } while (font && ret && face_num < num_faces);
-
-    FT_Done_FreeType (ftLibrary);
+    }
 
     return ret;
 }
diff --git a/src/fcfreetype.c b/src/fcfreetype.c
index dbfe291..a6e7058 100644
--- a/src/fcfreetype.c
+++ b/src/fcfreetype.c
@@ -1980,7 +1980,8 @@ FcFreeTypeQuery(const FcChar8	*file,
     if (FT_New_Face (ftLibrary, (char *) file, id, &face))
 	goto bail;
 
-    *count = face->num_faces;
+    if (count)
+      *count = face->num_faces;
 
     pat = FcFreeTypeQueryFace (face, file, id, blanks);
 
@@ -1990,6 +1991,67 @@ bail:
     return pat;
 }
 
+unsigned int
+FcFreeTypeQueryAll(const FcChar8	*file,
+		   int			id,
+		   FcBlanks		*blanks,
+		   int			*count,
+		   FcFontSet            *set)
+{
+    FT_Face face;
+    FT_Library ftLibrary = NULL;
+    int index_set = id != -1;
+    int set_face_num = index_set ? id & 0xFFFF : 0;
+    int set_instance_num = index_set ? id >> 16 : 0;
+    int face_num = set_face_num;
+    int instance_num = set_instance_num;
+    int num_faces = 0;
+    int num_instances = 0;
+    unsigned int ret = 0;
+    int		err = 0;
+
+    if (FT_Init_FreeType (&ftLibrary))
+	return 0;
+
+    do {
+	FcPattern *pat;
+
+	id = ((instance_num << 16) + face_num);
+	if (FT_New_Face (ftLibrary, (const char *) file, id, &face))
+	  break;
+
+	num_faces = face->num_faces;
+	num_instances = face->style_flags >> 16;
+	pat = FcFreeTypeQueryFace (face, (const FcChar8 *) file, id, blanks);
+	FT_Done_Face (face);
+
+	if (pat)
+	{
+	    ret++;
+	    if (!set || ! FcFontSetAdd (set, pat))
+	      FcPatternDestroy (pat);
+	}
+	else
+	    err = 1;
+
+	if (instance_num < num_instances && !set_instance_num)
+	    instance_num++;
+	else
+	{
+	    face_num++;
+	    instance_num = 0;
+	}
+    } while (!err && (!index_set || face_num == set_face_num) && face_num < num_faces);
+
+    if (count)
+      *count = num_faces;
+
+    FT_Done_FreeType (ftLibrary);
+
+    return ret;
+}
+
+
 /*
  * For our purposes, this approximation is sufficient
  */


More information about the Fontconfig mailing list