[chromium] Remove WebTransformationMatrix::mapPoint overrides
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Jul 2012 22:37:54 +0000 (22:37 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Jul 2012 22:37:54 +0000 (22:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=90329

Reviewed by Adrienne Walker.

Source/Platform:

Remove clipping-unaware mapPoint functions from the WebTransformationMatrix interface.

* chromium/public/WebTransformationMatrix.h:
(WebTransformationMatrix):

Source/WebCore:

Add more functionality for mapping points to CCMathUtil and use it in CCLayerSorter / drawTileQuad. These
mappings should never clip.

* platform/chromium/support/WebTransformationMatrix.cpp:
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::drawTileQuad):
* platform/graphics/chromium/cc/CCLayerSorter.cpp:
(WebCore::CCLayerSorter::LayerShape::LayerShape):
* platform/graphics/chromium/cc/CCMathUtil.cpp:
(WebCore::mapHomogeneousPoint):
(WebCore::CCMathUtil::mapPoint):
(WebCore):
* platform/graphics/chromium/cc/CCMathUtil.h:
(WebCore::HomogeneousCoordinate::cartesianPoint3d):
(HomogeneousCoordinate):
(CCMathUtil):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@124105 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/Platform/ChangeLog
Source/Platform/chromium/public/WebTransformationMatrix.h
Source/WebCore/ChangeLog
Source/WebCore/platform/chromium/support/WebTransformationMatrix.cpp
Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
Source/WebCore/platform/graphics/chromium/cc/CCLayerSorter.cpp
Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp
Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.h

index a716fa3..943455d 100644 (file)
@@ -1,3 +1,15 @@
+2012-06-29  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove WebTransformationMatrix::mapPoint overrides
+        https://bugs.webkit.org/show_bug.cgi?id=90329
+
+        Reviewed by Adrienne Walker.
+
+        Remove clipping-unaware mapPoint functions from the WebTransformationMatrix interface.
+
+        * chromium/public/WebTransformationMatrix.h:
+        (WebTransformationMatrix):
+
 2012-07-30  John Bates  <jbates@google.com>
 
         Plumb vsync-enabled flag up to compositor thread and support disable-vsync
index 0ffe0c4..9de9e2c 100644 (file)
@@ -137,13 +137,6 @@ public:
     // Conversions between WebKit::WebTransformationMatrix and WebCore::TransformationMatrix
     explicit WebTransformationMatrix(const WebCore::TransformationMatrix&);
     WebCore::TransformationMatrix toWebCoreTransform() const;
-
-    // FIXME: these map functions should not exist, should be using CCMathUtil
-    // instead. Eventually CCMathUtil functions could be merged here, but its
-    // not yet the right time for that.
-    WebCore::FloatPoint3D mapPoint(const WebCore::FloatPoint3D&) const;
-    WebCore::FloatPoint mapPoint(const WebCore::FloatPoint&) const;
-    WebCore::IntPoint mapPoint(const WebCore::IntPoint&) const;
 #endif
 
 protected:
index 8efcf91..8ad7963 100644 (file)
@@ -1,3 +1,27 @@
+2012-06-29  James Robinson  <jamesr@chromium.org>
+
+        [chromium] Remove WebTransformationMatrix::mapPoint overrides
+        https://bugs.webkit.org/show_bug.cgi?id=90329
+
+        Reviewed by Adrienne Walker.
+
+        Add more functionality for mapping points to CCMathUtil and use it in CCLayerSorter / drawTileQuad. These
+        mappings should never clip.
+
+        * platform/chromium/support/WebTransformationMatrix.cpp:
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::drawTileQuad):
+        * platform/graphics/chromium/cc/CCLayerSorter.cpp:
+        (WebCore::CCLayerSorter::LayerShape::LayerShape):
+        * platform/graphics/chromium/cc/CCMathUtil.cpp:
+        (WebCore::mapHomogeneousPoint):
+        (WebCore::CCMathUtil::mapPoint):
+        (WebCore):
+        * platform/graphics/chromium/cc/CCMathUtil.h:
+        (WebCore::HomogeneousCoordinate::cartesianPoint3d):
+        (HomogeneousCoordinate):
+        (CCMathUtil):
+
 2012-07-30  Anders Carlsson  <andersca@apple.com>
 
         Crash in logging code if MIME type is null
index cb259f0..6d99440 100644 (file)
@@ -422,19 +422,4 @@ TransformationMatrix WebTransformationMatrix::toWebCoreTransform() const
     return m_private;
 }
 
-FloatPoint3D WebTransformationMatrix::mapPoint(const FloatPoint3D& p) const
-{
-    return m_private.mapPoint(p);
-}
-
-FloatPoint WebTransformationMatrix::mapPoint(const FloatPoint& p) const
-{
-    return m_private.mapPoint(p);
-}
-
-IntPoint WebTransformationMatrix::mapPoint(const IntPoint& p) const
-{
-    return m_private.mapPoint(p);
-}
-
 } // namespace WebKit
index c4f138a..3231435 100644 (file)
@@ -884,10 +884,14 @@ void LayerRendererChromium::drawTileQuad(DrawingFrame& frame, const CCTileDrawQu
         FloatPoint topRight(tileRect.maxX(), tileRect.y());
 
         // Map points to device space.
-        bottomRight = deviceTransform.mapPoint(bottomRight);
-        bottomLeft = deviceTransform.mapPoint(bottomLeft);
-        topLeft = deviceTransform.mapPoint(topLeft);
-        topRight = deviceTransform.mapPoint(topRight);
+        bottomRight = CCMathUtil::mapPoint(deviceTransform, bottomRight, clipped);
+        ASSERT(!clipped);
+        bottomLeft = CCMathUtil::mapPoint(deviceTransform, bottomLeft, clipped);
+        ASSERT(!clipped);
+        topLeft = CCMathUtil::mapPoint(deviceTransform, topLeft, clipped);
+        ASSERT(!clipped);
+        topRight = CCMathUtil::mapPoint(deviceTransform, topRight, clipped);
+        ASSERT(!clipped);
 
         CCLayerQuad::Edge bottomEdge(bottomRight, bottomLeft);
         CCLayerQuad::Edge leftEdge(bottomLeft, topLeft);
index 48802d6..0cb703b 100644 (file)
@@ -183,9 +183,11 @@ CCLayerSorter::LayerShape::LayerShape(float width, float height, const WebTransf
         projectedQuad.setP4(clippedQuad[2]); // this will be a degenerate quad that is actually a triangle.
 
     // Compute the normal of the layer's plane.
-    FloatPoint3D c1 = drawTransform.mapPoint(FloatPoint3D(0, 0, 0));
-    FloatPoint3D c2 = drawTransform.mapPoint(FloatPoint3D(0, 1, 0));
-    FloatPoint3D c3 = drawTransform.mapPoint(FloatPoint3D(1, 0, 0));
+    bool clipped = false;
+    FloatPoint3D c1 = CCMathUtil::mapPoint(drawTransform, FloatPoint3D(0, 0, 0), clipped);
+    FloatPoint3D c2 = CCMathUtil::mapPoint(drawTransform, FloatPoint3D(0, 1, 0), clipped);
+    FloatPoint3D c3 = CCMathUtil::mapPoint(drawTransform, FloatPoint3D(1, 0, 0), clipped);
+    // FIXME: Deal with clipping.
     FloatPoint3D c12 = c2 - c1;
     FloatPoint3D c13 = c3 - c1;
     layerNormal = c13.cross(c12);
index 007e74d..f9be767 100644 (file)
@@ -57,17 +57,17 @@ static HomogeneousCoordinate projectHomogeneousPoint(const WebTransformationMatr
     return HomogeneousCoordinate(outX, outY, outZ, outW);
 }
 
-static HomogeneousCoordinate mapHomogeneousPoint(const WebTransformationMatrix& transform, const FloatPoint& p)
+static HomogeneousCoordinate mapHomogeneousPoint(const WebTransformationMatrix& transform, const FloatPoint3D& p)
 {
     double x = p.x();
     double y = p.y();
-    // implicit definition of z = 0;
+    double z = p.z();
     // implicit definition of w = 1;
 
-    double outX = x * transform.m11() + y * transform.m21() + transform.m41();
-    double outY = x * transform.m12() + y * transform.m22() + transform.m42();
-    double outZ = x * transform.m13() + y * transform.m23() + transform.m43();
-    double outW = x * transform.m14() + y * transform.m24() + transform.m44();
+    double outX = x * transform.m11() + y * transform.m21() + z * transform.m31() + transform.m41();
+    double outY = x * transform.m12() + y * transform.m22() + z * transform.m32() + transform.m42();
+    double outZ = x * transform.m13() + y * transform.m23() + z * transform.m33() + transform.m43();
+    double outW = x * transform.m14() + y * transform.m24() + z * transform.m34() + transform.m44();
 
     return HomogeneousCoordinate(outX, outY, outZ, outW);
 }
@@ -274,6 +274,52 @@ FloatQuad CCMathUtil::mapQuad(const WebTransformationMatrix& transform, const Fl
     return FloatQuad(h1.cartesianPoint2d(), h2.cartesianPoint2d(), h3.cartesianPoint2d(), h4.cartesianPoint2d());
 }
 
+FloatPoint CCMathUtil::mapPoint(const WebTransformationMatrix& transform, const FloatPoint& p, bool& clipped)
+{
+    HomogeneousCoordinate h = mapHomogeneousPoint(transform, p);
+
+    if (h.w > 0) {
+        clipped = false;
+        return h.cartesianPoint2d();
+    }
+
+    // The cartesian coordinates will be invalid after dividing by w.
+    clipped = true;
+
+    // Avoid dividing by w if w == 0.
+    if (!h.w)
+        return FloatPoint();
+
+    // This return value will be invalid because clipped == true, but (1) users of this
+    // code should be ignoring the return value when clipped == true anyway, and (2) this
+    // behavior is more consistent with existing behavior of WebKit transforms if the user
+    // really does not ignore the return value.
+    return h.cartesianPoint2d();
+}
+
+FloatPoint3D CCMathUtil::mapPoint(const WebTransformationMatrix& transform, const FloatPoint3D& p, bool& clipped)
+{
+    HomogeneousCoordinate h = mapHomogeneousPoint(transform, p);
+
+    if (h.w > 0) {
+        clipped = false;
+        return h.cartesianPoint3d();
+    }
+
+    // The cartesian coordinates will be invalid after dividing by w.
+    clipped = true;
+
+    // Avoid dividing by w if w == 0.
+    if (!h.w)
+        return FloatPoint3D();
+
+    // This return value will be invalid because clipped == true, but (1) users of this
+    // code should be ignoring the return value when clipped == true anyway, and (2) this
+    // behavior is more consistent with existing behavior of WebKit transforms if the user
+    // really does not ignore the return value.
+    return h.cartesianPoint3d();
+}
+
 FloatQuad CCMathUtil::projectQuad(const WebTransformationMatrix& transform, const FloatQuad& q, bool& clipped)
 {
     FloatQuad projectedQuad;
@@ -314,5 +360,4 @@ FloatPoint CCMathUtil::projectPoint(const WebTransformationMatrix& transform, co
     return h.cartesianPoint2d();
 }
 
-
 } // namespace WebCore
index cbceda0..04e850e 100644 (file)
@@ -26,6 +26,7 @@
 #define CCMathUtil_h
 
 #include "FloatPoint.h"
+#include "FloatPoint3D.h"
 
 namespace WebKit {
 class WebTransformationMatrix;
@@ -62,6 +63,17 @@ struct HomogeneousCoordinate {
         return FloatPoint(x * invW, y * invW);
     }
 
+    FloatPoint3D cartesianPoint3d() const
+    {
+        if (w == 1)
+            return FloatPoint3D(x, y, z);
+
+        // For now, because this code is used privately only by CCMathUtil, it should never be called when w == 0, and we do not yet need to handle that case.
+        ASSERT(w);
+        double invW = 1.0 / w;
+        return FloatPoint3D(x * invW, y * invW, z * invW);
+    }
+
     double x;
     double y;
     double z;
@@ -97,6 +109,8 @@ public:
     // NOTE: These functions do not do correct clipping against w = 0 plane, but they
     // correctly detect the clipped condition via the boolean clipped.
     static FloatQuad mapQuad(const WebKit::WebTransformationMatrix&, const FloatQuad&, bool& clipped);
+    static FloatPoint mapPoint(const WebKit::WebTransformationMatrix&, const FloatPoint&, bool& clipped);
+    static FloatPoint3D mapPoint(const WebKit::WebTransformationMatrix&, const FloatPoint3D&, bool& clipped);
     static FloatQuad projectQuad(const WebKit::WebTransformationMatrix&, const FloatQuad&, bool& clipped);
     static FloatPoint projectPoint(const WebKit::WebTransformationMatrix&, const FloatPoint&, bool& clipped);
 };