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/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/debug/trace_event_argument.h" | 8 #include "base/debug/trace_event_argument.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 double_sided_(true), | 53 double_sided_(true), |
54 should_flatten_transform_(true), | 54 should_flatten_transform_(true), |
55 layer_property_changed_(false), | 55 layer_property_changed_(false), |
56 masks_to_bounds_(false), | 56 masks_to_bounds_(false), |
57 contents_opaque_(false), | 57 contents_opaque_(false), |
58 is_root_for_isolated_group_(false), | 58 is_root_for_isolated_group_(false), |
59 use_parent_backface_visibility_(false), | 59 use_parent_backface_visibility_(false), |
60 draw_checkerboard_for_missing_tiles_(false), | 60 draw_checkerboard_for_missing_tiles_(false), |
61 draws_content_(false), | 61 draws_content_(false), |
62 hide_layer_and_subtree_(false), | 62 hide_layer_and_subtree_(false), |
| 63 clear_scroll_delta_at_activation_(false), |
63 transform_is_invertible_(true), | 64 transform_is_invertible_(true), |
64 is_container_for_fixed_position_layers_(false), | 65 is_container_for_fixed_position_layers_(false), |
65 background_color_(0), | 66 background_color_(0), |
66 opacity_(1.0), | 67 opacity_(1.0), |
67 blend_mode_(SkXfermode::kSrcOver_Mode), | 68 blend_mode_(SkXfermode::kSrcOver_Mode), |
68 num_descendants_that_draw_content_(0), | 69 num_descendants_that_draw_content_(0), |
69 draw_depth_(0.f), | 70 draw_depth_(0.f), |
70 needs_push_properties_(false), | 71 needs_push_properties_(false), |
71 num_dependents_need_push_properties_(0), | 72 num_dependents_need_push_properties_(0), |
72 sorting_context_id_(0), | 73 sorting_context_id_(0), |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 void LayerImpl::SetSentScrollDelta(const gfx::Vector2dF& sent_scroll_delta) { | 350 void LayerImpl::SetSentScrollDelta(const gfx::Vector2dF& sent_scroll_delta) { |
350 // Pending tree never has sent scroll deltas | 351 // Pending tree never has sent scroll deltas |
351 DCHECK(layer_tree_impl()->IsActiveTree()); | 352 DCHECK(layer_tree_impl()->IsActiveTree()); |
352 | 353 |
353 if (sent_scroll_delta_ == sent_scroll_delta) | 354 if (sent_scroll_delta_ == sent_scroll_delta) |
354 return; | 355 return; |
355 | 356 |
356 sent_scroll_delta_ = sent_scroll_delta; | 357 sent_scroll_delta_ = sent_scroll_delta; |
357 } | 358 } |
358 | 359 |
| 360 void LayerImpl::ClearScrollDeltaAtActivation() { |
| 361 clear_scroll_delta_at_activation_ = true; |
| 362 } |
| 363 |
359 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) { | 364 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) { |
360 gfx::Vector2dF adjusted_scroll = scroll; | 365 gfx::Vector2dF adjusted_scroll = scroll; |
361 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) { | 366 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) { |
362 if (!user_scrollable_horizontal_) | 367 if (!user_scrollable_horizontal_) |
363 adjusted_scroll.set_x(0); | 368 adjusted_scroll.set_x(0); |
364 if (!user_scrollable_vertical_) | 369 if (!user_scrollable_vertical_) |
365 adjusted_scroll.set_y(0); | 370 adjusted_scroll.set_y(0); |
366 } | 371 } |
367 DCHECK(scrollable()); | 372 DCHECK(scrollable()); |
368 gfx::Vector2dF min_delta = -ScrollOffsetToVector2dF(scroll_offset_); | 373 gfx::Vector2dF min_delta = -ScrollOffsetToVector2dF(scroll_offset_); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_); | 542 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_); |
538 | 543 |
539 layer->SetScrollClipLayer(scroll_clip_layer_ ? scroll_clip_layer_->id() | 544 layer->SetScrollClipLayer(scroll_clip_layer_ ? scroll_clip_layer_->id() |
540 : Layer::INVALID_ID); | 545 : Layer::INVALID_ID); |
541 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); | 546 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); |
542 layer->set_user_scrollable_vertical(user_scrollable_vertical_); | 547 layer->set_user_scrollable_vertical(user_scrollable_vertical_); |
543 | 548 |
544 // Save the difference but clear the sent delta so that we don't subtract | 549 // Save the difference but clear the sent delta so that we don't subtract |
545 // it again in SetScrollOffsetAndDelta's pending twin mirroring logic. | 550 // it again in SetScrollOffsetAndDelta's pending twin mirroring logic. |
546 gfx::Vector2dF remaining_delta = | 551 gfx::Vector2dF remaining_delta = |
547 layer->ScrollDelta() - layer->sent_scroll_delta(); | 552 clear_scroll_delta_at_activation_ |
| 553 ? gfx::Vector2dF() |
| 554 : layer->ScrollDelta() - layer->sent_scroll_delta(); |
| 555 clear_scroll_delta_at_activation_ = false; |
| 556 |
548 layer->SetSentScrollDelta(gfx::Vector2dF()); | 557 layer->SetSentScrollDelta(gfx::Vector2dF()); |
549 layer->SetScrollOffsetAndDelta(scroll_offset_, remaining_delta); | 558 layer->SetScrollOffsetAndDelta(scroll_offset_, remaining_delta); |
550 | 559 |
551 layer->Set3dSortingContextId(sorting_context_id_); | 560 layer->Set3dSortingContextId(sorting_context_id_); |
552 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); | 561 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); |
553 | 562 |
554 LayerImpl* scroll_parent = nullptr; | 563 LayerImpl* scroll_parent = nullptr; |
555 if (scroll_parent_) { | 564 if (scroll_parent_) { |
556 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); | 565 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); |
557 DCHECK(scroll_parent); | 566 DCHECK(scroll_parent); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 if (!IsActive()) | 784 if (!IsActive()) |
776 return; | 785 return; |
777 | 786 |
778 SetScrollDelta(scroll_offset.DeltaFrom(scroll_offset_)); | 787 SetScrollDelta(scroll_offset.DeltaFrom(scroll_offset_)); |
779 | 788 |
780 layer_tree_impl_->DidAnimateScrollOffset(); | 789 layer_tree_impl_->DidAnimateScrollOffset(); |
781 } | 790 } |
782 | 791 |
783 void LayerImpl::OnAnimationWaitingForDeletion() {} | 792 void LayerImpl::OnAnimationWaitingForDeletion() {} |
784 | 793 |
| 794 void LayerImpl::OnScrollOffsetAnimationRemoved() { |
| 795 } |
| 796 |
785 bool LayerImpl::IsActive() const { | 797 bool LayerImpl::IsActive() const { |
786 return layer_tree_impl_->IsActiveTree(); | 798 return layer_tree_impl_->IsActiveTree(); |
787 } | 799 } |
788 | 800 |
789 gfx::Size LayerImpl::bounds() const { | 801 gfx::Size LayerImpl::bounds() const { |
790 gfx::Vector2d delta = gfx::ToCeiledVector2d(bounds_delta_); | 802 gfx::Vector2d delta = gfx::ToCeiledVector2d(bounds_delta_); |
791 return gfx::Size(bounds_.width() + delta.x(), | 803 return gfx::Size(bounds_.width() + delta.x(), |
792 bounds_.height() + delta.y()); | 804 bounds_.height() + delta.y()); |
793 } | 805 } |
794 | 806 |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 | 1167 |
1156 gfx::Vector2dF LayerImpl::ScrollDelta() const { | 1168 gfx::Vector2dF LayerImpl::ScrollDelta() const { |
1157 if (scroll_offset_delegate_) { | 1169 if (scroll_offset_delegate_) { |
1158 return scroll_offset_delegate_->GetTotalScrollOffset().DeltaFrom( | 1170 return scroll_offset_delegate_->GetTotalScrollOffset().DeltaFrom( |
1159 scroll_offset_); | 1171 scroll_offset_); |
1160 } | 1172 } |
1161 return scroll_delta_; | 1173 return scroll_delta_; |
1162 } | 1174 } |
1163 | 1175 |
1164 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& scroll_delta) { | 1176 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& scroll_delta) { |
| 1177 if (!IsActive() && clear_scroll_delta_at_activation_) |
| 1178 return; |
1165 SetScrollOffsetAndDelta(scroll_offset_, scroll_delta); | 1179 SetScrollOffsetAndDelta(scroll_offset_, scroll_delta); |
1166 } | 1180 } |
1167 | 1181 |
1168 gfx::ScrollOffset LayerImpl::TotalScrollOffset() const { | 1182 gfx::ScrollOffset LayerImpl::TotalScrollOffset() const { |
1169 return ScrollOffsetWithDelta(scroll_offset_, ScrollDelta()); | 1183 return ScrollOffsetWithDelta(scroll_offset_, ScrollDelta()); |
1170 } | 1184 } |
1171 | 1185 |
1172 void LayerImpl::SetDoubleSided(bool double_sided) { | 1186 void LayerImpl::SetDoubleSided(bool double_sided) { |
1173 if (double_sided_ == double_sided) | 1187 if (double_sided_ == double_sided) |
1174 return; | 1188 return; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1445 } | 1459 } |
1446 | 1460 |
1447 void LayerImpl::AsValueInto(base::debug::TracedValue* state) const { | 1461 void LayerImpl::AsValueInto(base::debug::TracedValue* state) const { |
1448 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( | 1462 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( |
1449 TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1463 TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
1450 state, | 1464 state, |
1451 "cc::LayerImpl", | 1465 "cc::LayerImpl", |
1452 LayerTypeAsString(), | 1466 LayerTypeAsString(), |
1453 this); | 1467 this); |
1454 state->SetInteger("layer_id", id()); | 1468 state->SetInteger("layer_id", id()); |
1455 state->BeginDictionary("bounds"); | 1469 MathUtil::AddToTracedValue("bounds", bounds_, state); |
1456 MathUtil::AddToTracedValue(bounds_, state); | |
1457 state->EndDictionary(); | |
1458 | 1470 |
1459 state->SetDouble("opacity", opacity()); | 1471 state->SetDouble("opacity", opacity()); |
1460 | 1472 |
1461 state->BeginArray("position"); | 1473 MathUtil::AddToTracedValue("position", position_, state); |
1462 MathUtil::AddToTracedValue(position_, state); | |
1463 state->EndArray(); | |
1464 | 1474 |
1465 state->SetInteger("draws_content", DrawsContent()); | 1475 state->SetInteger("draws_content", DrawsContent()); |
1466 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); | 1476 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); |
1467 | 1477 |
1468 state->BeginArray("scroll_offset"); | 1478 MathUtil::AddToTracedValue("scroll_offset", scroll_offset_, state); |
1469 MathUtil::AddToTracedValue(scroll_offset_, state); | 1479 MathUtil::AddToTracedValue("transform_origin", transform_origin_, state); |
1470 state->EndArray(); | |
1471 | |
1472 state->BeginArray("transform_origin"); | |
1473 MathUtil::AddToTracedValue(transform_origin_, state); | |
1474 state->EndArray(); | |
1475 | 1480 |
1476 bool clipped; | 1481 bool clipped; |
1477 gfx::QuadF layer_quad = MathUtil::MapQuad( | 1482 gfx::QuadF layer_quad = MathUtil::MapQuad( |
1478 screen_space_transform(), | 1483 screen_space_transform(), |
1479 gfx::QuadF(gfx::Rect(content_bounds())), | 1484 gfx::QuadF(gfx::Rect(content_bounds())), |
1480 &clipped); | 1485 &clipped); |
1481 state->BeginArray("layer_quad"); | 1486 MathUtil::AddToTracedValue("layer_quad", layer_quad, state); |
1482 MathUtil::AddToTracedValue(layer_quad, state); | |
1483 state->EndArray(); | |
1484 if (!touch_event_handler_region_.IsEmpty()) { | 1487 if (!touch_event_handler_region_.IsEmpty()) { |
1485 state->BeginArray("touch_event_handler_region"); | 1488 state->BeginArray("touch_event_handler_region"); |
1486 touch_event_handler_region_.AsValueInto(state); | 1489 touch_event_handler_region_.AsValueInto(state); |
1487 state->EndArray(); | 1490 state->EndArray(); |
1488 } | 1491 } |
1489 if (have_wheel_event_handlers_) { | 1492 if (have_wheel_event_handlers_) { |
1490 gfx::Rect wheel_rect(content_bounds()); | 1493 gfx::Rect wheel_rect(content_bounds()); |
1491 Region wheel_region(wheel_rect); | 1494 Region wheel_region(wheel_rect); |
1492 state->BeginArray("wheel_event_handler_region"); | 1495 state->BeginArray("wheel_event_handler_region"); |
1493 wheel_region.AsValueInto(state); | 1496 wheel_region.AsValueInto(state); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1531 state->SetInteger("clip_parent", clip_parent_->id()); | 1534 state->SetInteger("clip_parent", clip_parent_->id()); |
1532 | 1535 |
1533 state->SetBoolean("can_use_lcd_text", can_use_lcd_text()); | 1536 state->SetBoolean("can_use_lcd_text", can_use_lcd_text()); |
1534 state->SetBoolean("contents_opaque", contents_opaque()); | 1537 state->SetBoolean("contents_opaque", contents_opaque()); |
1535 | 1538 |
1536 state->SetBoolean( | 1539 state->SetBoolean( |
1537 "has_animation_bounds", | 1540 "has_animation_bounds", |
1538 layer_animation_controller()->HasAnimationThatInflatesBounds()); | 1541 layer_animation_controller()->HasAnimationThatInflatesBounds()); |
1539 | 1542 |
1540 gfx::BoxF box; | 1543 gfx::BoxF box; |
1541 if (LayerUtils::GetAnimationBounds(*this, &box)) { | 1544 if (LayerUtils::GetAnimationBounds(*this, &box)) |
1542 state->BeginArray("animation_bounds"); | 1545 MathUtil::AddToTracedValue("animation_bounds", box, state); |
1543 MathUtil::AddToTracedValue(box, state); | |
1544 state->EndArray(); | |
1545 } | |
1546 | 1546 |
1547 if (debug_info_.get()) { | 1547 if (debug_info_.get()) { |
1548 std::string str; | 1548 std::string str; |
1549 debug_info_->AppendAsTraceFormat(&str); | 1549 debug_info_->AppendAsTraceFormat(&str); |
1550 base::JSONReader json_reader; | 1550 base::JSONReader json_reader; |
1551 scoped_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str)); | 1551 scoped_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str)); |
1552 | 1552 |
1553 if (debug_info_value->IsType(base::Value::TYPE_DICTIONARY)) { | 1553 if (debug_info_value->IsType(base::Value::TYPE_DICTIONARY)) { |
1554 base::DictionaryValue* dictionary_value = nullptr; | 1554 base::DictionaryValue* dictionary_value = nullptr; |
1555 bool converted_to_dictionary = | 1555 bool converted_to_dictionary = |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 SetNeedsPushProperties(); | 1595 SetNeedsPushProperties(); |
1596 layer_tree_impl()->set_needs_update_draw_properties(); | 1596 layer_tree_impl()->set_needs_update_draw_properties(); |
1597 if (should_have_render_surface) { | 1597 if (should_have_render_surface) { |
1598 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); | 1598 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); |
1599 return; | 1599 return; |
1600 } | 1600 } |
1601 render_surface_.reset(); | 1601 render_surface_.reset(); |
1602 } | 1602 } |
1603 | 1603 |
1604 } // namespace cc | 1604 } // namespace cc |
OLD | NEW |