summaryrefslogtreecommitdiff
path: root/src/mbgl/map
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-05-30 13:58:59 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-06-05 19:38:08 -0700
commit74af076d405a089fac70a47e41fe92d04d97fc50 (patch)
tree29e4a76538da9a9455f711a25e7d5ddc1dece625 /src/mbgl/map
parent1cf46d93b944095726396acf84649519e2fd96ad (diff)
downloadqtlocation-mapboxgl-74af076d405a089fac70a47e41fe92d04d97fc50.tar.gz
[core] Split RenderStyle from Style
Diffstat (limited to 'src/mbgl/map')
-rw-r--r--src/mbgl/map/map.cpp61
1 files changed, 43 insertions, 18 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 2fd575e6bf..dd3d10d253 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -15,6 +15,8 @@
#include <mbgl/renderer/update_parameters.hpp>
#include <mbgl/renderer/painter.hpp>
#include <mbgl/renderer/render_source.hpp>
+#include <mbgl/renderer/render_style.hpp>
+#include <mbgl/renderer/render_style_observer.hpp>
#include <mbgl/storage/file_source.hpp>
#include <mbgl/storage/resource.hpp>
#include <mbgl/storage/response.hpp>
@@ -48,7 +50,8 @@ struct StillImageRequest {
Map::StillImageCallback callback;
};
-class Map::Impl : public style::Observer {
+class Map::Impl : public style::Observer,
+ public RenderStyleObserver {
public:
Impl(Map&,
Backend&,
@@ -63,6 +66,7 @@ public:
void onSourceChanged(style::Source&) override;
void onUpdate(Update) override;
+ void onInvalidate() override;
void onStyleLoaded() override;
void onStyleError(std::exception_ptr) override;
void onResourceError(std::exception_ptr) override;
@@ -93,6 +97,7 @@ public:
AnnotationManager annotationManager;
std::unique_ptr<Painter> painter;
std::unique_ptr<Style> style;
+ std::unique_ptr<RenderStyle> renderStyle;
std::string styleURL;
std::string styleJSON;
@@ -169,6 +174,7 @@ Map::~Map() {
// Explicit resets currently necessary because these abandon resources that need to be
// cleaned up by context.reset();
+ impl->renderStyle.reset();
impl->style.reset();
impl->painter.reset();
}
@@ -238,16 +244,22 @@ void Map::Impl::render(View& view) {
annotationManager.updateData();
}
- style->update({
+ renderStyle->update({
mode,
- updateFlags,
pixelRatio,
debugOptions,
timePoint,
- transform.getState(),
+ style->getGlyphURL(),
+ style->spriteLoaded,
+ style->getTransitionOptions(),
+ style->getLight()->impl,
+ style->getImageImpls(),
+ style->getSourceImpls(),
+ style->getLayerImpls(),
scheduler,
fileSource,
- annotationManager
+ annotationManager,
+ transform.getState()
});
updateFlags = Update::Nothing;
@@ -257,6 +269,8 @@ void Map::Impl::render(View& view) {
painter = std::make_unique<Painter>(context, transform.getState(), pixelRatio, programCacheDir);
}
+ bool loaded = style->isLoaded() && renderStyle->isLoaded();
+
if (mode == MapMode::Continuous) {
if (renderState == RenderState::Never) {
observer.onWillStartRenderingMap();
@@ -272,15 +286,17 @@ void Map::Impl::render(View& view) {
backend.updateAssumedState();
- painter->render(*style,
+ painter->render(*renderStyle,
frameData,
view);
painter->cleanup();
- observer.onDidFinishRenderingFrame(style->isLoaded() ? MapObserver::RenderMode::Full : MapObserver::RenderMode::Partial);
+ observer.onDidFinishRenderingFrame(loaded
+ ? MapObserver::RenderMode::Full
+ : MapObserver::RenderMode::Partial);
- if (!style->isLoaded()) {
+ if (!loaded) {
renderState = RenderState::Partial;
} else if (renderState != RenderState::Fully) {
renderState = RenderState::Fully;
@@ -293,10 +309,10 @@ void Map::Impl::render(View& view) {
// Schedule an update if we need to paint another frame due to transitions or
// animations that are still in progress
- if (style->hasTransitions() || painter->needsAnimation() || transform.inTransition()) {
+ if (renderStyle->hasTransitions() || painter->needsAnimation() || transform.inTransition()) {
onUpdate(Update::Repaint);
}
- } else if (stillImageRequest && style->isLoaded()) {
+ } else if (stillImageRequest && loaded) {
FrameData frameData { timePoint,
pixelRatio,
mode,
@@ -305,7 +321,7 @@ void Map::Impl::render(View& view) {
backend.updateAssumedState();
- painter->render(*style,
+ painter->render(*renderStyle,
frameData,
view);
@@ -333,6 +349,7 @@ void Map::setStyleURL(const std::string& url) {
impl->styleMutated = false;
impl->style = std::make_unique<Style>(impl->scheduler, impl->fileSource, impl->pixelRatio);
+ impl->renderStyle = std::make_unique<RenderStyle>(impl->scheduler, impl->fileSource);
impl->styleRequest = impl->fileSource.request(Resource::style(impl->styleURL), [this](Response res) {
// Once we get a fresh style, or the style is mutated, stop revalidating.
@@ -379,12 +396,15 @@ void Map::setStyleJSON(const std::string& json) {
impl->styleMutated = false;
impl->style = std::make_unique<Style>(impl->scheduler, impl->fileSource, impl->pixelRatio);
+ impl->renderStyle = std::make_unique<RenderStyle>(impl->scheduler, impl->fileSource);
impl->loadStyleJSON(json);
}
void Map::Impl::loadStyleJSON(const std::string& json) {
style->setObserver(this);
+ renderStyle->setObserver(this);
+
style->setJSON(json);
styleJSON = json;
@@ -816,7 +836,7 @@ void Map::removeAnnotation(AnnotationID annotation) {
std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options) {
if (!impl->style) return {};
- return impl->style->queryRenderedFeatures(
+ return impl->renderStyle->queryRenderedFeatures(
{ point },
impl->transform.getState(),
options
@@ -826,7 +846,7 @@ std::vector<Feature> Map::queryRenderedFeatures(const ScreenCoordinate& point, c
std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const RenderedQueryOptions& options) {
if (!impl->style) return {};
- return impl->style->queryRenderedFeatures(
+ return impl->renderStyle->queryRenderedFeatures(
{
box.min,
{ box.max.x, box.min.y },
@@ -842,7 +862,7 @@ std::vector<Feature> Map::queryRenderedFeatures(const ScreenBox& box, const Rend
std::vector<Feature> Map::querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options) {
if (!impl->style) return {};
- const RenderSource* source = impl->style->getRenderSource(sourceID);
+ const RenderSource* source = impl->renderStyle->getRenderSource(sourceID);
if (!source) return {};
return source->querySourceFeatures(options);
@@ -1046,7 +1066,7 @@ MapDebugOptions Map::getDebug() const {
}
bool Map::isFullyLoaded() const {
- return impl->style ? impl->style->isLoaded() : false;
+ return impl->style && impl->style->isLoaded() && impl->renderStyle->isLoaded();
}
style::TransitionOptions Map::getTransitionOptions() const {
@@ -1066,7 +1086,7 @@ void Map::setSourceTileCacheSize(size_t size) {
if (size != impl->sourceCacheSize) {
impl->sourceCacheSize = size;
if (!impl->style) return;
- impl->style->setSourceTileCacheSize(size);
+ impl->renderStyle->setSourceTileCacheSize(size);
impl->backend.invalidate();
}
}
@@ -1076,8 +1096,8 @@ void Map::onLowMemory() {
BackendScope guard(impl->backend);
impl->painter->cleanup();
}
- if (impl->style) {
- impl->style->onLowMemory();
+ if (impl->renderStyle) {
+ impl->renderStyle->onLowMemory();
impl->backend.invalidate();
}
}
@@ -1091,6 +1111,10 @@ void Map::Impl::onUpdate(Update flags) {
asyncInvalidate.send();
}
+void Map::Impl::onInvalidate() {
+ onUpdate(Update::Repaint);
+}
+
void Map::Impl::onStyleLoaded() {
observer.onDidFinishLoadingStyle();
}
@@ -1111,6 +1135,7 @@ void Map::dumpDebugLogs() const {
Log::Info(Event::General, "MapContext::styleURL: %s", impl->styleURL.c_str());
if (impl->style) {
impl->style->dumpDebugLogs();
+ impl->renderStyle->dumpDebugLogs();
} else {
Log::Info(Event::General, "no style loaded");
}