aboutsummaryrefslogtreecommitdiff
path: root/fontconfig/src
diff options
context:
space:
mode:
Diffstat (limited to 'fontconfig/src')
-rw-r--r--fontconfig/src/fcarch.c2
-rw-r--r--fontconfig/src/fcarch.h2
-rw-r--r--fontconfig/src/fccfg.c52
-rw-r--r--fontconfig/src/fcint.h5
-rw-r--r--fontconfig/src/fcxml.c7
5 files changed, 36 insertions, 32 deletions
diff --git a/fontconfig/src/fcarch.c b/fontconfig/src/fcarch.c
index 35734c021..21516ff05 100644
--- a/fontconfig/src/fcarch.c
+++ b/fontconfig/src/fcarch.c
@@ -49,7 +49,7 @@ FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcStrSet *));
FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcCharLeaf **));
FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcChar16 *));
-FC_ASSERT_STATIC (0x08 + 1*FC_MAX(4,ALIGNOF_DOUBLE) == sizeof (FcValue));
+FC_ASSERT_STATIC (0x08 + 1*FC_MAX(SIZEOF_VOID_P,ALIGNOF_DOUBLE) == sizeof (FcValue));
FC_ASSERT_STATIC (0x00 + 2*SIZEOF_VOID_P == sizeof (FcPatternElt));
FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcPattern));
FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcCharSet));
diff --git a/fontconfig/src/fcarch.h b/fontconfig/src/fcarch.h
index cf7fd3c9f..049a5b02b 100644
--- a/fontconfig/src/fcarch.h
+++ b/fontconfig/src/fcarch.h
@@ -33,7 +33,7 @@
* and on 32bit ones, whether double is aligned to one word or two words.
* Those result in the 6 formats listed below.
*
- * If any of the assertion errors in fccache.c fail, you need to add a new
+ * If any of the assertion errors in fcarch.c fail, you need to add a new
* architecture. Contact the fontconfig mailing list in that case.
*
* name endianness pointer-size double-alignment
diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c
index be738d53d..b88095bc6 100644
--- a/fontconfig/src/fccfg.c
+++ b/fontconfig/src/fccfg.c
@@ -649,8 +649,10 @@ FcConfigAddRule (FcConfig *config,
{
FcSubst *subst, **prev;
FcRule *r;
- int num;
+ int n = 0;
+ if (!rule)
+ return FcFalse;
switch (kind) {
case FcMatchPattern:
prev = &config->substPattern;
@@ -671,7 +673,6 @@ FcConfigAddRule (FcConfig *config,
*prev = subst;
subst->next = NULL;
subst->rule = rule;
- num = 0;
for (r = rule; r; r = r->next)
{
switch (r->type)
@@ -680,19 +681,21 @@ FcConfigAddRule (FcConfig *config,
if (r->u.test &&
r->u.test->kind == FcMatchDefault)
r->u.test->kind = kind;
- if (r->u.test->object > FC_MAX_BASE_OBJECT)
- num++;
+
+ if (n < r->u.test->object)
+ n = r->u.test->object;
break;
case FcRuleEdit:
- if (r->u.edit->object > FC_MAX_BASE_OBJECT)
- num++;
+ if (n < r->u.edit->object)
+ n = r->u.edit->object;
break;
default:
break;
}
}
- if (config->maxObjects < num)
- config->maxObjects = num;
+ n = FC_OBJ_ID (n) - FC_MAX_BASE_OBJECT;
+ if (config->maxObjects < n)
+ config->maxObjects = n;
if (FcDebug () & FC_DBG_EDIT)
{
printf ("Add Subst ");
@@ -701,11 +704,6 @@ FcConfigAddRule (FcConfig *config,
return FcTrue;
}
-typedef struct _FcSubState {
- FcPatternElt *elt;
- FcValueList *value;
-} FcSubState;
-
static FcValue
FcConfigPromote (FcValue v, FcValue u, FcValuePromotionBuffer *buf)
{
@@ -1495,16 +1493,14 @@ FcConfigSubstituteWithPat (FcConfig *config,
FcValue v;
FcSubst *s;
FcRule *r;
- FcValueList *l, **value = NULL;
+ FcValueList *l, **value = NULL, *vl;
FcPattern *m;
FcStrSet *strs;
FcObject object = FC_INVALID_OBJECT;
- FcPatternElt **elt = NULL;
+ FcPatternElt **elt = NULL, *e;
int i, nobjs;
FcBool retval = FcTrue;
-#define FC_OBJ_ID(_n_) ((_n_) > FC_MAX_BASE_OBJECT ? ((_n_) - FC_EXT_OBJ_INDEX) : (_n_))
-
if (!config)
{
config = FcConfigGetCurrent ();
@@ -1597,12 +1593,17 @@ FcConfigSubstituteWithPat (FcConfig *config,
else
m = p;
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,
* then FcQualAll matches while FcQualAny does not
*/
- if (!elt[object])
+ if (!e)
{
if (r->u.test->qual == FcQualAll)
{
@@ -1620,10 +1621,13 @@ FcConfigSubstituteWithPat (FcConfig *config,
* Check to see if there is a match, mark the location
* to apply match-relative edits
*/
- value[object] = FcConfigMatchValueList (m, p_pat, kind, r->u.test, elt[object]->values);
- if (!value[object] ||
- (r->u.test->qual == FcQualFirst && value[object] != elt[object]->values) ||
- (r->u.test->qual == FcQualNotFirst && value[object] == elt[object]->values))
+ vl = FcConfigMatchValueList (m, p_pat, kind, r->u.test, e->values);
+ /* different 'kind' won't be the target of edit */
+ if (!value[object] && kind == r->u.test->kind)
+ 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)
printf ("No match\n");
@@ -1745,8 +1749,6 @@ bail1:
if (value)
free (value);
-#undef FC_OBJ_ID
-
return retval;
}
diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h
index ec0c67470..362ea6f99 100644
--- a/fontconfig/src/fcint.h
+++ b/fontconfig/src/fcint.h
@@ -174,10 +174,11 @@ typedef struct _FcValueList {
typedef int FcObject;
-/* The 1000 is to leave some room for future added internal objects, such
+/* The 1024 is to leave some room for future added internal objects, such
* that caches from newer fontconfig can still be used with older fontconfig
* without getting confused. */
-#define FC_EXT_OBJ_INDEX 1000
+#define FC_EXT_OBJ_INDEX 1024
+#define FC_OBJ_ID(_n_) ((_n_) & (~FC_EXT_OBJ_INDEX))
typedef struct _FcPatternElt *FcPatternEltPtr;
diff --git a/fontconfig/src/fcxml.c b/fontconfig/src/fcxml.c
index eb8d26ac0..9cb1fb2ba 100644
--- a/fontconfig/src/fcxml.c
+++ b/fontconfig/src/fcxml.c
@@ -2510,7 +2510,6 @@ FcParseMatch (FcConfigParse *parse)
{
const FcChar8 *kind_name;
FcMatchKind kind;
- FcEdit *edit = 0;
FcVStack *vstack;
FcRule *rule = NULL, *r;
@@ -2546,8 +2545,10 @@ FcParseMatch (FcConfigParse *parse)
{
FcConfigMessage (parse, FcSevereError,
"<match target=\"scan\"> cannot edit user-defined object \"%s\"",
- FcObjectName(edit->object));
- break;
+ FcObjectName(vstack->u.edit->object));
+ if (rule)
+ FcRuleDestroy (rule);
+ return;
}
r = FcRuleCreate (FcRuleEdit, vstack->u.edit);
if (rule)