OLD | NEW |
| (Empty) |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 | |
7 #if USE(ACCELERATED_COMPOSITING) | |
8 #include "LayerChromium.h" | |
9 | |
10 #include "CCActiveAnimation.h" | |
11 #include "CCAnimationEvents.h" | |
12 #include "CCLayerAnimationController.h" | |
13 #include "CCLayerImpl.h" | |
14 #include "CCLayerTreeHost.h" | |
15 #include "CCSettings.h" | |
16 #include <public/WebAnimationDelegate.h> | |
17 #include <public/WebLayerScrollClient.h> | |
18 #include <public/WebSize.h> | |
19 | |
20 using namespace std; | |
21 using WebKit::WebTransformationMatrix; | |
22 | |
23 namespace cc { | |
24 | |
25 static int s_nextLayerId = 1; | |
26 | |
27 scoped_refptr<LayerChromium> LayerChromium::create() | |
28 { | |
29 return make_scoped_refptr(new LayerChromium()); | |
30 } | |
31 | |
32 LayerChromium::LayerChromium() | |
33 : m_needsDisplay(false) | |
34 , m_stackingOrderChanged(false) | |
35 , m_layerId(s_nextLayerId++) | |
36 , m_parent(0) | |
37 , m_layerTreeHost(0) | |
38 , m_layerAnimationController(CCLayerAnimationController::create(this)) | |
39 , m_scrollable(false) | |
40 , m_shouldScrollOnMainThread(false) | |
41 , m_haveWheelEventHandlers(false) | |
42 , m_nonFastScrollableRegionChanged(false) | |
43 , m_anchorPoint(0.5, 0.5) | |
44 , m_backgroundColor(0) | |
45 , m_debugBorderColor(0) | |
46 , m_debugBorderWidth(0) | |
47 , m_opacity(1.0) | |
48 , m_anchorPointZ(0) | |
49 , m_isContainerForFixedPositionLayers(false) | |
50 , m_fixedToContainerLayer(false) | |
51 , m_isDrawable(false) | |
52 , m_masksToBounds(false) | |
53 , m_contentsOpaque(false) | |
54 , m_doubleSided(true) | |
55 , m_useLCDText(false) | |
56 , m_preserves3D(false) | |
57 , m_useParentBackfaceVisibility(false) | |
58 , m_drawCheckerboardForMissingTiles(false) | |
59 , m_forceRenderSurface(false) | |
60 , m_replicaLayer(0) | |
61 , m_drawOpacity(0) | |
62 , m_drawOpacityIsAnimating(false) | |
63 , m_renderTarget(0) | |
64 , m_drawTransformIsAnimating(false) | |
65 , m_screenSpaceTransformIsAnimating(false) | |
66 , m_contentsScale(1.0) | |
67 , m_boundsContainPageScale(false) | |
68 , m_layerAnimationDelegate(0) | |
69 , m_layerScrollClient(0) | |
70 { | |
71 if (m_layerId < 0) { | |
72 s_nextLayerId = 1; | |
73 m_layerId = s_nextLayerId++; | |
74 } | |
75 } | |
76 | |
77 LayerChromium::~LayerChromium() | |
78 { | |
79 // Our parent should be holding a reference to us so there should be no | |
80 // way for us to be destroyed while we still have a parent. | |
81 ASSERT(!parent()); | |
82 | |
83 // Remove the parent reference from all children. | |
84 removeAllChildren(); | |
85 } | |
86 | |
87 void LayerChromium::setUseLCDText(bool useLCDText) | |
88 { | |
89 m_useLCDText = useLCDText; | |
90 } | |
91 | |
92 void LayerChromium::setLayerTreeHost(CCLayerTreeHost* host) | |
93 { | |
94 if (m_layerTreeHost == host) | |
95 return; | |
96 | |
97 m_layerTreeHost = host; | |
98 | |
99 for (size_t i = 0; i < m_children.size(); ++i) | |
100 m_children[i]->setLayerTreeHost(host); | |
101 | |
102 if (m_maskLayer) | |
103 m_maskLayer->setLayerTreeHost(host); | |
104 if (m_replicaLayer) | |
105 m_replicaLayer->setLayerTreeHost(host); | |
106 | |
107 // If this layer already has active animations, the host needs to be notifie
d. | |
108 if (host && m_layerAnimationController->hasActiveAnimation()) | |
109 host->didAddAnimation(); | |
110 } | |
111 | |
112 void LayerChromium::setNeedsCommit() | |
113 { | |
114 if (m_layerTreeHost) | |
115 m_layerTreeHost->setNeedsCommit(); | |
116 } | |
117 | |
118 IntRect LayerChromium::layerRectToContentRect(const WebKit::WebRect& layerRect) | |
119 { | |
120 float widthScale = static_cast<float>(contentBounds().width()) / bounds().wi
dth(); | |
121 float heightScale = static_cast<float>(contentBounds().height()) / bounds().
height(); | |
122 FloatRect contentRect(layerRect.x, layerRect.y, layerRect.width, layerRect.h
eight); | |
123 contentRect.scale(widthScale, heightScale); | |
124 return enclosingIntRect(contentRect); | |
125 } | |
126 | |
127 void LayerChromium::setParent(LayerChromium* layer) | |
128 { | |
129 ASSERT(!layer || !layer->hasAncestor(this)); | |
130 m_parent = layer; | |
131 setLayerTreeHost(m_parent ? m_parent->layerTreeHost() : 0); | |
132 } | |
133 | |
134 bool LayerChromium::hasAncestor(LayerChromium* ancestor) const | |
135 { | |
136 for (LayerChromium* layer = parent(); layer; layer = layer->parent()) { | |
137 if (layer == ancestor) | |
138 return true; | |
139 } | |
140 return false; | |
141 } | |
142 | |
143 void LayerChromium::addChild(scoped_refptr<LayerChromium> child) | |
144 { | |
145 insertChild(child, numChildren()); | |
146 } | |
147 | |
148 void LayerChromium::insertChild(scoped_refptr<LayerChromium> child, size_t index
) | |
149 { | |
150 index = min(index, m_children.size()); | |
151 child->removeFromParent(); | |
152 child->setParent(this); | |
153 child->m_stackingOrderChanged = true; | |
154 | |
155 LayerList::iterator iter = m_children.begin(); | |
156 m_children.insert(iter + index, child); | |
157 setNeedsCommit(); | |
158 } | |
159 | |
160 void LayerChromium::removeFromParent() | |
161 { | |
162 if (m_parent) | |
163 m_parent->removeChild(this); | |
164 } | |
165 | |
166 void LayerChromium::removeChild(LayerChromium* child) | |
167 { | |
168 for (LayerList::iterator iter = m_children.begin(); iter != m_children.end()
; ++iter) | |
169 { | |
170 if (*iter != child) | |
171 continue; | |
172 | |
173 child->setParent(0); | |
174 m_children.erase(iter); | |
175 setNeedsCommit(); | |
176 return; | |
177 } | |
178 } | |
179 | |
180 void LayerChromium::replaceChild(LayerChromium* reference, scoped_refptr<LayerCh
romium> newLayer) | |
181 { | |
182 ASSERT_ARG(reference, reference); | |
183 ASSERT_ARG(reference, reference->parent() == this); | |
184 | |
185 if (reference == newLayer) | |
186 return; | |
187 | |
188 int referenceIndex = indexOfChild(reference); | |
189 if (referenceIndex == -1) { | |
190 ASSERT_NOT_REACHED(); | |
191 return; | |
192 } | |
193 | |
194 reference->removeFromParent(); | |
195 | |
196 if (newLayer) { | |
197 newLayer->removeFromParent(); | |
198 insertChild(newLayer, referenceIndex); | |
199 } | |
200 } | |
201 | |
202 int LayerChromium::indexOfChild(const LayerChromium* reference) | |
203 { | |
204 for (size_t i = 0; i < m_children.size(); i++) { | |
205 if (m_children[i] == reference) | |
206 return i; | |
207 } | |
208 return -1; | |
209 } | |
210 | |
211 void LayerChromium::setBounds(const IntSize& size) | |
212 { | |
213 if (bounds() == size) | |
214 return; | |
215 | |
216 bool firstResize = bounds().isEmpty() && !size.isEmpty(); | |
217 | |
218 m_bounds = size; | |
219 | |
220 if (firstResize) | |
221 setNeedsDisplay(); | |
222 else | |
223 setNeedsCommit(); | |
224 } | |
225 | |
226 LayerChromium* LayerChromium::rootLayer() | |
227 { | |
228 LayerChromium* layer = this; | |
229 while (layer->parent()) | |
230 layer = layer->parent(); | |
231 return layer; | |
232 } | |
233 | |
234 void LayerChromium::removeAllChildren() | |
235 { | |
236 while (m_children.size()) { | |
237 LayerChromium* layer = m_children[0].get(); | |
238 ASSERT(layer->parent()); | |
239 layer->removeFromParent(); | |
240 } | |
241 } | |
242 | |
243 void LayerChromium::setChildren(const LayerList& children) | |
244 { | |
245 if (children == m_children) | |
246 return; | |
247 | |
248 removeAllChildren(); | |
249 size_t listSize = children.size(); | |
250 for (size_t i = 0; i < listSize; i++) | |
251 addChild(children[i]); | |
252 } | |
253 | |
254 void LayerChromium::setAnchorPoint(const FloatPoint& anchorPoint) | |
255 { | |
256 if (m_anchorPoint == anchorPoint) | |
257 return; | |
258 m_anchorPoint = anchorPoint; | |
259 setNeedsCommit(); | |
260 } | |
261 | |
262 void LayerChromium::setAnchorPointZ(float anchorPointZ) | |
263 { | |
264 if (m_anchorPointZ == anchorPointZ) | |
265 return; | |
266 m_anchorPointZ = anchorPointZ; | |
267 setNeedsCommit(); | |
268 } | |
269 | |
270 void LayerChromium::setBackgroundColor(SkColor backgroundColor) | |
271 { | |
272 if (m_backgroundColor == backgroundColor) | |
273 return; | |
274 m_backgroundColor = backgroundColor; | |
275 setNeedsCommit(); | |
276 } | |
277 | |
278 IntSize LayerChromium::contentBounds() const | |
279 { | |
280 return bounds(); | |
281 } | |
282 | |
283 void LayerChromium::setMasksToBounds(bool masksToBounds) | |
284 { | |
285 if (m_masksToBounds == masksToBounds) | |
286 return; | |
287 m_masksToBounds = masksToBounds; | |
288 setNeedsCommit(); | |
289 } | |
290 | |
291 void LayerChromium::setMaskLayer(LayerChromium* maskLayer) | |
292 { | |
293 if (m_maskLayer == maskLayer) | |
294 return; | |
295 if (m_maskLayer) | |
296 m_maskLayer->setLayerTreeHost(0); | |
297 m_maskLayer = maskLayer; | |
298 if (m_maskLayer) { | |
299 m_maskLayer->setLayerTreeHost(m_layerTreeHost); | |
300 m_maskLayer->setIsMask(true); | |
301 } | |
302 setNeedsCommit(); | |
303 } | |
304 | |
305 void LayerChromium::setReplicaLayer(LayerChromium* layer) | |
306 { | |
307 if (m_replicaLayer == layer) | |
308 return; | |
309 if (m_replicaLayer) | |
310 m_replicaLayer->setLayerTreeHost(0); | |
311 m_replicaLayer = layer; | |
312 if (m_replicaLayer) | |
313 m_replicaLayer->setLayerTreeHost(m_layerTreeHost); | |
314 setNeedsCommit(); | |
315 } | |
316 | |
317 void LayerChromium::setFilters(const WebKit::WebFilterOperations& filters) | |
318 { | |
319 if (m_filters == filters) | |
320 return; | |
321 m_filters = filters; | |
322 setNeedsCommit(); | |
323 if (!filters.isEmpty()) | |
324 CCLayerTreeHost::setNeedsFilterContext(true); | |
325 } | |
326 | |
327 void LayerChromium::setBackgroundFilters(const WebKit::WebFilterOperations& back
groundFilters) | |
328 { | |
329 if (m_backgroundFilters == backgroundFilters) | |
330 return; | |
331 m_backgroundFilters = backgroundFilters; | |
332 setNeedsCommit(); | |
333 if (!backgroundFilters.isEmpty()) | |
334 CCLayerTreeHost::setNeedsFilterContext(true); | |
335 } | |
336 | |
337 bool LayerChromium::needsDisplay() const | |
338 { | |
339 return m_needsDisplay; | |
340 } | |
341 | |
342 void LayerChromium::setOpacity(float opacity) | |
343 { | |
344 if (m_opacity == opacity) | |
345 return; | |
346 m_opacity = opacity; | |
347 setNeedsCommit(); | |
348 } | |
349 | |
350 bool LayerChromium::opacityIsAnimating() const | |
351 { | |
352 return m_layerAnimationController->isAnimatingProperty(CCActiveAnimation::Op
acity); | |
353 } | |
354 | |
355 void LayerChromium::setContentsOpaque(bool opaque) | |
356 { | |
357 if (m_contentsOpaque == opaque) | |
358 return; | |
359 m_contentsOpaque = opaque; | |
360 setNeedsDisplay(); | |
361 } | |
362 | |
363 void LayerChromium::setPosition(const FloatPoint& position) | |
364 { | |
365 if (m_position == position) | |
366 return; | |
367 m_position = position; | |
368 setNeedsCommit(); | |
369 } | |
370 | |
371 void LayerChromium::setSublayerTransform(const WebTransformationMatrix& sublayer
Transform) | |
372 { | |
373 if (m_sublayerTransform == sublayerTransform) | |
374 return; | |
375 m_sublayerTransform = sublayerTransform; | |
376 setNeedsCommit(); | |
377 } | |
378 | |
379 void LayerChromium::setTransform(const WebTransformationMatrix& transform) | |
380 { | |
381 if (m_transform == transform) | |
382 return; | |
383 m_transform = transform; | |
384 setNeedsCommit(); | |
385 } | |
386 | |
387 bool LayerChromium::transformIsAnimating() const | |
388 { | |
389 return m_layerAnimationController->isAnimatingProperty(CCActiveAnimation::Tr
ansform); | |
390 } | |
391 | |
392 void LayerChromium::setScrollPosition(const IntPoint& scrollPosition) | |
393 { | |
394 if (m_scrollPosition == scrollPosition) | |
395 return; | |
396 m_scrollPosition = scrollPosition; | |
397 if (m_layerScrollClient) | |
398 m_layerScrollClient->didScroll(); | |
399 setNeedsCommit(); | |
400 } | |
401 | |
402 void LayerChromium::setMaxScrollPosition(const IntSize& maxScrollPosition) | |
403 { | |
404 if (m_maxScrollPosition == maxScrollPosition) | |
405 return; | |
406 m_maxScrollPosition = maxScrollPosition; | |
407 setNeedsCommit(); | |
408 } | |
409 | |
410 void LayerChromium::setScrollable(bool scrollable) | |
411 { | |
412 if (m_scrollable == scrollable) | |
413 return; | |
414 m_scrollable = scrollable; | |
415 setNeedsCommit(); | |
416 } | |
417 | |
418 void LayerChromium::setShouldScrollOnMainThread(bool shouldScrollOnMainThread) | |
419 { | |
420 if (m_shouldScrollOnMainThread == shouldScrollOnMainThread) | |
421 return; | |
422 m_shouldScrollOnMainThread = shouldScrollOnMainThread; | |
423 setNeedsCommit(); | |
424 } | |
425 | |
426 void LayerChromium::setHaveWheelEventHandlers(bool haveWheelEventHandlers) | |
427 { | |
428 if (m_haveWheelEventHandlers == haveWheelEventHandlers) | |
429 return; | |
430 m_haveWheelEventHandlers = haveWheelEventHandlers; | |
431 setNeedsCommit(); | |
432 } | |
433 | |
434 void LayerChromium::setNonFastScrollableRegion(const Region& region) | |
435 { | |
436 if (m_nonFastScrollableRegion == region) | |
437 return; | |
438 m_nonFastScrollableRegion = region; | |
439 m_nonFastScrollableRegionChanged = true; | |
440 setNeedsCommit(); | |
441 } | |
442 | |
443 void LayerChromium::setDrawCheckerboardForMissingTiles(bool checkerboard) | |
444 { | |
445 if (m_drawCheckerboardForMissingTiles == checkerboard) | |
446 return; | |
447 m_drawCheckerboardForMissingTiles = checkerboard; | |
448 setNeedsCommit(); | |
449 } | |
450 | |
451 void LayerChromium::setForceRenderSurface(bool force) | |
452 { | |
453 if (m_forceRenderSurface == force) | |
454 return; | |
455 m_forceRenderSurface = force; | |
456 setNeedsCommit(); | |
457 } | |
458 | |
459 void LayerChromium::setImplTransform(const WebTransformationMatrix& transform) | |
460 { | |
461 if (m_implTransform == transform) | |
462 return; | |
463 m_implTransform = transform; | |
464 setNeedsCommit(); | |
465 } | |
466 | |
467 void LayerChromium::setDoubleSided(bool doubleSided) | |
468 { | |
469 if (m_doubleSided == doubleSided) | |
470 return; | |
471 m_doubleSided = doubleSided; | |
472 setNeedsCommit(); | |
473 } | |
474 | |
475 void LayerChromium::setIsDrawable(bool isDrawable) | |
476 { | |
477 if (m_isDrawable == isDrawable) | |
478 return; | |
479 | |
480 m_isDrawable = isDrawable; | |
481 setNeedsCommit(); | |
482 } | |
483 | |
484 LayerChromium* LayerChromium::parent() const | |
485 { | |
486 return m_parent; | |
487 } | |
488 | |
489 void LayerChromium::setNeedsDisplayRect(const FloatRect& dirtyRect) | |
490 { | |
491 m_updateRect.unite(dirtyRect); | |
492 | |
493 // Simply mark the contents as dirty. For non-root layers, the call to | |
494 // setNeedsCommit will schedule a fresh compositing pass. | |
495 // For the root layer, setNeedsCommit has no effect. | |
496 if (!dirtyRect.isEmpty()) | |
497 m_needsDisplay = true; | |
498 | |
499 setNeedsCommit(); | |
500 } | |
501 | |
502 bool LayerChromium::descendantIsFixedToContainerLayer() const | |
503 { | |
504 for (size_t i = 0; i < m_children.size(); ++i) { | |
505 if (m_children[i]->fixedToContainerLayer() || m_children[i]->descendantI
sFixedToContainerLayer()) | |
506 return true; | |
507 } | |
508 return false; | |
509 } | |
510 | |
511 void LayerChromium::setIsContainerForFixedPositionLayers(bool isContainerForFixe
dPositionLayers) | |
512 { | |
513 if (m_isContainerForFixedPositionLayers == isContainerForFixedPositionLayers
) | |
514 return; | |
515 m_isContainerForFixedPositionLayers = isContainerForFixedPositionLayers; | |
516 | |
517 if (m_layerTreeHost && m_layerTreeHost->commitRequested()) | |
518 return; | |
519 | |
520 // Only request a commit if we have a fixed positioned descendant. | |
521 if (descendantIsFixedToContainerLayer()) | |
522 setNeedsCommit(); | |
523 } | |
524 | |
525 void LayerChromium::setFixedToContainerLayer(bool fixedToContainerLayer) | |
526 { | |
527 if (m_fixedToContainerLayer == fixedToContainerLayer) | |
528 return; | |
529 m_fixedToContainerLayer = fixedToContainerLayer; | |
530 setNeedsCommit(); | |
531 } | |
532 | |
533 void LayerChromium::pushPropertiesTo(CCLayerImpl* layer) | |
534 { | |
535 layer->setAnchorPoint(m_anchorPoint); | |
536 layer->setAnchorPointZ(m_anchorPointZ); | |
537 layer->setBackgroundColor(m_backgroundColor); | |
538 layer->setBounds(m_bounds); | |
539 layer->setContentBounds(contentBounds()); | |
540 layer->setDebugBorderColor(m_debugBorderColor); | |
541 layer->setDebugBorderWidth(m_debugBorderWidth); | |
542 layer->setDebugName(m_debugName); | |
543 layer->setDoubleSided(m_doubleSided); | |
544 layer->setDrawCheckerboardForMissingTiles(m_drawCheckerboardForMissingTiles)
; | |
545 layer->setForceRenderSurface(m_forceRenderSurface); | |
546 layer->setDrawsContent(drawsContent()); | |
547 layer->setFilters(filters()); | |
548 layer->setBackgroundFilters(backgroundFilters()); | |
549 layer->setUseLCDText(m_useLCDText); | |
550 layer->setMasksToBounds(m_masksToBounds); | |
551 layer->setScrollable(m_scrollable); | |
552 layer->setShouldScrollOnMainThread(m_shouldScrollOnMainThread); | |
553 layer->setHaveWheelEventHandlers(m_haveWheelEventHandlers); | |
554 // Copying a Region is more expensive than most layer properties, since it i
nvolves copying two Vectors that may be | |
555 // arbitrarily large depending on page content, so we only push the property
if it's changed. | |
556 if (m_nonFastScrollableRegionChanged) { | |
557 layer->setNonFastScrollableRegion(m_nonFastScrollableRegion); | |
558 m_nonFastScrollableRegionChanged = false; | |
559 } | |
560 layer->setContentsOpaque(m_contentsOpaque); | |
561 if (!opacityIsAnimating()) | |
562 layer->setOpacity(m_opacity); | |
563 layer->setPosition(m_position); | |
564 layer->setIsContainerForFixedPositionLayers(m_isContainerForFixedPositionLay
ers); | |
565 layer->setFixedToContainerLayer(m_fixedToContainerLayer); | |
566 layer->setPreserves3D(preserves3D()); | |
567 layer->setUseParentBackfaceVisibility(m_useParentBackfaceVisibility); | |
568 layer->setScrollPosition(m_scrollPosition); | |
569 layer->setMaxScrollPosition(m_maxScrollPosition); | |
570 layer->setSublayerTransform(m_sublayerTransform); | |
571 if (!transformIsAnimating()) | |
572 layer->setTransform(m_transform); | |
573 | |
574 // If the main thread commits multiple times before the impl thread actually
draws, then damage tracking | |
575 // will become incorrect if we simply clobber the updateRect here. The CCLay
erImpl's updateRect needs to | |
576 // accumulate (i.e. union) any update changes that have occurred on the main
thread. | |
577 m_updateRect.uniteIfNonZero(layer->updateRect()); | |
578 layer->setUpdateRect(m_updateRect); | |
579 | |
580 layer->setScrollDelta(layer->scrollDelta() - layer->sentScrollDelta()); | |
581 layer->setSentScrollDelta(IntSize()); | |
582 | |
583 layer->setStackingOrderChanged(m_stackingOrderChanged); | |
584 | |
585 if (maskLayer()) | |
586 maskLayer()->pushPropertiesTo(layer->maskLayer()); | |
587 if (replicaLayer()) | |
588 replicaLayer()->pushPropertiesTo(layer->replicaLayer()); | |
589 | |
590 m_layerAnimationController->pushAnimationUpdatesTo(layer->layerAnimationCont
roller()); | |
591 | |
592 // Reset any state that should be cleared for the next update. | |
593 m_stackingOrderChanged = false; | |
594 m_updateRect = FloatRect(); | |
595 } | |
596 | |
597 scoped_ptr<CCLayerImpl> LayerChromium::createCCLayerImpl() | |
598 { | |
599 return CCLayerImpl::create(m_layerId); | |
600 } | |
601 | |
602 bool LayerChromium::drawsContent() const | |
603 { | |
604 return m_isDrawable; | |
605 } | |
606 | |
607 bool LayerChromium::needMoreUpdates() | |
608 { | |
609 return false; | |
610 } | |
611 | |
612 bool LayerChromium::needsContentsScale() const | |
613 { | |
614 return false; | |
615 } | |
616 | |
617 void LayerChromium::setDebugBorderColor(SkColor color) | |
618 { | |
619 m_debugBorderColor = color; | |
620 setNeedsCommit(); | |
621 } | |
622 | |
623 void LayerChromium::setDebugBorderWidth(float width) | |
624 { | |
625 m_debugBorderWidth = width; | |
626 setNeedsCommit(); | |
627 } | |
628 | |
629 void LayerChromium::setDebugName(const std::string& debugName) | |
630 { | |
631 m_debugName = debugName; | |
632 setNeedsCommit(); | |
633 } | |
634 | |
635 void LayerChromium::setContentsScale(float contentsScale) | |
636 { | |
637 if (!needsContentsScale() || m_contentsScale == contentsScale) | |
638 return; | |
639 m_contentsScale = contentsScale; | |
640 | |
641 setNeedsDisplay(); | |
642 } | |
643 | |
644 void LayerChromium::setBoundsContainPageScale(bool boundsContainPageScale) | |
645 { | |
646 for (size_t i = 0; i < m_children.size(); ++i) | |
647 m_children[i]->setBoundsContainPageScale(boundsContainPageScale); | |
648 | |
649 if (boundsContainPageScale == m_boundsContainPageScale) | |
650 return; | |
651 | |
652 m_boundsContainPageScale = boundsContainPageScale; | |
653 setNeedsDisplay(); | |
654 } | |
655 | |
656 void LayerChromium::createRenderSurface() | |
657 { | |
658 ASSERT(!m_renderSurface); | |
659 m_renderSurface = make_scoped_ptr(new RenderSurfaceChromium(this)); | |
660 setRenderTarget(this); | |
661 } | |
662 | |
663 bool LayerChromium::descendantDrawsContent() | |
664 { | |
665 for (size_t i = 0; i < m_children.size(); ++i) { | |
666 if (m_children[i]->drawsContent() || m_children[i]->descendantDrawsConte
nt()) | |
667 return true; | |
668 } | |
669 return false; | |
670 } | |
671 | |
672 int LayerChromium::id() const | |
673 { | |
674 return m_layerId; | |
675 } | |
676 | |
677 float LayerChromium::opacity() const | |
678 { | |
679 return m_opacity; | |
680 } | |
681 | |
682 void LayerChromium::setOpacityFromAnimation(float opacity) | |
683 { | |
684 // This is called due to an ongoing accelerated animation. Since this animat
ion is | |
685 // also being run on the impl thread, there is no need to request a commit t
o push | |
686 // this value over, so set the value directly rather than calling setOpacity
. | |
687 m_opacity = opacity; | |
688 } | |
689 | |
690 const WebKit::WebTransformationMatrix& LayerChromium::transform() const | |
691 { | |
692 return m_transform; | |
693 } | |
694 | |
695 void LayerChromium::setTransformFromAnimation(const WebTransformationMatrix& tra
nsform) | |
696 { | |
697 // This is called due to an ongoing accelerated animation. Since this animat
ion is | |
698 // also being run on the impl thread, there is no need to request a commit t
o push | |
699 // this value over, so set this value directly rather than calling setTransf
orm. | |
700 m_transform = transform; | |
701 } | |
702 | |
703 bool LayerChromium::addAnimation(scoped_ptr <CCActiveAnimation> animation) | |
704 { | |
705 // WebCore currently assumes that accelerated animations will start soon | |
706 // after the animation is added. However we cannot guarantee that if we do | |
707 // not have a layerTreeHost that will setNeedsCommit(). | |
708 if (!m_layerTreeHost) | |
709 return false; | |
710 | |
711 if (!CCSettings::acceleratedAnimationEnabled()) | |
712 return false; | |
713 | |
714 m_layerAnimationController->addAnimation(animation.Pass()); | |
715 if (m_layerTreeHost) { | |
716 m_layerTreeHost->didAddAnimation(); | |
717 setNeedsCommit(); | |
718 } | |
719 return true; | |
720 } | |
721 | |
722 void LayerChromium::pauseAnimation(int animationId, double timeOffset) | |
723 { | |
724 m_layerAnimationController->pauseAnimation(animationId, timeOffset); | |
725 setNeedsCommit(); | |
726 } | |
727 | |
728 void LayerChromium::removeAnimation(int animationId) | |
729 { | |
730 m_layerAnimationController->removeAnimation(animationId); | |
731 setNeedsCommit(); | |
732 } | |
733 | |
734 void LayerChromium::suspendAnimations(double monotonicTime) | |
735 { | |
736 m_layerAnimationController->suspendAnimations(monotonicTime); | |
737 setNeedsCommit(); | |
738 } | |
739 | |
740 void LayerChromium::resumeAnimations(double monotonicTime) | |
741 { | |
742 m_layerAnimationController->resumeAnimations(monotonicTime); | |
743 setNeedsCommit(); | |
744 } | |
745 | |
746 void LayerChromium::setLayerAnimationController(scoped_ptr<CCLayerAnimationContr
oller> layerAnimationController) | |
747 { | |
748 m_layerAnimationController = layerAnimationController.Pass(); | |
749 if (m_layerAnimationController) { | |
750 m_layerAnimationController->setClient(this); | |
751 m_layerAnimationController->setForceSync(); | |
752 } | |
753 setNeedsCommit(); | |
754 } | |
755 | |
756 scoped_ptr<CCLayerAnimationController> LayerChromium::releaseLayerAnimationContr
oller() | |
757 { | |
758 scoped_ptr<CCLayerAnimationController> toReturn = m_layerAnimationController
.Pass(); | |
759 m_layerAnimationController = CCLayerAnimationController::create(this); | |
760 return toReturn.Pass(); | |
761 } | |
762 | |
763 bool LayerChromium::hasActiveAnimation() const | |
764 { | |
765 return m_layerAnimationController->hasActiveAnimation(); | |
766 } | |
767 | |
768 void LayerChromium::notifyAnimationStarted(const CCAnimationEvent& event, double
wallClockTime) | |
769 { | |
770 m_layerAnimationController->notifyAnimationStarted(event); | |
771 if (m_layerAnimationDelegate) | |
772 m_layerAnimationDelegate->notifyAnimationStarted(wallClockTime); | |
773 } | |
774 | |
775 void LayerChromium::notifyAnimationFinished(double wallClockTime) | |
776 { | |
777 if (m_layerAnimationDelegate) | |
778 m_layerAnimationDelegate->notifyAnimationFinished(wallClockTime); | |
779 } | |
780 | |
781 Region LayerChromium::visibleContentOpaqueRegion() const | |
782 { | |
783 if (contentsOpaque()) | |
784 return visibleContentRect(); | |
785 return Region(); | |
786 } | |
787 | |
788 ScrollbarLayerChromium* LayerChromium::toScrollbarLayerChromium() | |
789 { | |
790 return 0; | |
791 } | |
792 | |
793 void sortLayers(std::vector<scoped_refptr<LayerChromium> >::iterator, std::vecto
r<scoped_refptr<LayerChromium> >::iterator, void*) | |
794 { | |
795 // Currently we don't use z-order to decide what to paint, so there's no nee
d to actually sort LayerChromiums. | |
796 } | |
797 | |
798 } | |
799 #endif // USE(ACCELERATED_COMPOSITING) | |
OLD | NEW |