basegfx/source/range/b2drange.cxx  |   11 +++++++++++
 include/basegfx/range/b2drange.hxx |    9 +++++++++
 vcl/source/gdi/sallayout.cxx       |    3 ++-
 3 files changed, 22 insertions(+), 1 deletion(-)

New commits:
commit 4503abd1a6788a5c3cb2168f23b63559a6cabebf
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Sat Mar 22 12:30:13 2025 +0200
Commit:     Noel Grandin <noelgran...@gmail.com>
CommitDate: Sat Mar 22 14:33:17 2025 +0100

    tdf#141415 speed up a perf hotspot in SalLayout
    
    a translation is just 2 additions, no need to do expensive matrix math
    
    Change-Id: I76949e6168acc8c50ade358fdccb61575b59a5e7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183220
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/basegfx/source/range/b2drange.cxx 
b/basegfx/source/range/b2drange.cxx
index 1f20cce90a48..d43c6d6e12ec 100644
--- a/basegfx/source/range/b2drange.cxx
+++ b/basegfx/source/range/b2drange.cxx
@@ -48,6 +48,17 @@ namespace basegfx
         }
     }
 
+    void B2DRange::translate(double fTranslateX, double fTranslateY)
+    {
+        if(!(fTools::equalZero(fTranslateX) && fTools::equalZero(fTranslateY)))
+        {
+            *this = basegfx::B2DRange(fTranslateX + getMinX(),
+                                      fTranslateY + getMinY(),
+                                      fTranslateX + getMaxX(),
+                                      fTranslateY + getMaxY());
+        }
+    }
+
     B2DRange& B2DRange::operator*=(const basegfx::B2DHomMatrix& rMatrix)
     {
         transform(rMatrix);
diff --git a/include/basegfx/range/b2drange.hxx 
b/include/basegfx/range/b2drange.hxx
index b0f726ac0e36..9a0aecbdae4c 100644
--- a/include/basegfx/range/b2drange.hxx
+++ b/include/basegfx/range/b2drange.hxx
@@ -114,6 +114,15 @@ namespace basegfx
         /** Transform Range by given transformation matrix. */
         BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix& rMatrix);
 
+        /** Translate Range (ie. move).
+            Much faster equivalent of 
transform(createTranslateB2DHomMatrix(xx)). */
+        BASEGFX_DLLPUBLIC void translate(double fTranslateX, double 
fTranslateY);
+
+        inline void translate(const B2DTuple& rTranslate)
+        {
+            translate(rTranslate.getX(), rTranslate.getY());
+        }
+
         /** Transform Range by given transformation matrix.
 
             This operation transforms the Range by transforming all four 
possible
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 0513156c3eb3..742ebdfe61c5 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -236,7 +236,8 @@ bool SalLayout::GetBoundRect(basegfx::B2DRectangle& rRect) 
const
         {
             if (!aRectangle.isEmpty())
             {
-                
aRectangle.transform(basegfx::utils::createTranslateB2DHomMatrix(aPos));
+                // translate rectangle to correct position
+                aRectangle.translate(aPos);
                 // merge rectangle
                 rRect.expand(aRectangle);
             }

Reply via email to