/*
- * $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.
*
{
int s;
const char **objects;
+ int high, low, mid, c;
if (os->nobject == os->sobject)
{
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;
}
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;
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;
}
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);
}
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)
}
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;
* 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++)
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);
+}