summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mbgl/geometry/sprite_atlas.cpp11
-rw-r--r--src/mbgl/geometry/sprite_atlas.hpp3
-rw-r--r--test/annotations/sprite_atlas.cpp27
3 files changed, 27 insertions, 14 deletions
diff --git a/src/mbgl/geometry/sprite_atlas.cpp b/src/mbgl/geometry/sprite_atlas.cpp
index 825c02658a..743848d5f2 100644
--- a/src/mbgl/geometry/sprite_atlas.cpp
+++ b/src/mbgl/geometry/sprite_atlas.cpp
@@ -27,7 +27,9 @@ SpriteAtlas::SpriteAtlas(dimension width_, dimension height_, float pixelRatio_,
pixelRatio(pixelRatio_),
store(store_),
bin(width_, height_),
+ data(std::make_unique<uint32_t[]>(pixelWidth * pixelHeight)),
dirty(true) {
+ std::fill(data.get(), data.get() + pixelWidth * pixelHeight, 0);
}
Rect<SpriteAtlas::dimension> SpriteAtlas::allocateImage(const size_t pixel_width, const size_t pixel_height) {
@@ -103,13 +105,6 @@ SpriteAtlasPosition SpriteAtlas::getPosition(const std::string& name, bool repea
};
}
-void SpriteAtlas::allocate() {
- if (!data) {
- data = std::make_unique<uint32_t[]>(pixelWidth * pixelHeight);
- std::fill(data.get(), data.get() + pixelWidth * pixelHeight, 0);
- }
-}
-
void SpriteAtlas::copy(const Holder& holder, const bool wrap) {
const uint32_t *srcData = reinterpret_cast<const uint32_t *>(holder.texture->data.data());
if (!srcData) return;
@@ -119,7 +114,6 @@ void SpriteAtlas::copy(const Holder& holder, const bool wrap) {
const int offset = 1;
- allocate();
uint32_t *const dstData = data.get();
const vec2<uint32_t> dstSize{ pixelWidth, pixelHeight };
const Rect<uint32_t> dstPos{ static_cast<uint32_t>((offset + dst.x) * pixelRatio),
@@ -222,7 +216,6 @@ void SpriteAtlas::bind(bool linear) {
if (dirty) {
std::lock_guard<std::recursive_mutex> lock(mtx);
- allocate();
if (fullUploadRequired) {
MBGL_CHECK_ERROR(glTexImage2D(
diff --git a/src/mbgl/geometry/sprite_atlas.hpp b/src/mbgl/geometry/sprite_atlas.hpp
index 6642e04bf8..bfe4f843da 100644
--- a/src/mbgl/geometry/sprite_atlas.hpp
+++ b/src/mbgl/geometry/sprite_atlas.hpp
@@ -82,7 +82,6 @@ private:
using Key = std::pair<std::string, bool>;
- void allocate();
Rect<SpriteAtlas::dimension> allocateImage(size_t width, size_t height);
void copy(const Holder& holder, const bool wrap);
@@ -91,7 +90,7 @@ private:
BinPack<dimension> bin;
std::map<Key, Holder> images;
std::set<std::string> uninitialized;
- std::unique_ptr<uint32_t[]> data;
+ const std::unique_ptr<uint32_t[]> data;
std::atomic<bool> dirty;
bool fullUploadRequired = true;
uint32_t texture = 0;
diff --git a/test/annotations/sprite_atlas.cpp b/test/annotations/sprite_atlas.cpp
index 5fc867daf5..6334c47e31 100644
--- a/test/annotations/sprite_atlas.cpp
+++ b/test/annotations/sprite_atlas.cpp
@@ -40,7 +40,7 @@ TEST(Annotations, SpriteAtlas) {
EXPECT_EQ(112, atlas.getTextureHeight());
// Image hasn't been created yet.
- EXPECT_FALSE(atlas.getData());
+ EXPECT_TRUE(atlas.getData());
auto metro = atlas.getImage("metro", false);
EXPECT_EQ(0, metro.pos.x);
@@ -72,8 +72,6 @@ TEST(Annotations, SpriteAtlas) {
EXPECT_EQ(18, metro2.pos.originalW);
EXPECT_EQ(18, metro2.pos.originalH);
- EXPECT_TRUE(atlas.getData());
-
const size_t bytes = atlas.getTextureWidth() * atlas.getTextureHeight() * 4;
const auto hash = crc64(reinterpret_cast<const char*>(atlas.getData()), bytes);
EXPECT_EQ(0x9875fc0595489a9fu, hash) << std::hex << hash;
@@ -85,6 +83,8 @@ TEST(Annotations, SpriteAtlas) {
TEST(Annotations, SpriteAtlasSize) {
SpriteStore store;
+ store.setSprites(parseSprite(util::read_file("test/fixtures/annotations/emerald.png"),
+ util::read_file("test/fixtures/annotations/emerald.json")));
SpriteAtlas atlas(63, 112, 1.4, store);
EXPECT_DOUBLE_EQ(1.4f, atlas.getPixelRatio());
@@ -92,4 +92,25 @@ TEST(Annotations, SpriteAtlasSize) {
EXPECT_EQ(112, atlas.getHeight());
EXPECT_EQ(89, atlas.getTextureWidth());
EXPECT_EQ(157, atlas.getTextureHeight());
+
+ auto metro = atlas.getImage("metro", false);
+ EXPECT_EQ(0, metro.pos.x);
+ EXPECT_EQ(0, metro.pos.y);
+ EXPECT_EQ(20, metro.pos.w);
+ EXPECT_EQ(20, metro.pos.h);
+ EXPECT_EQ(18, metro.pos.originalW);
+ EXPECT_EQ(18, metro.pos.originalH);
+ EXPECT_EQ(18, metro.texture->width);
+ EXPECT_EQ(18, metro.texture->height);
+ EXPECT_EQ(18, metro.texture->pixelWidth);
+ EXPECT_EQ(18, metro.texture->pixelHeight);
+ EXPECT_EQ(1.0f, metro.texture->pixelRatio);
+
+ const size_t bytes = atlas.getTextureWidth() * atlas.getTextureHeight() * 4;
+ const auto hash = crc64(reinterpret_cast<const char*>(atlas.getData()), bytes);
+ EXPECT_EQ(0x2cdda7dbb04d116du, hash) << std::hex << hash;
+
+ // util::write_file(
+ // "test/fixtures/annotations/atlas2.png",
+ // util::compress_png(atlas.getTextureWidth(), atlas.getTextureHeight(), atlas.getData()));
}