Chromium Code Reviews| 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/trees/layer_tree_host_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 static gfx::Vector2dF GetEffectiveTotalScrollOffset(LayerType* layer) { | 56 static gfx::Vector2dF GetEffectiveTotalScrollOffset(LayerType* layer) { |
| 57 gfx::Vector2dF offset = layer->TotalScrollOffset(); | 57 gfx::Vector2dF offset = layer->TotalScrollOffset(); |
| 58 // The scroll parent's total scroll offset (scroll offset + scroll delta) | 58 // The scroll parent's total scroll offset (scroll offset + scroll delta) |
| 59 // can't be used because its scroll offset has already been applied to the | 59 // can't be used because its scroll offset has already been applied to the |
| 60 // scroll children's positions by the main thread layer positioning code. | 60 // scroll children's positions by the main thread layer positioning code. |
| 61 if (layer->scroll_parent()) | 61 if (layer->scroll_parent()) |
| 62 offset += layer->scroll_parent()->ScrollDelta(); | 62 offset += layer->scroll_parent()->ScrollDelta(); |
| 63 return offset; | 63 return offset; |
| 64 } | 64 } |
| 65 | 65 |
| 66 template <typename LayerType> | |
| 67 static inline bool LayerCanAcceptInput(LayerType* layer) { | |
|
enne (OOO)
2013/10/29 23:54:22
Maybe call this LayerHasEventHandler to be consist
sadrul
2013/10/30 15:44:42
Done.
| |
| 68 return !layer->touch_event_handler_region().IsEmpty() || | |
| 69 layer->have_wheel_event_handlers(); | |
| 70 } | |
| 71 | |
| 66 inline gfx::Rect CalculateVisibleRectWithCachedLayerRect( | 72 inline gfx::Rect CalculateVisibleRectWithCachedLayerRect( |
| 67 gfx::Rect target_surface_rect, | 73 gfx::Rect target_surface_rect, |
| 68 gfx::Rect layer_bound_rect, | 74 gfx::Rect layer_bound_rect, |
| 69 gfx::Rect layer_rect_in_target_space, | 75 gfx::Rect layer_rect_in_target_space, |
| 70 const gfx::Transform& transform) { | 76 const gfx::Transform& transform) { |
| 71 if (layer_rect_in_target_space.IsEmpty()) | 77 if (layer_rect_in_target_space.IsEmpty()) |
| 72 return gfx::Rect(); | 78 return gfx::Rect(); |
| 73 | 79 |
| 74 // Is this layer fully contained within the target surface? | 80 // Is this layer fully contained within the target surface? |
| 75 if (target_surface_rect.Contains(layer_rect_in_target_space)) | 81 if (target_surface_rect.Contains(layer_rect_in_target_space)) |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 430 | 436 |
| 431 static inline bool TransformToScreenIsKnown(Layer* layer) { | 437 static inline bool TransformToScreenIsKnown(Layer* layer) { |
| 432 return !layer->screen_space_transform_is_animating(); | 438 return !layer->screen_space_transform_is_animating(); |
| 433 } | 439 } |
| 434 | 440 |
| 435 template <typename LayerType> | 441 template <typename LayerType> |
| 436 static bool LayerShouldBeSkipped(LayerType* layer, | 442 static bool LayerShouldBeSkipped(LayerType* layer, |
| 437 bool layer_is_visible) { | 443 bool layer_is_visible) { |
| 438 // Layers can be skipped if any of these conditions are met. | 444 // Layers can be skipped if any of these conditions are met. |
| 439 // - is not visible due to it or one of its ancestors being hidden. | 445 // - is not visible due to it or one of its ancestors being hidden. |
| 446 // - the layer itself and none of its descendants participate in hit testing | |
| 440 // - has empty bounds | 447 // - has empty bounds |
| 441 // - the layer is not double-sided, but its back face is visible. | 448 // - the layer is not double-sided, but its back face is visible. |
| 442 // - is transparent | 449 // - is transparent |
| 443 // - does not draw content and does not participate in hit testing. | 450 // - does not draw content |
| 444 // | 451 // |
| 445 // Some additional conditions need to be computed at a later point after the | 452 // Some additional conditions need to be computed at a later point after the |
| 446 // recursion is finished. | 453 // recursion is finished. |
| 447 // - the intersection of render_surface content and layer clip_rect is empty | 454 // - the intersection of render_surface content and layer clip_rect is empty |
| 448 // - the visible_content_rect is empty | 455 // - the visible_content_rect is empty |
| 449 // | 456 // |
| 450 // Note, if the layer should not have been drawn due to being fully | 457 // Note, if the layer should not have been drawn due to being fully |
| 451 // transparent, we would have skipped the entire subtree and never made it | 458 // transparent, we would have skipped the entire subtree and never made it |
| 452 // into this function, so it is safe to omit this check here. | 459 // into this function, so it is safe to omit this check here. |
| 453 | 460 |
| 454 if (!layer_is_visible) | 461 if (!layer_is_visible) |
| 455 return true; | 462 return true; |
| 456 | 463 |
| 464 if (layer->draw_properties().layer_or_descendant_has_event_handler) | |
|
enne (OOO)
2013/10/29 23:54:22
I don't think this is sufficient. I feel like wha
sadrul
2013/10/30 05:20:21
I am using DataForRecursion::subtree_has_event_han
| |
| 465 return false; | |
| 466 | |
| 457 if (layer->bounds().IsEmpty()) | 467 if (layer->bounds().IsEmpty()) |
| 458 return true; | 468 return true; |
| 459 | 469 |
| 460 LayerType* backface_test_layer = layer; | 470 LayerType* backface_test_layer = layer; |
| 461 if (layer->use_parent_backface_visibility()) { | 471 if (layer->use_parent_backface_visibility()) { |
| 462 DCHECK(layer->parent()); | 472 DCHECK(layer->parent()); |
| 463 DCHECK(!layer->parent()->use_parent_backface_visibility()); | 473 DCHECK(!layer->parent()->use_parent_backface_visibility()); |
| 464 backface_test_layer = layer->parent(); | 474 backface_test_layer = layer->parent(); |
| 465 } | 475 } |
| 466 | 476 |
| 467 // The layer should not be drawn if (1) it is not double-sided and (2) the | 477 // The layer should not be drawn if (1) it is not double-sided and (2) the |
| 468 // back of the layer is known to be facing the screen. | 478 // back of the layer is known to be facing the screen. |
| 469 if (!backface_test_layer->double_sided() && | 479 if (!backface_test_layer->double_sided() && |
| 470 TransformToScreenIsKnown(backface_test_layer) && | 480 TransformToScreenIsKnown(backface_test_layer) && |
| 471 IsLayerBackFaceVisible(backface_test_layer)) | 481 IsLayerBackFaceVisible(backface_test_layer)) |
| 472 return true; | 482 return true; |
| 473 | 483 |
| 474 // The layer is visible to events. If it's subject to hit testing, then | 484 // The layer is visible to events. |
| 475 // we can't skip it. | 485 if (!layer->DrawsContent()) |
| 476 bool can_accept_input = !layer->touch_event_handler_region().IsEmpty() || | |
| 477 layer->have_wheel_event_handlers(); | |
| 478 if (!layer->DrawsContent() && !can_accept_input) | |
| 479 return true; | 486 return true; |
| 480 | 487 |
| 481 return false; | 488 return false; |
| 482 } | 489 } |
| 483 | 490 |
| 484 static inline bool SubtreeShouldBeSkipped(LayerImpl* layer, | 491 static inline bool SubtreeShouldBeSkipped(LayerImpl* layer, |
| 485 bool layer_is_visible) { | 492 bool layer_is_visible) { |
| 486 // When we need to do a readback/copy of a layer's output, we can not skip | 493 // When we need to do a readback/copy of a layer's output, we can not skip |
| 487 // it or any of its ancestors. | 494 // it or any of its ancestors. |
| 488 if (layer->draw_properties().layer_or_descendant_has_copy_request) | 495 if (layer->draw_properties().layer_or_descendant_has_copy_request) |
| 489 return false; | 496 return false; |
| 490 | 497 |
| 491 // If the layer is not visible, then skip it and its subtree. | 498 // If the layer is not visible, then skip it and its subtree. |
| 492 if (!layer_is_visible) | 499 if (!layer_is_visible) |
| 493 return true; | 500 return true; |
| 494 | 501 |
| 495 // If layer is on the pending tree and opacity is being animated then | 502 // If layer is on the pending tree and opacity is being animated then |
| 496 // this subtree can't be skipped as we need to create, prioritize and | 503 // this subtree can't be skipped as we need to create, prioritize and |
| 497 // include tiles for this layer when deciding if tree can be activated. | 504 // include tiles for this layer when deciding if tree can be activated. |
| 498 if (layer->layer_tree_impl()->IsPendingTree() && layer->OpacityIsAnimating()) | 505 if (layer->layer_tree_impl()->IsPendingTree() && layer->OpacityIsAnimating()) |
| 499 return false; | 506 return false; |
| 500 | 507 |
| 508 if (layer->draw_properties().layer_or_descendant_has_event_handler) | |
| 509 return false; | |
| 510 | |
| 501 // The opacity of a layer always applies to its children (either implicitly | 511 // The opacity of a layer always applies to its children (either implicitly |
| 502 // via a render surface or explicitly if the parent preserves 3D), so the | 512 // via a render surface or explicitly if the parent preserves 3D), so the |
| 503 // entire subtree can be skipped if this layer is fully transparent. | 513 // entire subtree can be skipped if this layer is fully transparent. |
| 504 // TODO(sad): Don't skip layers used for hit testing crbug.com/295295. | |
| 505 return !layer->opacity(); | 514 return !layer->opacity(); |
| 506 } | 515 } |
| 507 | 516 |
| 508 static inline bool SubtreeShouldBeSkipped(Layer* layer, | 517 static inline bool SubtreeShouldBeSkipped(Layer* layer, |
| 509 bool layer_is_visible) { | 518 bool layer_is_visible) { |
| 510 // When we need to do a readback/copy of a layer's output, we can not skip | 519 // When we need to do a readback/copy of a layer's output, we can not skip |
| 511 // it or any of its ancestors. | 520 // it or any of its ancestors. |
| 512 if (layer->draw_properties().layer_or_descendant_has_copy_request) | 521 if (layer->draw_properties().layer_or_descendant_has_copy_request) |
| 513 return false; | 522 return false; |
| 514 | 523 |
| 515 // If the layer is not visible, then skip it and its subtree. | 524 // If the layer is not visible, then skip it and its subtree. |
| 516 if (!layer_is_visible) | 525 if (!layer_is_visible) |
| 517 return true; | 526 return true; |
| 518 | 527 |
| 528 if (layer->draw_properties().layer_or_descendant_has_event_handler) | |
| 529 return false; | |
| 530 | |
| 519 // If the opacity is being animated then the opacity on the main thread is | 531 // If the opacity is being animated then the opacity on the main thread is |
| 520 // unreliable (since the impl thread may be using a different opacity), so it | 532 // unreliable (since the impl thread may be using a different opacity), so it |
| 521 // should not be trusted. | 533 // should not be trusted. |
| 522 // In particular, it should not cause the subtree to be skipped. | 534 // In particular, it should not cause the subtree to be skipped. |
| 523 // Similarly, for layers that might animate opacity using an impl-only | 535 // Similarly, for layers that might animate opacity using an impl-only |
| 524 // animation, their subtree should also not be skipped. | 536 // animation, their subtree should also not be skipped. |
| 525 // TODO(sad): Don't skip layers used for hit testing crbug.com/295295. | |
| 526 return !layer->opacity() && !layer->OpacityIsAnimating() && | 537 return !layer->opacity() && !layer->OpacityIsAnimating() && |
| 527 !layer->OpacityCanAnimateOnImplThread(); | 538 !layer->OpacityCanAnimateOnImplThread(); |
| 528 } | 539 } |
| 529 | 540 |
| 530 static inline void SavePaintPropertiesLayer(LayerImpl* layer) {} | 541 static inline void SavePaintPropertiesLayer(LayerImpl* layer) {} |
| 531 | 542 |
| 532 static inline void SavePaintPropertiesLayer(Layer* layer) { | 543 static inline void SavePaintPropertiesLayer(Layer* layer) { |
| 533 layer->SavePaintProperties(); | 544 layer->SavePaintProperties(); |
| 534 | 545 |
| 535 if (layer->mask_layer()) | 546 if (layer->mask_layer()) |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1011 render_surface_layer_list->back()->ClearRenderSurface(); | 1022 render_surface_layer_list->back()->ClearRenderSurface(); |
| 1012 render_surface_layer_list->pop_back(); | 1023 render_surface_layer_list->pop_back(); |
| 1013 } | 1024 } |
| 1014 DCHECK_EQ(render_surface_layer_list->back(), layer_to_remove); | 1025 DCHECK_EQ(render_surface_layer_list->back(), layer_to_remove); |
| 1015 render_surface_layer_list->pop_back(); | 1026 render_surface_layer_list->pop_back(); |
| 1016 layer_to_remove->ClearRenderSurface(); | 1027 layer_to_remove->ClearRenderSurface(); |
| 1017 } | 1028 } |
| 1018 | 1029 |
| 1019 struct PreCalculateMetaInformationRecursiveData { | 1030 struct PreCalculateMetaInformationRecursiveData { |
| 1020 bool layer_or_descendant_has_copy_request; | 1031 bool layer_or_descendant_has_copy_request; |
| 1032 bool layer_or_descendant_has_event_handler; | |
| 1021 int num_unclipped_descendants; | 1033 int num_unclipped_descendants; |
| 1022 | 1034 |
| 1023 PreCalculateMetaInformationRecursiveData() | 1035 PreCalculateMetaInformationRecursiveData() |
| 1024 : layer_or_descendant_has_copy_request(false), | 1036 : layer_or_descendant_has_copy_request(false), |
| 1037 layer_or_descendant_has_event_handler(false), | |
| 1025 num_unclipped_descendants(0) {} | 1038 num_unclipped_descendants(0) {} |
| 1026 | 1039 |
| 1027 void Merge(const PreCalculateMetaInformationRecursiveData& data) { | 1040 void Merge(const PreCalculateMetaInformationRecursiveData& data) { |
| 1028 layer_or_descendant_has_copy_request |= | 1041 layer_or_descendant_has_copy_request |= |
| 1029 data.layer_or_descendant_has_copy_request; | 1042 data.layer_or_descendant_has_copy_request; |
| 1043 layer_or_descendant_has_event_handler |= | |
| 1044 data.layer_or_descendant_has_event_handler; | |
| 1030 num_unclipped_descendants += | 1045 num_unclipped_descendants += |
| 1031 data.num_unclipped_descendants; | 1046 data.num_unclipped_descendants; |
| 1032 } | 1047 } |
| 1033 }; | 1048 }; |
| 1034 | 1049 |
| 1035 // Recursively walks the layer tree to compute any information that is needed | 1050 // Recursively walks the layer tree to compute any information that is needed |
| 1036 // before doing the main recursion. | 1051 // before doing the main recursion. |
| 1037 template <typename LayerType> | 1052 template <typename LayerType> |
| 1038 static void PreCalculateMetaInformation( | 1053 static void PreCalculateMetaInformation( |
| 1039 LayerType* layer, | 1054 LayerType* layer, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1073 | 1088 |
| 1074 if (layer->clip_children()) { | 1089 if (layer->clip_children()) { |
| 1075 int num_clip_children = layer->clip_children()->size(); | 1090 int num_clip_children = layer->clip_children()->size(); |
| 1076 DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children); | 1091 DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children); |
| 1077 recursive_data->num_unclipped_descendants -= num_clip_children; | 1092 recursive_data->num_unclipped_descendants -= num_clip_children; |
| 1078 } | 1093 } |
| 1079 | 1094 |
| 1080 if (layer->HasCopyRequest()) | 1095 if (layer->HasCopyRequest()) |
| 1081 recursive_data->layer_or_descendant_has_copy_request = true; | 1096 recursive_data->layer_or_descendant_has_copy_request = true; |
| 1082 | 1097 |
| 1098 if (LayerCanAcceptInput(layer)) | |
| 1099 recursive_data->layer_or_descendant_has_event_handler = true; | |
| 1100 | |
| 1083 layer->draw_properties().num_descendants_that_draw_content = | 1101 layer->draw_properties().num_descendants_that_draw_content = |
| 1084 num_descendants_that_draw_content; | 1102 num_descendants_that_draw_content; |
| 1085 layer->draw_properties().num_unclipped_descendants = | 1103 layer->draw_properties().num_unclipped_descendants = |
| 1086 recursive_data->num_unclipped_descendants; | 1104 recursive_data->num_unclipped_descendants; |
| 1087 layer->draw_properties().layer_or_descendant_has_copy_request = | 1105 layer->draw_properties().layer_or_descendant_has_copy_request = |
| 1088 recursive_data->layer_or_descendant_has_copy_request; | 1106 recursive_data->layer_or_descendant_has_copy_request; |
| 1107 layer->draw_properties().layer_or_descendant_has_event_handler = | |
| 1108 recursive_data->layer_or_descendant_has_event_handler; | |
| 1089 } | 1109 } |
| 1090 | 1110 |
| 1091 static void RoundTranslationComponents(gfx::Transform* transform) { | 1111 static void RoundTranslationComponents(gfx::Transform* transform) { |
| 1092 transform->matrix().set(0, 3, MathUtil::Round(transform->matrix().get(0, 3))); | 1112 transform->matrix().set(0, 3, MathUtil::Round(transform->matrix().get(0, 3))); |
| 1093 transform->matrix().set(1, 3, MathUtil::Round(transform->matrix().get(1, 3))); | 1113 transform->matrix().set(1, 3, MathUtil::Round(transform->matrix().get(1, 3))); |
| 1094 } | 1114 } |
| 1095 | 1115 |
| 1096 template <typename LayerType> | 1116 template <typename LayerType> |
| 1097 struct SubtreeGlobals { | 1117 struct SubtreeGlobals { |
| 1098 LayerSorter* layer_sorter; | 1118 LayerSorter* layer_sorter; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1135 // while dealing with the parent layer, and then this precomputed value is | 1155 // while dealing with the parent layer, and then this precomputed value is |
| 1136 // passed down the recursion to the children that actually use it. | 1156 // passed down the recursion to the children that actually use it. |
| 1137 gfx::Rect clip_rect_of_target_surface_in_target_space; | 1157 gfx::Rect clip_rect_of_target_surface_in_target_space; |
| 1138 | 1158 |
| 1139 bool ancestor_clips_subtree; | 1159 bool ancestor_clips_subtree; |
| 1140 typename LayerType::RenderSurfaceType* | 1160 typename LayerType::RenderSurfaceType* |
| 1141 nearest_ancestor_surface_that_moves_pixels; | 1161 nearest_ancestor_surface_that_moves_pixels; |
| 1142 bool in_subtree_of_page_scale_application_layer; | 1162 bool in_subtree_of_page_scale_application_layer; |
| 1143 bool subtree_can_use_lcd_text; | 1163 bool subtree_can_use_lcd_text; |
| 1144 bool subtree_is_visible_from_ancestor; | 1164 bool subtree_is_visible_from_ancestor; |
| 1165 bool subtree_has_event_handler; | |
| 1145 }; | 1166 }; |
| 1146 | 1167 |
| 1147 template <typename LayerType> | 1168 template <typename LayerType> |
| 1148 static LayerType* GetChildContainingLayer(const LayerType& parent, | 1169 static LayerType* GetChildContainingLayer(const LayerType& parent, |
| 1149 LayerType* layer) { | 1170 LayerType* layer) { |
| 1150 for (LayerType* ancestor = layer; ancestor; ancestor = ancestor->parent()) { | 1171 for (LayerType* ancestor = layer; ancestor; ancestor = ancestor->parent()) { |
| 1151 if (ancestor->parent() == &parent) | 1172 if (ancestor->parent() == &parent) |
| 1152 return ancestor; | 1173 return ancestor; |
| 1153 } | 1174 } |
| 1154 NOTREACHED(); | 1175 NOTREACHED(); |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1401 (globals.page_scale_factor == 1.f)); | 1422 (globals.page_scale_factor == 1.f)); |
| 1402 | 1423 |
| 1403 DataForRecursion<LayerType> data_for_children; | 1424 DataForRecursion<LayerType> data_for_children; |
| 1404 typename LayerType::RenderSurfaceType* | 1425 typename LayerType::RenderSurfaceType* |
| 1405 nearest_ancestor_surface_that_moves_pixels = | 1426 nearest_ancestor_surface_that_moves_pixels = |
| 1406 data_from_ancestor.nearest_ancestor_surface_that_moves_pixels; | 1427 data_from_ancestor.nearest_ancestor_surface_that_moves_pixels; |
| 1407 data_for_children.in_subtree_of_page_scale_application_layer = | 1428 data_for_children.in_subtree_of_page_scale_application_layer = |
| 1408 data_from_ancestor.in_subtree_of_page_scale_application_layer; | 1429 data_from_ancestor.in_subtree_of_page_scale_application_layer; |
| 1409 data_for_children.subtree_can_use_lcd_text = | 1430 data_for_children.subtree_can_use_lcd_text = |
| 1410 data_from_ancestor.subtree_can_use_lcd_text; | 1431 data_from_ancestor.subtree_can_use_lcd_text; |
| 1432 data_for_children.subtree_has_event_handler = | |
| 1433 data_from_ancestor.subtree_has_event_handler || | |
| 1434 layer->draw_properties().layer_or_descendant_has_event_handler; | |
| 1411 | 1435 |
| 1412 // Layers with a copy request are always visible, as well as un-hiding their | 1436 // Layers with a copy request are always visible, as well as un-hiding their |
| 1413 // subtree. Otherise, layers that are marked as hidden will hide themselves | 1437 // subtree. Otherise, layers that are marked as hidden will hide themselves |
| 1414 // and their subtree. | 1438 // and their subtree. |
| 1415 bool layer_is_visible = | 1439 bool layer_is_visible = |
| 1416 data_from_ancestor.subtree_is_visible_from_ancestor && | 1440 data_from_ancestor.subtree_is_visible_from_ancestor && |
| 1417 !layer->hide_layer_and_subtree(); | 1441 !layer->hide_layer_and_subtree(); |
| 1418 if (layer->HasCopyRequest()) | 1442 if (layer->HasCopyRequest()) |
| 1419 layer_is_visible = true; | 1443 layer_is_visible = true; |
| 1420 | 1444 |
| 1421 // The root layer cannot skip CalcDrawProperties. | 1445 // The root layer cannot skip CalcDrawProperties. |
| 1422 if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_visible)) { | 1446 if (!IsRootLayer(layer) && |
| 1447 !data_from_ancestor.subtree_has_event_handler && | |
| 1448 SubtreeShouldBeSkipped(layer, layer_is_visible)) { | |
| 1423 if (layer->render_surface()) | 1449 if (layer->render_surface()) |
| 1424 layer->ClearRenderSurface(); | 1450 layer->ClearRenderSurface(); |
| 1425 return; | 1451 return; |
| 1426 } | 1452 } |
| 1427 | 1453 |
| 1428 // We need to circumvent the normal recursive flow of information for clip | 1454 // We need to circumvent the normal recursive flow of information for clip |
| 1429 // children (they don't inherit their direct ancestor's clip information). | 1455 // children (they don't inherit their direct ancestor's clip information). |
| 1430 // This is unfortunate, and would be unnecessary if we were to formally | 1456 // This is unfortunate, and would be unnecessary if we were to formally |
| 1431 // separate the clipping hierarchy from the layer hierarchy. | 1457 // separate the clipping hierarchy from the layer hierarchy. |
| 1432 bool ancestor_clips_subtree = data_from_ancestor.ancestor_clips_subtree; | 1458 bool ancestor_clips_subtree = data_from_ancestor.ancestor_clips_subtree; |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1840 } | 1866 } |
| 1841 | 1867 |
| 1842 typename LayerType::RenderSurfaceListType& descendants = | 1868 typename LayerType::RenderSurfaceListType& descendants = |
| 1843 (layer->render_surface() ? layer->render_surface()->layer_list() | 1869 (layer->render_surface() ? layer->render_surface()->layer_list() |
| 1844 : *layer_list); | 1870 : *layer_list); |
| 1845 | 1871 |
| 1846 // Any layers that are appended after this point are in the layer's subtree | 1872 // Any layers that are appended after this point are in the layer's subtree |
| 1847 // and should be included in the sorting process. | 1873 // and should be included in the sorting process. |
| 1848 size_t sorting_start_index = descendants.size(); | 1874 size_t sorting_start_index = descendants.size(); |
| 1849 | 1875 |
| 1850 if (!LayerShouldBeSkipped(layer, layer_is_visible)) | 1876 if (data_from_ancestor.subtree_has_event_handler || |
| 1877 !LayerShouldBeSkipped(layer, layer_is_visible)) | |
| 1851 descendants.push_back(layer); | 1878 descendants.push_back(layer); |
| 1852 | 1879 |
| 1853 // Any layers that are appended after this point may need to be sorted if we | 1880 // Any layers that are appended after this point may need to be sorted if we |
| 1854 // visit the children out of order. | 1881 // visit the children out of order. |
| 1855 size_t render_surface_layer_list_child_sorting_start_index = | 1882 size_t render_surface_layer_list_child_sorting_start_index = |
| 1856 render_surface_layer_list->size(); | 1883 render_surface_layer_list->size(); |
| 1857 size_t layer_list_child_sorting_start_index = descendants.size(); | 1884 size_t layer_list_child_sorting_start_index = descendants.size(); |
| 1858 | 1885 |
| 1859 if (!layer->children().empty()) { | 1886 if (!layer->children().empty()) { |
| 1860 if (layer == globals.page_scale_application_layer) { | 1887 if (layer == globals.page_scale_application_layer) { |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2138 data_for_recursion.clip_rect_of_target_surface_in_target_space = | 2165 data_for_recursion.clip_rect_of_target_surface_in_target_space = |
| 2139 device_viewport_rect; | 2166 device_viewport_rect; |
| 2140 data_for_recursion.ancestor_clips_subtree = true; | 2167 data_for_recursion.ancestor_clips_subtree = true; |
| 2141 data_for_recursion.nearest_ancestor_surface_that_moves_pixels = NULL; | 2168 data_for_recursion.nearest_ancestor_surface_that_moves_pixels = NULL; |
| 2142 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 2169 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
| 2143 data_for_recursion.subtree_can_use_lcd_text = inputs->can_use_lcd_text; | 2170 data_for_recursion.subtree_can_use_lcd_text = inputs->can_use_lcd_text; |
| 2144 data_for_recursion.subtree_is_visible_from_ancestor = true; | 2171 data_for_recursion.subtree_is_visible_from_ancestor = true; |
| 2145 | 2172 |
| 2146 PreCalculateMetaInformationRecursiveData recursive_data; | 2173 PreCalculateMetaInformationRecursiveData recursive_data; |
| 2147 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2174 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); |
| 2175 data_for_recursion.subtree_has_event_handler = | |
| 2176 inputs->root_layer->draw_properties(). | |
| 2177 layer_or_descendant_has_event_handler; | |
| 2148 std::vector<AccumulatedSurfaceState<Layer> > accumulated_surface_state; | 2178 std::vector<AccumulatedSurfaceState<Layer> > accumulated_surface_state; |
| 2149 CalculateDrawPropertiesInternal<Layer>(inputs->root_layer, | 2179 CalculateDrawPropertiesInternal<Layer>(inputs->root_layer, |
| 2150 globals, | 2180 globals, |
| 2151 data_for_recursion, | 2181 data_for_recursion, |
| 2152 inputs->render_surface_layer_list, | 2182 inputs->render_surface_layer_list, |
| 2153 &dummy_layer_list, | 2183 &dummy_layer_list, |
| 2154 &accumulated_surface_state); | 2184 &accumulated_surface_state); |
| 2155 | 2185 |
| 2156 // The dummy layer list should not have been used. | 2186 // The dummy layer list should not have been used. |
| 2157 DCHECK_EQ(0u, dummy_layer_list.size()); | 2187 DCHECK_EQ(0u, dummy_layer_list.size()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2196 data_for_recursion.clip_rect_of_target_surface_in_target_space = | 2226 data_for_recursion.clip_rect_of_target_surface_in_target_space = |
| 2197 device_viewport_rect; | 2227 device_viewport_rect; |
| 2198 data_for_recursion.ancestor_clips_subtree = true; | 2228 data_for_recursion.ancestor_clips_subtree = true; |
| 2199 data_for_recursion.nearest_ancestor_surface_that_moves_pixels = NULL; | 2229 data_for_recursion.nearest_ancestor_surface_that_moves_pixels = NULL; |
| 2200 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 2230 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
| 2201 data_for_recursion.subtree_can_use_lcd_text = inputs->can_use_lcd_text; | 2231 data_for_recursion.subtree_can_use_lcd_text = inputs->can_use_lcd_text; |
| 2202 data_for_recursion.subtree_is_visible_from_ancestor = true; | 2232 data_for_recursion.subtree_is_visible_from_ancestor = true; |
| 2203 | 2233 |
| 2204 PreCalculateMetaInformationRecursiveData recursive_data; | 2234 PreCalculateMetaInformationRecursiveData recursive_data; |
| 2205 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); | 2235 PreCalculateMetaInformation(inputs->root_layer, &recursive_data); |
| 2236 data_for_recursion.subtree_has_event_handler = | |
| 2237 inputs->root_layer->draw_properties(). | |
| 2238 layer_or_descendant_has_event_handler; | |
| 2206 std::vector<AccumulatedSurfaceState<LayerImpl> > | 2239 std::vector<AccumulatedSurfaceState<LayerImpl> > |
| 2207 accumulated_surface_state; | 2240 accumulated_surface_state; |
| 2208 CalculateDrawPropertiesInternal<LayerImpl>(inputs->root_layer, | 2241 CalculateDrawPropertiesInternal<LayerImpl>(inputs->root_layer, |
| 2209 globals, | 2242 globals, |
| 2210 data_for_recursion, | 2243 data_for_recursion, |
| 2211 inputs->render_surface_layer_list, | 2244 inputs->render_surface_layer_list, |
| 2212 &dummy_layer_list, | 2245 &dummy_layer_list, |
| 2213 &accumulated_surface_state); | 2246 &accumulated_surface_state); |
| 2214 | 2247 |
| 2215 // The dummy layer list should not have been used. | 2248 // The dummy layer list should not have been used. |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2391 // At this point, we think the point does hit the touch event handler region | 2424 // At this point, we think the point does hit the touch event handler region |
| 2392 // on the layer, but we need to walk up the parents to ensure that the layer | 2425 // on the layer, but we need to walk up the parents to ensure that the layer |
| 2393 // was not clipped in such a way that the hit point actually should not hit | 2426 // was not clipped in such a way that the hit point actually should not hit |
| 2394 // the layer. | 2427 // the layer. |
| 2395 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) | 2428 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) |
| 2396 return false; | 2429 return false; |
| 2397 | 2430 |
| 2398 return true; | 2431 return true; |
| 2399 } | 2432 } |
| 2400 } // namespace cc | 2433 } // namespace cc |
| OLD | NEW |