Can you add a documentation for FcFreeTypeQueryAll? On Wed, Sep 13, 2017 at 6:17 AM, Behdad Esfahbod <behdad@xxxxxxxxxxxxxxxxxxxxxx> wrote: > 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@xxxxxxxxxx> > 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 > */ > _______________________________________________ > Fontconfig mailing list > Fontconfig@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/fontconfig -- Akira TAGOH _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig