summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Agafonkin <agafonkin@gmail.com>2018-11-28 12:04:08 +0200
committerBruno de Oliveira Abinader <bruno@mapbox.com>2018-11-28 15:57:26 +0200
commit43990b7d7140da7767f796ea0d6816d4599a9761 (patch)
tree7a2a4875bdfc4a8d9d74ba24a48d69e96cb88258
parente1e6db768e197273c3c079bb300e110e3923d63c (diff)
downloadqtlocation-mapboxgl-43990b7d7140da7767f796ea0d6816d4599a9761.tar.gz
[darwin] update darwin code for fill-extrusion-vertical-gradient
-rw-r--r--platform/darwin/src/MGLFillExtrusionStyleLayer.h21
-rw-r--r--platform/darwin/src/MGLFillExtrusionStyleLayer.mm18
-rw-r--r--platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm45
3 files changed, 84 insertions, 0 deletions
diff --git a/platform/darwin/src/MGLFillExtrusionStyleLayer.h b/platform/darwin/src/MGLFillExtrusionStyleLayer.h
index 6e807c1b44..c35a2374ed 100644
--- a/platform/darwin/src/MGLFillExtrusionStyleLayer.h
+++ b/platform/darwin/src/MGLFillExtrusionStyleLayer.h
@@ -334,6 +334,27 @@ MGL_EXPORT
@property (nonatomic, null_resettable) NSExpression *fillExtrusionTranslateAnchor __attribute__((unavailable("Use fillExtrusionTranslationAnchor instead.")));
+/**
+ 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.
+
+ 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 *fillExtrusionVerticalGradient;
+
@end
/**
diff --git a/platform/darwin/src/MGLFillExtrusionStyleLayer.mm b/platform/darwin/src/MGLFillExtrusionStyleLayer.mm
index 03676a4ed5..ef5b0fcdbe 100644
--- a/platform/darwin/src/MGLFillExtrusionStyleLayer.mm
+++ b/platform/darwin/src/MGLFillExtrusionStyleLayer.mm
@@ -336,6 +336,24 @@ namespace mbgl {
return self.fillExtrusionTranslationAnchor;
}
+- (void)setFillExtrusionVerticalGradient:(NSExpression *)fillExtrusionVerticalGradient {
+ MGLAssertStyleLayerIsValid();
+ MGLLogDebug(@"Setting fillExtrusionVerticalGradient: %@", fillExtrusionVerticalGradient);
+
+ auto mbglValue = MGLStyleValueTransformer<bool, NSNumber *>().toPropertyValue<mbgl::style::PropertyValue<bool>>(fillExtrusionVerticalGradient, false);
+ self.rawLayer->setFillExtrusionVerticalGradient(mbglValue);
+}
+
+- (NSExpression *)fillExtrusionVerticalGradient {
+ MGLAssertStyleLayerIsValid();
+
+ auto propertyValue = self.rawLayer->getFillExtrusionVerticalGradient();
+ if (propertyValue.isUndefined()) {
+ propertyValue = self.rawLayer->getDefaultFillExtrusionVerticalGradient();
+ }
+ return MGLStyleValueTransformer<bool, NSNumber *>().toExpression(propertyValue);
+}
+
@end
@implementation NSValue (MGLFillExtrusionStyleLayerAdditions)
diff --git a/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm b/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm
index ecfa2134a0..dfec719d2a 100644
--- a/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm
+++ b/platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm
@@ -476,6 +476,50 @@
functionExpression = [NSExpression expressionWithFormat:@"mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", @{@10: functionExpression}];
XCTAssertThrowsSpecificNamed(layer.fillExtrusionTranslationAnchor = 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-vertical-gradient
+ {
+ XCTAssertTrue(rawLayer->getFillExtrusionVerticalGradient().isUndefined(),
+ @"fill-extrusion-vertical-gradient should be unset initially.");
+ NSExpression *defaultExpression = layer.fillExtrusionVerticalGradient;
+
+ NSExpression *constantExpression = [NSExpression expressionWithFormat:@"false"];
+ layer.fillExtrusionVerticalGradient = constantExpression;
+ mbgl::style::PropertyValue<bool> propertyValue = { false };
+ XCTAssertEqual(rawLayer->getFillExtrusionVerticalGradient(), propertyValue,
+ @"Setting fillExtrusionVerticalGradient to a constant value expression should update fill-extrusion-vertical-gradient.");
+ XCTAssertEqualObjects(layer.fillExtrusionVerticalGradient, constantExpression,
+ @"fillExtrusionVerticalGradient should round-trip constant value expressions.");
+
+ constantExpression = [NSExpression expressionWithFormat:@"false"];
+ NSExpression *functionExpression = [NSExpression expressionWithFormat:@"mgl_step:from:stops:($zoomLevel, %@, %@)", constantExpression, @{@18: constantExpression}];
+ layer.fillExtrusionVerticalGradient = 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 fillExtrusionVerticalGradient to a camera expression should update fill-extrusion-vertical-gradient.");
+ XCTAssertEqualObjects(layer.fillExtrusionVerticalGradient, functionExpression,
+ @"fillExtrusionVerticalGradient should round-trip camera expressions.");
+
+
+ layer.fillExtrusionVerticalGradient = nil;
+ XCTAssertTrue(rawLayer->getFillExtrusionVerticalGradient().isUndefined(),
+ @"Unsetting fillExtrusionVerticalGradient should return fill-extrusion-vertical-gradient to the default value.");
+ XCTAssertEqualObjects(layer.fillExtrusionVerticalGradient, defaultExpression,
+ @"fillExtrusionVerticalGradient should return the default value after being unset.");
+
+ functionExpression = [NSExpression expressionForKeyPath:@"bogus"];
+ XCTAssertThrowsSpecificNamed(layer.fillExtrusionVerticalGradient = 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.fillExtrusionVerticalGradient = 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.");
+ }
}
- (void)testPropertyNames {
@@ -486,6 +530,7 @@
[self testPropertyName:@"fill-extrusion-pattern" isBoolean:NO];
[self testPropertyName:@"fill-extrusion-translation" isBoolean:NO];
[self testPropertyName:@"fill-extrusion-translation-anchor" isBoolean:NO];
+ [self testPropertyName:@"fill-extrusion-vertical-gradient" isBoolean:YES];
}
- (void)testValueAdditions {