]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcmatch.c
Add fontversion field
[fontconfig.git] / src / fcmatch.c
index 02b739c6ac0a3ab2c1f62881696a7500d003047c..970d0d873d590a0a5dd4a97095546784bb3fc883 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fcmatch.c,v 1.15 2002/06/29 20:31:02 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fcmatch.c,v 1.20 2002/08/31 22:17:32 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -61,9 +61,34 @@ FcCompareLang (char *object, FcValue value1, FcValue value2)
 {
     FcLangResult    result;
     
-    if (value2.type != FcTypeString || value1.type != FcTypeString)
+    switch (value1.type) {
+    case FcTypeLangSet:
+       switch (value2.type) {
+       case FcTypeLangSet:
+           result = FcLangSetCompare (value1.u.l, value2.u.l);
+           break;
+       case FcTypeString:
+           result = FcLangSetHasLang (value1.u.l, value2.u.s);
+           break;
+       default:
+           return -1.0;
+       }
+       break;
+    case FcTypeString:
+       switch (value2.type) {
+       case FcTypeLangSet:
+           result = FcLangSetHasLang (value2.u.l, value1.u.s);
+           break;
+       case FcTypeString:
+           result = FcLangCompare (value1.u.s, value2.u.s);
+           break;
+       default:
+           return -1.0;
+       }
+       break;
+    default:
        return -1.0;
-    result = FcLangCompare (value1.u.s, value2.u.s);
+    }
     switch (result) {
     case FcLangEqual:
        return 0;
@@ -171,9 +196,12 @@ static FcMatcher _FcMatchers [] = {
     
     { FC_OUTLINE,      FcCompareBool,          12, 12 },
 #define MATCH_OUTLINE      11
+
+    { FC_FONTVERSION,  FcCompareInteger,       13, 13 },
+#define MATCH_FONTVERSION   12
 };
 
-#define NUM_MATCH_VALUES    13
+#define NUM_MATCH_VALUES    14
 
 static FcBool
 FcCompareValueList (const char  *object,
@@ -197,7 +225,13 @@ FcCompareValueList (const char  *object,
     case 'f':
        switch (FcToLower (object[1])) {
        case 'o':
-           i = MATCH_FOUNDRY; break;
+           switch (FcToLower (object[2])) {
+           case 'u':
+               i = MATCH_FOUNDRY; break;
+           case 'n':
+               i = MATCH_FONTVERSION; break;
+           }
+           break;
        case 'a':
            i = MATCH_FAMILY; break;
        }
@@ -384,26 +418,12 @@ FcFontRenderPrepare (FcConfig         *config,
        pe = FcPatternFindElt (pat, fe->object);
        if (pe)
        {
-           int     j;
-           double  score[NUM_MATCH_VALUES];
-
-           for (j = 0; j < NUM_MATCH_VALUES; j++)
-               score[j] = 0;
            if (!FcCompareValueList (pe->object, pe->values, 
-                                    fe->values, &v, score, &result))
+                                    fe->values, &v, 0, &result))
            {
                FcPatternDestroy (new);
                return 0;
            }
-           for (j = 0; j < NUM_MATCH_VALUES; j++)
-               if (score[j] >= 100.0)
-               {
-                   FcValueList *pv;
-
-                   for (pv = pe->values; pv; pv = pv->next)
-                       FcPatternAdd (new, fe->object, pv->value, FcTrue);
-                   break;
-               }
        }
        else
            v = fe->values->value;
@@ -416,7 +436,7 @@ FcFontRenderPrepare (FcConfig           *config,
        if (!fe)
            FcPatternAdd (new, pe->object, pe->values->value, FcTrue);
     }
-    FcConfigSubstitute (config, new, FcMatchFont);
+    FcConfigSubstituteWithPat (config, new, pat, FcMatchFont);
     return new;
 }
 
@@ -629,6 +649,7 @@ FcFontSetSort (FcConfig         *config,
     }
     if (!nnodes)
        goto bail0;
+    /* freed below */
     nodes = malloc (nnodes * sizeof (FcSortNode) + nnodes * sizeof (FcSortNode *));
     if (!nodes)
        goto bail0;