On Tue, Sep 12, 2017 at 8:06 PM, Akira TAGOH <akira@xxxxxxxxx> 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@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/fontconfig
Akira TAGOH
--
behdad
http://behdad.org/
http://behdad.org/
_______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig