diff options
Diffstat (limited to 'platform')
11 files changed, 162 insertions, 2 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/FillExtrusionLayer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/FillExtrusionLayer.java index fada0c483c..286a6e7ee4 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/FillExtrusionLayer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/FillExtrusionLayer.java @@ -370,6 +370,18 @@ public class FillExtrusionLayer extends Layer { nativeSetFillExtrusionBaseTransition(options.getDuration(), options.getDelay()); } + /** + * Get the FillExtrusionVerticalGradient property + * + * @return property wrapper value around Boolean + */ + @NonNull + @SuppressWarnings("unchecked") + public PropertyValue<Boolean> getFillExtrusionVerticalGradient() { + checkThread(); + return (PropertyValue<Boolean>) new PropertyValue("fill-extrusion-vertical-gradient", nativeGetFillExtrusionVerticalGradient()); + } + @NonNull @Keep private native Object nativeGetFillExtrusionOpacity(); @@ -440,6 +452,10 @@ public class FillExtrusionLayer extends Layer { @Keep private native void nativeSetFillExtrusionBaseTransition(long duration, long delay); + @NonNull + @Keep + private native Object nativeGetFillExtrusionVerticalGradient(); + @Override @Keep protected native void finalize() throws Throwable; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java index ace5be3a82..51edca3002 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java @@ -1245,6 +1245,26 @@ public class PropertyFactory { } /** + * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Boolean> fillExtrusionVerticalGradient(Boolean value) { + return new PaintPropertyValue<>("fill-extrusion-vertical-gradient", value); + } + + /** + * Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If true, sides will be shaded slightly darker farther down. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionVerticalGradient(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-vertical-gradient", expression); + } + + /** * The opacity at which the image will be drawn. * * @param value a Float value diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/FillExtrusionLayerTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/FillExtrusionLayerTest.java index 7ff8039e1a..1f0eb25291 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/FillExtrusionLayerTest.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/FillExtrusionLayerTest.java @@ -401,4 +401,20 @@ public class FillExtrusionLayerTest extends BaseActivityTest { assertEquals(layer.getFillExtrusionBase().getExpression(), expression); }); } + + @Test + public void testFillExtrusionVerticalGradientAsConstant() { + validateTestSetup(); + setupLayer(); + Timber.i("fill-extrusion-vertical-gradient"); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertNotNull(layer); + assertNull(layer.getFillExtrusionVerticalGradient().getValue()); + + // Set and Get + Boolean propertyValue = true; + layer.setProperties(fillExtrusionVerticalGradient(propertyValue)); + assertEquals(layer.getFillExtrusionVerticalGradient().getValue(), propertyValue); + }); + } } diff --git a/platform/android/src/style/layers/fill_extrusion_layer.cpp b/platform/android/src/style/layers/fill_extrusion_layer.cpp index 7767a900d0..ddfbd71544 100644 --- a/platform/android/src/style/layers/fill_extrusion_layer.cpp +++ b/platform/android/src/style/layers/fill_extrusion_layer.cpp @@ -154,6 +154,11 @@ namespace android { toFillExtrusionLayer(layer).setFillExtrusionBaseTransition(options); } + jni::Local<jni::Object<>> FillExtrusionLayer::getFillExtrusionVerticalGradient(jni::JNIEnv& env) { + using namespace mbgl::android::conversion; + return std::move(*convert<jni::Local<jni::Object<>>>(env, toFillExtrusionLayer(layer).getFillExtrusionVerticalGradient())); + } + // FillExtrusionJavaLayerPeerFactory @@ -207,7 +212,8 @@ namespace android { METHOD(&FillExtrusionLayer::getFillExtrusionHeight, "nativeGetFillExtrusionHeight"), METHOD(&FillExtrusionLayer::getFillExtrusionBaseTransition, "nativeGetFillExtrusionBaseTransition"), METHOD(&FillExtrusionLayer::setFillExtrusionBaseTransition, "nativeSetFillExtrusionBaseTransition"), - METHOD(&FillExtrusionLayer::getFillExtrusionBase, "nativeGetFillExtrusionBase")); + METHOD(&FillExtrusionLayer::getFillExtrusionBase, "nativeGetFillExtrusionBase"), + METHOD(&FillExtrusionLayer::getFillExtrusionVerticalGradient, "nativeGetFillExtrusionVerticalGradient")); } } // namespace android diff --git a/platform/android/src/style/layers/fill_extrusion_layer.hpp b/platform/android/src/style/layers/fill_extrusion_layer.hpp index fe7204985c..2d41a189a9 100644 --- a/platform/android/src/style/layers/fill_extrusion_layer.hpp +++ b/platform/android/src/style/layers/fill_extrusion_layer.hpp @@ -51,6 +51,8 @@ public: void setFillExtrusionBaseTransition(jni::JNIEnv&, jlong duration, jlong delay); jni::Local<jni::Object<TransitionOptions>> getFillExtrusionBaseTransition(jni::JNIEnv&); + jni::Local<jni::Object<jni::ObjectTag>> getFillExtrusionVerticalGradient(jni::JNIEnv&); + }; // class FillExtrusionLayer class FillExtrusionJavaLayerPeerFactory final : public JavaLayerPeerFactory, public mbgl::FillExtrusionLayerFactory { diff --git a/platform/darwin/scripts/style-spec-cocoa-conventions-v8.json b/platform/darwin/scripts/style-spec-cocoa-conventions-v8.json index dfc7d76a3c..ce313ddbb9 100644 --- a/platform/darwin/scripts/style-spec-cocoa-conventions-v8.json +++ b/platform/darwin/scripts/style-spec-cocoa-conventions-v8.json @@ -32,7 +32,8 @@ }, "paint_fill-extrusion": { "fill-extrusion-translate": "fill-extrusion-translation", - "fill-extrusion-translate-anchor": "fill-extrusion-translation-anchor" + "fill-extrusion-translate-anchor": "fill-extrusion-translation-anchor", + "fill-extrusion-vertical-gradient": "fill-extrusion-has-vertical-gradient" }, "paint_raster": { "raster-brightness-min": "minimum-raster-brightness", diff --git a/platform/darwin/src/MGLFillExtrusionStyleLayer.h b/platform/darwin/src/MGLFillExtrusionStyleLayer.h index 6e807c1b44..98eb6b3c20 100644 --- a/platform/darwin/src/MGLFillExtrusionStyleLayer.h +++ b/platform/darwin/src/MGLFillExtrusionStyleLayer.h @@ -164,6 +164,33 @@ MGL_EXPORT @property (nonatomic) MGLTransition fillExtrusionColorTransition; /** + Whether to apply a vertical gradient to the sides of a fill-extrusion layer. If + true, sides will be shaded slightly darker farther down. + + The default value of this property is an expression that evaluates to `YES`. + Set this property to `nil` to reset it to the default value. + + This attribute corresponds to the <a + href="https://www.mapbox.com/mapbox-gl-style-spec/#paint-fill-extrusion-vertical-gradient"><code>fill-extrusion-vertical-gradient</code></a> + layout property in the Mapbox Style Specification. + + You can set this property to an expression containing any of the following: + + * Constant Boolean values + * Predefined functions, including mathematical and string operators + * Conditional expressions + * Variable assignments and references to assigned variables + * Step functions applied to the `$zoomLevel` variable + + This property does not support applying interpolation functions to the + `$zoomLevel` variable or applying interpolation or step functions to feature + attributes. + */ +@property (nonatomic, null_resettable) NSExpression *fillExtrusionHasVerticalGradient; + +@property (nonatomic, null_resettable) NSExpression *fillExtrusionVerticalGradient __attribute__((unavailable("Use fillExtrusionHasVerticalGradient instead."))); + +/** The height with which to extrude this layer. This property is measured in meters. diff --git a/platform/darwin/src/MGLFillExtrusionStyleLayer.mm b/platform/darwin/src/MGLFillExtrusionStyleLayer.mm index 03676a4ed5..e4e9c707ea 100644 --- a/platform/darwin/src/MGLFillExtrusionStyleLayer.mm +++ b/platform/darwin/src/MGLFillExtrusionStyleLayer.mm @@ -156,6 +156,31 @@ namespace mbgl { return transition; } +- (void)setFillExtrusionHasVerticalGradient:(NSExpression *)fillExtrusionHasVerticalGradient { + MGLAssertStyleLayerIsValid(); + MGLLogDebug(@"Setting fillExtrusionHasVerticalGradient: %@", fillExtrusionHasVerticalGradient); + + auto mbglValue = MGLStyleValueTransformer<bool, NSNumber *>().toPropertyValue<mbgl::style::PropertyValue<bool>>(fillExtrusionHasVerticalGradient, false); + self.rawLayer->setFillExtrusionVerticalGradient(mbglValue); +} + +- (NSExpression *)fillExtrusionHasVerticalGradient { + MGLAssertStyleLayerIsValid(); + + auto propertyValue = self.rawLayer->getFillExtrusionVerticalGradient(); + if (propertyValue.isUndefined()) { + propertyValue = self.rawLayer->getDefaultFillExtrusionVerticalGradient(); + } + return MGLStyleValueTransformer<bool, NSNumber *>().toExpression(propertyValue); +} + +- (void)setFillExtrusionVerticalGradient:(NSExpression *)fillExtrusionVerticalGradient { +} + +- (NSExpression *)fillExtrusionVerticalGradient { + return self.fillExtrusionHasVerticalGradient; +} + - (void)setFillExtrusionHeight:(NSExpression *)fillExtrusionHeight { MGLAssertStyleLayerIsValid(); MGLLogDebug(@"Setting fillExtrusionHeight: %@", fillExtrusionHeight); diff --git a/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm b/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm index ecfa2134a0..357ee888bc 100644 --- a/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm +++ b/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm @@ -205,6 +205,50 @@ XCTAssertEqual(fillExtrusionColorTransition.duration, transitionTest.duration); } + // fill-extrusion-vertical-gradient + { + XCTAssertTrue(rawLayer->getFillExtrusionVerticalGradient().isUndefined(), + @"fill-extrusion-vertical-gradient should be unset initially."); + NSExpression *defaultExpression = layer.fillExtrusionHasVerticalGradient; + + NSExpression *constantExpression = [NSExpression expressionWithFormat:@"false"]; + layer.fillExtrusionHasVerticalGradient = constantExpression; + mbgl::style::PropertyValue<bool> propertyValue = { false }; + XCTAssertEqual(rawLayer->getFillExtrusionVerticalGradient(), propertyValue, + @"Setting fillExtrusionHasVerticalGradient to a constant value expression should update fill-extrusion-vertical-gradient."); + XCTAssertEqualObjects(layer.fillExtrusionHasVerticalGradient, constantExpression, + @"fillExtrusionHasVerticalGradient should round-trip constant value expressions."); + + constantExpression = [NSExpression expressionWithFormat:@"false"]; + NSExpression *functionExpression = [NSExpression expressionWithFormat:@"mgl_step:from:stops:($zoomLevel, %@, %@)", constantExpression, @{@18: constantExpression}]; + layer.fillExtrusionHasVerticalGradient = functionExpression; + + { + using namespace mbgl::style::expression::dsl; + propertyValue = mbgl::style::PropertyExpression<bool>( + step(zoom(), literal(false), 18.0, literal(false)) + ); + } + + XCTAssertEqual(rawLayer->getFillExtrusionVerticalGradient(), propertyValue, + @"Setting fillExtrusionHasVerticalGradient to a camera expression should update fill-extrusion-vertical-gradient."); + XCTAssertEqualObjects(layer.fillExtrusionHasVerticalGradient, functionExpression, + @"fillExtrusionHasVerticalGradient should round-trip camera expressions."); + + + layer.fillExtrusionHasVerticalGradient = nil; + XCTAssertTrue(rawLayer->getFillExtrusionVerticalGradient().isUndefined(), + @"Unsetting fillExtrusionHasVerticalGradient should return fill-extrusion-vertical-gradient to the default value."); + XCTAssertEqualObjects(layer.fillExtrusionHasVerticalGradient, defaultExpression, + @"fillExtrusionHasVerticalGradient should return the default value after being unset."); + + functionExpression = [NSExpression expressionForKeyPath:@"bogus"]; + XCTAssertThrowsSpecificNamed(layer.fillExtrusionHasVerticalGradient = functionExpression, NSException, NSInvalidArgumentException, @"MGLFillExtrusionLayer should raise an exception if a camera-data expression is applied to a property that does not support key paths to feature attributes."); + functionExpression = [NSExpression expressionWithFormat:@"mgl_step:from:stops:(bogus, %@, %@)", constantExpression, @{@18: constantExpression}]; + functionExpression = [NSExpression expressionWithFormat:@"mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", @{@10: functionExpression}]; + XCTAssertThrowsSpecificNamed(layer.fillExtrusionHasVerticalGradient = functionExpression, NSException, NSInvalidArgumentException, @"MGLFillExtrusionLayer should raise an exception if a camera-data expression is applied to a property that does not support key paths to feature attributes."); + } + // fill-extrusion-height { XCTAssertTrue(rawLayer->getFillExtrusionHeight().isUndefined(), @@ -481,6 +525,7 @@ - (void)testPropertyNames { [self testPropertyName:@"fill-extrusion-base" isBoolean:NO]; [self testPropertyName:@"fill-extrusion-color" isBoolean:NO]; + [self testPropertyName:@"fill-extrusion-has-vertical-gradient" isBoolean:YES]; [self testPropertyName:@"fill-extrusion-height" isBoolean:NO]; [self testPropertyName:@"fill-extrusion-opacity" isBoolean:NO]; [self testPropertyName:@"fill-extrusion-pattern" isBoolean:NO]; diff --git a/platform/ios/docs/guides/For Style Authors.md b/platform/ios/docs/guides/For Style Authors.md index 23766e696a..72f326cc17 100644 --- a/platform/ios/docs/guides/For Style Authors.md +++ b/platform/ios/docs/guides/For Style Authors.md @@ -226,6 +226,7 @@ In style JSON | In Objective-C | In Swift In style JSON | In Objective-C | In Swift --------------|----------------|--------- +`fill-extrusion-vertical-gradient` | `MGLFillExtrusionStyleLayer.fillExtrusionHasVerticalGradient` | `MGLFillExtrusionStyleLayer.fillExtrusionHasVerticalGradient` `fill-extrusion-translate` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslation` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslation` `fill-extrusion-translate-anchor` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslationAnchor` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslationAnchor` diff --git a/platform/macos/docs/guides/For Style Authors.md b/platform/macos/docs/guides/For Style Authors.md index 5c34c857b2..fdba68879c 100644 --- a/platform/macos/docs/guides/For Style Authors.md +++ b/platform/macos/docs/guides/For Style Authors.md @@ -213,6 +213,7 @@ In style JSON | In Objective-C | In Swift In style JSON | In Objective-C | In Swift --------------|----------------|--------- +`fill-extrusion-vertical-gradient` | `MGLFillExtrusionStyleLayer.fillExtrusionHasVerticalGradient` | `MGLFillExtrusionStyleLayer.fillExtrusionHasVerticalGradient` `fill-extrusion-translate` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslation` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslation` `fill-extrusion-translate-anchor` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslationAnchor` | `MGLFillExtrusionStyleLayer.fillExtrusionTranslationAnchor` |