Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit ca7203e

Browse files
authored
remove Level class (#10964)
1 parent 81d425c commit ca7203e

File tree

6 files changed

+92
-113
lines changed

6 files changed

+92
-113
lines changed

src/mbgl/geometry/dem_data.cpp

+35-41
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33

44
namespace mbgl {
55

6-
DEMData::DEMData(const PremultipliedImage& image):
7-
level(image.size.height, std::max<int32_t>(std::ceil(image.size.height / 2), 1)){
8-
if (image.size.height != image.size.width){
6+
DEMData::DEMData(const PremultipliedImage& _image):
7+
dim(_image.size.height),
8+
border(std::max<int32_t>(std::ceil(_image.size.height / 2), 1)),
9+
stride(dim + 2 * border),
10+
image({ static_cast<uint32_t>(stride), static_cast<uint32_t>(stride) }) {
11+
12+
if (_image.size.height != _image.size.width){
913
throw std::runtime_error("raster-dem tiles must be square.");
1014
}
1115

12-
for (int32_t y = 0; y < level.dim; y++) {
13-
for (int32_t x = 0; x < level.dim; x++) {
14-
const int32_t i = y * level.dim + x;
16+
std::memset(image.data.get(), 0, image.bytes());
17+
18+
for (int32_t y = 0; y < dim; y++) {
19+
for (int32_t x = 0; x < dim; x++) {
20+
const int32_t i = y * dim + x;
1521
const int32_t j = i * 4;
16-
level.set(x, y, (image.data[j] * 256 * 256 + image.data[j+1] * 256 + image.data[j+2])/10 - 10000);
22+
set(x, y, (_image.data[j] * 256 * 256 + _image.data[j+1] * 256 + _image.data[j+2])/10 - 10000);
1723
}
1824
}
1925

@@ -22,26 +28,25 @@ DEMData::DEMData(const PremultipliedImage& image):
2228
// replaced when the tile's neighboring tiles are loaded and the accurate data can be backfilled using
2329
// DEMData#backfillBorder
2430

25-
for (int32_t x = 0; x < level.dim; x++) {
31+
for (int32_t x = 0; x < dim; x++) {
2632
// left vertical border
27-
level.set(-1, x, level.get(0, x));
33+
set(-1, x, get(0, x));
2834

2935
// right vertical border
30-
level.set(level.dim, x, level.get(level.dim - 1, x));
36+
set(dim, x, get(dim - 1, x));
3137

3238
//left horizontal border
33-
level.set(x, -1, level.get(x, 0));
39+
set(x, -1, get(x, 0));
3440

3541
// right horizontal border
36-
level.set(x, level.dim, level.get(x, level.dim - 1));
42+
set(x, dim, get(x, dim - 1));
3743
}
3844

3945
// corners
40-
level.set(-1, -1, level.get(0, 0));
41-
level.set(level.dim, -1, level.get(level.dim - 1, 0));
42-
level.set( -1, level.dim, level.get(0, level.dim - 1));
43-
level.set(level.dim, level.dim, level.get(level.dim - 1, level.dim - 1));
44-
loaded = true;
46+
set(-1, -1, get(0, 0));
47+
set(dim, -1, get(dim - 1, 0));
48+
set( -1, dim, get(0, dim - 1));
49+
set(dim, dim, get(dim - 1, dim - 1));
4550
}
4651

4752
// This function takes the DEMData from a neighboring tile and backfills the edge/corner
@@ -50,51 +55,40 @@ DEMData::DEMData(const PremultipliedImage& image):
5055
// pixel of the tile by querying the 8 surrounding pixels, and if we don't have the pixel
5156
// buffer we get seams at tile boundaries.
5257
void DEMData::backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy) {
53-
auto& t = level;
54-
auto& o = borderTileData.level;
58+
auto& o = borderTileData;
5559

5660
// Tiles from the same source should always be of the same dimensions.
57-
assert(t.dim == o.dim);
61+
assert(dim == o.dim);
5862

5963
// We determine the pixel range to backfill based which corner/edge `borderTileData`
6064
// represents. For example, dx = -1, dy = -1 represents the upper left corner of the
6165
// base tile, so we only need to backfill one pixel at coordinates (-1, -1) of the tile
6266
// image.
63-
int32_t _xMin = dx * t.dim;
64-
int32_t _xMax = dx * t.dim + t.dim;
65-
int32_t _yMin = dy * t.dim;
66-
int32_t _yMax = dy * t.dim + t.dim;
67+
int32_t _xMin = dx * dim;
68+
int32_t _xMax = dx * dim + dim;
69+
int32_t _yMin = dy * dim;
70+
int32_t _yMax = dy * dim + dim;
6771

6872
if (dx == -1) _xMin = _xMax - 1;
6973
else if (dx == 1) _xMax = _xMin + 1;
7074

7175
if (dy == -1) _yMin = _yMax - 1;
7276
else if (dy == 1) _yMax = _yMin + 1;
7377

74-
int32_t xMin = util::clamp(_xMin, -t.border, t.dim + t.border);
75-
int32_t xMax = util::clamp(_xMax, -t.border, t.dim + t.border);
78+
int32_t xMin = util::clamp(_xMin, -border, dim + border);
79+
int32_t xMax = util::clamp(_xMax, -border, dim + border);
7680

77-
int32_t yMin = util::clamp(_yMin, -t.border, t.dim + t.border);
78-
int32_t yMax = util::clamp(_yMax, -t.border, t.dim + t.border);
81+
int32_t yMin = util::clamp(_yMin, -border, dim + border);
82+
int32_t yMax = util::clamp(_yMax, -border, dim + border);
7983

80-
int32_t ox = -dx * t.dim;
81-
int32_t oy = -dy * t.dim;
84+
int32_t ox = -dx * dim;
85+
int32_t oy = -dy * dim;
8286

8387
for (int32_t y = yMin; y < yMax; y++) {
8488
for (int32_t x = xMin; x < xMax; x++) {
85-
t.set(x, y, o.get(x + ox, y + oy));
89+
set(x, y, o.get(x + ox, y + oy));
8690
}
8791
}
8892
}
8993

90-
DEMData::Level::Level(int32_t dim_, int32_t border_)
91-
: dim(dim_),
92-
border(border_),
93-
stride(dim + 2 * border),
94-
image({ static_cast<uint32_t>(stride),
95-
static_cast<uint32_t>(stride) }) {
96-
assert(dim > 0);
97-
std::memset(image.data.get(), 0, image.bytes());
98-
}
99-
10094
} // namespace mbgl

src/mbgl/geometry/dem_data.hpp

+17-28
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,29 @@ namespace mbgl {
1212

1313
class DEMData {
1414
public:
15-
class Level {
16-
public:
17-
Level(int32_t dim, int32_t border);
15+
DEMData(const PremultipliedImage& image);
16+
void backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy);
1817

19-
void set(const int32_t x, const int32_t y, const int32_t value) {
20-
reinterpret_cast<int32_t*>(image.data.get())[idx(x, y)] = value + 65536;
21-
}
18+
void set(const int32_t x, const int32_t y, const int32_t value) {
19+
reinterpret_cast<int32_t*>(image.data.get())[idx(x, y)] = value + 65536;
20+
}
2221

23-
int32_t get(const int32_t x, const int32_t y) const {
24-
return reinterpret_cast<const int32_t*>(image.data.get())[idx(x, y)] - 65536;
25-
}
22+
int32_t get(const int32_t x, const int32_t y) const {
23+
return reinterpret_cast<const int32_t*>(image.data.get())[idx(x, y)] - 65536;
24+
}
2625

27-
const PremultipliedImage* getImage() {
28-
return &image;
29-
}
26+
const PremultipliedImage* getImage() const {
27+
return &image;
28+
}
29+
30+
const int32_t dim;
31+
const int32_t border;
32+
const int32_t stride;
3033

3134

3235
private:
36+
PremultipliedImage image;
37+
3338
size_t idx(const int32_t x, const int32_t y) const {
3439
assert(x >= -border);
3540
assert(x < dim + border);
@@ -38,22 +43,6 @@ class DEMData {
3843
return (y + border) * stride + (x + border);
3944
}
4045

41-
public:
42-
const int32_t dim;
43-
const int32_t border;
44-
const int32_t stride;
45-
PremultipliedImage image;
46-
};
47-
48-
DEMData(const PremultipliedImage& image);
49-
void backfillBorder(const DEMData& borderTileData, int8_t dx, int8_t dy);
50-
bool isLoaded() const {
51-
return loaded;
52-
}
53-
Level level;
54-
private:
55-
bool loaded = false;
56-
5746
};
5847

5948
} // namespace mbgl

src/mbgl/renderer/buckets/hillshade_bucket.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void HillshadeBucket::upload(gl::Context& context) {
2828
}
2929

3030

31-
const PremultipliedImage* image = demdata.level.getImage();
31+
const PremultipliedImage* image = demdata.getImage();
3232
dem = context.createTexture(*image);
3333

3434
if (!segments.empty()) {
@@ -107,7 +107,7 @@ void HillshadeBucket::setMask(TileMask&& mask_) {
107107
}
108108

109109
bool HillshadeBucket::hasData() const {
110-
return demdata.level.image.valid();
110+
return demdata.getImage()->valid();
111111
}
112112

113113
} // namespace mbgl

src/mbgl/renderer/layers/render_hillshade_layer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource*) {
102102
}
103103

104104
if (!bucket.isPrepared() && parameters.pass == RenderPass::Pass3D) {
105-
const uint16_t tilesize = bucket.getDEMData().level.dim;
105+
const uint16_t tilesize = bucket.getDEMData().dim;
106106
OffscreenTexture view(parameters.context, { tilesize, tilesize });
107107
view.bind();
108108

src/mbgl/tile/raster_dem_tile.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,13 @@ void RasterDEMTile::backfillBorder(const RasterDEMTile& borderTile, const DEMTil
101101
const DEMData& borderDEM = borderBucket->getDEMData();
102102
DEMData& tileDEM = bucket->getDEMData();
103103

104-
if (tileDEM.isLoaded() && borderDEM.isLoaded()){
105-
tileDEM.backfillBorder(borderDEM, dx, dy);
106-
// update the bitmask to indicate that this tiles have been backfilled by flipping the relevant bit
107-
this->neighboringTiles = this->neighboringTiles | mask;
108-
// mark HillshadeBucket.prepared as false so it runs through the prepare render pass
109-
// with the new texture data we just backfilled
110-
bucket->setPrepared(false);
111-
}
104+
tileDEM.backfillBorder(borderDEM, dx, dy);
105+
// update the bitmask to indicate that this tiles have been backfilled by flipping the relevant bit
106+
this->neighboringTiles = this->neighboringTiles | mask;
107+
// mark HillshadeBucket.prepared as false so it runs through the prepare render pass
108+
// with the new texture data we just backfilled
109+
bucket->setPrepared(false);
110+
112111
}
113112

114113
void RasterDEMTile::setMask(TileMask&& mask) {

test/geometry/dem_data.test.cpp

+30-33
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,26 @@ auto fakeImage = [](Size s) {
1414
return img;
1515
};
1616

17-
TEST(Level, Constructor) {
18-
DEMData::Level level(4, 2);
19-
EXPECT_EQ(level.dim, 4);
20-
EXPECT_EQ(level.border, 2);
21-
EXPECT_EQ(level.stride, 8);
22-
EXPECT_EQ(level.image.bytes(), size_t(8*8*4));
23-
}
24-
25-
TEST(Level, RoundTrip) {
26-
DEMData::Level level(4, 2);
27-
level.set(0, 0, 255);
28-
EXPECT_EQ(level.get(0,0), 255);
29-
}
30-
3117
TEST(DEMData, Constructor) {
3218
PremultipliedImage image = fakeImage({16, 16});
3319
DEMData pyramid(image);
3420

35-
EXPECT_TRUE(pyramid.isLoaded());
36-
EXPECT_EQ(pyramid.level.dim, 16);
37-
EXPECT_EQ(pyramid.level.border, 8);
21+
EXPECT_EQ(pyramid.dim, 16);
22+
EXPECT_EQ(pyramid.border, 8);
23+
EXPECT_EQ(pyramid.stride, 32);
24+
EXPECT_EQ(pyramid.getImage()->bytes(), size_t(32*32*4));
25+
EXPECT_EQ(pyramid.dim, 16);
26+
EXPECT_EQ(pyramid.border, 8);
3827
};
3928

29+
TEST(DEMData, RoundTrip) {
30+
PremultipliedImage image = fakeImage({16, 16});
31+
DEMData pyramid(image);
32+
33+
pyramid.set(4, 6, 255);
34+
EXPECT_EQ(pyramid.get(4, 6), 255);
35+
}
36+
4037
TEST(DEMData, InitialBackfill) {
4138

4239
PremultipliedImage image1 = fakeImage({4, 4});
@@ -47,7 +44,7 @@ TEST(DEMData, InitialBackfill) {
4744
// with a non-empty pixel value
4845
for (int x = -1; x < 5; x++){
4946
for (int y = -1; y < 5; y ++) {
50-
if (dem1.level.get(x, y) == -65536) {
47+
if (dem1.get(x, y) == -65536) {
5148
nonempty = false;
5249
break;
5350
}
@@ -59,7 +56,7 @@ TEST(DEMData, InitialBackfill) {
5956
int vertx[] = {-1, 4};
6057
for (int x : vertx) {
6158
for (int y = 0; y < 4; y++) {
62-
if (dem1.level.get(x, y) != dem1.level.get(x < 0 ? x + 1 : x - 1, y)) {
59+
if (dem1.get(x, y) != dem1.get(x < 0 ? x + 1 : x - 1, y)) {
6360
verticalBorderMatch = false;
6461
break;
6562
}
@@ -73,7 +70,7 @@ TEST(DEMData, InitialBackfill) {
7370
int horiz[] = {-1, 4};
7471
for (int y : horiz) {
7572
for (int x = 0; x < 4; x++) {
76-
if (dem1.level.get(x, y) != dem1.level.get(x, y < 0 ? y + 1 : y - 1)) {
73+
if (dem1.get(x, y) != dem1.get(x, y < 0 ? y + 1 : y - 1)) {
7774
horizontalBorderMatch = false;
7875
break;
7976
}
@@ -83,13 +80,13 @@ TEST(DEMData, InitialBackfill) {
8380

8481
EXPECT_TRUE(horizontalBorderMatch);
8582
// -1, 1 corner initially equal to closest corner data
86-
EXPECT_TRUE(dem1.level.get(-1, 4) == dem1.level.get(0, 3));
83+
EXPECT_TRUE(dem1.get(-1, 4) == dem1.get(0, 3));
8784
// 1, 1 corner initially equal to closest corner data
88-
EXPECT_TRUE(dem1.level.get(4, 4) == dem1.level.get(3, 3));
85+
EXPECT_TRUE(dem1.get(4, 4) == dem1.get(3, 3));
8986
// -1, -1 corner initially equal to closest corner data
90-
EXPECT_TRUE(dem1.level.get(-1, -1) == dem1.level.get(0, 0));
87+
EXPECT_TRUE(dem1.get(-1, -1) == dem1.get(0, 0));
9188
// -1, 1 corner initially equal to closest corner data
92-
EXPECT_TRUE(dem1.level.get(4, -1) == dem1.level.get(3, 0));
89+
EXPECT_TRUE(dem1.get(4, -1) == dem1.get(3, 0));
9390
};
9491

9592
TEST(DEMData, BackfillNeighbor) {
@@ -103,41 +100,41 @@ TEST(DEMData, BackfillNeighbor) {
103100
for (int y = 0; y < 4; y++) {
104101
// dx = -1, dy = 0, so the left edge of dem1 should equal the right edge of dem0
105102
// backfills Left neighbor
106-
EXPECT_TRUE(dem0.level.get(-1, y) == dem1.level.get(3, y));
103+
EXPECT_TRUE(dem0.get(-1, y) == dem1.get(3, y));
107104

108105
}
109106

110107
dem0.backfillBorder(dem1, 0, -1);
111108
// backfills TopCenter neighbor
112109
for (int x = 0; x < 4; x++) {
113-
EXPECT_TRUE(dem0.level.get(x, -1) == dem1.level.get(x, 3));
110+
EXPECT_TRUE(dem0.get(x, -1) == dem1.get(x, 3));
114111
}
115112

116113
dem0.backfillBorder(dem1, 1, 0);
117-
// backfills Right neighb// backfulls TopRight neighboror
114+
// backfills Right neighbor
118115
for (int y = 0; y < 4; y++) {
119-
EXPECT_TRUE(dem0.level.get(4, y) == dem1.level.get(0, y));
116+
EXPECT_TRUE(dem0.get(4, y) == dem1.get(0, y));
120117
}
121118

122119
dem0.backfillBorder(dem1, 0, 1);
123120
// backfills BottomCenter neighbor
124121
for (int x = 0; x < 4; x++) {
125-
EXPECT_TRUE(dem0.level.get(x, 4) == dem1.level.get(x, 0));
122+
EXPECT_TRUE(dem0.get(x, 4) == dem1.get(x, 0));
126123
}
127124

128125
dem0.backfillBorder(dem1, -1, 1);
129126
// backfulls TopRight neighbor
130-
EXPECT_TRUE(dem0.level.get(-1, 4) == dem1.level.get(3, 0));
127+
EXPECT_TRUE(dem0.get(-1, 4) == dem1.get(3, 0));
131128

132129
dem0.backfillBorder(dem1, 1, 1);
133130
// backfulls BottomRight neighbor
134-
EXPECT_TRUE(dem0.level.get(4, 4) == dem1.level.get(0, 0));
131+
EXPECT_TRUE(dem0.get(4, 4) == dem1.get(0, 0));
135132

136133
dem0.backfillBorder(dem1, -1, -1);
137134
// backfulls TopLeft neighbor
138-
EXPECT_TRUE(dem0.level.get(-1, -1) == dem1.level.get(3, 3));
135+
EXPECT_TRUE(dem0.get(-1, -1) == dem1.get(3, 3));
139136

140137
dem0.backfillBorder(dem1, 1, -1);
141138
// backfulls BottomLeft neighbor
142-
EXPECT_TRUE(dem0.level.get(4, -1) == dem1.level.get(0, 3));
139+
EXPECT_TRUE(dem0.get(4, -1) == dem1.get(0, 3));
143140
};

0 commit comments

Comments
 (0)