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

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Fri Sep 3 19:44:47 UTC 2021


 include/vcl/vcllayout.hxx          |    2 ++
 vcl/inc/impglyphitem.hxx           |   22 ++++++++++------------
 vcl/inc/sallayout.hxx              |    2 ++
 vcl/source/gdi/CommonSalLayout.cxx |    4 ++--
 vcl/source/gdi/pdfwriter_impl.cxx  |    5 ++---
 vcl/source/gdi/sallayout.cxx       |   16 +++++++++++-----
 vcl/source/outdev/font.cxx         |    5 +++--
 7 files changed, 32 insertions(+), 24 deletions(-)

New commits:
commit 1bfcb00aeb23efddf500e6623d36c0f816f4d2e1
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Sep 3 14:44:22 2021 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Fri Sep 3 21:44:11 2021 +0200

    pull duplicate field out of GlyphItem
    
    we already store it in SalLayoutGlyphsImpl
    
    Change-Id: I772c08966572e42789bcede1a148b2b7710f29d1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121602
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx
index e09e54f59d65..b6744ce8a118 100644
--- a/include/vcl/vcllayout.hxx
+++ b/include/vcl/vcllayout.hxx
@@ -27,6 +27,7 @@
 #include <vcl/glyphitem.hxx>
 #include <vcl/dllapi.h>
 
+class LogicalFontInstance;
 class ImplLayoutArgs;
 class PhysicalFontFace;
 class SalGraphics;
@@ -90,6 +91,7 @@ public:
 
     // methods using glyph indexing
     virtual bool    GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const LogicalFontInstance** ppGlyphFont = nullptr,
                                  const PhysicalFontFace** pFallbackFont = nullptr) const = 0;
     virtual bool GetOutline(basegfx::B2DPolyPolygonVector&) const;
     bool GetBoundRect(tools::Rectangle&) const;
diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx
index 913a33c1f421..1942b9d159d5 100644
--- a/vcl/inc/impglyphitem.hxx
+++ b/vcl/inc/impglyphitem.hxx
@@ -50,7 +50,6 @@ template <> struct typed_flags<GlyphItemFlags> : is_typed_flags<GlyphItemFlags,
 
 class VCL_DLLPUBLIC GlyphItem
 {
-    LogicalFontInstance* m_pFontInstance;
     sal_Int32 m_nOrigWidth; // original glyph width
     sal_Int32 m_nCharPos; // index in string
     sal_Int32 m_nXOffset;
@@ -63,10 +62,8 @@ public:
     sal_Int32 m_nNewWidth; // width after adjustments
 
     GlyphItem(int nCharPos, int nCharCount, sal_GlyphId aGlyphId, const Point& rLinearPos,
-              GlyphItemFlags nFlags, int nOrigWidth, int nXOffset,
-              LogicalFontInstance* pFontInstance)
-        : m_pFontInstance(pFontInstance)
-        , m_nOrigWidth(nOrigWidth)
+              GlyphItemFlags nFlags, int nOrigWidth, int nXOffset)
+        : m_nOrigWidth(nOrigWidth)
         , m_nCharPos(nCharPos)
         , m_nXOffset(nXOffset)
         , m_aGlyphId(aGlyphId)
@@ -75,7 +72,6 @@ public:
         , m_aLinearPos(rLinearPos)
         , m_nNewWidth(nOrigWidth)
     {
-        assert(m_pFontInstance);
     }
 
     bool IsInCluster() const { return bool(m_nFlags & GlyphItemFlags::IS_IN_CLUSTER); }
@@ -87,8 +83,8 @@ public:
     bool IsDropped() const { return bool(m_nFlags & GlyphItemFlags::IS_DROPPED); }
     bool IsClusterStart() const { return bool(m_nFlags & GlyphItemFlags::IS_CLUSTER_START); }
 
-    inline bool GetGlyphBoundRect(tools::Rectangle&) const;
-    inline bool GetGlyphOutline(basegfx::B2DPolyPolygon&) const;
+    inline bool GetGlyphBoundRect(const LogicalFontInstance*, tools::Rectangle&) const;
+    inline bool GetGlyphOutline(const LogicalFontInstance*, basegfx::B2DPolyPolygon&) const;
     inline void dropGlyph();
 
     sal_GlyphId glyphId() const { return m_aGlyphId; }
@@ -98,14 +94,16 @@ public:
     int xOffset() const { return m_nXOffset; }
 };
 
-VCL_DLLPUBLIC bool GlyphItem::GetGlyphBoundRect(tools::Rectangle& rRect) const
+VCL_DLLPUBLIC bool GlyphItem::GetGlyphBoundRect(const LogicalFontInstance* pFontInstance,
+                                                tools::Rectangle& rRect) const
 {
-    return m_pFontInstance->GetGlyphBoundRect(m_aGlyphId, rRect, IsVertical());
+    return pFontInstance->GetGlyphBoundRect(m_aGlyphId, rRect, IsVertical());
 }
 
-VCL_DLLPUBLIC bool GlyphItem::GetGlyphOutline(basegfx::B2DPolyPolygon& rPoly) const
+VCL_DLLPUBLIC bool GlyphItem::GetGlyphOutline(const LogicalFontInstance* pFontInstance,
+                                              basegfx::B2DPolyPolygon& rPoly) const
 {
-    return m_pFontInstance->GetGlyphOutline(m_aGlyphId, rPoly, IsVertical());
+    return pFontInstance->GetGlyphOutline(m_aGlyphId, rPoly, IsVertical());
 }
 
 void GlyphItem::dropGlyph()
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 2608044d592f..9d37b71d1a3e 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -131,6 +131,7 @@ public:
     DeviceCoordinate FillDXArray(DeviceCoordinate* pDXArray) const override;
     void            GetCaretPositions(int nArraySize, tools::Long* pCaretXArray) const override;
     bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const LogicalFontInstance** ppGlyphFont = nullptr,
                                  const PhysicalFontFace** pFallbackFont = nullptr) const override;
     bool            GetOutline(basegfx::B2DPolyPolygonVector&) const override;
     bool            IsKashidaPosValid(int nCharPos) const override;
@@ -187,6 +188,7 @@ public:
         { return *m_GlyphItems.GetFont(); }
 
     bool            GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
+                                 const LogicalFontInstance** ppGlyphFont = nullptr,
                                  const PhysicalFontFace** pFallbackFont = nullptr) const override;
 
     const SalLayoutGlyphsImpl& GlyphsImpl() const { return m_GlyphItems; }
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 5f0c9637a7d2..4aa527c91d39 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -583,7 +583,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphsIm
 
                 Point aNewPos(aCurrPos.X() + nXOffset, aCurrPos.Y() + nYOffset);
                 const GlyphItem aGI(nCharPos, nCharCount, nGlyphIndex, aNewPos, nGlyphFlags,
-                                    nAdvance, nXOffset, &GetFont());
+                                    nAdvance, nXOffset);
                 m_GlyphItems.push_back(aGI);
 
                 aCurrPos.AdjustX(nAdvance );
@@ -781,7 +781,7 @@ void GenericSalLayout::ApplyDXArray(const DeviceCoordinate* pDXArray, SalLayoutF
         GlyphItemFlags const nFlags = GlyphItemFlags::IS_IN_CLUSTER | GlyphItemFlags::IS_RTL_GLYPH;
         while (nCopies--)
         {
-            GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, &GetFont());
+            GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0);
             pGlyphIter = m_GlyphItems.insert(pGlyphIter, aKashida);
             aPos.AdjustX(nKashidaWidth );
             aPos.AdjustX( -nOverlap );
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index ec9712291026..31aea83a9685 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -3894,8 +3894,7 @@ void PDFWriterImpl::createDefaultCheckBoxAppearance( PDFWidget& rBox, const PDFW
     // make sure OpenSymbol is embedded, and includes our checkmark
     const sal_Unicode cMark=0x2713;
     const GlyphItem aItem(0, 0, pMap->GetGlyphIndex(cMark),
-                          Point(), GlyphItemFlags::NONE, 0, 0,
-                          const_cast<LogicalFontInstance*>(pFontInstance));
+                          Point(), GlyphItemFlags::NONE, 0, 0);
     const std::vector<sal_Ucs> aCodeUnits={ cMark };
     sal_uInt8 nMappedGlyph;
     sal_Int32 nMappedFontObject;
@@ -6132,7 +6131,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
     aGlyphs.reserve( nMaxGlyphs );
     // first get all the glyphs and register them; coordinates still in Pixel
     Point aPos;
-    while (rLayout.GetNextGlyph(&pGlyph, aPos, nIndex, &pFallbackFont))
+    while (rLayout.GetNextGlyph(&pGlyph, aPos, nIndex, nullptr, &pFallbackFont))
     {
         const auto* pFont = pFallbackFont ? pFallbackFont : pDevFont;
 
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index a993b8131ca4..2370e59bfa36 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -612,10 +612,11 @@ bool SalLayout::GetOutline(basegfx::B2DPolyPolygonVector& rVector) const
     Point aPos;
     const GlyphItem* pGlyph;
     int nStart = 0;
-    while (GetNextGlyph(&pGlyph, aPos, nStart))
+    const LogicalFontInstance* pGlyphFont;
+    while (GetNextGlyph(&pGlyph, aPos, nStart, &pGlyphFont))
     {
         // get outline of individual glyph, ignoring "empty" glyphs
-        bool bSuccess = pGlyph->GetGlyphOutline(aGlyphOutline);
+        bool bSuccess = pGlyph->GetGlyphOutline(pGlyphFont, aGlyphOutline);
         bAllOk &= bSuccess;
         bOneOk |= bSuccess;
         // only add non-empty outlines
@@ -644,10 +645,11 @@ bool SalLayout::GetBoundRect(tools::Rectangle& rRect) const
     Point aPos;
     const GlyphItem* pGlyph;
     int nStart = 0;
-    while (GetNextGlyph(&pGlyph, aPos, nStart))
+    const LogicalFontInstance* pGlyphFont;
+    while (GetNextGlyph(&pGlyph, aPos, nStart, &pGlyphFont))
     {
         // get bounding rectangle of individual glyph
-        if (pGlyph->GetGlyphBoundRect(aRectangle))
+        if (pGlyph->GetGlyphBoundRect(pGlyphFont, aRectangle))
         {
             // merge rectangle
             aRectangle += aPos;
@@ -915,6 +917,7 @@ sal_Int32 GenericSalLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoor
 
 bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
                                     Point& rPos, int& nStart,
+                                    const LogicalFontInstance** ppGlyphFont,
                                     const PhysicalFontFace**) const
 {
     std::vector<GlyphItem>::const_iterator pGlyphIter = m_GlyphItems.begin();
@@ -939,6 +942,8 @@ bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
     // update return data with glyph info
     *pGlyph = &(*pGlyphIter);
     ++nStart;
+    if (ppGlyphFont)
+        *ppGlyphFont = m_GlyphItems.GetFont().get();
 
     // calculate absolute position in pixel units
     Point aRelativePos = pGlyphIter->m_aLinearPos;
@@ -1529,6 +1534,7 @@ void MultiSalLayout::GetCaretPositions( int nMaxIndex, tools::Long* pCaretXArray
 
 bool MultiSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
                                   Point& rPos, int& nStart,
+                                  const LogicalFontInstance** ppGlyphFont,
                                   const PhysicalFontFace** pFallbackFont) const
 {
     // NOTE: nStart is tagged with current font index
@@ -1539,7 +1545,7 @@ bool MultiSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
         GenericSalLayout& rLayout = *mpLayouts[ nLevel ];
         rLayout.InitFont();
         const PhysicalFontFace* pFontFace = rLayout.GetFont().GetFontFace();
-        if (rLayout.GetNextGlyph(pGlyph, rPos, nStart))
+        if (rLayout.GetNextGlyph(pGlyph, rPos, nStart, ppGlyphFont))
         {
             int nFontTag = nLevel << GF_FONTSHIFT;
             nStart |= nFontTag;
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index 3f84afb2c3bf..1875394eaf93 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -1221,10 +1221,11 @@ void OutputDevice::ImplDrawEmphasisMarks( SalLayout& rSalLayout )
     Point aOutPoint;
     tools::Rectangle aRectangle;
     const GlyphItem* pGlyph;
+    const LogicalFontInstance* pGlyphFont;
     int nStart = 0;
-    while (rSalLayout.GetNextGlyph(&pGlyph, aOutPoint, nStart))
+    while (rSalLayout.GetNextGlyph(&pGlyph, aOutPoint, nStart, &pGlyphFont))
     {
-        if (!pGlyph->GetGlyphBoundRect(aRectangle))
+        if (!pGlyph->GetGlyphBoundRect(pGlyphFont, aRectangle))
             continue;
 
         if (!pGlyph->IsSpacing())


More information about the Libreoffice-commits mailing list