summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMolly Lloyd <molly@mapbox.com>2018-01-12 15:38:09 -0800
committerMolly Lloyd <molly@mapbox.com>2018-01-18 18:10:10 -0800
commitbeffa5006f528dc2c329fac4d62eea90a3ec7b0c (patch)
tree11c5be94cfc89822208b8cae7f920a21eb0ab4c1
parent41c5c89ecd6859a0d247477afada5e04e6616060 (diff)
downloadqtlocation-mapboxgl-beffa5006f528dc2c329fac4d62eea90a3ec7b0c.tar.gz
define constructor for DEMPyramid
-rw-r--r--src/mbgl/geometry/dem_pyramid.cpp91
-rw-r--r--src/mbgl/geometry/dem_pyramid.hpp6
-rw-r--r--src/mbgl/renderer/buckets/hillshade_bucket.cpp9
-rw-r--r--test/geometry/dem_pyramid.test.cpp7
4 files changed, 56 insertions, 57 deletions
diff --git a/src/mbgl/geometry/dem_pyramid.cpp b/src/mbgl/geometry/dem_pyramid.cpp
index 534ccc9cfd..62cc94f27b 100644
--- a/src/mbgl/geometry/dem_pyramid.cpp
+++ b/src/mbgl/geometry/dem_pyramid.cpp
@@ -3,59 +3,54 @@
namespace mbgl {
-void DEMPyramid::loadFromImage(PremultipliedImage& image){
+DEMPyramid::DEMPyramid(PremultipliedImage& image):
+ level(image.size.height, std::max<int32_t>(std::ceil(image.size.height / 2), 1)){
assert(image.size.height == image.size.width);
-
- const int32_t border = std::max<int32_t>(std::ceil(image.size.height / 2), 1);
-
- level = std::make_unique<Level>(image.size.height, border);
-
- for (int32_t y = 0; y < level->dim; y++) {
- for (int32_t x = 0; x < level->dim; x++) {
- const int32_t i = y * level->dim + x;
+
+ for (int32_t y = 0; y < level.dim; y++) {
+ for (int32_t x = 0; x < level.dim; x++) {
+ const int32_t i = y * level.dim + x;
const int32_t j = i * 4;
- level->set(x, y, (image.data[j] * 256 * 256 + image.data[j+1] * 256 + image.data[j+2])/10 - 10000);
+ level.set(x, y, (image.data[j] * 256 * 256 + image.data[j+1] * 256 + image.data[j+2])/10 - 10000);
}
}
- // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of
- // pixels around the image with the data of the nearest pixel from the image. this data is eventually
- // replaced when the tile's neighboring tiles are loaded and the accurate data can be backfilled using
- // DEMPyramid#backfillBorder
-
-// for (int32_t x = 0; x < first.dim; x++) {
-// // left vertical border
-// first.set(-1, x, first.get(0, x));
-//
-// // right vertical border
-// first.set(first.dim, x, first.get(first.dim - 1, x));
-//
-// //left horizontal border
-// first.set(x, -1, first.get(x, 0));
-//
-// // right horizontal border
-// first.set(x, first.dim, first.get(x, first.dim - 1));
-// }
-//
-// // corners
-// first.set(-1, -1, first.get(0, 0));
-// first.set(first.dim, -1, first.get(first.dim - 1, 0));
-// first.set( -1, first.dim, first.get(0, first.dim - 1));
-// first.set(first.dim, first.dim, first.get(first.dim - 1, first.dim - 1));
-
-
+ // // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of
+ // // pixels around the image with the data of the nearest pixel from the image. this data is eventually
+ // // replaced when the tile's neighboring tiles are loaded and the accurate data can be backfilled using
+ // // DEMPyramid#backfillBorder
+ //
+ //// for (int32_t x = 0; x < first.dim; x++) {
+ //// // left vertical border
+ //// first.set(-1, x, first.get(0, x));
+ ////
+ //// // right vertical border
+ //// first.set(first.dim, x, first.get(first.dim - 1, x));
+ ////
+ //// //left horizontal border
+ //// first.set(x, -1, first.get(x, 0));
+ ////
+ //// // right horizontal border
+ //// first.set(x, first.dim, first.get(x, first.dim - 1));
+ //// }
+ ////
+ //// // corners
+ //// first.set(-1, -1, first.get(0, 0));
+ //// first.set(first.dim, -1, first.get(first.dim - 1, 0));
+ //// first.set( -1, first.dim, first.get(0, first.dim - 1));
+ //// first.set(first.dim, first.dim, first.get(first.dim - 1, first.dim - 1));
loaded = true;
}
void DEMPyramid::backfillBorder(mbgl::DEMPyramid &borderTileData, int8_t dx, int8_t dy) {
auto& t = level;
auto& o = borderTileData.level;
- assert(t->dim == o->dim);
+ assert(t.dim == o.dim);
- int32_t _xMin = dx * t->dim;
- int32_t _xMax = dx * t->dim + t->dim;
- int32_t _yMin = dy * t->dim;
- int32_t _yMax = dy * t->dim + t->dim;
+ int32_t _xMin = dx * t.dim;
+ int32_t _xMax = dx * t.dim + t.dim;
+ int32_t _yMin = dy * t.dim;
+ int32_t _yMax = dy * t.dim + t.dim;
if (dx == -1) _xMin = _xMax - 1;
else if (dx == 1) _xMax = _xMin + 1;
@@ -63,18 +58,18 @@ void DEMPyramid::backfillBorder(mbgl::DEMPyramid &borderTileData, int8_t dx, int
if (dy == -1) _yMin = _yMax - 1;
else if (dy == 1) _yMax = _yMin + 1;
- int32_t xMin = util::clamp(_xMin, -t->border, t->dim + t->border);
- int32_t xMax = util::clamp(_xMax, -t->border, t->dim + t->border);
+ int32_t xMin = util::clamp(_xMin, -t.border, t.dim + t.border);
+ int32_t xMax = util::clamp(_xMax, -t.border, t.dim + t.border);
- int32_t yMin = util::clamp(_yMin, -t->border, t->dim + t->border);
- int32_t yMax = util::clamp(_yMax, -t->border, t->dim + t->border);
+ int32_t yMin = util::clamp(_yMin, -t.border, t.dim + t.border);
+ int32_t yMax = util::clamp(_yMax, -t.border, t.dim + t.border);
- int32_t ox = -dx * t->dim;
- int32_t oy = -dy * t->dim;
+ int32_t ox = -dx * t.dim;
+ int32_t oy = -dy * t.dim;
for (int32_t y = yMin; y < yMax; y++) {
for (int32_t x = xMin; x < xMax; x++) {
- t->set(x, y, o->get(x + ox, y + oy));
+ t.set(x, y, o.get(x + ox, y + oy));
}
}
}
diff --git a/src/mbgl/geometry/dem_pyramid.hpp b/src/mbgl/geometry/dem_pyramid.hpp
index 5d3a5cdfde..a16180edc3 100644
--- a/src/mbgl/geometry/dem_pyramid.hpp
+++ b/src/mbgl/geometry/dem_pyramid.hpp
@@ -15,7 +15,6 @@ public:
class Level {
public:
Level(int32_t dim, int32_t border);
- Level(const Level&& level);
void set(const int32_t x, const int32_t y, const int32_t value) {
reinterpret_cast<int32_t*>(image.data.get())[idx(x, y)] = value + 65536;
@@ -42,13 +41,12 @@ public:
PremultipliedImage image;
};
-
- void loadFromImage(PremultipliedImage& image);
+ DEMPyramid(PremultipliedImage& image);
void backfillBorder(DEMPyramid& borderTileData, int8_t dx, int8_t dy);
bool isLoaded() {
return loaded;
};
- std::unique_ptr<Level> level;
+ Level level;
private:
bool loaded = false;
diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.cpp b/src/mbgl/renderer/buckets/hillshade_bucket.cpp
index 3c9158a1ec..59681a66d6 100644
--- a/src/mbgl/renderer/buckets/hillshade_bucket.cpp
+++ b/src/mbgl/renderer/buckets/hillshade_bucket.cpp
@@ -8,8 +8,7 @@ namespace mbgl {
using namespace style;
-HillshadeBucket::HillshadeBucket(PremultipliedImage&& image_) {
- pyramid.loadFromImage(image_);
+HillshadeBucket::HillshadeBucket(PremultipliedImage&& image_): pyramid(image_) {
}
HillshadeBucket::HillshadeBucket(DEMPyramid&& pyramid_) : pyramid(std::move(pyramid_)) {
@@ -24,8 +23,8 @@ void HillshadeBucket::upload(gl::Context& context) {
return;
}
- dem = context.createTexture(pyramid.level->image);
- auto& image = pyramid.level->image;
+ dem = context.createTexture(pyramid.level.image);
+ auto& image = pyramid.level.image;
context.updateTexture(*dem, image);
if (!segments.empty()) {
@@ -104,7 +103,7 @@ void HillshadeBucket::setMask(TileMask&& mask_) {
}
bool HillshadeBucket::hasData() const {
- return pyramid.level->image.valid();
+ return pyramid.level.image.valid();
}
} // namespace mbgl
diff --git a/test/geometry/dem_pyramid.test.cpp b/test/geometry/dem_pyramid.test.cpp
new file mode 100644
index 0000000000..c3ff8fd66e
--- /dev/null
+++ b/test/geometry/dem_pyramid.test.cpp
@@ -0,0 +1,7 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/util/image.hpp>
+#include <mbgl/geometry/dem_pyramid.hpp>
+
+
+