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 |