diff options
author | Vladimir Agafonkin <agafonkin@gmail.com> | 2018-11-28 12:04:08 +0200 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2018-11-28 15:57:26 +0200 |
commit | 43990b7d7140da7767f796ea0d6816d4599a9761 (patch) | |
tree | 7a2a4875bdfc4a8d9d74ba24a48d69e96cb88258 | |
parent | e1e6db768e197273c3c079bb300e110e3923d63c (diff) | |
download | qtlocation-mapboxgl-43990b7d7140da7767f796ea0d6816d4599a9761.tar.gz |
[darwin] update darwin code for fill-extrusion-vertical-gradient
-rw-r--r-- | platform/darwin/src/MGLFillExtrusionStyleLayer.h | 21 | ||||
-rw-r--r-- | platform/darwin/src/MGLFillExtrusionStyleLayer.mm | 18 | ||||
-rw-r--r-- | platform/darwin/test/MGLFillExtrusionStyleLayerTests.mm | 45 |
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 { |