Re: fontconfig: Branch 'master'

Behdad Esfahbod <[email protected]>
Newsgroups gmane.comp.fonts.fontconfig
Message-ID <CAF63+7V1=vH8KjXXq3Xuv1NrwqO231MMy3zaC0XGEvMBkKRb-w@mail.gmail.com>
Done.

On Thu, Sep 14, 2017 at 6:12 PM, Behdad Esfahbod <[email protected]> wrote:

>
>
> On Tue, Sep 12, 2017 at 8:06 PM, Akira TAGOH <[email protected]> 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
>> <[email protected]> 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 <[email protected]>
>> > 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
>> > [email protected]
>> > https://lists.freedesktop.org/mailman/listinfo/fontconfig
>>
>>
>>
>> --
>> Akira TAGOH
>>
>
>
>
> --
> behdad
> http://behdad.org/
>



-- 
behdad
http://behdad.org/

_______________________________________________
Fontconfig mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/fontconfig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.