Source/Platform/ChangeLog

 12012-05-10 Dana Jansens <danakj@chromium.org>
 2
 3 [chromium] Scale all compositor output by deviceScaleFactor
 4 https://bugs.webkit.org/show_bug.cgi?id=86051
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * chromium/public/WebLayerTreeView.h:
 9 (WebLayerTreeView):
 10
1112012-05-10 Mark Pilgrim <pilgrim@chromium.org>
212
313 [Chromium] Remove WEBKIT_USING_SKIA ifdefs that are always true

Source/WebCore/ChangeLog

 12012-05-10 Dana Jansens <danakj@chromium.org>
 2
 3 [chromium] Scale all compositor output by deviceScaleFactor
 4 https://bugs.webkit.org/show_bug.cgi?id=86051
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 This CL enabled defaultDeviceScaleFactor in the compositor. All layout
 9 and scrolling is still done in unscaled DIP. Only painting and drawing
 10 are scaled by the deviceScaleFactor, to create scaled output. WebCore
 11 remains unchanged, and continues to work in DIP pixels (which in this
 12 case are physical pixels / deviceScaleFactor).
 13
 14 Previously, device scale was intertwined with page scale, and this
 15 separates the two completely. pageScaleFactor is no longer scaled by
 16 the deviceScaleFactor. This change is reflected in ChromeClientImpl
 17 and WebViewImpl, by removing the multiplication by deviceScaleFactor.
 18 This also is reflected in GraphicsLayerChromium, where we do the same.
 19
 20 In order to apply deviceScaleFactor to the compositor's output, we do
 21 the following:
 22
 23 1) We set the deviceScaleFactor on WebViewImpl to the value of
 24 defaultDeviceScaleFactor in WebSettings. When viewport is in use, we
 25 continue to set the deviceScaleFactor based on its computed scale
 26 factor.
 27
 28 2) WebViewImpl now sets the deviceScaleFactor on the CCLayerTreeHost
 29 (seen as a WebLayerTreeView). This is syncronized to the
 30 CCLayerTreeHostImpl during commit, similar to pageScaleFactor.
 31
 32 3) The deviceScaleFactor on CCLayerTreeHost(Impl) is included in the
 33 contentsScale() for all layers that are owned by the
 34 CCLayerTreeHost(Impl). The old contentsScale() becomes pageScaleFactor()
 35 explcitly.
 36
 37 4) We add a deviceViewportSize() to the CCLayerTreeHost(Impl), which is
 38 the viewportSize in physical pixels, for things that want it. This is
 39 used by LayerRendererChromium, instead of the DIP viewportSize(). It is
 40 also used by CCOcclusionTracker(Impl) since it works in content, or
 41 physical pixel, space.
 42
 43 5) We apply a scale transform to the entire layer tree when computing
 44 draw transforms and visibility. This applies to all children then
 45 as well, making their drawn bounds match their scaled content bounds.
 46
 47 Unit tests: CCLayerTreeHostTestCommit
 48 CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers
 49
 50 * platform/graphics/chromium/GraphicsLayerChromium.cpp:
 51 (WebCore::GraphicsLayerChromium::setTransform):
 52 (WebCore::GraphicsLayerChromium::updateLayerPreserves3D):
 53 (WebCore::GraphicsLayerChromium::updatePageScaleFactor):
 54 (WebCore::GraphicsLayerChromium::computePageScaleFactor):
 55 (WebCore::GraphicsLayerChromium::deviceOrPageScaleFactorChanged):
 56 * platform/graphics/chromium/GraphicsLayerChromium.h:
 57 (GraphicsLayerChromium):
 58 * platform/graphics/chromium/LayerChromium.cpp:
 59 (WebCore::LayerChromium::LayerChromium):
 60 (WebCore::LayerChromium::setLayerTreeHost):
 61 (WebCore::LayerChromium::updateContentsScale):
 62 (WebCore::LayerChromium::setPageScaleFactor):
 63 (WebCore):
 64 * platform/graphics/chromium/LayerChromium.h:
 65 (LayerChromium):
 66 (WebCore::LayerChromium::pageScaleFactor):
 67 * platform/graphics/chromium/LayerRendererChromium.h:
 68 (LayerRendererChromiumClient):
 69 (WebCore::LayerRendererChromium::viewportSize):
 70 (WebCore::LayerRendererChromium::viewportWidth):
 71 (WebCore::LayerRendererChromium::viewportHeight):
 72 (LayerRendererChromium):
 73 * platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
 74 (WebCore::CCLayerTreeHost::CCLayerTreeHost):
 75 (WebCore::CCLayerTreeHost::initializeLayerRenderer):
 76 (WebCore::CCLayerTreeHost::finishCommitOnImplThread):
 77 (WebCore::CCLayerTreeHost::setViewportSize):
 78 (WebCore::updateContentsScaleOnSubtree):
 79 (WebCore):
 80 (WebCore::CCLayerTreeHost::setDeviceScaleFactor):
 81 (WebCore::CCLayerTreeHost::updateLayers):
 82 (WebCore::CCLayerTreeHost::paintLayerContents):
 83 * platform/graphics/chromium/cc/CCLayerTreeHost.h:
 84 (CCLayerTreeHost):
 85 (WebCore::CCLayerTreeHost::deviceViewportSize):
 86 (WebCore::CCLayerTreeHost::deviceScaleFactor):
 87 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
 88 (WebCore::CCLayerTreeHostImpl::CCLayerTreeHostImpl):
 89 (WebCore::CCLayerTreeHostImpl::calculateRenderSurfaceLayerList):
 90 (WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
 91 (WebCore::CCLayerTreeHostImpl::setViewportSize):
 92 (WebCore):
 93 (WebCore::CCLayerTreeHostImpl::setDeviceScaleFactor):
 94 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
 95 (WebCore::CCLayerTreeHostImpl::viewportSize):
 96 (WebCore::CCLayerTreeHostImpl::deviceScaleFactor):
 97 (CCLayerTreeHostImpl):
 98
1992012-05-10 Eric Seidel <eric@webkit.org>
2100
3101 Make IFRAME_SEAMLESS child documents inherit styles from their parent iframe element

Source/WebKit/chromium/ChangeLog

 12012-05-10 Dana Jansens <danakj@chromium.org>
 2
 3 [chromium] Scale all compositor output by deviceScaleFactor
 4 https://bugs.webkit.org/show_bug.cgi?id=86051
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * src/ChromeClientImpl.cpp:
 9 (WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
 10 * src/WebLayerTreeView.cpp:
 11 (WebKit::WebLayerTreeView::setDeviceScaleFactor):
 12 (WebKit):
 13 * src/WebViewImpl.cpp:
 14 (WebKit::WebViewImpl::setDeviceScaleFactor):
 15 (WebKit::WebViewImpl::computePageScaleFactorLimits):
 16 * tests/CCLayerTreeHostTest.cpp:
 17 (MockLayerTreeHostImpl):
 18 (WTF::CCLayerTreeHostTestCommit::beginTest):
 19 (WTF::CCLayerTreeHostTestCommit::commitCompleteOnCCThread):
 20 (CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers):
 21 (WTF::CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers::CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers):
 22 (WTF::CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers::beginTest):
 23 (WTF::CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers::commitCompleteOnCCThread):
 24 (WTF::CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers::afterTest):
 25 (WTF):
 26 (WTF::TEST_F):
 27 * tests/LayerChromiumTest.cpp:
 28 * tests/LayerRendererChromiumTest.cpp:
 29 * tests/TiledLayerChromiumTest.cpp:
 30 (WTF::TEST):
 31
1322012-05-10 Mark Pilgrim <pilgrim@chromium.org>
233
334 [Chromium] Call addTraceEvent and getTraceCategoryEnabledFlag directly

Source/Platform/chromium/public/WebLayerTreeView.h

@@public:
112112 // composite or trigger updateAnimations() or layout() calls until it becomes visible.
113113 WEBKIT_EXPORT void setVisible(bool);
114114
 115 // Sets the current device scale factor.
 116 WEBKIT_EXPORT void setDeviceScaleFactor(float);
 117
115118 // Sets the current page scale factor and minimum / maximum limits. Both limits are initially 1 (no page scale allowed).
116119 WEBKIT_EXPORT void setPageScaleFactorAndLimits(float pageScaleFactor, float minimum, float maximum);
117120

Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp

@@void GraphicsLayerChromium::setSize(const FloatSize& size)
221221void GraphicsLayerChromium::setTransform(const TransformationMatrix& transform)
222222{
223223 // Call this method first to assign contents scale to LayerChromium so the painter can apply the scale transform.
224  updateContentsScale();
 224 updatePageScaleFactor();
225225
226226 GraphicsLayer::setTransform(transform);
227227 updateTransform();

@@void GraphicsLayerChromium::updateLayerPreserves3D()
624624 // Set the old layer to opacity of 1. Further down we will set the opacity on the transform layer.
625625 m_layer->setOpacity(1);
626626
627  m_layer->setContentsScale(contentsScale());
 627 m_layer->setPageScaleFactor(computePageScaleFactor());
628628
629629 // Move this layer to be a child of the transform layer.
630630 if (m_layer->parent())

@@void GraphicsLayerChromium::updateContentsRect()
700700 m_contentsLayer->setBounds(IntSize(m_contentsRect.width(), m_contentsRect.height()));
701701}
702702
703 void GraphicsLayerChromium::updateContentsScale()
 703void GraphicsLayerChromium::updatePageScaleFactor()
704704{
705705 // If page scale is already applied then there's no need to apply it again.
706706 if (appliesPageScale() || !m_layer)
707707 return;
708708
709  m_layer->setContentsScale(contentsScale());
 709 m_layer->setPageScaleFactor(computePageScaleFactor());
710710}
711711
712712void GraphicsLayerChromium::setupContentsLayer(LayerChromium* contentsLayer)

@@void GraphicsLayerChromium::setupContentsLayer(LayerChromium* contentsLayer)
741741 updateNames();
742742}
743743
744 float GraphicsLayerChromium::contentsScale() const
 744float GraphicsLayerChromium::computePageScaleFactor() const
745745{
746746 if (!appliesPageScale())
747  return pageScaleFactor() * deviceScaleFactor();
 747 return pageScaleFactor();
748748 return 1;
749749}
750750
751751void GraphicsLayerChromium::deviceOrPageScaleFactorChanged()
752752{
753  updateContentsScale();
 753 updatePageScaleFactor();
754754 // Invalidations are clamped to the layer's bounds but we receive the scale changed notification before receiving
755755 // the new layer bounds. When the scale changes, we really want to invalidate the post-scale layer bounds, so we
756756 // remember that the scale has changed and then invalidate the full layer bounds when we receive the new size.

Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.h

@@private:
149149 void updateContentsImage();
150150 void updateContentsVideo();
151151 void updateContentsRect();
152  void updateContentsScale();
 152 void updatePageScaleFactor();
153153
154154 void setupContentsLayer(LayerChromium*);
155  float contentsScale() const;
 155 float computePageScaleFactor() const;
156156
157157 int mapAnimationNameToId(const String& animationName);
158158

Source/WebCore/platform/graphics/chromium/LayerChromium.cpp

@@LayerChromium::LayerChromium()
8787 , m_drawTransformIsAnimating(false)
8888 , m_screenSpaceTransformIsAnimating(false)
8989 , m_contentsScale(1.0)
 90 , m_pageScaleFactor(1.0)
9091 , m_layerAnimationDelegate(0)
9192{
9293}

@@void LayerChromium::setLayerTreeHost(CCLayerTreeHost* host)
113114
114115 m_layerTreeHost = host;
115116
 117 // The host has a device scale factor that may affect our contentsScale.
 118 updateContentsScale();
 119
116120 for (size_t i = 0; i < m_children.size(); ++i)
117121 m_children[i]->setLayerTreeHost(host);
118122

@@void LayerChromium::setDebugName(const String& debugName)
553557 setNeedsCommit();
554558}
555559
556 
557 void LayerChromium::setContentsScale(float contentsScale)
 560void LayerChromium::updateContentsScale()
558561{
559  if (!needsContentsScale() || m_contentsScale == contentsScale)
 562 if (!needsContentsScale())
 563 return;
 564
 565 float deviceScaleFactor = layerTreeHost() ? layerTreeHost()->deviceScaleFactor() : 1;
 566 float contentsScale = deviceScaleFactor * m_pageScaleFactor;
 567
 568 if (m_contentsScale == contentsScale)
560569 return;
561570 m_contentsScale = contentsScale;
562571 setNeedsDisplay();
563572}
564573
 574void LayerChromium::setPageScaleFactor(float pageScaleFactor)
 575{
 576 if (!needsContentsScale() || pageScaleFactor == m_pageScaleFactor)
 577 return;
 578 m_pageScaleFactor = pageScaleFactor;
 579 updateContentsScale();
 580}
 581
565582void LayerChromium::createRenderSurface()
566583{
567584 ASSERT(!m_renderSurface);

Source/WebCore/platform/graphics/chromium/LayerChromium.h

@@public:
217217 void setScreenSpaceTransform(const TransformationMatrix& matrix) { m_screenSpaceTransform = matrix; }
218218 const IntRect& drawableContentRect() const { return m_drawableContentRect; }
219219 void setDrawableContentRect(const IntRect& rect) { m_drawableContentRect = rect; }
 220
220221 float contentsScale() const { return m_contentsScale; }
221  void setContentsScale(float);
 222 void updateContentsScale();
 223
 224 // contentsScale is combined from these two scale values.
 225 float pageScaleFactor() const { return m_pageScaleFactor; }
 226 void setPageScaleFactor(float);
222227
223228 // Returns true if any of the layer's descendants has content to draw.
224229 bool descendantDrawsContent();

@@private:
348353 bool m_screenSpaceTransformIsAnimating;
349354 IntRect m_drawableContentRect;
350355 float m_contentsScale;
 356 float m_pageScaleFactor;
351357
352358 bool m_pageScaleDirty;
353359

Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h

@@class ScopedEnsureFramebufferAllocation;
6666
6767class LayerRendererChromiumClient {
6868public:
69  virtual const IntSize& viewportSize() const = 0;
 69 virtual const IntSize& deviceViewportSize() const = 0;
7070 virtual const CCSettings& settings() const = 0;
7171 virtual void didLoseContext() = 0;
7272 virtual void onSwapBuffersComplete() = 0;

@@public:
8888 GraphicsContext3D* context();
8989 bool contextSupportsMapSub() const { return m_capabilities.usingMapSub; }
9090
91  const IntSize& viewportSize() { return m_client->viewportSize(); }
92  int viewportWidth() { return viewportSize().width(); }
93  int viewportHeight() { return viewportSize().height(); }
94 
9591 void viewportChanged();
9692
9793 void beginDrawingFrame(CCRenderSurface* defaultRenderSurface);

@@protected:
148144 bool initialize();
149145
150146private:
 147 const IntSize& viewportSize() { return m_client->deviceViewportSize(); }
 148 int viewportWidth() { return viewportSize().width(); }
 149 int viewportHeight() { return viewportSize().height(); }
 150
151151 void drawQuad(const CCDrawQuad*, const FloatRect& surfaceDamageRect);
152152 void drawCheckerboardQuad(const CCCheckerboardDrawQuad*);
153153 void drawDebugBorderQuad(const CCDebugBorderDrawQuad*);

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp

@@CCLayerTreeHost::CCLayerTreeHost(CCLayerTreeHostClient* client, const CCSettings
7777 , m_numFailedRecreateAttempts(0)
7878 , m_settings(settings)
7979 , m_visible(true)
 80 , m_deviceScaleFactor(1)
8081 , m_pageScaleFactor(1)
8182 , m_minPageScaleFactor(1)
8283 , m_maxPageScaleFactor(1)

@@void CCLayerTreeHost::initializeLayerRenderer()
143144 // Update m_settings based on partial update capability.
144145 m_settings.maxPartialTextureUpdates = min(m_settings.maxPartialTextureUpdates, m_proxy->maxPartialTextureUpdates());
145146
146  m_contentsTextureManager = TextureManager::create(TextureManager::highLimitBytes(viewportSize()),
147  TextureManager::reclaimLimitBytes(viewportSize()),
 147 m_contentsTextureManager = TextureManager::create(TextureManager::highLimitBytes(deviceViewportSize()),
 148 TextureManager::reclaimLimitBytes(deviceViewportSize()),
148149 m_proxy->layerRendererCapabilities().maxTextureSize);
149150
150151 m_layerRendererInitialized = true;

@@void CCLayerTreeHost::finishCommitOnImplThread(CCLayerTreeHostImpl* hostImpl)
238239
239240 hostImpl->setSourceFrameNumber(frameNumber());
240241 hostImpl->setViewportSize(viewportSize());
 242 hostImpl->setDeviceScaleFactor(m_deviceScaleFactor);
241243 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFactor, m_maxPageScaleFactor);
242244 hostImpl->setBackgroundColor(m_backgroundColor);
243245

@@void CCLayerTreeHost::setViewportSize(const IntSize& viewportSize)
362364 return;
363365
364366 m_viewportSize = viewportSize;
 367 m_deviceViewportSize = IntSize(m_viewportSize.width() * m_deviceScaleFactor, m_viewportSize.height() * m_deviceScaleFactor);
 368
365369 setNeedsCommit();
366370}
367371
 372static void updateContentsScaleOnSubtree(LayerChromium* layer)
 373{
 374 layer->updateContentsScale();
 375
 376 for (size_t i = 0; i < layer->children().size(); ++i)
 377 updateContentsScaleOnSubtree(layer->children()[i].get());
 378}
 379
 380void CCLayerTreeHost::setDeviceScaleFactor(float deviceScaleFactor)
 381{
 382 if (deviceScaleFactor == m_deviceScaleFactor)
 383 return;
 384
 385 m_deviceScaleFactor = deviceScaleFactor;
 386 m_deviceViewportSize = IntSize(m_viewportSize.width() * m_deviceScaleFactor, m_viewportSize.height() * m_deviceScaleFactor);
 387
 388 setNeedsCommit();
 389 // The contentsScale of all layers will be affected.
 390 if (m_rootLayer)
 391 updateContentsScaleOnSubtree(m_rootLayer.get());
 392}
 393
368394void CCLayerTreeHost::setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor)
369395{
370396 if (pageScaleFactor == m_pageScaleFactor && minPageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleFactor)

@@void CCLayerTreeHost::updateLayers(LayerChromium* rootLayer, CCTextureUpdater& u
478504
479505 if (!rootLayer->renderSurface())
480506 rootLayer->createRenderSurface();
481  rootLayer->renderSurface()->setContentRect(IntRect(IntPoint(0, 0), viewportSize()));
 507 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint(0, 0), deviceViewportSize()));
482508
483  IntRect rootClipRect(IntPoint(), viewportSize());
 509 IntRect rootClipRect(IntPoint(), deviceViewportSize());
484510 rootLayer->setClipRect(rootClipRect);
485511
486512 LayerList updateList;

@@void CCLayerTreeHost::updateLayers(LayerChromium* rootLayer, CCTextureUpdater& u
489515 RenderSurfaceChromium* rootRenderSurface = rootLayer->renderSurface();
490516 rootRenderSurface->clearLayerList();
491517
492  TransformationMatrix identityMatrix;
493518 {
494519 TRACE_EVENT("CCLayerTreeHost::updateLayers::calcDrawEtc", this, 0);
495  CCLayerTreeHostCommon::calculateDrawTransformsAndVisibility(rootLayer, rootLayer, identityMatrix, identityMatrix, updateList, rootRenderSurface->layerList(), layerRendererCapabilities().maxTextureSize);
 520 TransformationMatrix identityMatrix;
 521 TransformationMatrix deviceScaleTransform;
 522 deviceScaleTransform.scale(m_deviceScaleFactor);
 523 CCLayerTreeHostCommon::calculateDrawTransformsAndVisibility(rootLayer, rootLayer, deviceScaleTransform, identityMatrix, updateList, rootRenderSurface->layerList(), layerRendererCapabilities().maxTextureSize);
496524 }
497525
498526 // Reset partial texture update requests.

@@void CCLayerTreeHost::paintLayerContents(const LayerList& renderSurfaceLayerList
570598 typedef CCLayerIterator<LayerChromium, Vector<RefPtr<LayerChromium> >, RenderSurfaceChromium, CCLayerIteratorActions::FrontToBack> CCLayerIteratorType;
571599
572600 bool recordMetricsForFrame = true; // FIXME: In the future, disable this when about:tracing is off.
573  CCOcclusionTracker occlusionTracker(IntRect(IntPoint(), viewportSize()), recordMetricsForFrame);
 601 CCOcclusionTracker occlusionTracker(IntRect(IntPoint(), deviceViewportSize()), recordMetricsForFrame);
574602 occlusionTracker.setMinimumTrackingSize(CCOcclusionTracker::preferredMinimumTrackingSize());
575603
576604 CCLayerIteratorType end = CCLayerIteratorType::end(&renderSurfaceLayerList);

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h

@@public:
209209 void setViewportSize(const IntSize&);
210210
211211 const IntSize& viewportSize() const { return m_viewportSize; }
 212 // Gives the viewport size in device/content space.
 213 const IntSize& deviceViewportSize() const { return m_deviceViewportSize; }
 214
 215 float deviceScaleFactor() const { return m_deviceScaleFactor; }
 216 void setDeviceScaleFactor(float);
212217
213218 void setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor);
214219

@@private:
277282 CCSettings m_settings;
278283
279284 IntSize m_viewportSize;
 285 IntSize m_deviceViewportSize;
280286 bool m_visible;
281287 typedef HashMap<GraphicsContext3D*, RefPtr<RateLimiter> > RateLimiterMap;
282288 RateLimiterMap m_rateLimiters;
283289
 290 float m_deviceScaleFactor;
284291 float m_pageScaleFactor;
285292 float m_minPageScaleFactor, m_maxPageScaleFactor;
286293 bool m_triggerIdlePaints;

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp

@@CCLayerTreeHostImpl::CCLayerTreeHostImpl(const CCSettings& settings, CCLayerTree
112112 , m_settings(settings)
113113 , m_visible(true)
114114 , m_headsUpDisplay(CCHeadsUpDisplay::create())
 115 , m_deviceScaleFactor(1)
115116 , m_pageScale(1)
116117 , m_pageScaleDelta(1)
117118 , m_sentPageScaleDelta(1)

@@void CCLayerTreeHostImpl::calculateRenderSurfaceLayerList(CCLayerList& renderSur
251252 if (!m_rootLayerImpl->renderSurface())
252253 m_rootLayerImpl->createRenderSurface();
253254 m_rootLayerImpl->renderSurface()->clearLayerList();
254  m_rootLayerImpl->renderSurface()->setContentRect(IntRect(IntPoint(), viewportSize()));
 255 m_rootLayerImpl->renderSurface()->setContentRect(IntRect(IntPoint(), deviceViewportSize()));
255256
256  m_rootLayerImpl->setClipRect(IntRect(IntPoint(), viewportSize()));
 257 m_rootLayerImpl->setClipRect(IntRect(IntPoint(), deviceViewportSize()));
257258
258259 {
259  TransformationMatrix identityMatrix;
260260 TRACE_EVENT("CCLayerTreeHostImpl::calcDrawEtc", this, 0);
261  CCLayerTreeHostCommon::calculateDrawTransformsAndVisibility(m_rootLayerImpl.get(), m_rootLayerImpl.get(), identityMatrix, identityMatrix, renderSurfaceLayerList, m_rootLayerImpl->renderSurface()->layerList(), &m_layerSorter, layerRendererCapabilities().maxTextureSize);
 261 TransformationMatrix identityMatrix;
 262 TransformationMatrix deviceScaleTransform;
 263 deviceScaleTransform.scale(m_deviceScaleFactor);
 264 CCLayerTreeHostCommon::calculateDrawTransformsAndVisibility(m_rootLayerImpl.get(), m_rootLayerImpl.get(), deviceScaleTransform, identityMatrix, renderSurfaceLayerList, m_rootLayerImpl->renderSurface()->layerList(), &m_layerSorter, layerRendererCapabilities().maxTextureSize);
262265 }
263266}
264267

@@bool CCLayerTreeHostImpl::calculateRenderPasses(CCRenderPassList& passes, CCLaye
295298 if (layerRendererCapabilities().usingPartialSwap)
296299 scissorRect = enclosingIntRect(m_rootDamageRect);
297300 else
298  scissorRect = IntRect(IntPoint(), viewportSize());
 301 scissorRect = IntRect(IntPoint(), deviceViewportSize());
299302
300303 bool recordMetricsForFrame = true; // FIXME: In the future, disable this when about:tracing is off.
301304 CCOcclusionTrackerImpl occlusionTracker(scissorRect, recordMetricsForFrame);

@@void CCLayerTreeHostImpl::setViewportSize(const IntSize& viewportSize)
552555 return;
553556
554557 m_viewportSize = viewportSize;
 558 m_deviceViewportSize = IntSize(m_viewportSize.width() * m_deviceScaleFactor, m_viewportSize.height() * m_deviceScaleFactor);
 559
555560 updateMaxScrollPosition();
556561
557562 if (m_layerRenderer)
558563 m_layerRenderer->viewportChanged();
559564}
560565
 566void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScale)
 567{
 568 if (deviceScale == m_deviceScaleFactor)
 569 return;
 570
 571 m_deviceScaleFactor = deviceScale;
 572 m_deviceViewportSize = IntSize(m_viewportSize.width() * m_deviceScaleFactor, m_viewportSize.height() * m_deviceScaleFactor);
 573
 574 if (m_layerRenderer)
 575 m_layerRenderer->viewportChanged();
 576}
 577
561578void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale)
562579{
563580 if (!pageScale)

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h

@@public:
105105 void didDrawAllLayers(const FrameData&);
106106
107107 // LayerRendererChromiumClient implementation
108  virtual const IntSize& viewportSize() const OVERRIDE { return m_viewportSize; }
 108 virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_deviceViewportSize; }
109109 virtual const CCSettings& settings() const OVERRIDE { return m_settings; }
110110 virtual void didLoseContext() OVERRIDE;
111111 virtual void onSwapBuffersComplete() OVERRIDE;

@@public:
144144 int sourceFrameNumber() const { return m_sourceFrameNumber; }
145145 void setSourceFrameNumber(int frameNumber) { m_sourceFrameNumber = frameNumber; }
146146
 147 const IntSize& viewportSize() const { return m_viewportSize; }
147148 void setViewportSize(const IntSize&);
148149
149  void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
 150 float deviceScaleFactor() const { return m_deviceScaleFactor; }
 151 void setDeviceScaleFactor(float);
 152
150153 float pageScale() const { return m_pageScale; }
 154 void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
151155
152156 PassOwnPtr<CCScrollAndScaleSet> processScrollDeltas();
153157

@@protected:
170174 void animatePageScale(double monotonicTime);
171175 void animateGestures(double monotonicTime);
172176
 177 // Exposed for testing.
 178 void calculateRenderSurfaceLayerList(CCLayerList&);
 179
173180 // Virtual for testing.
174181 virtual void animateLayers(double monotonicTime, double wallClockTime);
175182

@@private:
187194 void adjustScrollsForPageScaleChange(float);
188195 void updateMaxScrollPosition();
189196 void trackDamageForAllSurfaces(CCLayerImpl* rootDrawLayer, const CCLayerList& renderSurfaceLayerList);
190  void calculateRenderSurfaceLayerList(CCLayerList&);
191197
192198 // Returns false if the frame should not be displayed. This function should
193199 // only be called from prepareToDraw, as didDrawAllLayers must be called

@@private:
205211 CCLayerImpl* m_scrollLayerImpl;
206212 CCSettings m_settings;
207213 IntSize m_viewportSize;
 214 IntSize m_deviceViewportSize;
208215 bool m_visible;
209216
210217 OwnPtr<CCHeadsUpDisplay> m_headsUpDisplay;
211218
 219 float m_deviceScaleFactor;
212220 float m_pageScale;
213221 float m_pageScaleDelta;
214222 float m_sentPageScaleDelta;

Source/WebKit/chromium/src/ChromeClientImpl.cpp

@@void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
642642void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
643643{
644644#if ENABLE(VIEWPORT)
645  if (!m_webView->settings()->viewportEnabled() || !m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page())
 645 if (!m_webView->settings()->viewportEnabled() || !m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page()) {
 646#endif
 647 Settings* settings = m_webView->page()->settings();
 648 m_webView->setDeviceScaleFactor(settings->defaultDeviceScaleFactor());
 649 m_webView->setPageScaleFactor(1, WebPoint());
 650#if ENABLE(VIEWPORT)
646651 return;
 652 }
647653
648654 bool useDefaultDeviceScaleFactor = false;
649655 ViewportArguments args;

@@void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArgumen
681687 else
682688 m_webView->setDeviceScaleFactor(computed.devicePixelRatio);
683689 m_webView->setPageScaleFactorLimits(computed.minimumScale, computed.maximumScale);
684  m_webView->setPageScaleFactorPreservingScrollOffset(computed.initialScale * computed.devicePixelRatio);
 690 m_webView->setPageScaleFactorPreservingScrollOffset(computed.initialScale);
685691#endif
686692}
687693

Source/WebKit/chromium/src/WebLayerTreeView.cpp

@@void WebLayerTreeView::setVisible(bool visible)
107107 m_private->setVisible(visible);
108108}
109109
 110void WebLayerTreeView::setDeviceScaleFactor(float deviceScaleFactor)
 111{
 112 m_private->setDeviceScaleFactor(deviceScaleFactor);
 113}
 114
110115void WebLayerTreeView::setPageScaleFactorAndLimits(float pageScaleFactor, float minimum, float maximum)
111116{
112117 m_private->setPageScaleFactorAndLimits(pageScaleFactor, minimum, maximum);

Source/WebKit/chromium/src/WebViewImpl.cpp

@@void WebViewImpl::setDeviceScaleFactor(float scaleFactor)
23422342 return;
23432343
23442344 page()->setDeviceScaleFactor(scaleFactor);
 2345 if (!m_layerTreeView.isNull())
 2346 m_layerTreeView.setDeviceScaleFactor(scaleFactor);
23452347}
23462348
23472349bool WebViewImpl::isFixedLayoutModeEnabled() const

@@bool WebViewImpl::computePageScaleFactorLimits()
24062408 if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->view())
24072409 return false;
24082410
2409  m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor) * deviceScaleFactor();
2410  m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor) * deviceScaleFactor();
 2411 m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor);
 2412 m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor);
24112413
24122414 int viewWidthNotIncludingScrollbars = page()->mainFrame()->view()->visibleContentRect(false).width();
24132415 int contentsWidth = mainFrame()->contentsSize().width;

Source/WebKit/chromium/tests/CCLayerTreeHostTest.cpp

@@using namespace WebKit;
5858using namespace WebKitTests;
5959using namespace WTF;
6060
 61#define EXPECT_EQ_RECT(a, b) \
 62 EXPECT_EQ(a.x(), b.x()); \
 63 EXPECT_EQ(a.y(), b.y()); \
 64 EXPECT_EQ(a.width(), b.width()); \
 65 EXPECT_EQ(a.height(), b.height());
 66
6167namespace {
6268
6369// Used by test stubs to notify the test when something interesting happens.

@@public:
113119 m_testHooks->drawLayersOnCCThread(this);
114120 }
115121
 122 // Make these public.
 123 typedef Vector<CCLayerImpl*> CCLayerList;
 124 using CCLayerTreeHostImpl::calculateRenderSurfaceLayerList;
 125
116126protected:
117127 virtual void animateLayers(double monotonicTime, double wallClockTime)
118128 {

@@public:
14641474 m_layerTreeHost->setViewportSize(IntSize(20, 20));
14651475 m_layerTreeHost->setBackgroundColor(Color::gray);
14661476 m_layerTreeHost->setPageScaleFactorAndLimits(5, 5, 5);
 1477 m_layerTreeHost->setDeviceScaleFactor(7);
14671478
14681479 postSetNeedsCommitToMainThread();
14691480 }

@@public:
14731484 EXPECT_EQ(IntSize(20, 20), impl->viewportSize());
14741485 EXPECT_EQ(Color::gray, impl->backgroundColor());
14751486 EXPECT_EQ(5, impl->pageScale());
 1487 EXPECT_EQ(7, impl->deviceScaleFactor());
14761488
14771489 endTest();
14781490 }

@@public:
17441756 void notifySyncRequired() { }
17451757};
17461758
 1759class CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers : public CCLayerTreeHostTest {
 1760public:
 1761
 1762 CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
 1763 : m_rootLayer(ContentLayerChromium::create(&m_delegate))
 1764 , m_childLayer(ContentLayerChromium::create(&m_delegate))
 1765 {
 1766 }
 1767
 1768 virtual void beginTest()
 1769 {
 1770 // The device viewport should be scaled by the device scale factor.
 1771
 1772 // Set viewport then scale factor.
 1773 m_layerTreeHost->setViewportSize(IntSize(30, 30));
 1774 m_layerTreeHost->setDeviceScaleFactor(2);
 1775 EXPECT_EQ(IntSize(30, 30), m_layerTreeHost->viewportSize());
 1776 EXPECT_EQ(IntSize(60, 60), m_layerTreeHost->deviceViewportSize());
 1777
 1778 // Set viewport after scale factor.
 1779 m_layerTreeHost->setViewportSize(IntSize(40, 40));
 1780 EXPECT_EQ(IntSize(40, 40), m_layerTreeHost->viewportSize());
 1781 EXPECT_EQ(IntSize(80, 80), m_layerTreeHost->deviceViewportSize());
 1782
 1783 m_rootLayer->addChild(m_childLayer);
 1784
 1785 m_rootLayer->setIsDrawable(true);
 1786 m_rootLayer->setBounds(IntSize(30, 30));
 1787 m_rootLayer->setAnchorPoint(FloatPoint(0, 0));
 1788 EXPECT_EQ(1, m_rootLayer->contentsScale());
 1789 EXPECT_EQ(IntSize(30, 30), m_rootLayer->contentBounds());
 1790
 1791 m_childLayer->setIsDrawable(true);
 1792 m_childLayer->setPosition(IntPoint(2, 2));
 1793 m_childLayer->setBounds(IntSize(10, 10));
 1794 m_childLayer->setAnchorPoint(FloatPoint(0, 0));
 1795 EXPECT_EQ(1, m_childLayer->contentsScale());
 1796 EXPECT_EQ(IntSize(10, 10), m_childLayer->contentBounds());
 1797
 1798 m_layerTreeHost->setRootLayer(m_rootLayer);
 1799
 1800 // Each layer's contents scale reflects the device scale factor.
 1801 EXPECT_EQ(2, m_rootLayer->contentsScale());
 1802 EXPECT_EQ(IntSize(60, 60), m_rootLayer->contentBounds());
 1803 EXPECT_EQ(2, m_childLayer->contentsScale());
 1804 EXPECT_EQ(IntSize(20, 20), m_childLayer->contentBounds());
 1805 }
 1806
 1807 virtual void commitCompleteOnCCThread(CCLayerTreeHostImpl* impl)
 1808 {
 1809 // Get access to protected methods.
 1810 MockLayerTreeHostImpl* mockImpl = static_cast<MockLayerTreeHostImpl*>(impl);
 1811
 1812 // Should only do one commit.
 1813 EXPECT_EQ(0, impl->sourceFrameNumber());
 1814 // Device scale factor should come over to impl.
 1815 EXPECT_EQ(2, impl->deviceScaleFactor());
 1816
 1817 // Both layers are on impl.
 1818 ASSERT_EQ(1u, impl->rootLayer()->children().size());
 1819
 1820 // Device viewport is scaled.
 1821 EXPECT_EQ(IntSize(40, 40), impl->viewportSize());
 1822 EXPECT_EQ(IntSize(80, 80), impl->deviceViewportSize());
 1823
 1824 CCLayerImpl* root = impl->rootLayer();
 1825 CCLayerImpl* child = impl->rootLayer()->children()[0].get();
 1826
 1827 // Content sizes are scaled.
 1828 EXPECT_EQ(IntSize(60, 60), root->contentBounds());
 1829 EXPECT_EQ(IntSize(20, 20), child->contentBounds());
 1830
 1831 // Positions remain in DIP.
 1832 EXPECT_EQ(IntPoint(0, 0), root->position());
 1833 EXPECT_EQ(IntPoint(2, 2), child->position());
 1834
 1835 // Compute all the layer transforms for the frame.
 1836 MockLayerTreeHostImpl::CCLayerList renderSurfaceLayerList;
 1837 mockImpl->calculateRenderSurfaceLayerList(renderSurfaceLayerList);
 1838
 1839 // Both layers should be drawing into the root render surface.
 1840 ASSERT_EQ(1u, renderSurfaceLayerList.size());
 1841 ASSERT_EQ(root->renderSurface(), renderSurfaceLayerList[0]->renderSurface());
 1842 ASSERT_EQ(2u, root->renderSurface()->layerList().size());
 1843
 1844 // The root render surface is the size of the viewport.
 1845 EXPECT_EQ_RECT(IntRect(0, 0, 80, 80), root->renderSurface()->contentRect());
 1846
 1847 TransformationMatrix scaleTransform;
 1848 scaleTransform.scale(impl->deviceScaleFactor());
 1849
 1850 // The root layer is scaled by 2x.
 1851 TransformationMatrix rootScreenSpaceTransform = scaleTransform;
 1852 TransformationMatrix rootDrawTransform = scaleTransform;
 1853 rootDrawTransform.translate(root->bounds().width() * 0.5, root->bounds().height() * 0.5);
 1854
 1855 EXPECT_EQ(rootDrawTransform, root->drawTransform());
 1856 EXPECT_EQ(rootScreenSpaceTransform, root->screenSpaceTransform());
 1857
 1858 // The child is at position 2,2, so translate by 2,2 before applying the scale by 2x.
 1859 TransformationMatrix childScreenSpaceTransform = scaleTransform;
 1860 childScreenSpaceTransform.translate(2, 2);
 1861 TransformationMatrix childDrawTransform = scaleTransform;
 1862 childDrawTransform.translate(2, 2);
 1863 childDrawTransform.translate(child->bounds().width() * 0.5, child->bounds().height() * 0.5);
 1864
 1865 EXPECT_EQ(childDrawTransform, child->drawTransform());
 1866 EXPECT_EQ(childScreenSpaceTransform, child->screenSpaceTransform());
 1867
 1868 endTest();
 1869 }
 1870
 1871 virtual void afterTest()
 1872 {
 1873 m_rootLayer.clear();
 1874 m_childLayer.clear();
 1875 }
 1876
 1877private:
 1878 MockContentLayerDelegate m_delegate;
 1879 RefPtr<ContentLayerChromium> m_rootLayer;
 1880 RefPtr<ContentLayerChromium> m_childLayer;
 1881};
 1882
 1883TEST_F(CCLayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers, runMultiThread)
 1884{
 1885 runTest(true);
 1886}
 1887
17471888// Verify atomicity of commits and reuse of textures.
17481889class CCLayerTreeHostTestAtomicCommit : public CCLayerTreeHostTest {
17491890public:

@@TEST_F(CCLayerTreeHostTestAtomicCommitWithPartialUpdate, runMultiThread)
19972138 runTest(true);
19982139}
19992140
2000 #define EXPECT_EQ_RECT(a, b) \
2001  EXPECT_EQ(a.x(), b.x()); \
2002  EXPECT_EQ(a.y(), b.y()); \
2003  EXPECT_EQ(a.width(), b.width()); \
2004  EXPECT_EQ(a.height(), b.height());
2005 
20062141class TestLayerChromium : public LayerChromium {
20072142public:
20082143 static PassRefPtr<TestLayerChromium> create() { return adoptRef(new TestLayerChromium()); }

Source/WebKit/chromium/tests/LayerChromiumTest.cpp

@@private:
583583 FloatRect m_lastNeedsDisplayRect;
584584};
585585
586 TEST_F(LayerChromiumTest, checkContentsScaleChangeTriggersNeedsDisplay)
 586TEST_F(LayerChromiumTest, checkPageScaleChangeTriggersNeedsDisplay)
587587{
588588 RefPtr<LayerChromiumWithContentScaling> testLayer = adoptRef(new LayerChromiumWithContentScaling());
589589 testLayer->setLayerTreeHost(m_layerTreeHost.get());

@@TEST_F(LayerChromiumTest, checkContentsScaleChangeTriggersNeedsDisplay)
594594 testLayer->resetNeedsDisplay();
595595 EXPECT_FALSE(testLayer->needsDisplay());
596596
597  EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setContentsScale(testLayer->contentsScale() + 1.f));
 597 EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setPageScaleFactor(testLayer->pageScaleFactor() + 1.f));
598598 EXPECT_TRUE(testLayer->needsDisplay());
599599 EXPECT_FLOAT_RECT_EQ(FloatRect(0, 0, 320, 240), testLayer->lastNeedsDisplayRect());
600600}

Source/WebKit/chromium/tests/LayerRendererChromiumTest.cpp

@@public:
7373 }
7474
7575 // LayerRendererChromiumClient methods.
76  virtual const IntSize& viewportSize() const OVERRIDE { static IntSize fakeSize; return fakeSize; }
 76 virtual const IntSize& deviceViewportSize() const OVERRIDE { static IntSize fakeSize; return fakeSize; }
7777 virtual const CCSettings& settings() const OVERRIDE { static CCSettings fakeSettings; return fakeSettings; }
7878 virtual void didLoseContext() OVERRIDE { }
7979 virtual void onSwapBuffersComplete() OVERRIDE { }

Source/WebKit/chromium/tests/TiledLayerChromiumTest.cpp

@@TEST(TiledLayerChromiumTest, verifyInvalidationWhenContentsScaleChanges)
767767
768768 // Change the contents scale and verify that the content rectangle requiring painting
769769 // is not scaled.
770  layer->setContentsScale(2);
 770 layer->setPageScaleFactor(2);
771771 EXPECT_FLOAT_RECT_EQ(FloatRect(0, 0, 100, 100), layer->lastNeedsDisplayRect());
772772
773773 // The impl side should get 2x2 tiles now.

@@TEST(TiledLayerChromiumTest, tilesPaintedWithOcclusionAndScaling)
11771177 // This makes sure the painting works when the content space is scaled to
11781178 // a different layer space. In this case tiles are scaled to be 200x200
11791179 // pixels, which means none should be occluded.
1180  layer->setContentsScale(0.5);
 1180 layer->setPageScaleFactor(0.5);
11811181 layer->setBounds(IntSize(600, 600));
11821182 layer->setDrawTransform(TransformationMatrix(1, 0, 0, 1, layer->bounds().width() / 2.0, layer->bounds().height() / 2.0));
11831183