Title: [114858] trunk/Source
Revision
114858
Author
shawnsi...@chromium.org
Date
2012-04-22 13:22:24 -0700 (Sun, 22 Apr 2012)

Log Message

[chromium] Damage Tracker needs to use CCMathUtil transforms
https://bugs.webkit.org/show_bug.cgi?id=84070

Reviewed by Adrienne Walker.

Source/WebCore:

Unit test added to CCDamageTracker.cpp.

This patch makes CCDamageTracker use CCMathUtil transforms, so
that perspective w < 0 problem is correctly handled.

* platform/graphics/chromium/cc/CCDamageTracker.cpp:
(WebCore::CCDamageTracker::extendDamageForLayer):
(WebCore::CCDamageTracker::extendDamageForRenderSurface):

Source/WebKit/chromium:

* tests/CCDamageTrackerTest.cpp:
(WebKitTests::TEST_F):
(WebKitTests):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (114857 => 114858)


--- trunk/Source/WebCore/ChangeLog	2012-04-22 16:43:27 UTC (rev 114857)
+++ trunk/Source/WebCore/ChangeLog	2012-04-22 20:22:24 UTC (rev 114858)
@@ -1,3 +1,19 @@
+2012-04-22  Shawn Singh  <shawnsi...@chromium.org>
+
+        [chromium] Damage Tracker needs to use CCMathUtil transforms
+        https://bugs.webkit.org/show_bug.cgi?id=84070
+
+        Reviewed by Adrienne Walker.
+
+        Unit test added to CCDamageTracker.cpp.
+
+        This patch makes CCDamageTracker use CCMathUtil transforms, so
+        that perspective w < 0 problem is correctly handled.
+
+        * platform/graphics/chromium/cc/CCDamageTracker.cpp:
+        (WebCore::CCDamageTracker::extendDamageForLayer):
+        (WebCore::CCDamageTracker::extendDamageForRenderSurface):
+
 2012-04-20  Jon Lee  <jon...@apple.com>
 
         Add Notification constructor

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp (114857 => 114858)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp	2012-04-22 16:43:27 UTC (rev 114857)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp	2012-04-22 20:22:24 UTC (rev 114858)
@@ -37,6 +37,7 @@
 #include "FilterOperations.h"
 #include "cc/CCLayerImpl.h"
 #include "cc/CCLayerTreeHostCommon.h"
+#include "cc/CCMathUtil.h"
 #include "cc/CCRenderSurface.h"
 
 namespace WebCore {
@@ -228,7 +229,7 @@
     bool layerIsNew = false;
     FloatRect oldLayerRect = removeRectFromCurrentFrame(layer->id(), layerIsNew);
 
-    FloatRect layerRectInTargetSpace = originTransform.mapRect(FloatRect(FloatPoint::zero(), layer->bounds()));
+    FloatRect layerRectInTargetSpace = CCMathUtil::mapClippedRect(originTransform, FloatRect(FloatPoint::zero(), layer->bounds()));
     saveRectForNextFrame(layer->id(), layerRectInTargetSpace);
 
     if (layerIsNew || layer->layerPropertyChanged()) {
@@ -241,7 +242,7 @@
     } else if (!layer->updateRect().isEmpty()) {
         // If the layer properties havent changed, then the the target surface is only
         // affected by the layer's update area, which could be empty.
-        FloatRect updateRectInTargetSpace = originTransform.mapRect(layer->updateRect());
+        FloatRect updateRectInTargetSpace = CCMathUtil::mapClippedRect(originTransform, layer->updateRect());
         targetDamageRect.uniteIfNonZero(updateRectInTargetSpace);
     }
 }
@@ -283,12 +284,12 @@
     // If there was damage, transform it to target space, and possibly contribute its reflection if needed.
     if (!damageRectInLocalSpace.isEmpty()) {
         const TransformationMatrix& originTransform = renderSurface->originTransform();
-        FloatRect damageRectInTargetSpace = originTransform.mapRect(damageRectInLocalSpace);
+        FloatRect damageRectInTargetSpace = CCMathUtil::mapClippedRect(originTransform, damageRectInLocalSpace);
         targetDamageRect.uniteIfNonZero(damageRectInTargetSpace);
 
         if (layer->replicaLayer()) {
             const TransformationMatrix& replicaOriginTransform = renderSurface->replicaOriginTransform();
-            targetDamageRect.uniteIfNonZero(replicaOriginTransform.mapRect(damageRectInLocalSpace));
+            targetDamageRect.uniteIfNonZero(CCMathUtil::mapClippedRect(replicaOriginTransform, damageRectInLocalSpace));
         }
     }
 
@@ -301,7 +302,7 @@
 
         // Compute the replica's "originTransform" that maps from the replica's origin space to the target surface origin space.
         const TransformationMatrix& replicaOriginTransform = renderSurface->replicaOriginTransform();
-        FloatRect replicaMaskLayerRect = replicaOriginTransform.mapRect(FloatRect(FloatPoint::zero(), FloatSize(replicaMaskLayer->bounds().width(), replicaMaskLayer->bounds().height())));
+        FloatRect replicaMaskLayerRect = CCMathUtil::mapClippedRect(replicaOriginTransform, FloatRect(FloatPoint::zero(), FloatSize(replicaMaskLayer->bounds().width(), replicaMaskLayer->bounds().height())));
         saveRectForNextFrame(replicaMaskLayer->id(), replicaMaskLayerRect);
 
         // In the current implementation, a change in the replica mask damages the entire replica region.

Modified: trunk/Source/WebKit/chromium/ChangeLog (114857 => 114858)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-04-22 16:43:27 UTC (rev 114857)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-04-22 20:22:24 UTC (rev 114858)
@@ -1,3 +1,14 @@
+2012-04-22  Shawn Singh  <shawnsi...@chromium.org>
+
+        [chromium] Damage Tracker needs to use CCMathUtil transforms
+        https://bugs.webkit.org/show_bug.cgi?id=84070
+
+        Reviewed by Adrienne Walker.
+
+        * tests/CCDamageTrackerTest.cpp:
+        (WebKitTests::TEST_F):
+        (WebKitTests):
+
 2012-04-21  Ryosuke Niwa  <rn...@webkit.org>
 
         Chromium roll attempt from r133173 to r133348.

Modified: trunk/Source/WebKit/chromium/tests/CCDamageTrackerTest.cpp (114857 => 114858)


--- trunk/Source/WebKit/chromium/tests/CCDamageTrackerTest.cpp	2012-04-22 16:43:27 UTC (rev 114857)
+++ trunk/Source/WebKit/chromium/tests/CCDamageTrackerTest.cpp	2012-04-22 20:22:24 UTC (rev 114858)
@@ -30,6 +30,7 @@
 #include "cc/CCLayerImpl.h"
 #include "cc/CCLayerSorter.h"
 #include "cc/CCLayerTreeHostCommon.h"
+#include "cc/CCMathUtil.h"
 #include "cc/CCSingleThreadProxy.h"
 #include <gtest/gtest.h>
 
@@ -315,6 +316,49 @@
     EXPECT_FLOAT_RECT_EQ(expectedRect, rootDamageRect);
 }
 
+TEST_F(CCDamageTrackerTest, verifyDamageForPerspectiveClippedLayer)
+{
+    // If a layer has a perspective transform that causes w < 0, then not clipping the
+    // layer can cause an invalid damage rect. This test checks that the w < 0 case is
+    // tracked properly.
+    //
+    // The transform is constructed so that if w < 0 clipping is not performed, the
+    // incorrect rect will be very small, specifically: position (-3.153448, -2.750628) and size 8.548689 x 5.661383.
+    // Instead, the correctly transformed rect should actually be very huge (i.e. in theory, infinite)
+
+    OwnPtr<CCLayerImpl> root = createAndSetUpTestTreeWithOneSurface();
+    CCLayerImpl* child = root->children()[0].get();
+
+    TransformationMatrix transform;
+    transform.applyPerspective(1);
+    transform.translate3d(-150, -50, 0);
+    transform.rotate3d(0, 45, 0);
+    transform.translate3d(-50, -50, 0);
+
+    // Set up the child
+    child->setPosition(FloatPoint(0, 0));
+    child->setBounds(IntSize(100, 100));
+    child->setTransform(transform);
+    emulateDrawingOneFrame(root.get());
+
+    // Sanity check that the child layer's bounds would actually get clipped by w < 0,
+    // otherwise this test is not actually testing the intended scenario.
+    FloatQuad testQuad(FloatRect(FloatPoint::zero(), FloatSize(100, 100)));
+    bool clipped = false;
+    CCMathUtil::mapQuad(transform, testQuad, clipped);
+    EXPECT_TRUE(clipped);
+
+    // Damage the child without moving it.
+    child->setOpacity(0.5);
+    emulateDrawingOneFrame(root.get());
+
+    // The expected damage should cover the entire root surface (500x500), but we don't
+    // care whether the damage rect was clamped or is larger than the surface for this test.
+    FloatRect rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect();
+    EXPECT_GE(rootDamageRect.width(), 500);
+    EXPECT_GE(rootDamageRect.height(), 500);
+}
+
 TEST_F(CCDamageTrackerTest, verifyDamageForBlurredSurface)
 {
     OwnPtr<CCLayerImpl> root = createAndSetUpTestTreeWithOneSurface();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to