[ios, macos] Add to-rgba expression operator. (#11725)
* [ios, macos] Add expression support to to-rgba operator. * [ios, macos] Update style docs. * [ios, macos] Refactored to-rgba to to-color. * [ios, macos] Add support for to-rgba expression operator. * [ios, macos] Add multiple parameters support to to-color operand. * [ios, macos] Enable to-rgba operator for MGLColor or key path expressions. * [ios, macos] Update predicates and expressions guide to reflect cast changes. * [ios, macos] Update changelogs. * [ios, macos] Clarify color casting usage.
This commit is contained in:
committed by
GitHub
parent
a489223154
commit
a425995189
@@ -335,7 +335,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`number` | |
|
||||
`string` | |
|
||||
`to-boolean` | `boolValue` |
|
||||
`to-color` | |
|
||||
`to-color` | | `CAST(var, '<%- cocoaPrefix %>Color')`
|
||||
`to-number` | `mgl_numberWithFallbackValues:` | `CAST(zipCode, 'NSNumber')`
|
||||
`to-string` | `stringValue` | `CAST(ele, 'NSString')`
|
||||
`typeof` | |
|
||||
@@ -372,7 +372,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`rgb` | `+[UIColor colorWithRed:green:blue:alpha:]` |
|
||||
`rgba` | `+[UIColor colorWithRed:green:blue:alpha:]` |
|
||||
<% } -%>
|
||||
`to-rgba` | |
|
||||
`to-rgba` | | `CAST(noindex(var), 'NSArray')`
|
||||
`-` | `from:subtract:` | `2 - 1`
|
||||
`*` | `multiply:by:` | `1 * 2`
|
||||
`/` | `divide:by:` | `1 / 2`
|
||||
|
||||
@@ -70,6 +70,8 @@ path or variable into a matching type:
|
||||
|
||||
* To cast a value to a number, use `CAST(key, 'NSNumber')`.
|
||||
* To cast a value to a string, use `CAST(key, 'NSString')`.
|
||||
* To cast a value to a color, use `CAST(key, 'UIColor')` on iOS and `CAST(key, 'NSColor')` on macOS.
|
||||
* To cast an `NSColor` or `UIColor` object to an array, use `CAST(noindex(color), 'NSArray')`.
|
||||
|
||||
For details about the predicate format string syntax, consult the “Predicate
|
||||
Format String Syntax” chapter of the
|
||||
|
||||
@@ -802,6 +802,22 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
|
||||
} else if ([op isEqualToString:@"to-string"] || [op isEqualToString:@"string"]) {
|
||||
NSExpression *operand = [NSExpression expressionWithMGLJSONObject:argumentObjects.firstObject];
|
||||
return [NSExpression expressionWithFormat:@"CAST(%@, 'NSString')", operand];
|
||||
} else if ([op isEqualToString:@"to-color"]) {
|
||||
NSExpression *operand = [NSExpression expressionWithMGLJSONObject:argumentObjects.firstObject];
|
||||
|
||||
if (argumentObjects.count == 1) {
|
||||
#if TARGET_OS_IPHONE
|
||||
return [NSExpression expressionWithFormat:@"CAST(%@, 'UIColor')", operand];
|
||||
#else
|
||||
return [NSExpression expressionWithFormat:@"CAST(%@, 'NSColor')", operand];
|
||||
#endif
|
||||
}
|
||||
NSArray *subexpressions = MGLSubexpressionsWithJSONObjects(array);
|
||||
return [NSExpression expressionForFunction:@"MGL_FUNCTION" arguments:subexpressions];
|
||||
|
||||
} else if ([op isEqualToString:@"to-rgba"]) {
|
||||
NSExpression *operand = [NSExpression expressionWithMGLJSONObject:argumentObjects.firstObject];
|
||||
return [NSExpression expressionWithFormat:@"CAST(noindex(%@), 'NSArray')", operand];
|
||||
} else if ([op isEqualToString:@"get"]) {
|
||||
if (argumentObjects.count == 2) {
|
||||
NSExpression *operand = [NSExpression expressionWithMGLJSONObject:argumentObjects.lastObject];
|
||||
@@ -1165,6 +1181,26 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
|
||||
} else if ([type isEqualToString:@"NSNumber"]) {
|
||||
return @[@"to-number", object];
|
||||
}
|
||||
#if TARGET_OS_IPHONE
|
||||
else if ([type isEqualToString:@"UIColor"] || [type isEqualToString:@"MGLColor"]) {
|
||||
return @[@"to-color", object];
|
||||
}
|
||||
#else
|
||||
else if ([type isEqualToString:@"NSColor"] || [type isEqualToString:@"MGLColor"]) {
|
||||
return @[@"to-color", object];
|
||||
}
|
||||
#endif
|
||||
else if ([type isEqualToString:@"NSArray"]) {
|
||||
NSExpression *operand = self.arguments.firstObject;
|
||||
if ([operand expressionType] == NSFunctionExpressionType ) {
|
||||
operand = self.arguments.firstObject.arguments.firstObject;
|
||||
}
|
||||
if (([operand expressionType] != NSConstantValueExpressionType) ||
|
||||
([operand expressionType] == NSConstantValueExpressionType &&
|
||||
[[operand constantValue] isKindOfClass:[MGLColor class]])) {
|
||||
return @[@"to-rgba", object];
|
||||
}
|
||||
}
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"Casting expression to %@ not yet implemented.", type];
|
||||
} else if ([function isEqualToString:@"MGL_FUNCTION"]) {
|
||||
|
||||
@@ -668,6 +668,38 @@ using namespace std::string_literals;
|
||||
XCTAssertEqualObjects([compatibilityExpression expressionValueWithObject:@{@"number": @1.5} context:nil], @"1.5");
|
||||
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
|
||||
}
|
||||
{
|
||||
#if TARGET_OS_IPHONE
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"CAST(x, 'UIColor')"];
|
||||
#else
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"CAST(x, 'NSColor')"];
|
||||
#endif
|
||||
|
||||
NSArray *jsonExpression = @[@"to-color", @[@"get", @"x"]];
|
||||
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
|
||||
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
|
||||
}
|
||||
{
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"MGL_FUNCTION('to-color', x, y, z)"];
|
||||
NSArray *jsonExpression = @[@"to-color", @[@"get", @"x"], @[@"get", @"y"], @[@"get", @"z"]];
|
||||
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
|
||||
}
|
||||
{
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"CAST(noindex(x), 'NSArray')"];
|
||||
NSArray *jsonExpression = @[@"to-rgba", @[@"get", @"x"]];
|
||||
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
|
||||
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
|
||||
}
|
||||
{
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"CAST(noindex(%@), 'NSArray')", MGLConstantExpression(MGLColor.blueColor)];
|
||||
NSArray *jsonExpression = @[@"to-rgba", @[@"rgb", @0, @0, @255]];
|
||||
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
|
||||
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
|
||||
}
|
||||
{
|
||||
NSExpression *expression = [NSExpression expressionWithFormat:@"CAST(noindex('x'), 'NSArray')"];
|
||||
XCTAssertThrowsSpecificNamed(expression.mgl_jsonExpressionObject, NSException, NSInvalidArgumentException);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testInterpolationExpressionObject {
|
||||
|
||||
@@ -22,6 +22,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
* Reduce per-frame render CPU time ([#11811](https://github.com/mapbox/mapbox-gl-native/issues/11811))
|
||||
* Fixed a crash when removing an `MGLOfflinePack`. ([#6092](https://github.com/mapbox/mapbox-gl-native/issues/6092))
|
||||
* Fixed an issue where an `MGLOverlay` object straddling the antimeridian had an empty `MGLOverlay.overlayBounds` value. ([#11783](https://github.com/mapbox/mapbox-gl-native/pull/11783))
|
||||
* Fixed an issue where certain colors were being misrepresented in `NSExpression` obtained from `MGLStyleLayer` getters. ([#11725](https://github.com/mapbox/mapbox-gl-native/pull/11725))
|
||||
|
||||
## 4.0.0 - April 19, 2018
|
||||
|
||||
|
||||
@@ -325,7 +325,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`number` | |
|
||||
`string` | |
|
||||
`to-boolean` | `boolValue` |
|
||||
`to-color` | |
|
||||
`to-color` | | `CAST(var, 'UIColor')`
|
||||
`to-number` | `mgl_numberWithFallbackValues:` | `CAST(zipCode, 'NSNumber')`
|
||||
`to-string` | `stringValue` | `CAST(ele, 'NSString')`
|
||||
`typeof` | |
|
||||
@@ -357,7 +357,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`upcase` | `uppercase:` | `uppercase('Elysian Fields')`
|
||||
`rgb` | `+[UIColor colorWithRed:green:blue:alpha:]` |
|
||||
`rgba` | `+[UIColor colorWithRed:green:blue:alpha:]` |
|
||||
`to-rgba` | |
|
||||
`to-rgba` | | `CAST(noindex(var), 'NSArray')`
|
||||
`-` | `from:subtract:` | `2 - 1`
|
||||
`*` | `multiply:by:` | `1 * 2`
|
||||
`/` | `divide:by:` | `1 / 2`
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
return [UIColor colorWithRed:[components[0].constantValue doubleValue] / 255.0
|
||||
green:[components[1].constantValue doubleValue] / 255.0
|
||||
blue:[components[2].constantValue doubleValue] / 255.0
|
||||
alpha:components.count == 3 ? [components[3].constantValue doubleValue] : 1.0];
|
||||
alpha:components.count == 3 ? 1.0 : [components[3].constantValue doubleValue]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
* Fixed an issue where selecting an onscreen annotation could move the map unintentionally. ([#11731](https://github.com/mapbox/mapbox-gl-native/pull/11731))
|
||||
* Fixed a crash when removing an `MGLOfflinePack`. ([#6092](https://github.com/mapbox/mapbox-gl-native/issues/6092))
|
||||
* Fixed an issue where an `MGLOverlay` object straddling the antimeridian had an empty `MGLOverlay.overlayBounds` value. ([#11783](https://github.com/mapbox/mapbox-gl-native/pull/11783))
|
||||
* Fixed an issue where certain colors were being misrepresented in `NSExpression` obtained from `MGLStyleLayer` getters. ([#11725](https://github.com/mapbox/mapbox-gl-native/pull/11725))
|
||||
|
||||
## 0.7.0 - April 19, 2018
|
||||
|
||||
|
||||
@@ -318,7 +318,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`number` | |
|
||||
`string` | |
|
||||
`to-boolean` | `boolValue` |
|
||||
`to-color` | |
|
||||
`to-color` | | `CAST(var, 'NSColor')`
|
||||
`to-number` | `mgl_numberWithFallbackValues:` | `CAST(zipCode, 'NSNumber')`
|
||||
`to-string` | `stringValue` | `CAST(ele, 'NSString')`
|
||||
`typeof` | |
|
||||
@@ -350,7 +350,7 @@ In style specification | Method, function, or predicate type | Format string syn
|
||||
`upcase` | `uppercase:` | `uppercase('Elysian Fields')`
|
||||
`rgb` | `+[NSColor colorWithCalibratedRed:green:blue:alpha:]` |
|
||||
`rgba` | `+[NSColor colorWithCalibratedRed:green:blue:alpha:]` |
|
||||
`to-rgba` | |
|
||||
`to-rgba` | | `CAST(noindex(var), 'NSArray')`
|
||||
`-` | `from:subtract:` | `2 - 1`
|
||||
`*` | `multiply:by:` | `1 * 2`
|
||||
`/` | `divide:by:` | `1 / 2`
|
||||
|
||||
@@ -79,8 +79,14 @@
|
||||
|
||||
components.push_back(component.doubleValue / 255.0);
|
||||
}
|
||||
// Alpha
|
||||
components.back() *= 255.0;
|
||||
|
||||
if (components.size() < 4) {
|
||||
components.push_back(1.0);
|
||||
} else {
|
||||
// Alpha
|
||||
components.back() *= 255.0;
|
||||
}
|
||||
|
||||
|
||||
// macOS 10.12 Sierra and below uses calibrated RGB by default.
|
||||
if ([NSColor redColor].colorSpaceName == NSCalibratedRGBColorSpace) {
|
||||
|
||||
Reference in New Issue
Block a user