OLD | NEW |
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 "cc/layer_tree_host_impl.h" | 5 #include "cc/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi
ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer
Capabilities().maxTextureSize, renderSurfaceLayerList); | 373 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi
ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer
Capabilities().maxTextureSize, renderSurfaceLayerList); |
374 | 374 |
375 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; | 375 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; |
376 } | 376 } |
377 } | 377 } |
378 | 378 |
379 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 379 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
380 { | 380 { |
381 RenderPass* pass = renderPass.get(); | 381 RenderPass* pass = renderPass.get(); |
382 renderPasses.push_back(pass); | 382 renderPasses.push_back(pass); |
383 renderPassesById.set(pass->id(), renderPass.Pass()); | 383 renderPassesById.set(pass->id, renderPass.Pass()); |
384 } | 384 } |
385 | 385 |
386 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 386 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
387 { | 387 { |
388 DCHECK(frame.renderPasses.empty()); | 388 DCHECK(frame.renderPasses.empty()); |
389 | 389 |
390 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); | 390 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); |
391 | 391 |
392 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 392 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
393 | 393 |
(...skipping 20 matching lines...) Expand all Loading... |
414 // in the future. | 414 // in the future. |
415 bool drawFrame = true; | 415 bool drawFrame = true; |
416 | 416 |
417 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; | 417 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; |
418 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { | 418 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { |
419 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); | 419 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); |
420 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); | 420 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); |
421 | 421 |
422 occlusionTracker.enterLayer(it); | 422 occlusionTracker.enterLayer(it); |
423 | 423 |
424 AppendQuadsData appendQuadsData(targetRenderPass->id()); | 424 AppendQuadsData appendQuadsData(targetRenderPass->id); |
425 | 425 |
426 if (it.representsContributingRenderSurface()) { | 426 if (it.representsContributingRenderSurface()) { |
427 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); | 427 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); |
428 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 428 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); |
429 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing
RenderPass, &occlusionTracker, appendQuadsData); | 429 targetRenderPass->AppendQuadsForRenderSurfaceLayer(*it, *contributin
gRenderPass, occlusionTracker, appendQuadsData); |
430 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ | 430 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ |
431 bool hasOcclusionFromOutsideTargetSurface; | 431 bool hasOcclusionFromOutsideTargetSurface; |
432 bool implDrawTransformIsUnknown = false; | 432 bool implDrawTransformIsUnknown = false; |
433 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) | 433 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) |
434 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; | 434 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; |
435 else { | 435 else { |
436 it->willDraw(m_resourceProvider.get()); | 436 it->willDraw(m_resourceProvider.get()); |
437 frame.willDrawLayers.push_back(*it); | 437 frame.willDrawLayers.push_back(*it); |
438 | 438 |
439 if (it->hasContributingDelegatedRenderPasses()) { | 439 if (it->hasContributingDelegatedRenderPasses()) { |
440 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); | 440 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); |
441 while (frame.renderPassesById.contains(contributingRenderPas
sId)) { | 441 while (frame.renderPassesById.contains(contributingRenderPas
sId)) { |
442 RenderPass* renderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 442 RenderPass* renderPass = frame.renderPassesById.get(cont
ributingRenderPassId); |
443 | 443 |
444 AppendQuadsData appendQuadsData(renderPass->id()); | 444 AppendQuadsData appendQuadsData(renderPass->id); |
445 renderPass->appendQuadsForLayer(*it, &occlusionTracker,
appendQuadsData); | 445 renderPass->AppendQuadsForLayer(*it, occlusionTracker, a
ppendQuadsData); |
446 | 446 |
447 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); | 447 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); |
448 } | 448 } |
449 } | 449 } |
450 | 450 |
451 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ap
pendQuadsData); | 451 targetRenderPass->AppendQuadsForLayer(*it, occlusionTracker, app
endQuadsData); |
452 } | 452 } |
453 } | 453 } |
454 | 454 |
455 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) | 455 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) |
456 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true); | 456 targetRenderPass->has_occlusion_from_outside_target_surface = true; |
457 | 457 |
458 if (appendQuadsData.hadMissingTiles) { | 458 if (appendQuadsData.hadMissingTiles) { |
459 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); | 459 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); |
460 if (layerHasAnimatingTransform) | 460 if (layerHasAnimatingTransform) |
461 drawFrame = false; | 461 drawFrame = false; |
462 } | 462 } |
463 | 463 |
464 occlusionTracker.leaveLayer(it); | 464 occlusionTracker.leaveLayer(it); |
465 } | 465 } |
466 | 466 |
467 #ifndef NDEBUG | 467 #ifndef NDEBUG |
468 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 468 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
469 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) | 469 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) |
470 DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state); | 470 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); |
471 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); | 471 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id)); |
472 } | 472 } |
473 #endif | 473 #endif |
474 | 474 |
475 if (!m_hasTransparentBackground) { | 475 if (!m_hasTransparentBackground) { |
476 frame.renderPasses.back()->setHasTransparentBackground(false); | 476 frame.renderPasses.back()->has_transparent_background = false; |
477 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); | 477 frame.renderPasses.back()->AppendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); |
478 } | 478 } |
479 | 479 |
480 if (drawFrame) | 480 if (drawFrame) |
481 occlusionTracker.overdrawMetrics().recordMetrics(this); | 481 occlusionTracker.overdrawMetrics().recordMetrics(this); |
482 | 482 |
483 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 483 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
484 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 484 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
485 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 485 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
486 | 486 |
487 return drawFrame; | 487 return drawFrame; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); | 548 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); |
549 | 549 |
550 // The pass was already removed by another quad - probably the original, and
we are the replica. | 550 // The pass was already removed by another quad - probably the original, and
we are the replica. |
551 if (toRemove == renderPasses.end()) | 551 if (toRemove == renderPasses.end()) |
552 return; | 552 return; |
553 | 553 |
554 const RenderPass* removedPass = *toRemove; | 554 const RenderPass* removedPass = *toRemove; |
555 frame.renderPasses.erase(toRemove); | 555 frame.renderPasses.erase(toRemove); |
556 | 556 |
557 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 557 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
558 const QuadList& quadList = removedPass->quadList(); | 558 const QuadList& quadList = removedPass->quad_list; |
559 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); | 559 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); |
560 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 560 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
561 DrawQuad* currentQuad = (*quadListIterator); | 561 DrawQuad* currentQuad = (*quadListIterator); |
562 if (currentQuad->material != DrawQuad::RENDER_PASS) | 562 if (currentQuad->material != DrawQuad::RENDER_PASS) |
563 continue; | 563 continue; |
564 | 564 |
565 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; | 565 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; |
566 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 566 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
567 } | 567 } |
568 } | 568 } |
569 | 569 |
570 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const | 570 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const |
571 { | 571 { |
572 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa
chedResourcesForRenderPassId(quad.render_pass_id); | 572 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa
chedResourcesForRenderPassId(quad.render_pass_id); |
573 } | 573 } |
574 | 574 |
575 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const | 575 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const |
576 { | 576 { |
577 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); | 577 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); |
578 const RenderPassList& renderPasses = frame.renderPasses; | 578 const RenderPassList& renderPasses = frame.renderPasses; |
579 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); | 579 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); |
580 | 580 |
581 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); | 581 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); |
582 if (renderPassAlreadyRemoved) | 582 if (renderPassAlreadyRemoved) |
583 return false; | 583 return false; |
584 | 584 |
585 // If any quad or RenderPass draws into this RenderPass, then keep it. | 585 // If any quad or RenderPass draws into this RenderPass, then keep it. |
586 const QuadList& quadList = (*foundPass)->quadList(); | 586 const QuadList& quadList = (*foundPass)->quad_list; |
587 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 587 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
588 DrawQuad* currentQuad = *quadListIterator; | 588 DrawQuad* currentQuad = *quadListIterator; |
589 | 589 |
590 if (currentQuad->material != DrawQuad::RENDER_PASS) | 590 if (currentQuad->material != DrawQuad::RENDER_PASS) |
591 return false; | 591 return false; |
592 | 592 |
593 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); | 593 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); |
594 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); | 594 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); |
595 if (foundContributingPass != renderPasses.end()) | 595 if (foundContributingPass != renderPasses.end()) |
596 return false; | 596 return false; |
597 } | 597 } |
598 return true; | 598 return true; |
599 } | 599 } |
600 | 600 |
601 // Defined for linking tests. | 601 // Defined for linking tests. |
602 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); | 602 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); |
603 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 603 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
604 | 604 |
605 // static | 605 // static |
606 template<typename RenderPassCuller> | 606 template<typename RenderPassCuller> |
607 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) | 607 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) |
608 { | 608 { |
609 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { | 609 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
610 const RenderPass* currentPass = frame.renderPasses[it]; | 610 const RenderPass* currentPass = frame.renderPasses[it]; |
611 const QuadList& quadList = currentPass->quadList(); | 611 const QuadList& quadList = currentPass->quad_list; |
612 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); | 612 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); |
613 | 613 |
614 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { | 614 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { |
615 DrawQuad* currentQuad = *quadListIterator; | 615 DrawQuad* currentQuad = *quadListIterator; |
616 | 616 |
617 if (currentQuad->material != DrawQuad::RENDER_PASS) | 617 if (currentQuad->material != DrawQuad::RENDER_PASS) |
618 continue; | 618 continue; |
619 | 619 |
620 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); | 620 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); |
621 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) | 621 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 // Because the contents of the HUD depend on everything else in the frame, t
he contents | 714 // Because the contents of the HUD depend on everything else in the frame, t
he contents |
715 // of its texture are updated as the last thing before the frame is drawn. | 715 // of its texture are updated as the last thing before the frame is drawn. |
716 if (m_hudLayerImpl) | 716 if (m_hudLayerImpl) |
717 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); | 717 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); |
718 | 718 |
719 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); | 719 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); |
720 | 720 |
721 // Once a RenderPass has been drawn, its damage should be cleared in | 721 // Once a RenderPass has been drawn, its damage should be cleared in |
722 // case the RenderPass will be reused next frame. | 722 // case the RenderPass will be reused next frame. |
723 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) | 723 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) |
724 frame.renderPasses[i]->setDamageRect(gfx::RectF()); | 724 frame.renderPasses[i]->damage_rect = gfx::RectF(); |
725 | 725 |
726 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. | 726 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. |
727 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) | 727 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) |
728 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); | 728 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); |
729 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); | 729 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); |
730 } | 730 } |
731 | 731 |
732 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) | 732 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) |
733 { | 733 { |
734 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) | 734 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1503 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1504 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1504 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1505 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1505 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1506 m_client->setNeedsRedrawOnImplThread(); | 1506 m_client->setNeedsRedrawOnImplThread(); |
1507 | 1507 |
1508 for (size_t i = 0; i < layer->children().size(); ++i) | 1508 for (size_t i = 0; i < layer->children().size(); ++i) |
1509 animateScrollbarsRecursive(layer->children()[i], time); | 1509 animateScrollbarsRecursive(layer->children()[i], time); |
1510 } | 1510 } |
1511 | 1511 |
1512 } // namespace cc | 1512 } // namespace cc |
OLD | NEW |