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 4231089698707f217dcb5af64cc863904ee42838 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sat Mar 22 12:30:13 2025 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Sun Mar 23 10:40:26 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 (cherry picked from commit 4503abd1a6788a5c3cb2168f23b63559a6cabebf) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183224 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> 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 e8dc3999e216..8f2af17a5179 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); }