diff options
Diffstat (limited to 'src/mbgl/style/style.cpp')
-rw-r--r-- | src/mbgl/style/style.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp new file mode 100644 index 0000000000..9669e0e4a7 --- /dev/null +++ b/src/mbgl/style/style.cpp @@ -0,0 +1,109 @@ +#include <mbgl/style/style.hpp> +#include <mbgl/map/sprite.hpp> +#include <mbgl/style/style_layer_group.hpp> +#include <mbgl/style/style_parser.hpp> +#include <mbgl/style/style_bucket.hpp> +#include <mbgl/util/constants.hpp> +#include <mbgl/util/time.hpp> +#include <mbgl/util/error.hpp> +#include <mbgl/util/std.hpp> +#include <mbgl/util/uv_detail.hpp> +#include <mbgl/platform/log.hpp> +#include <csscolorparser/csscolorparser.hpp> + +#include <rapidjson/document.h> + +#include <algorithm> + +namespace mbgl { + +Style::Style() + : mtx(util::make_unique<uv::rwlock>()) { +} + +// Note: This constructor is seemingly empty, but we need to declare it anyway +// because this file includes uv_detail.hpp, which has the declarations necessary +// for deleting the std::unique_ptr<uv::rwlock>. +Style::~Style() {} + +void Style::updateProperties(float z, timestamp now) { + uv::writelock lock(mtx); + + if (layers) { + layers->updateProperties(z, now); + } + + // Apply transitions after the first time. + if (!initial_render_complete) { + initial_render_complete = true; + return; + } +} + +const std::string &Style::getSpriteURL() const { + return sprite_url; +} + +void Style::setDefaultTransitionDuration(uint16_t duration_milliseconds) { + defaultTransition.duration = duration_milliseconds; +} + +const std::vector<std::string> &Style::getAppliedClasses() const { + return appliedClasses; +} + +void Style::setAppliedClasses(const std::vector<std::string> &class_names) { + appliedClasses = class_names; + updateClasses(); +} + +void Style::toggleClass(const std::string &name) { + if (name.length()) { + auto it = std::find(appliedClasses.begin(), appliedClasses.end(), name); + if (it == appliedClasses.end()) { + appliedClasses.push_back(name); + } else { + appliedClasses.erase(it); + } + } + + updateClasses(); +} + +void Style::updateClasses() { + if (layers) { + layers->setClasses(appliedClasses, util::now(), defaultTransition); + } +} + +bool Style::hasTransitions() const { + if (layers) { + if (layers->hasTransitions()) { + return true; + } + } + return false; +} + + +void Style::loadJSON(const uint8_t *const data) { + uv::writelock lock(mtx); + + rapidjson::Document doc; + doc.Parse<0>((const char *const)data); + if (doc.HasParseError()) { + Log::Error(Event::ParseStyle, "Error parsing style JSON at %i: %s", doc.GetErrorOffset(), doc.GetParseError()); + throw error::style_parse(doc.GetErrorOffset(), doc.GetParseError()); + } + + StyleParser parser; + parser.parse(doc); + + layers = parser.getLayers(); + sprite_url = parser.getSprite(); + glyph_url = parser.getGlyphURL(); + + updateClasses(); +} + +} |