| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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/base/rtree.h" | 5 #include "cc/base/rtree.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> |
| 10 #include <cmath> | 11 #include <cmath> |
| 11 | 12 |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/numerics/saturated_arithmetic.h" |
| 13 | 15 |
| 14 namespace cc { | 16 namespace cc { |
| 15 | 17 |
| 16 RTree::RTree() : num_data_elements_(0u) {} | 18 RTree::RTree() : num_data_elements_(0u), nodes_(sizeof(Node)) {} |
| 17 | 19 |
| 18 RTree::~RTree() {} | 20 RTree::~RTree() {} |
| 19 | 21 |
| 20 RTree::Node* RTree::AllocateNodeAtLevel(int level) { | 22 RTree::Node* RTree::AllocateNodeAtLevel(int level) { |
| 21 nodes_.push_back(Node()); | 23 Node& node = nodes_.AllocateAndConstruct<Node>(); |
| 22 Node& node = nodes_.back(); | |
| 23 node.num_children = 0; | 24 node.num_children = 0; |
| 24 node.level = level; | 25 node.level = level; |
| 25 return &node; | 26 return &node; |
| 26 } | 27 } |
| 27 | 28 |
| 28 RTree::Branch RTree::BuildRecursive(std::vector<Branch>* branches, int level) { | 29 RTree::Branch RTree::BuildRecursive(std::vector<Branch>* branches, int level) { |
| 29 // Only one branch. It will be the root. | 30 // Only one branch. It will be the root. |
| 30 if (branches->size() == 1) | 31 if (branches->size() == 1) |
| 31 return (*branches)[0]; | 32 return (*branches)[0]; |
| 32 | 33 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 } | 70 } |
| 70 } | 71 } |
| 71 Node* node = AllocateNodeAtLevel(level); | 72 Node* node = AllocateNodeAtLevel(level); |
| 72 node->num_children = 1; | 73 node->num_children = 1; |
| 73 node->children[0] = (*branches)[current_branch]; | 74 node->children[0] = (*branches)[current_branch]; |
| 74 | 75 |
| 75 Branch branch; | 76 Branch branch; |
| 76 branch.bounds = (*branches)[current_branch].bounds; | 77 branch.bounds = (*branches)[current_branch].bounds; |
| 77 branch.subtree = node; | 78 branch.subtree = node; |
| 78 ++current_branch; | 79 ++current_branch; |
| 80 int x = branch.bounds.x(); |
| 81 int y = branch.bounds.y(); |
| 82 int right = branch.bounds.right(); |
| 83 int bottom = branch.bounds.bottom(); |
| 79 for (int k = 1; k < increment_by && current_branch < branches->size(); | 84 for (int k = 1; k < increment_by && current_branch < branches->size(); |
| 80 ++k) { | 85 ++k) { |
| 81 branch.bounds.Union((*branches)[current_branch].bounds); | 86 // We use a custom union instead of gfx::Rect::Union here, since this |
| 87 // bypasses some empty checks and extra setters, which improves |
| 88 // performance. |
| 89 auto& bounds = (*branches)[current_branch].bounds; |
| 90 x = std::min(x, bounds.x()); |
| 91 y = std::min(y, bounds.y()); |
| 92 right = std::max(right, bounds.right()); |
| 93 bottom = std::max(bottom, bounds.bottom()); |
| 94 |
| 82 node->children[k] = (*branches)[current_branch]; | 95 node->children[k] = (*branches)[current_branch]; |
| 83 ++node->num_children; | 96 ++node->num_children; |
| 84 ++current_branch; | 97 ++current_branch; |
| 85 } | 98 } |
| 99 branch.bounds.SetRect(x, y, base::SaturatedSubtraction(right, x), |
| 100 base::SaturatedSubtraction(bottom, y)); |
| 101 |
| 86 DCHECK_LT(new_branch_index, current_branch); | 102 DCHECK_LT(new_branch_index, current_branch); |
| 87 (*branches)[new_branch_index] = branch; | 103 (*branches)[new_branch_index] = branch; |
| 88 ++new_branch_index; | 104 ++new_branch_index; |
| 89 } | 105 } |
| 90 } | 106 } |
| 91 branches->resize(new_branch_index); | 107 branches->resize(new_branch_index); |
| 92 return BuildRecursive(branches, level + 1); | 108 return BuildRecursive(branches, level + 1); |
| 93 } | 109 } |
| 94 | 110 |
| 95 void RTree::Search(const gfx::Rect& query, std::vector<size_t>* results) const { | 111 void RTree::Search(const gfx::Rect& query, std::vector<size_t>* results) const { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 108 SearchRecursive(node->children[i].subtree, query, results); | 124 SearchRecursive(node->children[i].subtree, query, results); |
| 109 } | 125 } |
| 110 } | 126 } |
| 111 } | 127 } |
| 112 | 128 |
| 113 gfx::Rect RTree::GetBounds() const { | 129 gfx::Rect RTree::GetBounds() const { |
| 114 return root_.bounds; | 130 return root_.bounds; |
| 115 } | 131 } |
| 116 | 132 |
| 117 } // namespace cc | 133 } // namespace cc |
| OLD | NEW |