#ifndef MBGL_MAP_SOURCE #define MBGL_MAP_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class StyleUpdateParameters; class Painter; class FileRequest; class TransformState; class Tile; struct ClipID; struct box; class SourceInfo : private util::noncopyable { public: SourceType type = SourceType::Vector; std::string url; std::vector tiles; uint16_t tile_size = util::tileSize; uint16_t min_zoom = 0; uint16_t max_zoom = 22; std::string attribution; std::array center = {{0, 0, 0}}; std::array bounds = {{-180, -90, 180, 90}}; std::string source_id = ""; void parseTileJSONProperties(const rapidjson::Value&); std::string tileURL(const TileID& id, float pixelRatio) const; }; class Source : private util::noncopyable { public: class Observer { public: virtual ~Observer() = default; virtual void onSourceLoaded() = 0; virtual void onSourceLoadingFailed(std::exception_ptr error) = 0; virtual void onTileLoaded(bool isNewTile) = 0; virtual void onTileLoadingFailed(std::exception_ptr error) = 0; }; Source(); ~Source(); void load(); bool isLoaded() const; // Request or parse all the tiles relevant for the "TransformState". This method // will return true if all the tiles were scheduled for updating of false if // they were not. shouldReparsePartialTiles must be set to "true" if there is // new data available that a tile in the "partial" state might be interested at. bool update(const StyleUpdateParameters&); void updateMatrices(const mat4 &projMatrix, const TransformState &transform); void drawClippingMasks(Painter &painter); void finishRender(Painter &painter); std::forward_list getLoadedTiles() const; const std::vector& getTiles() const; void setCacheSize(size_t); void onLowMemory(); void setObserver(Observer* observer); void dumpDebugLogs() const; SourceInfo info; bool enabled; private: void tileLoadingCompleteCallback(const TileID&, const TransformState&, bool collisionDebug); void emitSourceLoaded(); void emitSourceLoadingFailed(const std::string& message); void emitTileLoaded(bool isNewTile); void emitTileLoadingFailed(const std::string& message); bool handlePartialTile(const TileID &id, Worker &worker); bool findLoadedChildren(const TileID& id, int32_t maxCoveringZoom, std::forward_list& retain); void findLoadedParent(const TileID& id, int32_t minCoveringZoom, std::forward_list& retain); int32_t coveringZoomLevel(const TransformState&) const; std::forward_list coveringTiles(const TransformState&) const; TileData::State addTile(const TileID&, const StyleUpdateParameters&); TileData::State hasTile(const TileID&); void updateTilePtrs(); double getZoom(const TransformState &state) const; bool loaded = false; // Stores the time when this source was most recently updated. TimePoint updated = TimePoint::min(); std::map> tiles; std::vector tilePtrs; std::map> tileDataMap; TileCache cache; std::unique_ptr req; Observer* observer_ = nullptr; }; } #endif