[Fontconfig] fontconfig: Branch 'master'
Behdad Esfahbod
behdad at behdad.org
Fri Sep 15 01:12:18 UTC 2017
On Tue, Sep 12, 2017 at 8:06 PM, Akira TAGOH <akira at tagoh.org> 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
> <behdad at kemper.freedesktop.org> 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 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
> > */
> > _______________________________________________
> > Fontconfig mailing list
> > Fontconfig at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/fontconfig
>
>
>
> --
> Akira TAGOH
>
--
behdad
http://behdad.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/fontconfig/attachments/20170914/f6214785/attachment-0001.html>
More information about the Fontconfig
mailing list