[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