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