#include #include #include #include #include #include #include #include #include namespace llmr { 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; } } void Style::setDefaultTransitionDuration(uint16_t duration_milliseconds) { defaultTransition.duration = duration_milliseconds; } const std::vector &Style::getAppliedClasses() const { return appliedClasses; } void Style::setAppliedClasses(const std::vector &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()) { throw error::style_parse(doc.GetErrorOffset(), doc.GetParseError()); } StyleParser parser; parser.parse(const_cast(doc)); layers = parser.getLayers(); sprite_url = parser.getSprite(); glyph_url = parser.getGlyphURL(); updateClasses(); } const BackgroundProperties &Style::getBackgroundProperties() const { if (layers && layers->layers.size()) { const auto first = layers->layers.front(); if (first && first->id == "background") { return first->getProperties(); } } return defaultStyleProperties(); } }