[core] Remove MapData dependency from Style
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include <mbgl/style/style.hpp>
|
||||
#include <mbgl/style/style_layer.hpp>
|
||||
#include <mbgl/style/property_transition.hpp>
|
||||
#include <mbgl/style/style_update_parameters.hpp>
|
||||
#include <mbgl/layer/custom_layer.hpp>
|
||||
#include <mbgl/renderer/painter.hpp>
|
||||
#include <mbgl/storage/file_source.hpp>
|
||||
@@ -209,14 +210,26 @@ void Map::Impl::update() {
|
||||
}
|
||||
|
||||
if (updateFlags & Update::Classes) {
|
||||
style->cascade(frameData.timePoint);
|
||||
style->cascade(frameData.timePoint, data.mode);
|
||||
}
|
||||
|
||||
if (updateFlags & Update::Classes || updateFlags & Update::RecalculateStyle) {
|
||||
style->recalculate(transformState.getZoom(), frameData.timePoint);
|
||||
style->recalculate(transformState.getZoom(), frameData.timePoint, data.mode);
|
||||
}
|
||||
|
||||
style->update(transformState, frameData.timePoint, *texturePool);
|
||||
StyleUpdateParameters parameters(data.pixelRatio,
|
||||
data.getDebug(),
|
||||
frameData.timePoint,
|
||||
transformState,
|
||||
style->workers,
|
||||
fileSource,
|
||||
*texturePool,
|
||||
style->shouldReparsePartialTiles,
|
||||
data.mode,
|
||||
*data.getAnnotationManager(),
|
||||
*style);
|
||||
|
||||
style->update(parameters);
|
||||
|
||||
if (data.mode == MapMode::Continuous) {
|
||||
view.invalidate();
|
||||
@@ -269,7 +282,7 @@ void Map::setStyleURL(const std::string& url) {
|
||||
impl->styleURL = url;
|
||||
impl->styleJSON.clear();
|
||||
|
||||
impl->style = std::make_unique<Style>(impl->data, impl->fileSource);
|
||||
impl->style = std::make_unique<Style>(impl->fileSource, impl->data.pixelRatio);
|
||||
|
||||
const size_t pos = impl->styleURL.rfind('/');
|
||||
std::string base = "";
|
||||
@@ -304,7 +317,7 @@ void Map::setStyleJSON(const std::string& json, const std::string& base) {
|
||||
|
||||
impl->styleURL.clear();
|
||||
impl->styleJSON.clear();
|
||||
impl->style = std::make_unique<Style>(impl->data, impl->fileSource);
|
||||
impl->style = std::make_unique<Style>(impl->fileSource, impl->data.pixelRatio);
|
||||
|
||||
impl->loadStyleJSON(json, base);
|
||||
}
|
||||
@@ -315,7 +328,7 @@ void Map::Impl::loadStyleJSON(const std::string& json, const std::string& base)
|
||||
styleJSON = json;
|
||||
|
||||
// force style cascade, causing all pending transitions to complete.
|
||||
style->cascade(Clock::now());
|
||||
style->cascade(Clock::now(), data.mode);
|
||||
|
||||
updateFlags |= Update::Classes | Update::RecalculateStyle | Update::Annotations;
|
||||
asyncUpdate.send();
|
||||
|
||||
@@ -57,13 +57,12 @@ std::vector<std::string> Style::getClasses() const {
|
||||
return classes;
|
||||
}
|
||||
|
||||
Style::Style(MapData& data_, FileSource& fileSource_)
|
||||
: data(data_),
|
||||
fileSource(fileSource_),
|
||||
Style::Style(FileSource& fileSource_, float pixelRatio)
|
||||
: fileSource(fileSource_),
|
||||
glyphStore(std::make_unique<GlyphStore>(fileSource)),
|
||||
glyphAtlas(std::make_unique<GlyphAtlas>(1024, 1024)),
|
||||
spriteStore(std::make_unique<SpriteStore>(data.pixelRatio)),
|
||||
spriteAtlas(std::make_unique<SpriteAtlas>(1024, 1024, data.pixelRatio, *spriteStore)),
|
||||
spriteStore(std::make_unique<SpriteStore>(pixelRatio)),
|
||||
spriteAtlas(std::make_unique<SpriteAtlas>(1024, 1024, pixelRatio, *spriteStore)),
|
||||
lineAtlas(std::make_unique<LineAtlas>(256, 512)),
|
||||
workers(4) {
|
||||
glyphStore->setObserver(this);
|
||||
@@ -147,20 +146,8 @@ void Style::removeLayer(const std::string& id) {
|
||||
layers.erase(it);
|
||||
}
|
||||
|
||||
void Style::update(const TransformState& transform, const TimePoint& timePoint,
|
||||
gl::TexturePool& texturePool) {
|
||||
void Style::update(const StyleUpdateParameters& parameters) {
|
||||
bool allTilesUpdated = true;
|
||||
StyleUpdateParameters parameters(data.pixelRatio,
|
||||
data.getDebug(),
|
||||
timePoint,
|
||||
transform,
|
||||
workers,
|
||||
fileSource,
|
||||
texturePool,
|
||||
shouldReparsePartialTiles,
|
||||
data.mode,
|
||||
*data.getAnnotationManager(),
|
||||
*this);
|
||||
|
||||
for (const auto& source : sources) {
|
||||
if (!source->update(parameters)) {
|
||||
@@ -175,7 +162,7 @@ void Style::update(const TransformState& transform, const TimePoint& timePoint,
|
||||
}
|
||||
}
|
||||
|
||||
void Style::cascade(const TimePoint& timePoint) {
|
||||
void Style::cascade(const TimePoint& timePoint, MapMode mode) {
|
||||
// When in continuous mode, we can either have user- or style-defined
|
||||
// transitions. Still mode is always immediate.
|
||||
static const PropertyTransition immediateTransition;
|
||||
@@ -190,7 +177,7 @@ void Style::cascade(const TimePoint& timePoint) {
|
||||
const StyleCascadeParameters parameters {
|
||||
classIDs,
|
||||
timePoint,
|
||||
data.mode == MapMode::Continuous ? transitionProperties.value_or(immediateTransition) : immediateTransition
|
||||
mode == MapMode::Continuous ? transitionProperties.value_or(immediateTransition) : immediateTransition
|
||||
};
|
||||
|
||||
transitionProperties = {};
|
||||
@@ -200,7 +187,7 @@ void Style::cascade(const TimePoint& timePoint) {
|
||||
}
|
||||
}
|
||||
|
||||
void Style::recalculate(float z, const TimePoint& timePoint) {
|
||||
void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) {
|
||||
for (const auto& source : sources) {
|
||||
source->enabled = false;
|
||||
}
|
||||
@@ -211,7 +198,7 @@ void Style::recalculate(float z, const TimePoint& timePoint) {
|
||||
z,
|
||||
timePoint,
|
||||
zoomHistory,
|
||||
data.mode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Duration::zero()
|
||||
mode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Duration::zero()
|
||||
};
|
||||
|
||||
hasPendingTransitions = false;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <mbgl/source/source.hpp>
|
||||
#include <mbgl/text/glyph_store.hpp>
|
||||
#include <mbgl/sprite/sprite_store.hpp>
|
||||
#include <mbgl/map/mode.hpp>
|
||||
|
||||
#include <mbgl/util/noncopyable.hpp>
|
||||
#include <mbgl/util/chrono.hpp>
|
||||
@@ -19,7 +20,6 @@
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
class MapData;
|
||||
class FileSource;
|
||||
class GlyphAtlas;
|
||||
class GlyphStore;
|
||||
@@ -27,11 +27,9 @@ class SpriteStore;
|
||||
class SpriteAtlas;
|
||||
class LineAtlas;
|
||||
class StyleLayer;
|
||||
class TransformState;
|
||||
class Tile;
|
||||
class Bucket;
|
||||
|
||||
namespace gl { class TexturePool; }
|
||||
class StyleUpdateParameters;
|
||||
|
||||
struct RenderItem {
|
||||
inline RenderItem(const StyleLayer& layer_,
|
||||
@@ -56,7 +54,7 @@ class Style : public GlyphStore::Observer,
|
||||
public Source::Observer,
|
||||
public util::noncopyable {
|
||||
public:
|
||||
Style(MapData&, FileSource&);
|
||||
Style(FileSource&, float pixelRatio);
|
||||
~Style();
|
||||
|
||||
class Observer : public GlyphStore::Observer,
|
||||
@@ -81,10 +79,10 @@ public:
|
||||
|
||||
// Fetch the tiles needed by the current viewport and emit a signal when
|
||||
// a tile is ready so observers can render the tile.
|
||||
void update(const TransformState&, const TimePoint&, gl::TexturePool&);
|
||||
void update(const StyleUpdateParameters&);
|
||||
|
||||
void cascade(const TimePoint&);
|
||||
void recalculate(float z, const TimePoint&);
|
||||
void cascade(const TimePoint&, MapMode);
|
||||
void recalculate(float z, const TimePoint&, MapMode);
|
||||
|
||||
bool hasTransitions() const;
|
||||
|
||||
@@ -114,7 +112,6 @@ public:
|
||||
|
||||
void dumpDebugLogs() const;
|
||||
|
||||
MapData& data;
|
||||
FileSource& fileSource;
|
||||
std::unique_ptr<GlyphStore> glyphStore;
|
||||
std::unique_ptr<GlyphAtlas> glyphAtlas;
|
||||
@@ -145,8 +142,6 @@ private:
|
||||
void onTileError(Source&, const TileID&, std::exception_ptr) override;
|
||||
void onPlacementRedone() override;
|
||||
|
||||
bool shouldReparsePartialTiles = false;
|
||||
|
||||
Observer nullObserver;
|
||||
Observer* observer = &nullObserver;
|
||||
|
||||
@@ -156,6 +151,7 @@ private:
|
||||
bool hasPendingTransitions = false;
|
||||
|
||||
public:
|
||||
bool shouldReparsePartialTiles = false;
|
||||
bool loaded = false;
|
||||
Worker workers;
|
||||
};
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <mbgl/platform/log.hpp>
|
||||
|
||||
#include <mbgl/map/transform.hpp>
|
||||
#include <mbgl/map/map_data.hpp>
|
||||
#include <mbgl/util/worker.hpp>
|
||||
#include <mbgl/gl/texture_pool.hpp>
|
||||
#include <mbgl/style/style.hpp>
|
||||
#include <mbgl/style/style_update_parameters.hpp>
|
||||
#include <mbgl/layer/line_layer.hpp>
|
||||
#include <mbgl/annotation/annotation_manager.hpp>
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
@@ -29,8 +29,8 @@ public:
|
||||
TransformState transformState;
|
||||
Worker worker { 1 };
|
||||
gl::TexturePool texturePool;
|
||||
MapData mapData { MapMode::Still, GLContextMode::Unique, 1.0 };
|
||||
Style style { mapData, fileSource };
|
||||
AnnotationManager annotationManager { 1.0 };
|
||||
Style style { fileSource, 1.0 };
|
||||
|
||||
StyleUpdateParameters updateParameters {
|
||||
1.0,
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
texturePool,
|
||||
true,
|
||||
MapMode::Continuous,
|
||||
mapData,
|
||||
annotationManager,
|
||||
style
|
||||
};
|
||||
|
||||
|
||||
@@ -10,15 +10,14 @@ using namespace mbgl;
|
||||
TEST(Style, UnusedSource) {
|
||||
util::RunLoop loop;
|
||||
|
||||
MapData data { MapMode::Still, GLContextMode::Unique, 1.0 };
|
||||
StubFileSource fileSource;
|
||||
Style style { data, fileSource };
|
||||
Style style { fileSource, 1.0 };
|
||||
|
||||
auto now = Clock::now();
|
||||
|
||||
style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"), "");
|
||||
style.cascade(now);
|
||||
style.recalculate(0, now);
|
||||
style.cascade(now, MapMode::Still);
|
||||
style.recalculate(0, now, MapMode::Still);
|
||||
|
||||
Source *usedSource = style.getSource("usedsource");
|
||||
EXPECT_TRUE(usedSource);
|
||||
@@ -32,9 +31,8 @@ TEST(Style, UnusedSource) {
|
||||
TEST(Style, UnusedSourceActiveViaClassUpdate) {
|
||||
util::RunLoop loop;
|
||||
|
||||
MapData data { MapMode::Still, GLContextMode::Unique, 1.0 };
|
||||
StubFileSource fileSource;
|
||||
Style style { data, fileSource };
|
||||
Style style { fileSource, 1.0 };
|
||||
|
||||
style.setJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"), "");
|
||||
EXPECT_TRUE(style.addClass("visible"));
|
||||
@@ -42,8 +40,8 @@ TEST(Style, UnusedSourceActiveViaClassUpdate) {
|
||||
|
||||
auto now = Clock::now();
|
||||
|
||||
style.cascade(now);
|
||||
style.recalculate(0, now);
|
||||
style.cascade(now, MapMode::Still);
|
||||
style.recalculate(0, now, MapMode::Still);
|
||||
|
||||
Source *unusedSource = style.getSource("unusedsource");
|
||||
EXPECT_TRUE(unusedSource);
|
||||
@@ -55,8 +53,8 @@ TEST(Style, UnusedSourceActiveViaClassUpdate) {
|
||||
|
||||
now = Clock::now();
|
||||
|
||||
style.cascade(now);
|
||||
style.recalculate(0, now);
|
||||
style.cascade(now, MapMode::Still);
|
||||
style.recalculate(0, now, MapMode::Still);
|
||||
|
||||
unusedSource = style.getSource("unusedsource");
|
||||
EXPECT_TRUE(unusedSource);
|
||||
|
||||
Reference in New Issue
Block a user