include/vcl/glyphitem.hxx | 4 ++-- svtools/source/control/ruler.cxx | 2 +- sw/source/core/txtnode/fntcache.cxx | 2 +- vcl/inc/impglyphitem.hxx | 6 +++++- vcl/source/control/imp_listbox.cxx | 2 +- vcl/source/gdi/impglyphitem.cxx | 33 ++++++++++++++++++++++++++++++--- vcl/source/gdi/sallayout.cxx | 4 ++-- vcl/source/window/menu.cxx | 2 +- vcl/source/window/menuitemlist.cxx | 2 +- vcl/unx/generic/glyphs/glyphcache.cxx | 2 ++ 10 files changed, 46 insertions(+), 13 deletions(-)
New commits: commit 4a66d7f0dd40c54307b5f750723f68b53703b01a Author: Jan-Marek Glogowski <[email protected]> AuthorDate: Wed Oct 31 12:28:58 2018 +0100 Commit: Caolán McNamara <[email protected]> CommitDate: Thu Nov 1 11:20:43 2018 +0100 tdf#121030 invalidate referenced FontInstances This sets the FreetypeFont pointer of the FreetypeFontInstances to nullptr when clearing the cache. And it changes the interface functions of SalLayoutGlyphs to some variant different from std::vector. I don't know if we should prefer the mutable or the const font instance. With mutable at least one can invalidate the font instance when checking the IsValid(), so we can get rid of our referenced font instance. Change-Id: I6070cfcb3c549dbad3383bd4ec2b05b30645b753 Reviewed-on: https://gerrit.libreoffice.org/62688 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Caolán McNamara <[email protected]> diff --git a/include/vcl/glyphitem.hxx b/include/vcl/glyphitem.hxx index 75213a5b49c5..83625371fb3b 100644 --- a/include/vcl/glyphitem.hxx +++ b/include/vcl/glyphitem.hxx @@ -39,8 +39,8 @@ public: SalLayoutGlyphsImpl* Impl() const { return m_pImpl; } - bool empty() const; - void clear(); + bool IsValid() const; + void Invalidate(); }; #endif // INCLUDED_VCL_GLYPHITEM_HXX diff --git a/svtools/source/control/ruler.cxx b/svtools/source/control/ruler.cxx index 1cb397edd890..a27fb608d7b2 100644 --- a/svtools/source/control/ruler.cxx +++ b/svtools/source/control/ruler.cxx @@ -71,7 +71,7 @@ namespace SalLayoutGlyphs* lcl_GetRulerTextGlyphs(vcl::RenderContext& rRenderContext, const OUString& rText, SalLayoutGlyphs& rTextGlyphs) { - if (!rTextGlyphs.empty()) + if (rTextGlyphs.IsValid()) // Use pre-calculated result. return &rTextGlyphs; diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index bf365413f282..c93e51d0bf69 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -105,7 +105,7 @@ long EvalGridWidthAdd( const SwTextGridItem *const pGrid, const SwDrawTextInfo & SalLayoutGlyphs* lcl_CreateLayout(SwTextGlyphsKey& rKey, SalLayoutGlyphs& rTextGlyphs) { // Use pre-calculated result. - if (!rTextGlyphs.empty()) + if (rTextGlyphs.IsValid()) return &rTextGlyphs; if (rKey.m_nIndex >= rKey.m_aText.getLength()) diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx index 4c7673ed2077..009be6cc2506 100644 --- a/vcl/inc/impglyphitem.hxx +++ b/vcl/inc/impglyphitem.hxx @@ -98,13 +98,15 @@ protected: public: virtual ~SalLayoutGlyphsImpl(); virtual SalLayoutGlyphsImpl* clone(SalLayoutGlyphs&) const = 0; + virtual bool IsValid() const = 0; + virtual void Invalidate() = 0; }; class SalGenericLayoutGlyphsImpl : public SalLayoutGlyphsImpl { friend class GenericSalLayout; - const rtl::Reference<LogicalFontInstance> m_rFontInstance; + mutable rtl::Reference<LogicalFontInstance> m_rFontInstance; SalGenericLayoutGlyphsImpl(SalLayoutGlyphs& rGlyphs, LogicalFontInstance& rFontInstance) : m_rFontInstance(&rFontInstance) @@ -115,6 +117,8 @@ class SalGenericLayoutGlyphsImpl : public SalLayoutGlyphsImpl public: SalLayoutGlyphsImpl* clone(SalLayoutGlyphs& rGlyphs) const override; LogicalFontInstance& GetFont() const { return *m_rFontInstance; } + bool IsValid() const override; + void Invalidate() override; }; #endif // INCLUDED_VCL_IMPGLYPHITEM_HXX diff --git a/vcl/source/control/imp_listbox.cxx b/vcl/source/control/imp_listbox.cxx index 6570fb34c578..265a9589ff63 100644 --- a/vcl/source/control/imp_listbox.cxx +++ b/vcl/source/control/imp_listbox.cxx @@ -618,7 +618,7 @@ struct ImplEntryMetrics SalLayoutGlyphs* ImplEntryType::GetTextGlyphs(OutputDevice* pOutputDevice) { - if (!maStrGlyphs.empty()) + if (maStrGlyphs.IsValid()) // Use pre-calculated result. return &maStrGlyphs; diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx index 8955ea890a9f..d3aa10ebd1b3 100644 --- a/vcl/source/gdi/impglyphitem.cxx +++ b/vcl/source/gdi/impglyphitem.cxx @@ -19,6 +19,10 @@ #include <impglyphitem.hxx> +#if (defined UNX && !defined MACOSX) +#include <unx/freetype_glyphcache.hxx> +#endif + SalLayoutGlyphs::SalLayoutGlyphs() : m_pImpl(nullptr) { @@ -35,12 +39,12 @@ SalLayoutGlyphs& SalLayoutGlyphs::operator=(const SalLayoutGlyphs& rOther) return *this; } -bool SalLayoutGlyphs::empty() const { return !m_pImpl || m_pImpl->empty(); } +bool SalLayoutGlyphs::IsValid() const { return m_pImpl && m_pImpl->IsValid(); } -void SalLayoutGlyphs::clear() +void SalLayoutGlyphs::Invalidate() { if (m_pImpl) - m_pImpl->clear(); + m_pImpl->Invalidate(); } SalLayoutGlyphsImpl::~SalLayoutGlyphsImpl() {} @@ -52,4 +56,27 @@ SalLayoutGlyphsImpl* SalGenericLayoutGlyphsImpl::clone(SalLayoutGlyphs& rGlyphs) return pNew; } +bool SalGenericLayoutGlyphsImpl::IsValid() const +{ + if (!m_rFontInstance.is()) + return false; + if (empty()) + return false; +#if (defined UNX && !defined MACOSX) + const FreetypeFontInstance* pFFI = dynamic_cast<FreetypeFontInstance*>(m_rFontInstance.get()); + if (pFFI && !pFFI->GetFreetypeFont()) + { + m_rFontInstance.clear(); + return false; + } +#endif + return true; +} + +void SalGenericLayoutGlyphsImpl::Invalidate() +{ + m_rFontInstance.clear(); + clear(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index 68319505a3fc..4cbca56d9b70 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -704,7 +704,7 @@ DeviceCoordinate GenericSalLayout::FillDXArray( DeviceCoordinate* pCharWidths ) // the text width is the maximum logical extent of all glyphs DeviceCoordinate GenericSalLayout::GetTextWidth() const { - if( m_GlyphItems.empty() ) + if (!m_GlyphItems.IsValid()) return 0; // initialize the extent @@ -733,7 +733,7 @@ void GenericSalLayout::Justify( DeviceCoordinate nNewWidth ) if( !nOldWidth || nNewWidth==nOldWidth ) return; - if(m_GlyphItems.empty()) + if (!m_GlyphItems.IsValid()) { return; } diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index eef0138f36b3..c67d275c0e55 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -987,7 +987,7 @@ void Menu::SetItemText( sal_uInt16 nItemId, const OUString& rStr ) { pData->aText = rStr; // Clear layout for aText. - pData->aTextGlyphs.clear(); + pData->aTextGlyphs.Invalidate(); ImplSetMenuItemData( pData ); // update native menu if( ImplGetSalMenu() && pData->pSalMenuItem ) diff --git a/vcl/source/window/menuitemlist.cxx b/vcl/source/window/menuitemlist.cxx index c0496f1ee603..62127940e4e1 100644 --- a/vcl/source/window/menuitemlist.cxx +++ b/vcl/source/window/menuitemlist.cxx @@ -41,7 +41,7 @@ MenuItemData::~MenuItemData() SalLayoutGlyphs* MenuItemData::GetTextGlyphs(OutputDevice* pOutputDevice) { - if (!aTextGlyphs.empty()) + if (aTextGlyphs.IsValid()) // Use pre-calculated result. return &aTextGlyphs; diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx b/vcl/unx/generic/glyphs/glyphcache.cxx index 29e0d1ba65b6..b541fe1861fe 100644 --- a/vcl/unx/generic/glyphs/glyphcache.cxx +++ b/vcl/unx/generic/glyphs/glyphcache.cxx @@ -46,6 +46,8 @@ GlyphCache::~GlyphCache() void GlyphCache::ClearFontCache() { + for (auto &aFontPair : maFontList) + static_cast<FreetypeFontInstance*>(aFontPair.first.get())->SetFreetypeFont(nullptr); maFontList.clear(); mpCurrentGCFont = nullptr; m_aFontInfoList.clear(); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
