| 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_sorter.h" | 5 #include "cc/trees/layer_sorter.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 // if the layers are found to be intesecting (some features are in front and | 83 // if the layers are found to be intesecting (some features are in front and |
| 84 // some are behind). | 84 // some are behind). |
| 85 LayerSorter::ABCompareResult LayerSorter::CheckOverlap(LayerShape* a, | 85 LayerSorter::ABCompareResult LayerSorter::CheckOverlap(LayerShape* a, |
| 86 LayerShape* b, | 86 LayerShape* b, |
| 87 float z_threshold, | 87 float z_threshold, |
| 88 float* weight) { | 88 float* weight) { |
| 89 *weight = 0.f; | 89 *weight = 0.f; |
| 90 | 90 |
| 91 // Early out if the projected bounds don't overlap. | 91 // Early out if the projected bounds don't overlap. |
| 92 if (!a->projected_bounds.Intersects(b->projected_bounds)) | 92 if (!a->projected_bounds.Intersects(b->projected_bounds)) |
| 93 return NONE; | 93 return None; |
| 94 | 94 |
| 95 gfx::PointF aPoints[4] = { a->projected_quad.p1(), | 95 gfx::PointF aPoints[4] = { a->projected_quad.p1(), |
| 96 a->projected_quad.p2(), | 96 a->projected_quad.p2(), |
| 97 a->projected_quad.p3(), | 97 a->projected_quad.p3(), |
| 98 a->projected_quad.p4() }; | 98 a->projected_quad.p4() }; |
| 99 gfx::PointF bPoints[4] = { b->projected_quad.p1(), | 99 gfx::PointF bPoints[4] = { b->projected_quad.p1(), |
| 100 b->projected_quad.p2(), | 100 b->projected_quad.p2(), |
| 101 b->projected_quad.p3(), | 101 b->projected_quad.p3(), |
| 102 b->projected_quad.p4() }; | 102 b->projected_quad.p4() }; |
| 103 | 103 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 116 // edges. | 116 // edges. |
| 117 gfx::PointF r; | 117 gfx::PointF r; |
| 118 for (int ea = 0; ea < 4; ++ea) | 118 for (int ea = 0; ea < 4; ++ea) |
| 119 for (int eb = 0; eb < 4; ++eb) | 119 for (int eb = 0; eb < 4; ++eb) |
| 120 if (EdgeEdgeTest(aPoints[ea], aPoints[(ea + 1) % 4], | 120 if (EdgeEdgeTest(aPoints[ea], aPoints[(ea + 1) % 4], |
| 121 bPoints[eb], bPoints[(eb + 1) % 4], | 121 bPoints[eb], bPoints[(eb + 1) % 4], |
| 122 &r)) | 122 &r)) |
| 123 overlap_points.push_back(r); | 123 overlap_points.push_back(r); |
| 124 | 124 |
| 125 if (overlap_points.empty()) | 125 if (overlap_points.empty()) |
| 126 return NONE; | 126 return None; |
| 127 | 127 |
| 128 // Check the corresponding layer depth value for all overlap points to | 128 // Check the corresponding layer depth value for all overlap points to |
| 129 // determine which layer is in front. | 129 // determine which layer is in front. |
| 130 float max_positive = 0.f; | 130 float max_positive = 0.f; |
| 131 float max_negative = 0.f; | 131 float max_negative = 0.f; |
| 132 | 132 |
| 133 // This flag tracks the existance of a numerically accurate seperation | 133 // This flag tracks the existance of a numerically accurate seperation |
| 134 // between two layers. If there is no accurate seperation, the layers | 134 // between two layers. If there is no accurate seperation, the layers |
| 135 // cannot be effectively sorted. | 135 // cannot be effectively sorted. |
| 136 bool accurate = false; | 136 bool accurate = false; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 150 | 150 |
| 151 float diff = za - zb; | 151 float diff = za - zb; |
| 152 if (diff > max_positive) | 152 if (diff > max_positive) |
| 153 max_positive = diff; | 153 max_positive = diff; |
| 154 if (diff < max_negative) | 154 if (diff < max_negative) |
| 155 max_negative = diff; | 155 max_negative = diff; |
| 156 } | 156 } |
| 157 | 157 |
| 158 // If we can't tell which should come first, we use document order. | 158 // If we can't tell which should come first, we use document order. |
| 159 if (!accurate) | 159 if (!accurate) |
| 160 return A_BEFORE_B; | 160 return ABeforeB; |
| 161 | 161 |
| 162 float max_diff = | 162 float max_diff = |
| 163 std::abs(max_positive) > std::abs(max_negative) ? | 163 std::abs(max_positive) > std::abs(max_negative) ? |
| 164 max_positive : max_negative; | 164 max_positive : max_negative; |
| 165 | 165 |
| 166 // If the results are inconsistent (and the z difference substantial to rule | 166 // If the results are inconsistent (and the z difference substantial to rule |
| 167 // out numerical errors) then the layers are intersecting. We will still | 167 // out numerical errors) then the layers are intersecting. We will still |
| 168 // return an order based on the maximum depth difference but with an edge | 168 // return an order based on the maximum depth difference but with an edge |
| 169 // weight of zero these layers will get priority if a graph cycle is present | 169 // weight of zero these layers will get priority if a graph cycle is present |
| 170 // and needs to be broken. | 170 // and needs to be broken. |
| 171 if (max_positive > z_threshold && max_negative < -z_threshold) | 171 if (max_positive > z_threshold && max_negative < -z_threshold) |
| 172 *weight = 0.f; | 172 *weight = 0.f; |
| 173 else | 173 else |
| 174 *weight = std::abs(max_diff); | 174 *weight = std::abs(max_diff); |
| 175 | 175 |
| 176 // Maintain relative order if the layers have the same depth at all | 176 // Maintain relative order if the layers have the same depth at all |
| 177 // intersection points. | 177 // intersection points. |
| 178 if (max_diff <= 0.f) | 178 if (max_diff <= 0.f) |
| 179 return A_BEFORE_B; | 179 return ABeforeB; |
| 180 | 180 |
| 181 return B_BEFORE_A; | 181 return BBeforeA; |
| 182 } | 182 } |
| 183 | 183 |
| 184 LayerShape::LayerShape() {} | 184 LayerShape::LayerShape() {} |
| 185 | 185 |
| 186 LayerShape::LayerShape(float width, | 186 LayerShape::LayerShape(float width, |
| 187 float height, | 187 float height, |
| 188 const gfx::Transform& draw_transform) { | 188 const gfx::Transform& draw_transform) { |
| 189 gfx::QuadF layer_quad(gfx::RectF(0.f, 0.f, width, height)); | 189 gfx::QuadF layer_quad(gfx::RectF(0.f, 0.f, width, height)); |
| 190 | 190 |
| 191 // Compute the projection of the layer quad onto the z = 0 plane. | 191 // Compute the projection of the layer quad onto the z = 0 plane. |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 GraphNode& node_b = nodes_[nb]; | 313 GraphNode& node_b = nodes_[nb]; |
| 314 if (!node_b.layer->DrawsContent() && !node_b.layer->render_surface()) | 314 if (!node_b.layer->DrawsContent() && !node_b.layer->render_surface()) |
| 315 continue; | 315 continue; |
| 316 float weight = 0.f; | 316 float weight = 0.f; |
| 317 ABCompareResult overlap_result = CheckOverlap(&node_a.shape, | 317 ABCompareResult overlap_result = CheckOverlap(&node_a.shape, |
| 318 &node_b.shape, | 318 &node_b.shape, |
| 319 z_threshold, | 319 z_threshold, |
| 320 &weight); | 320 &weight); |
| 321 GraphNode* start_node = NULL; | 321 GraphNode* start_node = NULL; |
| 322 GraphNode* end_node = NULL; | 322 GraphNode* end_node = NULL; |
| 323 if (overlap_result == A_BEFORE_B) { | 323 if (overlap_result == ABeforeB) { |
| 324 start_node = &node_a; | 324 start_node = &node_a; |
| 325 end_node = &node_b; | 325 end_node = &node_b; |
| 326 } else if (overlap_result == B_BEFORE_A) { | 326 } else if (overlap_result == BBeforeA) { |
| 327 start_node = &node_b; | 327 start_node = &node_b; |
| 328 end_node = &node_a; | 328 end_node = &node_a; |
| 329 } | 329 } |
| 330 | 330 |
| 331 if (start_node) { | 331 if (start_node) { |
| 332 DVLOG(2) << start_node->layer->id() << " -> " << end_node->layer->id(); | 332 DVLOG(2) << start_node->layer->id() << " -> " << end_node->layer->id(); |
| 333 edges_.push_back(GraphEdge(start_node, end_node, weight)); | 333 edges_.push_back(GraphEdge(start_node, end_node, weight)); |
| 334 } | 334 } |
| 335 } | 335 } |
| 336 } | 336 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 *it = sorted_list[count++]->layer; | 461 *it = sorted_list[count++]->layer; |
| 462 | 462 |
| 463 DVLOG(2) << "Sorting end ----"; | 463 DVLOG(2) << "Sorting end ----"; |
| 464 | 464 |
| 465 nodes_.clear(); | 465 nodes_.clear(); |
| 466 edges_.clear(); | 466 edges_.clear(); |
| 467 active_edges_.clear(); | 467 active_edges_.clear(); |
| 468 } | 468 } |
| 469 | 469 |
| 470 } // namespace cc | 470 } // namespace cc |
| OLD | NEW |