Bug 628152. Fix crash in BuildFontList and revert lazy metrics initialization in gfxDWriteFont. r=jkew, a=blocker

This commit is contained in:
John Daggett 2011-01-28 09:40:06 +09:00
parent 439fb48ac4
commit 8851b92260
4 changed files with 27 additions and 56 deletions

View File

@ -645,6 +645,8 @@ gfxDWriteFontList::InitFontList()
{
LOGREGISTRY(L"InitFontList start");
mInitialized = PR_FALSE;
#ifdef PR_LOGGING
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1, t2, t3; // ticks

View File

@ -122,12 +122,32 @@ gfxDWriteFont::gfxDWriteFont(gfxFontEntry *aFontEntry,
: gfxFont(aFontEntry, aFontStyle, anAAOption)
, mCairoFontFace(nsnull)
, mCairoScaledFont(nsnull)
, mInitialized(PR_FALSE)
, mMetrics(nsnull)
, mNeedsOblique(PR_FALSE)
, mNeedsBold(aNeedsBold)
, mUseSubpixelPositions(PR_FALSE)
{
gfxDWriteFontEntry *fe =
static_cast<gfxDWriteFontEntry*>(aFontEntry);
nsresult rv;
DWRITE_FONT_SIMULATIONS sims = DWRITE_FONT_SIMULATIONS_NONE;
if ((GetStyle()->style & (FONT_STYLE_ITALIC | FONT_STYLE_OBLIQUE)) &&
!fe->IsItalic()) {
// For this we always use the font_matrix for uniformity. Not the
// DWrite simulation.
mNeedsOblique = PR_TRUE;
}
if (aNeedsBold) {
sims |= DWRITE_FONT_SIMULATIONS_BOLD;
}
rv = fe->CreateFontFace(getter_AddRefs(mFontFace), sims);
if (NS_FAILED(rv)) {
mIsValid = PR_FALSE;
return;
}
if ((anAAOption == gfxFont::kAntialiasDefault && UsingClearType()) ||
anAAOption == gfxFont::kAntialiasSubpixel)
{
@ -136,6 +156,8 @@ gfxDWriteFont::gfxDWriteFont(gfxFontEntry *aFontEntry,
// strike is going to be used
}
ComputeMetrics();
if (FontCanSupportHarfBuzz()) {
mHarfBuzzShaper = new gfxHarfBuzzShaper(this);
}
@ -159,37 +181,6 @@ gfxDWriteFont::CopyWithAntialiasOption(AntialiasOption anAAOption)
&mStyle, mNeedsBold, anAAOption);
}
void
gfxDWriteFont::Initialize()
{
NS_ASSERTION(!mInitialized, "initializing gfxDWriteFont a second time");
mInitialized = PR_TRUE;
gfxDWriteFontEntry *fe =
static_cast<gfxDWriteFontEntry*>((gfxFontEntry*)mFontEntry);
nsresult rv;
DWRITE_FONT_SIMULATIONS sims = DWRITE_FONT_SIMULATIONS_NONE;
if ((GetStyle()->style & (FONT_STYLE_ITALIC | FONT_STYLE_OBLIQUE)) &&
!fe->IsItalic()) {
// For this we always use the font_matrix for uniformity. Not the
// DWrite simulation.
mNeedsOblique = PR_TRUE;
}
if (mNeedsBold) {
sims |= DWRITE_FONT_SIMULATIONS_BOLD;
}
rv = fe->CreateFontFace(getter_AddRefs(mFontFace), sims);
if (NS_FAILED(rv)) {
mIsValid = PR_FALSE;
return;
}
ComputeMetrics();
}
void
gfxDWriteFont::CreatePlatformShaper()
{
@ -205,9 +196,6 @@ gfxDWriteFont::GetUniqueName()
const gfxFont::Metrics&
gfxDWriteFont::GetMetrics()
{
if (!mInitialized) {
Initialize();
}
return *mMetrics;
}
@ -520,9 +508,6 @@ gfxDWriteFont::HasBitmapStrikeForSize(PRUint32 aSize)
PRUint32
gfxDWriteFont::GetSpaceGlyph()
{
if (!mInitialized) {
Initialize();
}
UINT32 ucs = L' ';
UINT16 glyph;
HRESULT hr;
@ -536,9 +521,6 @@ gfxDWriteFont::GetSpaceGlyph()
PRBool
gfxDWriteFont::SetupCairoFont(gfxContext *aContext)
{
if (!mInitialized) {
Initialize();
}
cairo_scaled_font_t *scaledFont = CairoScaledFont();
if (cairo_scaled_font_status(scaledFont) != CAIRO_STATUS_SUCCESS) {
// Don't cairo_set_scaled_font as that would propagate the error to
@ -552,18 +534,12 @@ gfxDWriteFont::SetupCairoFont(gfxContext *aContext)
PRBool
gfxDWriteFont::IsValid()
{
if (!mInitialized) {
Initialize();
}
return mFontFace != NULL;
}
IDWriteFontFace*
gfxDWriteFont::GetFontFace()
{
if (!mInitialized) {
Initialize();
}
return mFontFace.get();
}
@ -683,9 +659,6 @@ gfxDWriteFont::GetFontTable(PRUint32 aTag)
PRBool
gfxDWriteFont::ProvidesGlyphWidths()
{
if (!mInitialized) {
Initialize();
}
return !mUseSubpixelPositions ||
(mFontFace->GetSimulations() & DWRITE_FONT_SIMULATIONS_BOLD);
}

View File

@ -72,9 +72,6 @@ public:
virtual PRBool IsValid();
gfxFloat GetAdjustedSize() {
if (!mInitialized) {
Initialize();
}
return mAdjustedSize;
}
@ -93,8 +90,6 @@ protected:
virtual void CreatePlatformShaper();
void Initialize(); // creates IDWriteFontFace and metrics
void ComputeMetrics();
PRBool HasBitmapStrikeForSize(PRUint32 aSize);
@ -109,7 +104,6 @@ protected:
cairo_font_face_t *mCairoFontFace;
cairo_scaled_font_t *mCairoScaledFont;
PRBool mInitialized;
gfxFont::Metrics *mMetrics;
// cache of glyph widths in 16.16 fixed-point pixels

View File

@ -463,6 +463,8 @@ gfxPlatformFontList::FindFamily(const nsAString& aFamily)
PRBool found;
GenerateFontListKey(aFamily, key);
NS_ASSERTION(mFontFamilies.Count() != 0, "system font list was not initialized correctly");
// lookup in canonical (i.e. English) family name list
if ((familyEntry = mFontFamilies.GetWeak(key, &found))) {
return familyEntry;