1 #pragma once
2 
3 #include <mbgl/util/optional.hpp>
4 #include <mbgl/util/chrono.hpp>
5 #include <mbgl/map/map_observer.hpp>
6 #include <mbgl/map/mode.hpp>
7 #include <mbgl/util/noncopyable.hpp>
8 #include <mbgl/util/size.hpp>
9 #include <mbgl/annotation/annotation.hpp>
10 #include <mbgl/map/camera.hpp>
11 #include <mbgl/util/geometry.hpp>
12 
13 #include <cstdint>
14 #include <string>
15 #include <functional>
16 #include <vector>
17 #include <memory>
18 
19 namespace mbgl {
20 
21 class FileSource;
22 class Scheduler;
23 class RendererFrontend;
24 
25 namespace style {
26 class Image;
27 class Style;
28 } // namespace style
29 
30 class Map : private util::noncopyable {
31 public:
32     explicit Map(RendererFrontend&,
33                  MapObserver&,
34                  Size size,
35                  float pixelRatio,
36                  FileSource&,
37                  Scheduler&,
38                  MapMode mapMode = MapMode::Continuous,
39                  ConstrainMode constrainMode = ConstrainMode::HeightOnly,
40                  ViewportMode viewportMode = ViewportMode::Default);
41     ~Map();
42 
43     // Register a callback that will get called (on the render thread) when all resources have
44     // been loaded and a complete render occurs.
45     using StillImageCallback = std::function<void (std::exception_ptr)>;
46     void renderStill(StillImageCallback);
47     void renderStill(const CameraOptions&, MapDebugOptions, StillImageCallback);
48 
49     // Triggers a repaint.
50     void triggerRepaint();
51 
52           style::Style& getStyle();
53     const style::Style& getStyle() const;
54 
55     void setStyle(std::unique_ptr<style::Style>);
56 
57     // Transition
58     void cancelTransitions();
59     void setGestureInProgress(bool);
60     bool isGestureInProgress() const;
61     bool isRotating() const;
62     bool isScaling() const;
63     bool isPanning() const;
64 
65     // Camera
66     CameraOptions getCameraOptions(const EdgeInsets&) const;
67     void jumpTo(const CameraOptions&);
68     void easeTo(const CameraOptions&, const AnimationOptions&);
69     void flyTo(const CameraOptions&, const AnimationOptions&);
70     CameraOptions cameraForLatLngBounds(const LatLngBounds&, const EdgeInsets&, optional<double> bearing = {}, optional<double> pitch = {}) const;
71     CameraOptions cameraForLatLngs(const std::vector<LatLng>&, const EdgeInsets&, optional<double> bearing = {}, optional<double> pitch = {}) const;
72     CameraOptions cameraForGeometry(const Geometry<double>&, const EdgeInsets&, optional<double> bearing = {}, optional<double> pitch = {}) const;
73     LatLngBounds latLngBoundsForCamera(const CameraOptions&) const;
74 
75     // Position
76     void moveBy(const ScreenCoordinate&, const AnimationOptions& = {});
77     void setLatLng(const LatLng&, optional<ScreenCoordinate>, const AnimationOptions& = {});
78     void setLatLng(const LatLng&, const EdgeInsets&, const AnimationOptions& = {});
79     void setLatLng(const LatLng&, const AnimationOptions& = {});
80     LatLng getLatLng(const EdgeInsets& = {}) const;
81     void resetPosition(const EdgeInsets& = {});
82 
83     // Zoom
84     void setZoom(double zoom, const AnimationOptions& = {});
85     void setZoom(double zoom, optional<ScreenCoordinate>, const AnimationOptions& = {});
86     void setZoom(double zoom, const EdgeInsets&, const AnimationOptions& = {});
87     double getZoom() const;
88     void setLatLngZoom(const LatLng&, double zoom, const AnimationOptions& = {});
89     void setLatLngZoom(const LatLng&, double zoom, const EdgeInsets&, const AnimationOptions& = {});
90     void resetZoom();
91 
92     // Bounds
93     void setLatLngBounds(optional<LatLngBounds>);
94     optional<LatLngBounds> getLatLngBounds() const;
95     void setMinZoom(double);
96     double getMinZoom() const;
97     void setMaxZoom(double);
98     double getMaxZoom() const;
99     void setMinPitch(double);
100     double getMinPitch() const;
101     void setMaxPitch(double);
102     double getMaxPitch() const;
103 
104     // Rotation
105     void rotateBy(const ScreenCoordinate& first, const ScreenCoordinate& second, const AnimationOptions& = {});
106     void setBearing(double degrees, const AnimationOptions& = {});
107     void setBearing(double degrees, optional<ScreenCoordinate>, const AnimationOptions& = {});
108     void setBearing(double degrees, const EdgeInsets&, const AnimationOptions& = {});
109     double getBearing() const;
110     void resetNorth(const AnimationOptions& = {{mbgl::Milliseconds(500)}});
111     void resetNorth(const EdgeInsets&, const AnimationOptions& = {{mbgl::Milliseconds(500)}});
112 
113     // Pitch
114     void setPitch(double pitch, const AnimationOptions& = {});
115     void setPitch(double pitch, optional<ScreenCoordinate>, const AnimationOptions& = {});
116     double getPitch() const;
117 
118     // North Orientation
119     void setNorthOrientation(NorthOrientation);
120     NorthOrientation getNorthOrientation() const;
121 
122     // Constrain mode
123     void setConstrainMode(ConstrainMode);
124     ConstrainMode getConstrainMode() const;
125 
126     // Viewport mode
127     void setViewportMode(ViewportMode);
128     ViewportMode getViewportMode() const;
129 
130     // Projection mode
131     void setAxonometric(bool);
132     bool getAxonometric() const;
133     void setXSkew(double ySkew);
134     double getXSkew() const;
135     void setYSkew(double ySkew);
136     double getYSkew() const;
137 
138     // Size
139     void setSize(Size);
140     Size getSize() const;
141 
142     // Projection
143     ScreenCoordinate pixelForLatLng(const LatLng&) const;
144     LatLng latLngForPixel(const ScreenCoordinate&) const;
145 
146     // Annotations
147     void addAnnotationImage(std::unique_ptr<style::Image>);
148     void removeAnnotationImage(const std::string&);
149     double getTopOffsetPixelsForAnnotationImage(const std::string&);
150 
151     AnnotationID addAnnotation(const Annotation&);
152     void updateAnnotation(AnnotationID, const Annotation&);
153     void removeAnnotation(AnnotationID);
154 
155     // Tile prefetching
156     //
157     // When loading a map, if `PrefetchZoomDelta` is set to any number greater than 0, the map will
158     // first request a tile for `zoom = getZoom() - delta` in a attempt to display a full map at
159     // lower resolution as quick as possible. It will get clamped at the tile source minimum zoom.
160     // The default `delta` is 4.
161     void setPrefetchZoomDelta(uint8_t delta);
162     uint8_t getPrefetchZoomDelta() const;
163 
164     // Debug
165     void setDebug(MapDebugOptions);
166     void cycleDebugOptions();
167     MapDebugOptions getDebug() const;
168 
169     bool isFullyLoaded() const;
170     void dumpDebugLogs() const;
171 
172 private:
173     class Impl;
174     const std::unique_ptr<Impl> impl;
175 };
176 
177 } // namespace mbgl
178