]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcmatch.c
Oops, fix FcPatternFilter
[fontconfig.git] / src / fcmatch.c
index d688c98b9eaad659f8cb19f0dc1d070b6f0a9ba2..556fffeaa85a6aba69d9819008c5a2fd90e4b0ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $RCSId: xc/lib/fontconfig/src/fcmatch.c,v 1.20 2002/08/31 22:17:32 keithp Exp $
+ * fontconfig/src/fcmatch.c
  *
  * Copyright © 2000 Keith Packard
  *
@@ -72,7 +72,8 @@ FcCompareFamily (FcValue *v1, FcValue *v2)
     const FcChar8* v1_string = fc_value_string(v1);
     const FcChar8* v2_string = fc_value_string(v2);
 
-    if (FcToLower(*v1_string) != FcToLower(*v2_string))
+    if (FcToLower(*v1_string) != FcToLower(*v2_string) &&
+       *v1_string != ' ' && *v2_string != ' ')
        return 1.0;
 
     return (double) FcStrCmpIgnoreBlanksAndCase (v1_string, v2_string) != 0;
@@ -225,24 +226,28 @@ static FcMatcher _FcMatchers [] = {
 #define MATCH_WIDTH        9
 #define MATCH_WIDTH_INDEX   10
     
-    { FC_ANTIALIAS_OBJECT,     FcCompareBool,  11, 11 },
-#define MATCH_ANTIALIAS            10
-#define MATCH_ANTIALIAS_INDEX      11
+    { FC_DECORATIVE_OBJECT,    FcCompareBool,          11, 11 },
+#define MATCH_DECORATIVE       10
+#define MATCH_DECORATIVE_INDEX 11
+
+    { FC_ANTIALIAS_OBJECT,     FcCompareBool,          12, 12 },
+#define MATCH_ANTIALIAS                    11
+#define MATCH_ANTIALIAS_INDEX      12
     
-    { FC_RASTERIZER_OBJECT,    FcCompareString,        12, 12 },
-#define MATCH_RASTERIZER    11
-#define MATCH_RASTERIZER_INDEX    12
+    { FC_RASTERIZER_OBJECT,    FcCompareString,        13, 13 },
+#define MATCH_RASTERIZER           12
+#define MATCH_RASTERIZER_INDEX     13
 
-    { FC_OUTLINE_OBJECT,       FcCompareBool,  13, 13 },
-#define MATCH_OUTLINE      12
-#define MATCH_OUTLINE_INDEX        13
+    { FC_OUTLINE_OBJECT,       FcCompareBool,          14, 14 },
+#define MATCH_OUTLINE              13
+#define MATCH_OUTLINE_INDEX        14
 
-    { FC_FONTVERSION_OBJECT,   FcCompareNumber,        14, 14 },
-#define MATCH_FONTVERSION   13
-#define MATCH_FONTVERSION_INDEX   14
+    { FC_FONTVERSION_OBJECT,   FcCompareNumber,        15, 15 },
+#define MATCH_FONTVERSION          14
+#define MATCH_FONTVERSION_INDEX            15
 };
 
-#define NUM_MATCH_VALUES    15
+#define NUM_MATCH_VALUES    16
 
 static FcMatcher*
 FcObjectToMatcher (FcObject object)
@@ -279,6 +284,8 @@ FcObjectToMatcher (FcObject object)
        i = MATCH_RASTERIZER; break;
     case FC_OUTLINE_OBJECT:
        i = MATCH_OUTLINE; break;
+    case FC_DECORATIVE_OBJECT:
+       i = MATCH_DECORATIVE; break;
     }
 
     if (i < 0)
@@ -310,7 +317,7 @@ FcCompareValueList (FcObject         object,
     best = 1e99;
     bestStrong = 1e99;
     bestWeak = 1e99;
-    j = 0;
+    j = 1;
     for (v1 = v1orig; v1; v1 = FcValueListNext(v1))
     {
        for (v2 = v2orig; v2; v2 = FcValueListNext(v2))
@@ -321,7 +328,7 @@ FcCompareValueList (FcObject         object,
                *result = FcResultTypeMismatch;
                return FcFalse;
            }
-           v = v * 100 + j;
+           v = v * 1000 + j;
            if (v < best)
            {
                if (bestValue)
@@ -452,12 +459,12 @@ FcFontRenderPrepare (FcConfig         *config,
     return new;
 }
 
-FcPattern *
-FcFontSetMatch (FcConfig    *config,
-               FcFontSet   **sets,
-               int         nsets,
-               FcPattern   *p,
-               FcResult    *result)
+static FcPattern *
+FcFontSetMatchInternal (FcConfig    *config,
+                       FcFontSet   **sets,
+                       int         nsets,
+                       FcPattern   *p,
+                       FcResult    *result)
 {
     double         score[NUM_MATCH_VALUES], bestscore[NUM_MATCH_VALUES];
     int                    f;
@@ -474,12 +481,6 @@ FcFontSetMatch (FcConfig    *config,
        printf ("Match ");
        FcPatternPrint (p);
     }
-    if (!config)
-    {
-       config = FcConfigGetCurrent ();
-       if (!config)
-           return 0;
-    }
     for (set = 0; set < nsets; set++)
     {
        s = sets[set];
@@ -522,6 +523,7 @@ FcFontSetMatch (FcConfig    *config,
        printf ("Best score");
        for (i = 0; i < NUM_MATCH_VALUES; i++)
            printf (" %g", bestscore[i]);
+       printf ("\n");
        FcPatternPrint (best);
     }
     if (!best)
@@ -529,6 +531,25 @@ FcFontSetMatch (FcConfig    *config,
        *result = FcResultNoMatch;
        return 0;
     }
+    return best;
+}
+
+FcPattern *
+FcFontSetMatch (FcConfig    *config,
+               FcFontSet   **sets,
+               int         nsets,
+               FcPattern   *p,
+               FcResult    *result)
+{
+    FcPattern      *best;
+
+    if (!config)
+    {
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return 0;
+    }
+    best = FcFontSetMatchInternal (config, sets, nsets, p, result);
     return FcFontRenderPrepare (config, p, best);
 }
 
@@ -539,6 +560,7 @@ FcFontMatch (FcConfig       *config,
 {
     FcFontSet  *sets[2];
     int                nsets;
+    FcPattern   *best;
 
     if (!config)
     {
@@ -551,7 +573,9 @@ FcFontMatch (FcConfig       *config,
        sets[nsets++] = config->fonts[FcSetSystem];
     if (config->fonts[FcSetApplication])
        sets[nsets++] = config->fonts[FcSetApplication];
-    return FcFontSetMatch (config, sets, nsets, p, result);
+
+    best = FcFontSetMatchInternal (config, sets, nsets, p, result);
+    return FcFontRenderPrepare (config, p, best);
 }
 
 typedef struct _FcSortNode {
@@ -584,40 +608,40 @@ FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **cs, FcBool tri
     while (nnode--)
     {
        node = *n++;
-       if (FcPatternGetCharSet (node->pattern, FC_CHARSET, 0, &ncs) == 
-           FcResultMatch)
+
+       /*
+        * Only fetch node charset if we'd need it
+        */
+       if (trim || build_cs)
+       {
+           if (FcPatternGetCharSet (node->pattern, FC_CHARSET, 0, &ncs) !=
+               FcResultMatch)
+               continue;
+       }
+
+       /*
+        * If this font isn't a subset of the previous fonts,
+        * add it to the list
+        */
+       if (!trim || !*cs || !FcCharSetIsSubset (ncs, *cs))
        {
-           /*
-            * If this font isn't a subset of the previous fonts,
-            * add it to the list
-            */
-           if (!trim || !*cs || !FcCharSetIsSubset (ncs, *cs))
+           if (trim || build_cs)
            {
-                if (trim || build_cs)
-                {
-                    if (*cs)
-                    {
-                        ncs = FcCharSetUnion (ncs, *cs);
-                        if (!ncs)
-                            return FcFalse;
-                        FcCharSetDestroy (*cs);
-                    }
-                    else
-                        ncs = FcCharSetCopy (ncs);
-                    *cs = ncs;
-                }
-
-               FcPatternReference (node->pattern);
-               if (FcDebug () & FC_DBG_MATCHV)
-               {
-                   printf ("Add ");
-                   FcPatternPrint (node->pattern);
-               }
-               if (!FcFontSetAdd (fs, node->pattern))
-               {
-                   FcPatternDestroy (node->pattern);
+               *cs = FcCharSetMerge (*cs, ncs);
+               if (*cs == NULL)
                    return FcFalse;
-               }
+           }
+
+           FcPatternReference (node->pattern);
+           if (FcDebug () & FC_DBG_MATCHV)
+           {
+               printf ("Add ");
+               FcPatternPrint (node->pattern);
+           }
+           if (!FcFontSetAdd (fs, node->pattern))
+           {
+               FcPatternDestroy (node->pattern);
+               return FcFalse;
            }
        }
     }
@@ -730,7 +754,7 @@ FcFontSetSort (FcConfig         *config,
         * If this node matches any language, go check
         * which ones and satisfy those entries
         */
-       if (nodeps[f]->score[MATCH_LANG_INDEX] < nPatternLang)
+       if (nodeps[f]->score[MATCH_LANG_INDEX] < 200)
        {
            for (i = 0; i < nPatternLang; i++)
            {
@@ -760,7 +784,7 @@ FcFontSetSort (FcConfig         *config,
            }
        }
        if (!satisfies)
-           nodeps[f]->score[MATCH_LANG_INDEX] = 1000.0;
+           nodeps[f]->score[MATCH_LANG_INDEX] = 10000.0;
     }
 
     /*
@@ -828,3 +852,6 @@ FcFontSort (FcConfig        *config,
        sets[nsets++] = config->fonts[FcSetApplication];
     return FcFontSetSort (config, sets, nsets, p, trim, csp, result);
 }
+#define __fcmatch__
+#include "fcaliastail.h"
+#undef __fcmatch__