[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [krita/rempt/impex-refactoring] plugins/tools/tool_transform2: Fix a NaN transformation when using 4
From:       Dmitry Kazakov <dimula73 () gmail ! com>
Date:       2016-12-09 17:58:36
Message-ID: E1cFPRM-0004iD-V5 () code ! kde ! org
[Download RAW message or body]

Git commit 050f8354c1506af25e501153e11551699d63cd20 by Dmitry Kazakov.
Committed on 09/12/2016 at 17:58.
Pushed by dkazakov into branch 'rempt/impex-refactoring'.

Fix a NaN transformation when using 4-point perspective transform

It appeared that my matrix decomposition could not decompose an
identity matrix :( Well, we need to implement a better one, e.g.
from CSS. For now just avoid division by zero.

Most probably, the problem appeared after introduction of cursor
snapping. Before snapping identity matrix was almost impossible
to get with a mouse cursor.

BUG:372677
Ref T4840

M  +28   -15   plugins/tools/tool_transform2/kis_perspective_transform_strategy.cpp

https://commits.kde.org/krita/050f8354c1506af25e501153e11551699d63cd20

diff --git a/plugins/tools/tool_transform2/kis_perspective_transform_strategy.cpp \
b/plugins/tools/tool_transform2/kis_perspective_transform_strategy.cpp index \
                850e098e158..2946a0f8c2a 100644
--- a/plugins/tools/tool_transform2/kis_perspective_transform_strategy.cpp
+++ b/plugins/tools/tool_transform2/kis_perspective_transform_strategy.cpp
@@ -400,29 +400,42 @@ void \
KisPerspectiveTransformStrategy::Private::transformIntoArgs(const Eigen::Ma  
     m = T.inverse() * m;
 
-    const qreal factor = (m(1,1) / m(0,1) - m(1,0) / m(0,0));
+    // TODO: implement matrix decomposition as described here
+    // https://www.w3.org/TR/css-transforms-1/#decomposing-a-3d-matrix
 
-    qreal scaleX = m(0,0) / m(2,2);
-    qreal scaleY = m(0,1) / m(2,2) * factor;
+    // For now use an extremely hackish approximation
+    if (m(0,1) != 0.0 && m(0,0) != 0.0 && m(2,2) != 0.0) {
 
-    Eigen::Matrix3f SC = fromScale(scaleX, scaleY);
+        const qreal factor = (m(1,1) / m(0,1) - m(1,0) / m(0,0));
 
-    qreal shearX = 1.0 / factor;
-    qreal shearY = m(1,0) / m(0,0);
+        qreal scaleX = m(0,0) / m(2,2);
+        qreal scaleY = m(0,1) / m(2,2) * factor;
 
-    Eigen::Matrix3f S = fromShear(shearX, shearY);
+        Eigen::Matrix3f SC = fromScale(scaleX, scaleY);
 
-    currentArgs.setScaleX(scaleX);
-    currentArgs.setScaleY(scaleY);
+        qreal shearX = 1.0 / factor;
+        qreal shearY = m(1,0) / m(0,0);
 
-    currentArgs.setShearX(shearX);
-    currentArgs.setShearY(shearY);
+        Eigen::Matrix3f S = fromShear(shearX, shearY);
 
-    currentArgs.setTransformedCenter(QPointF(tX, tY));
+        currentArgs.setScaleX(scaleX);
+        currentArgs.setScaleY(scaleY);
+
+        currentArgs.setShearX(shearX);
+        currentArgs.setShearY(shearY);
+
+        m = m * SC.inverse();
+        m = m * S.inverse();
+        m /= m(2,2);
+    } else {
+        currentArgs.setScaleX(1.0);
+        currentArgs.setScaleY(1.0);
 
-    m = m * SC.inverse();
-    m = m * S.inverse();
-    m /= m(2,2);
+        currentArgs.setShearX(0.0);
+        currentArgs.setShearY(0.0);
+    }
+
+    currentArgs.setTransformedCenter(QPointF(tX, tY));
     currentArgs.setFlattenedPerspectiveTransform(toQTransform(m));
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic