diff --git a/platform/android/Makefile b/platform/android/Makefile index ac4e8fdd7..6eebedc40 100644 --- a/platform/android/Makefile +++ b/platform/android/Makefile @@ -59,7 +59,7 @@ MLN_ANDROID_GRADLE_SINGLE_JOB = ./gradlew --parallel --max-workers=1 -Pmapbox.bu # Generate code based on the style specification .PHONY: android-style-code android-style-code: - node scripts/generate-style-code.js + node scripts/generate-style-code.mjs style-code: android-style-code define ANDROID_RULES diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/background_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/background_layer.cpp index 5269cbb4b..5dbf4aa92 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/background_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/background_layer.cpp @@ -40,56 +40,94 @@ BackgroundLayer::~BackgroundLayer() = default; jni::Local> BackgroundLayer::getBackgroundColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toBackgroundLayer(layer).getBackgroundColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::BackgroundLayer::getDefaultBackgroundColor())); + } + return std::move(*convert>>(env, toBackgroundLayer(*layer).getBackgroundColor())); } jni::Local> BackgroundLayer::getBackgroundColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toBackgroundLayer(layer).getBackgroundColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toBackgroundLayer(*layer).getBackgroundColorTransition(); return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toBackgroundLayer(layer).setBackgroundColorTransition(options); + toBackgroundLayer(*layer).setBackgroundColorTransition(options); } jni::Local> BackgroundLayer::getBackgroundPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toBackgroundLayer(layer).getBackgroundPattern())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::BackgroundLayer::getDefaultBackgroundPattern())); + } + return std::move(*convert>>(env, toBackgroundLayer(*layer).getBackgroundPattern())); } jni::Local> BackgroundLayer::getBackgroundPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toBackgroundLayer(layer).getBackgroundPatternTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toBackgroundLayer(*layer).getBackgroundPatternTransition(); return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toBackgroundLayer(layer).setBackgroundPatternTransition(options); + toBackgroundLayer(*layer).setBackgroundPatternTransition(options); } jni::Local> BackgroundLayer::getBackgroundOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toBackgroundLayer(layer).getBackgroundOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::BackgroundLayer::getDefaultBackgroundOpacity())); + } + return std::move(*convert>>(env, toBackgroundLayer(*layer).getBackgroundOpacity())); } jni::Local> BackgroundLayer::getBackgroundOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toBackgroundLayer(layer).getBackgroundOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toBackgroundLayer(*layer).getBackgroundOpacityTransition(); return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toBackgroundLayer(layer).setBackgroundOpacityTransition(options); + toBackgroundLayer(*layer).setBackgroundOpacityTransition(options); } // BackgroundJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/circle_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/circle_layer.cpp index d7acc91ec..a0789e934 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/circle_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/circle_layer.cpp @@ -41,166 +41,280 @@ CircleLayer::~CircleLayer() = default; jni::Local> CircleLayer::getCircleSortKey(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleSortKey())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleSortKey())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleSortKey())); } jni::Local> CircleLayer::getCircleRadius(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleRadius())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleRadius())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleRadius())); } jni::Local> CircleLayer::getCircleRadiusTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleRadiusTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleRadiusTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleRadiusTransition(options); + toCircleLayer(*layer).setCircleRadiusTransition(options); } jni::Local> CircleLayer::getCircleColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleColor())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleColor())); } jni::Local> CircleLayer::getCircleColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleColorTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleColorTransition(options); + toCircleLayer(*layer).setCircleColorTransition(options); } jni::Local> CircleLayer::getCircleBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleBlur())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleBlur())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleBlur())); } jni::Local> CircleLayer::getCircleBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleBlurTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleBlurTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleBlurTransition(options); + toCircleLayer(*layer).setCircleBlurTransition(options); } jni::Local> CircleLayer::getCircleOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleOpacity())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleOpacity())); } jni::Local> CircleLayer::getCircleOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleOpacityTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleOpacityTransition(options); + toCircleLayer(*layer).setCircleOpacityTransition(options); } jni::Local> CircleLayer::getCircleTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleTranslate())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleTranslate())); } jni::Local> CircleLayer::getCircleTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleTranslateTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleTranslateTransition(options); + toCircleLayer(*layer).setCircleTranslateTransition(options); } jni::Local> CircleLayer::getCircleTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleTranslateAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::CircleLayer::getDefaultCircleTranslateAnchor())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleTranslateAnchor())); } jni::Local> CircleLayer::getCirclePitchScale(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCirclePitchScale())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCirclePitchScale())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCirclePitchScale())); } jni::Local> CircleLayer::getCirclePitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCirclePitchAlignment())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::CircleLayer::getDefaultCirclePitchAlignment())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCirclePitchAlignment())); } jni::Local> CircleLayer::getCircleStrokeWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleStrokeWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleStrokeWidth())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleStrokeWidth())); } jni::Local> CircleLayer::getCircleStrokeWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleStrokeWidthTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleStrokeWidthTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleStrokeWidthTransition(options); + toCircleLayer(*layer).setCircleStrokeWidthTransition(options); } jni::Local> CircleLayer::getCircleStrokeColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleStrokeColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleStrokeColor())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleStrokeColor())); } jni::Local> CircleLayer::getCircleStrokeColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleStrokeColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleStrokeColorTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleStrokeColorTransition(options); + toCircleLayer(*layer).setCircleStrokeColorTransition(options); } jni::Local> CircleLayer::getCircleStrokeOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toCircleLayer(layer).getCircleStrokeOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::CircleLayer::getDefaultCircleStrokeOpacity())); + } + return std::move(*convert>>(env, toCircleLayer(*layer).getCircleStrokeOpacity())); } jni::Local> CircleLayer::getCircleStrokeOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toCircleLayer(layer).getCircleStrokeOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toCircleLayer(*layer).getCircleStrokeOpacityTransition(); return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toCircleLayer(layer).setCircleStrokeOpacityTransition(options); + toCircleLayer(*layer).setCircleStrokeOpacityTransition(options); } // CircleJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_extrusion_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_extrusion_layer.cpp index 5a427b909..75b52dd1c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_extrusion_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_extrusion_layer.cpp @@ -41,122 +41,211 @@ FillExtrusionLayer::~FillExtrusionLayer() = default; jni::Local> FillExtrusionLayer::getFillExtrusionOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionOpacity())); + } + return std::move(*convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionOpacity())); } jni::Local> FillExtrusionLayer::getFillExtrusionOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionOpacityTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionOpacityTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionOpacityTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionColor())); + } + return std::move(*convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionColor())); } jni::Local> FillExtrusionLayer::getFillExtrusionColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionColorTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionColorTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionColorTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionTranslate())); + } + return std::move( + *convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionTranslate())); } jni::Local> FillExtrusionLayer::getFillExtrusionTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionTranslateTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionTranslateTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionTranslateTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>( + env, style::FillExtrusionLayer::getDefaultFillExtrusionTranslateAnchor())); + } return std::move( - *convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionTranslateAnchor())); + *convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionTranslateAnchor())); } jni::Local> FillExtrusionLayer::getFillExtrusionPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionPattern())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionPattern())); + } + return std::move(*convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionPattern())); } jni::Local> FillExtrusionLayer::getFillExtrusionPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionPatternTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionPatternTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionPatternTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionPatternTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionHeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionHeight())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionHeight())); + } + return std::move(*convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionHeight())); } jni::Local> FillExtrusionLayer::getFillExtrusionHeightTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionHeightTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionHeightTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionHeightTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionHeightTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionHeightTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionBase(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionBase())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::FillExtrusionLayer::getDefaultFillExtrusionBase())); + } + return std::move(*convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionBase())); } jni::Local> FillExtrusionLayer::getFillExtrusionBaseTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillExtrusionLayer(layer).getFillExtrusionBaseTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillExtrusionLayer(*layer).getFillExtrusionBaseTransition(); return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionBaseTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillExtrusionLayer(layer).setFillExtrusionBaseTransition(options); + toFillExtrusionLayer(*layer).setFillExtrusionBaseTransition(options); } jni::Local> FillExtrusionLayer::getFillExtrusionVerticalGradient(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>( + env, style::FillExtrusionLayer::getDefaultFillExtrusionVerticalGradient())); + } return std::move( - *convert>>(env, toFillExtrusionLayer(layer).getFillExtrusionVerticalGradient())); + *convert>>(env, toFillExtrusionLayer(*layer).getFillExtrusionVerticalGradient())); } // FillExtrusionJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_layer.cpp index d22d923c1..39699cddf 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/fill_layer.cpp @@ -41,107 +41,179 @@ FillLayer::~FillLayer() = default; jni::Local> FillLayer::getFillSortKey(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillSortKey())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillSortKey())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillSortKey())); } jni::Local> FillLayer::getFillAntialias(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillAntialias())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillAntialias())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillAntialias())); } jni::Local> FillLayer::getFillOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillOpacity())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillOpacity())); } jni::Local> FillLayer::getFillOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillLayer(layer).getFillOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillLayer(*layer).getFillOpacityTransition(); return std::move(*convert>>(env, options)); } void FillLayer::setFillOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillLayer(layer).setFillOpacityTransition(options); + toFillLayer(*layer).setFillOpacityTransition(options); } jni::Local> FillLayer::getFillColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillColor())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillColor())); } jni::Local> FillLayer::getFillColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillLayer(layer).getFillColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillLayer(*layer).getFillColorTransition(); return std::move(*convert>>(env, options)); } void FillLayer::setFillColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillLayer(layer).setFillColorTransition(options); + toFillLayer(*layer).setFillColorTransition(options); } jni::Local> FillLayer::getFillOutlineColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillOutlineColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillOutlineColor())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillOutlineColor())); } jni::Local> FillLayer::getFillOutlineColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillLayer(layer).getFillOutlineColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillLayer(*layer).getFillOutlineColorTransition(); return std::move(*convert>>(env, options)); } void FillLayer::setFillOutlineColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillLayer(layer).setFillOutlineColorTransition(options); + toFillLayer(*layer).setFillOutlineColorTransition(options); } jni::Local> FillLayer::getFillTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillTranslate())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillTranslate())); } jni::Local> FillLayer::getFillTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillLayer(layer).getFillTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillLayer(*layer).getFillTranslateTransition(); return std::move(*convert>>(env, options)); } void FillLayer::setFillTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillLayer(layer).setFillTranslateTransition(options); + toFillLayer(*layer).setFillTranslateTransition(options); } jni::Local> FillLayer::getFillTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillTranslateAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillTranslateAnchor())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillTranslateAnchor())); } jni::Local> FillLayer::getFillPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toFillLayer(layer).getFillPattern())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::FillLayer::getDefaultFillPattern())); + } + return std::move(*convert>>(env, toFillLayer(*layer).getFillPattern())); } jni::Local> FillLayer::getFillPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toFillLayer(layer).getFillPatternTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toFillLayer(*layer).getFillPatternTransition(); return std::move(*convert>>(env, options)); } void FillLayer::setFillPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toFillLayer(layer).setFillPatternTransition(options); + toFillLayer(*layer).setFillPatternTransition(options); } // FillJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/heatmap_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/heatmap_layer.cpp index c3945a54a..1435579fa 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/heatmap_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/heatmap_layer.cpp @@ -41,70 +41,115 @@ HeatmapLayer::~HeatmapLayer() = default; jni::Local> HeatmapLayer::getHeatmapRadius(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHeatmapLayer(layer).getHeatmapRadius())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::HeatmapLayer::getDefaultHeatmapRadius())); + } + return std::move(*convert>>(env, toHeatmapLayer(*layer).getHeatmapRadius())); } jni::Local> HeatmapLayer::getHeatmapRadiusTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHeatmapLayer(layer).getHeatmapRadiusTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHeatmapLayer(*layer).getHeatmapRadiusTransition(); return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHeatmapLayer(layer).setHeatmapRadiusTransition(options); + toHeatmapLayer(*layer).setHeatmapRadiusTransition(options); } jni::Local> HeatmapLayer::getHeatmapWeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHeatmapLayer(layer).getHeatmapWeight())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::HeatmapLayer::getDefaultHeatmapWeight())); + } + return std::move(*convert>>(env, toHeatmapLayer(*layer).getHeatmapWeight())); } jni::Local> HeatmapLayer::getHeatmapIntensity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHeatmapLayer(layer).getHeatmapIntensity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::HeatmapLayer::getDefaultHeatmapIntensity())); + } + return std::move(*convert>>(env, toHeatmapLayer(*layer).getHeatmapIntensity())); } jni::Local> HeatmapLayer::getHeatmapIntensityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHeatmapLayer(layer).getHeatmapIntensityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHeatmapLayer(*layer).getHeatmapIntensityTransition(); return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHeatmapLayer(layer).setHeatmapIntensityTransition(options); + toHeatmapLayer(*layer).setHeatmapIntensityTransition(options); } jni::Local> HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - auto propertyValue = toHeatmapLayer(layer).getHeatmapColor(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::HeatmapLayer::getDefaultHeatmapColor())); + } + + auto propertyValue = toHeatmapLayer(*layer).getHeatmapColor(); if (propertyValue.isUndefined()) { - propertyValue = toHeatmapLayer(layer).getDefaultHeatmapColor(); + propertyValue = toHeatmapLayer(*layer).getDefaultHeatmapColor(); } return std::move(*convert>>(env, propertyValue)); } jni::Local> HeatmapLayer::getHeatmapOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHeatmapLayer(layer).getHeatmapOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::HeatmapLayer::getDefaultHeatmapOpacity())); + } + return std::move(*convert>>(env, toHeatmapLayer(*layer).getHeatmapOpacity())); } jni::Local> HeatmapLayer::getHeatmapOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHeatmapLayer(layer).getHeatmapOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHeatmapLayer(*layer).getHeatmapOpacityTransition(); return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHeatmapLayer(layer).setHeatmapOpacityTransition(options); + toHeatmapLayer(*layer).setHeatmapOpacityTransition(options); } // HeatmapJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/hillshade_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/hillshade_layer.cpp index 52332ee13..271a7765a 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/hillshade_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/hillshade_layer.cpp @@ -41,86 +41,148 @@ HillshadeLayer::~HillshadeLayer() = default; jni::Local> HillshadeLayer::getHillshadeIlluminationDirection(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>( + env, style::HillshadeLayer::getDefaultHillshadeIlluminationDirection())); + } return std::move( - *convert>>(env, toHillshadeLayer(layer).getHillshadeIlluminationDirection())); + *convert>>(env, toHillshadeLayer(*layer).getHillshadeIlluminationDirection())); } jni::Local> HillshadeLayer::getHillshadeIlluminationAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::HillshadeLayer::getDefaultHillshadeIlluminationAnchor())); + } return std::move( - *convert>>(env, toHillshadeLayer(layer).getHillshadeIlluminationAnchor())); + *convert>>(env, toHillshadeLayer(*layer).getHillshadeIlluminationAnchor())); } jni::Local> HillshadeLayer::getHillshadeExaggeration(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHillshadeLayer(layer).getHillshadeExaggeration())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::HillshadeLayer::getDefaultHillshadeExaggeration())); + } + return std::move(*convert>>(env, toHillshadeLayer(*layer).getHillshadeExaggeration())); } jni::Local> HillshadeLayer::getHillshadeExaggerationTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHillshadeLayer(layer).getHillshadeExaggerationTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHillshadeLayer(*layer).getHillshadeExaggerationTransition(); return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeExaggerationTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHillshadeLayer(layer).setHillshadeExaggerationTransition(options); + toHillshadeLayer(*layer).setHillshadeExaggerationTransition(options); } jni::Local> HillshadeLayer::getHillshadeShadowColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHillshadeLayer(layer).getHillshadeShadowColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::HillshadeLayer::getDefaultHillshadeShadowColor())); + } + return std::move(*convert>>(env, toHillshadeLayer(*layer).getHillshadeShadowColor())); } jni::Local> HillshadeLayer::getHillshadeShadowColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHillshadeLayer(layer).getHillshadeShadowColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHillshadeLayer(*layer).getHillshadeShadowColorTransition(); return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeShadowColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHillshadeLayer(layer).setHillshadeShadowColorTransition(options); + toHillshadeLayer(*layer).setHillshadeShadowColorTransition(options); } jni::Local> HillshadeLayer::getHillshadeHighlightColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHillshadeLayer(layer).getHillshadeHighlightColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::HillshadeLayer::getDefaultHillshadeHighlightColor())); + } + return std::move(*convert>>(env, toHillshadeLayer(*layer).getHillshadeHighlightColor())); } jni::Local> HillshadeLayer::getHillshadeHighlightColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHillshadeLayer(layer).getHillshadeHighlightColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHillshadeLayer(*layer).getHillshadeHighlightColorTransition(); return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeHighlightColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHillshadeLayer(layer).setHillshadeHighlightColorTransition(options); + toHillshadeLayer(*layer).setHillshadeHighlightColorTransition(options); } jni::Local> HillshadeLayer::getHillshadeAccentColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toHillshadeLayer(layer).getHillshadeAccentColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::HillshadeLayer::getDefaultHillshadeAccentColor())); + } + return std::move(*convert>>(env, toHillshadeLayer(*layer).getHillshadeAccentColor())); } jni::Local> HillshadeLayer::getHillshadeAccentColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toHillshadeLayer(layer).getHillshadeAccentColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toHillshadeLayer(*layer).getHillshadeAccentColorTransition(); return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeAccentColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toHillshadeLayer(layer).setHillshadeAccentColorTransition(options); + toHillshadeLayer(*layer).setHillshadeAccentColorTransition(options); } // HillshadeJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp index 9edbc8b30..bbde61c55 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp @@ -29,13 +29,13 @@ namespace android { */ Layer::Layer(std::unique_ptr coreLayer) : ownedLayer(std::move(coreLayer)), - layer(*ownedLayer) {} + layerPtr(ownedLayer->makeWeakPtr()) {} /** * Takes a non-owning reference. For lookup methods */ Layer::Layer(mbgl::style::Layer& coreLayer) - : layer(coreLayer) {} + : layerPtr(coreLayer.makeWeakPtr()) {} Layer::~Layer() {} @@ -59,17 +59,27 @@ std::unique_ptr Layer::releaseCoreLayer() { } jni::Local Layer::getId(jni::JNIEnv& env) { - return jni::Make(env, layer.getID()); + auto layer = layerPtr.get(); + if (!layer) { + return jni::Make(env, ""); + } + + return jni::Make(env, layer->getID()); } style::Layer& Layer::get() { - return layer; + return *layerPtr.get(); } void Layer::setProperty(jni::JNIEnv& env, const jni::String& jname, const jni::Object<>& jvalue) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } + // Convert and set property - std::optional error = layer.setProperty(jni::Make(env, jname), - Value(env, jvalue)); + std::optional error = layer->setProperty(jni::Make(env, jname), + Value(env, jvalue)); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); @@ -81,6 +91,11 @@ void Layer::setFilter(jni::JNIEnv& env, const jni::Array>& jfilter using namespace mbgl::style; using namespace mbgl::style::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return; + } + Error error; std::optional converted = convert(Value(env, jfilter), error); if (!converted) { @@ -88,14 +103,19 @@ void Layer::setFilter(jni::JNIEnv& env, const jni::Array>& jfilter return; } - layer.setFilter(std::move(*converted)); + layer->setFilter(std::move(*converted)); } jni::Local> Layer::getFilter(jni::JNIEnv& env) { using namespace mbgl::style; using namespace mbgl::style::conversion; - Filter filter = layer.getFilter(); + auto layer = layerPtr.get(); + if (!layer) { + return jni::Local>(env, nullptr); + } + + Filter filter = layer->getFilter(); if (filter.expression) { mbgl::Value expressionValue = (*filter.expression)->serialize(); return gson::JsonElement::New(env, expressionValue); @@ -105,36 +125,77 @@ jni::Local> Layer::getFilter(jni::JNIEnv& env) { } void Layer::setSourceLayer(jni::JNIEnv& env, const jni::String& sourceLayer) { - layer.setSourceLayer(jni::Make(env, sourceLayer)); + auto layer = layerPtr.get(); + if (!layer) { + return; + } + + layer->setSourceLayer(jni::Make(env, sourceLayer)); } jni::Local Layer::getSourceLayer(jni::JNIEnv& env) { - return jni::Make(env, layer.getSourceLayer()); + auto layer = layerPtr.get(); + if (!layer) { + return jni::Make(env, ""); + } + + return jni::Make(env, layer->getSourceLayer()); } jni::Local Layer::getSourceId(jni::JNIEnv& env) { - return jni::Make(env, layer.getSourceID()); + auto layer = layerPtr.get(); + if (!layer) { + return jni::Make(env, ""); + } + + return jni::Make(env, layer->getSourceID()); } jni::jfloat Layer::getMinZoom(jni::JNIEnv&) { - return layer.getMinZoom(); + auto layer = layerPtr.get(); + if (!layer) { + return 0.0f; + } + + return layer->getMinZoom(); } jni::jfloat Layer::getMaxZoom(jni::JNIEnv&) { - return layer.getMaxZoom(); + auto layer = layerPtr.get(); + if (!layer) { + return 0.0f; + } + + return layer->getMaxZoom(); } void Layer::setMinZoom(jni::JNIEnv&, jni::jfloat zoom) { - layer.setMinZoom(zoom); + auto layer = layerPtr.get(); + if (!layer) { + return; + } + + layer->setMinZoom(zoom); } void Layer::setMaxZoom(jni::JNIEnv&, jni::jfloat zoom) { - layer.setMaxZoom(zoom); + auto layer = layerPtr.get(); + if (!layer) { + return; + } + + layer->setMaxZoom(zoom); } jni::Local> Layer::getVisibility(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, layer.getVisibility())); + + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::VisibilityType::None)); + } + + return std::move(*convert>>(env, layer->getVisibility())); } void Layer::registerNative(jni::JNIEnv& env) { diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp.ejs b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp.ejs index d72fbc2c9..3f3a15267 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp.ejs +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.cpp.ejs @@ -57,15 +57,24 @@ namespace android { <% if (property.name != 'heatmap-color') { -%> jni::Local> <%- camelize(type) %>Layer::get<%- camelize(property.name) %>(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, to<%- camelize(type) %>Layer(layer).get<%- camelize(property.name) %>())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::<%- camelize(type) %>Layer::getDefault<%- camelize(property.name) %>())); + } + return std::move(*convert>>(env, to<%- camelize(type) %>Layer(*layer).get<%- camelize(property.name) %>())); } <% } else { -%> jni::Local> HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - auto propertyValue = to<%- camelize(type) %>Layer(layer).getHeatmapColor(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::<%- camelize(type) %>Layer::getDefaultHeatmapColor())); + } + + auto propertyValue = to<%- camelize(type) %>Layer(*layer).getHeatmapColor(); if (propertyValue.isUndefined()) { - propertyValue = to<%- camelize(type) %>Layer(layer).getDefaultHeatmapColor(); + propertyValue = to<%- camelize(type) %>Layer(*layer).getDefaultHeatmapColor(); } return std::move(*convert>>(env, propertyValue)); } @@ -74,15 +83,23 @@ namespace android { <% if (property.transition) { -%> jni::Local> <%- camelize(type) %>Layer::get<%- camelize(property.name) %>Transition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = to<%- camelize(type) %>Layer(layer).get<%- camelize(property.name) %>Transition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = to<%- camelize(type) %>Layer(*layer).get<%- camelize(property.name) %>Transition(); return std::move(*convert>>(env, options)); } void <%- camelize(type) %>Layer::set<%- camelize(property.name) %>Transition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - to<%- camelize(type) %>Layer(layer).set<%- camelize(property.name) %>Transition(options); + to<%- camelize(type) %>Layer(*layer).set<%- camelize(property.name) %>Transition(options); } <% } -%> diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.hpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.hpp index 9bd1f8600..533a344b3 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/layer.hpp @@ -78,7 +78,7 @@ protected: std::unique_ptr ownedLayer; // Raw reference to the layer - mbgl::style::Layer& layer; + mapbox::base::WeakPtr layerPtr; }; /** diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/line_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/line_layer.cpp index 09149f223..da0228a61 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/line_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/line_layer.cpp @@ -41,199 +41,335 @@ LineLayer::~LineLayer() = default; jni::Local> LineLayer::getLineCap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineCap())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineCap())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineCap())); } jni::Local> LineLayer::getLineJoin(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineJoin())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineJoin())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineJoin())); } jni::Local> LineLayer::getLineMiterLimit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineMiterLimit())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineMiterLimit())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineMiterLimit())); } jni::Local> LineLayer::getLineRoundLimit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineRoundLimit())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineRoundLimit())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineRoundLimit())); } jni::Local> LineLayer::getLineSortKey(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineSortKey())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineSortKey())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineSortKey())); } jni::Local> LineLayer::getLineOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineOpacity())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineOpacity())); } jni::Local> LineLayer::getLineOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineOpacityTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineOpacityTransition(options); + toLineLayer(*layer).setLineOpacityTransition(options); } jni::Local> LineLayer::getLineColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineColor())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineColor())); } jni::Local> LineLayer::getLineColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineColorTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineColorTransition(options); + toLineLayer(*layer).setLineColorTransition(options); } jni::Local> LineLayer::getLineTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineTranslate())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineTranslate())); } jni::Local> LineLayer::getLineTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineTranslateTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineTranslateTransition(options); + toLineLayer(*layer).setLineTranslateTransition(options); } jni::Local> LineLayer::getLineTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineTranslateAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineTranslateAnchor())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineTranslateAnchor())); } jni::Local> LineLayer::getLineWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineWidth())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineWidth())); } jni::Local> LineLayer::getLineWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineWidthTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineWidthTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineWidthTransition(options); + toLineLayer(*layer).setLineWidthTransition(options); } jni::Local> LineLayer::getLineGapWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineGapWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineGapWidth())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineGapWidth())); } jni::Local> LineLayer::getLineGapWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineGapWidthTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineGapWidthTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineGapWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineGapWidthTransition(options); + toLineLayer(*layer).setLineGapWidthTransition(options); } jni::Local> LineLayer::getLineOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineOffset())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineOffset())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineOffset())); } jni::Local> LineLayer::getLineOffsetTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineOffsetTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineOffsetTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineOffsetTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineOffsetTransition(options); + toLineLayer(*layer).setLineOffsetTransition(options); } jni::Local> LineLayer::getLineBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineBlur())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineBlur())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineBlur())); } jni::Local> LineLayer::getLineBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineBlurTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineBlurTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineBlurTransition(options); + toLineLayer(*layer).setLineBlurTransition(options); } jni::Local> LineLayer::getLineDasharray(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineDasharray())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineDasharray())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineDasharray())); } jni::Local> LineLayer::getLineDasharrayTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLineDasharrayTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLineDasharrayTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLineDasharrayTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLineDasharrayTransition(options); + toLineLayer(*layer).setLineDasharrayTransition(options); } jni::Local> LineLayer::getLinePattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLinePattern())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLinePattern())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLinePattern())); } jni::Local> LineLayer::getLinePatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLineLayer(layer).getLinePatternTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLineLayer(*layer).getLinePatternTransition(); return std::move(*convert>>(env, options)); } void LineLayer::setLinePatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLineLayer(layer).setLinePatternTransition(options); + toLineLayer(*layer).setLinePatternTransition(options); } jni::Local> LineLayer::getLineGradient(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLineLayer(layer).getLineGradient())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LineLayer::getDefaultLineGradient())); + } + return std::move(*convert>>(env, toLineLayer(*layer).getLineGradient())); } // LineJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/location_indicator_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/location_indicator_layer.cpp index b7ca8813f..b4788b120 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/location_indicator_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/location_indicator_layer.cpp @@ -40,176 +40,302 @@ LocationIndicatorLayer::~LocationIndicatorLayer() = default; jni::Local> LocationIndicatorLayer::getTopImage(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getTopImage())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LocationIndicatorLayer::getDefaultTopImage())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getTopImage())); } jni::Local> LocationIndicatorLayer::getBearingImage(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getBearingImage())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultBearingImage())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getBearingImage())); } jni::Local> LocationIndicatorLayer::getShadowImage(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getShadowImage())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultShadowImage())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getShadowImage())); } jni::Local> LocationIndicatorLayer::getPerspectiveCompensation(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>( + env, style::LocationIndicatorLayer::getDefaultPerspectiveCompensation())); + } return std::move( - *convert>>(env, toLocationIndicatorLayer(layer).getPerspectiveCompensation())); + *convert>>(env, toLocationIndicatorLayer(*layer).getPerspectiveCompensation())); } jni::Local> LocationIndicatorLayer::getImageTiltDisplacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultImageTiltDisplacement())); + } return std::move( - *convert>>(env, toLocationIndicatorLayer(layer).getImageTiltDisplacement())); + *convert>>(env, toLocationIndicatorLayer(*layer).getImageTiltDisplacement())); } jni::Local> LocationIndicatorLayer::getBearing(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getBearing())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LocationIndicatorLayer::getDefaultBearing())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getBearing())); } jni::Local> LocationIndicatorLayer::getBearingTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getBearingTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getBearingTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setBearingTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setBearingTransition(options); + toLocationIndicatorLayer(*layer).setBearingTransition(options); } jni::Local> LocationIndicatorLayer::getLocation(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getLocation())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::LocationIndicatorLayer::getDefaultLocation())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getLocation())); } jni::Local> LocationIndicatorLayer::getLocationTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getLocationTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getLocationTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setLocationTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setLocationTransition(options); + toLocationIndicatorLayer(*layer).setLocationTransition(options); } jni::Local> LocationIndicatorLayer::getAccuracyRadius(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getAccuracyRadius())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultAccuracyRadius())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getAccuracyRadius())); } jni::Local> LocationIndicatorLayer::getAccuracyRadiusTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getAccuracyRadiusTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getAccuracyRadiusTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setAccuracyRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setAccuracyRadiusTransition(options); + toLocationIndicatorLayer(*layer).setAccuracyRadiusTransition(options); } jni::Local> LocationIndicatorLayer::getTopImageSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getTopImageSize())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultTopImageSize())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getTopImageSize())); } jni::Local> LocationIndicatorLayer::getTopImageSizeTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getTopImageSizeTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getTopImageSizeTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setTopImageSizeTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setTopImageSizeTransition(options); + toLocationIndicatorLayer(*layer).setTopImageSizeTransition(options); } jni::Local> LocationIndicatorLayer::getBearingImageSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getBearingImageSize())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultBearingImageSize())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getBearingImageSize())); } jni::Local> LocationIndicatorLayer::getBearingImageSizeTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getBearingImageSizeTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getBearingImageSizeTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setBearingImageSizeTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setBearingImageSizeTransition(options); + toLocationIndicatorLayer(*layer).setBearingImageSizeTransition(options); } jni::Local> LocationIndicatorLayer::getShadowImageSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toLocationIndicatorLayer(layer).getShadowImageSize())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultShadowImageSize())); + } + return std::move(*convert>>(env, toLocationIndicatorLayer(*layer).getShadowImageSize())); } jni::Local> LocationIndicatorLayer::getShadowImageSizeTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getShadowImageSizeTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getShadowImageSizeTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setShadowImageSizeTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setShadowImageSizeTransition(options); + toLocationIndicatorLayer(*layer).setShadowImageSizeTransition(options); } jni::Local> LocationIndicatorLayer::getAccuracyRadiusColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::LocationIndicatorLayer::getDefaultAccuracyRadiusColor())); + } return std::move( - *convert>>(env, toLocationIndicatorLayer(layer).getAccuracyRadiusColor())); + *convert>>(env, toLocationIndicatorLayer(*layer).getAccuracyRadiusColor())); } jni::Local> LocationIndicatorLayer::getAccuracyRadiusColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getAccuracyRadiusColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getAccuracyRadiusColorTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setAccuracyRadiusColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setAccuracyRadiusColorTransition(options); + toLocationIndicatorLayer(*layer).setAccuracyRadiusColorTransition(options); } jni::Local> LocationIndicatorLayer::getAccuracyRadiusBorderColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>( + env, style::LocationIndicatorLayer::getDefaultAccuracyRadiusBorderColor())); + } return std::move( - *convert>>(env, toLocationIndicatorLayer(layer).getAccuracyRadiusBorderColor())); + *convert>>(env, toLocationIndicatorLayer(*layer).getAccuracyRadiusBorderColor())); } jni::Local> LocationIndicatorLayer::getAccuracyRadiusBorderColorTransition( jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toLocationIndicatorLayer(layer).getAccuracyRadiusBorderColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toLocationIndicatorLayer(*layer).getAccuracyRadiusBorderColorTransition(); return std::move(*convert>>(env, options)); } void LocationIndicatorLayer::setAccuracyRadiusBorderColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toLocationIndicatorLayer(layer).setAccuracyRadiusBorderColorTransition(options); + toLocationIndicatorLayer(*layer).setAccuracyRadiusBorderColorTransition(options); } // LocationIndicatorJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/raster_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/raster_layer.cpp index d325a615e..a489246bc 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/raster_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/raster_layer.cpp @@ -41,120 +41,200 @@ RasterLayer::~RasterLayer() = default; jni::Local> RasterLayer::getRasterOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterOpacity())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterOpacity())); } jni::Local> RasterLayer::getRasterOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterOpacityTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterOpacityTransition(options); + toRasterLayer(*layer).setRasterOpacityTransition(options); } jni::Local> RasterLayer::getRasterHueRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterHueRotate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterHueRotate())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterHueRotate())); } jni::Local> RasterLayer::getRasterHueRotateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterHueRotateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterHueRotateTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterHueRotateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterHueRotateTransition(options); + toRasterLayer(*layer).setRasterHueRotateTransition(options); } jni::Local> RasterLayer::getRasterBrightnessMin(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterBrightnessMin())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterBrightnessMin())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterBrightnessMin())); } jni::Local> RasterLayer::getRasterBrightnessMinTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterBrightnessMinTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterBrightnessMinTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterBrightnessMinTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterBrightnessMinTransition(options); + toRasterLayer(*layer).setRasterBrightnessMinTransition(options); } jni::Local> RasterLayer::getRasterBrightnessMax(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterBrightnessMax())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterBrightnessMax())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterBrightnessMax())); } jni::Local> RasterLayer::getRasterBrightnessMaxTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterBrightnessMaxTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterBrightnessMaxTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterBrightnessMaxTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterBrightnessMaxTransition(options); + toRasterLayer(*layer).setRasterBrightnessMaxTransition(options); } jni::Local> RasterLayer::getRasterSaturation(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterSaturation())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterSaturation())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterSaturation())); } jni::Local> RasterLayer::getRasterSaturationTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterSaturationTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterSaturationTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterSaturationTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterSaturationTransition(options); + toRasterLayer(*layer).setRasterSaturationTransition(options); } jni::Local> RasterLayer::getRasterContrast(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterContrast())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterContrast())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterContrast())); } jni::Local> RasterLayer::getRasterContrastTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toRasterLayer(layer).getRasterContrastTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toRasterLayer(*layer).getRasterContrastTransition(); return std::move(*convert>>(env, options)); } void RasterLayer::setRasterContrastTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toRasterLayer(layer).setRasterContrastTransition(options); + toRasterLayer(*layer).setRasterContrastTransition(options); } jni::Local> RasterLayer::getRasterResampling(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterResampling())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterResampling())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterResampling())); } jni::Local> RasterLayer::getRasterFadeDuration(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toRasterLayer(layer).getRasterFadeDuration())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::RasterLayer::getDefaultRasterFadeDuration())); + } + return std::move(*convert>>(env, toRasterLayer(*layer).getRasterFadeDuration())); } // RasterJavaLayerPeerFactory diff --git a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp index 104016817..fdb37191b 100644 --- a/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/style/layers/symbol_layer.cpp @@ -41,443 +41,770 @@ SymbolLayer::~SymbolLayer() = default; jni::Local> SymbolLayer::getSymbolPlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolPlacement())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolPlacement())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolPlacement())); } jni::Local> SymbolLayer::getSymbolSpacing(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolSpacing())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolSpacing())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolSpacing())); } jni::Local> SymbolLayer::getSymbolAvoidEdges(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolAvoidEdges())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolAvoidEdges())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolAvoidEdges())); } jni::Local> SymbolLayer::getSymbolSortKey(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolSortKey())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolSortKey())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolSortKey())); } jni::Local> SymbolLayer::getSymbolZOrder(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolZOrder())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolZOrder())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolZOrder())); } jni::Local> SymbolLayer::getIconAllowOverlap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconAllowOverlap())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconAllowOverlap())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconAllowOverlap())); } jni::Local> SymbolLayer::getIconIgnorePlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconIgnorePlacement())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconIgnorePlacement())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconIgnorePlacement())); } jni::Local> SymbolLayer::getIconOptional(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconOptional())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconOptional())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconOptional())); } jni::Local> SymbolLayer::getIconRotationAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconRotationAlignment())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::SymbolLayer::getDefaultIconRotationAlignment())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconRotationAlignment())); } jni::Local> SymbolLayer::getIconSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconSize())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconSize())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconSize())); } jni::Local> SymbolLayer::getIconTextFit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconTextFit())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconTextFit())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconTextFit())); } jni::Local> SymbolLayer::getIconTextFitPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconTextFitPadding())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconTextFitPadding())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconTextFitPadding())); } jni::Local> SymbolLayer::getIconImage(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconImage())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconImage())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconImage())); } jni::Local> SymbolLayer::getIconRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconRotate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconRotate())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconRotate())); } jni::Local> SymbolLayer::getIconPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconPadding())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconPadding())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconPadding())); } jni::Local> SymbolLayer::getIconKeepUpright(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconKeepUpright())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconKeepUpright())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconKeepUpright())); } jni::Local> SymbolLayer::getIconOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconOffset())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconOffset())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconOffset())); } jni::Local> SymbolLayer::getIconAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconAnchor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconAnchor())); } jni::Local> SymbolLayer::getIconPitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconPitchAlignment())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconPitchAlignment())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconPitchAlignment())); } jni::Local> SymbolLayer::getTextPitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextPitchAlignment())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextPitchAlignment())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextPitchAlignment())); } jni::Local> SymbolLayer::getTextRotationAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextRotationAlignment())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::SymbolLayer::getDefaultTextRotationAlignment())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextRotationAlignment())); } jni::Local> SymbolLayer::getTextField(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextField())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextField())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextField())); } jni::Local> SymbolLayer::getTextFont(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextFont())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextFont())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextFont())); } jni::Local> SymbolLayer::getTextSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextSize())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextSize())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextSize())); } jni::Local> SymbolLayer::getTextMaxWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextMaxWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextMaxWidth())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextMaxWidth())); } jni::Local> SymbolLayer::getTextLineHeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextLineHeight())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextLineHeight())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextLineHeight())); } jni::Local> SymbolLayer::getTextLetterSpacing(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextLetterSpacing())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextLetterSpacing())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextLetterSpacing())); } jni::Local> SymbolLayer::getTextJustify(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextJustify())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextJustify())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextJustify())); } jni::Local> SymbolLayer::getTextRadialOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextRadialOffset())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextRadialOffset())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextRadialOffset())); } jni::Local> SymbolLayer::getTextVariableAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextVariableAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextVariableAnchor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextVariableAnchor())); } jni::Local> SymbolLayer::getTextVariableAnchorOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextVariableAnchorOffset())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move( + *convert>>(env, style::SymbolLayer::getDefaultTextVariableAnchorOffset())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextVariableAnchorOffset())); } jni::Local> SymbolLayer::getTextAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextAnchor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextAnchor())); } jni::Local> SymbolLayer::getTextMaxAngle(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextMaxAngle())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextMaxAngle())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextMaxAngle())); } jni::Local> SymbolLayer::getTextWritingMode(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextWritingMode())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextWritingMode())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextWritingMode())); } jni::Local> SymbolLayer::getTextRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextRotate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextRotate())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextRotate())); } jni::Local> SymbolLayer::getTextPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextPadding())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextPadding())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextPadding())); } jni::Local> SymbolLayer::getTextKeepUpright(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextKeepUpright())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextKeepUpright())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextKeepUpright())); } jni::Local> SymbolLayer::getTextTransform(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextTransform())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextTransform())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextTransform())); } jni::Local> SymbolLayer::getTextOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextOffset())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextOffset())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextOffset())); } jni::Local> SymbolLayer::getTextAllowOverlap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextAllowOverlap())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextAllowOverlap())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextAllowOverlap())); } jni::Local> SymbolLayer::getTextIgnorePlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextIgnorePlacement())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextIgnorePlacement())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextIgnorePlacement())); } jni::Local> SymbolLayer::getTextOptional(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextOptional())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextOptional())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextOptional())); } jni::Local> SymbolLayer::getSymbolScreenSpace(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getSymbolScreenSpace())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultSymbolScreenSpace())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getSymbolScreenSpace())); } jni::Local> SymbolLayer::getIconOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconOpacity())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconOpacity())); } jni::Local> SymbolLayer::getIconOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconOpacityTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconOpacityTransition(options); + toSymbolLayer(*layer).setIconOpacityTransition(options); } jni::Local> SymbolLayer::getIconColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconColor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconColor())); } jni::Local> SymbolLayer::getIconColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconColorTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconColorTransition(options); + toSymbolLayer(*layer).setIconColorTransition(options); } jni::Local> SymbolLayer::getIconHaloColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconHaloColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconHaloColor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconHaloColor())); } jni::Local> SymbolLayer::getIconHaloColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconHaloColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconHaloColorTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconHaloColorTransition(options); + toSymbolLayer(*layer).setIconHaloColorTransition(options); } jni::Local> SymbolLayer::getIconHaloWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconHaloWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconHaloWidth())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconHaloWidth())); } jni::Local> SymbolLayer::getIconHaloWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconHaloWidthTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconHaloWidthTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconHaloWidthTransition(options); + toSymbolLayer(*layer).setIconHaloWidthTransition(options); } jni::Local> SymbolLayer::getIconHaloBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconHaloBlur())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconHaloBlur())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconHaloBlur())); } jni::Local> SymbolLayer::getIconHaloBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconHaloBlurTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconHaloBlurTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconHaloBlurTransition(options); + toSymbolLayer(*layer).setIconHaloBlurTransition(options); } jni::Local> SymbolLayer::getIconTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconTranslate())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconTranslate())); } jni::Local> SymbolLayer::getIconTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getIconTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getIconTranslateTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setIconTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setIconTranslateTransition(options); + toSymbolLayer(*layer).setIconTranslateTransition(options); } jni::Local> SymbolLayer::getIconTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getIconTranslateAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultIconTranslateAnchor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getIconTranslateAnchor())); } jni::Local> SymbolLayer::getTextOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextOpacity())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextOpacity())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextOpacity())); } jni::Local> SymbolLayer::getTextOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextOpacityTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextOpacityTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextOpacityTransition(options); + toSymbolLayer(*layer).setTextOpacityTransition(options); } jni::Local> SymbolLayer::getTextColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextColor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextColor())); } jni::Local> SymbolLayer::getTextColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextColorTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextColorTransition(options); + toSymbolLayer(*layer).setTextColorTransition(options); } jni::Local> SymbolLayer::getTextHaloColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextHaloColor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextHaloColor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextHaloColor())); } jni::Local> SymbolLayer::getTextHaloColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextHaloColorTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextHaloColorTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextHaloColorTransition(options); + toSymbolLayer(*layer).setTextHaloColorTransition(options); } jni::Local> SymbolLayer::getTextHaloWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextHaloWidth())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextHaloWidth())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextHaloWidth())); } jni::Local> SymbolLayer::getTextHaloWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextHaloWidthTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextHaloWidthTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextHaloWidthTransition(options); + toSymbolLayer(*layer).setTextHaloWidthTransition(options); } jni::Local> SymbolLayer::getTextHaloBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextHaloBlur())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextHaloBlur())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextHaloBlur())); } jni::Local> SymbolLayer::getTextHaloBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextHaloBlurTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextHaloBlurTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextHaloBlurTransition(options); + toSymbolLayer(*layer).setTextHaloBlurTransition(options); } jni::Local> SymbolLayer::getTextTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextTranslate())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextTranslate())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextTranslate())); } jni::Local> SymbolLayer::getTextTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = toSymbolLayer(layer).getTextTranslateTransition(); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, mbgl::style::TransitionOptions())); + } + mbgl::style::TransitionOptions options = toSymbolLayer(*layer).getTextTranslateTransition(); return std::move(*convert>>(env, options)); } void SymbolLayer::setTextTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { + auto layer = layerPtr.get(); + if (!layer) { + return; + } mbgl::style::TransitionOptions options; options.duration.emplace(mbgl::Milliseconds(duration)); options.delay.emplace(mbgl::Milliseconds(delay)); - toSymbolLayer(layer).setTextTranslateTransition(options); + toSymbolLayer(*layer).setTextTranslateTransition(options); } jni::Local> SymbolLayer::getTextTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return std::move(*convert>>(env, toSymbolLayer(layer).getTextTranslateAnchor())); + auto layer = layerPtr.get(); + if (!layer) { + return std::move(*convert>>(env, style::SymbolLayer::getDefaultTextTranslateAnchor())); + } + return std::move(*convert>>(env, toSymbolLayer(*layer).getTextTranslateAnchor())); } // SymbolJavaLayerPeerFactory