summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-02-13 13:52:16 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-02-14 16:28:12 -0600
commit3fa6a4f4ff148303a14a751009f5596aa3f7effc (patch)
tree903c9f1f2732c3e34a9fe03afad03af9600e7cd4
parent44fa4d6aad324947fc323a9cdd462d4475e2b9cd (diff)
downloadqtlocation-mapboxgl-3fa6a4f4ff148303a14a751009f5596aa3f7effc.tar.gz
[core] Eliminate SpriteAtlas::Holder
-rw-r--r--src/mbgl/sprite/sprite_atlas.cpp51
-rw-r--r--src/mbgl/sprite/sprite_atlas.hpp11
2 files changed, 25 insertions, 37 deletions
diff --git a/src/mbgl/sprite/sprite_atlas.cpp b/src/mbgl/sprite/sprite_atlas.cpp
index 61c074a942..bd964217db 100644
--- a/src/mbgl/sprite/sprite_atlas.cpp
+++ b/src/mbgl/sprite/sprite_atlas.cpp
@@ -183,9 +183,9 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& name,
const SpritePatternMode mode) {
std::lock_guard<std::recursive_mutex> lock(mtx);
- auto rect_it = images.find({ name, mode });
- if (rect_it != images.end()) {
- return SpriteAtlasElement { rect_it->second.pos, rect_it->second.spriteImage, rect_it->second.spriteImage->pixelRatio / pixelRatio };
+ auto it = images.find({ name, mode });
+ if (it != images.end()) {
+ return it->second;
}
auto sprite = getSprite(name);
@@ -201,10 +201,12 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& name,
return {};
}
- const Holder& holder = images.emplace(Key{ name, mode }, Holder{ sprite, rect }).first->second;
- copy(holder, mode);
+ SpriteAtlasElement element { rect, sprite, sprite->pixelRatio / pixelRatio };
+
+ images.emplace(Key{ name, mode }, element);
+ copy(sprite->image, rect, mode);
- return SpriteAtlasElement { rect, sprite, sprite->pixelRatio / pixelRatio };
+ return element;
}
optional<SpriteAtlasPosition> SpriteAtlas::getPosition(const std::string& name,
@@ -231,31 +233,31 @@ optional<SpriteAtlasPosition> SpriteAtlas::getPosition(const std::string& name,
};
}
-void SpriteAtlas::copy(const Holder& holder, const SpritePatternMode mode) {
+void SpriteAtlas::copy(const PremultipliedImage& src, Rect<uint16_t> pos, const SpritePatternMode mode) {
if (!image.valid()) {
image = PremultipliedImage({ static_cast<uint32_t>(std::ceil(size.width * pixelRatio)),
static_cast<uint32_t>(std::ceil(size.height * pixelRatio)) });
image.fill(0);
}
- if (!holder.spriteImage->image.valid()) {
+ if (!src.valid()) {
return;
}
const uint32_t padding = 1;
- const uint32_t x = (holder.pos.x + padding) * pixelRatio;
- const uint32_t y = (holder.pos.y + padding) * pixelRatio;
- const uint32_t w = holder.spriteImage->image.size.width;
- const uint32_t h = holder.spriteImage->image.size.height;
+ const uint32_t x = (pos.x + padding) * pixelRatio;
+ const uint32_t y = (pos.y + padding) * pixelRatio;
+ const uint32_t w = src.size.width;
+ const uint32_t h = src.size.height;
- PremultipliedImage::copy(holder.spriteImage->image, image, { 0, 0 }, { x, y }, { w, h });
+ PremultipliedImage::copy(src, image, { 0, 0 }, { x, y }, { w, h });
if (mode == SpritePatternMode::Repeating) {
// Add 1 pixel wrapped padding on each side of the image.
- PremultipliedImage::copy(holder.spriteImage->image, image, { 0, h - 1 }, { x, y - 1 }, { w, 1 }); // T
- PremultipliedImage::copy(holder.spriteImage->image, image, { 0, 0 }, { x, y + h }, { w, 1 }); // B
- PremultipliedImage::copy(holder.spriteImage->image, image, { w - 1, 0 }, { x - 1, y }, { 1, h }); // L
- PremultipliedImage::copy(holder.spriteImage->image, image, { 0, 0 }, { x + w, y }, { 1, h }); // R
+ PremultipliedImage::copy(src, image, { 0, h - 1 }, { x, y - 1 }, { w, 1 }); // T
+ PremultipliedImage::copy(src, image, { 0, 0 }, { x, y + h }, { w, 1 }); // B
+ PremultipliedImage::copy(src, image, { w - 1, 0 }, { x - 1, y }, { 1, h }); // L
+ PremultipliedImage::copy(src, image, { 0, 0 }, { x + w, y }, { 1, h }); // R
}
dirty = true;
@@ -273,10 +275,10 @@ void SpriteAtlas::updateDirty() {
++spriteIterator;
} else {
// The two names match;
- Holder& holder = imageIterator->second;
- holder.spriteImage = spriteIterator->second;
- if (holder.spriteImage != nullptr) {
- copy(holder, imageIterator->first.second);
+ auto& element = imageIterator->second;
+ element.spriteImage = spriteIterator->second;
+ if (element.spriteImage != nullptr) {
+ copy(element.spriteImage->image, element.pos, imageIterator->first.second);
++imageIterator;
} else {
images.erase(imageIterator++);
@@ -313,11 +315,4 @@ void SpriteAtlas::bind(bool linear, gl::Context& context, gl::TextureUnit unit)
linear ? gl::TextureFilter::Linear : gl::TextureFilter::Nearest);
}
-SpriteAtlas::Holder::Holder(std::shared_ptr<const SpriteImage> spriteImage_, Rect<uint16_t> pos_)
- : spriteImage(std::move(spriteImage_)), pos(std::move(pos_)) {
-}
-
-SpriteAtlas::Holder::Holder(Holder&& h) : spriteImage(std::move(h.spriteImage)), pos(h.pos) {
-}
-
} // namespace mbgl
diff --git a/src/mbgl/sprite/sprite_atlas.hpp b/src/mbgl/sprite/sprite_atlas.hpp
index c79aec135e..9f4e20a0de 100644
--- a/src/mbgl/sprite/sprite_atlas.hpp
+++ b/src/mbgl/sprite/sprite_atlas.hpp
@@ -123,21 +123,14 @@ private:
// Stores all Sprite IDs that changed since the last invocation.
Sprites dirtySprites;
- struct Holder : private util::noncopyable {
- Holder(std::shared_ptr<const SpriteImage>, Rect<uint16_t>);
- Holder(Holder&&);
- std::shared_ptr<const SpriteImage> spriteImage;
- const Rect<uint16_t> pos;
- };
-
using Key = std::pair<std::string, SpritePatternMode>;
Rect<uint16_t> allocateImage(const SpriteImage&);
- void copy(const Holder& holder, SpritePatternMode mode);
+ void copy(const PremultipliedImage&, Rect<uint16_t>, SpritePatternMode);
std::recursive_mutex mtx;
BinPack<uint16_t> bin;
- std::map<Key, Holder> images;
+ std::map<Key, SpriteAtlasElement> images;
std::unordered_set<std::string> uninitialized;
PremultipliedImage image;
mbgl::optional<gl::Texture> texture;