| 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/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/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "cc/animation/animation_registrar.h" | 9 #include "cc/animation/animation_registrar.h" |
| 10 #include "cc/animation/scrollbar_animation_controller.h" | 10 #include "cc/animation/scrollbar_animation_controller.h" |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 return 0; | 248 return 0; |
| 249 } | 249 } |
| 250 | 250 |
| 251 void LayerImpl::SetSentScrollDelta(gfx::Vector2d sent_scroll_delta) { | 251 void LayerImpl::SetSentScrollDelta(gfx::Vector2d sent_scroll_delta) { |
| 252 // Pending tree never has sent scroll deltas | 252 // Pending tree never has sent scroll deltas |
| 253 DCHECK(layer_tree_impl()->IsActiveTree()); | 253 DCHECK(layer_tree_impl()->IsActiveTree()); |
| 254 | 254 |
| 255 if (sent_scroll_delta_ == sent_scroll_delta) | 255 if (sent_scroll_delta_ == sent_scroll_delta) |
| 256 return; | 256 return; |
| 257 | 257 |
| 258 scoped_ptr<base::Value> value = MathUtil::AsValue(sent_scroll_delta); |
| 259 TRACE_EVENT1("impl-scroll", |
| 260 "LayerImpl::SetSentScrollDelta", |
| 261 "sent_scroll_delta", |
| 262 TracedValue::FromValue(value.release())); |
| 263 |
| 258 sent_scroll_delta_ = sent_scroll_delta; | 264 sent_scroll_delta_ = sent_scroll_delta; |
| 259 } | 265 } |
| 260 | 266 |
| 261 gfx::Vector2dF LayerImpl::ScrollBy(gfx::Vector2dF scroll) { | 267 gfx::Vector2dF LayerImpl::ScrollBy(gfx::Vector2dF scroll) { |
| 262 DCHECK(scrollable()); | 268 DCHECK(scrollable()); |
| 263 | 269 |
| 270 scoped_ptr<base::Value> value = MathUtil::AsValue(scroll); |
| 271 TRACE_EVENT1("impl-scroll", |
| 272 "LayerImpl::ScrollBy", |
| 273 "scroll", |
| 274 TracedValue::FromValue(value.release())); |
| 275 |
| 264 gfx::Vector2dF min_delta = -scroll_offset_; | 276 gfx::Vector2dF min_delta = -scroll_offset_; |
| 265 gfx::Vector2dF max_delta = max_scroll_offset_ - scroll_offset_; | 277 gfx::Vector2dF max_delta = max_scroll_offset_ - scroll_offset_; |
| 266 // Clamp new_delta so that position + delta stays within scroll bounds. | 278 // Clamp new_delta so that position + delta stays within scroll bounds. |
| 267 gfx::Vector2dF new_delta = (ScrollDelta() + scroll); | 279 gfx::Vector2dF new_delta = (ScrollDelta() + scroll); |
| 268 new_delta.SetToMax(min_delta); | 280 new_delta.SetToMax(min_delta); |
| 269 new_delta.SetToMin(max_delta); | 281 new_delta.SetToMin(max_delta); |
| 270 gfx::Vector2dF unscrolled = ScrollDelta() + scroll - new_delta; | 282 gfx::Vector2dF unscrolled = ScrollDelta() + scroll - new_delta; |
| 271 SetScrollDelta(new_delta); | 283 SetScrollDelta(new_delta); |
| 272 return unscrolled; | 284 return unscrolled; |
| 273 } | 285 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 288 // leave the total scroll offset unchanged on this layer regardless of | 300 // leave the total scroll offset unchanged on this layer regardless of |
| 289 // whether a delegate is being used. | 301 // whether a delegate is being used. |
| 290 scroll_offset_ += sent_scroll_delta_; | 302 scroll_offset_ += sent_scroll_delta_; |
| 291 scroll_delta_ -= sent_scroll_delta_; | 303 scroll_delta_ -= sent_scroll_delta_; |
| 292 sent_scroll_delta_ = gfx::Vector2d(); | 304 sent_scroll_delta_ = gfx::Vector2d(); |
| 293 } | 305 } |
| 294 | 306 |
| 295 InputHandler::ScrollStatus LayerImpl::TryScroll( | 307 InputHandler::ScrollStatus LayerImpl::TryScroll( |
| 296 gfx::PointF screen_space_point, | 308 gfx::PointF screen_space_point, |
| 297 InputHandler::ScrollInputType type) const { | 309 InputHandler::ScrollInputType type) const { |
| 310 |
| 298 if (should_scroll_on_main_thread()) { | 311 if (should_scroll_on_main_thread()) { |
| 299 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); | 312 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 313 "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread", |
| 314 TRACE_EVENT_SCOPE_THREAD); |
| 300 return InputHandler::ScrollOnMainThread; | 315 return InputHandler::ScrollOnMainThread; |
| 301 } | 316 } |
| 302 | 317 |
| 303 if (!screen_space_transform().IsInvertible()) { | 318 if (!screen_space_transform().IsInvertible()) { |
| 304 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); | 319 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 320 "LayerImpl::TryScroll: Ignored NonInvertibleTransform", |
| 321 TRACE_EVENT_SCOPE_THREAD); |
| 305 return InputHandler::ScrollIgnored; | 322 return InputHandler::ScrollIgnored; |
| 306 } | 323 } |
| 307 | 324 |
| 308 if (!non_fast_scrollable_region().IsEmpty()) { | 325 if (!non_fast_scrollable_region().IsEmpty()) { |
| 309 bool clipped = false; | 326 bool clipped = false; |
| 310 gfx::Transform inverse_screen_space_transform( | 327 gfx::Transform inverse_screen_space_transform( |
| 311 gfx::Transform::kSkipInitialization); | 328 gfx::Transform::kSkipInitialization); |
| 312 if (!screen_space_transform().GetInverse(&inverse_screen_space_transform)) { | 329 if (!screen_space_transform().GetInverse(&inverse_screen_space_transform)) { |
| 313 // TODO(shawnsingh): We shouldn't be applying a projection if screen space | 330 // TODO(shawnsingh): We shouldn't be applying a projection if screen space |
| 314 // transform is uninvertible here. Perhaps we should be returning | 331 // transform is uninvertible here. Perhaps we should be returning |
| 315 // ScrollOnMainThread in this case? | 332 // ScrollOnMainThread in this case? |
| 316 } | 333 } |
| 317 | 334 |
| 318 gfx::PointF hit_test_point_in_content_space = | 335 gfx::PointF hit_test_point_in_content_space = |
| 319 MathUtil::ProjectPoint(inverse_screen_space_transform, | 336 MathUtil::ProjectPoint(inverse_screen_space_transform, |
| 320 screen_space_point, | 337 screen_space_point, |
| 321 &clipped); | 338 &clipped); |
| 322 gfx::PointF hit_test_point_in_layer_space = | 339 gfx::PointF hit_test_point_in_layer_space = |
| 323 gfx::ScalePoint(hit_test_point_in_content_space, | 340 gfx::ScalePoint(hit_test_point_in_content_space, |
| 324 1.f / contents_scale_x(), | 341 1.f / contents_scale_x(), |
| 325 1.f / contents_scale_y()); | 342 1.f / contents_scale_y()); |
| 326 if (!clipped && | 343 if (!clipped && |
| 327 non_fast_scrollable_region().Contains( | 344 non_fast_scrollable_region().Contains( |
| 328 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 345 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
| 329 TRACE_EVENT0("cc", | 346 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 330 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 347 "LayerImpl::TryScroll: Failed NonFastScrollableRegion", |
| 348 TRACE_EVENT_SCOPE_THREAD); |
| 331 return InputHandler::ScrollOnMainThread; | 349 return InputHandler::ScrollOnMainThread; |
| 332 } | 350 } |
| 333 } | 351 } |
| 334 | 352 |
| 335 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { | 353 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { |
| 336 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); | 354 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 355 "LayerImpl::TryScroll: Failed WheelEventHandlers", |
| 356 TRACE_EVENT_SCOPE_THREAD); |
| 337 return InputHandler::ScrollOnMainThread; | 357 return InputHandler::ScrollOnMainThread; |
| 338 } | 358 } |
| 339 | 359 |
| 340 if (!scrollable()) { | 360 if (!scrollable()) { |
| 341 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 361 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 362 "LayerImpl::TryScroll: Ignored not scrollable", |
| 363 TRACE_EVENT_SCOPE_THREAD); |
| 342 return InputHandler::ScrollIgnored; | 364 return InputHandler::ScrollIgnored; |
| 343 } | 365 } |
| 344 | 366 |
| 345 if (max_scroll_offset_.x() <= 0 && max_scroll_offset_.y() <= 0) { | 367 if (max_scroll_offset_.x() <= 0 && max_scroll_offset_.y() <= 0) { |
| 346 TRACE_EVENT0("cc", | 368 TRACE_EVENT_INSTANT0("cc,impl-scroll", |
| 347 "LayerImpl::tryScroll: Ignored. Technically scrollable," | 369 "LayerImpl::TryScroll: Ignored. Technically scrollable," |
| 348 " but has no affordance in either direction."); | 370 " but has no affordance in either direction.", |
| 371 TRACE_EVENT_SCOPE_THREAD); |
| 349 return InputHandler::ScrollIgnored; | 372 return InputHandler::ScrollIgnored; |
| 350 } | 373 } |
| 351 | 374 |
| 375 TRACE_EVENT_INSTANT1("cc,impl-scroll", |
| 376 "LayerImpl::TryScroll: Started", |
| 377 TRACE_EVENT_SCOPE_THREAD, |
| 378 "layer_id", id()); |
| 379 |
| 352 return InputHandler::ScrollStarted; | 380 return InputHandler::ScrollStarted; |
| 353 } | 381 } |
| 354 | 382 |
| 355 bool LayerImpl::DrawCheckerboardForMissingTiles() const { | 383 bool LayerImpl::DrawCheckerboardForMissingTiles() const { |
| 356 return draw_checkerboard_for_missing_tiles_ && | 384 return draw_checkerboard_for_missing_tiles_ && |
| 357 !layer_tree_impl()->settings().background_color_instead_of_checkerboard; | 385 !layer_tree_impl()->settings().background_color_instead_of_checkerboard; |
| 358 } | 386 } |
| 359 | 387 |
| 360 gfx::Rect LayerImpl::LayerRectToContentRect( | 388 gfx::Rect LayerImpl::LayerRectToContentRect( |
| 361 const gfx::RectF& layer_rect) const { | 389 const gfx::RectF& layer_rect) const { |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 gfx::Vector2dF LayerImpl::ScrollDelta() const { | 917 gfx::Vector2dF LayerImpl::ScrollDelta() const { |
| 890 if (scroll_offset_delegate_) | 918 if (scroll_offset_delegate_) |
| 891 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_; | 919 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_; |
| 892 return scroll_delta_; | 920 return scroll_delta_; |
| 893 } | 921 } |
| 894 | 922 |
| 895 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) { | 923 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) { |
| 896 if (ScrollDelta() == scroll_delta) | 924 if (ScrollDelta() == scroll_delta) |
| 897 return; | 925 return; |
| 898 | 926 |
| 927 scoped_ptr<base::Value> value = MathUtil::AsValue(scroll_delta); |
| 928 TRACE_EVENT1("impl-scroll", |
| 929 "LayerImpl::SetScrollDelta", |
| 930 "delta", |
| 931 TracedValue::FromValue(value.release())); |
| 932 |
| 899 if (layer_tree_impl()->IsActiveTree()) { | 933 if (layer_tree_impl()->IsActiveTree()) { |
| 900 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id()); | 934 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id()); |
| 901 if (pending_twin) { | 935 if (pending_twin) { |
| 902 // The pending twin can't mirror the scroll delta of the active | 936 // The pending twin can't mirror the scroll delta of the active |
| 903 // layer. Although the delta - sent scroll delta difference is | 937 // layer. Although the delta - sent scroll delta difference is |
| 904 // identical for both twins, the sent scroll delta for the pending | 938 // identical for both twins, the sent scroll delta for the pending |
| 905 // layer is zero, as anything that has been sent has been baked | 939 // layer is zero, as anything that has been sent has been baked |
| 906 // into the layer's position/scroll offset as a part of commit. | 940 // into the layer's position/scroll offset as a part of commit. |
| 907 DCHECK(pending_twin->sent_scroll_delta().IsZero()); | 941 DCHECK(pending_twin->sent_scroll_delta().IsZero()); |
| 908 pending_twin->SetScrollDelta(scroll_delta - sent_scroll_delta()); | 942 pending_twin->SetScrollDelta(scroll_delta - sent_scroll_delta()); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 state->Set("compositing_reasons", | 1155 state->Set("compositing_reasons", |
| 1122 CompositingReasonsAsValue(compositing_reasons_).release()); | 1156 CompositingReasonsAsValue(compositing_reasons_).release()); |
| 1123 | 1157 |
| 1124 bool clipped; | 1158 bool clipped; |
| 1125 gfx::QuadF layer_quad = MathUtil::MapQuad( | 1159 gfx::QuadF layer_quad = MathUtil::MapQuad( |
| 1126 screen_space_transform(), | 1160 screen_space_transform(), |
| 1127 gfx::QuadF(gfx::Rect(content_bounds())), | 1161 gfx::QuadF(gfx::Rect(content_bounds())), |
| 1128 &clipped); | 1162 &clipped); |
| 1129 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release()); | 1163 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release()); |
| 1130 | 1164 |
| 1165 #ifndef NDEBUG |
| 1166 state->SetString("debug_name", debug_name_); |
| 1167 #endif |
| 1131 | 1168 |
| 1132 scoped_ptr<base::ListValue> children_list(new base::ListValue()); | 1169 scoped_ptr<base::ListValue> children_list(new base::ListValue()); |
| 1133 for (size_t i = 0; i < children_.size(); ++i) | 1170 for (size_t i = 0; i < children_.size(); ++i) |
| 1134 children_list->Append(children_[i]->AsValue().release()); | 1171 children_list->Append(children_[i]->AsValue().release()); |
| 1135 state->Set("children", children_list.release()); | 1172 state->Set("children", children_list.release()); |
| 1136 if (mask_layer_) | 1173 if (mask_layer_) |
| 1137 state->Set("mask_layer", mask_layer_->AsValue().release()); | 1174 state->Set("mask_layer", mask_layer_->AsValue().release()); |
| 1138 if (replica_layer_) | 1175 if (replica_layer_) |
| 1139 state->Set("replica_layer", replica_layer_->AsValue().release()); | 1176 state->Set("replica_layer", replica_layer_->AsValue().release()); |
| 1140 } | 1177 } |
| 1141 | 1178 |
| 1142 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } | 1179 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } |
| 1143 | 1180 |
| 1144 scoped_ptr<base::Value> LayerImpl::AsValue() const { | 1181 scoped_ptr<base::Value> LayerImpl::AsValue() const { |
| 1145 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 1182 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
| 1146 AsValueInto(state.get()); | 1183 AsValueInto(state.get()); |
| 1147 return state.PassAs<base::Value>(); | 1184 return state.PassAs<base::Value>(); |
| 1148 } | 1185 } |
| 1149 | 1186 |
| 1150 } // namespace cc | 1187 } // namespace cc |
| OLD | NEW |