diff --git a/gfx/thebes/gfxPangoFonts.cpp b/gfx/thebes/gfxPangoFonts.cpp index c000fa8d432c..4a1dd8db5f97 100644 --- a/gfx/thebes/gfxPangoFonts.cpp +++ b/gfx/thebes/gfxPangoFonts.cpp @@ -600,23 +600,16 @@ struct gfxPangoFcFont { PangoCoverage *mCoverage; gfxFcFont *mGfxFont; - // The gfxPangoFcFont adds a reference to |aGfxFont| and |aFontPattern|. + // The caller promises to ensure that |aGfxFont| remains valid until the + // new gfxPangoFcFont is destroyed. See PangoFontToggleNotify. + // + // The gfxPangoFcFont holds a reference to |aFontPattern|. // Providing one of fontconfig's font patterns uses much less memory than // using a fully resolved pattern, because fontconfig's font patterns are // shared and will exist anyway. - // - // Note that the ownership between this PangoFont and the gfxFcFont is - // shared and the gfxFcFont will sometimes remove its reference added - // here. See PangoFontToggleNotify. static nsReturnRef NewFont(gfxFcFont *aGfxFont, FcPattern *aFontPattern); - // Tell |this| that it no longer needs the gfxFcFont and the caller - // assumes ownership of the gfxFcFont reference added at construction of - // |this|. The method is called just before the gfxFcFont removes the - // last reference to |this|. - void ForgetGfxFont() { mGfxFont = nsnull; } - gfxFcFont *GfxFont() { return mGfxFont; } cairo_scaled_font_t *CairoFont() @@ -641,7 +634,6 @@ gfxPangoFcFont::NewFont(gfxFcFont *aGfxFont, FcPattern *aFontPattern) gfxPangoFcFont *font = static_cast (g_object_new(GFX_TYPE_PANGO_FC_FONT, "pattern", aFontPattern, NULL)); - NS_ADDREF(aGfxFont); font->mGfxFont = aGfxFont; font->SetFontMap(); @@ -704,7 +696,6 @@ gfx_pango_fc_font_finalize(GObject *object) if (self->mCoverage) pango_coverage_unref(self->mCoverage); - NS_IF_RELEASE(self->mGfxFont); G_OBJECT_CLASS(gfx_pango_fc_font_parent_class)->finalize(object); } @@ -1886,7 +1877,7 @@ gfxFcFont::gfxFcFont(cairo_scaled_font_t *aCairoFont, } // The gfxFcFont keeps (only) a toggle_ref on mPangoFont. -// While mPangoFont has other references, a reference (from mPangoFont) to the +// While mPangoFont has other references, a reference to the // gfxFcFont is held. While mPangoFont has no other references, the reference // to the gfxFcFont is removed. static void @@ -1907,13 +1898,15 @@ gfxFcFont::MakePangoFont() nsAutoRef pangoFont(gfxPangoFcFont::NewFont(this, mFontPattern)); mPangoFont = pangoFont; g_object_add_toggle_ref(G_OBJECT(mPangoFont), PangoFontToggleNotify, this); + // This self-reference gets removed when the normal reference to the + // PangoFont is removed as the nsAutoRef goes out of scope. + NS_ADDREF(this); } gfxFcFont::~gfxFcFont() { cairo_scaled_font_set_user_data(mScaledFont, &sGfxFontKey, NULL, NULL); if (mPangoFont) { - GFX_PANGO_FC_FONT(mPangoFont)->ForgetGfxFont(); g_object_remove_toggle_ref(G_OBJECT(mPangoFont), PangoFontToggleNotify, this); }