| 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 "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 mask_layer_id_(-1), | 47 mask_layer_id_(-1), |
| 48 replica_layer_id_(-1), | 48 replica_layer_id_(-1), |
| 49 layer_id_(id), | 49 layer_id_(id), |
| 50 layer_tree_impl_(tree_impl), | 50 layer_tree_impl_(tree_impl), |
| 51 scroll_offset_(scroll_offset), | 51 scroll_offset_(scroll_offset), |
| 52 scroll_offset_delegate_(nullptr), | 52 scroll_offset_delegate_(nullptr), |
| 53 scroll_clip_layer_(nullptr), | 53 scroll_clip_layer_(nullptr), |
| 54 should_scroll_on_main_thread_(false), | 54 should_scroll_on_main_thread_(false), |
| 55 have_wheel_event_handlers_(false), | 55 have_wheel_event_handlers_(false), |
| 56 have_scroll_event_handlers_(false), | 56 have_scroll_event_handlers_(false), |
| 57 scroll_blocks_on_(ScrollBlocksOnNone), |
| 57 user_scrollable_horizontal_(true), | 58 user_scrollable_horizontal_(true), |
| 58 user_scrollable_vertical_(true), | 59 user_scrollable_vertical_(true), |
| 59 stacking_order_changed_(false), | 60 stacking_order_changed_(false), |
| 60 double_sided_(true), | 61 double_sided_(true), |
| 61 should_flatten_transform_(true), | 62 should_flatten_transform_(true), |
| 62 layer_property_changed_(false), | 63 layer_property_changed_(false), |
| 63 masks_to_bounds_(false), | 64 masks_to_bounds_(false), |
| 64 contents_opaque_(false), | 65 contents_opaque_(false), |
| 65 is_root_for_isolated_group_(false), | 66 is_root_for_isolated_group_(false), |
| 66 use_parent_backface_visibility_(false), | 67 use_parent_backface_visibility_(false), |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 : user_scrollable_vertical_; | 386 : user_scrollable_vertical_; |
| 386 } | 387 } |
| 387 | 388 |
| 388 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { | 389 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { |
| 389 DCHECK(layer_tree_impl()->IsActiveTree()); | 390 DCHECK(layer_tree_impl()->IsActiveTree()); |
| 390 scroll_offset_->AbortCommit(); | 391 scroll_offset_->AbortCommit(); |
| 391 } | 392 } |
| 392 | 393 |
| 393 InputHandler::ScrollStatus LayerImpl::TryScroll( | 394 InputHandler::ScrollStatus LayerImpl::TryScroll( |
| 394 const gfx::PointF& screen_space_point, | 395 const gfx::PointF& screen_space_point, |
| 395 InputHandler::ScrollInputType type) const { | 396 InputHandler::ScrollInputType type, |
| 397 ScrollBlocksOn effective_block_mode) const { |
| 396 if (should_scroll_on_main_thread()) { | 398 if (should_scroll_on_main_thread()) { |
| 397 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); | 399 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); |
| 398 return InputHandler::ScrollOnMainThread; | 400 return InputHandler::ScrollOnMainThread; |
| 399 } | 401 } |
| 400 | 402 |
| 401 if (!screen_space_transform().IsInvertible()) { | 403 if (!screen_space_transform().IsInvertible()) { |
| 402 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); | 404 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); |
| 403 return InputHandler::ScrollIgnored; | 405 return InputHandler::ScrollIgnored; |
| 404 } | 406 } |
| 405 | 407 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 423 1.f / contents_scale_y()); | 425 1.f / contents_scale_y()); |
| 424 if (!clipped && | 426 if (!clipped && |
| 425 non_fast_scrollable_region().Contains( | 427 non_fast_scrollable_region().Contains( |
| 426 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 428 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
| 427 TRACE_EVENT0("cc", | 429 TRACE_EVENT0("cc", |
| 428 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 430 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); |
| 429 return InputHandler::ScrollOnMainThread; | 431 return InputHandler::ScrollOnMainThread; |
| 430 } | 432 } |
| 431 } | 433 } |
| 432 | 434 |
| 433 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { | 435 if (have_scroll_event_handlers() && |
| 436 effective_block_mode & ScrollBlocksOnScrollEvent) { |
| 437 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed ScrollEventHandlers"); |
| 438 return InputHandler::ScrollOnMainThread; |
| 439 } |
| 440 |
| 441 if (type == InputHandler::Wheel && have_wheel_event_handlers() && |
| 442 effective_block_mode & ScrollBlocksOnWheelEvent) { |
| 434 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); | 443 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); |
| 435 return InputHandler::ScrollOnMainThread; | 444 return InputHandler::ScrollOnMainThread; |
| 436 } | 445 } |
| 437 | 446 |
| 438 if (!scrollable()) { | 447 if (!scrollable()) { |
| 439 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 448 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); |
| 440 return InputHandler::ScrollIgnored; | 449 return InputHandler::ScrollIgnored; |
| 441 } | 450 } |
| 442 | 451 |
| 443 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); | 452 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 draw_checkerboard_for_missing_tiles_); | 489 draw_checkerboard_for_missing_tiles_); |
| 481 layer->SetDrawsContent(DrawsContent()); | 490 layer->SetDrawsContent(DrawsContent()); |
| 482 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); | 491 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); |
| 483 layer->SetHasRenderSurface(!!render_surface()); | 492 layer->SetHasRenderSurface(!!render_surface()); |
| 484 layer->SetFilters(filters()); | 493 layer->SetFilters(filters()); |
| 485 layer->SetBackgroundFilters(background_filters()); | 494 layer->SetBackgroundFilters(background_filters()); |
| 486 layer->SetMasksToBounds(masks_to_bounds_); | 495 layer->SetMasksToBounds(masks_to_bounds_); |
| 487 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); | 496 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); |
| 488 layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); | 497 layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); |
| 489 layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); | 498 layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); |
| 499 layer->SetScrollBlocksOn(scroll_blocks_on_); |
| 490 layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); | 500 layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); |
| 491 layer->SetTouchEventHandlerRegion(touch_event_handler_region_); | 501 layer->SetTouchEventHandlerRegion(touch_event_handler_region_); |
| 492 layer->SetContentsOpaque(contents_opaque_); | 502 layer->SetContentsOpaque(contents_opaque_); |
| 493 layer->SetOpacity(opacity_); | 503 layer->SetOpacity(opacity_); |
| 494 layer->SetBlendMode(blend_mode_); | 504 layer->SetBlendMode(blend_mode_); |
| 495 layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); | 505 layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); |
| 496 layer->SetPosition(position_); | 506 layer->SetPosition(position_); |
| 497 layer->SetIsContainerForFixedPositionLayers( | 507 layer->SetIsContainerForFixedPositionLayers( |
| 498 is_container_for_fixed_position_layers_); | 508 is_container_for_fixed_position_layers_); |
| 499 layer->SetPositionConstraint(position_constraint_); | 509 layer->SetPositionConstraint(position_constraint_); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 | 652 |
| 643 if (have_wheel_event_handlers_) | 653 if (have_wheel_event_handlers_) |
| 644 result->SetBoolean("WheelHandler", have_wheel_event_handlers_); | 654 result->SetBoolean("WheelHandler", have_wheel_event_handlers_); |
| 645 if (have_scroll_event_handlers_) | 655 if (have_scroll_event_handlers_) |
| 646 result->SetBoolean("ScrollHandler", have_scroll_event_handlers_); | 656 result->SetBoolean("ScrollHandler", have_scroll_event_handlers_); |
| 647 if (!touch_event_handler_region_.IsEmpty()) { | 657 if (!touch_event_handler_region_.IsEmpty()) { |
| 648 scoped_ptr<base::Value> region = touch_event_handler_region_.AsValue(); | 658 scoped_ptr<base::Value> region = touch_event_handler_region_.AsValue(); |
| 649 result->Set("TouchRegion", region.release()); | 659 result->Set("TouchRegion", region.release()); |
| 650 } | 660 } |
| 651 | 661 |
| 662 if (scroll_blocks_on_) { |
| 663 list = new base::ListValue; |
| 664 if (scroll_blocks_on_ & ScrollBlocksOnStartTouch) |
| 665 list->AppendString("StartTouch"); |
| 666 if (scroll_blocks_on_ & ScrollBlocksOnWheelEvent) |
| 667 list->AppendString("WheelEvent"); |
| 668 if (scroll_blocks_on_ & ScrollBlocksOnScrollEvent) |
| 669 list->AppendString("ScrollEvent"); |
| 670 result->Set("ScrollBlocksOn", list); |
| 671 } |
| 672 |
| 652 list = new base::ListValue; | 673 list = new base::ListValue; |
| 653 for (size_t i = 0; i < children_.size(); ++i) | 674 for (size_t i = 0; i < children_.size(); ++i) |
| 654 list->Append(children_[i]->LayerTreeAsJson()); | 675 list->Append(children_[i]->LayerTreeAsJson()); |
| 655 result->Set("Children", list); | 676 result->Set("Children", list); |
| 656 | 677 |
| 657 return result; | 678 return result; |
| 658 } | 679 } |
| 659 | 680 |
| 660 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { | 681 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { |
| 661 if (stacking_order_changed) { | 682 if (stacking_order_changed) { |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1073 DCHECK(IsActive()); | 1094 DCHECK(IsActive()); |
| 1074 if (scroll_offset_->SetCurrent(scroll_offset)) | 1095 if (scroll_offset_->SetCurrent(scroll_offset)) |
| 1075 DidUpdateScrollOffset(); | 1096 DidUpdateScrollOffset(); |
| 1076 } | 1097 } |
| 1077 | 1098 |
| 1078 void LayerImpl::PushScrollOffsetFromMainThread( | 1099 void LayerImpl::PushScrollOffsetFromMainThread( |
| 1079 const gfx::ScrollOffset& scroll_offset) { | 1100 const gfx::ScrollOffset& scroll_offset) { |
| 1080 PushScrollOffset(&scroll_offset); | 1101 PushScrollOffset(&scroll_offset); |
| 1081 } | 1102 } |
| 1082 | 1103 |
| 1104 void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue( |
| 1105 const gfx::ScrollOffset& scroll_offset) { |
| 1106 scroll_offset_->set_clobber_active_value(); |
| 1107 PushScrollOffset(&scroll_offset); |
| 1108 } |
| 1109 |
| 1083 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { | 1110 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { |
| 1084 RefreshFromScrollDelegate(); | 1111 RefreshFromScrollDelegate(); |
| 1085 | 1112 return scroll_offset_->PullDeltaForMainThread(); |
| 1086 // TODO(aelias, miletus): Remove all this temporary flooring machinery when | |
| 1087 // Blink fully supports fractional scrolls. | |
| 1088 gfx::ScrollOffset current_offset = CurrentScrollOffset(); | |
| 1089 gfx::Vector2dF current_delta = ScrollDelta(); | |
| 1090 gfx::Vector2dF floored_delta(floor(current_delta.x()), | |
| 1091 floor(current_delta.y())); | |
| 1092 gfx::Vector2dF diff_delta = floored_delta - current_delta; | |
| 1093 gfx::ScrollOffset tmp_offset = ScrollOffsetWithDelta(current_offset, | |
| 1094 diff_delta); | |
| 1095 scroll_offset_->SetCurrent(tmp_offset); | |
| 1096 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread(); | |
| 1097 scroll_offset_->SetCurrent(current_offset); | |
| 1098 return delta; | |
| 1099 } | 1113 } |
| 1100 | 1114 |
| 1101 void LayerImpl::RefreshFromScrollDelegate() { | 1115 void LayerImpl::RefreshFromScrollDelegate() { |
| 1102 if (scroll_offset_delegate_) { | 1116 if (scroll_offset_delegate_) { |
| 1103 SetCurrentScrollOffset( | 1117 SetCurrentScrollOffset( |
| 1104 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset())); | 1118 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset())); |
| 1105 } | 1119 } |
| 1106 } | 1120 } |
| 1107 | 1121 |
| 1108 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { | 1122 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1133 | 1147 |
| 1134 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { | 1148 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { |
| 1135 DCHECK(scroll_offset || IsActive()); | 1149 DCHECK(scroll_offset || IsActive()); |
| 1136 bool changed = false; | 1150 bool changed = false; |
| 1137 if (scroll_offset) { | 1151 if (scroll_offset) { |
| 1138 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); | 1152 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); |
| 1139 changed |= scroll_offset_->PushFromMainThread(*scroll_offset); | 1153 changed |= scroll_offset_->PushFromMainThread(*scroll_offset); |
| 1140 } | 1154 } |
| 1141 if (IsActive()) { | 1155 if (IsActive()) { |
| 1142 changed |= scroll_offset_->PushPendingToActive(); | 1156 changed |= scroll_offset_->PushPendingToActive(); |
| 1143 if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) | |
| 1144 SetScrollDelta(gfx::Vector2dF()); | |
| 1145 } | 1157 } |
| 1146 | 1158 |
| 1147 if (changed) | 1159 if (changed) |
| 1148 DidUpdateScrollOffset(); | 1160 DidUpdateScrollOffset(); |
| 1149 } | 1161 } |
| 1150 | 1162 |
| 1151 void LayerImpl::DidUpdateScrollOffset() { | 1163 void LayerImpl::DidUpdateScrollOffset() { |
| 1152 if (scroll_offset_delegate_) { | 1164 if (scroll_offset_delegate_) { |
| 1153 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset()); | 1165 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset()); |
| 1154 scroll_offset_delegate_->Update(); | 1166 scroll_offset_delegate_->Update(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1170 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const { | 1182 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const { |
| 1171 if (contents_opaque()) | 1183 if (contents_opaque()) |
| 1172 return SimpleEnclosedRegion(visible_content_rect()); | 1184 return SimpleEnclosedRegion(visible_content_rect()); |
| 1173 return SimpleEnclosedRegion(); | 1185 return SimpleEnclosedRegion(); |
| 1174 } | 1186 } |
| 1175 | 1187 |
| 1176 void LayerImpl::DidBeginTracing() {} | 1188 void LayerImpl::DidBeginTracing() {} |
| 1177 | 1189 |
| 1178 void LayerImpl::ReleaseResources() {} | 1190 void LayerImpl::ReleaseResources() {} |
| 1179 | 1191 |
| 1192 void LayerImpl::RecreateResources() { |
| 1193 } |
| 1194 |
| 1180 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { | 1195 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { |
| 1181 if (!scroll_clip_layer_ || bounds().IsEmpty()) | 1196 if (!scroll_clip_layer_ || bounds().IsEmpty()) |
| 1182 return gfx::ScrollOffset(); | 1197 return gfx::ScrollOffset(); |
| 1183 | 1198 |
| 1184 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer(); | 1199 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer(); |
| 1185 DCHECK(this != page_scale_layer); | 1200 DCHECK(this != page_scale_layer); |
| 1186 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() || | 1201 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() || |
| 1187 IsContainerForFixedPositionLayers()); | 1202 IsContainerForFixedPositionLayers()); |
| 1188 | 1203 |
| 1189 float scale_factor = 1.f; | 1204 float scale_factor = 1.f; |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1433 Region scroll_region(scroll_rect); | 1448 Region scroll_region(scroll_rect); |
| 1434 state->BeginArray("scroll_event_handler_region"); | 1449 state->BeginArray("scroll_event_handler_region"); |
| 1435 scroll_region.AsValueInto(state); | 1450 scroll_region.AsValueInto(state); |
| 1436 state->EndArray(); | 1451 state->EndArray(); |
| 1437 } | 1452 } |
| 1438 if (!non_fast_scrollable_region_.IsEmpty()) { | 1453 if (!non_fast_scrollable_region_.IsEmpty()) { |
| 1439 state->BeginArray("non_fast_scrollable_region"); | 1454 state->BeginArray("non_fast_scrollable_region"); |
| 1440 non_fast_scrollable_region_.AsValueInto(state); | 1455 non_fast_scrollable_region_.AsValueInto(state); |
| 1441 state->EndArray(); | 1456 state->EndArray(); |
| 1442 } | 1457 } |
| 1458 if (scroll_blocks_on_) { |
| 1459 state->SetInteger("scroll_blocks_on", scroll_blocks_on_); |
| 1460 } |
| 1443 | 1461 |
| 1444 state->BeginArray("children"); | 1462 state->BeginArray("children"); |
| 1445 for (size_t i = 0; i < children_.size(); ++i) { | 1463 for (size_t i = 0; i < children_.size(); ++i) { |
| 1446 state->BeginDictionary(); | 1464 state->BeginDictionary(); |
| 1447 children_[i]->AsValueInto(state); | 1465 children_[i]->AsValueInto(state); |
| 1448 state->EndDictionary(); | 1466 state->EndDictionary(); |
| 1449 } | 1467 } |
| 1450 state->EndArray(); | 1468 state->EndArray(); |
| 1451 if (mask_layer_) { | 1469 if (mask_layer_) { |
| 1452 state->BeginDictionary("mask_layer"); | 1470 state->BeginDictionary("mask_layer"); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1538 SetNeedsPushProperties(); | 1556 SetNeedsPushProperties(); |
| 1539 layer_tree_impl()->set_needs_update_draw_properties(); | 1557 layer_tree_impl()->set_needs_update_draw_properties(); |
| 1540 if (should_have_render_surface) { | 1558 if (should_have_render_surface) { |
| 1541 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); | 1559 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); |
| 1542 return; | 1560 return; |
| 1543 } | 1561 } |
| 1544 render_surface_.reset(); | 1562 render_surface_.reset(); |
| 1545 } | 1563 } |
| 1546 | 1564 |
| 1547 } // namespace cc | 1565 } // namespace cc |
| OLD | NEW |