]> git.wh0rd.org - fontconfig.git/blobdiff - src/fclist.c
Fix weird first/not-first lameness in font matches, replacing with target
[fontconfig.git] / src / fclist.c
index 4cbfed2d70bc006262bf840f2942b074745ff561..e57f2bde96454d595a7e52b36fccbbeda80ba64d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: $
+ * $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.7 2002/06/19 20:08:22 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -45,6 +45,7 @@ FcObjectSetAdd (FcObjectSet *os, const char *object)
 {
     int                s;
     const char **objects;
+    int                high, low, mid, c;
     
     if (os->nobject == os->sobject)
     {
@@ -62,7 +63,27 @@ FcObjectSetAdd (FcObjectSet *os, const char *object)
        os->objects = objects;
        os->sobject = s;
     }
-    os->objects[os->nobject++] = object;
+    high = os->nobject - 1;
+    low = 0;
+    mid = 0;
+    c = 1;
+    while (low <= high)
+    {
+       mid = (low + high) >> 1;
+       c = strcmp (os->objects[mid], object);
+       if (c == 0)
+           return FcTrue;
+       if (c < 0)
+           low = mid + 1;
+       else
+           high = mid - 1;
+    }
+    if (c < 0)
+       mid++;
+    memmove (os->objects + mid + 1, os->objects + mid, 
+            (os->nobject - mid) * sizeof (const char *));
+    os->objects[mid] = object;
+    os->nobject++;
     return FcTrue;
 }
 
@@ -137,45 +158,45 @@ FcListValueListEqual (FcValueList   *v1orig,
     return FcTrue;
 }
 
-/*
- * FcTrue iff all objects in "p" match "font"
- */
-
 static FcBool
-FcListPatternMatchAny (FcPattern *p,
-                      FcPattern *font)
+FcListPatternEqual (FcPattern  *p1,
+                   FcPattern   *p2,
+                   FcObjectSet *os)
 {
     int                    i;
-    FcPatternElt   *e;
+    FcPatternElt    *e1, *e2;
 
-    for (i = 0; i < p->num; i++)
+    for (i = 0; i < os->nobject; i++)
     {
-       e = FcPatternFind (font, p->elts[i].object, FcFalse);
-       if (!e)
+       e1 = FcPatternFindElt (p1, os->objects[i]);
+       e2 = FcPatternFindElt (p2, os->objects[i]);
+       if (!e1 && !e2)
+           return FcTrue;
+       if (!e1 || !e2)
            return FcFalse;
-       if (!FcListValueListMatchAny (p->elts[i].values, e->values))
+       if (!FcListValueListEqual (e1->values, e2->values))
            return FcFalse;
     }
     return FcTrue;
 }
 
+/*
+ * FcTrue iff all objects in "p" match "font"
+ */
+
 static FcBool
-FcListPatternEqual (FcPattern  *p1,
-                   FcPattern   *p2,
-                   FcObjectSet *os)
+FcListPatternMatchAny (FcPattern *p,
+                      FcPattern *font)
 {
     int                    i;
-    FcPatternElt    *e1, *e2;
+    FcPatternElt   *e;
 
-    for (i = 0; i < os->nobject; i++)
+    for (i = 0; i < p->num; i++)
     {
-       e1 = FcPatternFind (p1, os->objects[i], FcFalse);
-       e2 = FcPatternFind (p2, os->objects[i], FcFalse);
-       if (!e1 && !e2)
-           return FcTrue;
-       if (!e1 || !e2)
+       e = FcPatternFindElt (font, p->elts[i].object);
+       if (!e)
            return FcFalse;
-       if (!FcListValueListEqual (e1->values, e2->values))
+       if (!FcListValueListMatchAny (p->elts[i].values, e->values))
            return FcFalse;
     }
     return FcTrue;
@@ -224,6 +245,10 @@ FcListValueHash (FcValue    v)
        return FcListMatrixHash (v.u.m);
     case FcTypeCharSet:
        return FcCharSetCount (v.u.c);
+    case FcTypeFTFace:
+       return (FcChar32) v.u.f;
+    case FcTypePattern:
+       return (FcChar32) v.u.p->num;
     }
     return 0;
 }
@@ -251,7 +276,7 @@ FcListPatternHash (FcPattern        *font,
 
     for (n = 0; n < os->nobject; n++)
     {
-       e = FcPatternFind (font, os->objects[n], FcFalse);
+       e = FcPatternFindElt (font, os->objects[n]);
        if (e)
            h = h ^ FcListValueListHash (e->values);
     }
@@ -329,7 +354,7 @@ FcListAppend (FcListHashTable       *table,
     
     for (o = 0; o < os->nobject; o++)
     {
-       e = FcPatternFind (font, os->objects[o], FcFalse);
+       e = FcPatternFindElt (font, os->objects[o]);
        if (e)
        {
            for (v = e->values; v; v = v->next)
@@ -356,20 +381,25 @@ bail0:
 }
 
 FcFontSet *
-FcFontList (FcConfig   *config,
-           FcPattern   *p,
-           FcObjectSet *os)
+FcFontSetList (FcConfig            *config,
+              FcFontSet    **sets,
+              int          nsets,
+              FcPattern    *p,
+              FcObjectSet  *os)
 {
     FcFontSet      *ret;
     FcFontSet      *s;
     int                    f;
-    FcSetName      set;
+    int                    set;
     FcListHashTable table;
     int                    i;
     FcListBucket    *bucket;
 
     if (!config)
     {
+       if (!FcInitBringUptoDate ())
+           goto bail0;
+
        config = FcConfigGetCurrent ();
        if (!config)
            goto bail0;
@@ -379,9 +409,9 @@ FcFontList (FcConfig        *config,
      * Walk all available fonts adding those that
      * match to the hash table
      */
-    for (set = FcSetSystem; set <= FcSetApplication; set++)
+    for (set = 0; set < nsets; set++)
     {
-       s = config->fonts[set];
+       s = sets[set];
        if (!s)
            continue;
        for (f = 0; f < s->nfont; f++)
@@ -440,3 +470,25 @@ bail1:
 bail0:
     return 0;
 }
+
+FcFontSet *
+FcFontList (FcConfig   *config,
+           FcPattern   *p,
+           FcObjectSet *os)
+{
+    FcFontSet  *sets[2];
+    int                nsets;
+
+    if (!config)
+    {
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return 0;
+    }
+    nsets = 0;
+    if (config->fonts[FcSetSystem])
+       sets[nsets++] = config->fonts[FcSetSystem];
+    if (config->fonts[FcSetApplication])
+       sets[nsets++] = config->fonts[FcSetApplication];
+    return FcFontSetList (config, sets, nsets, p, os);
+}