Re: fontconfig: Branch 'master'
Behdad Esfahbod <[email protected]>
| Newsgroups | gmane.comp.fonts.fontconfig |
|---|---|
| Message-ID | <CAF63+7UufvZ8NC-2ib8unfXK4OwPP5R+pi1iwX5-EuPD2sLJ+Q@mail.gmail.com> |
On Tue, Sep 12, 2017 at 8:06 PM, Akira TAGOH <[email protected]> wrote: > Can you add a documentation for FcFreeTypeQueryAll? > Will do, after I finish my patchset and send for review. Or if someone wants to help with that, would be even better! :D On Wed, Sep 13, 2017 at 6:17 AM, Behdad Esfahbod > <[email protected]> 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 <[email protected]> > > 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 > > [email protected] > > https://lists.freedesktop.org/mailman/listinfo/fontconfig > > > > -- > Akira TAGOH > -- behdad http://behdad.org/ _______________________________________________ Fontconfig mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/fontconfig