1#include <mbgl/renderer/sources/render_geojson_source.hpp>
2#include <mbgl/renderer/render_tile.hpp>
3#include <mbgl/renderer/paint_parameters.hpp>
4#include <mbgl/tile/geojson_tile.hpp>
5#include <mbgl/renderer/tile_parameters.hpp>
6
7#include <mbgl/algorithm/generate_clip_ids.hpp>
8#include <mbgl/algorithm/generate_clip_ids_impl.hpp>
9
10namespace mbgl {
11
12using namespace style;
13
14RenderGeoJSONSource::RenderGeoJSONSource(Immutable<style::GeoJSONSource::Impl> impl_)
15 : RenderSource(impl_) {
16 tilePyramid.setObserver(this);
17}
18
19const style::GeoJSONSource::Impl& RenderGeoJSONSource::impl() const {
20 return static_cast<const style::GeoJSONSource::Impl&>(*baseImpl);
21}
22
23bool RenderGeoJSONSource::isLoaded() const {
24 return tilePyramid.isLoaded();
25}
26
27void RenderGeoJSONSource::update(Immutable<style::Source::Impl> baseImpl_,
28 const std::vector<Immutable<Layer::Impl>>& layers,
29 const bool needsRendering,
30 const bool needsRelayout,
31 const TileParameters& parameters) {
32 std::swap(a&: baseImpl, b&: baseImpl_);
33
34 enabled = needsRendering;
35
36 GeoJSONData* data_ = impl().getData();
37
38 if (data_ != data) {
39 data = data_;
40 tilePyramid.cache.clear();
41
42 if (data) {
43 const uint8_t maxZ = impl().getZoomRange().max;
44 for (const auto& pair : tilePyramid.tiles) {
45 if (pair.first.canonical.z <= maxZ) {
46 static_cast<GeoJSONTile*>(pair.second.get())->updateData(data->getTile(pair.first.canonical));
47 }
48 }
49 }
50 }
51
52 if (!data) {
53 tilePyramid.tiles.clear();
54 tilePyramid.renderTiles.clear();
55 return;
56 }
57
58 tilePyramid.update(layers,
59 needsRendering,
60 needsRelayout,
61 parameters,
62 type: SourceType::GeoJSON,
63 tileSize: util::tileSize,
64 zoomRange: impl().getZoomRange(),
65 bounds: optional<LatLngBounds>{},
66 createTile: [&] (const OverscaledTileID& tileID) {
67 return std::make_unique<GeoJSONTile>(args: tileID, args: impl().id, args: parameters, args: data->getTile(tileID.canonical));
68 });
69}
70
71void RenderGeoJSONSource::startRender(PaintParameters& parameters) {
72 parameters.clipIDGenerator.update(renderables: tilePyramid.getRenderTiles());
73 tilePyramid.startRender(parameters);
74}
75
76void RenderGeoJSONSource::finishRender(PaintParameters& parameters) {
77 tilePyramid.finishRender(parameters);
78}
79
80std::vector<std::reference_wrapper<RenderTile>> RenderGeoJSONSource::getRenderTiles() {
81 return tilePyramid.getRenderTiles();
82}
83
84std::unordered_map<std::string, std::vector<Feature>>
85RenderGeoJSONSource::queryRenderedFeatures(const ScreenLineString& geometry,
86 const TransformState& transformState,
87 const std::vector<const RenderLayer*>& layers,
88 const RenderedQueryOptions& options,
89 const mat4& projMatrix) const {
90 return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix);
91}
92
93std::vector<Feature> RenderGeoJSONSource::querySourceFeatures(const SourceQueryOptions& options) const {
94 return tilePyramid.querySourceFeatures(options);
95}
96
97void RenderGeoJSONSource::reduceMemoryUse() {
98 tilePyramid.reduceMemoryUse();
99}
100
101void RenderGeoJSONSource::dumpDebugLogs() const {
102 tilePyramid.dumpDebugLogs();
103}
104
105} // namespace mbgl
106

source code of qtlocation/src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_geojson_source.cpp