Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 11189043: cc: Rename cc classes and members to match filenames (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "CCLayerTreeHostImpl.h" 7 #include "CCLayerTreeHostImpl.h"
8 8
9 #include "CCAppendQuadsData.h" 9 #include "CCAppendQuadsData.h"
10 #include "CCDamageTracker.h" 10 #include "CCDamageTracker.h"
(...skipping 20 matching lines...) Expand all
31 #include "TraceEvent.h" 31 #include "TraceEvent.h"
32 #include "base/basictypes.h" 32 #include "base/basictypes.h"
33 #include "cc/texture_uploader.h" 33 #include "cc/texture_uploader.h"
34 #include <wtf/CurrentTime.h> 34 #include <wtf/CurrentTime.h>
35 #include <algorithm> 35 #include <algorithm>
36 36
37 using WebKit::WebTransformationMatrix; 37 using WebKit::WebTransformationMatrix;
38 38
39 namespace { 39 namespace {
40 40
41 void didVisibilityChange(cc::CCLayerTreeHostImpl* id, bool visible) 41 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible)
42 { 42 {
43 if (visible) { 43 if (visible) {
44 TRACE_EVENT_ASYNC_BEGIN1("webkit", "CCLayerTreeHostImpl::setVisible", id , "CCLayerTreeHostImpl", id); 44 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id, "LayerTreeHostImpl", id);
45 return; 45 return;
46 } 46 }
47 47
48 TRACE_EVENT_ASYNC_END0("webkit", "CCLayerTreeHostImpl::setVisible", id); 48 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::setVisible", id);
49 } 49 }
50 50
51 } // namespace 51 } // namespace
52 52
53 namespace cc { 53 namespace cc {
54 54
55 CCPinchZoomViewport::CCPinchZoomViewport() 55 PinchZoomViewport::PinchZoomViewport()
56 : m_pageScaleFactor(1) 56 : m_pageScaleFactor(1)
57 , m_pageScaleDelta(1) 57 , m_pageScaleDelta(1)
58 , m_sentPageScaleDelta(1) 58 , m_sentPageScaleDelta(1)
59 , m_minPageScaleFactor(0) 59 , m_minPageScaleFactor(0)
60 , m_maxPageScaleFactor(0) 60 , m_maxPageScaleFactor(0)
61 { 61 {
62 } 62 }
63 63
64 float CCPinchZoomViewport::totalPageScaleFactor() const 64 float PinchZoomViewport::totalPageScaleFactor() const
65 { 65 {
66 return m_pageScaleFactor * m_pageScaleDelta; 66 return m_pageScaleFactor * m_pageScaleDelta;
67 } 67 }
68 68
69 void CCPinchZoomViewport::setPageScaleDelta(float delta) 69 void PinchZoomViewport::setPageScaleDelta(float delta)
70 { 70 {
71 // Clamp to the current min/max limits. 71 // Clamp to the current min/max limits.
72 float totalPageScaleFactor = m_pageScaleFactor * delta; 72 float totalPageScaleFactor = m_pageScaleFactor * delta;
73 if (m_minPageScaleFactor && totalPageScaleFactor < m_minPageScaleFactor) 73 if (m_minPageScaleFactor && totalPageScaleFactor < m_minPageScaleFactor)
74 delta = m_minPageScaleFactor / m_pageScaleFactor; 74 delta = m_minPageScaleFactor / m_pageScaleFactor;
75 else if (m_maxPageScaleFactor && totalPageScaleFactor > m_maxPageScaleFactor ) 75 else if (m_maxPageScaleFactor && totalPageScaleFactor > m_maxPageScaleFactor )
76 delta = m_maxPageScaleFactor / m_pageScaleFactor; 76 delta = m_maxPageScaleFactor / m_pageScaleFactor;
77 77
78 if (delta == m_pageScaleDelta) 78 if (delta == m_pageScaleDelta)
79 return; 79 return;
80 80
81 m_pageScaleDelta = delta; 81 m_pageScaleDelta = delta;
82 } 82 }
83 83
84 bool CCPinchZoomViewport::setPageScaleFactorAndLimits(float pageScaleFactor, flo at minPageScaleFactor, float maxPageScaleFactor) 84 bool PinchZoomViewport::setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor)
85 { 85 {
86 ASSERT(pageScaleFactor); 86 ASSERT(pageScaleFactor);
87 87
88 if (m_sentPageScaleDelta == 1 && pageScaleFactor == m_pageScaleFactor && min PageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleF actor) 88 if (m_sentPageScaleDelta == 1 && pageScaleFactor == m_pageScaleFactor && min PageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleF actor)
89 return false; 89 return false;
90 90
91 m_minPageScaleFactor = minPageScaleFactor; 91 m_minPageScaleFactor = minPageScaleFactor;
92 m_maxPageScaleFactor = maxPageScaleFactor; 92 m_maxPageScaleFactor = maxPageScaleFactor;
93 93
94 m_pageScaleFactor = pageScaleFactor; 94 m_pageScaleFactor = pageScaleFactor;
95 return true; 95 return true;
96 } 96 }
97 97
98 FloatRect CCPinchZoomViewport::bounds() const 98 FloatRect PinchZoomViewport::bounds() const
99 { 99 {
100 FloatSize scaledViewportSize = m_layoutViewportSize; 100 FloatSize scaledViewportSize = m_layoutViewportSize;
101 scaledViewportSize.scale(1 / totalPageScaleFactor()); 101 scaledViewportSize.scale(1 / totalPageScaleFactor());
102 102
103 FloatRect bounds(FloatPoint(0, 0), scaledViewportSize); 103 FloatRect bounds(FloatPoint(0, 0), scaledViewportSize);
104 bounds.setLocation(m_pinchViewportScrollDelta); 104 bounds.setLocation(m_pinchViewportScrollDelta);
105 105
106 return bounds; 106 return bounds;
107 } 107 }
108 108
109 FloatSize CCPinchZoomViewport::applyScroll(FloatSize& delta) 109 FloatSize PinchZoomViewport::applyScroll(FloatSize& delta)
110 { 110 {
111 FloatSize overflow; 111 FloatSize overflow;
112 FloatRect pinchedBounds = bounds(); 112 FloatRect pinchedBounds = bounds();
113 113
114 pinchedBounds.move(delta); 114 pinchedBounds.move(delta);
115 if (pinchedBounds.x() < 0) { 115 if (pinchedBounds.x() < 0) {
116 overflow.setWidth(pinchedBounds.x()); 116 overflow.setWidth(pinchedBounds.x());
117 pinchedBounds.setX(0); 117 pinchedBounds.setX(0);
118 } 118 }
119 119
(...skipping 13 matching lines...) Expand all
133 overflow.setHeight( 133 overflow.setHeight(
134 pinchedBounds.maxY() - m_layoutViewportSize.height()); 134 pinchedBounds.maxY() - m_layoutViewportSize.height());
135 pinchedBounds.move( 135 pinchedBounds.move(
136 0, m_layoutViewportSize.height() - pinchedBounds.maxY()); 136 0, m_layoutViewportSize.height() - pinchedBounds.maxY());
137 } 137 }
138 m_pinchViewportScrollDelta = pinchedBounds.location(); 138 m_pinchViewportScrollDelta = pinchedBounds.location();
139 139
140 return overflow; 140 return overflow;
141 } 141 }
142 142
143 WebTransformationMatrix CCPinchZoomViewport::implTransform() const 143 WebTransformationMatrix PinchZoomViewport::implTransform() const
144 { 144 {
145 WebTransformationMatrix transform; 145 WebTransformationMatrix transform;
146 transform.scale(m_pageScaleDelta); 146 transform.scale(m_pageScaleDelta);
147 147
148 // If the pinch state is applied in the impl, then push it to the 148 // If the pinch state is applied in the impl, then push it to the
149 // impl transform, otherwise the scale is handled by WebCore. 149 // impl transform, otherwise the scale is handled by WebCore.
150 if (CCSettings::pageScalePinchZoomEnabled()) { 150 if (Settings::pageScalePinchZoomEnabled()) {
151 transform.scale(m_pageScaleFactor); 151 transform.scale(m_pageScaleFactor);
152 transform.translate(-m_pinchViewportScrollDelta.x(), 152 transform.translate(-m_pinchViewportScrollDelta.x(),
153 -m_pinchViewportScrollDelta.y()); 153 -m_pinchViewportScrollDelta.y());
154 } 154 }
155 155
156 return transform; 156 return transform;
157 } 157 }
158 158
159 class CCLayerTreeHostImplTimeSourceAdapter : public CCTimeSourceClient { 159 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
160 public: 160 public:
161 static scoped_ptr<CCLayerTreeHostImplTimeSourceAdapter> create(CCLayerTreeHo stImpl* layerTreeHostImpl, scoped_refptr<CCDelayBasedTimeSource> timeSource) 161 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> create(LayerTreeHostIm pl* layerTreeHostImpl, scoped_refptr<DelayBasedTimeSource> timeSource)
162 { 162 {
163 return make_scoped_ptr(new CCLayerTreeHostImplTimeSourceAdapter(layerTre eHostImpl, timeSource)); 163 return make_scoped_ptr(new LayerTreeHostImplTimeSourceAdapter(layerTreeH ostImpl, timeSource));
164 } 164 }
165 virtual ~CCLayerTreeHostImplTimeSourceAdapter() 165 virtual ~LayerTreeHostImplTimeSourceAdapter()
166 { 166 {
167 m_timeSource->setClient(0); 167 m_timeSource->setClient(0);
168 m_timeSource->setActive(false); 168 m_timeSource->setActive(false);
169 } 169 }
170 170
171 virtual void onTimerTick() OVERRIDE 171 virtual void onTimerTick() OVERRIDE
172 { 172 {
173 // FIXME: We require that animate be called on the impl thread. This 173 // FIXME: We require that animate be called on the impl thread. This
174 // avoids asserts in single threaded mode. Ideally background ticking 174 // avoids asserts in single threaded mode. Ideally background ticking
175 // would be handled by the proxy/scheduler and this could be removed. 175 // would be handled by the proxy/scheduler and this could be removed.
176 DebugScopedSetImplThread impl; 176 DebugScopedSetImplThread impl;
177 177
178 m_layerTreeHostImpl->animate(monotonicallyIncreasingTime(), currentTime( )); 178 m_layerTreeHostImpl->animate(monotonicallyIncreasingTime(), currentTime( ));
179 } 179 }
180 180
181 void setActive(bool active) 181 void setActive(bool active)
182 { 182 {
183 if (active != m_timeSource->active()) 183 if (active != m_timeSource->active())
184 m_timeSource->setActive(active); 184 m_timeSource->setActive(active);
185 } 185 }
186 186
187 private: 187 private:
188 CCLayerTreeHostImplTimeSourceAdapter(CCLayerTreeHostImpl* layerTreeHostImpl, scoped_refptr<CCDelayBasedTimeSource> timeSource) 188 LayerTreeHostImplTimeSourceAdapter(LayerTreeHostImpl* layerTreeHostImpl, sco ped_refptr<DelayBasedTimeSource> timeSource)
189 : m_layerTreeHostImpl(layerTreeHostImpl) 189 : m_layerTreeHostImpl(layerTreeHostImpl)
190 , m_timeSource(timeSource) 190 , m_timeSource(timeSource)
191 { 191 {
192 m_timeSource->setClient(this); 192 m_timeSource->setClient(this);
193 } 193 }
194 194
195 CCLayerTreeHostImpl* m_layerTreeHostImpl; 195 LayerTreeHostImpl* m_layerTreeHostImpl;
196 scoped_refptr<CCDelayBasedTimeSource> m_timeSource; 196 scoped_refptr<DelayBasedTimeSource> m_timeSource;
197 197
198 DISALLOW_COPY_AND_ASSIGN(CCLayerTreeHostImplTimeSourceAdapter); 198 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter);
199 }; 199 };
200 200
201 CCLayerTreeHostImpl::FrameData::FrameData() 201 LayerTreeHostImpl::FrameData::FrameData()
202 { 202 {
203 } 203 }
204 204
205 CCLayerTreeHostImpl::FrameData::~FrameData() 205 LayerTreeHostImpl::FrameData::~FrameData()
206 { 206 {
207 } 207 }
208 208
209 scoped_ptr<CCLayerTreeHostImpl> CCLayerTreeHostImpl::create(const CCLayerTreeSet tings& settings, CCLayerTreeHostImplClient* client) 209 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::create(const LayerTreeSettings& settings, LayerTreeHostImplClient* client)
210 { 210 {
211 return make_scoped_ptr(new CCLayerTreeHostImpl(settings, client)); 211 return make_scoped_ptr(new LayerTreeHostImpl(settings, client));
212 } 212 }
213 213
214 CCLayerTreeHostImpl::CCLayerTreeHostImpl(const CCLayerTreeSettings& settings, CC LayerTreeHostImplClient* client) 214 LayerTreeHostImpl::LayerTreeHostImpl(const LayerTreeSettings& settings, LayerTre eHostImplClient* client)
215 : m_client(client) 215 : m_client(client)
216 , m_sourceFrameNumber(-1) 216 , m_sourceFrameNumber(-1)
217 , m_rootScrollLayerImpl(0) 217 , m_rootScrollLayerImpl(0)
218 , m_currentlyScrollingLayerImpl(0) 218 , m_currentlyScrollingLayerImpl(0)
219 , m_hudLayerImpl(0) 219 , m_hudLayerImpl(0)
220 , m_scrollingLayerIdFromPreviousTree(-1) 220 , m_scrollingLayerIdFromPreviousTree(-1)
221 , m_scrollDeltaIsInScreenSpace(false) 221 , m_scrollDeltaIsInScreenSpace(false)
222 , m_settings(settings) 222 , m_settings(settings)
223 , m_deviceScaleFactor(1) 223 , m_deviceScaleFactor(1)
224 , m_visible(true) 224 , m_visible(true)
225 , m_contentsTexturesPurged(false) 225 , m_contentsTexturesPurged(false)
226 , m_memoryAllocationLimitBytes(CCPrioritizedTextureManager::defaultMemoryAll ocationLimit()) 226 , m_memoryAllocationLimitBytes(PrioritizedTextureManager::defaultMemoryAlloc ationLimit())
227 , m_backgroundColor(0) 227 , m_backgroundColor(0)
228 , m_hasTransparentBackground(false) 228 , m_hasTransparentBackground(false)
229 , m_needsAnimateLayers(false) 229 , m_needsAnimateLayers(false)
230 , m_pinchGestureActive(false) 230 , m_pinchGestureActive(false)
231 , m_fpsCounter(CCFrameRateCounter::create()) 231 , m_fpsCounter(FrameRateCounter::create())
232 , m_debugRectHistory(CCDebugRectHistory::create()) 232 , m_debugRectHistory(DebugRectHistory::create())
233 , m_numImplThreadScrolls(0) 233 , m_numImplThreadScrolls(0)
234 , m_numMainThreadScrolls(0) 234 , m_numMainThreadScrolls(0)
235 { 235 {
236 ASSERT(CCProxy::isImplThread()); 236 ASSERT(Proxy::isImplThread());
237 didVisibilityChange(this, m_visible); 237 didVisibilityChange(this, m_visible);
238 } 238 }
239 239
240 CCLayerTreeHostImpl::~CCLayerTreeHostImpl() 240 LayerTreeHostImpl::~LayerTreeHostImpl()
241 { 241 {
242 ASSERT(CCProxy::isImplThread()); 242 ASSERT(Proxy::isImplThread());
243 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::~CCLayerTreeHostImpl()"); 243 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
244 244
245 if (m_rootLayerImpl) 245 if (m_rootLayerImpl)
246 clearRenderSurfaces(); 246 clearRenderSurfaces();
247 } 247 }
248 248
249 void CCLayerTreeHostImpl::beginCommit() 249 void LayerTreeHostImpl::beginCommit()
250 { 250 {
251 } 251 }
252 252
253 void CCLayerTreeHostImpl::commitComplete() 253 void LayerTreeHostImpl::commitComplete()
254 { 254 {
255 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::commitComplete"); 255 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete");
256 // Recompute max scroll position; must be after layer content bounds are 256 // Recompute max scroll position; must be after layer content bounds are
257 // updated. 257 // updated.
258 updateMaxScrollPosition(); 258 updateMaxScrollPosition();
259 } 259 }
260 260
261 bool CCLayerTreeHostImpl::canDraw() 261 bool LayerTreeHostImpl::canDraw()
262 { 262 {
263 // Note: If you are changing this function or any other function that might 263 // Note: If you are changing this function or any other function that might
264 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged 264 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged
265 // in the proper places and update the notifyIfCanDrawChanged test. 265 // in the proper places and update the notifyIfCanDrawChanged test.
266 266
267 if (!m_rootLayerImpl) { 267 if (!m_rootLayerImpl) {
268 TRACE_EVENT_INSTANT0("cc", "CCLayerTreeHostImpl::canDraw no root layer") ; 268 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer");
269 return false; 269 return false;
270 } 270 }
271 if (deviceViewportSize().isEmpty()) { 271 if (deviceViewportSize().isEmpty()) {
272 TRACE_EVENT_INSTANT0("cc", "CCLayerTreeHostImpl::canDraw empty viewport" ); 272 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport");
273 return false; 273 return false;
274 } 274 }
275 if (!m_renderer) { 275 if (!m_renderer) {
276 TRACE_EVENT_INSTANT0("cc", "CCLayerTreeHostImpl::canDraw no renderer"); 276 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer");
277 return false; 277 return false;
278 } 278 }
279 if (m_contentsTexturesPurged) { 279 if (m_contentsTexturesPurged) {
280 TRACE_EVENT_INSTANT0("cc", "CCLayerTreeHostImpl::canDraw contents textur es purged"); 280 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw contents textures purged");
281 return false; 281 return false;
282 } 282 }
283 return true; 283 return true;
284 } 284 }
285 285
286 CCGraphicsContext* CCLayerTreeHostImpl::context() const 286 GraphicsContext* LayerTreeHostImpl::context() const
287 { 287 {
288 return m_context.get(); 288 return m_context.get();
289 } 289 }
290 290
291 void CCLayerTreeHostImpl::animate(double monotonicTime, double wallClockTime) 291 void LayerTreeHostImpl::animate(double monotonicTime, double wallClockTime)
292 { 292 {
293 animatePageScale(monotonicTime); 293 animatePageScale(monotonicTime);
294 animateLayers(monotonicTime, wallClockTime); 294 animateLayers(monotonicTime, wallClockTime);
295 animateScrollbars(monotonicTime); 295 animateScrollbars(monotonicTime);
296 } 296 }
297 297
298 void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTime, double duration) 298 void LayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, b ool anchorPoint, float pageScale, double startTime, double duration)
299 { 299 {
300 if (!m_rootScrollLayerImpl) 300 if (!m_rootScrollLayerImpl)
301 return; 301 return;
302 302
303 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta()); 303 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta());
304 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta()); 304 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta());
305 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor(); 305 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor();
306 IntSize scaledContentSize = contentSize(); 306 IntSize scaledContentSize = contentSize();
307 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta()); 307 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta());
308 308
309 m_pageScaleAnimation = CCPageScaleAnimation::create(scrollTotal, scaleTotal, m_deviceViewportSize, scaledContentSize, startTime); 309 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, scaleTotal, m _deviceViewportSize, scaledContentSize, startTime);
310 310
311 if (anchorPoint) { 311 if (anchorPoint) {
312 IntSize windowAnchor(targetPosition); 312 IntSize windowAnchor(targetPosition);
313 windowAnchor.scale(scaleTotal / pageScale); 313 windowAnchor.scale(scaleTotal / pageScale);
314 windowAnchor -= scrollTotal; 314 windowAnchor -= scrollTotal;
315 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration); 315 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration);
316 } else 316 } else
317 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration); 317 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration);
318 318
319 m_client->setNeedsRedrawOnImplThread(); 319 m_client->setNeedsRedrawOnImplThread();
320 m_client->setNeedsCommitOnImplThread(); 320 m_client->setNeedsCommitOnImplThread();
321 } 321 }
322 322
323 void CCLayerTreeHostImpl::scheduleAnimation() 323 void LayerTreeHostImpl::scheduleAnimation()
324 { 324 {
325 m_client->setNeedsRedrawOnImplThread(); 325 m_client->setNeedsRedrawOnImplThread();
326 } 326 }
327 327
328 void CCLayerTreeHostImpl::trackDamageForAllSurfaces(CCLayerImpl* rootDrawLayer, const CCLayerList& renderSurfaceLayerList) 328 void LayerTreeHostImpl::trackDamageForAllSurfaces(LayerImpl* rootDrawLayer, cons t LayerList& renderSurfaceLayerList)
329 { 329 {
330 // For now, we use damage tracking to compute a global scissor. To do this, we must 330 // For now, we use damage tracking to compute a global scissor. To do this, we must
331 // compute all damage tracking before drawing anything, so that we know the root 331 // compute all damage tracking before drawing anything, so that we know the root
332 // damage rect. The root damage rect is then used to scissor each surface. 332 // damage rect. The root damage rect is then used to scissor each surface.
333 333
334 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) { 334 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) {
335 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; 335 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex];
336 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); 336 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface();
337 ASSERT(renderSurface); 337 ASSERT(renderSurface);
338 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters()); 338 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters());
339 } 339 }
340 } 340 }
341 341
342 void CCLayerTreeHostImpl::updateRootScrollLayerImplTransform() 342 void LayerTreeHostImpl::updateRootScrollLayerImplTransform()
343 { 343 {
344 if (m_rootScrollLayerImpl) { 344 if (m_rootScrollLayerImpl) {
345 m_rootScrollLayerImpl->setImplTransform(implTransform()); 345 m_rootScrollLayerImpl->setImplTransform(implTransform());
346 } 346 }
347 } 347 }
348 348
349 void CCLayerTreeHostImpl::calculateRenderSurfaceLayerList(CCLayerList& renderSur faceLayerList) 349 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface LayerList)
350 { 350 {
351 ASSERT(renderSurfaceLayerList.empty()); 351 ASSERT(renderSurfaceLayerList.empty());
352 ASSERT(m_rootLayerImpl); 352 ASSERT(m_rootLayerImpl);
353 ASSERT(m_renderer); // For maxTextureSize. 353 ASSERT(m_renderer); // For maxTextureSize.
354 354
355 { 355 {
356 updateRootScrollLayerImplTransform(); 356 updateRootScrollLayerImplTransform();
357 357
358 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::calcDrawEtc"); 358 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc");
359 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities(). maxTextureSize, renderSurfaceLayerList); 359 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi ceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities().ma xTextureSize, renderSurfaceLayerList);
360 360
361 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; 361 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ;
362 } 362 }
363 } 363 }
364 364
365 void CCLayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<CCRenderPass> r enderPass) 365 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass)
366 { 366 {
367 CCRenderPass* pass = renderPass.get(); 367 RenderPass* pass = renderPass.get();
368 renderPasses.push_back(pass); 368 renderPasses.push_back(pass);
369 renderPassesById.set(pass->id(), renderPass.Pass()); 369 renderPassesById.set(pass->id(), renderPass.Pass());
370 } 370 }
371 371
372 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame) 372 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
373 { 373 {
374 ASSERT(frame.renderPasses.empty()); 374 ASSERT(frame.renderPasses.empty());
375 375
376 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); 376 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList);
377 377
378 TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurf aceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerLi st->size())); 378 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList ->size()));
379 379
380 // Create the render passes in dependency order. 380 // Create the render passes in dependency order.
381 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) { 381 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) {
382 CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfac eIndex]; 382 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI ndex];
383 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); 383 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame);
384 } 384 }
385 385
386 bool recordMetricsForFrame = true; // FIXME: In the future, disable this whe n about:tracing is off. 386 bool recordMetricsForFrame = true; // FIXME: In the future, disable this whe n about:tracing is off.
387 CCOcclusionTrackerImpl occlusionTracker(m_rootLayerImpl->renderSurface()->co ntentRect(), recordMetricsForFrame); 387 OcclusionTrackerImpl occlusionTracker(m_rootLayerImpl->renderSurface()->cont entRect(), recordMetricsForFrame);
388 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS ize); 388 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS ize);
389 389
390 if (settings().showOccludingRects) 390 if (settings().showOccludingRects)
391 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS creenSpaceRects); 391 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS creenSpaceRects);
392 392
393 // Add quads to the Render passes in FrontToBack order to allow for testing occlusion and performing culling during the tree walk. 393 // Add quads to the Render passes in FrontToBack order to allow for testing occlusion and performing culling during the tree walk.
394 typedef CCLayerIterator<CCLayerImpl, std::vector<CCLayerImpl*>, CCRenderSurf ace, CCLayerIteratorActions::FrontToBack> CCLayerIteratorType; 394 typedef LayerIterator<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl, LayerIteratorActions::FrontToBack> LayerIteratorType;
395 395
396 // Typically when we are missing a texture and use a checkerboard quad, we s till draw the frame. However when the layer being 396 // Typically when we are missing a texture and use a checkerboard quad, we s till draw the frame. However when the layer being
397 // checkerboarded is moving due to an impl-animation, we drop the frame to a void flashing due to the texture suddenly appearing 397 // checkerboarded is moving due to an impl-animation, we drop the frame to a void flashing due to the texture suddenly appearing
398 // in the future. 398 // in the future.
399 bool drawFrame = true; 399 bool drawFrame = true;
400 400
401 CCLayerIteratorType end = CCLayerIteratorType::end(frame.renderSurfaceLayerL ist); 401 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList) ;
402 for (CCLayerIteratorType it = CCLayerIteratorType::begin(frame.renderSurface LayerList); it != end; ++it) { 402 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye rList); it != end; ++it) {
403 CCRenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->ren derSurface()->renderPassId(); 403 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende rSurface()->renderPassId();
404 CCRenderPass* targetRenderPass = frame.renderPassesById.get(targetRender PassId); 404 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa ssId);
405 405
406 occlusionTracker.enterLayer(it); 406 occlusionTracker.enterLayer(it);
407 407
408 CCAppendQuadsData appendQuadsData(targetRenderPass->id()); 408 AppendQuadsData appendQuadsData(targetRenderPass->id());
409 409
410 if (it.representsContributingRenderSurface()) { 410 if (it.representsContributingRenderSurface()) {
411 CCRenderPass::Id contributingRenderPassId = it->renderSurface()->ren derPassId(); 411 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende rPassId();
412 CCRenderPass* contributingRenderPass = frame.renderPassesById.get(co ntributingRenderPassId); 412 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont ributingRenderPassId);
413 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing RenderPass, &occlusionTracker, appendQuadsData); 413 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing RenderPass, &occlusionTracker, appendQuadsData);
414 } else if (it.representsItself() && !it->visibleContentRect().isEmpty()) { 414 } else if (it.representsItself() && !it->visibleContentRect().isEmpty()) {
415 bool hasOcclusionFromOutsideTargetSurface; 415 bool hasOcclusionFromOutsideTargetSurface;
416 if (occlusionTracker.occluded(*it, it->visibleContentRect(), &hasOcc lusionFromOutsideTargetSurface)) 416 if (occlusionTracker.occluded(*it, it->visibleContentRect(), &hasOcc lusionFromOutsideTargetSurface))
417 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu sionFromOutsideTargetSurface; 417 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu sionFromOutsideTargetSurface;
418 else { 418 else {
419 it->willDraw(m_resourceProvider.get()); 419 it->willDraw(m_resourceProvider.get());
420 frame.willDrawLayers.push_back(*it); 420 frame.willDrawLayers.push_back(*it);
421 421
422 if (it->hasContributingDelegatedRenderPasses()) { 422 if (it->hasContributingDelegatedRenderPasses()) {
423 CCRenderPass::Id contributingRenderPassId = it->firstContrib utingRenderPassId(); 423 RenderPass::Id contributingRenderPassId = it->firstContribut ingRenderPassId();
424 while (frame.renderPassesById.contains(contributingRenderPas sId)) { 424 while (frame.renderPassesById.contains(contributingRenderPas sId)) {
425 CCRenderPass* renderPass = frame.renderPassesById.get(co ntributingRenderPassId); 425 RenderPass* renderPass = frame.renderPassesById.get(cont ributingRenderPassId);
426 426
427 CCAppendQuadsData appendQuadsData(renderPass->id()); 427 AppendQuadsData appendQuadsData(renderPass->id());
428 renderPass->appendQuadsForLayer(*it, &occlusionTracker, appendQuadsData); 428 renderPass->appendQuadsForLayer(*it, &occlusionTracker, appendQuadsData);
429 429
430 contributingRenderPassId = it->nextContributingRenderPas sId(contributingRenderPassId); 430 contributingRenderPassId = it->nextContributingRenderPas sId(contributingRenderPassId);
431 } 431 }
432 } 432 }
433 433
434 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ap pendQuadsData); 434 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ap pendQuadsData);
435 } 435 }
436 } 436 }
437 437
438 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) 438 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface)
439 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true); 439 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true);
440 440
441 if (appendQuadsData.hadMissingTiles) { 441 if (appendQuadsData.hadMissingTiles) {
442 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin g() || it->drawTransformIsAnimating(); 442 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin g() || it->drawTransformIsAnimating();
443 if (layerHasAnimatingTransform || CCSettings::jankInsteadOfCheckerbo ard()) 443 if (layerHasAnimatingTransform || Settings::jankInsteadOfCheckerboar d())
444 drawFrame = false; 444 drawFrame = false;
445 } 445 }
446 446
447 occlusionTracker.leaveLayer(it); 447 occlusionTracker.leaveLayer(it);
448 } 448 }
449 449
450 #if !ASSERT_DISABLED 450 #if !ASSERT_DISABLED
451 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { 451 for (size_t i = 0; i < frame.renderPasses.size(); ++i) {
452 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) 452 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j)
453 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >= 0); 453 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >= 0);
454 ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id())); 454 ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id()));
455 } 455 }
456 #endif 456 #endif
457 457
458 if (!m_hasTransparentBackground) { 458 if (!m_hasTransparentBackground) {
459 frame.renderPasses.back()->setHasTransparentBackground(false); 459 frame.renderPasses.back()->setHasTransparentBackground(false);
460 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker); 460 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker);
461 } 461 }
462 462
463 if (drawFrame) 463 if (drawFrame)
464 occlusionTracker.overdrawMetrics().recordMetrics(this); 464 occlusionTracker.overdrawMetrics().recordMetrics(this);
465 465
466 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); 466 removeRenderPasses(CullRenderPassesWithNoQuads(), frame);
467 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); 467 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses);
468 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); 468 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame);
469 469
470 return drawFrame; 470 return drawFrame;
471 } 471 }
472 472
473 void CCLayerTreeHostImpl::animateLayersRecursive(CCLayerImpl* current, double mo notonicTime, double wallClockTime, CCAnimationEventsVector* events, bool& didAni mate, bool& needsAnimateLayers) 473 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, double monoto nicTime, double wallClockTime, AnimationEventsVector* events, bool& didAnimate, bool& needsAnimateLayers)
474 { 474 {
475 bool subtreeNeedsAnimateLayers = false; 475 bool subtreeNeedsAnimateLayers = false;
476 476
477 CCLayerAnimationController* currentController = current->layerAnimationContr oller(); 477 LayerAnimationController* currentController = current->layerAnimationControl ler();
478 478
479 bool hadActiveAnimation = currentController->hasActiveAnimation(); 479 bool hadActiveAnimation = currentController->hasActiveAnimation();
480 currentController->animate(monotonicTime, events); 480 currentController->animate(monotonicTime, events);
481 bool startedAnimation = events->size() > 0; 481 bool startedAnimation = events->size() > 0;
482 482
483 // We animated if we either ticked a running animation, or started a new ani mation. 483 // We animated if we either ticked a running animation, or started a new ani mation.
484 if (hadActiveAnimation || startedAnimation) 484 if (hadActiveAnimation || startedAnimation)
485 didAnimate = true; 485 didAnimate = true;
486 486
487 // If the current controller still has an active animation, we must continue animating layers. 487 // If the current controller still has an active animation, we must continue animating layers.
488 if (currentController->hasActiveAnimation()) 488 if (currentController->hasActiveAnimation())
489 subtreeNeedsAnimateLayers = true; 489 subtreeNeedsAnimateLayers = true;
490 490
491 for (size_t i = 0; i < current->children().size(); ++i) { 491 for (size_t i = 0; i < current->children().size(); ++i) {
492 bool childNeedsAnimateLayers = false; 492 bool childNeedsAnimateLayers = false;
493 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT ime, events, didAnimate, childNeedsAnimateLayers); 493 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT ime, events, didAnimate, childNeedsAnimateLayers);
494 if (childNeedsAnimateLayers) 494 if (childNeedsAnimateLayers)
495 subtreeNeedsAnimateLayers = true; 495 subtreeNeedsAnimateLayers = true;
496 } 496 }
497 497
498 needsAnimateLayers = subtreeNeedsAnimateLayers; 498 needsAnimateLayers = subtreeNeedsAnimateLayers;
499 } 499 }
500 500
501 void CCLayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) 501 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled)
502 { 502 {
503 // Lazily create the timeSource adapter so that we can vary the interval for testing. 503 // Lazily create the timeSource adapter so that we can vary the interval for testing.
504 if (!m_timeSourceClientAdapter) 504 if (!m_timeSourceClientAdapter)
505 m_timeSourceClientAdapter = CCLayerTreeHostImplTimeSourceAdapter::create (this, CCDelayBasedTimeSource::create(lowFrequencyAnimationInterval(), CCProxy:: currentThread())); 505 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), Proxy::curren tThread()));
506 506
507 m_timeSourceClientAdapter->setActive(enabled); 507 m_timeSourceClientAdapter->setActive(enabled);
508 } 508 }
509 509
510 IntSize CCLayerTreeHostImpl::contentSize() const 510 IntSize LayerTreeHostImpl::contentSize() const
511 { 511 {
512 // TODO(aelias): Hardcoding the first child here is weird. Think of 512 // TODO(aelias): Hardcoding the first child here is weird. Think of
513 // a cleaner way to get the contentBounds on the Impl side. 513 // a cleaner way to get the contentBounds on the Impl side.
514 if (!m_rootScrollLayerImpl || m_rootScrollLayerImpl->children().isEmpty()) 514 if (!m_rootScrollLayerImpl || m_rootScrollLayerImpl->children().isEmpty())
515 return IntSize(); 515 return IntSize();
516 return m_rootScrollLayerImpl->children()[0]->contentBounds(); 516 return m_rootScrollLayerImpl->children()[0]->contentBounds();
517 } 517 }
518 518
519 static inline CCRenderPass* findRenderPassById(CCRenderPass::Id renderPassId, co nst CCLayerTreeHostImpl::FrameData& frame) 519 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const LayerTreeHostImpl::FrameData& frame)
520 { 520 {
521 CCRenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(rende rPassId); 521 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP assId);
522 ASSERT(it != frame.renderPassesById.end()); 522 ASSERT(it != frame.renderPassesById.end());
523 return it->second; 523 return it->second;
524 } 524 }
525 525
526 static void removeRenderPassesRecursive(CCRenderPass::Id removeRenderPassId, CCL ayerTreeHostImpl::FrameData& frame) 526 static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer TreeHostImpl::FrameData& frame)
527 { 527 {
528 CCRenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, fram e); 528 RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame) ;
529 CCRenderPassList& renderPasses = frame.renderPasses; 529 RenderPassList& renderPasses = frame.renderPasses;
530 CCRenderPassList::iterator toRemove = std::find(renderPasses.begin(), render Passes.end(), removeRenderPass); 530 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa sses.end(), removeRenderPass);
531 531
532 // The pass was already removed by another quad - probably the original, and we are the replica. 532 // The pass was already removed by another quad - probably the original, and we are the replica.
533 if (toRemove == renderPasses.end()) 533 if (toRemove == renderPasses.end())
534 return; 534 return;
535 535
536 const CCRenderPass* removedPass = *toRemove; 536 const RenderPass* removedPass = *toRemove;
537 frame.renderPasses.erase(toRemove); 537 frame.renderPasses.erase(toRemove);
538 538
539 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively. 539 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively.
540 const CCQuadList& quadList = removedPass->quadList(); 540 const QuadList& quadList = removedPass->quadList();
541 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront Begin(); 541 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe gin();
542 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { 542 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) {
543 CCDrawQuad* currentQuad = (*quadListIterator); 543 DrawQuad* currentQuad = (*quadListIterator);
544 if (currentQuad->material() != CCDrawQuad::RenderPass) 544 if (currentQuad->material() != DrawQuad::RenderPass)
545 continue; 545 continue;
546 546
547 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material Cast(currentQuad)->renderPassId(); 547 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::materialCast (currentQuad)->renderPassId();
548 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); 548 removeRenderPassesRecursive(nextRemoveRenderPassId, frame);
549 } 549 }
550 } 550 }
551 551
552 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const 552 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa ss(const RenderPassDrawQuad& quad, const FrameData&) const
553 { 553 {
554 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach edResourcesForRenderPassId(quad.renderPassId()); 554 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach edResourcesForRenderPassId(quad.renderPassId());
555 } 555 }
556 556
557 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co nst CCRenderPassDrawQuad& quad, const FrameData& frame) const 557 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons t RenderPassDrawQuad& quad, const FrameData& frame) const
558 { 558 {
559 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra me); 559 const RenderPass* renderPass = findRenderPassById(quad.renderPassId(), frame );
560 const CCRenderPassList& renderPasses = frame.renderPasses; 560 const RenderPassList& renderPasses = frame.renderPasses;
561 CCRenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), renderPasses.end(), renderPass); 561 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r enderPasses.end(), renderPass);
562 562
563 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); 563 bool renderPassAlreadyRemoved = foundPass == renderPasses.end();
564 if (renderPassAlreadyRemoved) 564 if (renderPassAlreadyRemoved)
565 return false; 565 return false;
566 566
567 // If any quad or RenderPass draws into this RenderPass, then keep it. 567 // If any quad or RenderPass draws into this RenderPass, then keep it.
568 const CCQuadList& quadList = (*foundPass)->quadList(); 568 const QuadList& quadList = (*foundPass)->quadList();
569 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { 569 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) {
570 CCDrawQuad* currentQuad = *quadListIterator; 570 DrawQuad* currentQuad = *quadListIterator;
571 571
572 if (currentQuad->material() != CCDrawQuad::RenderPass) 572 if (currentQuad->material() != DrawQuad::RenderPass)
573 return false; 573 return false;
574 574
575 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr awQuad::materialCast(currentQuad)->renderPassId(), frame); 575 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu ad::materialCast(currentQuad)->renderPassId(), frame);
576 CCRenderPassList::const_iterator foundContributingPass = std::find(rende rPasses.begin(), renderPasses.end(), contributingPass); 576 RenderPassList::const_iterator foundContributingPass = std::find(renderP asses.begin(), renderPasses.end(), contributingPass);
577 if (foundContributingPass != renderPasses.end()) 577 if (foundContributingPass != renderPasses.end())
578 return false; 578 return false;
579 } 579 }
580 return true; 580 return true;
581 } 581 }
582 582
583 // Defined for linking tests. 583 // Defined for linking tests.
584 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); 584 template void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl::CullRende rPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&);
585 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); 585 template void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl::CullRende rPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&);
586 586
587 // static 587 // static
588 template<typename RenderPassCuller> 588 template<typename RenderPassCuller>
589 void CCLayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& frame) 589 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f rame)
590 { 590 {
591 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { 591 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) {
592 const CCRenderPass* currentPass = frame.renderPasses[it]; 592 const RenderPass* currentPass = frame.renderPasses[it];
593 const CCQuadList& quadList = currentPass->quadList(); 593 const QuadList& quadList = currentPass->quadList();
594 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToF rontBegin(); 594 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro ntBegin();
595 595
596 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator ) { 596 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator ) {
597 CCDrawQuad* currentQuad = *quadListIterator; 597 DrawQuad* currentQuad = *quadListIterator;
598 598
599 if (currentQuad->material() != CCDrawQuad::RenderPass) 599 if (currentQuad->material() != DrawQuad::RenderPass)
600 continue; 600 continue;
601 601
602 CCRenderPassDrawQuad* renderPassQuad = static_cast<CCRenderPassDrawQ uad*>(currentQuad); 602 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad* >(currentQuad);
603 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) 603 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame))
604 continue; 604 continue;
605 605
606 // We are changing the vector in the middle of iteration. Because we 606 // We are changing the vector in the middle of iteration. Because we
607 // delete render passes that draw into the current pass, we are 607 // delete render passes that draw into the current pass, we are
608 // guaranteed that any data from the iterator to the end will not 608 // guaranteed that any data from the iterator to the end will not
609 // change. So, capture the iterator position from the end of the 609 // change. So, capture the iterator position from the end of the
610 // list, and restore it after the change. 610 // list, and restore it after the change.
611 int positionFromEnd = frame.renderPasses.size() - it; 611 int positionFromEnd = frame.renderPasses.size() - it;
612 removeRenderPassesRecursive(renderPassQuad->renderPassId(), frame); 612 removeRenderPassesRecursive(renderPassQuad->renderPassId(), frame);
613 it = frame.renderPasses.size() - positionFromEnd; 613 it = frame.renderPasses.size() - positionFromEnd;
614 ASSERT(it >= 0); 614 ASSERT(it >= 0);
615 } 615 }
616 } 616 }
617 } 617 }
618 618
619 bool CCLayerTreeHostImpl::prepareToDraw(FrameData& frame) 619 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame)
620 { 620 {
621 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::prepareToDraw"); 621 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw");
622 ASSERT(canDraw()); 622 ASSERT(canDraw());
623 623
624 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; 624 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList;
625 frame.renderPasses.clear(); 625 frame.renderPasses.clear();
626 frame.renderPassesById.clear(); 626 frame.renderPassesById.clear();
627 frame.renderSurfaceLayerList->clear(); 627 frame.renderSurfaceLayerList->clear();
628 frame.willDrawLayers.clear(); 628 frame.willDrawLayers.clear();
629 629
630 if (!calculateRenderPasses(frame)) 630 if (!calculateRenderPasses(frame))
631 return false; 631 return false;
632 632
633 // If we return true, then we expect drawLayers() to be called before this f unction is called again. 633 // If we return true, then we expect drawLayers() to be called before this f unction is called again.
634 return true; 634 return true;
635 } 635 }
636 636
637 void CCLayerTreeHostImpl::reduceContentsTextureMemoryOnImplThread(size_t limitBy tes) 637 void LayerTreeHostImpl::reduceContentsTextureMemoryOnImplThread(size_t limitByte s)
638 { 638 {
639 bool evictedResources = m_client->reduceContentsTextureMemoryOnImplThread(li mitBytes); 639 bool evictedResources = m_client->reduceContentsTextureMemoryOnImplThread(li mitBytes);
640 if (evictedResources) { 640 if (evictedResources) {
641 setContentsTexturesPurged(); 641 setContentsTexturesPurged();
642 m_client->setNeedsCommitOnImplThread(); 642 m_client->setNeedsCommitOnImplThread();
643 m_client->onCanDrawStateChanged(canDraw()); 643 m_client->onCanDrawStateChanged(canDraw());
644 } 644 }
645 } 645 }
646 646
647 void CCLayerTreeHostImpl::setMemoryAllocationLimitBytes(size_t bytes) 647 void LayerTreeHostImpl::setMemoryAllocationLimitBytes(size_t bytes)
648 { 648 {
649 ASSERT(bytes); 649 ASSERT(bytes);
650 if (m_memoryAllocationLimitBytes == bytes) 650 if (m_memoryAllocationLimitBytes == bytes)
651 return; 651 return;
652 m_memoryAllocationLimitBytes = bytes; 652 m_memoryAllocationLimitBytes = bytes;
653 reduceContentsTextureMemoryOnImplThread(m_visible ? m_memoryAllocationLimitB ytes : 0); 653 reduceContentsTextureMemoryOnImplThread(m_visible ? m_memoryAllocationLimitB ytes : 0);
654 m_client->setNeedsCommitOnImplThread(); 654 m_client->setNeedsCommitOnImplThread();
655 } 655 }
656 656
657 void CCLayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, dou ble intervalInSeconds) 657 void LayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, doubl e intervalInSeconds)
658 { 658 {
659 m_client->onVSyncParametersChanged(monotonicTimebase, intervalInSeconds); 659 m_client->onVSyncParametersChanged(monotonicTimebase, intervalInSeconds);
660 } 660 }
661 661
662 void CCLayerTreeHostImpl::drawLayers(const FrameData& frame) 662 void LayerTreeHostImpl::drawLayers(const FrameData& frame)
663 { 663 {
664 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::drawLayers"); 664 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers");
665 ASSERT(canDraw()); 665 ASSERT(canDraw());
666 ASSERT(!frame.renderPasses.empty()); 666 ASSERT(!frame.renderPasses.empty());
667 667
668 // FIXME: use the frame begin time from the overall compositor scheduler. 668 // FIXME: use the frame begin time from the overall compositor scheduler.
669 // This value is currently inaccessible because it is up in Chromium's 669 // This value is currently inaccessible because it is up in Chromium's
670 // RenderWidget. 670 // RenderWidget.
671 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); 671 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now());
672 672
673 if (m_settings.showDebugRects()) 673 if (m_settings.showDebugRects())
674 m_debugRectHistory->saveDebugRectsForCurrentFrame(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList, frame.occludingScreenSpaceRects, settings()); 674 m_debugRectHistory->saveDebugRectsForCurrentFrame(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList, frame.occludingScreenSpaceRects, settings());
675 675
676 // Because the contents of the HUD depend on everything else in the frame, t he contents 676 // Because the contents of the HUD depend on everything else in the frame, t he contents
677 // of its texture are updated as the last thing before the frame is drawn. 677 // of its texture are updated as the last thing before the frame is drawn.
678 if (m_hudLayerImpl) 678 if (m_hudLayerImpl)
679 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); 679 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get());
680 680
681 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); 681 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById);
682 682
683 // Once a RenderPass has been drawn, its damage should be cleared in 683 // Once a RenderPass has been drawn, its damage should be cleared in
684 // case the RenderPass will be reused next frame. 684 // case the RenderPass will be reused next frame.
685 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) 685 for (unsigned int i = 0; i < frame.renderPasses.size(); i++)
686 frame.renderPasses[i]->setDamageRect(FloatRect()); 686 frame.renderPasses[i]->setDamageRect(FloatRect());
687 687
688 // The next frame should start by assuming nothing has changed, and changes are noted as they occur. 688 // The next frame should start by assuming nothing has changed, and changes are noted as they occur.
689 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) 689 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++)
690 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea(); 690 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea();
691 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); 691 m_rootLayerImpl->resetAllChangeTrackingForSubtree();
692 } 692 }
693 693
694 void CCLayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) 694 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame)
695 { 695 {
696 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) 696 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i)
697 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get()); 697 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get());
698 698
699 // Once all layers have been drawn, pending texture uploads should no 699 // Once all layers have been drawn, pending texture uploads should no
700 // longer block future uploads. 700 // longer block future uploads.
701 m_resourceProvider->textureUploader()->markPendingUploadsAsNonBlocking(); 701 m_resourceProvider->textureUploader()->markPendingUploadsAsNonBlocking();
702 } 702 }
703 703
704 void CCLayerTreeHostImpl::finishAllRendering() 704 void LayerTreeHostImpl::finishAllRendering()
705 { 705 {
706 if (m_renderer) 706 if (m_renderer)
707 m_renderer->finish(); 707 m_renderer->finish();
708 } 708 }
709 709
710 bool CCLayerTreeHostImpl::isContextLost() 710 bool LayerTreeHostImpl::isContextLost()
711 { 711 {
712 return m_renderer && m_renderer->isContextLost(); 712 return m_renderer && m_renderer->isContextLost();
713 } 713 }
714 714
715 const RendererCapabilities& CCLayerTreeHostImpl::rendererCapabilities() const 715 const RendererCapabilities& LayerTreeHostImpl::rendererCapabilities() const
716 { 716 {
717 return m_renderer->capabilities(); 717 return m_renderer->capabilities();
718 } 718 }
719 719
720 bool CCLayerTreeHostImpl::swapBuffers() 720 bool LayerTreeHostImpl::swapBuffers()
721 { 721 {
722 ASSERT(m_renderer); 722 ASSERT(m_renderer);
723 723
724 m_fpsCounter->markEndOfFrame(); 724 m_fpsCounter->markEndOfFrame();
725 return m_renderer->swapBuffers(); 725 return m_renderer->swapBuffers();
726 } 726 }
727 727
728 const IntSize& CCLayerTreeHostImpl::deviceViewportSize() const 728 const IntSize& LayerTreeHostImpl::deviceViewportSize() const
729 { 729 {
730 return m_deviceViewportSize; 730 return m_deviceViewportSize;
731 } 731 }
732 732
733 const CCLayerTreeSettings& CCLayerTreeHostImpl::settings() const 733 const LayerTreeSettings& LayerTreeHostImpl::settings() const
734 { 734 {
735 return m_settings; 735 return m_settings;
736 } 736 }
737 737
738 void CCLayerTreeHostImpl::didLoseContext() 738 void LayerTreeHostImpl::didLoseContext()
739 { 739 {
740 m_client->didLoseContextOnImplThread(); 740 m_client->didLoseContextOnImplThread();
741 } 741 }
742 742
743 void CCLayerTreeHostImpl::onSwapBuffersComplete() 743 void LayerTreeHostImpl::onSwapBuffersComplete()
744 { 744 {
745 m_client->onSwapBuffersCompleteOnImplThread(); 745 m_client->onSwapBuffersCompleteOnImplThread();
746 } 746 }
747 747
748 void CCLayerTreeHostImpl::readback(void* pixels, const IntRect& rect) 748 void LayerTreeHostImpl::readback(void* pixels, const IntRect& rect)
749 { 749 {
750 ASSERT(m_renderer); 750 ASSERT(m_renderer);
751 m_renderer->getFramebufferPixels(pixels, rect); 751 m_renderer->getFramebufferPixels(pixels, rect);
752 } 752 }
753 753
754 static CCLayerImpl* findRootScrollLayer(CCLayerImpl* layer) 754 static LayerImpl* findRootScrollLayer(LayerImpl* layer)
755 { 755 {
756 if (!layer) 756 if (!layer)
757 return 0; 757 return 0;
758 758
759 if (layer->scrollable()) 759 if (layer->scrollable())
760 return layer; 760 return layer;
761 761
762 for (size_t i = 0; i < layer->children().size(); ++i) { 762 for (size_t i = 0; i < layer->children().size(); ++i) {
763 CCLayerImpl* found = findRootScrollLayer(layer->children()[i]); 763 LayerImpl* found = findRootScrollLayer(layer->children()[i]);
764 if (found) 764 if (found)
765 return found; 765 return found;
766 } 766 }
767 767
768 return 0; 768 return 0;
769 } 769 }
770 770
771 // Content layers can be either directly scrollable or contained in an outer 771 // Content layers can be either directly scrollable or contained in an outer
772 // scrolling layer which applies the scroll transform. Given a content layer, 772 // scrolling layer which applies the scroll transform. Given a content layer,
773 // this function returns the associated scroll layer if any. 773 // this function returns the associated scroll layer if any.
774 static CCLayerImpl* findScrollLayerForContentLayer(CCLayerImpl* layerImpl) 774 static LayerImpl* findScrollLayerForContentLayer(LayerImpl* layerImpl)
775 { 775 {
776 if (!layerImpl) 776 if (!layerImpl)
777 return 0; 777 return 0;
778 778
779 if (layerImpl->scrollable()) 779 if (layerImpl->scrollable())
780 return layerImpl; 780 return layerImpl;
781 781
782 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable()) 782 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable())
783 return layerImpl->parent(); 783 return layerImpl->parent();
784 784
785 return 0; 785 return 0;
786 } 786 }
787 787
788 void CCLayerTreeHostImpl::setRootLayer(scoped_ptr<CCLayerImpl> layer) 788 void LayerTreeHostImpl::setRootLayer(scoped_ptr<LayerImpl> layer)
789 { 789 {
790 m_rootLayerImpl = layer.Pass(); 790 m_rootLayerImpl = layer.Pass();
791 m_rootScrollLayerImpl = findRootScrollLayer(m_rootLayerImpl.get()); 791 m_rootScrollLayerImpl = findRootScrollLayer(m_rootLayerImpl.get());
792 m_currentlyScrollingLayerImpl = 0; 792 m_currentlyScrollingLayerImpl = 0;
793 793
794 if (m_rootLayerImpl && m_scrollingLayerIdFromPreviousTree != -1) 794 if (m_rootLayerImpl && m_scrollingLayerIdFromPreviousTree != -1)
795 m_currentlyScrollingLayerImpl = CCLayerTreeHostCommon::findLayerInSubtre e(m_rootLayerImpl.get(), m_scrollingLayerIdFromPreviousTree); 795 m_currentlyScrollingLayerImpl = LayerTreeHostCommon::findLayerInSubtree( m_rootLayerImpl.get(), m_scrollingLayerIdFromPreviousTree);
796 796
797 m_scrollingLayerIdFromPreviousTree = -1; 797 m_scrollingLayerIdFromPreviousTree = -1;
798 798
799 m_client->onCanDrawStateChanged(canDraw()); 799 m_client->onCanDrawStateChanged(canDraw());
800 } 800 }
801 801
802 scoped_ptr<CCLayerImpl> CCLayerTreeHostImpl::detachLayerTree() 802 scoped_ptr<LayerImpl> LayerTreeHostImpl::detachLayerTree()
803 { 803 {
804 // Clear all data structures that have direct references to the layer tree. 804 // Clear all data structures that have direct references to the layer tree.
805 m_scrollingLayerIdFromPreviousTree = m_currentlyScrollingLayerImpl ? m_curre ntlyScrollingLayerImpl->id() : -1; 805 m_scrollingLayerIdFromPreviousTree = m_currentlyScrollingLayerImpl ? m_curre ntlyScrollingLayerImpl->id() : -1;
806 m_currentlyScrollingLayerImpl = 0; 806 m_currentlyScrollingLayerImpl = 0;
807 m_renderSurfaceLayerList.clear(); 807 m_renderSurfaceLayerList.clear();
808 808
809 return m_rootLayerImpl.Pass(); 809 return m_rootLayerImpl.Pass();
810 } 810 }
811 811
812 void CCLayerTreeHostImpl::setVisible(bool visible) 812 void LayerTreeHostImpl::setVisible(bool visible)
813 { 813 {
814 ASSERT(CCProxy::isImplThread()); 814 ASSERT(Proxy::isImplThread());
815 815
816 if (m_visible == visible) 816 if (m_visible == visible)
817 return; 817 return;
818 m_visible = visible; 818 m_visible = visible;
819 didVisibilityChange(this, m_visible); 819 didVisibilityChange(this, m_visible);
820 reduceContentsTextureMemoryOnImplThread(m_visible ? m_memoryAllocationLimitB ytes : 0); 820 reduceContentsTextureMemoryOnImplThread(m_visible ? m_memoryAllocationLimitB ytes : 0);
821 821
822 if (!m_renderer) 822 if (!m_renderer)
823 return; 823 return;
824 824
825 m_renderer->setVisible(visible); 825 m_renderer->setVisible(visible);
826 826
827 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); 827 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
828 } 828 }
829 829
830 bool CCLayerTreeHostImpl::initializeRenderer(scoped_ptr<CCGraphicsContext> conte xt) 830 bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<GraphicsContext> context)
831 { 831 {
832 // Since we will create a new resource provider, we cannot continue to use 832 // Since we will create a new resource provider, we cannot continue to use
833 // the old resources (i.e. renderSurfaces and texture IDs). Clear them 833 // the old resources (i.e. renderSurfaces and texture IDs). Clear them
834 // before we destroy the old resource provider. 834 // before we destroy the old resource provider.
835 if (m_rootLayerImpl) { 835 if (m_rootLayerImpl) {
836 clearRenderSurfaces(); 836 clearRenderSurfaces();
837 sendDidLoseContextRecursive(m_rootLayerImpl.get()); 837 sendDidLoseContextRecursive(m_rootLayerImpl.get());
838 } 838 }
839 // Note: order is important here. 839 // Note: order is important here.
840 m_renderer.reset(); 840 m_renderer.reset();
841 m_resourceProvider.reset(); 841 m_resourceProvider.reset();
842 m_context.reset(); 842 m_context.reset();
843 843
844 if (!context->bindToClient(this)) 844 if (!context->bindToClient(this))
845 return false; 845 return false;
846 846
847 scoped_ptr<CCResourceProvider> resourceProvider = CCResourceProvider::create (context.get()); 847 scoped_ptr<ResourceProvider> resourceProvider = ResourceProvider::create(con text.get());
848 if (!resourceProvider) 848 if (!resourceProvider)
849 return false; 849 return false;
850 850
851 if (context->context3D()) 851 if (context->context3D())
852 m_renderer = CCRendererGL::create(this, resourceProvider.get()); 852 m_renderer = GLRenderer::create(this, resourceProvider.get());
853 else if (context->softwareDevice()) 853 else if (context->softwareDevice())
854 m_renderer = CCRendererSoftware::create(this, resourceProvider.get(), co ntext->softwareDevice()); 854 m_renderer = SoftwareRenderer::create(this, resourceProvider.get(), cont ext->softwareDevice());
855 if (!m_renderer) 855 if (!m_renderer)
856 return false; 856 return false;
857 857
858 m_resourceProvider = resourceProvider.Pass(); 858 m_resourceProvider = resourceProvider.Pass();
859 m_context = context.Pass(); 859 m_context = context.Pass();
860 860
861 if (!m_visible) 861 if (!m_visible)
862 m_renderer->setVisible(m_visible); 862 m_renderer->setVisible(m_visible);
863 863
864 m_client->onCanDrawStateChanged(canDraw()); 864 m_client->onCanDrawStateChanged(canDraw());
865 865
866 return true; 866 return true;
867 } 867 }
868 868
869 void CCLayerTreeHostImpl::setContentsTexturesPurged() 869 void LayerTreeHostImpl::setContentsTexturesPurged()
870 { 870 {
871 m_contentsTexturesPurged = true; 871 m_contentsTexturesPurged = true;
872 m_client->onCanDrawStateChanged(canDraw()); 872 m_client->onCanDrawStateChanged(canDraw());
873 } 873 }
874 874
875 void CCLayerTreeHostImpl::resetContentsTexturesPurged() 875 void LayerTreeHostImpl::resetContentsTexturesPurged()
876 { 876 {
877 m_contentsTexturesPurged = false; 877 m_contentsTexturesPurged = false;
878 m_client->onCanDrawStateChanged(canDraw()); 878 m_client->onCanDrawStateChanged(canDraw());
879 } 879 }
880 880
881 void CCLayerTreeHostImpl::setViewportSize(const IntSize& layoutViewportSize, con st IntSize& deviceViewportSize) 881 void LayerTreeHostImpl::setViewportSize(const IntSize& layoutViewportSize, const IntSize& deviceViewportSize)
882 { 882 {
883 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de viceViewportSize) 883 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de viceViewportSize)
884 return; 884 return;
885 885
886 m_layoutViewportSize = layoutViewportSize; 886 m_layoutViewportSize = layoutViewportSize;
887 m_deviceViewportSize = deviceViewportSize; 887 m_deviceViewportSize = deviceViewportSize;
888 888
889 m_pinchZoomViewport.setLayoutViewportSize(FloatSize(layoutViewportSize)); 889 m_pinchZoomViewport.setLayoutViewportSize(FloatSize(layoutViewportSize));
890 890
891 updateMaxScrollPosition(); 891 updateMaxScrollPosition();
892 892
893 if (m_renderer) 893 if (m_renderer)
894 m_renderer->viewportChanged(); 894 m_renderer->viewportChanged();
895 895
896 m_client->onCanDrawStateChanged(canDraw()); 896 m_client->onCanDrawStateChanged(canDraw());
897 } 897 }
898 898
899 static void adjustScrollsForPageScaleChange(CCLayerImpl* layerImpl, float pageSc aleChange) 899 static void adjustScrollsForPageScaleChange(LayerImpl* layerImpl, float pageScal eChange)
900 { 900 {
901 if (!layerImpl) 901 if (!layerImpl)
902 return; 902 return;
903 903
904 if (layerImpl->scrollable()) { 904 if (layerImpl->scrollable()) {
905 // We need to convert impl-side scroll deltas to pageScale space. 905 // We need to convert impl-side scroll deltas to pageScale space.
906 FloatSize scrollDelta = layerImpl->scrollDelta(); 906 FloatSize scrollDelta = layerImpl->scrollDelta();
907 scrollDelta.scale(pageScaleChange); 907 scrollDelta.scale(pageScaleChange);
908 layerImpl->setScrollDelta(scrollDelta); 908 layerImpl->setScrollDelta(scrollDelta);
909 } 909 }
910 910
911 for (size_t i = 0; i < layerImpl->children().size(); ++i) 911 for (size_t i = 0; i < layerImpl->children().size(); ++i)
912 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang e); 912 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang e);
913 } 913 }
914 914
915 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) 915 void LayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor)
916 { 916 {
917 if (deviceScaleFactor == m_deviceScaleFactor) 917 if (deviceScaleFactor == m_deviceScaleFactor)
918 return; 918 return;
919 m_deviceScaleFactor = deviceScaleFactor; 919 m_deviceScaleFactor = deviceScaleFactor;
920 920
921 updateMaxScrollPosition(); 921 updateMaxScrollPosition();
922 } 922 }
923 923
924 float CCLayerTreeHostImpl::pageScaleFactor() const 924 float LayerTreeHostImpl::pageScaleFactor() const
925 { 925 {
926 return m_pinchZoomViewport.pageScaleFactor(); 926 return m_pinchZoomViewport.pageScaleFactor();
927 } 927 }
928 928
929 void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, flo at minPageScaleFactor, float maxPageScaleFactor) 929 void LayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor)
930 { 930 {
931 if (!pageScaleFactor) 931 if (!pageScaleFactor)
932 return; 932 return;
933 933
934 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFacto r(); 934 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFacto r();
935 m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScal eFactor, maxPageScaleFactor); 935 m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScal eFactor, maxPageScaleFactor);
936 936
937 if (!CCSettings::pageScalePinchZoomEnabled()) { 937 if (!Settings::pageScalePinchZoomEnabled()) {
938 if (pageScaleChange != 1) 938 if (pageScaleChange != 1)
939 adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChan ge); 939 adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChan ge);
940 } 940 }
941 941
942 // Clamp delta to limits and refresh display matrix. 942 // Clamp delta to limits and refresh display matrix.
943 setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport .sentPageScaleDelta()); 943 setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport .sentPageScaleDelta());
944 m_pinchZoomViewport.setSentPageScaleDelta(1); 944 m_pinchZoomViewport.setSentPageScaleDelta(1);
945 } 945 }
946 946
947 void CCLayerTreeHostImpl::setPageScaleDelta(float delta) 947 void LayerTreeHostImpl::setPageScaleDelta(float delta)
948 { 948 {
949 m_pinchZoomViewport.setPageScaleDelta(delta); 949 m_pinchZoomViewport.setPageScaleDelta(delta);
950 950
951 updateMaxScrollPosition(); 951 updateMaxScrollPosition();
952 } 952 }
953 953
954 void CCLayerTreeHostImpl::updateMaxScrollPosition() 954 void LayerTreeHostImpl::updateMaxScrollPosition()
955 { 955 {
956 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size()) 956 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size())
957 return; 957 return;
958 958
959 FloatSize viewBounds = m_deviceViewportSize; 959 FloatSize viewBounds = m_deviceViewportSize;
960 if (CCLayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) { 960 if (LayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) {
961 // Compensate for non-overlay scrollbars. 961 // Compensate for non-overlay scrollbars.
962 if (clipLayer->masksToBounds()) { 962 if (clipLayer->masksToBounds()) {
963 viewBounds = clipLayer->bounds(); 963 viewBounds = clipLayer->bounds();
964 viewBounds.scale(m_deviceScaleFactor); 964 viewBounds.scale(m_deviceScaleFactor);
965 } 965 }
966 } 966 }
967 967
968 IntSize contentBounds = contentSize(); 968 IntSize contentBounds = contentSize();
969 if (CCSettings::pageScalePinchZoomEnabled()) { 969 if (Settings::pageScalePinchZoomEnabled()) {
970 // Pinch with pageScale scrolls entirely in layout space. contentSize 970 // Pinch with pageScale scrolls entirely in layout space. contentSize
971 // returns the bounds including the page scale factor, so calculate the 971 // returns the bounds including the page scale factor, so calculate the
972 // pre page-scale layout size here. 972 // pre page-scale layout size here.
973 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); 973 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
974 contentBounds.setWidth(contentBounds.width() / pageScaleFactor); 974 contentBounds.setWidth(contentBounds.width() / pageScaleFactor);
975 contentBounds.setHeight(contentBounds.height() / pageScaleFactor); 975 contentBounds.setHeight(contentBounds.height() / pageScaleFactor);
976 } else { 976 } else {
977 viewBounds.scale(1 / m_pinchZoomViewport.pageScaleDelta()); 977 viewBounds.scale(1 / m_pinchZoomViewport.pageScaleDelta());
978 } 978 }
979 979
980 IntSize maxScroll = contentBounds - expandedIntSize(viewBounds); 980 IntSize maxScroll = contentBounds - expandedIntSize(viewBounds);
981 maxScroll.scale(1 / m_deviceScaleFactor); 981 maxScroll.scale(1 / m_deviceScaleFactor);
982 982
983 // The viewport may be larger than the contents in some cases, such as 983 // The viewport may be larger than the contents in some cases, such as
984 // having a vertical scrollbar but no horizontal overflow. 984 // having a vertical scrollbar but no horizontal overflow.
985 maxScroll.clampNegativeToZero(); 985 maxScroll.clampNegativeToZero();
986 986
987 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll); 987 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll);
988 } 988 }
989 989
990 void CCLayerTreeHostImpl::setNeedsRedraw() 990 void LayerTreeHostImpl::setNeedsRedraw()
991 { 991 {
992 m_client->setNeedsRedrawOnImplThread(); 992 m_client->setNeedsRedrawOnImplThread();
993 } 993 }
994 994
995 bool CCLayerTreeHostImpl::ensureRenderSurfaceLayerList() 995 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList()
996 { 996 {
997 if (!m_rootLayerImpl) 997 if (!m_rootLayerImpl)
998 return false; 998 return false;
999 if (!m_renderer) 999 if (!m_renderer)
1000 return false; 1000 return false;
1001 1001
1002 // We need both a non-empty render surface layer list and a root render 1002 // We need both a non-empty render surface layer list and a root render
1003 // surface to be able to iterate over the visible layers. 1003 // surface to be able to iterate over the visible layers.
1004 if (m_renderSurfaceLayerList.size() && m_rootLayerImpl->renderSurface()) 1004 if (m_renderSurfaceLayerList.size() && m_rootLayerImpl->renderSurface())
1005 return true; 1005 return true;
1006 1006
1007 // If we are called after setRootLayer() but before prepareToDraw(), we need 1007 // If we are called after setRootLayer() but before prepareToDraw(), we need
1008 // to recalculate the visible layers. This prevents being unable to scroll 1008 // to recalculate the visible layers. This prevents being unable to scroll
1009 // during part of a commit. 1009 // during part of a commit.
1010 m_renderSurfaceLayerList.clear(); 1010 m_renderSurfaceLayerList.clear();
1011 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); 1011 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList);
1012 1012
1013 return m_renderSurfaceLayerList.size(); 1013 return m_renderSurfaceLayerList.size();
1014 } 1014 }
1015 1015
1016 CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoi nt& viewportPoint, CCInputHandlerClient::ScrollInputType type) 1016 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(const IntPoint& viewportPoint, InputHandlerClient::ScrollInputType type)
1017 { 1017 {
1018 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::scrollBegin"); 1018 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin");
1019 1019
1020 ASSERT(!m_currentlyScrollingLayerImpl); 1020 ASSERT(!m_currentlyScrollingLayerImpl);
1021 clearCurrentlyScrollingLayer(); 1021 clearCurrentlyScrollingLayer();
1022 1022
1023 if (!ensureRenderSurfaceLayerList()) 1023 if (!ensureRenderSurfaceLayerList())
1024 return ScrollIgnored; 1024 return ScrollIgnored;
1025 1025
1026 IntPoint deviceViewportPoint = viewportPoint; 1026 IntPoint deviceViewportPoint = viewportPoint;
1027 deviceViewportPoint.scale(m_deviceScaleFactor, m_deviceScaleFactor); 1027 deviceViewportPoint.scale(m_deviceScaleFactor, m_deviceScaleFactor);
1028 1028
1029 // First find out which layer was hit from the saved list of visible layers 1029 // First find out which layer was hit from the saved list of visible layers
1030 // in the most recent frame. 1030 // in the most recent frame.
1031 CCLayerImpl* layerImpl = CCLayerTreeHostCommon::findLayerThatIsHitByPoint(vi ewportPoint, m_renderSurfaceLayerList); 1031 LayerImpl* layerImpl = LayerTreeHostCommon::findLayerThatIsHitByPoint(viewpo rtPoint, m_renderSurfaceLayerList);
1032 1032
1033 // Walk up the hierarchy and look for a scrollable layer. 1033 // Walk up the hierarchy and look for a scrollable layer.
1034 CCLayerImpl* potentiallyScrollingLayerImpl = 0; 1034 LayerImpl* potentiallyScrollingLayerImpl = 0;
1035 for (; layerImpl; layerImpl = layerImpl->parent()) { 1035 for (; layerImpl; layerImpl = layerImpl->parent()) {
1036 // The content layer can also block attempts to scroll outside the main thread. 1036 // The content layer can also block attempts to scroll outside the main thread.
1037 if (layerImpl->tryScroll(deviceViewportPoint, type) == ScrollOnMainThrea d) { 1037 if (layerImpl->tryScroll(deviceViewportPoint, type) == ScrollOnMainThrea d) {
1038 m_numMainThreadScrolls++; 1038 m_numMainThreadScrolls++;
1039 return ScrollOnMainThread; 1039 return ScrollOnMainThread;
1040 } 1040 }
1041 1041
1042 CCLayerImpl* scrollLayerImpl = findScrollLayerForContentLayer(layerImpl) ; 1042 LayerImpl* scrollLayerImpl = findScrollLayerForContentLayer(layerImpl);
1043 if (!scrollLayerImpl) 1043 if (!scrollLayerImpl)
1044 continue; 1044 continue;
1045 1045
1046 ScrollStatus status = scrollLayerImpl->tryScroll(viewportPoint, type); 1046 ScrollStatus status = scrollLayerImpl->tryScroll(viewportPoint, type);
1047 1047
1048 // If any layer wants to divert the scroll event to the main thread, abo rt. 1048 // If any layer wants to divert the scroll event to the main thread, abo rt.
1049 if (status == ScrollOnMainThread) { 1049 if (status == ScrollOnMainThread) {
1050 m_numMainThreadScrolls++; 1050 m_numMainThreadScrolls++;
1051 return ScrollOnMainThread; 1051 return ScrollOnMainThread;
1052 } 1052 }
1053 1053
1054 if (status == ScrollStarted && !potentiallyScrollingLayerImpl) 1054 if (status == ScrollStarted && !potentiallyScrollingLayerImpl)
1055 potentiallyScrollingLayerImpl = scrollLayerImpl; 1055 potentiallyScrollingLayerImpl = scrollLayerImpl;
1056 } 1056 }
1057 1057
1058 if (potentiallyScrollingLayerImpl) { 1058 if (potentiallyScrollingLayerImpl) {
1059 m_currentlyScrollingLayerImpl = potentiallyScrollingLayerImpl; 1059 m_currentlyScrollingLayerImpl = potentiallyScrollingLayerImpl;
1060 // Gesture events need to be transformed from screen coordinates to loca l layer coordinates 1060 // Gesture events need to be transformed from screen coordinates to loca l layer coordinates
1061 // so that the scrolling contents exactly follow the user's finger. In c ontrast, wheel 1061 // so that the scrolling contents exactly follow the user's finger. In c ontrast, wheel
1062 // events are already in local layer coordinates so we can just apply th em directly. 1062 // events are already in local layer coordinates so we can just apply th em directly.
1063 m_scrollDeltaIsInScreenSpace = (type == Gesture); 1063 m_scrollDeltaIsInScreenSpace = (type == Gesture);
1064 m_numImplThreadScrolls++; 1064 m_numImplThreadScrolls++;
1065 return ScrollStarted; 1065 return ScrollStarted;
1066 } 1066 }
1067 return ScrollIgnored; 1067 return ScrollIgnored;
1068 } 1068 }
1069 1069
1070 static FloatSize scrollLayerWithScreenSpaceDelta(CCPinchZoomViewport* viewport, CCLayerImpl& layerImpl, const FloatPoint& screenSpacePoint, const FloatSize& scr eenSpaceDelta) 1070 static FloatSize scrollLayerWithScreenSpaceDelta(PinchZoomViewport* viewport, La yerImpl& layerImpl, const FloatPoint& screenSpacePoint, const FloatSize& screenS paceDelta)
1071 { 1071 {
1072 // Layers with non-invertible screen space transforms should not have passed the scroll hit 1072 // Layers with non-invertible screen space transforms should not have passed the scroll hit
1073 // test in the first place. 1073 // test in the first place.
1074 ASSERT(layerImpl.screenSpaceTransform().isInvertible()); 1074 ASSERT(layerImpl.screenSpaceTransform().isInvertible());
1075 WebTransformationMatrix inverseScreenSpaceTransform = layerImpl.screenSpaceT ransform().inverse(); 1075 WebTransformationMatrix inverseScreenSpaceTransform = layerImpl.screenSpaceT ransform().inverse();
1076 1076
1077 // First project the scroll start and end points to local layer space to fin d the scroll delta 1077 // First project the scroll start and end points to local layer space to fin d the scroll delta
1078 // in layer coordinates. 1078 // in layer coordinates.
1079 bool startClipped, endClipped; 1079 bool startClipped, endClipped;
1080 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta; 1080 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta;
1081 FloatPoint localStartPoint = CCMathUtil::projectPoint(inverseScreenSpaceTran sform, screenSpacePoint, startClipped); 1081 FloatPoint localStartPoint = MathUtil::projectPoint(inverseScreenSpaceTransf orm, screenSpacePoint, startClipped);
1082 FloatPoint localEndPoint = CCMathUtil::projectPoint(inverseScreenSpaceTransf orm, screenSpaceEndPoint, endClipped); 1082 FloatPoint localEndPoint = MathUtil::projectPoint(inverseScreenSpaceTransfor m, screenSpaceEndPoint, endClipped);
1083 1083
1084 // In general scroll point coordinates should not get clipped. 1084 // In general scroll point coordinates should not get clipped.
1085 ASSERT(!startClipped); 1085 ASSERT(!startClipped);
1086 ASSERT(!endClipped); 1086 ASSERT(!endClipped);
1087 if (startClipped || endClipped) 1087 if (startClipped || endClipped)
1088 return FloatSize(); 1088 return FloatSize();
1089 1089
1090 // Apply the scroll delta. 1090 // Apply the scroll delta.
1091 FloatSize previousDelta(layerImpl.scrollDelta()); 1091 FloatSize previousDelta(layerImpl.scrollDelta());
1092 FloatSize unscrolled = layerImpl.scrollBy(localEndPoint - localStartPoint); 1092 FloatSize unscrolled = layerImpl.scrollBy(localEndPoint - localStartPoint);
1093 1093
1094 if (viewport) 1094 if (viewport)
1095 viewport->applyScroll(unscrolled); 1095 viewport->applyScroll(unscrolled);
1096 1096
1097 // Calculate the applied scroll delta in screen space coordinates. 1097 // Calculate the applied scroll delta in screen space coordinates.
1098 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() - previousDelta; 1098 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() - previousDelta;
1099 FloatPoint actualScreenSpaceEndPoint = CCMathUtil::mapPoint(layerImpl.screen SpaceTransform(), actualLocalEndPoint, endClipped); 1099 FloatPoint actualScreenSpaceEndPoint = MathUtil::mapPoint(layerImpl.screenSp aceTransform(), actualLocalEndPoint, endClipped);
1100 ASSERT(!endClipped); 1100 ASSERT(!endClipped);
1101 if (endClipped) 1101 if (endClipped)
1102 return FloatSize(); 1102 return FloatSize();
1103 return actualScreenSpaceEndPoint - screenSpacePoint; 1103 return actualScreenSpaceEndPoint - screenSpacePoint;
1104 } 1104 }
1105 1105
1106 static FloatSize scrollLayerWithLocalDelta(CCLayerImpl& layerImpl, const FloatSi ze& localDelta) 1106 static FloatSize scrollLayerWithLocalDelta(LayerImpl& layerImpl, const FloatSize & localDelta)
1107 { 1107 {
1108 FloatSize previousDelta(layerImpl.scrollDelta()); 1108 FloatSize previousDelta(layerImpl.scrollDelta());
1109 layerImpl.scrollBy(localDelta); 1109 layerImpl.scrollBy(localDelta);
1110 return layerImpl.scrollDelta() - previousDelta; 1110 return layerImpl.scrollDelta() - previousDelta;
1111 } 1111 }
1112 1112
1113 void CCLayerTreeHostImpl::scrollBy(const IntPoint& viewportPoint, const IntSize& scrollDelta) 1113 void LayerTreeHostImpl::scrollBy(const IntPoint& viewportPoint, const IntSize& s crollDelta)
1114 { 1114 {
1115 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::scrollBy"); 1115 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBy");
1116 if (!m_currentlyScrollingLayerImpl) 1116 if (!m_currentlyScrollingLayerImpl)
1117 return; 1117 return;
1118 1118
1119 FloatSize pendingDelta(scrollDelta); 1119 FloatSize pendingDelta(scrollDelta);
1120 1120
1121 pendingDelta.scale(m_deviceScaleFactor); 1121 pendingDelta.scale(m_deviceScaleFactor);
1122 1122
1123 for (CCLayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; laye rImpl = layerImpl->parent()) { 1123 for (LayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; layerI mpl = layerImpl->parent()) {
1124 if (!layerImpl->scrollable()) 1124 if (!layerImpl->scrollable())
1125 continue; 1125 continue;
1126 1126
1127 CCPinchZoomViewport* viewport = layerImpl == m_rootScrollLayerImpl ? &m_ pinchZoomViewport : 0; 1127 PinchZoomViewport* viewport = layerImpl == m_rootScrollLayerImpl ? &m_pi nchZoomViewport : 0;
1128 FloatSize appliedDelta; 1128 FloatSize appliedDelta;
1129 if (m_scrollDeltaIsInScreenSpace) 1129 if (m_scrollDeltaIsInScreenSpace)
1130 appliedDelta = scrollLayerWithScreenSpaceDelta(viewport, *layerImpl, viewportPoint, pendingDelta); 1130 appliedDelta = scrollLayerWithScreenSpaceDelta(viewport, *layerImpl, viewportPoint, pendingDelta);
1131 else 1131 else
1132 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); 1132 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta);
1133 1133
1134 // If the layer wasn't able to move, try the next one in the hierarchy. 1134 // If the layer wasn't able to move, try the next one in the hierarchy.
1135 float moveThresholdSquared = 0.1f * 0.1f; 1135 float moveThresholdSquared = 0.1f * 0.1f;
1136 if (appliedDelta.diagonalLengthSquared() < moveThresholdSquared) 1136 if (appliedDelta.diagonalLengthSquared() < moveThresholdSquared)
1137 continue; 1137 continue;
1138 1138
1139 // If the applied delta is within 45 degrees of the input delta, bail ou t to make it easier 1139 // If the applied delta is within 45 degrees of the input delta, bail ou t to make it easier
1140 // to scroll just one layer in one direction without affecting any of it s parents. 1140 // to scroll just one layer in one direction without affecting any of it s parents.
1141 float angleThreshold = 45; 1141 float angleThreshold = 45;
1142 if (CCMathUtil::smallestAngleBetweenVectors(appliedDelta, pendingDelta) < angleThreshold) { 1142 if (MathUtil::smallestAngleBetweenVectors(appliedDelta, pendingDelta) < angleThreshold) {
1143 pendingDelta = FloatSize(); 1143 pendingDelta = FloatSize();
1144 break; 1144 break;
1145 } 1145 }
1146 1146
1147 // Allow further movement only on an axis perpendicular to the direction in which the layer 1147 // Allow further movement only on an axis perpendicular to the direction in which the layer
1148 // moved. 1148 // moved.
1149 FloatSize perpendicularAxis(-appliedDelta.height(), appliedDelta.width() ); 1149 FloatSize perpendicularAxis(-appliedDelta.height(), appliedDelta.width() );
1150 pendingDelta = CCMathUtil::projectVector(pendingDelta, perpendicularAxis ); 1150 pendingDelta = MathUtil::projectVector(pendingDelta, perpendicularAxis);
1151 1151
1152 if (flooredIntSize(pendingDelta).isZero()) 1152 if (flooredIntSize(pendingDelta).isZero())
1153 break; 1153 break;
1154 } 1154 }
1155 1155
1156 if (!scrollDelta.isZero() && flooredIntSize(pendingDelta).isEmpty()) { 1156 if (!scrollDelta.isZero() && flooredIntSize(pendingDelta).isEmpty()) {
1157 m_client->setNeedsCommitOnImplThread(); 1157 m_client->setNeedsCommitOnImplThread();
1158 m_client->setNeedsRedrawOnImplThread(); 1158 m_client->setNeedsRedrawOnImplThread();
1159 } 1159 }
1160 } 1160 }
1161 1161
1162 void CCLayerTreeHostImpl::clearCurrentlyScrollingLayer() 1162 void LayerTreeHostImpl::clearCurrentlyScrollingLayer()
1163 { 1163 {
1164 m_currentlyScrollingLayerImpl = 0; 1164 m_currentlyScrollingLayerImpl = 0;
1165 m_scrollingLayerIdFromPreviousTree = -1; 1165 m_scrollingLayerIdFromPreviousTree = -1;
1166 } 1166 }
1167 1167
1168 void CCLayerTreeHostImpl::scrollEnd() 1168 void LayerTreeHostImpl::scrollEnd()
1169 { 1169 {
1170 clearCurrentlyScrollingLayer(); 1170 clearCurrentlyScrollingLayer();
1171 } 1171 }
1172 1172
1173 void CCLayerTreeHostImpl::pinchGestureBegin() 1173 void LayerTreeHostImpl::pinchGestureBegin()
1174 { 1174 {
1175 m_pinchGestureActive = true; 1175 m_pinchGestureActive = true;
1176 m_previousPinchAnchor = IntPoint(); 1176 m_previousPinchAnchor = IntPoint();
1177 1177
1178 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller()) 1178 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller())
1179 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureBe gin(); 1179 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureBe gin();
1180 } 1180 }
1181 1181
1182 void CCLayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, 1182 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta,
1183 const IntPoint& anchor) 1183 const IntPoint& anchor)
1184 { 1184 {
1185 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::pinchGestureUpdate"); 1185 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate");
1186 1186
1187 if (!m_rootScrollLayerImpl) 1187 if (!m_rootScrollLayerImpl)
1188 return; 1188 return;
1189 1189
1190 if (m_previousPinchAnchor == IntPoint::zero()) 1190 if (m_previousPinchAnchor == IntPoint::zero())
1191 m_previousPinchAnchor = anchor; 1191 m_previousPinchAnchor = anchor;
1192 1192
1193 // Keep the center-of-pinch anchor specified by (x, y) in a stable 1193 // Keep the center-of-pinch anchor specified by (x, y) in a stable
1194 // position over the course of the magnify. 1194 // position over the course of the magnify.
1195 float pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1195 float pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1196 FloatPoint previousScaleAnchor(m_previousPinchAnchor.x() / pageScaleDelta, 1196 FloatPoint previousScaleAnchor(m_previousPinchAnchor.x() / pageScaleDelta,
1197 m_previousPinchAnchor.y() / pageScaleDelta); 1197 m_previousPinchAnchor.y() / pageScaleDelta);
1198 setPageScaleDelta(pageScaleDelta * magnifyDelta); 1198 setPageScaleDelta(pageScaleDelta * magnifyDelta);
1199 pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1199 pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1200 FloatPoint newScaleAnchor(anchor.x() / pageScaleDelta, anchor.y() / pageScal eDelta); 1200 FloatPoint newScaleAnchor(anchor.x() / pageScaleDelta, anchor.y() / pageScal eDelta);
1201 FloatSize move = previousScaleAnchor - newScaleAnchor; 1201 FloatSize move = previousScaleAnchor - newScaleAnchor;
1202 1202
1203 m_previousPinchAnchor = anchor; 1203 m_previousPinchAnchor = anchor;
1204 1204
1205 if (CCSettings::pageScalePinchZoomEnabled()) { 1205 if (Settings::pageScalePinchZoomEnabled()) {
1206 // Compute the application of the delta with respect to the current page zoom of the page. 1206 // Compute the application of the delta with respect to the current page zoom of the page.
1207 move.scale(1 / (m_pinchZoomViewport.pageScaleFactor() * m_deviceScaleFac tor)); 1207 move.scale(1 / (m_pinchZoomViewport.pageScaleFactor() * m_deviceScaleFac tor));
1208 } 1208 }
1209 1209
1210 FloatSize scrollOverflow = CCSettings::pageScalePinchZoomEnabled() ? m_pinch ZoomViewport.applyScroll(move) : move; 1210 FloatSize scrollOverflow = Settings::pageScalePinchZoomEnabled() ? m_pinchZo omViewport.applyScroll(move) : move;
1211 m_rootScrollLayerImpl->scrollBy(roundedIntSize(scrollOverflow)); 1211 m_rootScrollLayerImpl->scrollBy(roundedIntSize(scrollOverflow));
1212 1212
1213 if (m_rootScrollLayerImpl->scrollbarAnimationController()) 1213 if (m_rootScrollLayerImpl->scrollbarAnimationController())
1214 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureUp date(); 1214 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureUp date();
1215 1215
1216 m_client->setNeedsCommitOnImplThread(); 1216 m_client->setNeedsCommitOnImplThread();
1217 m_client->setNeedsRedrawOnImplThread(); 1217 m_client->setNeedsRedrawOnImplThread();
1218 } 1218 }
1219 1219
1220 void CCLayerTreeHostImpl::pinchGestureEnd() 1220 void LayerTreeHostImpl::pinchGestureEnd()
1221 { 1221 {
1222 m_pinchGestureActive = false; 1222 m_pinchGestureActive = false;
1223 1223
1224 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller()) 1224 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller())
1225 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureEn d(); 1225 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureEn d();
1226 1226
1227 m_client->setNeedsCommitOnImplThread(); 1227 m_client->setNeedsCommitOnImplThread();
1228 } 1228 }
1229 1229
1230 void CCLayerTreeHostImpl::computeDoubleTapZoomDeltas(CCScrollAndScaleSet* scroll Info) 1230 void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo )
1231 { 1231 {
1232 float pageScale = m_pageScaleAnimation->finalPageScale(); 1232 float pageScale = m_pageScaleAnimation->finalPageScale();
1233 IntSize scrollOffset = m_pageScaleAnimation->finalScrollOffset(); 1233 IntSize scrollOffset = m_pageScaleAnimation->finalScrollOffset();
1234 scrollOffset.scale(m_pinchZoomViewport.pageScaleFactor() / pageScale); 1234 scrollOffset.scale(m_pinchZoomViewport.pageScaleFactor() / pageScale);
1235 makeScrollAndScaleSet(scrollInfo, scrollOffset, pageScale); 1235 makeScrollAndScaleSet(scrollInfo, scrollOffset, pageScale);
1236 } 1236 }
1237 1237
1238 void CCLayerTreeHostImpl::computePinchZoomDeltas(CCScrollAndScaleSet* scrollInfo ) 1238 void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo)
1239 { 1239 {
1240 if (!m_rootScrollLayerImpl) 1240 if (!m_rootScrollLayerImpl)
1241 return; 1241 return;
1242 1242
1243 // Only send fake scroll/zoom deltas if we're pinch zooming out by a 1243 // Only send fake scroll/zoom deltas if we're pinch zooming out by a
1244 // significant amount. This also ensures only one fake delta set will be 1244 // significant amount. This also ensures only one fake delta set will be
1245 // sent. 1245 // sent.
1246 const float pinchZoomOutSensitivity = 0.95f; 1246 const float pinchZoomOutSensitivity = 0.95f;
1247 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity) 1247 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity)
1248 return; 1248 return;
(...skipping 11 matching lines...) Expand all
1260 FloatSize scrollEnd = scrollBegin + anchor; 1260 FloatSize scrollEnd = scrollBegin + anchor;
1261 scrollEnd.scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin); 1261 scrollEnd.scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin);
1262 scrollEnd -= anchor; 1262 scrollEnd -= anchor;
1263 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(scaledContentsSize - m_deviceV iewportSize)).expandedTo(FloatSize(0, 0)); 1263 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(scaledContentsSize - m_deviceV iewportSize)).expandedTo(FloatSize(0, 0));
1264 scrollEnd.scale(1 / pageScaleDeltaToSend); 1264 scrollEnd.scale(1 / pageScaleDeltaToSend);
1265 scrollEnd.scale(m_deviceScaleFactor); 1265 scrollEnd.scale(m_deviceScaleFactor);
1266 1266
1267 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_pinchZoomView port.minPageScaleFactor()); 1267 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_pinchZoomView port.minPageScaleFactor());
1268 } 1268 }
1269 1269
1270 void CCLayerTreeHostImpl::makeScrollAndScaleSet(CCScrollAndScaleSet* scrollInfo, const IntSize& scrollOffset, float pageScale) 1270 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, con st IntSize& scrollOffset, float pageScale)
1271 { 1271 {
1272 if (!m_rootScrollLayerImpl) 1272 if (!m_rootScrollLayerImpl)
1273 return; 1273 return;
1274 1274
1275 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; 1275 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1276 scroll.layerId = m_rootScrollLayerImpl->id(); 1276 scroll.layerId = m_rootScrollLayerImpl->id();
1277 scroll.scrollDelta = scrollOffset - toSize(m_rootScrollLayerImpl->scrollPosi tion()); 1277 scroll.scrollDelta = scrollOffset - toSize(m_rootScrollLayerImpl->scrollPosi tion());
1278 scrollInfo->scrolls.append(scroll); 1278 scrollInfo->scrolls.append(scroll);
1279 m_rootScrollLayerImpl->setSentScrollDelta(scroll.scrollDelta); 1279 m_rootScrollLayerImpl->setSentScrollDelta(scroll.scrollDelta);
1280 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.pageScaleFactor (); 1280 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.pageScaleFactor ();
1281 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta); 1281 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1282 } 1282 }
1283 1283
1284 static void collectScrollDeltas(CCScrollAndScaleSet* scrollInfo, CCLayerImpl* la yerImpl) 1284 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI mpl)
1285 { 1285 {
1286 if (!layerImpl) 1286 if (!layerImpl)
1287 return; 1287 return;
1288 1288
1289 if (!layerImpl->scrollDelta().isZero()) { 1289 if (!layerImpl->scrollDelta().isZero()) {
1290 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); 1290 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta());
1291 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; 1291 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1292 scroll.layerId = layerImpl->id(); 1292 scroll.layerId = layerImpl->id();
1293 scroll.scrollDelta = scrollDelta; 1293 scroll.scrollDelta = scrollDelta;
1294 scrollInfo->scrolls.append(scroll); 1294 scrollInfo->scrolls.append(scroll);
1295 layerImpl->setSentScrollDelta(scrollDelta); 1295 layerImpl->setSentScrollDelta(scrollDelta);
1296 } 1296 }
1297 1297
1298 for (size_t i = 0; i < layerImpl->children().size(); ++i) 1298 for (size_t i = 0; i < layerImpl->children().size(); ++i)
1299 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); 1299 collectScrollDeltas(scrollInfo, layerImpl->children()[i]);
1300 } 1300 }
1301 1301
1302 scoped_ptr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() 1302 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::processScrollDeltas()
1303 { 1303 {
1304 scoped_ptr<CCScrollAndScaleSet> scrollInfo(new CCScrollAndScaleSet()); 1304 scoped_ptr<ScrollAndScaleSet> scrollInfo(new ScrollAndScaleSet());
1305 1305
1306 if (m_pinchGestureActive || m_pageScaleAnimation) { 1306 if (m_pinchGestureActive || m_pageScaleAnimation) {
1307 scrollInfo->pageScaleDelta = 1; 1307 scrollInfo->pageScaleDelta = 1;
1308 m_pinchZoomViewport.setSentPageScaleDelta(1); 1308 m_pinchZoomViewport.setSentPageScaleDelta(1);
1309 // FIXME(aelias): Make these painting optimizations compatible with 1309 // FIXME(aelias): Make these painting optimizations compatible with
1310 // compositor-side scaling. 1310 // compositor-side scaling.
1311 if (!CCSettings::pageScalePinchZoomEnabled()) { 1311 if (!Settings::pageScalePinchZoomEnabled()) {
1312 if (m_pinchGestureActive) 1312 if (m_pinchGestureActive)
1313 computePinchZoomDeltas(scrollInfo.get()); 1313 computePinchZoomDeltas(scrollInfo.get());
1314 else if (m_pageScaleAnimation.get()) 1314 else if (m_pageScaleAnimation.get())
1315 computeDoubleTapZoomDeltas(scrollInfo.get()); 1315 computeDoubleTapZoomDeltas(scrollInfo.get());
1316 } 1316 }
1317 return scrollInfo.Pass(); 1317 return scrollInfo.Pass();
1318 } 1318 }
1319 1319
1320 collectScrollDeltas(scrollInfo.get(), m_rootLayerImpl.get()); 1320 collectScrollDeltas(scrollInfo.get(), m_rootLayerImpl.get());
1321 scrollInfo->pageScaleDelta = m_pinchZoomViewport.pageScaleDelta(); 1321 scrollInfo->pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1322 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta); 1322 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1323 1323
1324 return scrollInfo.Pass(); 1324 return scrollInfo.Pass();
1325 } 1325 }
1326 1326
1327 WebTransformationMatrix CCLayerTreeHostImpl::implTransform() const 1327 WebTransformationMatrix LayerTreeHostImpl::implTransform() const
1328 { 1328 {
1329 return m_pinchZoomViewport.implTransform(); 1329 return m_pinchZoomViewport.implTransform();
1330 } 1330 }
1331 1331
1332 void CCLayerTreeHostImpl::setFullRootLayerDamage() 1332 void LayerTreeHostImpl::setFullRootLayerDamage()
1333 { 1333 {
1334 if (m_rootLayerImpl) { 1334 if (m_rootLayerImpl) {
1335 CCRenderSurface* renderSurface = m_rootLayerImpl->renderSurface(); 1335 RenderSurfaceImpl* renderSurface = m_rootLayerImpl->renderSurface();
1336 if (renderSurface) 1336 if (renderSurface)
1337 renderSurface->damageTracker()->forceFullDamageNextUpdate(); 1337 renderSurface->damageTracker()->forceFullDamageNextUpdate();
1338 } 1338 }
1339 } 1339 }
1340 1340
1341 void CCLayerTreeHostImpl::animatePageScale(double monotonicTime) 1341 void LayerTreeHostImpl::animatePageScale(double monotonicTime)
1342 { 1342 {
1343 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl) 1343 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl)
1344 return; 1344 return;
1345 1345
1346 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta()); 1346 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta());
1347 1347
1348 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p inchZoomViewport.pageScaleFactor()); 1348 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p inchZoomViewport.pageScaleFactor());
1349 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime) ; 1349 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime) ;
1350 nextScroll.scale(1 / m_pinchZoomViewport.pageScaleDelta()); 1350 nextScroll.scale(1 / m_pinchZoomViewport.pageScaleDelta());
1351 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); 1351 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal);
1352 m_client->setNeedsRedrawOnImplThread(); 1352 m_client->setNeedsRedrawOnImplThread();
1353 1353
1354 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { 1354 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) {
1355 m_pageScaleAnimation.reset(); 1355 m_pageScaleAnimation.reset();
1356 m_client->setNeedsCommitOnImplThread(); 1356 m_client->setNeedsCommitOnImplThread();
1357 } 1357 }
1358 } 1358 }
1359 1359
1360 void CCLayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTi me) 1360 void LayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTime )
1361 { 1361 {
1362 if (!CCSettings::acceleratedAnimationEnabled() || !m_needsAnimateLayers || ! m_rootLayerImpl) 1362 if (!Settings::acceleratedAnimationEnabled() || !m_needsAnimateLayers || !m_ rootLayerImpl)
1363 return; 1363 return;
1364 1364
1365 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::animateLayers"); 1365 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers");
1366 1366
1367 scoped_ptr<CCAnimationEventsVector> events(make_scoped_ptr(new CCAnimationEv entsVector)); 1367 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents Vector));
1368 1368
1369 bool didAnimate = false; 1369 bool didAnimate = false;
1370 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime, events.get(), didAnimate, m_needsAnimateLayers); 1370 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime, events.get(), didAnimate, m_needsAnimateLayers);
1371 1371
1372 if (!events->empty()) 1372 if (!events->empty())
1373 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal lClockTime); 1373 m_client->postAnimationEventsToMainThreadOnImplThread(events.Pass(), wal lClockTime);
1374 1374
1375 if (didAnimate) 1375 if (didAnimate)
1376 m_client->setNeedsRedrawOnImplThread(); 1376 m_client->setNeedsRedrawOnImplThread();
1377 1377
1378 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers); 1378 setBackgroundTickingEnabled(!m_visible && m_needsAnimateLayers);
1379 } 1379 }
1380 1380
1381 base::TimeDelta CCLayerTreeHostImpl::lowFrequencyAnimationInterval() const 1381 base::TimeDelta LayerTreeHostImpl::lowFrequencyAnimationInterval() const
1382 { 1382 {
1383 return base::TimeDelta::FromSeconds(1); 1383 return base::TimeDelta::FromSeconds(1);
1384 } 1384 }
1385 1385
1386 void CCLayerTreeHostImpl::sendDidLoseContextRecursive(CCLayerImpl* current) 1386 void LayerTreeHostImpl::sendDidLoseContextRecursive(LayerImpl* current)
1387 { 1387 {
1388 ASSERT(current); 1388 ASSERT(current);
1389 current->didLoseContext(); 1389 current->didLoseContext();
1390 if (current->maskLayer()) 1390 if (current->maskLayer())
1391 sendDidLoseContextRecursive(current->maskLayer()); 1391 sendDidLoseContextRecursive(current->maskLayer());
1392 if (current->replicaLayer()) 1392 if (current->replicaLayer())
1393 sendDidLoseContextRecursive(current->replicaLayer()); 1393 sendDidLoseContextRecursive(current->replicaLayer());
1394 for (size_t i = 0; i < current->children().size(); ++i) 1394 for (size_t i = 0; i < current->children().size(); ++i)
1395 sendDidLoseContextRecursive(current->children()[i]); 1395 sendDidLoseContextRecursive(current->children()[i]);
1396 } 1396 }
1397 1397
1398 static void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* current) 1398 static void clearRenderSurfacesOnLayerImplRecursive(LayerImpl* current)
1399 { 1399 {
1400 ASSERT(current); 1400 ASSERT(current);
1401 for (size_t i = 0; i < current->children().size(); ++i) 1401 for (size_t i = 0; i < current->children().size(); ++i)
1402 clearRenderSurfacesOnCCLayerImplRecursive(current->children()[i]); 1402 clearRenderSurfacesOnLayerImplRecursive(current->children()[i]);
1403 current->clearRenderSurface(); 1403 current->clearRenderSurface();
1404 } 1404 }
1405 1405
1406 void CCLayerTreeHostImpl::clearRenderSurfaces() 1406 void LayerTreeHostImpl::clearRenderSurfaces()
1407 { 1407 {
1408 clearRenderSurfacesOnCCLayerImplRecursive(m_rootLayerImpl.get()); 1408 clearRenderSurfacesOnLayerImplRecursive(m_rootLayerImpl.get());
1409 m_renderSurfaceLayerList.clear(); 1409 m_renderSurfaceLayerList.clear();
1410 } 1410 }
1411 1411
1412 std::string CCLayerTreeHostImpl::layerTreeAsText() const 1412 std::string LayerTreeHostImpl::layerTreeAsText() const
1413 { 1413 {
1414 std::string str; 1414 std::string str;
1415 if (m_rootLayerImpl) { 1415 if (m_rootLayerImpl) {
1416 str = m_rootLayerImpl->layerTreeAsText(); 1416 str = m_rootLayerImpl->layerTreeAsText();
1417 str += "RenderSurfaces:\n"; 1417 str += "RenderSurfaces:\n";
1418 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); 1418 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get());
1419 } 1419 }
1420 return str; 1420 return str;
1421 } 1421 }
1422 1422
1423 void CCLayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const CCLayerImpl* layer) const 1423 void LayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const L ayerImpl* layer) const
1424 { 1424 {
1425 if (layer->renderSurface()) 1425 if (layer->renderSurface())
1426 layer->renderSurface()->dumpSurface(str, indent); 1426 layer->renderSurface()->dumpSurface(str, indent);
1427 1427
1428 for (size_t i = 0; i < layer->children().size(); ++i) 1428 for (size_t i = 0; i < layer->children().size(); ++i)
1429 dumpRenderSurfaces(str, indent, layer->children()[i]); 1429 dumpRenderSurfaces(str, indent, layer->children()[i]);
1430 } 1430 }
1431 1431
1432 int CCLayerTreeHostImpl::sourceAnimationFrameNumber() const 1432 int LayerTreeHostImpl::sourceAnimationFrameNumber() const
1433 { 1433 {
1434 return fpsCounter()->currentFrameNumber(); 1434 return fpsCounter()->currentFrameNumber();
1435 } 1435 }
1436 1436
1437 void CCLayerTreeHostImpl::renderingStats(CCRenderingStats* stats) const 1437 void LayerTreeHostImpl::renderingStats(RenderingStats* stats) const
1438 { 1438 {
1439 stats->numFramesSentToScreen = fpsCounter()->currentFrameNumber(); 1439 stats->numFramesSentToScreen = fpsCounter()->currentFrameNumber();
1440 stats->droppedFrameCount = fpsCounter()->droppedFrameCount(); 1440 stats->droppedFrameCount = fpsCounter()->droppedFrameCount();
1441 stats->numImplThreadScrolls = m_numImplThreadScrolls; 1441 stats->numImplThreadScrolls = m_numImplThreadScrolls;
1442 stats->numMainThreadScrolls = m_numMainThreadScrolls; 1442 stats->numMainThreadScrolls = m_numMainThreadScrolls;
1443 } 1443 }
1444 1444
1445 void CCLayerTreeHostImpl::animateScrollbars(double monotonicTime) 1445 void LayerTreeHostImpl::animateScrollbars(double monotonicTime)
1446 { 1446 {
1447 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); 1447 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime);
1448 } 1448 }
1449 1449
1450 void CCLayerTreeHostImpl::animateScrollbarsRecursive(CCLayerImpl* layer, double monotonicTime) 1450 void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, double mono tonicTime)
1451 { 1451 {
1452 if (!layer) 1452 if (!layer)
1453 return; 1453 return;
1454 1454
1455 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat ionController(); 1455 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController();
1456 if (scrollbarController && scrollbarController->animate(monotonicTime)) 1456 if (scrollbarController && scrollbarController->animate(monotonicTime))
1457 m_client->setNeedsRedrawOnImplThread(); 1457 m_client->setNeedsRedrawOnImplThread();
1458 1458
1459 for (size_t i = 0; i < layer->children().size(); ++i) 1459 for (size_t i = 0; i < layer->children().size(); ++i)
1460 animateScrollbarsRecursive(layer->children()[i], monotonicTime); 1460 animateScrollbarsRecursive(layer->children()[i], monotonicTime);
1461 } 1461 }
1462 1462
1463 } // namespace cc 1463 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698