summaryrefslogtreecommitdiff
path: root/src/mbgl/map/map_context.hpp
blob: 81e757c4cf271ecb64e672241881dc1102b82f6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#ifndef MBGL_MAP_MAP_CONTEXT
#define MBGL_MAP_MAP_CONTEXT

#include <mbgl/map/tile_id.hpp>
#include <mbgl/map/update.hpp>
#include <mbgl/map/environment.hpp>
#include <mbgl/map/transform_state.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/util/ptr.hpp>

#include <vector>

typedef struct uv_loop_s uv_loop_t;

namespace uv {
class async;
}

namespace mbgl {

class View;
class MapData;
class TexturePool;
class Painter;
class Sprite;
class Worker;
class StillImage;
struct LatLng;
struct LatLngBounds;

class MapContext : public Style::Observer {
public:
    MapContext(uv_loop_t*, View&, FileSource&, MapData&);
    ~MapContext();

    void pause();
    void render();

    void resize(uint16_t width, uint16_t height, float ratio);

    using StillImageCallback = std::function<void(std::exception_ptr, std::unique_ptr<const StillImage>)>;
    void renderStill(StillImageCallback callback);

    void triggerUpdate(Update = Update::Nothing);

    void setStyleURL(const std::string&);
    void setStyleJSON(const std::string& json, const std::string& base);
    std::string getStyleURL() const { return styleURL; }
    std::string getStyleJSON() const { return styleJSON; }

    double getTopOffsetPixelsForAnnotationSymbol(const std::string& symbol);
    void updateAnnotationTiles(const std::vector<TileID>&);

    void setSourceTileCacheSize(size_t size);
    void onLowMemory();

    void cleanup();

    // Style::Observer implementation.
    void onTileDataChanged() override;
    void onResourceLoadingFailed(std::exception_ptr error) override;

private:
    void updateTiles();

    // Update the state indicated by the accumulated Update flags, then render.
    void update();

    // Loads the actual JSON object an creates a new Style object.
    void loadStyleJSON(const std::string& json, const std::string& base);

    View& view;
    MapData& data;

    Environment env;
    EnvironmentScope envScope;

    UpdateType updated { static_cast<UpdateType>(Update::Nothing) };
    std::unique_ptr<uv::async> asyncUpdate;

    std::unique_ptr<TexturePool> texturePool;
    std::unique_ptr<Painter> painter;
    std::unique_ptr<Style> style;

    std::string styleURL;
    std::string styleJSON;

    StillImageCallback callback;
    size_t sourceCacheSize;
    TransformState transformState;
};

}

#endif