diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-06-21 14:33:08 -0700 |
---|---|---|
committer | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-06-21 14:33:08 -0700 |
commit | f8bc6d1241cd5c630f9c5e49ab2a2b90b01507c4 (patch) | |
tree | af004df90a2e0a6c7fd5991cc8fe4552525ffdf1 | |
parent | 0b6a96fb37917f5811b901abef0f900eb00d1a72 (diff) | |
download | qtlocation-mapboxgl-f8bc6d1241cd5c630f9c5e49ab2a2b90b01507c4.tar.gz |
[core] Use premultiplied image directly for RasterTile and ImageSource, unpremultiply in the shader for blending
-rw-r--r-- | include/mbgl/style/sources/image_source.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/raster_bucket.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/raster_bucket.hpp | 8 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_image_source.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/shaders/raster.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/sources/image_source.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/style/sources/image_source_impl.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/style/sources/image_source_impl.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/tile/raster_tile_worker.cpp | 2 |
9 files changed, 22 insertions, 20 deletions
diff --git a/include/mbgl/style/sources/image_source.hpp b/include/mbgl/style/sources/image_source.hpp index d8a2c45bd8..009764291f 100644 --- a/include/mbgl/style/sources/image_source.hpp +++ b/include/mbgl/style/sources/image_source.hpp @@ -18,7 +18,7 @@ public: optional<std::string> getURL() const; void setURL(const std::string& url); - void setImage(UnassociatedImage&&); + void setImage(PremultipliedImage&&); void setCoordinates(const std::array<LatLng, 4>&); std::array<LatLng, 4> getCoordinates() const; diff --git a/src/mbgl/renderer/buckets/raster_bucket.cpp b/src/mbgl/renderer/buckets/raster_bucket.cpp index e123702fb9..ce1b1103a1 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.cpp +++ b/src/mbgl/renderer/buckets/raster_bucket.cpp @@ -9,11 +9,11 @@ namespace mbgl { using namespace style; -RasterBucket::RasterBucket(UnassociatedImage&& image_) { - image = std::make_shared<UnassociatedImage>(std::move(image_)); +RasterBucket::RasterBucket(PremultipliedImage&& image_) { + image = std::make_shared<PremultipliedImage>(std::move(image_)); } -RasterBucket::RasterBucket(std::shared_ptr<UnassociatedImage> image_): image(image_) { +RasterBucket::RasterBucket(std::shared_ptr<PremultipliedImage> image_): image(image_) { } void RasterBucket::upload(gl::Context& context) { @@ -37,7 +37,7 @@ void RasterBucket::clear() { uploaded = false; } -void RasterBucket::setImage(std::shared_ptr<UnassociatedImage> image_) { +void RasterBucket::setImage(std::shared_ptr<PremultipliedImage> image_) { image = image_; texture = {}; uploaded = false; diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index 5c7ed6d257..d50f7476b8 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -13,8 +13,8 @@ namespace mbgl { class RasterBucket : public Bucket { public: - RasterBucket(UnassociatedImage&&); - RasterBucket(std::shared_ptr<UnassociatedImage>); + RasterBucket(PremultipliedImage&&); + RasterBucket(std::shared_ptr<PremultipliedImage>); void upload(gl::Context&) override; void render(Painter&, PaintParameters&, const RenderLayer&, const RenderTile&) override; void render(Painter& painter, @@ -24,8 +24,8 @@ public: bool hasData() const override; void clear(); - void setImage(std::shared_ptr<UnassociatedImage>); - std::shared_ptr<UnassociatedImage> image; + void setImage(std::shared_ptr<PremultipliedImage>); + std::shared_ptr<PremultipliedImage> image; optional<gl::Texture> texture; // Bucket specific vertices are used for Image Sources only diff --git a/src/mbgl/renderer/sources/render_image_source.cpp b/src/mbgl/renderer/sources/render_image_source.cpp index 2b98a6d399..a3733f237f 100644 --- a/src/mbgl/renderer/sources/render_image_source.cpp +++ b/src/mbgl/renderer/sources/render_image_source.cpp @@ -83,7 +83,7 @@ void RenderImageSource::update(Immutable<style::Source::Impl> baseImpl_, std::swap(baseImpl, baseImpl_); auto coords = impl().getCoordinates(); - std::shared_ptr<UnassociatedImage> image = impl().getImage(); + std::shared_ptr<PremultipliedImage> image = impl().getImage(); if (!image || !image->valid()) { enabled = false; diff --git a/src/mbgl/shaders/raster.cpp b/src/mbgl/shaders/raster.cpp index eb7a2db240..e7739b4738 100644 --- a/src/mbgl/shaders/raster.cpp +++ b/src/mbgl/shaders/raster.cpp @@ -48,6 +48,9 @@ void main() { vec4 color = mix(color0, color1, u_fade_t); color.a *= u_opacity; vec3 rgb = color.rgb; + if (color.a > 0.0) { + rgb = color.rgb / color.a; + } // spin rgb = vec3( diff --git a/src/mbgl/style/sources/image_source.cpp b/src/mbgl/style/sources/image_source.cpp index 9313d8da4a..9b60ba1a48 100644 --- a/src/mbgl/style/sources/image_source.cpp +++ b/src/mbgl/style/sources/image_source.cpp @@ -37,7 +37,7 @@ void ImageSource::setURL(const std::string& url_) { } } -void ImageSource::setImage(UnassociatedImage&& image_) { +void ImageSource::setImage(PremultipliedImage&& image_) { url = {}; if (req) { req.reset(); @@ -70,8 +70,7 @@ void ImageSource::loadDescription(FileSource& fileSource) { observer->onSourceError(*this, std::make_exception_ptr(std::runtime_error("unexpectedly empty image url"))); } else { try { - UnassociatedImage image = util::unpremultiply(decodeImage(*res.data)); - baseImpl = makeMutable<Impl>(impl(), std::move(image)); + baseImpl = makeMutable<Impl>(impl(), decodeImage(*res.data)); } catch (...) { observer->onSourceError(*this, std::current_exception()); } diff --git a/src/mbgl/style/sources/image_source_impl.cpp b/src/mbgl/style/sources/image_source_impl.cpp index eb3e2635e5..c1f31dbdc6 100644 --- a/src/mbgl/style/sources/image_source_impl.cpp +++ b/src/mbgl/style/sources/image_source_impl.cpp @@ -15,14 +15,14 @@ ImageSource::Impl::Impl(const Impl& other, std::array<LatLng, 4> coords_) image(other.image) { } -ImageSource::Impl::Impl(const Impl& rhs, UnassociatedImage&& image_) +ImageSource::Impl::Impl(const Impl& rhs, PremultipliedImage&& image_) : Source::Impl(rhs), coords(rhs.coords), - image(std::make_shared<UnassociatedImage>(std::move(image_))) { + image(std::make_shared<PremultipliedImage>(std::move(image_))) { } ImageSource::Impl::~Impl() = default; -std::shared_ptr<UnassociatedImage> ImageSource::Impl::getImage() const { +std::shared_ptr<PremultipliedImage> ImageSource::Impl::getImage() const { return image; } diff --git a/src/mbgl/style/sources/image_source_impl.hpp b/src/mbgl/style/sources/image_source_impl.hpp index e0999c34a5..1e1b005a32 100644 --- a/src/mbgl/style/sources/image_source_impl.hpp +++ b/src/mbgl/style/sources/image_source_impl.hpp @@ -13,17 +13,17 @@ class ImageSource::Impl : public Source::Impl { public: Impl(std::string id, std::array<LatLng, 4> coords); Impl(const Impl& rhs, std::array<LatLng, 4> coords); - Impl(const Impl& rhs, UnassociatedImage&& image); + Impl(const Impl& rhs, PremultipliedImage&& image); ~Impl() final; - std::shared_ptr<UnassociatedImage> getImage() const; + std::shared_ptr<PremultipliedImage> getImage() const; std::array<LatLng, 4> getCoordinates() const; optional<std::string> getAttribution() const final; private: std::array<LatLng, 4> coords; - std::shared_ptr<UnassociatedImage> image; + std::shared_ptr<PremultipliedImage> image; }; } // namespace style diff --git a/src/mbgl/tile/raster_tile_worker.cpp b/src/mbgl/tile/raster_tile_worker.cpp index 86fb5f181d..3c8af97b40 100644 --- a/src/mbgl/tile/raster_tile_worker.cpp +++ b/src/mbgl/tile/raster_tile_worker.cpp @@ -17,7 +17,7 @@ void RasterTileWorker::parse(std::shared_ptr<const std::string> data) { } try { - auto bucket = std::make_unique<RasterBucket>(util::unpremultiply(decodeImage(*data))); + auto bucket = std::make_unique<RasterBucket>(decodeImage(*data)); parent.invoke(&RasterTile::onParsed, std::move(bucket)); } catch (...) { parent.invoke(&RasterTile::onError, std::current_exception()); |