summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsheem Mamoowala <asheem.mamoowala@mapbox.com>2017-06-21 14:33:08 -0700
committerAsheem Mamoowala <asheem.mamoowala@mapbox.com>2017-06-21 14:33:08 -0700
commitf8bc6d1241cd5c630f9c5e49ab2a2b90b01507c4 (patch)
treeaf004df90a2e0a6c7fd5991cc8fe4552525ffdf1
parent0b6a96fb37917f5811b901abef0f900eb00d1a72 (diff)
downloadqtlocation-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.hpp2
-rw-r--r--src/mbgl/renderer/buckets/raster_bucket.cpp8
-rw-r--r--src/mbgl/renderer/buckets/raster_bucket.hpp8
-rw-r--r--src/mbgl/renderer/sources/render_image_source.cpp2
-rw-r--r--src/mbgl/shaders/raster.cpp3
-rw-r--r--src/mbgl/style/sources/image_source.cpp5
-rw-r--r--src/mbgl/style/sources/image_source_impl.cpp6
-rw-r--r--src/mbgl/style/sources/image_source_impl.hpp6
-rw-r--r--src/mbgl/tile/raster_tile_worker.cpp2
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());