[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/basegfx
include/basegfx/matrix/Matrix.hxx | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) New commits: commit 560bfab85e0bd91a820c8c7dbe744628d807c1e6 Author: Tomaž Vajngerl AuthorDate: Sat Mar 28 20:21:12 2020 +0100 Commit: Tomaž Vajngerl CommitDate: Sat Jun 6 19:28:48 2020 +0200 basegfx: Fix the problem with Matrix Concatinate and Transform In Concatinate and Transform methods we change the instance variables during calculation (matrix multiplication), which leads to the wrong result. This change fixes both calculations. Change-Id: I9f7ef7323707df1ab4a764f97f9bae8593c42940 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91311 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl (cherry picked from commit d088b243cad18777f785abf704b0310f057f740b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95639 Tested-by: Tomaž Vajngerl diff --git a/include/basegfx/matrix/Matrix.hxx b/include/basegfx/matrix/Matrix.hxx index 9224e2784b60..e690216a3824 100644 --- a/include/basegfx/matrix/Matrix.hxx +++ b/include/basegfx/matrix/Matrix.hxx @@ -86,19 +86,28 @@ public: /// Multiply this * other. void Concatinate(const Matrix& other) { -ma = ma * other.ma + mb * other.mc; -mb = ma * other.mb + mb * other.md; -mc = mc * other.ma + md * other.mc; -md = mc * other.mb + md * other.md; -me = me * other.ma + mf * other.mc + other.me; -mf = me * other.mb + mf * other.md + other.mf; +double newA = ma * other.ma + mb * other.mc; +double newB = ma * other.mb + mb * other.md; +double newC = mc * other.ma + md * other.mc; +double newD = mc * other.mb + md * other.md; +double newE = me * other.ma + mf * other.mc + other.me; +double newF = me * other.mb + mf * other.md + other.mf; + +ma = newA; +mb = newB; +mc = newC; +md = newD; +me = newE; +mf = newF; } /// Transform the point (x, y) by this Matrix. template void Transform(T& x, T& y) { -x = ma * x + mc * y + me; -y = mb * x + md * y + mf; +T newX = v00 * x + v01 * y + v02; +T newY = v10 * x + v11 * y + v12; +x = newX; +y = newY; } /// Transform the rectangle (left, right, top, bottom) by this Matrix. ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/basegfx
include/basegfx/range/b2drange.hxx |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit 8aea19d95cef334f92d6f9858d7297b70a8dacab Author: Tomaž Vajngerl AuthorDate: Sat Mar 28 19:21:10 2020 +0100 Commit: Tomaž Vajngerl CommitDate: Sat Jun 6 19:28:08 2020 +0200 basegfx: export B2DRange operator*= Change-Id: Ia2e72e6650b14d5d024b65b1261876885cf1b05a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91308 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl (cherry picked from commit c44e2f95603866aca7c71ee9b066c5088745381c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95637 Tested-by: Tomaž Vajngerl diff --git a/include/basegfx/range/b2drange.hxx b/include/basegfx/range/b2drange.hxx index 00eab63d1472..a599fd03fe93 100644 --- a/include/basegfx/range/b2drange.hxx +++ b/include/basegfx/range/b2drange.hxx @@ -292,7 +292,7 @@ namespace basegfx This means that the range will grow evtl. when a shear and/or rotation is part of the transformation. */ -B2DRange& operator*=( const ::basegfx::B2DHomMatrix& rMat ); +BASEGFX_DLLPUBLIC B2DRange& operator*=( const ::basegfx::B2DHomMatrix& rMat ); /** Get a range filled with (0.0, 0.0, 1.0, 1.0) */ static const B2DRange& getUnitB2DRange(); ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/basegfx
include/basegfx/matrix/Matrix.hxx | 45 +- 1 file changed, 44 insertions(+), 1 deletion(-) New commits: commit cbbc7fc27e24d624d1f4dac641be42e5c43821f1 Author: Tomaž Vajngerl AuthorDate: Sat Mar 28 20:11:48 2020 +0100 Commit: Tomaž Vajngerl CommitDate: Sat Jun 6 19:28:24 2020 +0200 add convenience accessors to Matrix.hxx Change-Id: Ifaaff3b1526aed111725a46c6cc64c189909a904 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91309 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl (cherry picked from commit b53a9c552a30a3aaa2b26ef8b1a3e8cf0f011a5c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95638 Tested-by: Tomaž Vajngerl diff --git a/include/basegfx/matrix/Matrix.hxx b/include/basegfx/matrix/Matrix.hxx index b742d8cdf293..9224e2784b60 100644 --- a/include/basegfx/matrix/Matrix.hxx +++ b/include/basegfx/matrix/Matrix.hxx @@ -53,6 +53,29 @@ public: return *this; } +double get(sal_uInt16 nRow, sal_uInt16 nColumn) const +{ +if (nRow == 0) +{ +if (nColumn == 0) +return v00; +else if (nColumn == 1) +return v01; +else if (nColumn == 2) +return v02; +} +else if (nRow == 1) +{ +if (nColumn == 0) +return v10; +else if (nColumn == 1) +return v11; +else if (nColumn == 2) +return v12; +} +return 0.0; +} + double a() const { return ma; } double b() const { return mb; } double c() const { return mc; } @@ -120,7 +143,27 @@ public: } private: -double ma, mb, mc, md, me, mf; +union { +struct +{ +double ma; +double mb; +double mc; +double md; +double me; +double mf; +}; + +struct +{ +double v00; +double v10; +double v01; +double v11; +double v02; +double v12; +}; +}; }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ ___ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/basegfx svx/source
include/basegfx/matrix/Matrix.hxx | 126 ++ svx/source/svdraw/svdpdf.hxx | 106 --- 2 files changed, 128 insertions(+), 104 deletions(-) New commits: commit 67437d2f41b4fab475c0351c6336968dff0c5103 Author: Tomaž Vajngerl AuthorDate: Sat Mar 28 18:00:22 2020 +0100 Commit: Tomaž Vajngerl CommitDate: Sat Jun 6 19:27:30 2020 +0200 svdpdf: move Matrix to basegfx just to get it separated Change-Id: I9d887dc7a2836b90151ef352b47a9b9ad3b6f12b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91280 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl (cherry picked from commit befd6880873cc3f63a0566b76246d2ae54f8a3c5) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95636 Tested-by: Tomaž Vajngerl diff --git a/include/basegfx/matrix/Matrix.hxx b/include/basegfx/matrix/Matrix.hxx new file mode 100644 index ..b742d8cdf293 --- /dev/null +++ b/include/basegfx/matrix/Matrix.hxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +class Matrix +{ +public: +Matrix() +: Matrix(1, 0, 0, 1, 0, 0) +{ +} + +Matrix(const Matrix& other) +: Matrix(other.ma, other.mb, other.mc, other.md, other.me, other.mf) +{ +} + +Matrix(double da, double db, double dc, double dd, double de, double df) +: ma(da) +, mb(db) +, mc(dc) +, md(dd) +, me(de) +, mf(df) +{ +} + +const Matrix& operator=(const Matrix& other) +{ +ma = other.ma; +mb = other.mb; +mc = other.mc; +md = other.md; +me = other.me; +mf = other.mf; +return *this; +} + +double a() const { return ma; } +double b() const { return mb; } +double c() const { return mc; } +double d() const { return md; } +double e() const { return me; } +double f() const { return mf; } + +/// Multiply this * other. +void Concatinate(const Matrix& other) +{ +ma = ma * other.ma + mb * other.mc; +mb = ma * other.mb + mb * other.md; +mc = mc * other.ma + md * other.mc; +md = mc * other.mb + md * other.md; +me = me * other.ma + mf * other.mc + other.me; +mf = me * other.mb + mf * other.md + other.mf; +} + +/// Transform the point (x, y) by this Matrix. +template void Transform(T& x, T& y) +{ +x = ma * x + mc * y + me; +y = mb * x + md * y + mf; +} + +/// Transform the rectangle (left, right, top, bottom) by this Matrix. +template void Transform(T& left, T& right, T& top, T& bottom) +{ +T leftTopX = left; +T leftTopY = top; +Transform(leftTopX, leftTopY); + +T leftBottomX = left; +T leftBottomY = bottom; +Transform(leftBottomX, leftBottomY); + +T rightTopX = right; +T rightTopY = top; +Transform(rightTopX, rightTopY); + +T rightBottomX = right; +T rightBottomY = bottom; +Transform(rightBottomX, rightBottomY); + +left = std::min(leftTopX, leftBottomX); +right = std::max(rightTopX, rightBottomX); + +if (top > bottom) +top = std::max(leftTopY, rightTopY); +else +top = std::min(leftTopY, rightTopY); + +if (top > bottom) +bottom = std::max(leftBottomY, rightBottomY); +else +bottom = std::min(leftBottomY, rightBottomY); +} + +std::string toString() const +{ +std::ostringstream oss; +oss << '(' << ma << ", " << mb << ", " << mc << ", " << md << ", " << me << ", " << mf +<< ')'; +return oss.str(); +} + +private: +double ma, mb, mc, md, me, mf; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx index 1005b081142a..40e835bb67a4 100644 --- a/svx/source/svdraw/svdpdf.hxx +++ b/svx/source/svdraw/svdpdf.hxx @@ -37,6 +37,8 @@ #include #include +#include + // Prevent