Bug 541924: fix regression in handling bad-underline fonts blacklist on Windows. r=jdaggett

This commit is contained in:
Jonathan Kew 2010-01-28 06:56:16 +00:00
parent 9a4397fa5b
commit 11b4d1ada5
6 changed files with 23 additions and 14 deletions

View File

@ -354,6 +354,8 @@ public:
}
}
PRBool IsBadUnderlineFamily() const { return mIsBadUnderlineFamily; }
// sort available fonts to put preferred (standard) faces towards the end
void SortAvailableFonts();

View File

@ -121,10 +121,14 @@ gfxFT2FontList::AppendFacesFromFontFile(const PRUnichar *aFileName)
if (!family) {
family = new gfxFontFamily(name);
mFontFamilies.Put(name, family);
if (mBadUnderlineFamilyNames.GetEntry(name))
family->SetBadUnderlineFamily();
}
family->AddFontEntry(fe);
fe->SetFamily(family);
family->SetHasStyles(PR_TRUE);
if (family->IsBadUnderlineFamily())
fe->mIsBadUnderlineFont = PR_TRUE;
#ifdef PR_LOGGING
if (LOG_ENABLED()) {
LOG(("(fontinit) added (%s) to family (%s)"
@ -203,8 +207,6 @@ gfxFT2FontList::InitFontList()
mCodepointsWithNoFonts.SetRange(0x7f,0x9f); // C1 controls
FindFonts();
InitBadUnderlineList();
}
struct FullFontNameSearch {

View File

@ -617,8 +617,6 @@ gfxGDIFontList::InitFontList()
GetFontSubstitutes();
InitBadUnderlineList();
StartLoader(kDelayBeforeLoadingFonts, kIntervalBetweenLoadingFonts);
}
@ -643,6 +641,8 @@ gfxGDIFontList::EnumFontFamExProc(ENUMLOGFONTEXW *lpelfe,
nsDependentString faceName(lf.lfFaceName);
nsRefPtr<gfxFontFamily> family = new GDIFontFamily(faceName);
fontList->mFontFamilies.Put(name, family);
if (fontList->mBadUnderlineFamilyNames.GetEntry(name))
family->SetBadUnderlineFamily();
}
return 1;

View File

@ -648,6 +648,10 @@ gfxMacPlatformFontList::InitFontList()
// add the family entry to the hash table
ToLowerCase(availableFamilyName);
mFontFamilies.Put(availableFamilyName, familyEntry);
// check the bad underline blacklist
if (mBadUnderlineFamilyNames.GetEntry(availableFamilyName))
familyEntry->SetBadUnderlineFamily();
}
InitSingleFaceList();
@ -670,8 +674,6 @@ gfxMacPlatformFontList::InitFontList()
SetFixedPitch(NS_LITERAL_STRING("Monaco"));
}
InitBadUnderlineList();
// start the delayed cmap loader
StartLoader(kDelayBeforeLoadingCmaps, kIntervalBetweenLoadingCmaps);
}

View File

@ -111,6 +111,9 @@ gfxPlatformFontList::gfxPlatformFontList()
mOtherFamilyNamesInitialized = PR_FALSE;
mPrefFonts.Init(10);
mBadUnderlineFamilyNames.Init(10);
LoadBadUnderlineList();
// pref changes notification setup
gfxFontListPrefObserver *observer = new gfxFontListPrefObserver();
if (observer) {
@ -202,19 +205,15 @@ gfxPlatformFontList::SetFixedPitch(const nsAString& aFamilyName)
}
void
gfxPlatformFontList::InitBadUnderlineList()
gfxPlatformFontList::LoadBadUnderlineList()
{
nsAutoTArray<nsString, 10> blacklist;
gfxFontUtils::GetPrefsFontList("font.blacklist.underline_offset", blacklist);
PRUint32 numFonts = blacklist.Length();
for (PRUint32 i = 0; i < numFonts; i++) {
PRBool found;
nsAutoString key;
GenerateFontListKey(blacklist[i], key);
gfxFontFamily *familyEntry = mFontFamilies.GetWeak(key, &found);
if (familyEntry)
familyEntry->SetBadUnderlineFamily();
mBadUnderlineFamilyNames.PutEntry(key);
}
}
@ -433,6 +432,8 @@ gfxPlatformFontList::AddOtherFamilyName(gfxFontFamily *aFamilyEntry, nsAString&
PR_LOG(gFontListLog, PR_LOG_DEBUG, ("(fontlist-otherfamily) canonical family: %s, other family: %s\n",
NS_ConvertUTF16toUTF8(aFamilyEntry->Name()).get(),
NS_ConvertUTF16toUTF8(aOtherFamilyName).get()));
if (mBadUnderlineFamilyNames.GetEntry(key))
aFamilyEntry->SetBadUnderlineFamily();
}
}

View File

@ -138,8 +138,8 @@ protected:
// commonly used fonts for which the name table should be loaded at startup
virtual void PreloadNamesList();
// initialize the bad underline blacklist from pref.
virtual void InitBadUnderlineList();
// load the bad underline blacklist from pref.
void LoadBadUnderlineList();
// explicitly set fixed-pitch flag for all faces
void SetFixedPitch(const nsAString& aFamilyName);
@ -181,6 +181,8 @@ protected:
// flag set after InitOtherFamilyNames is called upon first name lookup miss
PRPackedBool mOtherFamilyNamesInitialized;
nsTHashtable<nsStringHashKey> mBadUnderlineFamilyNames;
// data used as part of the font cmap loading process
nsTArray<nsRefPtr<gfxFontFamily> > mFontFamiliesToLoad;
PRUint32 mStartIndex;