Fix a wrong edit position when 'kind' is different

This commit is contained in:
Akira TAGOH 2013-08-26 12:47:07 +09:00
parent 223c1384c9
commit fba9efecd2
1 changed files with 16 additions and 8 deletions

View File

@ -1493,11 +1493,11 @@ FcConfigSubstituteWithPat (FcConfig *config,
FcValue v; FcValue v;
FcSubst *s; FcSubst *s;
FcRule *r; FcRule *r;
FcValueList *l, **value = NULL; FcValueList *l, **value = NULL, *vl;
FcPattern *m; FcPattern *m;
FcStrSet *strs; FcStrSet *strs;
FcObject object = FC_INVALID_OBJECT; FcObject object = FC_INVALID_OBJECT;
FcPatternElt **elt = NULL; FcPatternElt **elt = NULL, *e;
int i, nobjs; int i, nobjs;
FcBool retval = FcTrue; FcBool retval = FcTrue;
@ -1593,12 +1593,17 @@ FcConfigSubstituteWithPat (FcConfig *config,
else else
m = p; m = p;
if (m) if (m)
elt[object] = FcPatternObjectFindElt (m, r->u.test->object); e = FcPatternObjectFindElt (m, r->u.test->object);
else
e = NULL;
/* different 'kind' won't be the target of edit */
if (!elt[object] && kind == r->u.test->kind)
elt[object] = e;
/* /*
* If there's no such field in the font, * If there's no such field in the font,
* then FcQualAll matches while FcQualAny does not * then FcQualAll matches while FcQualAny does not
*/ */
if (!elt[object]) if (!e)
{ {
if (r->u.test->qual == FcQualAll) if (r->u.test->qual == FcQualAll)
{ {
@ -1616,10 +1621,13 @@ FcConfigSubstituteWithPat (FcConfig *config,
* Check to see if there is a match, mark the location * Check to see if there is a match, mark the location
* to apply match-relative edits * to apply match-relative edits
*/ */
value[object] = FcConfigMatchValueList (m, p_pat, kind, r->u.test, elt[object]->values); vl = FcConfigMatchValueList (m, p_pat, kind, r->u.test, e->values);
if (!value[object] || /* different 'kind' won't be the target of edit */
(r->u.test->qual == FcQualFirst && value[object] != elt[object]->values) || if (!value[object] && kind == r->u.test->kind)
(r->u.test->qual == FcQualNotFirst && value[object] == elt[object]->values)) value[object] = vl;
if (!vl ||
(r->u.test->qual == FcQualFirst && vl != e->values) ||
(r->u.test->qual == FcQualNotFirst && vl == e->values))
{ {
if (FcDebug () & FC_DBG_EDIT) if (FcDebug () & FC_DBG_EDIT)
printf ("No match\n"); printf ("No match\n");