#include #include #include #include #include #include #include #include #include #include namespace llmr { Style::Style(Map &map) : map(map) { } void Style::updateSources() { activeSources.clear(); updateSources(layers); } const std::set> Style::getActiveSources() const { return activeSources; } void Style::updateSources(const std::shared_ptr &group) { if (!group) { return; } for (const std::shared_ptr &layer : group->layers) { if (!layer) continue; if (layer->bucket) { if (layer->bucket->source) { activeSources.emplace(layer->bucket->source); } } else if (layer->layers) { updateSources(layer->layers); } } } void Style::updateProperties(float z, timestamp now) { uv::writelock lock(mtx); updateSources(); 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(map); 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(); } }