Skip to content

Commit a8c8951

Browse files
committed
Make Android map snapshotter supports setting region padding
1 parent 5f808e0 commit a8c8951

File tree

5 files changed

+102
-12
lines changed

5 files changed

+102
-12
lines changed

platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
2525
const jni::Object<CameraPosition>& position,
2626
jni::jboolean _showLogo,
2727
jni::jboolean _showAttribution,
28-
const jni::String& _localIdeographFontFamily)
28+
const jni::String& _localIdeographFontFamily,
29+
jni::jint regionPaddingLeft,
30+
jni::jint regionPaddingTop,
31+
jni::jint regionPaddingRight,
32+
jni::jint regionPaddingBottom)
2933
: javaPeer(_env, _obj),
3034
pixelRatio(_pixelRatio) {
3135
// Get a reference to the JavaVM for callbacks
@@ -57,6 +61,10 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
5761
}
5862

5963
if (region) {
64+
snapshotter->setRegionPadding({static_cast<double>(regionPaddingTop),
65+
static_cast<double>(regionPaddingLeft),
66+
static_cast<double>(regionPaddingBottom),
67+
static_cast<double>(regionPaddingRight)});
6068
snapshotter->setRegion(LatLngBounds::getLatLngBounds(_env, region));
6169
}
6270

@@ -138,6 +146,17 @@ void MapSnapshotter::setRegion(JNIEnv& env, const jni::Object<LatLngBounds>& reg
138146
snapshotter->setRegion(LatLngBounds::getLatLngBounds(env, region));
139147
}
140148

149+
void MapSnapshotter::setRegionPadding(JNIEnv&,
150+
jni::jint regionPaddingLeft,
151+
jni::jint regionPaddingTop,
152+
jni::jint regionPaddingRight,
153+
jni::jint regionPaddingBottom) {
154+
snapshotter->setRegionPadding({static_cast<double>(regionPaddingTop),
155+
static_cast<double>(regionPaddingLeft),
156+
static_cast<double>(regionPaddingBottom),
157+
static_cast<double>(regionPaddingRight)});
158+
}
159+
141160
// Private methods //
142161

143162
void MapSnapshotter::activateFilesource(JNIEnv& env) {
@@ -330,7 +349,11 @@ void MapSnapshotter::registerNative(jni::JNIEnv& env) {
330349
const jni::Object<CameraPosition>&,
331350
jni::jboolean,
332351
jni::jboolean,
333-
const jni::String&>,
352+
const jni::String&,
353+
jni::jint,
354+
jni::jint,
355+
jni::jint,
356+
jni::jint>,
334357
"nativeInitialize",
335358
"finalize",
336359
METHOD(&MapSnapshotter::setStyleUrl, "setStyleUrl"),
@@ -345,6 +368,7 @@ void MapSnapshotter::registerNative(jni::JNIEnv& env) {
345368
METHOD(&MapSnapshotter::setSize, "setSize"),
346369
METHOD(&MapSnapshotter::setCameraPosition, "setCameraPosition"),
347370
METHOD(&MapSnapshotter::setRegion, "setRegion"),
371+
METHOD(&MapSnapshotter::setRegionPadding, "setRegionPadding"),
348372
METHOD(&MapSnapshotter::start, "nativeStart"),
349373
METHOD(&MapSnapshotter::cancel, "nativeCancel"));
350374
}

platform/android/MapLibreAndroid/src/cpp/snapshotter/map_snapshotter.hpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ class MapSnapshotter final : public mbgl::MapSnapshotterObserver {
3535
const jni::Object<CameraPosition>& position,
3636
jni::jboolean showLogo,
3737
jni::jboolean _showAttribution,
38-
const jni::String& localIdeographFontFamily);
38+
const jni::String& localIdeographFontFamily,
39+
jni::jint regionPaddingLeft,
40+
jni::jint regionPaddingTop,
41+
jni::jint regionPaddingRight,
42+
jni::jint regionPaddingBottom);
3943

4044
virtual ~MapSnapshotter() override;
4145

@@ -49,6 +53,12 @@ class MapSnapshotter final : public mbgl::MapSnapshotterObserver {
4953

5054
void setRegion(JNIEnv&, const jni::Object<LatLngBounds>& region);
5155

56+
void setRegionPadding(JNIEnv&,
57+
jni::jint,
58+
jni::jint,
59+
jni::jint,
60+
jni::jint);
61+
5262
void start(JNIEnv&);
5363

5464
void cancel(JNIEnv&);

platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/snapshotter/MapSnapshotter.kt

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ open class MapSnapshotter(context: Context, options: Options) {
126126
var region: LatLngBounds? = null
127127
private set
128128

129+
// only works when using region to specify the camera
130+
var regionPadding: IntArray = intArrayOf(0, 0, 0, 0)
131+
private set
132+
129133
/**
130134
* @return the camera position
131135
*/
@@ -204,6 +208,16 @@ open class MapSnapshotter(context: Context, options: Options) {
204208
return this
205209
}
206210

211+
/**
212+
* @param regionPadding of the padding of the region.
213+
* This is applied before the region, if region is null, it will not work
214+
* @return the mutated [Options]
215+
*/
216+
fun withRegionPadding(left:Int, top:Int, right:Int, bottom:Int): Options {
217+
this.regionPadding = intArrayOf(left, top, right, bottom)
218+
return this
219+
}
220+
207221
/**
208222
* @param pixelRatio the pixel ratio to use (default: 1)
209223
* @return the mutated [Options]
@@ -349,7 +363,11 @@ open class MapSnapshotter(context: Context, options: Options) {
349363
options.cameraPosition,
350364
options.showLogo,
351365
options.showAttribution,
352-
options.localIdeographFontFamily
366+
options.localIdeographFontFamily,
367+
options.regionPadding[0],
368+
options.regionPadding[1],
369+
options.regionPadding[2],
370+
options.regionPadding[3]
353371
)
354372
}
355373

@@ -394,6 +412,14 @@ open class MapSnapshotter(context: Context, options: Options) {
394412
@Keep
395413
external fun setRegion(region: LatLngBounds?)
396414

415+
/**
416+
* Updates the snapshotter padding with a new [IntArray]
417+
*
418+
* @param left, top, right, bottom
419+
*/
420+
@Keep
421+
external fun setRegionPadding(left:Int, top:Int, right:Int, bottom:Int)
422+
397423
/**
398424
* Updates the snapshotter with a new style url
399425
*
@@ -746,7 +772,11 @@ open class MapSnapshotter(context: Context, options: Options) {
746772
position: CameraPosition?,
747773
showLogo: Boolean,
748774
showAttribution: Boolean,
749-
localIdeographFontFamily: String?
775+
localIdeographFontFamily: String?,
776+
regionPaddingLeft: Int,
777+
regionPaddingTop: Int,
778+
regionPaddingRight: Int,
779+
regionPaddingBottom: Int
750780
)
751781

752782
@Keep

platform/default/include/mbgl/map/map_snapshotter.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ class MapSnapshotter {
6060
void setRegion(const LatLngBounds&);
6161
LatLngBounds getRegion() const;
6262

63+
void setRegionPadding(const mbgl::EdgeInsets&);
64+
mbgl::EdgeInsets getRegionPadding() const;
65+
6366
style::Style& getStyle();
6467
const style::Style& getStyle() const;
6568

platform/default/src/mbgl/map/map_snapshotter.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,26 @@ class MapSnapshotter::Impl final : public MapObserver {
190190
*this,
191191
MapOptions().withMapMode(MapMode::Static).withSize(size).withPixelRatio(pixelRatio),
192192
resourceOptions,
193-
clientOptions) {}
193+
clientOptions),
194+
region(LatLngBounds::empty()),
195+
regionInsets{0, 0, 0, 0}{}
194196

195-
void setRegion(const LatLngBounds& region) {
196-
mbgl::EdgeInsets insets{0, 0, 0, 0};
197+
void setRegion(const LatLngBounds& _region) {
198+
region = _region;
197199
std::vector<LatLng> latLngs = {region.southwest(), region.northeast()};
198-
map.jumpTo(map.cameraForLatLngs(latLngs, insets));
200+
map.jumpTo(map.cameraForLatLngs(latLngs, regionInsets));
201+
}
202+
203+
void setRegionPadding(const mbgl::EdgeInsets& insets) {
204+
regionInsets = insets;
205+
if (!region.isEmpty()) {
206+
std::vector<LatLng> latLngs = {region.southwest(), region.northeast()};
207+
map.jumpTo(map.cameraForLatLngs(latLngs, regionInsets));
208+
}
209+
}
210+
211+
mbgl::EdgeInsets getRegionPadding() const {
212+
return regionInsets;
199213
}
200214

201215
void snapshot(MapSnapshotter::Callback callback) {
@@ -279,6 +293,8 @@ class MapSnapshotter::Impl final : public MapObserver {
279293
MapSnapshotterObserver& observer;
280294
SnapshotterRendererFrontend frontend;
281295
Map map;
296+
LatLngBounds region;
297+
mbgl::EdgeInsets regionInsets;
282298
};
283299

284300
MapSnapshotter::MapSnapshotter(Size size,
@@ -328,16 +344,23 @@ void MapSnapshotter::setCameraOptions(const CameraOptions& options) {
328344
}
329345

330346
CameraOptions MapSnapshotter::getCameraOptions() const {
331-
EdgeInsets insets;
332-
return impl->getMap().getCameraOptions(insets);
347+
return impl->getMap().getCameraOptions();
333348
}
334349

335350
void MapSnapshotter::setRegion(const LatLngBounds& region) {
336351
impl->setRegion(region);
337352
}
338353

339354
LatLngBounds MapSnapshotter::getRegion() const {
340-
return impl->getMap().latLngBoundsForCamera(getCameraOptions());
355+
return impl->getMap().latLngBoundsForCamera(impl->getMap().getCameraOptions(getRegionPadding()));
356+
}
357+
358+
void MapSnapshotter::setRegionPadding(const mbgl::EdgeInsets &insets) {
359+
impl->setRegionPadding(insets);
360+
}
361+
362+
mbgl::EdgeInsets MapSnapshotter::getRegionPadding() const {
363+
return impl->getRegionPadding();
341364
}
342365

343366
style::Style& MapSnapshotter::getStyle() {

0 commit comments

Comments
 (0)