summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-07-09 15:57:15 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-07-10 10:48:46 +0300
commit0ee9f21c56a69513ba2dce3108f5540afb045c6d (patch)
tree0bbb6f5e3d029dbf53a29257dfd87f0a4ddbe5a2 /src
parentf64ba789105c0193ced0da4507120fc03b684aba (diff)
downloadqtlocation-mapboxgl-0ee9f21c56a69513ba2dce3108f5540afb045c6d.tar.gz
Report Sprite parsing errors to Observers
Parsing errors will be reported to Observers. In practice this will bubble all the way to the Map object. This will make possible to identify possible corrupted data instead of rendering without sprites like we do in case of semantic errors.
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/annotation/sprite_parser.cpp15
-rw-r--r--src/mbgl/annotation/sprite_parser.hpp8
-rw-r--r--src/mbgl/map/sprite.cpp16
-rw-r--r--src/mbgl/map/sprite.hpp3
-rw-r--r--src/mbgl/style/style.cpp5
-rw-r--r--src/mbgl/style/style.hpp2
6 files changed, 31 insertions, 18 deletions
diff --git a/src/mbgl/annotation/sprite_parser.cpp b/src/mbgl/annotation/sprite_parser.cpp
index 0f9ba97c98..f867b97f4a 100644
--- a/src/mbgl/annotation/sprite_parser.cpp
+++ b/src/mbgl/annotation/sprite_parser.cpp
@@ -9,6 +9,7 @@
#include <cmath>
#include <limits>
+#include <sstream>
namespace mbgl {
@@ -99,7 +100,7 @@ inline bool getBoolean(const rapidjson::Value& value, const char* name, const bo
} // namespace
-Sprites parseSprite(const std::string& image, const std::string& json) {
+SpriteParseResult parseSprite(const std::string& image, const std::string& json) {
using namespace rapidjson;
Sprites sprites;
@@ -107,20 +108,18 @@ Sprites parseSprite(const std::string& image, const std::string& json) {
// Parse the sprite image.
const util::Image raster(image);
if (!raster) {
- Log::Warning(Event::Sprite, "Could not parse sprite image");
- return sprites;
+ return std::string("Could not parse sprite image");
}
Document doc;
doc.Parse<0>(json.c_str());
if (doc.HasParseError()) {
- Log::Warning(Event::Sprite, std::string{ "Failed to parse JSON: " } + doc.GetParseError() +
- " at offset " + std::to_string(doc.GetErrorOffset()));
- return sprites;
+ std::stringstream message;
+ message << "Failed to parse JSON: " << doc.GetParseError() << " at offset " << doc.GetErrorOffset();
+ return message.str();
} else if (!doc.IsObject()) {
- Log::Warning(Event::Sprite, "Sprite JSON root must be an object");
- return sprites;
+ return std::string("Sprite JSON root must be an object");
} else {
for (Value::ConstMemberIterator itr = doc.MemberBegin(); itr != doc.MemberEnd(); ++itr) {
const std::string name = { itr->name.GetString(), itr->name.GetStringLength() };
diff --git a/src/mbgl/annotation/sprite_parser.hpp b/src/mbgl/annotation/sprite_parser.hpp
index 71228aacf6..d7e9953359 100644
--- a/src/mbgl/annotation/sprite_parser.hpp
+++ b/src/mbgl/annotation/sprite_parser.hpp
@@ -3,6 +3,7 @@
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/geo.hpp>
+#include <mbgl/util/variant.hpp>
#include <string>
#include <memory>
@@ -31,8 +32,13 @@ SpriteImagePtr createSpriteImage(const util::Image& image,
using Sprites = std::map<std::string, SpriteImagePtr>;
+
+using SpriteParseResult = mapbox::util::variant<
+ Sprites, // success
+ std::string>; // error
+
// Parses an image and an associated JSON file and returns the sprite objects.
-Sprites parseSprite(const std::string& image, const std::string& json);
+SpriteParseResult parseSprite(const std::string& image, const std::string& json);
} // namespace mbgl
diff --git a/src/mbgl/map/sprite.cpp b/src/mbgl/map/sprite.cpp
index 900b2efa41..5f6190f582 100644
--- a/src/mbgl/map/sprite.cpp
+++ b/src/mbgl/map/sprite.cpp
@@ -85,11 +85,19 @@ Sprite::~Sprite() {
void Sprite::emitSpriteLoadedIfComplete() {
assert(loader);
- if (loader->loadedImage && loader->loadedJSON && observer) {
- std::unique_ptr<Data> data(std::move(loader->data));
- loader.reset();
- observer->onSpriteLoaded(std::move(data));
+ if (!loader->loadedImage || !loader->loadedJSON || !observer) {
+ return;
+ }
+
+ std::unique_ptr<Data> data(std::move(loader->data));
+ loader.reset();
+
+ auto result = parseSprite(data->image, data->json);
+ if (result.is<Sprites>()) {
+ observer->onSpriteLoaded(result.get<Sprites>());
+ } else {
+ emitSpriteLoadingFailed(result.get<std::string>());
}
}
diff --git a/src/mbgl/map/sprite.hpp b/src/mbgl/map/sprite.hpp
index d8f91fd9c3..b2020e7d64 100644
--- a/src/mbgl/map/sprite.hpp
+++ b/src/mbgl/map/sprite.hpp
@@ -1,6 +1,7 @@
#ifndef MBGL_STYLE_SPRITE
#define MBGL_STYLE_SPRITE
+#include <mbgl/annotation/sprite_parser.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/ptr.hpp>
@@ -27,7 +28,7 @@ public:
public:
virtual ~Observer() = default;
- virtual void onSpriteLoaded(std::unique_ptr<Data>) = 0;
+ virtual void onSpriteLoaded(const Sprites& sprites) = 0;
virtual void onSpriteLoadingFailed(std::exception_ptr error) = 0;
};
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp
index 48106d8f3a..e091c92f53 100644
--- a/src/mbgl/style/style.cpp
+++ b/src/mbgl/style/style.cpp
@@ -4,7 +4,6 @@
#include <mbgl/map/source.hpp>
#include <mbgl/map/transform_state.hpp>
#include <mbgl/annotation/sprite_store.hpp>
-#include <mbgl/annotation/sprite_parser.hpp>
#include <mbgl/style/style_layer.hpp>
#include <mbgl/style/style_parser.hpp>
#include <mbgl/style/style_bucket.hpp>
@@ -191,9 +190,9 @@ void Style::onTileLoadingFailed(std::exception_ptr error) {
emitResourceLoadingFailed(error);
}
-void Style::onSpriteLoaded(std::unique_ptr<Sprite::Data> spriteData) {
+void Style::onSpriteLoaded(const Sprites& sprites) {
// Add all sprite images to the SpriteStore object
- spriteStore->setSprites(parseSprite(spriteData->image, spriteData->json));
+ spriteStore->setSprites(sprites);
shouldReparsePartialTiles = true;
emitTileDataChanged();
diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp
index 359ab4d831..d6b762a830 100644
--- a/src/mbgl/style/style.hpp
+++ b/src/mbgl/style/style.hpp
@@ -89,7 +89,7 @@ private:
void onTileLoadingFailed(std::exception_ptr error) override;
// Sprite::Observer implementation.
- void onSpriteLoaded(std::unique_ptr<Sprite::Data>) override;
+ void onSpriteLoaded(const Sprites& sprites) override;
void onSpriteLoadingFailed(std::exception_ptr error) override;
void emitTileDataChanged();