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

List:       kde-commits
Subject:    [Calligra] 11e26b5: PerspectiveAssistant::distance(): optimize
From:       Geoffry Song <goffrie () gmail ! com>
Date:       2010-12-31 23:27:34
Message-ID: 20101231232734.9B393A60A6 () git ! kde ! org
[Download RAW message or body]

commit 11e26b500abc2d829f72ef78756a04ad2597fe31
branch master
Author: Geoffry Song <goffrie@gmail.com>
Date:   Thu Dec 30 13:35:09 2010 -0500

    PerspectiveAssistant::distance(): optimize

diff --git a/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc \
b/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc index 1657293..a41b5e6 100644
--- a/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc
+++ b/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc
@@ -133,7 +133,21 @@ inline qreal localScale(const QTransform& transform, QPointF pt)
                 b = y + transform.m33(),
                 c = x + y + transform.m33(),
                 d = c * c;
-    return fabs(a)*fabs(a + transform.m23())*fabs(b)*fabs(b + transform.m13())/(d * d);
+    return fabs(a*(a + transform.m23())*b*(b + transform.m13()))/(d * d);
+}
+
+// returns the maximum local scale at the points (0,0),(0,1),(1,0),(1,1)
+inline qreal maxLocalScale(const QTransform& transform)
+{
+    const qreal a = fabs((transform.m33() + transform.m13()) * (transform.m33() + transform.m23())),
+                b = fabs((transform.m33()) * (transform.m13() + transform.m33() + transform.m23())),
+                d00 = transform.m33() * transform.m33(),
+                d11 = (transform.m33() + transform.m23() + transform.m13())*(transform.m33() + \
transform.m23() + transform.m13()), +                s0011 = d00 > d11 ? a / d11 : a / d00,
+                d10 = (transform.m33() + transform.m13()) * (transform.m33() + transform.m13()),
+                d01 = (transform.m33() + transform.m23()) * (transform.m33() + transform.m23()),
+                s1001 = d10 > d01 ? b / d01 : b / d10;
+    return qMax(s0011, s1001);
 }
 
 qreal PerspectiveAssistant::distance(const QPointF& pt) const
@@ -149,14 +163,7 @@ qreal PerspectiveAssistant::distance(const QPointF& pt) const
         // point at infinity
         return 0.0;
     }
-    QPointF realPoint = inverse.map(pt);
-    const qreal corners[4] = {
-        localScale(transform, QPointF(0.0, 0.0)),
-        localScale(transform, QPointF(0.0, 1.0)),
-        localScale(transform, QPointF(1.0, 0.0)),
-        localScale(transform, QPointF(1.0, 1.0))};
-    const qreal max = std::max(std::max(corners[0], corners[1]), std::max(corners[2], corners[3]));
-    return localScale(transform, inverse.map(pt)) / max;
+    return localScale(transform, inverse.map(pt)) / maxLocalScale(transform);
 }
 
 // draw a vanishing point marker


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

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