diff options
author | Molly Lloyd <molly@mapbox.com> | 2018-01-12 15:38:09 -0800 |
---|---|---|
committer | Molly Lloyd <molly@mapbox.com> | 2018-01-18 18:10:10 -0800 |
commit | beffa5006f528dc2c329fac4d62eea90a3ec7b0c (patch) | |
tree | 11c5be94cfc89822208b8cae7f920a21eb0ab4c1 | |
parent | 41c5c89ecd6859a0d247477afada5e04e6616060 (diff) | |
download | qtlocation-mapboxgl-beffa5006f528dc2c329fac4d62eea90a3ec7b0c.tar.gz |
define constructor for DEMPyramid
-rw-r--r-- | src/mbgl/geometry/dem_pyramid.cpp | 91 | ||||
-rw-r--r-- | src/mbgl/geometry/dem_pyramid.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/hillshade_bucket.cpp | 9 | ||||
-rw-r--r-- | test/geometry/dem_pyramid.test.cpp | 7 |
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> + + + |