[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