Stephan Kulow <coolo@suse.de> reviewed by: plam

Don't kill all fonts during match (oops!)
This commit is contained in:
Patrick Lam 2005-11-28 10:54:11 +00:00
parent aa472e5f1a
commit 1ed98a0c87
2 changed files with 55 additions and 7 deletions

View File

@ -1,3 +1,26 @@
2005-11-28 Dirk Mueller <dmueller@suse.com>
Stephan Kulow <coolo@suse.de>
reviewed by: plam
* src/fcmatch.c (FcFontSetMatch):
Don't kill all fonts during match (oops!)
2005-11-25 Dirk Mueller <dmueller@suse.com>
Stephan Kulow <coolo@suse.de>
Michael Matz <matz@suse.de>
reviewed by: plam
* src/fcmatch.c (FcObjectPtrToMatcher, FcCompareValueList,
FcFontSetMatch):
Rewrite FcFontSetMatch to a path-finding based algorithm, i.e.
inline FcCompare into FcFontSetMatch and reorder the
loops, adding a boolean array which blocks patterns from future
consideration if they're known to not be best on some past
criterion.
2005-11-26 Dirk Mueller <dmueller@suse.com> 2005-11-26 Dirk Mueller <dmueller@suse.com>
reviewed by: plam reviewed by: plam

View File

@ -534,11 +534,15 @@ FcFontSetMatch (FcConfig *config,
} }
for (set = 0; set < nsets; set++) for (set = 0; set < nsets; set++)
{ {
FcBool *matchBlocked;
int blockStart;
s = sets[set]; s = sets[set];
if (!s) if (!s)
continue; continue;
char* matchBlocked = (char*)calloc(s->nfont, sizeof(FcBool)); matchBlocked = (FcBool*)calloc(s->nfont, sizeof(FcBool));
blockStart = 0;
/* The old algorithm checked if each font beat 'best', /* The old algorithm checked if each font beat 'best',
* scanning all of the value lists for all of the pattern elts. */ * scanning all of the value lists for all of the pattern elts. */
@ -575,19 +579,29 @@ FcFontSetMatch (FcConfig *config,
if (!match) if (!match)
continue; continue;
bestscore = 1e99;
for (v1 = pat_elts[pat_elt].values, v1_ptrU = FcValueListPtrU(v1); for (v1 = pat_elts[pat_elt].values, v1_ptrU = FcValueListPtrU(v1);
v1_ptrU; v1_ptrU;
v1 = FcValueListPtrU(v1)->next, v1 = FcValueListPtrU(v1)->next,
v1_ptrU = FcValueListPtrU(v1), v1_offset++) v1_ptrU = FcValueListPtrU(v1), v1_offset++)
{ {
if ((v1_ptrU->binding == FcValueBindingWeak
if (v1_ptrU->binding == FcValueBindingWeak
&& scoring_index != match->weak) && scoring_index != match->weak)
|| (v1_ptrU->binding == FcValueBindingStrong
&& scoring_index != match->strong)
)
continue; continue;
bestscore = 1e99;
if (FcDebug () & FC_DBG_MATCHV)
{
int blocked_fonts = 0;
for (f = 0; f < s->nfont; f++)
blocked_fonts += matchBlocked[f] ? 1 : 0;
printf("Scoring Index %d, Value %d: %d(%d) fonts left\n",
scoring_index, v1_offset, s->nfont - blocked_fonts, s->nfont);
}
for (f = 0; f < s->nfont; f++) for (f = 0; f < s->nfont; f++)
{ {
int cand_elt; int cand_elt;
@ -644,12 +658,13 @@ FcFontSetMatch (FcConfig *config,
if (best) if (best)
{ {
int b; int b;
for (b = 0; b < f; ++b) for (b = blockStart; b < f; ++b)
matchBlocked[b] = FcTrue; matchBlocked[b] = FcTrue;
} }
bestscore = score; bestscore = score;
best = s->fonts[f]; best = s->fonts[f];
blockStart = f;
} }
/* If f loses, then it's out too. */ /* If f loses, then it's out too. */
@ -659,10 +674,20 @@ FcFontSetMatch (FcConfig *config,
/* Otherwise, f is equal to best on this element. /* Otherwise, f is equal to best on this element.
* Carry on to next pattern element. */ * Carry on to next pattern element. */
} }
if ((FcDebug () & FC_DBG_MATCHV) && best)
{
printf ("Best match (scoring index %d) candidate ", scoring_index);
FcPatternPrint (best);
}
} }
} }
free (matchBlocked); free (matchBlocked);
} }
if ((FcDebug () & FC_DBG_MATCH) && best)
{
printf ("Best match ");
FcPatternPrint (best);
}
if (!best) if (!best)
{ {
*result = FcResultNoMatch; *result = FcResultNoMatch;