| 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/containers/hash_tables.h" | 13 #include "base/containers/hash_tables.h" |
| 14 #include "base/containers/small_map.h" | 14 #include "base/containers/small_map.h" |
| 15 #include "base/json/json_writer.h" | 15 #include "base/json/json_writer.h" |
| 16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 19 #include "base/trace_event/trace_event_argument.h" | 19 #include "base/trace_event/trace_event_argument.h" |
| 20 #include "cc/animation/animation_host.h" | 20 #include "cc/animation/animation_host.h" |
| 21 #include "cc/animation/animation_id_provider.h" | |
| 22 #include "cc/animation/scroll_offset_animation_curve.h" | |
| 23 #include "cc/animation/scrollbar_animation_controller.h" | 21 #include "cc/animation/scrollbar_animation_controller.h" |
| 24 #include "cc/animation/timing_function.h" | 22 #include "cc/animation/timing_function.h" |
| 25 #include "cc/base/math_util.h" | 23 #include "cc/base/math_util.h" |
| 26 #include "cc/base/util.h" | 24 #include "cc/base/util.h" |
| 27 #include "cc/debug/benchmark_instrumentation.h" | 25 #include "cc/debug/benchmark_instrumentation.h" |
| 28 #include "cc/debug/debug_rect_history.h" | 26 #include "cc/debug/debug_rect_history.h" |
| 29 #include "cc/debug/devtools_instrumentation.h" | 27 #include "cc/debug/devtools_instrumentation.h" |
| 30 #include "cc/debug/frame_rate_counter.h" | 28 #include "cc/debug/frame_rate_counter.h" |
| 31 #include "cc/debug/frame_viewer_instrumentation.h" | 29 #include "cc/debug/frame_viewer_instrumentation.h" |
| 32 #include "cc/debug/paint_time_counter.h" | 30 #include "cc/debug/paint_time_counter.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), | 220 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), |
| 223 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 221 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 224 micro_benchmark_controller_(this), | 222 micro_benchmark_controller_(this), |
| 225 shared_bitmap_manager_(shared_bitmap_manager), | 223 shared_bitmap_manager_(shared_bitmap_manager), |
| 226 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 224 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 227 task_graph_runner_(task_graph_runner), | 225 task_graph_runner_(task_graph_runner), |
| 228 id_(id), | 226 id_(id), |
| 229 requires_high_res_to_draw_(false), | 227 requires_high_res_to_draw_(false), |
| 230 is_likely_to_require_a_draw_(false), | 228 is_likely_to_require_a_draw_(false), |
| 231 frame_timing_tracker_(FrameTimingTracker::Create()) { | 229 frame_timing_tracker_(FrameTimingTracker::Create()) { |
| 232 if (settings.use_compositor_animation_timelines) { | 230 animation_host_ = AnimationHost::Create(true); |
| 233 animation_host_ = AnimationHost::Create(true); | 231 animation_host_->SetLayerTreeMutatorsClient(this); |
| 234 animation_host_->SetLayerTreeMutatorsClient(this); | 232 animation_host_->SetSupportsScrollAnimations(proxy_->SupportsImplScrolling()); |
| 235 animation_host_->SetSupportsScrollAnimations( | |
| 236 proxy_->SupportsImplScrolling()); | |
| 237 } else { | |
| 238 animation_registrar_ = AnimationRegistrar::Create(); | |
| 239 animation_registrar_->set_supports_scroll_animations( | |
| 240 proxy_->SupportsImplScrolling()); | |
| 241 } | |
| 242 | 233 |
| 243 DCHECK(proxy_->IsImplThread()); | 234 DCHECK(proxy_->IsImplThread()); |
| 244 DidVisibilityChange(this, visible_); | 235 DidVisibilityChange(this, visible_); |
| 245 | 236 |
| 246 SetDebugState(settings.initial_debug_state); | 237 SetDebugState(settings.initial_debug_state); |
| 247 | 238 |
| 248 // LTHI always has an active tree. | 239 // LTHI always has an active tree. |
| 249 active_tree_ = | 240 active_tree_ = |
| 250 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), | 241 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), |
| 251 new SyncedTopControls, new SyncedElasticOverscroll); | 242 new SyncedTopControls, new SyncedElasticOverscroll); |
| (...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 // contents of its texture are updated as the last thing before the frame is | 1532 // contents of its texture are updated as the last thing before the frame is |
| 1542 // drawn. | 1533 // drawn. |
| 1543 if (active_tree_->hud_layer()) { | 1534 if (active_tree_->hud_layer()) { |
| 1544 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); | 1535 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); |
| 1545 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, | 1536 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, |
| 1546 resource_provider_.get()); | 1537 resource_provider_.get()); |
| 1547 } | 1538 } |
| 1548 | 1539 |
| 1549 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { | 1540 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
| 1550 bool disable_picture_quad_image_filtering = | 1541 bool disable_picture_quad_image_filtering = |
| 1551 IsActivelyScrolling() || | 1542 IsActivelyScrolling() || animation_host_->NeedsAnimateLayers(); |
| 1552 (animation_host_ ? animation_host_->NeedsAnimateLayers() | |
| 1553 : animation_registrar_->needs_animate_layers()); | |
| 1554 | 1543 |
| 1555 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1544 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
| 1556 SoftwareRenderer::Create(this, &settings_.renderer_settings, | 1545 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
| 1557 output_surface_.get(), NULL); | 1546 output_surface_.get(), NULL); |
| 1558 temp_software_renderer->DrawFrame(&frame->render_passes, | 1547 temp_software_renderer->DrawFrame(&frame->render_passes, |
| 1559 device_scale_factor_, | 1548 device_scale_factor_, |
| 1560 DeviceViewport(), | 1549 DeviceViewport(), |
| 1561 DeviceClip(), | 1550 DeviceClip(), |
| 1562 disable_picture_quad_image_filtering); | 1551 disable_picture_quad_image_filtering); |
| 1563 } else { | 1552 } else { |
| (...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3019 for (auto& it : controllers_copy) | 3008 for (auto& it : controllers_copy) |
| 3020 it->Animate(monotonic_time); | 3009 it->Animate(monotonic_time); |
| 3021 | 3010 |
| 3022 SetNeedsAnimate(); | 3011 SetNeedsAnimate(); |
| 3023 } | 3012 } |
| 3024 | 3013 |
| 3025 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { | 3014 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { |
| 3026 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3015 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3027 return; | 3016 return; |
| 3028 | 3017 |
| 3029 if (animation_host_) { | 3018 if (animation_host_->AnimateLayers(monotonic_time)) |
| 3030 if (animation_host_->AnimateLayers(monotonic_time)) | 3019 SetNeedsAnimate(); |
| 3031 SetNeedsAnimate(); | |
| 3032 } else { | |
| 3033 if (animation_registrar_->AnimateLayers(monotonic_time)) | |
| 3034 SetNeedsAnimate(); | |
| 3035 } | |
| 3036 } | 3020 } |
| 3037 | 3021 |
| 3038 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { | 3022 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { |
| 3039 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3023 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3040 return; | 3024 return; |
| 3041 | 3025 |
| 3042 bool has_active_animations = false; | 3026 bool has_active_animations = false; |
| 3043 scoped_ptr<AnimationEventsVector> events; | 3027 scoped_ptr<AnimationEventsVector> events; |
| 3044 | 3028 |
| 3045 if (animation_host_) { | 3029 events = animation_host_->CreateEvents(); |
| 3046 events = animation_host_->CreateEvents(); | 3030 has_active_animations = animation_host_->UpdateAnimationState( |
| 3047 has_active_animations = animation_host_->UpdateAnimationState( | 3031 start_ready_animations, events.get()); |
| 3048 start_ready_animations, events.get()); | |
| 3049 } else { | |
| 3050 events = animation_registrar_->CreateEvents(); | |
| 3051 has_active_animations = animation_registrar_->UpdateAnimationState( | |
| 3052 start_ready_animations, events.get()); | |
| 3053 } | |
| 3054 | 3032 |
| 3055 if (!events->empty()) | 3033 if (!events->empty()) |
| 3056 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); | 3034 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); |
| 3057 | 3035 |
| 3058 if (has_active_animations) | 3036 if (has_active_animations) |
| 3059 SetNeedsAnimate(); | 3037 SetNeedsAnimate(); |
| 3060 } | 3038 } |
| 3061 | 3039 |
| 3062 void LayerTreeHostImpl::ActivateAnimations() { | 3040 void LayerTreeHostImpl::ActivateAnimations() { |
| 3063 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) | 3041 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3064 return; | 3042 return; |
| 3065 | 3043 |
| 3066 if (animation_host_) { | 3044 if (animation_host_->ActivateAnimations()) |
| 3067 if (animation_host_->ActivateAnimations()) | 3045 SetNeedsAnimate(); |
| 3068 SetNeedsAnimate(); | |
| 3069 } else { | |
| 3070 if (animation_registrar_->ActivateAnimations()) | |
| 3071 SetNeedsAnimate(); | |
| 3072 } | |
| 3073 } | 3046 } |
| 3074 | 3047 |
| 3075 std::string LayerTreeHostImpl::LayerTreeAsJson() const { | 3048 std::string LayerTreeHostImpl::LayerTreeAsJson() const { |
| 3076 std::string str; | 3049 std::string str; |
| 3077 if (active_tree_->root_layer()) { | 3050 if (active_tree_->root_layer()) { |
| 3078 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); | 3051 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); |
| 3079 base::JSONWriter::WriteWithOptions( | 3052 base::JSONWriter::WriteWithOptions( |
| 3080 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); | 3053 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); |
| 3081 } | 3054 } |
| 3082 return str; | 3055 return str; |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3361 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { | 3334 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { |
| 3362 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3335 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
| 3363 for (; it != swap_promise_monitor_.end(); it++) | 3336 for (; it != swap_promise_monitor_.end(); it++) |
| 3364 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); | 3337 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); |
| 3365 } | 3338 } |
| 3366 | 3339 |
| 3367 void LayerTreeHostImpl::ScrollAnimationCreate( | 3340 void LayerTreeHostImpl::ScrollAnimationCreate( |
| 3368 LayerImpl* layer_impl, | 3341 LayerImpl* layer_impl, |
| 3369 const gfx::ScrollOffset& target_offset, | 3342 const gfx::ScrollOffset& target_offset, |
| 3370 const gfx::ScrollOffset& current_offset) { | 3343 const gfx::ScrollOffset& current_offset) { |
| 3371 if (animation_host_) | 3344 return animation_host_->ImplOnlyScrollAnimationCreate( |
| 3372 return animation_host_->ImplOnlyScrollAnimationCreate( | 3345 layer_impl->id(), target_offset, current_offset); |
| 3373 layer_impl->id(), target_offset, current_offset); | |
| 3374 | |
| 3375 scoped_ptr<ScrollOffsetAnimationCurve> curve = | |
| 3376 ScrollOffsetAnimationCurve::Create(target_offset, | |
| 3377 EaseInOutTimingFunction::Create()); | |
| 3378 curve->SetInitialValue(current_offset); | |
| 3379 | |
| 3380 scoped_ptr<Animation> animation = Animation::Create( | |
| 3381 curve.Pass(), AnimationIdProvider::NextAnimationId(), | |
| 3382 AnimationIdProvider::NextGroupId(), Animation::SCROLL_OFFSET); | |
| 3383 animation->set_is_impl_only(true); | |
| 3384 | |
| 3385 layer_impl->layer_animation_controller()->AddAnimation(animation.Pass()); | |
| 3386 } | 3346 } |
| 3387 | 3347 |
| 3388 bool LayerTreeHostImpl::ScrollAnimationUpdateTarget( | 3348 bool LayerTreeHostImpl::ScrollAnimationUpdateTarget( |
| 3389 LayerImpl* layer_impl, | 3349 LayerImpl* layer_impl, |
| 3390 const gfx::Vector2dF& scroll_delta) { | 3350 const gfx::Vector2dF& scroll_delta) { |
| 3391 if (animation_host_) | 3351 return animation_host_->ImplOnlyScrollAnimationUpdateTarget( |
| 3392 return animation_host_->ImplOnlyScrollAnimationUpdateTarget( | 3352 layer_impl->id(), scroll_delta, layer_impl->MaxScrollOffset(), |
| 3393 layer_impl->id(), scroll_delta, layer_impl->MaxScrollOffset(), | 3353 CurrentBeginFrameArgs().frame_time); |
| 3394 CurrentBeginFrameArgs().frame_time); | |
| 3395 | |
| 3396 Animation* animation = | |
| 3397 layer_impl->layer_animation_controller() | |
| 3398 ? layer_impl->layer_animation_controller()->GetAnimation( | |
| 3399 Animation::SCROLL_OFFSET) | |
| 3400 : nullptr; | |
| 3401 if (!animation) | |
| 3402 return false; | |
| 3403 | |
| 3404 ScrollOffsetAnimationCurve* curve = | |
| 3405 animation->curve()->ToScrollOffsetAnimationCurve(); | |
| 3406 | |
| 3407 gfx::ScrollOffset new_target = | |
| 3408 gfx::ScrollOffsetWithDelta(curve->target_value(), scroll_delta); | |
| 3409 new_target.SetToMax(gfx::ScrollOffset()); | |
| 3410 new_target.SetToMin(layer_impl->MaxScrollOffset()); | |
| 3411 | |
| 3412 curve->UpdateTarget( | |
| 3413 animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time) | |
| 3414 .InSecondsF(), | |
| 3415 new_target); | |
| 3416 | |
| 3417 return true; | |
| 3418 } | 3354 } |
| 3419 | 3355 |
| 3420 bool LayerTreeHostImpl::IsLayerInActiveTree(int layer_id) const { | 3356 bool LayerTreeHostImpl::IsLayerInActiveTree(int layer_id) const { |
| 3421 return active_tree() ? active_tree()->LayerById(layer_id) != nullptr : false; | 3357 return active_tree() ? active_tree()->LayerById(layer_id) != nullptr : false; |
| 3422 } | 3358 } |
| 3423 | 3359 |
| 3424 bool LayerTreeHostImpl::IsLayerInPendingTree(int layer_id) const { | 3360 bool LayerTreeHostImpl::IsLayerInPendingTree(int layer_id) const { |
| 3425 if (pending_tree() && pending_tree()->LayerById(layer_id)) | 3361 if (pending_tree() && pending_tree()->LayerById(layer_id)) |
| 3426 return true; | 3362 return true; |
| 3427 if (recycle_tree() && recycle_tree()->LayerById(layer_id)) | 3363 if (recycle_tree() && recycle_tree()->LayerById(layer_id)) |
| 3428 return true; | 3364 return true; |
| 3429 | 3365 |
| 3430 return false; | 3366 return false; |
| 3431 } | 3367 } |
| 3432 | 3368 |
| 3433 void LayerTreeHostImpl::SetMutatorsNeedCommit() { | 3369 void LayerTreeHostImpl::SetMutatorsNeedCommit() { |
| 3434 SetNeedsCommit(); | 3370 SetNeedsCommit(); |
| 3435 } | 3371 } |
| 3436 | 3372 |
| 3437 void LayerTreeHostImpl::SetTreeLayerFilterMutated( | 3373 void LayerTreeHostImpl::SetTreeLayerFilterMutated( |
| 3438 int layer_id, | 3374 int layer_id, |
| 3439 LayerTreeImpl* tree, | 3375 LayerTreeImpl* tree, |
| 3440 const FilterOperations& filters) { | 3376 const FilterOperations& filters) { |
| 3441 if (!tree) | 3377 if (!tree) |
| 3442 return; | 3378 return; |
| 3443 | 3379 |
| 3444 LayerAnimationValueObserver* layer = tree->LayerById(layer_id); | 3380 LayerImpl* layer = tree->LayerById(layer_id); |
| 3445 if (layer) | 3381 if (layer) |
| 3446 layer->OnFilterAnimated(filters); | 3382 layer->OnFilterAnimated(filters); |
| 3447 } | 3383 } |
| 3448 | 3384 |
| 3449 void LayerTreeHostImpl::SetTreeLayerOpacityMutated(int layer_id, | 3385 void LayerTreeHostImpl::SetTreeLayerOpacityMutated(int layer_id, |
| 3450 LayerTreeImpl* tree, | 3386 LayerTreeImpl* tree, |
| 3451 float opacity) { | 3387 float opacity) { |
| 3452 if (!tree) | 3388 if (!tree) |
| 3453 return; | 3389 return; |
| 3454 | 3390 |
| 3455 LayerAnimationValueObserver* layer = tree->LayerById(layer_id); | 3391 LayerImpl* layer = tree->LayerById(layer_id); |
| 3456 if (layer) | 3392 if (layer) |
| 3457 layer->OnOpacityAnimated(opacity); | 3393 layer->OnOpacityAnimated(opacity); |
| 3458 } | 3394 } |
| 3459 | 3395 |
| 3460 void LayerTreeHostImpl::SetTreeLayerTransformMutated( | 3396 void LayerTreeHostImpl::SetTreeLayerTransformMutated( |
| 3461 int layer_id, | 3397 int layer_id, |
| 3462 LayerTreeImpl* tree, | 3398 LayerTreeImpl* tree, |
| 3463 const gfx::Transform& transform) { | 3399 const gfx::Transform& transform) { |
| 3464 if (!tree) | 3400 if (!tree) |
| 3465 return; | 3401 return; |
| 3466 | 3402 |
| 3467 LayerAnimationValueObserver* layer = tree->LayerById(layer_id); | 3403 LayerImpl* layer = tree->LayerById(layer_id); |
| 3468 if (layer) | 3404 if (layer) |
| 3469 layer->OnTransformAnimated(transform); | 3405 layer->OnTransformAnimated(transform); |
| 3470 } | 3406 } |
| 3471 | 3407 |
| 3472 void LayerTreeHostImpl::SetTreeLayerScrollOffsetMutated( | 3408 void LayerTreeHostImpl::SetTreeLayerScrollOffsetMutated( |
| 3473 int layer_id, | 3409 int layer_id, |
| 3474 LayerTreeImpl* tree, | 3410 LayerTreeImpl* tree, |
| 3475 const gfx::ScrollOffset& scroll_offset) { | 3411 const gfx::ScrollOffset& scroll_offset) { |
| 3476 if (!tree) | 3412 if (!tree) |
| 3477 return; | 3413 return; |
| 3478 | 3414 |
| 3479 LayerAnimationValueObserver* layer = tree->LayerById(layer_id); | 3415 LayerImpl* layer = tree->LayerById(layer_id); |
| 3480 if (layer) | 3416 if (layer) |
| 3481 layer->OnScrollOffsetAnimated(scroll_offset); | 3417 layer->OnScrollOffsetAnimated(scroll_offset); |
| 3482 } | 3418 } |
| 3483 | 3419 |
| 3484 void LayerTreeHostImpl::SetLayerFilterMutated(int layer_id, | 3420 void LayerTreeHostImpl::SetLayerFilterMutated(int layer_id, |
| 3485 bool affects_active_tree, | 3421 bool affects_active_tree, |
| 3486 const FilterOperations& filters) { | 3422 const FilterOperations& filters) { |
| 3487 if (affects_active_tree) { | 3423 if (affects_active_tree) { |
| 3488 SetTreeLayerFilterMutated(layer_id, active_tree(), filters); | 3424 SetTreeLayerFilterMutated(layer_id, active_tree(), filters); |
| 3489 } else { | 3425 } else { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3527 } | 3463 } |
| 3528 } | 3464 } |
| 3529 | 3465 |
| 3530 void LayerTreeHostImpl::ScrollOffsetAnimationFinished() { | 3466 void LayerTreeHostImpl::ScrollOffsetAnimationFinished() { |
| 3531 ScrollEnd(); | 3467 ScrollEnd(); |
| 3532 } | 3468 } |
| 3533 | 3469 |
| 3534 gfx::ScrollOffset LayerTreeHostImpl::GetScrollOffsetForAnimation( | 3470 gfx::ScrollOffset LayerTreeHostImpl::GetScrollOffsetForAnimation( |
| 3535 int layer_id) const { | 3471 int layer_id) const { |
| 3536 if (active_tree()) { | 3472 if (active_tree()) { |
| 3537 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3473 LayerImpl* layer = active_tree()->LayerById(layer_id); |
| 3538 if (layer) | 3474 if (layer) |
| 3539 return layer->ScrollOffsetForAnimation(); | 3475 return layer->ScrollOffsetForAnimation(); |
| 3540 } | 3476 } |
| 3541 | 3477 |
| 3542 return gfx::ScrollOffset(); | 3478 return gfx::ScrollOffset(); |
| 3543 } | 3479 } |
| 3544 | 3480 |
| 3545 } // namespace cc | 3481 } // namespace cc |
| OLD | NEW |