Bug 549816. Adjust meaning of needsBold flag. r=bas

This commit is contained in:
John Daggett 2010-03-12 13:26:43 +09:00
parent 0347e107b7
commit b6c4b585db
3 changed files with 26 additions and 26 deletions

View File

@ -318,11 +318,12 @@ public:
void SetHasStyles(PRBool aHasStyles) { mHasStyles = aHasStyles; } void SetHasStyles(PRBool aHasStyles) { mHasStyles = aHasStyles; }
// choose a specific face to match a style using CSS font matching // choose a specific face to match a style using CSS font matching
// rules (weight matching occurs here) // rules (weight matching occurs here). may return a face that doesn't
// may return a face that doesn't precisely match (e.g. normal face when no italic face exists) // precisely match (e.g. normal face when no italic face exists).
// aNeedsBold is set to true when bolder face couldn't be found, false otherwise // aNeedsSyntheticBold is set to true when synthetic bolding is
// needed, false otherwise
gfxFontEntry *FindFontForStyle(const gfxFontStyle& aFontStyle, gfxFontEntry *FindFontForStyle(const gfxFontStyle& aFontStyle,
PRBool& aNeedsBold); PRBool& aNeedsSyntheticBold);
// iterates over faces looking for a match with a given characters // iterates over faces looking for a match with a given characters
// used as part of the font fallback process // used as part of the font fallback process

View File

@ -162,14 +162,15 @@ gfxFontFamily::HasOtherFamilyNames()
} }
gfxFontEntry* gfxFontEntry*
gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBold) gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle,
PRBool& aNeedsSyntheticBold)
{ {
if (!mHasStyles) if (!mHasStyles)
FindStyleVariations(); // collect faces for the family, if not already done FindStyleVariations(); // collect faces for the family, if not already done
NS_ASSERTION(mAvailableFonts.Length() > 0, "font family with no faces!"); NS_ASSERTION(mAvailableFonts.Length() > 0, "font family with no faces!");
aNeedsBold = PR_FALSE; aNeedsSyntheticBold = PR_FALSE;
PRInt8 baseWeight, weightDistance; PRInt8 baseWeight, weightDistance;
aFontStyle.ComputeWeightAndOffset(&baseWeight, &weightDistance); aFontStyle.ComputeWeightAndOffset(&baseWeight, &weightDistance);
@ -181,7 +182,7 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
// If the family has only one face, we simply return it; no further checking needed // If the family has only one face, we simply return it; no further checking needed
if (mAvailableFonts.Length() == 1) { if (mAvailableFonts.Length() == 1) {
gfxFontEntry *fe = mAvailableFonts[0]; gfxFontEntry *fe = mAvailableFonts[0];
aNeedsBold = wantBold && !fe->IsBold(); aNeedsSyntheticBold = wantBold && !fe->IsBold();
return fe; return fe;
} }
@ -204,7 +205,7 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
// if the desired style is available, return it directly // if the desired style is available, return it directly
gfxFontEntry *fe = mAvailableFonts[faceIndex]; gfxFontEntry *fe = mAvailableFonts[faceIndex];
if (fe) { if (fe) {
// no need to set aNeedsBold here as we matched the boldness request // no need to set aNeedsSyntheticBold here as we matched the boldness request
return fe; return fe;
} }
@ -226,7 +227,7 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
NS_ConvertUTF16toUTF8(mName).get(), NS_ConvertUTF16toUTF8(mName).get(),
aFontStyle.style, aFontStyle.weight, aFontStyle.size, aFontStyle.style, aFontStyle.weight, aFontStyle.size,
NS_ConvertUTF16toUTF8(fe->Name()).get(), trial)); NS_ConvertUTF16toUTF8(fe->Name()).get(), trial));
aNeedsBold = wantBold && !fe->IsBold(); aNeedsSyntheticBold = wantBold && !fe->IsBold();
return fe; return fe;
} }
} }
@ -288,6 +289,13 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
direction = (weightDistance >= 0) ? 1 : -1; direction = (weightDistance >= 0) ? 1 : -1;
PRInt8 i, wghtSteps = 0; PRInt8 i, wghtSteps = 0;
// synthetic bolding occurs when font itself is not a bold-face and
// either the absolute weight is at least 600 or the relative weight
// (e.g. 402) implies a darker face than the ones available.
// note: this means that (1) lighter styles *never* synthetic bold and
// (2) synthetic bolding always occurs at the first bolder step beyond
// available faces, no matter how light the boldest face
// account for synthetic bold in lighter case // account for synthetic bold in lighter case
// if lighter is applied with an inherited bold weight, // if lighter is applied with an inherited bold weight,
// and no actual bold faces exist, synthetic bold is used // and no actual bold faces exist, synthetic bold is used
@ -305,10 +313,13 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
break; break;
} }
if ((weightDistance > 0 && wghtSteps <= absDistance) || NS_ASSERTION(matchFE, "we should always be able to return something here");
(baseWeight >= 6 && !matchFE->IsBold() &&
(wghtSteps - 1) <= weightDistance)) { if (!matchFE->IsBold() &&
aNeedsBold = PR_TRUE; ((weightDistance == 0 && baseWeight >= 6) ||
(weightDistance > 0 && wghtSteps <= absDistance)))
{
aNeedsSyntheticBold = PR_TRUE;
} }
PR_LOG(gFontSelection, PR_LOG_DEBUG, PR_LOG(gFontSelection, PR_LOG_DEBUG,
@ -316,7 +327,6 @@ gfxFontFamily::FindFontForStyle(const gfxFontStyle& aFontStyle, PRBool& aNeedsBo
NS_ConvertUTF16toUTF8(mName).get(), NS_ConvertUTF16toUTF8(mName).get(),
aFontStyle.style, aFontStyle.weight, aFontStyle.size, aFontStyle.style, aFontStyle.weight, aFontStyle.size,
NS_ConvertUTF16toUTF8(matchFE->Name()).get())); NS_ConvertUTF16toUTF8(matchFE->Name()).get()));
NS_ASSERTION(matchFE, "we should always be able to return something here");
return matchFE; return matchFE;
} }

View File

@ -53,18 +53,7 @@ gfxMacFont::gfxMacFont(MacOSFontEntry *aFontEntry, const gfxFontStyle *aFontStyl
mScaledFont(nsnull), mScaledFont(nsnull),
mAdjustedSize(0.0) mAdjustedSize(0.0)
{ {
// determine whether synthetic bolding is needed if (aNeedsBold) {
PRInt8 baseWeight, weightDistance;
mStyle.ComputeWeightAndOffset(&baseWeight, &weightDistance);
PRUint16 targetWeight = (baseWeight * 100) + (weightDistance * 100);
// synthetic bolding occurs when font itself is not a bold-face and either the absolute weight
// is at least 600 or the relative weight (e.g. 402) implies a darker face than the ones available.
// note: this means that (1) lighter styles *never* synthetic bold and (2) synthetic bolding always occurs
// at the first bolder step beyond available faces, no matter how light the boldest face
if (!aFontEntry->IsBold()
&& ((weightDistance == 0 && targetWeight >= 600) || (weightDistance > 0 && aNeedsBold)))
{
mSyntheticBoldOffset = 1; // devunit offset when double-striking text to fake boldness mSyntheticBoldOffset = 1; // devunit offset when double-striking text to fake boldness
} }