From 54aaa43b6df0303ef9858839e4bbc7ae27a8c202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Wed, 24 Jun 2015 18:10:55 +0200 Subject: [PATCH] add test for trying to add mismatched SpriteImage --- src/mbgl/annotation/sprite_store.cpp | 27 +++++++++++++++++++-------- src/mbgl/annotation/sprite_store.hpp | 2 ++ test/annotations/sprite_store.cpp | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/mbgl/annotation/sprite_store.cpp b/src/mbgl/annotation/sprite_store.cpp index 37acace87..270348aba 100644 --- a/src/mbgl/annotation/sprite_store.cpp +++ b/src/mbgl/annotation/sprite_store.cpp @@ -1,5 +1,7 @@ #include +#include + #include namespace mbgl { @@ -8,20 +10,29 @@ SpriteStore::SpriteStore(const float pixelRatio_) : pixelRatio(pixelRatio_) { } void SpriteStore::setSprite(const std::string& name, std::shared_ptr sprite) { - if (sprite && sprite->pixelRatio != pixelRatio) { - throw util::SpriteImageException("Sprite image has wrong pixel ratio"); - } std::lock_guard lock(mutex); + _setSprite(name, sprite); +} + +void SpriteStore::_setSprite(const std::string& name, + const std::shared_ptr& sprite) { if (sprite) { - sprites.emplace(name, sprite); - } else { - sprites.erase(name); + if (sprite->pixelRatio == pixelRatio) { + sprites.emplace(name, sprite); + dirty.emplace(name, sprite); + return; + } else { + Log::Warning(Event::Sprite, "Sprite image has wrong pixel ratio"); + } + } + if (sprites.erase(name) > 0) { + dirty.emplace(name, nullptr); } - dirty.emplace(name, sprite); } void SpriteStore::removeSprite(const std::string& name) { - setSprite(name); + std::lock_guard lock(mutex); + _setSprite(name); } std::shared_ptr SpriteStore::getSprite(const std::string& name) { diff --git a/src/mbgl/annotation/sprite_store.hpp b/src/mbgl/annotation/sprite_store.hpp index d8c8372f9..80ea6bbe7 100644 --- a/src/mbgl/annotation/sprite_store.hpp +++ b/src/mbgl/annotation/sprite_store.hpp @@ -38,6 +38,8 @@ public: const float pixelRatio; private: + void _setSprite(const std::string&, const std::shared_ptr& = nullptr); + // Lock for sprites and dirty maps. std::mutex mutex; diff --git a/test/annotations/sprite_store.cpp b/test/annotations/sprite_store.cpp index 287efaeda..b22c46be4 100644 --- a/test/annotations/sprite_store.cpp +++ b/test/annotations/sprite_store.cpp @@ -1,4 +1,5 @@ #include "../fixtures/util.hpp" +#include "../fixtures/fixture_log_observer.hpp" #include @@ -49,3 +50,24 @@ TEST(Annotations, SpriteStore) { }), store.getDirty()); EXPECT_EQ(Sprites(), store.getDirty()); } + + +TEST(Annotations, SpriteStoreWrongPixelRatio) { + FixtureLog log; + + const auto sprite1 = std::make_shared(8, 8, 1, std::string(8 * 8 * 4, '\0')); + + using Sprites = std::map>; + SpriteStore store(2); + + // Adding mismatched sprite image + store.setSprite("one", sprite1); + EXPECT_EQ(Sprites({}), store.getDirty()); + + EXPECT_EQ(1u, log.count({ + EventSeverity::Warning, + Event::Sprite, + int64_t(-1), + "Sprite image has wrong pixel ratio", + })); +}