[Fontconfig] fontconfig: Branch 'master'

Akira TAGOH akira at tagoh.org
Thu Nov 15 03:41:58 PST 2012


Hi,

I'll make a new release in a week or two. so please test if there are
any critical issues or regressions.

TIA,

On Thu, Nov 15, 2012 at 4:38 PM, Akira TAGOH
<tagoh at kemper.freedesktop.org> wrote:
>  src/fcint.h   |   22 ++++++++
>  src/fcmatch.c |   63 +++++++++++++++++--------
>  src/fcpat.c   |  146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  3 files changed, 210 insertions(+), 21 deletions(-)
>
> New commits:
> commit c20ac78b01df3f0919352bba16b5b48b3b5d4d6d
> Author: Akira TAGOH <akira at tagoh.org>
> Date:   Thu Nov 15 16:37:01 2012 +0900
>
>     Bug 57114 - regression on FcFontMatch with namelang
>
>     After 7587d1c99d9476b6dd4dbe523c0204da700fed8d applied, family,
>     style, and fullname is localized against current locale or lang
>     if any though, the string in other languages were dropped from
>     the pattern. this caused unexpected mismatch on the target="font"
>     rules.
>
>     This fix adds other strings at the end of the list.
>
> diff --git a/src/fcint.h b/src/fcint.h
> index c078575..e9f315f 100644
> --- a/src/fcint.h
> +++ b/src/fcint.h
> @@ -923,9 +923,25 @@ FcObjectFini (void);
>  FcPrivate FcValue
>  FcValueCanonicalize (const FcValue *v);
>
> +FcPrivate FcValueListPtr
> +FcValueListCreate (void);
> +
>  FcPrivate void
>  FcValueListDestroy (FcValueListPtr l);
>
> +FcPrivate FcValueListPtr
> +FcValueListPrepend (FcValueListPtr vallist,
> +                   FcValue        value,
> +                   FcValueBinding binding);
> +
> +FcPrivate FcValueListPtr
> +FcValueListAppend (FcValueListPtr vallist,
> +                  FcValue        value,
> +                  FcValueBinding binding);
> +
> +FcPrivate FcValueListPtr
> +FcValueListDuplicate(FcValueListPtr orig);
> +
>  FcPrivate FcPatternElt *
>  FcPatternObjectFindElt (const FcPattern *p, FcObject object);
>
> @@ -933,6 +949,12 @@ FcPrivate FcPatternElt *
>  FcPatternObjectInsertElt (FcPattern *p, FcObject object);
>
>  FcPrivate FcBool
> +FcPatternObjectListAdd (FcPattern      *p,
> +                       FcObject        object,
> +                       FcValueListPtr  list,
> +                       FcBool          append);
> +
> +FcPrivate FcBool
>  FcPatternObjectAddWithBinding  (FcPattern      *p,
>                                 FcObject        object,
>                                 FcValue         value,
> diff --git a/src/fcmatch.c b/src/fcmatch.c
> index 623538b..9703392 100644
> --- a/src/fcmatch.c
> +++ b/src/fcmatch.c
> @@ -432,7 +432,7 @@ FcFontRenderPrepare (FcConfig           *config,
>      FcPattern      *new;
>      int                    i;
>      FcPatternElt    *fe, *pe, *fel, *pel;
> -    FcValue        v, vl;
> +    FcValue        v;
>      FcResult       result;
>
>      assert (pat != NULL);
> @@ -440,7 +440,7 @@ FcFontRenderPrepare (FcConfig           *config,
>
>      new = FcPatternCreate ();
>      if (!new)
> -       return 0;
> +       return NULL;
>      for (i = 0; i < font->num; i++)
>      {
>         fe = &FcPatternElts(font)[i];
> @@ -478,47 +478,74 @@ FcFontRenderPrepare (FcConfig         *config,
>                                      FcPatternEltValues(fe), &v, NULL, NULL, &result))
>             {
>                 FcPatternDestroy (new);
> -               return 0;
> +               return NULL;
>             }
>             if (fel && pel)
>             {
>                 int n = 1, j;
> +               FcValueListPtr l1, l2, ln = NULL, ll = NULL;
>
>                 match = FcObjectToMatcher (pel->object, FcTrue);
>                 if (!FcCompareValueList (pel->object, match,
>                                          FcPatternEltValues (pel),
> -                                        FcPatternEltValues (fel), &vl, NULL, &n, &result))
> +                                        FcPatternEltValues (fel), NULL, NULL, &n, &result))
>                 {
>                     FcPatternDestroy (new);
>                     return NULL;
>                 }
> -               else
> -               {
> -                   FcValueListPtr l;
>
> -                   for (j = 0, l = FcPatternEltValues (fe);
> -                        j < n && l != NULL;
> -                        j++, l = FcValueListNext (l));
> -                   if (l)
> -                       v = FcValueCanonicalize (&l->value);
> +               for (j = 0, l1 = FcPatternEltValues (fe), l2 = FcPatternEltValues (fel);
> +                    l1 != NULL || l2 != NULL;
> +                    j++, l1 = l1 ? FcValueListNext (l1) : NULL, l2 = l2 ? FcValueListNext (l2) : NULL)
> +               {
> +                   if (j == n)
> +                   {
> +                       if (l1)
> +                           ln = FcValueListPrepend (ln,
> +                                                    FcValueCanonicalize (&l1->value),
> +                                                    FcValueBindingStrong);
> +                       if (l2)
> +                           ll = FcValueListPrepend (ll,
> +                                                    FcValueCanonicalize (&l2->value),
> +                                                    FcValueBindingStrong);
> +                   }
>                     else
> -                       v = FcValueCanonicalize (&FcPatternEltValues (fe)->value);
> +                   {
> +                       if (l1)
> +                           ln = FcValueListAppend (ln,
> +                                                   FcValueCanonicalize (&l1->value),
> +                                                   FcValueBindingStrong);
> +                       if (l2)
> +                           ll = FcValueListAppend (ll,
> +                                                   FcValueCanonicalize (&l2->value),
> +                                                   FcValueBindingStrong);
> +                   }
>                 }
> +               FcPatternObjectListAdd (new, fe->object, ln, FcFalse);
> +               FcPatternObjectListAdd (new, fel->object, ll, FcFalse);
> +
> +               continue;
>             }
>             else if (fel)
>             {
> -               vl = FcValueCanonicalize (&FcPatternEltValues (fel)->value);
> +               FcValueListPtr l1, l2;
> +
> +           copy_lang:
> +               l1 = FcValueListDuplicate (FcPatternEltValues (fe));
> +               l2 = FcValueListDuplicate (FcPatternEltValues (fel));
> +               FcPatternObjectListAdd (new, fe->object, l1, FcFalse);
> +               FcPatternObjectListAdd (new, fel->object, l2, FcFalse);
> +
> +               continue;
>             }
>         }
>         else
>         {
> -           v = FcValueCanonicalize(&FcPatternEltValues (fe)->value);
>             if (fel)
> -               vl = FcValueCanonicalize (&FcPatternEltValues (fel)->value);
> +               goto copy_lang;
> +           v = FcValueCanonicalize(&FcPatternEltValues (fe)->value);
>         }
>         FcPatternObjectAdd (new, fe->object, v, FcFalse);
> -       if (fel)
> -           FcPatternObjectAdd (new, fel->object, vl, FcFalse);
>      }
>      for (i = 0; i < pat->num; i++)
>      {
> diff --git a/src/fcpat.c b/src/fcpat.c
> index ebd6e57..62e47ca 100644
> --- a/src/fcpat.c
> +++ b/src/fcpat.c
> @@ -120,6 +120,20 @@ FcValueSave (FcValue v)
>      return v;
>  }
>
> +FcValueListPtr
> +FcValueListCreate (void)
> +{
> +    FcValueListPtr ret;
> +
> +    ret = calloc (1, sizeof (FcValueList));
> +    if (ret)
> +    {
> +       FcMemAlloc(FC_MEM_VALLIST, sizeof (FcValueList));
> +    }
> +
> +    return ret;
> +}
> +
>  void
>  FcValueListDestroy (FcValueListPtr l)
>  {
> @@ -151,6 +165,81 @@ FcValueListDestroy (FcValueListPtr l)
>      }
>  }
>
> +FcValueListPtr
> +FcValueListPrepend (FcValueListPtr vallist,
> +                   FcValue        value,
> +                   FcValueBinding binding)
> +{
> +    FcValueListPtr new;
> +
> +    if (value.type == FcTypeVoid)
> +       return vallist;
> +    new = FcValueListCreate ();
> +    if (!new)
> +       return vallist;
> +
> +    new->value = FcValueSave (value);
> +    new->binding = binding;
> +    new->next = vallist;
> +
> +    return new;
> +}
> +
> +FcValueListPtr
> +FcValueListAppend (FcValueListPtr vallist,
> +                  FcValue        value,
> +                  FcValueBinding binding)
> +{
> +    FcValueListPtr new, last;
> +
> +    if (value.type == FcTypeVoid)
> +       return vallist;
> +    new = FcValueListCreate ();
> +    if (!new)
> +       return vallist;
> +
> +    new->value = FcValueSave (value);
> +    new->binding = binding;
> +    new->next = NULL;
> +
> +    if (vallist)
> +    {
> +       for (last = vallist; FcValueListNext (last); last = FcValueListNext (last));
> +
> +       last->next = new;
> +    }
> +    else
> +       vallist = new;
> +
> +    return vallist;
> +}
> +
> +FcValueListPtr
> +FcValueListDuplicate(FcValueListPtr orig)
> +{
> +    FcValueListPtr new = NULL, l, t = NULL;
> +    FcValue v;
> +
> +    for (l = orig; l != NULL; l = FcValueListNext (l))
> +    {
> +       if (!new)
> +       {
> +           t = new = FcValueListCreate();
> +       }
> +       else
> +       {
> +           t->next = FcValueListCreate();
> +           t = FcValueListNext (t);
> +       }
> +       v = FcValueCanonicalize (&l->value);
> +       t->value = FcValueSave (v);
> +       t->binding = l->binding;
> +       t->next = NULL;
> +    }
> +
> +    return new;
> +}
> +
>  FcBool
>  FcValueEqual (FcValue va, FcValue vb)
>  {
> @@ -461,6 +550,59 @@ FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObject
>  }
>
>  FcBool
> +FcPatternObjectListAdd (FcPattern      *p,
> +                       FcObject        object,
> +                       FcValueListPtr  list,
> +                       FcBool          append)
> +{
> +    FcPatternElt   *e;
> +    FcValueListPtr l, *prev;
> +
> +    if (p->ref == FC_REF_CONSTANT)
> +       goto bail0;
> +
> +    /*
> +     * Make sure the stored type is valid for built-in objects
> +     */
> +    for (l = list; l != NULL; l = FcValueListNext (l))
> +    {
> +       if (!FcObjectValidType (object, l->value.type))
> +       {
> +           if (FcDebug() & FC_DBG_OBJTYPES)
> +           {
> +               printf ("FcPattern object %s does not accept value ",
> +                       FcObjectName (object));
> +               FcValuePrint (l->value);
> +           }
> +           goto bail0;
> +       }
> +    }
> +
> +    e = FcPatternObjectInsertElt (p, object);
> +    if (!e)
> +       goto bail0;
> +
> +    if (append)
> +    {
> +       for (prev = &e->values; *prev; prev = &(*prev)->next)
> +           ;
> +       *prev = list;
> +    }
> +    else
> +    {
> +       for (prev = &list; *prev; prev = &(*prev)->next)
> +           ;
> +       *prev = e->values;
> +       e->values = list;
> +    }
> +
> +    return FcTrue;
> +
> +bail0:
> +    return FcFalse;
> +}
> +
> +FcBool
>  FcPatternObjectAddWithBinding  (FcPattern      *p,
>                                 FcObject        object,
>                                 FcValue         value,
> @@ -473,12 +615,10 @@ FcPatternObjectAddWithBinding  (FcPattern *p,
>      if (p->ref == FC_REF_CONSTANT)
>         goto bail0;
>
> -    new = malloc (sizeof (FcValueList));
> +    new = FcValueListCreate ();
>      if (!new)
>         goto bail0;
>
> -    memset(new, 0, sizeof (FcValueList));
> -    FcMemAlloc (FC_MEM_VALLIST, sizeof (FcValueList));
>      value = FcValueSave (value);
>      if (value.type == FcTypeVoid)
>         goto bail1;
> _______________________________________________
> Fontconfig mailing list
> Fontconfig at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/fontconfig



-- 
Akira TAGOH


More information about the Fontconfig mailing list