summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/style/image.hpp9
-rw-r--r--src/mbgl/annotation/annotation_manager.cpp7
-rw-r--r--src/mbgl/sprite/sprite_atlas.cpp21
-rw-r--r--src/mbgl/sprite/sprite_atlas.hpp8
-rw-r--r--src/mbgl/style/image.cpp5
-rw-r--r--src/mbgl/style/style.cpp5
-rw-r--r--test/sprite/sprite_atlas.test.cpp19
-rw-r--r--test/text/quads.test.cpp6
8 files changed, 40 insertions, 40 deletions
diff --git a/include/mbgl/style/image.hpp b/include/mbgl/style/image.hpp
index 4abd86f1be..528b2ecb95 100644
--- a/include/mbgl/style/image.hpp
+++ b/include/mbgl/style/image.hpp
@@ -1,8 +1,7 @@
#pragma once
#include <mbgl/util/image.hpp>
-
-#include <memory>
+#include <mbgl/util/immutable.hpp>
namespace mbgl {
namespace style {
@@ -11,7 +10,7 @@ class Image {
public:
Image(PremultipliedImage&&, float pixelRatio, bool sdf = false);
- PremultipliedImage& getImage() const;
+ const PremultipliedImage& getImage() const;
// Pixel ratio of the sprite image.
float getPixelRatio() const;
@@ -23,9 +22,7 @@ public:
float getHeight() const;
class Impl;
-
-private:
- const std::shared_ptr<Impl> impl;
+ Immutable<Impl> impl;
};
} // namespace style
diff --git a/src/mbgl/annotation/annotation_manager.cpp b/src/mbgl/annotation/annotation_manager.cpp
index 96cdd96750..8e75f8e63f 100644
--- a/src/mbgl/annotation/annotation_manager.cpp
+++ b/src/mbgl/annotation/annotation_manager.cpp
@@ -6,6 +6,7 @@
#include <mbgl/annotation/fill_annotation_impl.hpp>
#include <mbgl/sprite/sprite_image_collection.hpp>
#include <mbgl/style/style.hpp>
+#include <mbgl/style/image_impl.hpp>
#include <mbgl/style/layers/symbol_layer.hpp>
#include <mbgl/style/layers/symbol_layer_impl.hpp>
#include <mbgl/storage/file_source.hpp>
@@ -192,7 +193,7 @@ void AnnotationManager::removeTile(AnnotationTile& tile) {
void AnnotationManager::addImage(const std::string& id, std::unique_ptr<style::Image> image) {
addSpriteImage(spriteImages, id, std::move(image), [&](style::Image& added) {
- spriteAtlas.addImage(id, std::make_unique<style::Image>(added));
+ spriteAtlas.addImage(id, added.impl);
});
}
@@ -203,8 +204,8 @@ void AnnotationManager::removeImage(const std::string& id) {
}
double AnnotationManager::getTopOffsetPixelsForImage(const std::string& id) {
- const style::Image* image = spriteAtlas.getImage(id);
- return image ? -(image->getImage().size.height / image->getPixelRatio()) / 2 : 0;
+ const style::Image::Impl* impl = spriteAtlas.getImage(id);
+ return impl ? -(impl->image.size.height / impl->pixelRatio) / 2 : 0;
}
} // namespace mbgl
diff --git a/src/mbgl/sprite/sprite_atlas.cpp b/src/mbgl/sprite/sprite_atlas.cpp
index bef74b7ce5..f677f7bb60 100644
--- a/src/mbgl/sprite/sprite_atlas.cpp
+++ b/src/mbgl/sprite/sprite_atlas.cpp
@@ -1,4 +1,5 @@
#include <mbgl/sprite/sprite_atlas.hpp>
+#include <mbgl/style/image_impl.hpp>
#include <mbgl/gl/context.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/util/platform.hpp>
@@ -14,11 +15,11 @@
namespace mbgl {
SpriteAtlasElement::SpriteAtlasElement(Rect<uint16_t> rect_,
- const style::Image& image,
+ const style::Image::Impl& image,
Size size_, float pixelRatio)
: pos(std::move(rect_)),
- sdf(image.isSdf()),
- relativePixelRatio(image.getPixelRatio() / pixelRatio),
+ sdf(image.sdf),
+ relativePixelRatio(image.pixelRatio / pixelRatio),
width(image.getWidth()),
height(image.getHeight()) {
@@ -45,7 +46,7 @@ void SpriteAtlas::onSpriteLoaded(Images&& result) {
markAsLoaded();
for (auto& pair : result) {
- addImage(pair.first, std::move(pair.second));
+ addImage(pair.first, pair.second->impl);
}
for (auto requestor : requestors) {
@@ -54,7 +55,7 @@ void SpriteAtlas::onSpriteLoaded(Images&& result) {
requestors.clear();
}
-void SpriteAtlas::addImage(const std::string& id, std::unique_ptr<style::Image> image_) {
+void SpriteAtlas::addImage(const std::string& id, Immutable<style::Image::Impl> image_) {
icons.clear();
auto it = entries.find(id);
@@ -66,7 +67,7 @@ void SpriteAtlas::addImage(const std::string& id, std::unique_ptr<style::Image>
Entry& entry = it->second;
// There is already a sprite with that name in our store.
- assert(entry.image->getImage().size == image_->getImage().size);
+ assert(entry.image->image.size == image_->image.size);
entry.image = std::move(image_);
@@ -98,7 +99,7 @@ void SpriteAtlas::removeImage(const std::string& id) {
entries.erase(it);
}
-const style::Image* SpriteAtlas::getImage(const std::string& id) const {
+const style::Image::Impl* SpriteAtlas::getImage(const std::string& id) const {
const auto it = entries.find(id);
if (it != entries.end()) {
return it->second.image.get();
@@ -152,8 +153,8 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& id,
};
}
- const uint16_t pixelWidth = std::ceil(entry.image->getImage().size.width / pixelRatio);
- const uint16_t pixelHeight = std::ceil(entry.image->getImage().size.height / pixelRatio);
+ const uint16_t pixelWidth = std::ceil(entry.image->image.size.width / pixelRatio);
+ const uint16_t pixelHeight = std::ceil(entry.image->image.size.height / pixelRatio);
// Increase to next number divisible by 4, but at least 1.
// This is so we can scale down the texture coordinates and pack them
@@ -188,7 +189,7 @@ void SpriteAtlas::copy(const Entry& entry, optional<Rect<uint16_t>> Entry::*entr
image.fill(0);
}
- const PremultipliedImage& src = entry.image->getImage();
+ const PremultipliedImage& src = entry.image->image;
const Rect<uint16_t>& rect = *(entry.*entryRect);
const uint32_t padding = 1;
diff --git a/src/mbgl/sprite/sprite_atlas.hpp b/src/mbgl/sprite/sprite_atlas.hpp
index 7ae583dcba..4e03c32b30 100644
--- a/src/mbgl/sprite/sprite_atlas.hpp
+++ b/src/mbgl/sprite/sprite_atlas.hpp
@@ -20,7 +20,7 @@ class Context;
class SpriteAtlasElement {
public:
- SpriteAtlasElement(Rect<uint16_t>, const style::Image&, Size size, float pixelRatio);
+ SpriteAtlasElement(Rect<uint16_t>, const style::Image::Impl&, Size size, float pixelRatio);
Rect<uint16_t> pos;
bool sdf;
@@ -60,8 +60,8 @@ public:
void dumpDebugLogs() const;
- const style::Image* getImage(const std::string&) const;
- void addImage(const std::string&, std::unique_ptr<style::Image>);
+ const style::Image::Impl* getImage(const std::string&) const;
+ void addImage(const std::string&, Immutable<style::Image::Impl>);
void removeImage(const std::string&);
void getIcons(IconRequestor& requestor);
@@ -91,7 +91,7 @@ private:
bool loaded = false;
struct Entry {
- std::unique_ptr<const style::Image> image;
+ Immutable<style::Image::Impl> image;
// One sprite image might be used as both an icon image and a pattern image. If so,
// it must have two distinct entries in the texture. The one for the icon image has
diff --git a/src/mbgl/style/image.cpp b/src/mbgl/style/image.cpp
index c5fecec2b2..606d9907a4 100644
--- a/src/mbgl/style/image.cpp
+++ b/src/mbgl/style/image.cpp
@@ -8,11 +8,10 @@ namespace style {
Image::Image(PremultipliedImage &&image,
const float pixelRatio,
bool sdf)
- : impl(std::make_shared<Impl>(std::move(image), pixelRatio, sdf)) {
+ : impl(makeMutable<Impl>(std::move(image), pixelRatio, sdf)) {
}
-PremultipliedImage& Image::getImage() const {
- assert(impl);
+const PremultipliedImage& Image::getImage() const {
return impl->image;
}
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index ae9ed97427..256949af3b 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -544,7 +544,7 @@ bool Style::isLoaded() const {
void Style::addImage(const std::string& id, std::unique_ptr<style::Image> image) {
addSpriteImage(spriteImages, id, std::move(image), [&](style::Image& added) {
- spriteAtlas->addImage(id, std::make_unique<style::Image>(added));
+ spriteAtlas->addImage(id, added.impl);
observer->onUpdate(Update::Repaint);
});
}
@@ -557,7 +557,8 @@ void Style::removeImage(const std::string& id) {
}
const style::Image* Style::getImage(const std::string& id) const {
- return spriteAtlas->getImage(id);
+ auto it = spriteImages.find(id);
+ return it == spriteImages.end() ? nullptr : it->second.get();
}
RenderData Style::getRenderData(MapDebugOptions debugOptions, float angle) const {
diff --git a/test/sprite/sprite_atlas.test.cpp b/test/sprite/sprite_atlas.test.cpp
index 0cbd211de8..70cdfd9fa6 100644
--- a/test/sprite/sprite_atlas.test.cpp
+++ b/test/sprite/sprite_atlas.test.cpp
@@ -5,6 +5,7 @@
#include <mbgl/sprite/sprite_atlas.hpp>
#include <mbgl/sprite/sprite_parser.hpp>
+#include <mbgl/style/image_impl.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/run_loop.hpp>
@@ -22,7 +23,7 @@ TEST(SpriteAtlas, Basic) {
auto images = parseSprite(util::read_file("test/fixtures/annotations/emerald.png"),
util::read_file("test/fixtures/annotations/emerald.json"));
for (auto& pair : images) {
- atlas.addImage(pair.first, std::move(pair.second));
+ atlas.addImage(pair.first, pair.second->impl);
}
EXPECT_EQ(1.0f, atlas.getPixelRatio());
@@ -79,7 +80,7 @@ TEST(SpriteAtlas, Size) {
auto images = parseSprite(util::read_file("test/fixtures/annotations/emerald.png"),
util::read_file("test/fixtures/annotations/emerald.json"));
for (auto& pair : images) {
- atlas.addImage(pair.first, std::move(pair.second));
+ atlas.addImage(pair.first, pair.second->impl);
}
EXPECT_DOUBLE_EQ(1.4f, atlas.getPixelRatio());
@@ -112,7 +113,7 @@ TEST(SpriteAtlas, Updates) {
EXPECT_EQ(32u, atlas.getSize().width);
EXPECT_EQ(32u, atlas.getSize().height);
- atlas.addImage("one", std::make_unique<style::Image>(PremultipliedImage({ 16, 12 }), 1));
+ atlas.addImage("one", makeMutable<style::Image::Impl>(PremultipliedImage({ 16, 12 }), 1));
auto one = *atlas.getIcon("one");
float imagePixelRatio = one.relativePixelRatio * atlas.getPixelRatio();
EXPECT_EQ(0, one.pos.x);
@@ -136,7 +137,7 @@ TEST(SpriteAtlas, Updates) {
for (size_t i = 0; i < image2.bytes(); i++) {
image2.data.get()[i] = 255;
}
- atlas.addImage("one", std::make_unique<style::Image>(std::move(image2), 1));
+ atlas.addImage("one", makeMutable<style::Image::Impl>(std::move(image2), 1));
test::checkImage("test/fixtures/sprite_atlas/updates_after", atlas.getAtlasImage());
}
@@ -145,9 +146,9 @@ TEST(SpriteAtlas, AddRemove) {
FixtureLog log;
SpriteAtlas atlas({ 32, 32 }, 1);
- atlas.addImage("one", std::make_unique<style::Image>(PremultipliedImage({ 16, 16 }), 2));
- atlas.addImage("two", std::make_unique<style::Image>(PremultipliedImage({ 16, 16 }), 2));
- atlas.addImage("three", std::make_unique<style::Image>(PremultipliedImage({ 16, 16 }), 2));
+ atlas.addImage("one", makeMutable<style::Image::Impl>(PremultipliedImage({ 16, 16 }), 2));
+ atlas.addImage("two", makeMutable<style::Image::Impl>(PremultipliedImage({ 16, 16 }), 2));
+ atlas.addImage("three", makeMutable<style::Image::Impl>(PremultipliedImage({ 16, 16 }), 2));
atlas.removeImage("one");
atlas.removeImage("two");
@@ -175,12 +176,12 @@ TEST(SpriteAtlas, RemoveReleasesBinPackRect) {
SpriteAtlas atlas({ 36, 36 }, 1);
- atlas.addImage("big", std::make_unique<style::Image>(PremultipliedImage({ 32, 32 }), 1));
+ atlas.addImage("big", makeMutable<style::Image::Impl>(PremultipliedImage({ 32, 32 }), 1));
EXPECT_TRUE(atlas.getIcon("big"));
atlas.removeImage("big");
- atlas.addImage("big", std::make_unique<style::Image>(PremultipliedImage({ 32, 32 }), 1));
+ atlas.addImage("big", makeMutable<style::Image::Impl>(PremultipliedImage({ 32, 32 }), 1));
EXPECT_TRUE(atlas.getIcon("big"));
EXPECT_TRUE(log.empty());
}
diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp
index 83fd249535..6b2b0e7586 100644
--- a/test/text/quads.test.cpp
+++ b/test/text/quads.test.cpp
@@ -1,5 +1,5 @@
#include <mbgl/geometry/anchor.hpp>
-#include <mbgl/sprite/sprite_atlas.hpp>
+#include <mbgl/style/image_impl.hpp>
#include <mbgl/test/util.hpp>
#include <mbgl/text/quads.hpp>
#include <mbgl/text/shaping.hpp>
@@ -14,7 +14,7 @@ TEST(getIconQuads, normal) {
Anchor anchor(2.0, 3.0, 0.0, 0.5f, 0);
SpriteAtlasElement image = {
Rect<uint16_t>( 0, 0, 15, 11 ),
- style::Image(PremultipliedImage({1,1}), 1.0),
+ style::Image::Impl(PremultipliedImage({1,1}), 1.0),
{ 0, 0 },
1.0f
};
@@ -47,7 +47,7 @@ TEST(getIconQuads, style) {
Anchor anchor(0.0, 0.0, 0.0, 0.5f, 0);
SpriteAtlasElement image = {
Rect<uint16_t>( 0, 0, 20, 20 ),
- style::Image(PremultipliedImage({1,1}), 1.0),
+ style::Image::Impl(PremultipliedImage({1,1}), 1.0),
{ 0, 0 },
1.0f
};