From 9e07e0a77b6b1c33a52a1ec4d845797e32125baf Mon Sep 17 00:00:00 2001 From: Patrick Lam Date: Sat, 11 Feb 2006 04:50:46 +0000 Subject: [PATCH] Use a tri-state to mark the fonts which didn't get blocked but were just missing an element, to distinguish them from the fonts that do match the element. reviewed by: plam --- ChangeLog | 8 ++++++++ src/fcmatch.c | 18 +++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23e74e2..fb6a699 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-02-10 Takashi Iwai + reviewed by: plam + * src/fcmatch.c (FcFontSetMatch): + + Use a tri-state to mark the fonts which didn't get blocked but + were just missing an element, to distinguish them from the + fonts that do match the element. + 2006-02-10 Takashi Iwai reviewed by: plam * src/fcmatch.c (FcFontSetMatch): diff --git a/src/fcmatch.c b/src/fcmatch.c index 30336ff..57e0c0e 100644 --- a/src/fcmatch.c +++ b/src/fcmatch.c @@ -524,7 +524,7 @@ FcFontSetMatch (FcConfig *config, FcMatcher *weak_matchers[NUM_MATCH_VALUES]; FcPatternElt *pat_elts[NUM_MATCH_VALUES]; int pat_elt; - FcBool *match_blocked; + int *match_blocked; int block_start; if (!nsets || !sets || !p) @@ -560,7 +560,7 @@ FcFontSetMatch (FcConfig *config, fonts_left = nfonts; - match_blocked = (FcBool*)calloc(nfonts, sizeof(FcBool)); + match_blocked = (int*)calloc(nfonts, sizeof(int)); /* Find out all necessary matchers first, so we don't need to find them * in every loop. @@ -631,7 +631,7 @@ FcFontSetMatch (FcConfig *config, int cand_elt; FcPatternElt *cand_elts; - if (match_blocked[f + sets_offset[set]]) + if (match_blocked[f + sets_offset[set]] == 1) continue; score = 1e99; @@ -675,8 +675,11 @@ FcFontSetMatch (FcConfig *config, /* We had no matching, just try the next one */ if (score == 1e99) + { + match_blocked[f + sets_offset[set]] = 2; continue; - + } + match_blocked[f + sets_offset[set]] = 0; /* If there's a previous champion, and current score * beats previous best score, on this element, then * knock out the previous champion and anything @@ -691,20 +694,21 @@ FcFontSetMatch (FcConfig *config, for (b = block_start; b < f + sets_offset[set]; ++b) if (!match_blocked[b]) { - match_blocked[b] = FcTrue; + match_blocked[b] = 1; --fonts_left; } } bestscore = score; best = s->fonts[f]; - block_start = f + sets_offset[set]; + /* This kills too many fonts, unfortunately. */ + /* block_start = f + sets_offset[set]; */ } /* If f loses, then it's out too. */ if (best && score > bestscore) { - match_blocked[f + sets_offset[set]] = FcTrue; + match_blocked[f + sets_offset[set]] = 1; --fonts_left; }