Re: fontconfig: Branch 'master'
Behdad Esfahbod <[email protected]>
| Newsgroups | gmane.comp.fonts.fontconfig |
|---|---|
| Message-ID | <CAF63+7V1=vH8KjXXq3Xuv1NrwqO231MMy3zaC0XGEvMBkKRb-w@mail.gmail.com> |
Done. On Thu, Sep 14, 2017 at 6:12 PM, Behdad Esfahbod <[email protected]> wrote: > > > 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/ > -- behdad http://behdad.org/ _______________________________________________ Fontconfig mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/fontconfig