Title: [122746] trunk/Source
Revision
122746
Author
[email protected]
Date
2012-07-16 12:06:00 -0700 (Mon, 16 Jul 2012)

Log Message

[chromium] Only apply page scale delta to root scroll layer
https://bugs.webkit.org/show_bug.cgi?id=91374

Patch by Sami Kyostila <[email protected]> on 2012-07-16
Reviewed by Adrienne Walker.

Source/WebCore:

When the user pinch-zooms the web page though the Chromium compositor, the
per-layer page scale delta is used to keep track of the difference between the
page scale on the compositor thread versus the main thread. On the next
commit to the main thread these values are reset to 1.

When calculating layer positions, the compositor applies a layer's page scale
delta both to the layer itself as well as all of its children. Since we are
currently updating the page scale delta on all scrollable layers, this results
in scrollable child layers getting scaled multiple times.

This patch changes the compositor to only apply the page scale delta on the
root scroll layer.

New unit test: CCLayerTreeHostImplTest.pageScaleDeltaAppliedToRootScrollLayerOnly

* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::setPageScaleFactorAndLimits):
(WebCore::CCLayerTreeHostImpl::setPageScaleDelta):

Source/WebKit/chromium:

New unit test
CCLayerTreeHostImplTest.pageScaleDeltaAppliedToRootScrollLayerOnly to verify
the transformation of child layer while pinch zooming.

* tests/CCLayerTreeHostImplTest.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (122745 => 122746)


--- trunk/Source/WebCore/ChangeLog	2012-07-16 18:59:27 UTC (rev 122745)
+++ trunk/Source/WebCore/ChangeLog	2012-07-16 19:06:00 UTC (rev 122746)
@@ -1,3 +1,29 @@
+2012-07-16  Sami Kyostila  <[email protected]>
+
+        [chromium] Only apply page scale delta to root scroll layer
+        https://bugs.webkit.org/show_bug.cgi?id=91374
+
+        Reviewed by Adrienne Walker.
+
+        When the user pinch-zooms the web page though the Chromium compositor, the
+        per-layer page scale delta is used to keep track of the difference between the
+        page scale on the compositor thread versus the main thread. On the next
+        commit to the main thread these values are reset to 1.
+
+        When calculating layer positions, the compositor applies a layer's page scale
+        delta both to the layer itself as well as all of its children. Since we are
+        currently updating the page scale delta on all scrollable layers, this results
+        in scrollable child layers getting scaled multiple times.
+
+        This patch changes the compositor to only apply the page scale delta on the
+        root scroll layer.
+
+        New unit test: CCLayerTreeHostImplTest.pageScaleDeltaAppliedToRootScrollLayerOnly
+
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::setPageScaleFactorAndLimits):
+        (WebCore::CCLayerTreeHostImpl::setPageScaleDelta):
+
 2012-07-16  Kihong Kwon  <[email protected]>
 
         Remove setController from BatteryClient

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (122745 => 122746)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-07-16 18:59:27 UTC (rev 122745)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-07-16 19:06:00 UTC (rev 122746)
@@ -761,18 +761,6 @@
         adjustScrollsForPageScaleChange(layerImpl->children()[i].get(), pageScaleChange);
 }
 
-static void applyPageScaleDeltaToScrollLayers(CCLayerImpl* layerImpl, float pageScaleDelta)
-{
-    if (!layerImpl)
-        return;
-
-    if (layerImpl->scrollable())
-        layerImpl->setPageScaleDelta(pageScaleDelta);
-
-    for (size_t i = 0; i < layerImpl->children().size(); ++i)
-        applyPageScaleDeltaToScrollLayers(layerImpl->children()[i].get(), pageScaleDelta);
-}
-
 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor)
 {
     if (deviceScaleFactor == m_deviceScaleFactor)
@@ -807,7 +795,8 @@
     // Clamp delta to limits and refresh display matrix.
     setPageScaleDelta(m_pageScaleDelta / m_sentPageScaleDelta);
     m_sentPageScaleDelta = 1;
-    applyPageScaleDeltaToScrollLayers(m_rootScrollLayerImpl, m_pageScaleDelta);
+    if (m_rootScrollLayerImpl)
+        m_rootScrollLayerImpl->setPageScaleDelta(m_pageScaleDelta);
 }
 
 void CCLayerTreeHostImpl::setPageScaleDelta(float delta)
@@ -825,7 +814,8 @@
     m_pageScaleDelta = delta;
 
     updateMaxScrollPosition();
-    applyPageScaleDeltaToScrollLayers(m_rootScrollLayerImpl, m_pageScaleDelta);
+    if (m_rootScrollLayerImpl)
+        m_rootScrollLayerImpl->setPageScaleDelta(m_pageScaleDelta);
 }
 
 void CCLayerTreeHostImpl::updateMaxScrollPosition()

Modified: trunk/Source/WebKit/chromium/ChangeLog (122745 => 122746)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-07-16 18:59:27 UTC (rev 122745)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-07-16 19:06:00 UTC (rev 122746)
@@ -1,3 +1,16 @@
+2012-07-16  Sami Kyostila  <[email protected]>
+
+        [chromium] Only apply page scale delta to root scroll layer
+        https://bugs.webkit.org/show_bug.cgi?id=91374
+
+        Reviewed by Adrienne Walker.
+
+        New unit test
+        CCLayerTreeHostImplTest.pageScaleDeltaAppliedToRootScrollLayerOnly to verify
+        the transformation of child layer while pinch zooming.
+
+        * tests/CCLayerTreeHostImplTest.cpp:
+
 2012-07-16  Kihong Kwon  <[email protected]>
 
         Remove setController from BatteryClient

Modified: trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (122745 => 122746)


--- trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2012-07-16 18:59:27 UTC (rev 122745)
+++ trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2012-07-16 19:06:00 UTC (rev 122746)
@@ -989,6 +989,45 @@
     EXPECT_EQ(m_hostImpl->rootLayer()->pageScaleDelta(), pageScale);
 }
 
+TEST_F(CCLayerTreeHostImplTest, pageScaleDeltaAppliedToRootScrollLayerOnly)
+{
+    IntSize surfaceSize(10, 10);
+    float defaultPageScale = 1;
+    float newPageScale = 2;
+
+    // Create a normal scrollable root layer and another scrollable child layer.
+    setupScrollAndContentsLayers(surfaceSize);
+    CCLayerImpl* root = m_hostImpl->rootLayer();
+    CCLayerImpl* child = root->children()[0].get();
+
+    OwnPtr<CCLayerImpl> scrollableChild = createScrollableLayer(3, FloatPoint(5, 5), surfaceSize);
+    child->addChild(scrollableChild.release());
+    CCLayerImpl* grandChild = child->children()[0].get();
+
+    // Set new page scale on impl thread by pinching.
+    m_hostImpl->pinchGestureBegin();
+    m_hostImpl->pinchGestureUpdate(newPageScale, IntPoint());
+    m_hostImpl->pinchGestureEnd();
+
+    // The page scale delta should only be applied to the scrollable root layer.
+    EXPECT_EQ(root->pageScaleDelta(), newPageScale);
+    EXPECT_EQ(child->pageScaleDelta(), defaultPageScale);
+    EXPECT_EQ(grandChild->pageScaleDelta(), defaultPageScale);
+
+    // Make sure all the layers are drawn with the page scale delta applied, i.e., the page scale
+    // delta on the root layer is applied hierarchically.
+    CCLayerTreeHostImpl::FrameData frame;
+    EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
+    m_hostImpl->drawLayers(frame);
+    m_hostImpl->didDrawAllLayers(frame);
+
+    WebTransformationMatrix pageScaleTransform;
+    pageScaleTransform.scale(newPageScale);
+    EXPECT_EQ(root->drawTransform(), pageScaleTransform);
+    EXPECT_EQ(child->drawTransform(), pageScaleTransform);
+    EXPECT_EQ(grandChild->drawTransform(), pageScaleTransform);
+}
+
 TEST_F(CCLayerTreeHostImplTest, scrollChildAndChangePageScaleOnMainThread)
 {
     IntSize surfaceSize(10, 10);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to