OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layers/layer_impl.h" | 5 #include "cc/layers/layer_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/json/json_reader.h" | 12 #include "base/json/json_reader.h" |
13 #include "base/numerics/safe_conversions.h" | 13 #include "base/numerics/safe_conversions.h" |
14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
15 #include "base/trace_event/trace_event.h" | 15 #include "base/trace_event/trace_event.h" |
16 #include "base/trace_event/trace_event_argument.h" | 16 #include "base/trace_event/trace_event_argument.h" |
17 #include "cc/animation/animation_registrar.h" | 17 #include "cc/animation/animation_registrar.h" |
18 #include "cc/animation/mutable_properties.h" | 18 #include "cc/animation/mutable_properties.h" |
19 #include "cc/base/math_util.h" | 19 #include "cc/base/math_util.h" |
20 #include "cc/base/simple_enclosed_region.h" | 20 #include "cc/base/simple_enclosed_region.h" |
21 #include "cc/debug/debug_colors.h" | 21 #include "cc/debug/debug_colors.h" |
22 #include "cc/debug/layer_tree_debug_state.h" | 22 #include "cc/debug/layer_tree_debug_state.h" |
23 #include "cc/debug/micro_benchmark_impl.h" | 23 #include "cc/debug/micro_benchmark_impl.h" |
24 #include "cc/debug/traced_value.h" | 24 #include "cc/debug/traced_value.h" |
| 25 #include "cc/input/main_thread_scrolling_reason.h" |
25 #include "cc/input/scroll_state.h" | 26 #include "cc/input/scroll_state.h" |
26 #include "cc/layers/layer.h" | 27 #include "cc/layers/layer.h" |
27 #include "cc/layers/layer_utils.h" | 28 #include "cc/layers/layer_utils.h" |
28 #include "cc/output/copy_output_request.h" | 29 #include "cc/output/copy_output_request.h" |
29 #include "cc/quads/debug_border_draw_quad.h" | 30 #include "cc/quads/debug_border_draw_quad.h" |
30 #include "cc/quads/render_pass.h" | 31 #include "cc/quads/render_pass.h" |
31 #include "cc/trees/draw_property_utils.h" | 32 #include "cc/trees/draw_property_utils.h" |
32 #include "cc/trees/layer_tree_host_common.h" | 33 #include "cc/trees/layer_tree_host_common.h" |
33 #include "cc/trees/layer_tree_impl.h" | 34 #include "cc/trees/layer_tree_impl.h" |
34 #include "cc/trees/layer_tree_settings.h" | 35 #include "cc/trees/layer_tree_settings.h" |
(...skipping 15 matching lines...) Expand all Loading... |
50 scoped_refptr<SyncedScrollOffset> scroll_offset) | 51 scoped_refptr<SyncedScrollOffset> scroll_offset) |
51 : parent_(nullptr), | 52 : parent_(nullptr), |
52 scroll_parent_(nullptr), | 53 scroll_parent_(nullptr), |
53 clip_parent_(nullptr), | 54 clip_parent_(nullptr), |
54 mask_layer_id_(-1), | 55 mask_layer_id_(-1), |
55 replica_layer_id_(-1), | 56 replica_layer_id_(-1), |
56 layer_id_(id), | 57 layer_id_(id), |
57 layer_tree_impl_(tree_impl), | 58 layer_tree_impl_(tree_impl), |
58 scroll_offset_(scroll_offset), | 59 scroll_offset_(scroll_offset), |
59 scroll_clip_layer_id_(Layer::INVALID_ID), | 60 scroll_clip_layer_id_(Layer::INVALID_ID), |
60 main_thread_scrolling_reasons_(InputHandler::NOT_SCROLLING_ON_MAIN), | 61 main_thread_scrolling_reasons_( |
| 62 MainThreadScrollingReason::kNotScrollingOnMain), |
61 have_wheel_event_handlers_(false), | 63 have_wheel_event_handlers_(false), |
62 have_scroll_event_handlers_(false), | 64 have_scroll_event_handlers_(false), |
63 scroll_blocks_on_(SCROLL_BLOCKS_ON_NONE), | 65 scroll_blocks_on_(SCROLL_BLOCKS_ON_NONE), |
64 user_scrollable_horizontal_(true), | 66 user_scrollable_horizontal_(true), |
65 user_scrollable_vertical_(true), | 67 user_scrollable_vertical_(true), |
66 stacking_order_changed_(false), | 68 stacking_order_changed_(false), |
67 double_sided_(true), | 69 double_sided_(true), |
68 should_flatten_transform_(true), | 70 should_flatten_transform_(true), |
69 should_flatten_transform_from_property_tree_(false), | 71 should_flatten_transform_from_property_tree_(false), |
70 layer_property_changed_(false), | 72 layer_property_changed_(false), |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 DCHECK(layer_tree_impl()->IsActiveTree()); | 504 DCHECK(layer_tree_impl()->IsActiveTree()); |
503 scroll_offset_->AbortCommit(); | 505 scroll_offset_->AbortCommit(); |
504 } | 506 } |
505 | 507 |
506 InputHandler::ScrollStatus LayerImpl::TryScroll( | 508 InputHandler::ScrollStatus LayerImpl::TryScroll( |
507 const gfx::PointF& screen_space_point, | 509 const gfx::PointF& screen_space_point, |
508 InputHandler::ScrollInputType type, | 510 InputHandler::ScrollInputType type, |
509 ScrollBlocksOn effective_block_mode) const { | 511 ScrollBlocksOn effective_block_mode) const { |
510 InputHandler::ScrollStatus scroll_status; | 512 InputHandler::ScrollStatus scroll_status; |
511 scroll_status.main_thread_scrolling_reasons = | 513 scroll_status.main_thread_scrolling_reasons = |
512 InputHandler::NOT_SCROLLING_ON_MAIN; | 514 MainThreadScrollingReason::kNotScrollingOnMain; |
513 if (should_scroll_on_main_thread()) { | 515 if (should_scroll_on_main_thread()) { |
514 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); | 516 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); |
515 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 517 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
516 scroll_status.main_thread_scrolling_reasons = | 518 scroll_status.main_thread_scrolling_reasons = |
517 main_thread_scrolling_reasons_; | 519 main_thread_scrolling_reasons_; |
518 return scroll_status; | 520 return scroll_status; |
519 } | 521 } |
520 | 522 |
521 gfx::Transform screen_space_transform = ScreenSpaceTransform(); | 523 gfx::Transform screen_space_transform = ScreenSpaceTransform(); |
522 if (!screen_space_transform.IsInvertible()) { | 524 if (!screen_space_transform.IsInvertible()) { |
523 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); | 525 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); |
524 scroll_status.thread = InputHandler::SCROLL_IGNORED; | 526 scroll_status.thread = InputHandler::SCROLL_IGNORED; |
525 scroll_status.main_thread_scrolling_reasons = | 527 scroll_status.main_thread_scrolling_reasons = |
526 InputHandler::NON_INVERTIBLE_TRANSFORM; | 528 MainThreadScrollingReason::kNonInvertibleTransform; |
527 return scroll_status; | 529 return scroll_status; |
528 } | 530 } |
529 | 531 |
530 if (!non_fast_scrollable_region().IsEmpty()) { | 532 if (!non_fast_scrollable_region().IsEmpty()) { |
531 bool clipped = false; | 533 bool clipped = false; |
532 gfx::Transform inverse_screen_space_transform( | 534 gfx::Transform inverse_screen_space_transform( |
533 gfx::Transform::kSkipInitialization); | 535 gfx::Transform::kSkipInitialization); |
534 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform)) { | 536 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform)) { |
535 // TODO(shawnsingh): We shouldn't be applying a projection if screen space | 537 // TODO(shawnsingh): We shouldn't be applying a projection if screen space |
536 // transform is uninvertible here. Perhaps we should be returning | 538 // transform is uninvertible here. Perhaps we should be returning |
537 // SCROLL_ON_MAIN_THREAD in this case? | 539 // SCROLL_ON_MAIN_THREAD in this case? |
538 } | 540 } |
539 | 541 |
540 gfx::PointF hit_test_point_in_layer_space = MathUtil::ProjectPoint( | 542 gfx::PointF hit_test_point_in_layer_space = MathUtil::ProjectPoint( |
541 inverse_screen_space_transform, screen_space_point, &clipped); | 543 inverse_screen_space_transform, screen_space_point, &clipped); |
542 if (!clipped && | 544 if (!clipped && |
543 non_fast_scrollable_region().Contains( | 545 non_fast_scrollable_region().Contains( |
544 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 546 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
545 TRACE_EVENT0("cc", | 547 TRACE_EVENT0("cc", |
546 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 548 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); |
547 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 549 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
548 scroll_status.main_thread_scrolling_reasons = | 550 scroll_status.main_thread_scrolling_reasons = |
549 InputHandler::NON_FAST_SCROLLABLE_REGION; | 551 MainThreadScrollingReason::kNonFastScrollableRegion; |
550 return scroll_status; | 552 return scroll_status; |
551 } | 553 } |
552 } | 554 } |
553 | 555 |
554 if (have_scroll_event_handlers() && | 556 if (have_scroll_event_handlers() && |
555 effective_block_mode & SCROLL_BLOCKS_ON_SCROLL_EVENT) { | 557 effective_block_mode & SCROLL_BLOCKS_ON_SCROLL_EVENT) { |
556 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed ScrollEventHandlers"); | 558 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed ScrollEventHandlers"); |
557 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 559 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
558 scroll_status.main_thread_scrolling_reasons = InputHandler::EVENT_HANDLERS; | 560 scroll_status.main_thread_scrolling_reasons = |
| 561 MainThreadScrollingReason::kEventHandlers; |
559 return scroll_status; | 562 return scroll_status; |
560 } | 563 } |
561 | 564 |
562 if ((type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) && | 565 if ((type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) && |
563 have_wheel_event_handlers() && | 566 have_wheel_event_handlers() && |
564 effective_block_mode & SCROLL_BLOCKS_ON_WHEEL_EVENT) { | 567 effective_block_mode & SCROLL_BLOCKS_ON_WHEEL_EVENT) { |
565 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); | 568 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); |
566 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 569 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
567 scroll_status.main_thread_scrolling_reasons = InputHandler::EVENT_HANDLERS; | 570 scroll_status.main_thread_scrolling_reasons = |
| 571 MainThreadScrollingReason::kEventHandlers; |
568 return scroll_status; | 572 return scroll_status; |
569 } | 573 } |
570 | 574 |
571 if (!scrollable()) { | 575 if (!scrollable()) { |
572 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 576 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); |
573 scroll_status.thread = InputHandler::SCROLL_IGNORED; | 577 scroll_status.thread = InputHandler::SCROLL_IGNORED; |
574 scroll_status.main_thread_scrolling_reasons = InputHandler::NOT_SCROLLABLE; | 578 scroll_status.main_thread_scrolling_reasons = |
| 579 MainThreadScrollingReason::kNotScrollable; |
575 return scroll_status; | 580 return scroll_status; |
576 } | 581 } |
577 | 582 |
578 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); | 583 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); |
579 if (max_scroll_offset.x() <= 0 && max_scroll_offset.y() <= 0) { | 584 if (max_scroll_offset.x() <= 0 && max_scroll_offset.y() <= 0) { |
580 TRACE_EVENT0("cc", | 585 TRACE_EVENT0("cc", |
581 "LayerImpl::tryScroll: Ignored. Technically scrollable," | 586 "LayerImpl::tryScroll: Ignored. Technically scrollable," |
582 " but has no affordance in either direction."); | 587 " but has no affordance in either direction."); |
583 scroll_status.thread = InputHandler::SCROLL_IGNORED; | 588 scroll_status.thread = InputHandler::SCROLL_IGNORED; |
584 scroll_status.main_thread_scrolling_reasons = InputHandler::NOT_SCROLLABLE; | 589 scroll_status.main_thread_scrolling_reasons = |
| 590 MainThreadScrollingReason::kNotScrollable; |
585 return scroll_status; | 591 return scroll_status; |
586 } | 592 } |
587 | 593 |
588 scroll_status.thread = InputHandler::SCROLL_ON_IMPL_THREAD; | 594 scroll_status.thread = InputHandler::SCROLL_ON_IMPL_THREAD; |
589 return scroll_status; | 595 return scroll_status; |
590 } | 596 } |
591 | 597 |
592 skia::RefPtr<SkPicture> LayerImpl::GetPicture() { | 598 skia::RefPtr<SkPicture> LayerImpl::GetPicture() { |
593 return skia::RefPtr<SkPicture>(); | 599 return skia::RefPtr<SkPicture>(); |
594 } | 600 } |
(...skipping 1342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 .layer_transforms_should_scale_layer_contents) { | 1943 .layer_transforms_should_scale_layer_contents) { |
1938 return default_scale; | 1944 return default_scale; |
1939 } | 1945 } |
1940 | 1946 |
1941 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( | 1947 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( |
1942 DrawTransform(), default_scale); | 1948 DrawTransform(), default_scale); |
1943 return std::max(transform_scales.x(), transform_scales.y()); | 1949 return std::max(transform_scales.x(), transform_scales.y()); |
1944 } | 1950 } |
1945 | 1951 |
1946 } // namespace cc | 1952 } // namespace cc |
OLD | NEW |