| 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 | |