Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
Merge pull request #1326 from mapbox/925-remove_promises
Browse files Browse the repository at this point in the history
Remove promises from the parsing pipeline
  • Loading branch information
jfirebaugh committed May 5, 2015
2 parents 81e6c2c + 19881f8 commit 6260dbe
Show file tree
Hide file tree
Showing 21 changed files with 568 additions and 204 deletions.
2 changes: 0 additions & 2 deletions include/mbgl/storage/request.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ namespace mbgl {
class Response;

class Request : private util::noncopyable {
MBGL_STORE_THREAD(tid)

public:
using Callback = std::function<void(const Response &)>;
Request(const Resource &resource, uv_loop_t *loop, Callback callback);
Expand Down
1 change: 0 additions & 1 deletion src/mbgl/map/environment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ void Environment::requestAsync(const Resource& resource,

Request* Environment::request(const Resource& resource,
std::function<void(const Response&)> callback) {
assert(currentlyOn(ThreadType::Map));
return fileSource.request(resource, util::RunLoop::current.get()->get(), std::move(callback));
}

Expand Down
56 changes: 17 additions & 39 deletions src/mbgl/map/map_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <mbgl/map/view.hpp>
#include <mbgl/map/environment.hpp>
#include <mbgl/map/source.hpp>
#include <mbgl/map/sprite.hpp>
#include <mbgl/map/still_image.hpp>

#include <mbgl/platform/log.hpp>
Expand Down Expand Up @@ -62,8 +61,8 @@ MapContext::~MapContext() {

// Explicit resets currently necessary because these abandon resources that need to be
// cleaned up by env.performCleanup();
resourceLoader.reset();
style.reset();
sprite.reset();
painter.reset();
texturePool.reset();
lineAtlas.reset();
Expand Down Expand Up @@ -124,24 +123,10 @@ void MapContext::setStyleJSON(const std::string& json, const std::string& base)
loadStyleJSON(json, base);
}

util::ptr<Sprite> MapContext::getSprite() {
assert(Environment::currentlyOn(ThreadType::Map));
const float pixelRatio = transformState.getPixelRatio();
const std::string &sprite_url = style->getSpriteURL();
if (!sprite || !sprite->hasPixelRatio(pixelRatio)) {
sprite = std::make_shared<Sprite>(sprite_url, pixelRatio, env, [this] {
assert(Environment::currentlyOn(ThreadType::Map));
triggerUpdate();
});
}

return sprite;
}

void MapContext::loadStyleJSON(const std::string& json, const std::string& base) {
assert(Environment::currentlyOn(ThreadType::Map));

sprite.reset();
resourceLoader.reset();
style.reset();

style = util::make_unique<Style>();
Expand All @@ -153,26 +138,19 @@ void MapContext::loadStyleJSON(const std::string& json, const std::string& base)
const std::string glyphURL = util::mapbox::normalizeGlyphsURL(style->glyph_url, data.getAccessToken());
glyphStore->setURL(glyphURL);

for (const auto& source : style->sources) {
source->load(data.getAccessToken(), env, [this]() {
assert(Environment::currentlyOn(ThreadType::Map));
triggerUpdate();
});
}
resourceLoader = util::make_unique<ResourceLoader>();
resourceLoader->setAccessToken(data.getAccessToken());
resourceLoader->setObserver(this);
resourceLoader->setStyle(style.get());

triggerUpdate(Update::Zoom);
}

void MapContext::updateTiles() {
assert(Environment::currentlyOn(ThreadType::Map));
if (!style) return;
for (const auto& source : style->sources) {
source->update(data, transformState, *style, *glyphAtlas, *glyphStore, *spriteAtlas,
getSprite(), *texturePool, [this]() {
assert(Environment::currentlyOn(ThreadType::Map));
triggerUpdate();
});
}

resourceLoader->update(data, transformState, *glyphAtlas, *glyphStore,
*spriteAtlas, *texturePool);
}

void MapContext::updateAnnotationTiles(const std::vector<TileID>& ids) {
Expand Down Expand Up @@ -214,13 +192,9 @@ void MapContext::update() {
style->recalculate(transformState.getNormalizedZoom(), now);
}

// Allow the sprite atlas to potentially pull new sprite images if needed.
spriteAtlas->resize(transformState.getPixelRatio());
spriteAtlas->setSprite(getSprite());

updateTiles();

if (sprite->isLoaded() && style->isLoaded()) {
if (style->isLoaded()) {
if (!data.getFullyLoaded()) {
data.setFullyLoaded(true);
}
Expand Down Expand Up @@ -260,7 +234,7 @@ void MapContext::render() {

painter->render(*style, transformState, data.getAnimationTime());

if (data.mode == MapMode::Still && callback && style->isLoaded() && getSprite()->isLoaded()) {
if (data.mode == MapMode::Still && callback && style->isLoaded() && resourceLoader->getSprite()->isLoaded()) {
callback(view.readStillImage());
callback = nullptr;
}
Expand All @@ -273,8 +247,7 @@ void MapContext::render() {

double MapContext::getTopOffsetPixelsForAnnotationSymbol(const std::string& symbol) {
assert(Environment::currentlyOn(ThreadType::Map));
assert(sprite);
const SpritePosition pos = sprite->getSpritePosition(symbol);
const SpritePosition pos = resourceLoader->getSprite()->getSpritePosition(symbol);
return -pos.height / pos.pixelRatio / 2;
}

Expand All @@ -299,4 +272,9 @@ void MapContext::onLowMemory() {
view.invalidate([this] { render(); });
}

void MapContext::onTileDataChanged() {
assert(Environment::currentlyOn(ThreadType::Map));
triggerUpdate();
}

}
9 changes: 6 additions & 3 deletions src/mbgl/map/map_context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <mbgl/map/tile_id.hpp>
#include <mbgl/map/update.hpp>
#include <mbgl/map/environment.hpp>
#include <mbgl/map/resource_loader.hpp>
#include <mbgl/map/transform_state.hpp>
#include <mbgl/util/ptr.hpp>

Expand Down Expand Up @@ -32,7 +33,7 @@ class StillImage;
struct LatLng;
struct LatLngBounds;

class MapContext {
class MapContext : public ResourceLoader::Observer {
public:
MapContext(uv_loop_t*, View&, FileSource&, MapData&, bool startPaused);
~MapContext();
Expand All @@ -58,6 +59,9 @@ class MapContext {
void setSourceTileCacheSize(size_t size);
void onLowMemory();

// ResourceLoader::Observer implementation.
void onTileDataChanged() override;

private:
util::ptr<Sprite> getSprite();
void updateTiles();
Expand All @@ -84,8 +88,7 @@ class MapContext {
std::unique_ptr<TexturePool> texturePool;
std::unique_ptr<Painter> painter;
std::unique_ptr<Style> style;

util::ptr<Sprite> sprite;
std::unique_ptr<ResourceLoader> resourceLoader;

std::string styleURL;
std::string styleJSON;
Expand Down
99 changes: 99 additions & 0 deletions src/mbgl/map/resource_loader.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#include <mbgl/map/resource_loader.hpp>

#include <mbgl/geometry/sprite_atlas.hpp>
#include <mbgl/map/environment.hpp>
#include <mbgl/map/source.hpp>
#include <mbgl/map/sprite.hpp>
#include <mbgl/map/transform.hpp>
#include <mbgl/style/style.hpp>

#include <cassert>

namespace mbgl {

ResourceLoader::ResourceLoader() {
assert(Environment::currentlyOn(ThreadType::Map));
}

ResourceLoader::~ResourceLoader() {
assert(Environment::currentlyOn(ThreadType::Map));

for (const auto& source : style_->sources) {
source->setObserver(nullptr);
}

sprite_->setObserver(nullptr);
}

void ResourceLoader::setObserver(Observer* observer) {
assert(Environment::currentlyOn(ThreadType::Map));
assert(!observer_);

observer_ = observer;
}

void ResourceLoader::setStyle(Style* style) {
assert(style);

style_ = style;

for (const auto& source : style->sources) {
source->setObserver(this);
source->load(accessToken_);
}
}

void ResourceLoader::setAccessToken(const std::string& accessToken) {
accessToken_ = accessToken;
}

void ResourceLoader::update(MapData& data,
const TransformState& transform,
GlyphAtlas& glyphAtlas,
GlyphStore& glyphStore,
SpriteAtlas& spriteAtlas,
TexturePool& texturePool) {
if (!style_) {
return;
}

const float pixelRatio = transform.getPixelRatio();
if (!sprite_ || !sprite_->hasPixelRatio(pixelRatio)) {
sprite_ = util::make_unique<Sprite>(style_->getSpriteURL(), pixelRatio);
sprite_->setObserver(this);

spriteAtlas.resize(pixelRatio);
spriteAtlas.setSprite(sprite_);
}

for (const auto& source : style_->sources) {
source->update(
data, transform, *style_, glyphAtlas, glyphStore, spriteAtlas, sprite_, texturePool);
}
}

void ResourceLoader::onGlyphRangeLoaded() {
emitTileDataChanged();
}

void ResourceLoader::onSourceLoaded() {
emitTileDataChanged();
}

void ResourceLoader::onTileLoaded() {
emitTileDataChanged();
}

void ResourceLoader::onSpriteLoaded() {
emitTileDataChanged();
}

void ResourceLoader::emitTileDataChanged() {
assert(Environment::currentlyOn(ThreadType::Map));

if (observer_) {
observer_->onTileDataChanged();
}
}

}
80 changes: 80 additions & 0 deletions src/mbgl/map/resource_loader.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#ifndef MBGL_MAP_RESOURCE_LOADER
#define MBGL_MAP_RESOURCE_LOADER

#include <mbgl/map/source.hpp>
#include <mbgl/map/sprite.hpp>
#include <mbgl/text/glyph_store.hpp>
#include <mbgl/util/noncopyable.hpp>

#include <string>

namespace mbgl {

class GlyphAtlas;
class GlyphStore;
class MapData;
class SpriteAtlas;
class Style;
class TexturePool;
class TransformState;

// ResourceLoader is responsible for loading and updating the Source(s) owned
// by the Style. The Source object currently owns all the tiles, thus this
// class will notify its observers of any change on these tiles which will
// ultimately cause a new rendering to be triggered.
class ResourceLoader : public GlyphStore::Observer,
public Source::Observer,
public Sprite::Observer,
private util::noncopyable {
public:
class Observer {
public:
virtual ~Observer() = default;

virtual void onTileDataChanged() = 0;
};

ResourceLoader();
~ResourceLoader();

void setObserver(Observer* observer);

// The style object currently owns all the sources. When setting
// a new style we will go through all of them and try to load.
void setStyle(Style* style);

// Set the access token to be used for loading the tile data.
void setAccessToken(const std::string& accessToken);

// 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(MapData&, const TransformState&, GlyphAtlas&, GlyphStore&,
SpriteAtlas&, TexturePool&);

// FIXME: There is probably a better place for this.
inline util::ptr<Sprite> getSprite() const {
return sprite_;
}

// GlyphStore::Observer implementation.
void onGlyphRangeLoaded() override;

// Source::Observer implementation.
void onSourceLoaded() override;
void onTileLoaded() override;

// Sprite::Observer implementation.
void onSpriteLoaded() override;

private:
void emitTileDataChanged();

std::string accessToken_;
util::ptr<Sprite> sprite_;
Style* style_ = nullptr;
Observer* observer_ = nullptr;
};

}

#endif
Loading

0 comments on commit 6260dbe

Please sign in to comment.