Speed up fonthashint matching

When we don't need to differentiate between weak and strong,
we can exit the loop in FcCompareValueList once we found a
best match.

This change helps reducing the amount of list walking we do
for fonthashint, where careless config files end up creating
lists with ~100 booleans :( We don't want to walk all those
to the end, over and over again.

We are already special-casing family, and the only other case
where weak != strong, PostScript names, doesn't have long lists
of values, so the limitation to weak == strong doesn't matter
much in practice.
This commit is contained in:
Matthias Clasen 2020-08-21 08:19:13 -04:00
parent 1b0cb23adc
commit 922168afe8
1 changed files with 13 additions and 6 deletions

View File

@ -408,6 +408,7 @@ FcCompareValueList (FcObject object,
FcValueListPtr v1, v2;
double v, best, bestStrong, bestWeak;
int j, k, pos = 0;
int weak, strong;
if (!match)
{
@ -418,11 +419,13 @@ FcCompareValueList (FcObject object,
return FcTrue;
}
weak = match->weak;
strong = match->strong;
best = 1e99;
bestStrong = 1e99;
bestWeak = 1e99;
j = 0;
for (v1 = v1orig; v1; v1 = FcValueListNext(v1))
for (v1 = v1orig, j = 0; v1; v1 = FcValueListNext(v1), j++)
{
for (v2 = v2orig, k = 0; v2; v2 = FcValueListNext(v2), k++)
{
@ -441,7 +444,13 @@ FcCompareValueList (FcObject object,
best = v;
pos = k;
}
if (v1->binding == FcValueBindingStrong)
if (weak == strong)
{
/* found the best possible match */
if (best < 1000)
goto done;
}
else if (v1->binding == FcValueBindingStrong)
{
if (v < bestStrong)
bestStrong = v;
@ -452,8 +461,8 @@ FcCompareValueList (FcObject object,
bestWeak = v;
}
}
j++;
}
done:
if (FcDebug () & FC_DBG_MATCHV)
{
printf (" %s: %g ", FcObjectName (object), best);
@ -464,8 +473,6 @@ FcCompareValueList (FcObject object,
}
if (value)
{
int weak = match->weak;
int strong = match->strong;
if (weak == strong)
value[strong] += best;
else