[Fontconfig] fontconfig: Branch 'master'
Behdad Esfahbod
behdad at behdad.org
Wed Sep 20 20:07:23 UTC 2017
Done.
On Thu, Sep 14, 2017 at 6:12 PM, Behdad Esfahbod <behdad at behdad.org> wrote:
>
>
> 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/
>
--
behdad
http://behdad.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/fontconfig/attachments/20170920/5e0d5f2b/attachment-0001.html>
More information about the Fontconfig
mailing list