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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 584503005: Make scroll offset type of float in cc (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: scroll delta -> vector2dF, scroll offset -> ScrollOffset Created 6 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
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 "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 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 } 426 }
427 427
428 void LayerTreeHostImpl::StartPageScaleAnimation( 428 void LayerTreeHostImpl::StartPageScaleAnimation(
429 const gfx::Vector2d& target_offset, 429 const gfx::Vector2d& target_offset,
430 bool anchor_point, 430 bool anchor_point,
431 float page_scale, 431 float page_scale,
432 base::TimeDelta duration) { 432 base::TimeDelta duration) {
433 if (!InnerViewportScrollLayer()) 433 if (!InnerViewportScrollLayer())
434 return; 434 return;
435 435
436 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); 436 gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset();
437 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); 437 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize();
438 gfx::SizeF viewport_size = 438 gfx::SizeF viewport_size =
439 active_tree_->InnerViewportContainerLayer()->bounds(); 439 active_tree_->InnerViewportContainerLayer()->bounds();
440 440
441 // Easing constants experimentally determined. 441 // Easing constants experimentally determined.
442 scoped_ptr<TimingFunction> timing_function = 442 scoped_ptr<TimingFunction> timing_function =
443 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); 443 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>();
444 444
445 page_scale_animation_ = 445 page_scale_animation_ =
446 PageScaleAnimation::Create(scroll_total, 446 PageScaleAnimation::Create(scroll_total.ToVector2dF(),
danakj 2014/09/25 22:01:27 TODO to pass a ScrollOffset?
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
447 active_tree_->total_page_scale_factor(), 447 active_tree_->total_page_scale_factor(),
448 viewport_size, 448 viewport_size,
449 scaled_scrollable_size, 449 scaled_scrollable_size,
450 timing_function.Pass()); 450 timing_function.Pass());
451 451
452 if (anchor_point) { 452 if (anchor_point) {
453 gfx::Vector2dF anchor(target_offset); 453 gfx::Vector2dF anchor(target_offset);
454 page_scale_animation_->ZoomWithAnchor(anchor, 454 page_scale_animation_->ZoomWithAnchor(anchor,
455 page_scale, 455 page_scale,
456 duration.InSecondsF()); 456 duration.InSecondsF());
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 metadata.location_bar_content_translation = 1476 metadata.location_bar_content_translation =
1477 gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset()); 1477 gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset());
1478 } 1478 }
1479 1479
1480 active_tree_->GetViewportSelection(&metadata.selection_start, 1480 active_tree_->GetViewportSelection(&metadata.selection_start,
1481 &metadata.selection_end); 1481 &metadata.selection_end);
1482 1482
1483 if (!InnerViewportScrollLayer()) 1483 if (!InnerViewportScrollLayer())
1484 return metadata; 1484 return metadata;
1485 1485
1486 metadata.root_scroll_offset = active_tree_->TotalScrollOffset(); 1486 metadata.root_scroll_offset = active_tree_->TotalScrollOffset().ToVector2dF();
danakj 2014/09/25 22:01:27 TODO to change the IPC to hold a ScrollOffset?
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
1487 1487
1488 return metadata; 1488 return metadata;
1489 } 1489 }
1490 1490
1491 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { 1491 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) {
1492 layer->DidBeginTracing(); 1492 layer->DidBeginTracing();
1493 } 1493 }
1494 1494
1495 void LayerTreeHostImpl::DrawLayers(FrameData* frame, 1495 void LayerTreeHostImpl::DrawLayers(FrameData* frame,
1496 base::TimeTicks frame_begin_time) { 1496 base::TimeTicks frame_begin_time) {
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
2368 if (LayerImpl* layer_impl = CurrentlyScrollingLayer()) { 2368 if (LayerImpl* layer_impl = CurrentlyScrollingLayer()) {
2369 Animation* animation = 2369 Animation* animation =
2370 layer_impl->layer_animation_controller()->GetAnimation( 2370 layer_impl->layer_animation_controller()->GetAnimation(
2371 Animation::ScrollOffset); 2371 Animation::ScrollOffset);
2372 if (!animation) 2372 if (!animation)
2373 return ScrollIgnored; 2373 return ScrollIgnored;
2374 2374
2375 ScrollOffsetAnimationCurve* curve = 2375 ScrollOffsetAnimationCurve* curve =
2376 animation->curve()->ToScrollOffsetAnimationCurve(); 2376 animation->curve()->ToScrollOffsetAnimationCurve();
2377 2377
2378 gfx::Vector2dF new_target = curve->target_value() + scroll_delta; 2378 gfx::Vector2dF new_target = curve->target_value() + scroll_delta;
danakj 2014/09/25 22:01:27 target_value should be a ScrollOffset? So a bunch
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
2379 new_target.SetToMax(gfx::Vector2dF()); 2379 new_target.SetToMax(gfx::Vector2dF());
2380 new_target.SetToMin(layer_impl->MaxScrollOffset()); 2380 new_target.SetToMin(layer_impl->MaxScrollOffset().ToVector2dF());
2381 2381
2382 curve->UpdateTarget(animation->TrimTimeToCurrentIteration( 2382 curve->UpdateTarget(animation->TrimTimeToCurrentIteration(
2383 CurrentBeginFrameArgs().frame_time), 2383 CurrentBeginFrameArgs().frame_time),
2384 new_target); 2384 new_target);
danakj 2014/09/25 22:01:27 UpdateTarget should be a ScrollOffset?
Yufeng Shen (Slow to review) 2014/09/26 20:19:07 Done.
2385 2385
2386 return ScrollStarted; 2386 return ScrollStarted;
2387 } 2387 }
2388 // ScrollAnimated is only used for wheel scrolls. We use the same bubbling 2388 // ScrollAnimated is only used for wheel scrolls. We use the same bubbling
2389 // behavior as ScrollBy to determine which layer to animate, but we do not 2389 // behavior as ScrollBy to determine which layer to animate, but we do not
2390 // do the Android-specific things in ScrollBy like showing top controls. 2390 // do the Android-specific things in ScrollBy like showing top controls.
2391 InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, Wheel); 2391 InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, Wheel);
2392 if (scroll_status == ScrollStarted) { 2392 if (scroll_status == ScrollStarted) {
2393 gfx::Vector2dF pending_delta = scroll_delta; 2393 gfx::Vector2dF pending_delta = scroll_delta;
2394 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl; 2394 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl;
2395 layer_impl = layer_impl->parent()) { 2395 layer_impl = layer_impl->parent()) {
2396 if (!layer_impl->scrollable()) 2396 if (!layer_impl->scrollable())
2397 continue; 2397 continue;
2398 2398
2399 gfx::Vector2dF current_offset = layer_impl->TotalScrollOffset(); 2399 gfx::ScrollOffset current_offset = layer_impl->TotalScrollOffset();
2400 gfx::Vector2dF target_offset = current_offset + pending_delta; 2400 gfx::ScrollOffset target_offset =
2401 target_offset.SetToMax(gfx::Vector2dF()); 2401 current_offset + gfx::ScrollOffset(pending_delta);
2402 target_offset.SetToMax(gfx::ScrollOffset());
2402 target_offset.SetToMin(layer_impl->MaxScrollOffset()); 2403 target_offset.SetToMin(layer_impl->MaxScrollOffset());
2403 gfx::Vector2dF actual_delta = target_offset - current_offset; 2404 gfx::Vector2dF actual_delta =
2405 (target_offset - current_offset).ToVector2dF();
2404 2406
2405 const float kEpsilon = 0.1f; 2407 const float kEpsilon = 0.1f;
2406 bool can_layer_scroll = (std::abs(actual_delta.x()) > kEpsilon || 2408 bool can_layer_scroll = (std::abs(actual_delta.x()) > kEpsilon ||
2407 std::abs(actual_delta.y()) > kEpsilon); 2409 std::abs(actual_delta.y()) > kEpsilon);
2408 2410
2409 if (!can_layer_scroll) { 2411 if (!can_layer_scroll) {
2410 layer_impl->ScrollBy(actual_delta); 2412 layer_impl->ScrollBy(actual_delta);
2411 pending_delta -= actual_delta; 2413 pending_delta -= actual_delta;
2412 continue; 2414 continue;
2413 } 2415 }
2414 2416
2415 active_tree_->SetCurrentlyScrollingLayer(layer_impl); 2417 active_tree_->SetCurrentlyScrollingLayer(layer_impl);
2416 2418
2417 scoped_ptr<ScrollOffsetAnimationCurve> curve = 2419 scoped_ptr<ScrollOffsetAnimationCurve> curve =
2418 ScrollOffsetAnimationCurve::Create(target_offset, 2420 ScrollOffsetAnimationCurve::Create(target_offset.ToVector2dF(),
danakj 2014/09/25 22:01:26 should just pass a ScrollOffset?
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
2419 EaseInOutTimingFunction::Create()); 2421 EaseInOutTimingFunction::Create());
2420 curve->SetInitialValue(current_offset); 2422 curve->SetInitialValue(current_offset.ToVector2dF());
danakj 2014/09/25 22:01:27 and here?
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
2421 2423
2422 scoped_ptr<Animation> animation = 2424 scoped_ptr<Animation> animation =
2423 Animation::Create(curve.PassAs<AnimationCurve>(), 2425 Animation::Create(curve.PassAs<AnimationCurve>(),
2424 AnimationIdProvider::NextAnimationId(), 2426 AnimationIdProvider::NextAnimationId(),
2425 AnimationIdProvider::NextGroupId(), 2427 AnimationIdProvider::NextGroupId(),
2426 Animation::ScrollOffset); 2428 Animation::ScrollOffset);
2427 animation->set_is_impl_only(true); 2429 animation->set_is_impl_only(true);
2428 2430
2429 layer_impl->layer_animation_controller()->AddAnimation(animation.Pass()); 2431 layer_impl->layer_animation_controller()->AddAnimation(animation.Pass());
2430 2432
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
2614 active_tree_->SetCurrentlyScrollingLayer(layer_impl); 2616 active_tree_->SetCurrentlyScrollingLayer(layer_impl);
2615 break; 2617 break;
2616 } 2618 }
2617 2619
2618 // If the applied delta is within 45 degrees of the input delta, bail out to 2620 // If the applied delta is within 45 degrees of the input delta, bail out to
2619 // make it easier to scroll just one layer in one direction without 2621 // make it easier to scroll just one layer in one direction without
2620 // affecting any of its parents. 2622 // affecting any of its parents.
2621 float angle_threshold = 45; 2623 float angle_threshold = 45;
2622 if (MathUtil::SmallestAngleBetweenVectors( 2624 if (MathUtil::SmallestAngleBetweenVectors(
2623 applied_delta, pending_delta) < angle_threshold) { 2625 applied_delta, pending_delta) < angle_threshold) {
2624 pending_delta = gfx::Vector2d(); 2626 pending_delta = gfx::Vector2dF();
2625 break; 2627 break;
2626 } 2628 }
2627 2629
2628 // Allow further movement only on an axis perpendicular to the direction in 2630 // Allow further movement only on an axis perpendicular to the direction in
2629 // which the layer moved. 2631 // which the layer moved.
2630 gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x()); 2632 gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x());
2631 pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis); 2633 pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis);
2632 2634
2633 if (gfx::ToRoundedVector2d(pending_delta).IsZero()) 2635 if (gfx::ToRoundedVector2d(pending_delta).IsZero())
2634 break; 2636 break;
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 page_scale_delta = active_tree_->page_scale_delta(); 2876 page_scale_delta = active_tree_->page_scale_delta();
2875 gfx::PointF new_scale_anchor = 2877 gfx::PointF new_scale_anchor =
2876 gfx::ScalePoint(anchor, 1.f / page_scale_delta); 2878 gfx::ScalePoint(anchor, 1.f / page_scale_delta);
2877 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; 2879 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor;
2878 2880
2879 previous_pinch_anchor_ = anchor; 2881 previous_pinch_anchor_ = anchor;
2880 2882
2881 move.Scale(1 / active_tree_->page_scale_factor()); 2883 move.Scale(1 / active_tree_->page_scale_factor());
2882 // If clamping the inner viewport scroll offset causes a change, it should 2884 // If clamping the inner viewport scroll offset causes a change, it should
2883 // be accounted for from the intended move. 2885 // be accounted for from the intended move.
2884 move -= InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset(); 2886 gfx::ScrollOffset max_offset =
danakj 2014/09/25 22:01:26 This would become Vector2dF based on other comment
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
2887 InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset();
2888 move -= max_offset.ToVector2dF();
2885 2889
2886 // We manually manage the bubbling behaviour here as it is different to that 2890 // We manually manage the bubbling behaviour here as it is different to that
2887 // implemented in LayerTreeHostImpl::ScrollBy(). Specifically: 2891 // implemented in LayerTreeHostImpl::ScrollBy(). Specifically:
2888 // 1) we want to explicit limit the bubbling to the outer/inner viewports, 2892 // 1) we want to explicit limit the bubbling to the outer/inner viewports,
2889 // 2) we don't want the directional limitations on the unused parts that 2893 // 2) we don't want the directional limitations on the unused parts that
2890 // ScrollBy() implements, and 2894 // ScrollBy() implements, and
2891 // 3) pinching should not engage the top controls manager. 2895 // 3) pinching should not engage the top controls manager.
2892 gfx::Vector2dF unused = OuterViewportScrollLayer() 2896 gfx::Vector2dF unused = OuterViewportScrollLayer()
2893 ? OuterViewportScrollLayer()->ScrollBy(move) 2897 ? OuterViewportScrollLayer()->ScrollBy(move)
2894 : move; 2898 : move;
(...skipping 20 matching lines...) Expand all
2915 if (top_controls_manager_) 2919 if (top_controls_manager_)
2916 top_controls_manager_->PinchEnd(); 2920 top_controls_manager_->PinchEnd();
2917 client_->SetNeedsCommitOnImplThread(); 2921 client_->SetNeedsCommitOnImplThread();
2918 } 2922 }
2919 2923
2920 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 2924 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
2921 LayerImpl* layer_impl) { 2925 LayerImpl* layer_impl) {
2922 if (!layer_impl) 2926 if (!layer_impl)
2923 return; 2927 return;
2924 2928
2925 gfx::Vector2d scroll_delta = 2929 gfx::Vector2dF scroll_delta = layer_impl->ScrollDelta();
2926 gfx::ToFlooredVector2d(layer_impl->ScrollDelta());
2927 if (!scroll_delta.IsZero()) { 2930 if (!scroll_delta.IsZero()) {
2928 LayerTreeHostCommon::ScrollUpdateInfo scroll; 2931 LayerTreeHostCommon::ScrollUpdateInfo scroll;
2929 scroll.layer_id = layer_impl->id(); 2932 scroll.layer_id = layer_impl->id();
2930 scroll.scroll_delta = scroll_delta; 2933 scroll.scroll_delta = scroll_delta;
2931 scroll_info->scrolls.push_back(scroll); 2934 scroll_info->scrolls.push_back(scroll);
2932 layer_impl->SetSentScrollDelta(scroll_delta); 2935 layer_impl->SetSentScrollDelta(scroll_delta);
2933 } 2936 }
2934 2937
2935 for (size_t i = 0; i < layer_impl->children().size(); ++i) 2938 for (size_t i = 0; i < layer_impl->children().size(); ++i)
2936 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); 2939 CollectScrollDeltas(scroll_info, layer_impl->children()[i]);
(...skipping 25 matching lines...) Expand all
2962 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta); 2965 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
2963 2966
2964 if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer())) 2967 if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer()))
2965 InnerViewportScrollLayer()->ScrollBy(unused_delta); 2968 InnerViewportScrollLayer()->ScrollBy(unused_delta);
2966 } 2969 }
2967 2970
2968 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) { 2971 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
2969 if (!page_scale_animation_) 2972 if (!page_scale_animation_)
2970 return; 2973 return;
2971 2974
2972 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset(); 2975 gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset();
2973 2976
2974 if (!page_scale_animation_->IsAnimationStarted()) 2977 if (!page_scale_animation_->IsAnimationStarted())
2975 page_scale_animation_->StartAnimation(monotonic_time); 2978 page_scale_animation_->StartAnimation(monotonic_time);
2976 2979
2977 active_tree_->SetPageScaleDelta( 2980 active_tree_->SetPageScaleDelta(
2978 page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / 2981 page_scale_animation_->PageScaleFactorAtTime(monotonic_time) /
2979 active_tree_->page_scale_factor()); 2982 active_tree_->page_scale_factor());
2980 gfx::Vector2dF next_scroll = 2983 gfx::Vector2dF next_scroll =
danakj 2014/09/25 22:01:27 ScrollOffset
Yufeng Shen (Slow to review) 2014/09/26 20:19:07 Done.
2981 page_scale_animation_->ScrollOffsetAtTime(monotonic_time); 2984 page_scale_animation_->ScrollOffsetAtTime(monotonic_time);
2982 2985
2983 ScrollViewportBy(next_scroll - scroll_total); 2986 ScrollViewportBy(next_scroll - scroll_total.ToVector2dF());
danakj 2014/09/25 22:01:26 convert after subtracting
Yufeng Shen (Slow to review) 2014/09/26 20:19:08 Done.
2984 SetNeedsRedraw(); 2987 SetNeedsRedraw();
2985 2988
2986 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { 2989 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
2987 page_scale_animation_.reset(); 2990 page_scale_animation_.reset();
2988 client_->SetNeedsCommitOnImplThread(); 2991 client_->SetNeedsCommitOnImplThread();
2989 client_->RenewTreePriority(); 2992 client_->RenewTreePriority();
2990 } else { 2993 } else {
2991 SetNeedsAnimate(); 2994 SetNeedsAnimate();
2992 } 2995 }
2993 } 2996 }
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
3383 } 3386 }
3384 3387
3385 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3388 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3386 std::vector<PictureLayerImpl*>::iterator it = 3389 std::vector<PictureLayerImpl*>::iterator it =
3387 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3390 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3388 DCHECK(it != picture_layers_.end()); 3391 DCHECK(it != picture_layers_.end());
3389 picture_layers_.erase(it); 3392 picture_layers_.erase(it);
3390 } 3393 }
3391 3394
3392 } // namespace cc 3395 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698