[Fontconfig] fontconfig: Branch 'master'

Akira TAGOH akira at tagoh.org
Wed Sep 13 03:06:41 UTC 2017


Can you add a documentation for FcFreeTypeQueryAll?

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


More information about the Fontconfig mailing list