Make sure that if the minifont couldn't be loaded that we don't crash. No bug on this one.

git-svn-id: svn://10.0.0.236/trunk@139568 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
blizzard%redhat.com
2003-03-16 13:35:03 +00:00
parent c702cf14dc
commit fbbd3f75aa
2 changed files with 39 additions and 34 deletions

View File

@@ -207,7 +207,7 @@ static nsresult
EnumFontsXft(nsIAtom* aLangGroup, const char* aGeneric,
PRUint32* aCount, PRUnichar*** aResult);
nsFontMetricsXft::nsFontMetricsXft()
nsFontMetricsXft::nsFontMetricsXft(): mMiniFont(nsnull)
{
if (!gXftFontLoad)
gXftFontLoad = PR_NewLogModule("XftFontLoad");
@@ -333,6 +333,9 @@ nsFontMetricsXft::Init(const nsFont& aFont, nsIAtom* aLangGroup,
if (NS_FAILED(RealizeFont()))
return NS_ERROR_FAILURE;
// Set up the mini-font in case it needs to be used later
SetupMiniFont();
return NS_OK;
}
@@ -1008,7 +1011,9 @@ nsFontMetricsXft::SetupMiniFont(void)
XftFont *font = nsnull;
XftFont *xftFont = mWesternFont->GetXftFont();
FcPattern *pat = nsnull;
nsresult rv = NS_ERROR_FAILURE;
mMiniFontAscent = xftFont->ascent;
mMiniFontDescent = xftFont->descent;
pattern = FcPatternCreate();
if (!pattern)
@@ -1030,21 +1035,22 @@ nsFontMetricsXft::SetupMiniFont(void)
FcResult res;
set = FcFontSort(0, pattern, FcTrue, NULL, &res);
if (!set)
goto end;
pat = FcFontRenderPrepare(0, pattern, set->fonts[0]);
if (!pat)
goto end;
if (set) {
pat = FcFontRenderPrepare(0, pattern, set->fonts[0]);
}
font = XftFontOpenPattern(GDK_DISPLAY(), pat);
if (!font)
goto end;
if (pat) {
font = XftFontOpenPattern(GDK_DISPLAY(), pat);
// the font owns the pattern now
pat = nsnull;
mMiniFont = font;
if (font) {
mMiniFont = font;
pat = nsnull; // the font owns the pattern now
}
else {
font = xftFont;
}
}
// now that the font has been loaded, measure the fonts to find
// the bounds
@@ -1057,21 +1063,23 @@ nsFontMetricsXft::SetupMiniFont(void)
str[1] = '\0';
XGlyphInfo extents;
XftTextExtents8(GDK_DISPLAY(), mMiniFont,
XftTextExtents8(GDK_DISPLAY(), font,
(FcChar8 *)str, 1, &extents);
mMiniFontWidth = PR_MAX (mMiniFontWidth, extents.width);
mMiniFontHeight = PR_MAX (mMiniFontHeight, extents.height);
}
mMiniFontPadding = PR_MAX(mMiniFontHeight / 10, 1);
if (!mMiniFont) {
mMiniFontWidth /= 2;
mMiniFontHeight /= 2;
}
mMiniFontYOffset = ((xftFont->ascent + xftFont->descent) -
mMiniFontPadding = PR_MAX(mMiniFontHeight / 10, 1);
mMiniFontYOffset = ((mMiniFontAscent + mMiniFontDescent) -
(mMiniFontHeight * 2 + mMiniFontPadding * 5)) / 2;
rv = NS_OK;
end:
if (pat)
FcPatternDestroy(pat);
if (pattern)
@@ -1079,12 +1087,7 @@ nsFontMetricsXft::SetupMiniFont(void)
if (set)
FcFontSetSortDestroy(set);
if (NS_FAILED(rv)) {
if (font)
XftFontClose(GDK_DISPLAY(), font);
}
return rv;
return NS_OK;
}
nsresult
@@ -1127,6 +1130,11 @@ nsFontMetricsXft::DrawUnknownGlyph(FcChar32 aChar,
aY - height + mMiniFontPadding,
mMiniFontPadding, height - mMiniFontPadding * 2);
// If for some reason the mini font couldn't be loaded, just
// return - the box is enough.
if (!mMiniFont)
return NS_OK;
// now draw the characters
char buf[7];
PR_snprintf (buf, sizeof(buf), "%0*X", ndigit * 2, aChar);
@@ -1179,10 +1187,6 @@ nsFontMetricsXft::EnumerateGlyphs(FcChar32 *aChars, PRUint32 aLen,
GlyphEnumeratorCallback aCallback,
void *aCallbackData)
{
// XXX this really should be somewhere else
if (!mMiniFont)
SetupMiniFont();
for (PRUint32 i = 0; i < aLen; ++i) {
FcChar32 c = aChars[i];
nsFontXft *foundFont = nsnull;
@@ -1261,7 +1265,6 @@ nsFontMetricsXft::DrawStringCallback(FcChar32 aChar, nsFontXft *aFont,
// If there was no font found for this character, just draw the
// unknown glyph character
if (!aFont) {
// XXX check to make sure that the mini font has been loaded
DrawUnknownGlyph(aChar, x, y + mMiniFontYOffset, &data->color,
data->draw);
@@ -1320,10 +1323,10 @@ nsFontMetricsXft::TextDimensionsCallback(FcChar32 aChar, nsFontXft *aFont,
data->dimensions->width += mMiniFontWidth * (IS_NON_BMP(aChar)?3:2) +
mMiniFontPadding * (IS_NON_BMP(aChar)?6:5);
if (data->dimensions->ascent < mMiniFont->ascent)
data->dimensions->ascent = mMiniFont->ascent;
if (data->dimensions->descent < mMiniFont->descent)
data->dimensions->descent = mMiniFont->descent;
if (data->dimensions->ascent < mMiniFontAscent)
data->dimensions->ascent = mMiniFontAscent;
if (data->dimensions->descent < mMiniFontDescent)
data->dimensions->descent = mMiniFontDescent;
return;
}

View File

@@ -268,6 +268,8 @@ private:
nscoord mMiniFontHeight;
nscoord mMiniFontPadding;
nscoord mMiniFontYOffset;
nscoord mMiniFontAscent;
nscoord mMiniFontDescent;
// Cached font metrics
nscoord mXHeight;