1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#include <mbgl/test/util.hpp>
#include <mbgl/style/layers/circle_layer.hpp>
#include <mbgl/renderer/layers/render_circle_layer.hpp>
#include <mbgl/renderer/render_tile.hpp>
#include <mbgl/renderer/bucket.hpp>
#include <mbgl/tile/tile.hpp>
using namespace mbgl;
using namespace mbgl::style;
class MockBucket final : public Bucket {
public:
using Bucket::Bucket;
void upload(gl::Context&) {}
bool hasData() const { return false; }
bool supportsLayer(const style::Layer::Impl&) const { return true; }
};
class MockTile final : public Tile {
public:
MockTile(OverscaledTileID id) : Tile(Tile::Kind::Geometry, id) {
renderable = true;
bucket = std::make_shared<MockBucket>();
}
void upload(gl::Context&){}
Bucket* getBucket(const style::Layer::Impl&) const {return bucket.get();}
std::shared_ptr<MockBucket> bucket;
};
struct MockRenderTileData {
std::vector<std::reference_wrapper<RenderTile>> getRenderTiles() {
return {renderTiles.begin(), renderTiles.end()};
}
std::list<RenderTile> renderTiles;
std::vector<std::unique_ptr<MockTile>> tiles;
};
template<typename ...Ts>
MockRenderTileData generateRenderTileData(Ts&&... tileIds) {
MockRenderTileData data;
for (auto&& tileId : { tileIds... }) {
auto tile = std::make_unique<MockTile>(tileId.overscaleTo(tileId.canonical.z));
data.renderTiles.push_back(RenderTile(tileId, *tile));
data.tiles.emplace_back(std::move(tile));
}
return data;
}
TEST(RenderCircleLayer, FilterRenderTiles) {
auto layer = std::make_unique<CircleLayer>("circle", "source");
auto renderLayer = std::make_unique<RenderCircleLayer>(layer->mutableImpl());
// One parent overlaps 4 children.
auto one = generateRenderTileData(UnwrappedTileID{0, 0, 0},
UnwrappedTileID{1, 0, 0},
UnwrappedTileID{1, 0, 1},
UnwrappedTileID{1, 1, 0},
UnwrappedTileID{1, 1, 1});
ASSERT_EQ(renderLayer->filterRenderTiles(one.getRenderTiles()).size(), 1);
// Two parent tiles overlap 5 child tiles.
auto two = generateRenderTileData(UnwrappedTileID{0, 0, 0},
UnwrappedTileID{1, 0, 0},
UnwrappedTileID{1, 0, 1},
UnwrappedTileID{1, 1, 0},
UnwrappedTileID{1, 1, 1},
UnwrappedTileID{0, 0, 0},
UnwrappedTileID{1, 1, 1});
ASSERT_EQ(renderLayer->filterRenderTiles(two.getRenderTiles()).size(), 2);
// Three parent tiles overlapping 3 child tiles.
auto three = generateRenderTileData(UnwrappedTileID{13,4662,2369},
UnwrappedTileID{13,4662,2370},
UnwrappedTileID{13,4662,2371},
UnwrappedTileID{13,4663,2371},
UnwrappedTileID{14,9325,4740},
UnwrappedTileID{14,9326,4739},
UnwrappedTileID{14,9326,4740},
UnwrappedTileID{14,9326,4741},
UnwrappedTileID{14,9326,4742},
UnwrappedTileID{14,9327,4739},
UnwrappedTileID{14,9327,4740},
UnwrappedTileID{14,9327,4741},
UnwrappedTileID{14,9327,4742},
UnwrappedTileID{14,9328,4739},
UnwrappedTileID{14,9328,4740});
ASSERT_EQ(renderLayer->filterRenderTiles(three.getRenderTiles()).size(), 12);
// One parent that overlaps 4 children tiles.
auto four = generateRenderTileData(UnwrappedTileID{10,583,296},
UnwrappedTileID{14,9324,4739},
UnwrappedTileID{14,9324,4740},
UnwrappedTileID{14,9325,4739},
UnwrappedTileID{14,9325,4740},
UnwrappedTileID{14,9325,4741},
UnwrappedTileID{14,9325,4742},
UnwrappedTileID{14,9325,4743},
UnwrappedTileID{14,9326,4739},
UnwrappedTileID{14,9326,4740},
UnwrappedTileID{14,9326,4741},
UnwrappedTileID{14,9326,4742},
UnwrappedTileID{14,9326,4743},
UnwrappedTileID{14,9327,4739},
UnwrappedTileID{14,9327,4740},
UnwrappedTileID{14,9327,4741},
UnwrappedTileID{14,9327,4742},
UnwrappedTileID{14,9327,4743},
UnwrappedTileID{14,9328,4739},
UnwrappedTileID{14,9328,4740},
UnwrappedTileID{14,9328,4741},
UnwrappedTileID{14,9328,4742});
ASSERT_EQ(renderLayer->filterRenderTiles(four.getRenderTiles()).size(), 18);
}
|