From d37bd549bc4bcaa80df667e6e218251607d94586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 6 Jul 2015 13:53:30 +0200 Subject: [PATCH] make sure that the SpriteStore object correctly replaces the SpriteImages --- src/mbgl/annotation/sprite_store.cpp | 22 ++++++++++++++++------ test/annotations/sprite_store.cpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/mbgl/annotation/sprite_store.cpp b/src/mbgl/annotation/sprite_store.cpp index ac7730fb4..1cc5d7641 100644 --- a/src/mbgl/annotation/sprite_store.cpp +++ b/src/mbgl/annotation/sprite_store.cpp @@ -13,14 +13,24 @@ void SpriteStore::_setSprite(const std::string& name, const std::shared_ptr& sprite) { if (sprite) { 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 for '%s'", name.c_str()); - return; + if (it != sprites.end()) { + // There is already a sprite with that name in our store. + if ((it->second->width != sprite->width || it->second->height != sprite->height)) { + Log::Warning(Event::Sprite, "Can't change sprite dimensions for '%s'", name.c_str()); + return; + } + it->second = sprite; + } else { + sprites.emplace(name, sprite); } - sprites.emplace_hint(it, name, sprite); - dirty.emplace(name, sprite); + // Always add/replace the value in the dirty list. + auto dirty_it = dirty.find(name); + if (dirty_it != dirty.end()) { + dirty_it->second = sprite; + } else { + 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 662a5a3aa..2f589fa13 100644 --- a/test/annotations/sprite_store.cpp +++ b/test/annotations/sprite_store.cpp @@ -83,6 +83,22 @@ TEST(Annotations, SpriteStoreMultiple) { EXPECT_EQ(Sprites(), store.getDirty()); } +TEST(Annotations, SpriteStoreReplace) { + FixtureLog log; + + const auto sprite1 = std::make_shared(8, 8, 2, std::string(16 * 16 * 4, '\0')); + const auto sprite2 = std::make_shared(8, 8, 2, std::string(16 * 16 * 4, '\0')); + + using Sprites = std::map>; + SpriteStore store; + + store.setSprite("sprite", sprite1); + EXPECT_EQ(sprite1, store.getSprite("sprite")); + store.setSprite("sprite", sprite2); + EXPECT_EQ(sprite2, store.getSprite("sprite")); + + EXPECT_EQ(Sprites({ { "sprite", sprite2 } }), store.getDirty()); +} TEST(Annotations, SpriteStoreReplaceWithDifferentDimensions) { FixtureLog log;