1 #pragma once
2 
3 #include <mbgl/map/mode.hpp>
4 #include <mbgl/tile/tile_id.hpp>
5 #include <mbgl/style/image_impl.hpp>
6 #include <mbgl/text/glyph.hpp>
7 #include <mbgl/actor/actor_ref.hpp>
8 #include <mbgl/util/optional.hpp>
9 #include <mbgl/util/immutable.hpp>
10 #include <mbgl/style/layer_impl.hpp>
11 #include <mbgl/geometry/feature_index.hpp>
12 #include <mbgl/renderer/bucket.hpp>
13 
14 #include <atomic>
15 #include <memory>
16 
17 namespace mbgl {
18 
19 class GeometryTile;
20 class GeometryTileData;
21 class SymbolLayout;
22 
23 namespace style {
24 class Layer;
25 } // namespace style
26 
27 class GeometryTileWorker {
28 public:
29     GeometryTileWorker(ActorRef<GeometryTileWorker> self,
30                        ActorRef<GeometryTile> parent,
31                        OverscaledTileID,
32                        const std::string&,
33                        const std::atomic<bool>&,
34                        const MapMode,
35                        const float pixelRatio,
36                        const bool showCollisionBoxes_);
37     ~GeometryTileWorker();
38 
39     void setLayers(std::vector<Immutable<style::Layer::Impl>>, uint64_t correlationID);
40     void setData(std::unique_ptr<const GeometryTileData>, uint64_t correlationID);
41     void setShowCollisionBoxes(bool showCollisionBoxes_, uint64_t correlationID_);
42 
43     void onGlyphsAvailable(GlyphMap glyphs);
44     void onImagesAvailable(ImageMap images, uint64_t imageCorrelationID);
45 
46 private:
47     void coalesced();
48     void parse();
49     void performSymbolLayout();
50 
51     void coalesce();
52 
53     void requestNewGlyphs(const GlyphDependencies&);
54     void requestNewImages(const ImageDependencies&);
55 
56     void symbolDependenciesChanged();
57     bool hasPendingSymbolDependencies() const;
58     bool hasPendingParseResult() const;
59 
60     ActorRef<GeometryTileWorker> self;
61     ActorRef<GeometryTile> parent;
62 
63     const OverscaledTileID id;
64     const std::string sourceID;
65     const std::atomic<bool>& obsolete;
66     const MapMode mode;
67     const float pixelRatio;
68 
69     std::unique_ptr<FeatureIndex> featureIndex;
70     std::unordered_map<std::string, std::shared_ptr<Bucket>> buckets;
71 
72     enum State {
73         Idle,
74         Coalescing,
75         NeedsParse,
76         NeedsSymbolLayout
77     };
78 
79     State state = Idle;
80     uint64_t correlationID = 0;
81     uint64_t imageCorrelationID = 0;
82 
83     // Outer optional indicates whether we've received it or not.
84     optional<std::vector<Immutable<style::Layer::Impl>>> layers;
85     optional<std::unique_ptr<const GeometryTileData>> data;
86 
87     bool symbolLayoutsNeedPreparation = false;
88     std::vector<std::unique_ptr<SymbolLayout>> symbolLayouts;
89     GlyphDependencies pendingGlyphDependencies;
90     ImageDependencies pendingImageDependencies;
91     GlyphMap glyphMap;
92     ImageMap imageMap;
93 
94     bool showCollisionBoxes;
95     bool firstLoad = true;
96 };
97 
98 } // namespace mbgl
99