diff --git a/src/mbgl/annotation/sprite_store.cpp b/src/mbgl/annotation/sprite_store.cpp index 6a474151c..91aad471b 100644 --- a/src/mbgl/annotation/sprite_store.cpp +++ b/src/mbgl/annotation/sprite_store.cpp @@ -17,15 +17,21 @@ void SpriteStore::setSprite(const std::string& name, std::shared_ptr& sprite) { if (sprite) { - if (sprite->pixelRatio == pixelRatio) { - sprites.emplace(name, sprite); - dirty.emplace(name, sprite); - return; - } else { + if (sprite->pixelRatio != pixelRatio) { Log::Warning(Event::Sprite, "Sprite image has wrong pixel ratio"); + return; } - } - if (sprites.erase(name) > 0) { + + auto it = sprites.find(name); + if (it != sprites.end() && + (it->second->width != sprite->width || it->second->height != sprite->height)) { + Log::Warning(Event::Sprite, "Can't change sprite dimensions"); + return; + } + + sprites.emplace_hint(it, name, sprite); + dirty.emplace(name, sprite); + } else if (sprites.erase(name) > 0) { dirty.emplace(name, nullptr); } } diff --git a/test/annotations/sprite_store.cpp b/test/annotations/sprite_store.cpp index ff34a94b5..58d27bd7c 100644 --- a/test/annotations/sprite_store.cpp +++ b/test/annotations/sprite_store.cpp @@ -89,3 +89,28 @@ TEST(Annotations, SpriteStoreMultiple) { store.getDirty()); EXPECT_EQ(Sprites(), store.getDirty()); } + + +TEST(Annotations, SpriteStoreReplaceWithDifferentDimensions) { + FixtureLog log; + + const auto sprite1 = std::make_shared(8, 8, 2, std::string(16 * 16 * 4, '\0')); + const auto sprite2 = std::make_shared(9, 9, 2, std::string(18 * 18 * 4, '\0')); + + using Sprites = std::map>; + SpriteStore store(2); + + store.setSprite("sprite", sprite1); + store.setSprite("sprite", sprite2); + + EXPECT_EQ(1u, log.count({ + EventSeverity::Warning, + Event::Sprite, + int64_t(-1), + "Can't change sprite dimensions", + })); + + EXPECT_EQ(sprite1, store.getSprite("sprite")); + + EXPECT_EQ(Sprites({ { "sprite", sprite1 } }), store.getDirty()); +}