[Libreoffice-commits] core.git: include/vcl vcl/inc vcl/qt5 vcl/quartz vcl/source vcl/unx vcl/win

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Oct 25 17:53:55 UTC 2018


 include/vcl/glyphitem.hxx                |    6 +++---
 include/vcl/vcllayout.hxx                |    5 +++--
 vcl/inc/sallayout.hxx                    |   10 ++++++----
 vcl/inc/unx/freetype_glyphcache.hxx      |    9 +++++++++
 vcl/qt5/Qt5Graphics_Text.cxx             |    6 +-----
 vcl/quartz/salgdi.cxx                    |   16 ++--------------
 vcl/source/gdi/CommonSalLayout.cxx       |    4 ++--
 vcl/source/gdi/sallayout.cxx             |    9 +++++----
 vcl/source/outdev/text.cxx               |    6 ++----
 vcl/unx/generic/gdi/cairotextrender.cxx  |   12 ++----------
 vcl/unx/generic/print/genpspgraphics.cxx |   12 ++----------
 vcl/win/gdi/salfont.cxx                  |    4 ++--
 12 files changed, 39 insertions(+), 60 deletions(-)

New commits:
commit e194f597ae5882e1cda2cac2925577fff609f101
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Sun Sep 30 16:07:16 2018 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Thu Oct 25 19:53:22 2018 +0200

    Change GlyphItem::nFallbackLevel to font instance
    
    No need for a real reference, as GlyphItems are bound to their
    GenericSalLayout, which holds the valid reference and doesn't
    allow font change.
    
    Change-Id: I8e1129ef99f576e43d55f39aee040ceeb635d51d
    Reviewed-on: https://gerrit.libreoffice.org/62359
    Reviewed-by: Khaled Hosny <khaledhosny at eglug.org>
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/include/vcl/glyphitem.hxx b/include/vcl/glyphitem.hxx
index 39d99bf69744..306466b67723 100644
--- a/include/vcl/glyphitem.hxx
+++ b/include/vcl/glyphitem.hxx
@@ -41,10 +41,10 @@ struct VCL_DLLPUBLIC GlyphItem
     sal_GlyphId m_aGlyphId;
     Point m_aLinearPos; // absolute position of non rotated string
 
-    int m_nFallbackLevel;
+    LogicalFontInstance* m_pFontInstance;
 
     GlyphItem(int nCharPos, int nCharCount, sal_GlyphId aGlyphId, const Point& rLinearPos,
-              long nFlags, int nOrigWidth, int nXOffset)
+              long nFlags, int nOrigWidth, int nXOffset, LogicalFontInstance* pFontInstance)
         : m_nFlags(nFlags)
         , m_nCharPos(nCharPos)
         , m_nCharCount(nCharCount)
@@ -53,7 +53,7 @@ struct VCL_DLLPUBLIC GlyphItem
         , m_nXOffset(nXOffset)
         , m_aGlyphId(aGlyphId)
         , m_aLinearPos(rLinearPos)
-        , m_nFallbackLevel(0)
+        , m_pFontInstance(pFontInstance)
     {
     }
 
diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx
index 81cb7be614fb..3237973e9ffc 100644
--- a/include/vcl/vcllayout.hxx
+++ b/include/vcl/vcllayout.hxx
@@ -96,8 +96,9 @@ public:
     virtual bool    IsKashidaPosValid ( int /*nCharPos*/ ) const { return true; } // i60594
 
     // methods using glyph indexing
-    virtual bool    GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int&,
-                                 const PhysicalFontFace** pFallbackFont = nullptr) const = 0;
+    virtual bool    GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const PhysicalFontFace** pFallbackFont = nullptr,
+                                 int* const pFallbackLevel = nullptr) const = 0;
     virtual bool    GetOutline( SalGraphics&, basegfx::B2DPolyPolygonVector& ) const;
     virtual bool    GetBoundRect( SalGraphics&, tools::Rectangle& ) const;
 
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index ccaa4bd34d63..6b2ca93a7a39 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -130,8 +130,9 @@ public:
     sal_Int32       GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const override;
     DeviceCoordinate FillDXArray(DeviceCoordinate* pDXArray) const override;
     void            GetCaretPositions(int nArraySize, long* pCaretXArray) const override;
-    bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int&,
-                                 const PhysicalFontFace** pFallbackFont = nullptr) const override;
+    bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const PhysicalFontFace** pFallbackFont = nullptr,
+                                 int* const pFallbackLevel = nullptr) const override;
     bool            GetOutline(SalGraphics&, basegfx::B2DPolyPolygonVector&) const override;
     bool            IsKashidaPosValid(int nCharPos) const override;
 
@@ -182,8 +183,9 @@ public:
     // used by display layers
     LogicalFontInstance& GetFont() const { return *mpFont; }
 
-    bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int&,
-                                 const PhysicalFontFace** pFallbackFont = nullptr) const final override;
+    bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const PhysicalFontFace** pFallbackFont = nullptr,
+                                 int* const pFallbackLevel = nullptr) const override;
 
 private:
     // for glyph+font+script fallback
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx b/vcl/inc/unx/freetype_glyphcache.hxx
index 3a6a64fb929e..58cd4eba38b1 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -23,6 +23,7 @@
 #include <unx/glyphcache.hxx>
 #include <PhysicalFontFace.hxx>
 #include <fontinstance.hxx>
+#include <vcl/glyphitem.hxx>
 
 // FreetypeFontFile has the responsibility that a font file is only mapped once.
 // (#86621#) the old directly ft-managed solution caused it to be mapped
@@ -117,6 +118,14 @@ public:
     FreetypeFont* GetFreetypeFont() const { return mpFreetypeFont; }
 };
 
+inline FreetypeFont* getFreetypeFontFromGlyph(const GlyphItem& rGlyph)
+{
+    assert(rGlyph.m_pFontInstance);
+    if (!rGlyph.m_pFontInstance)
+        return nullptr;
+    return static_cast<FreetypeFontInstance*>(rGlyph.m_pFontInstance)->GetFreetypeFont();
+}
+
 #endif // INCLUDED_VCL_GENERIC_GLYPHS_GCACH_FTYP_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 9f6392435083..79b5c8fe1f8e 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -154,11 +154,7 @@ void Qt5Graphics::GetGlyphWidths(const PhysicalFontFace* /*pPFF*/, bool /*bVerti
 
 bool Qt5Graphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
 {
-    const int nLevel = rGlyph.m_nFallbackLevel;
-    if (nLevel >= MAX_FALLBACK)
-        return false;
-
-    Qt5Font* pFont = m_pTextStyle[nLevel].get();
+    Qt5Font* pFont = static_cast<Qt5Font*>(rGlyph.m_pFontInstance);
     if (!pFont)
         return false;
 
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index bd7800d02f28..639f54a74144 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -372,24 +372,12 @@ bool AquaSalGraphics::AddTempDevFont( PhysicalFontCollection*,
 
 bool AquaSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon& rPolyPoly)
 {
-    const int nFallbackLevel = rGlyph.m_nFallbackLevel;
-    if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
-    {
-        const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphOutline(rGlyph, rPolyPoly);
-        return bRC;
-    }
-    return false;
+    return static_cast<CoreTextStyle*>(rGlyph.m_pFontInstance)->GetGlyphOutline(rGlyph, rPolyPoly);
 }
 
 bool AquaSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect )
 {
-    const int nFallbackLevel = rGlyph.m_nFallbackLevel;
-    if (nFallbackLevel < MAX_FALLBACK && mpTextStyle[nFallbackLevel])
-    {
-        const bool bRC = mpTextStyle[nFallbackLevel]->GetGlyphBoundRect(rGlyph, rRect);
-        return bRC;
-    }
-    return false;
+    return static_cast<CoreTextStyle*>(rGlyph.m_pFontInstance)->GetGlyphBoundRect(rGlyph, rRect);
 }
 
 void AquaSalGraphics::DrawTextLayout(const GenericSalLayout& rLayout)
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 5ea2f21de617..8831d9457174 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -570,7 +570,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
 
                 Point aNewPos(aCurrPos.X() + nXOffset, aCurrPos.Y() + nYOffset);
                 const GlyphItem aGI(nCharPos, nCharCount, nGlyphIndex, aNewPos, nGlyphFlags,
-                                    nAdvance, nXOffset);
+                                    nAdvance, nXOffset, mpFont.get());
                 m_GlyphItems.push_back(aGI);
 
                 aCurrPos.AdjustX(nAdvance );
@@ -767,7 +767,7 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
             int const nFlags = GlyphItem::IS_IN_CLUSTER | GlyphItem::IS_RTL_GLYPH;
             while (nCopies--)
             {
-                GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0);
+                GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, mpFont.get());
                 pGlyphIter = m_GlyphItems.insert(pGlyphIter, aKashida);
                 aPos.AdjustX(nKashidaWidth );
                 aPos.AdjustX( -nOverlap );
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index d33c488b6894..33013696ee84 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -893,7 +893,7 @@ sal_Int32 GenericSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoor
 
 bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
                                     Point& rPos, int& nStart,
-                                    const PhysicalFontFace** /*pFallbackFont*/) const
+                                    const PhysicalFontFace**, int* const) const
 {
     std::vector<GlyphItem>::const_iterator pGlyphIter = m_GlyphItems.begin();
     std::vector<GlyphItem>::const_iterator pGlyphIterEnd = m_GlyphItems.end();
@@ -1503,7 +1503,8 @@ void MultiSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) cons
 
 bool MultiSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
                                   Point& rPos, int& nStart,
-                                  const PhysicalFontFace** pFallbackFont) const
+                                  const PhysicalFontFace** pFallbackFont,
+                                  int* const pFallbackLevel) const
 {
     // NOTE: nStart is tagged with current font index
     int nLevel = static_cast<unsigned>(nStart) >> GF_FONTSHIFT;
@@ -1517,10 +1518,10 @@ bool MultiSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
         {
             int nFontTag = nLevel << GF_FONTSHIFT;
             nStart |= nFontTag;
-            // FIXME: This cast is ugly!
-            const_cast<GlyphItem*>(*pGlyph)->m_nFallbackLevel = nLevel;
             if (pFallbackFont)
                 *pFallbackFont = pFontFace;
+            if (pFallbackLevel)
+                *pFallbackLevel = nLevel;
             rPos += maDrawBase;
             rPos += maDrawOffset;
             return true;
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 5df1082be6ac..ce30eb4bb07a 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -2311,14 +2311,12 @@ SystemTextLayoutData OutputDevice::GetSysTextLayoutData(const Point& rStartPt, c
     Point aPos;
     const GlyphItem* pGlyph;
     int nStart = 0;
-    while (pLayout->GetNextGlyph(&pGlyph, aPos, nStart))
+    SystemGlyphData aSystemGlyph;
+    while (pLayout->GetNextGlyph(&pGlyph, aPos, nStart, nullptr, &aSystemGlyph.fallbacklevel))
     {
-        SystemGlyphData aSystemGlyph;
         aSystemGlyph.index = pGlyph->m_aGlyphId;
         aSystemGlyph.x = aPos.X();
         aSystemGlyph.y = aPos.Y();
-        int nLevel = pGlyph->m_nFallbackLevel;
-        aSystemGlyph.fallbacklevel = nLevel < MAX_FALLBACK ? nLevel : 0;
         aSysLayoutData.rGlyphData.push_back(aSystemGlyph);
     }
 
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index b7b8da84dc65..13c8e156dc5b 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -444,11 +444,7 @@ void CairoTextRender::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nF
 
 bool CairoTextRender::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
 {
-    const int nLevel = rGlyph.m_nFallbackLevel;
-    if( nLevel >= MAX_FALLBACK )
-        return false;
-
-    FreetypeFont* pSF = mpFreetypeFont[ nLevel ];
+    FreetypeFont* pSF = getFreetypeFontFromGlyph(rGlyph);
     if( !pSF )
         return false;
 
@@ -475,11 +471,7 @@ bool CairoTextRender::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangl
 bool CairoTextRender::GetGlyphOutline(const GlyphItem& rGlyph,
     basegfx::B2DPolyPolygon& rPolyPoly )
 {
-    const int nLevel = rGlyph.m_nFallbackLevel;
-    if( nLevel >= MAX_FALLBACK )
-        return false;
-
-    const FreetypeFont* pSF = mpFreetypeFont[ nLevel ];
+    const FreetypeFont* pSF = getFreetypeFontFromGlyph(rGlyph);
     if( !pSF )
         return false;
 
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index 5350bfcf26a4..67621170b999 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -735,11 +735,7 @@ void GenPspGraphics::GetFontMetric(ImplFontMetricDataRef& rxFontMetric, int nFal
 
 bool GenPspGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
 {
-    const int nLevel = rGlyph.m_nFallbackLevel;
-    if( nLevel >= MAX_FALLBACK )
-        return false;
-
-    FreetypeFont* pSF = m_pFreetypeFont[ nLevel ];
+    FreetypeFont* pSF = getFreetypeFontFromGlyph(rGlyph);
     if( !pSF )
         return false;
 
@@ -749,11 +745,7 @@ bool GenPspGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle
 bool GenPspGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
     basegfx::B2DPolyPolygon& rB2DPolyPoly )
 {
-    const int nLevel = rGlyph.m_nFallbackLevel;
-    if( nLevel >= MAX_FALLBACK )
-        return false;
-
-    FreetypeFont* pSF = m_pFreetypeFont[ nLevel ];
+    FreetypeFont* pSF = getFreetypeFontFromGlyph(rGlyph);
     if( !pSF )
         return false;
 
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 8ee9c60e2537..b5a0efbf047e 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1328,7 +1328,7 @@ void WinSalGraphics::ClearDevFontCache()
 
 bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
 {
-    rtl::Reference<WinFontInstance> pFont = mpWinFontEntry[rGlyph.m_nFallbackLevel];
+    rtl::Reference<WinFontInstance> pFont = static_cast<WinFontInstance*>(rGlyph.m_pFontInstance);
     assert(pFont.is());
 
     if (pFont.is() && pFont->GetCachedGlyphBoundRect(rGlyph.m_aGlyphId, rRect))
@@ -1546,7 +1546,7 @@ bool WinSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
     // rescaling needed for the tools::PolyPolygon conversion
     if( rB2DPolyPoly.count() )
     {
-        rtl::Reference<WinFontInstance> pFont = mpWinFontEntry[rGlyph.m_nFallbackLevel];
+        rtl::Reference<WinFontInstance> pFont = static_cast<WinFontInstance*>(rGlyph.m_pFontInstance);
         assert(pFont.is());
         float fFontScale = pFont.is() ? pFont->GetScale() : 1.0;
         const double fFactor(fFontScale/256);


More information about the Libreoffice-commits mailing list