[Libreoffice-commits] core.git: include/vcl svtools/source sw/source vcl/inc vcl/source vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Nov 1 10:21:15 UTC 2018


 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 <glogow at fbihome.de>
AuthorDate: Wed Oct 31 12:28:58 2018 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
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 <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

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();


More information about the Libreoffice-commits mailing list