mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 628152. Fix crash in BuildFontList and revert lazy metrics initialization in gfxDWriteFont. r=jkew, a=blocker
This commit is contained in:
parent
439fb48ac4
commit
8851b92260
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user