[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