summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mbgl/algorithm/generate_clip_ids.hpp3
-rw-r--r--src/mbgl/algorithm/generate_clip_ids_impl.hpp7
-rw-r--r--src/mbgl/algorithm/update_tile_masks.hpp6
-rw-r--r--test/algorithm/generate_clip_ids.test.cpp21
-rw-r--r--test/algorithm/update_tile_masks.test.cpp5
5 files changed, 28 insertions, 14 deletions
diff --git a/src/mbgl/algorithm/generate_clip_ids.hpp b/src/mbgl/algorithm/generate_clip_ids.hpp
index adcf87a72a..6950433578 100644
--- a/src/mbgl/algorithm/generate_clip_ids.hpp
+++ b/src/mbgl/algorithm/generate_clip_ids.hpp
@@ -25,8 +25,9 @@ private:
std::multimap<UnwrappedTileID, Leaf> pool;
public:
+ // The given vector must be sorted by id.
template <typename Renderable>
- void update(std::vector<std::reference_wrapper<Renderable>> renderables);
+ void update(std::vector<std::reference_wrapper<Renderable>> sortedRenderables);
std::map<UnwrappedTileID, ClipID> getClipIDs() const;
};
diff --git a/src/mbgl/algorithm/generate_clip_ids_impl.hpp b/src/mbgl/algorithm/generate_clip_ids_impl.hpp
index fedab06022..a4af9c8cbb 100644
--- a/src/mbgl/algorithm/generate_clip_ids_impl.hpp
+++ b/src/mbgl/algorithm/generate_clip_ids_impl.hpp
@@ -10,12 +10,11 @@ namespace algorithm {
template <typename Renderable>
void ClipIDGenerator::update(std::vector<std::reference_wrapper<Renderable>> renderables) {
std::size_t size = 0;
-
- std::sort(renderables.begin(), renderables.end(),
- [](const auto& a, const auto& b) { return a.get().id < b.get().id; });
+ assert(std::is_sorted(renderables.begin(), renderables.end(),
+ [](const Renderable& a, const Renderable& b) { return a.id < b.id; }));
const auto end = renderables.end();
- for (auto it = renderables.begin(); it != end; it++) {
+ for (auto it = renderables.begin(); it != end; ++it) {
auto& renderable = it->get();
if (!renderable.used || !renderable.needsClipping) {
continue;
diff --git a/src/mbgl/algorithm/update_tile_masks.hpp b/src/mbgl/algorithm/update_tile_masks.hpp
index a7840cd163..c475473cb6 100644
--- a/src/mbgl/algorithm/update_tile_masks.hpp
+++ b/src/mbgl/algorithm/update_tile_masks.hpp
@@ -95,10 +95,12 @@ void computeTileMasks(
// Only other Renderables that are *children* of the Renderable we are generating the mask for will
// be considered. For example, adding a Renderable with TileID 4/8/13 won't affect the TileMask for
// 2/1/3, since it is not a descendant of it.
+//
+// The given |renderables| must be sorted by id.
template <typename Renderable>
void updateTileMasks(std::vector<std::reference_wrapper<Renderable>> renderables) {
- std::sort(renderables.begin(), renderables.end(),
- [](const Renderable& a, const Renderable& b) { return a.id < b.id; });
+ assert(std::is_sorted(renderables.begin(), renderables.end(),
+ [](const Renderable& a, const Renderable& b) { return a.id < b.id; }));
TileMask mask;
const auto end = renderables.end();
diff --git a/test/algorithm/generate_clip_ids.test.cpp b/test/algorithm/generate_clip_ids.test.cpp
index f01c2da80a..d918514e51 100644
--- a/test/algorithm/generate_clip_ids.test.cpp
+++ b/test/algorithm/generate_clip_ids.test.cpp
@@ -24,6 +24,15 @@ struct Renderable {
}
};
+namespace {
+auto makeSorted(std::vector<Renderable>& renderables) {
+ std::vector<std::reference_wrapper<Renderable>> sorted(renderables.begin(), renderables.end());
+ std::sort(sorted.begin(), sorted.end(),
+ [](const Renderable& a, const Renderable& b){ return a.id < b.id; });
+ return sorted;
+}
+} // namespace
+
::std::ostream& operator<<(::std::ostream& os, const Renderable& rhs) {
return os << "Renderable{ " << rhs.id << ", " << rhs.clip << " }";
}
@@ -71,7 +80,7 @@ TEST(GenerateClipIDs, ParentAndFourChildrenNegative) {
};
algorithm::ClipIDGenerator generator;
- generator.update<Renderable>({ renderables.begin(), renderables.end() });
+ generator.update<Renderable>(makeSorted(renderables));
EXPECT_EQ(decltype(renderables)({
Renderable{ UnwrappedTileID{ 1, -2, 0 }, ClipID{ "00000111", "00000010" } },
@@ -102,7 +111,7 @@ TEST(GenerateClipIDs, NegativeParentAndMissingLevel) {
};
algorithm::ClipIDGenerator generator;
- generator.update<Renderable>({ renderables.begin(), renderables.end() });
+ generator.update<Renderable>(makeSorted(renderables));
EXPECT_EQ(decltype(renderables)({
Renderable{ UnwrappedTileID{ 1, -1, 0 }, ClipID{ "00000111", "00000001" } },
@@ -186,7 +195,7 @@ TEST(GenerateClipIDs, MultipleLevels) {
};
algorithm::ClipIDGenerator generator;
- generator.update<Renderable>({ renderables.begin(), renderables.end() });
+ generator.update<Renderable>(makeSorted(renderables));
ASSERT_EQ(decltype(renderables)({
Renderable{ UnwrappedTileID{ 2, 0, 0 }, ClipID{ "00001111", "00000001" } },
Renderable{ UnwrappedTileID{ 3, 0, 0 }, ClipID{ "00001111", "00000011" } },
@@ -237,7 +246,7 @@ TEST(GenerateClipIDs, Bug206) {
};
algorithm::ClipIDGenerator generator;
- generator.update<Renderable>({ renderables.begin(), renderables.end() });
+ generator.update<Renderable>(makeSorted(renderables));
EXPECT_EQ(
decltype(renderables)({
Renderable{ UnwrappedTileID{ 10, 162, 395 }, ClipID{ "00001111", "00000001" } },
@@ -350,8 +359,8 @@ TEST(GenerateClipIDs, SomeUnclippedTiles) {
};
algorithm::ClipIDGenerator generator;
- generator.update<Renderable>({ renderables1.begin(), renderables1.end() });
- generator.update<Renderable>({ renderables2.begin(), renderables2.end() });
+ generator.update<Renderable>(makeSorted(renderables1));
+ generator.update<Renderable>(makeSorted(renderables2));
EXPECT_EQ(decltype(renderables1)({
Renderable { UnwrappedTileID { 7, 36, 49 }, ClipID {"00000011","00000010"} },
Renderable { UnwrappedTileID { 7, 36, 48 }, ClipID {"00000011","00000001"} },
diff --git a/test/algorithm/update_tile_masks.test.cpp b/test/algorithm/update_tile_masks.test.cpp
index 3c698eb0cd..381a6628cf 100644
--- a/test/algorithm/update_tile_masks.test.cpp
+++ b/test/algorithm/update_tile_masks.test.cpp
@@ -45,7 +45,10 @@ void validate(const std::vector<MaskedRenderable> expected) {
std::vector<MaskedRenderable> actual = expected;
std::for_each(actual.begin(), actual.end(),
[](auto& renderable) { renderable.mask.clear(); });
- algorithm::updateTileMasks<MaskedRenderable>({ actual.begin(), actual.end() });
+ std::vector<std::reference_wrapper<MaskedRenderable>> sorted(actual.begin(), actual.end());
+ std::sort(sorted.begin(), sorted.end(),
+ [](const MaskedRenderable& a, const MaskedRenderable& b){ return a.id < b.id; });
+ algorithm::updateTileMasks<MaskedRenderable>(std::move(sorted));
EXPECT_EQ(expected, actual);
}