summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLStyleValue.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/src/MGLStyleValue.mm')
-rw-r--r--platform/darwin/src/MGLStyleValue.mm254
1 files changed, 235 insertions, 19 deletions
diff --git a/platform/darwin/src/MGLStyleValue.mm b/platform/darwin/src/MGLStyleValue.mm
index 9e77114378..020dc27d6a 100644
--- a/platform/darwin/src/MGLStyleValue.mm
+++ b/platform/darwin/src/MGLStyleValue.mm
@@ -1,5 +1,8 @@
#import "MGLStyleValue_Private.h"
+const MGLStyleFunctionOption MGLStyleFunctionOptionInterpolationBase = @"MGLStyleFunctionOptionInterpolationBase";
+const MGLStyleFunctionOption MGLStyleFunctionOptionDefaultValue = @"MGLStyleFunctionOptionDefaultValue";
+
@implementation MGLStyleValue
+ (instancetype)valueWithRawValue:(id)rawValue {
@@ -7,11 +10,23 @@
}
+ (instancetype)valueWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
- return [MGLStyleFunction functionWithInterpolationBase:interpolationBase stops:stops];
+ return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}];
}
+ (instancetype)valueWithStops:(NSDictionary *)stops {
- return [MGLStyleFunction functionWithStops:stops];
+ return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:nil];
+}
+
++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode cameraStops:(NSDictionary *)cameraStops options:(NSDictionary *)options {
+ return [MGLCameraStyleFunction functionWithInterpolationMode:interpolationMode stops:cameraStops options:options];
+}
+
++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode sourceStops:(NSDictionary *)sourceStops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ return [MGLSourceStyleFunction functionWithInterpolationMode:interpolationMode stops:sourceStops attributeName:attributeName options:options];
+}
+
++ (instancetype)valueWithInterpolationMode:(MGLInterpolationMode)interpolationMode compositeStops:(NSDictionary *)compositeStops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ return [MGLCompositeStyleFunction functionWithInterpolationMode:interpolationMode stops:compositeStops attributeName:attributeName options:options];
}
@end
@@ -49,44 +64,245 @@
@implementation MGLStyleFunction
-+ (instancetype)functionWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
- return [[self alloc] initWithInterpolationBase:interpolationBase stops:stops];
++ (instancetype)functionWithStops:(NSDictionary *)stops {
+ return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:nil];
}
-+ (instancetype)functionWithStops:(NSDictionary *)stops {
- return [[self alloc] initWithInterpolationBase:1 stops:stops];
++ (instancetype)functionWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
+ return [MGLCameraStyleFunction functionWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}];
}
- (instancetype)init {
- return [self initWithInterpolationBase:1 stops:@{}];
+ if (self = [super init]) {
+ self.interpolationBase = 1.0;
+ self.stops = @{};
+ }
+ return self;
}
- (instancetype)initWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
if (self = [super init]) {
- if (!stops.count)
- {
- [NSException raise:NSInvalidArgumentException format:@"%@ requires at least one stop.", self];
- }
- _interpolationBase = interpolationBase;
- _stops = stops;
+ self.interpolationBase = interpolationBase;
+ self.stops = stops;
}
return self;
}
- (NSString *)description {
- return [NSString stringWithFormat:@"<%@: %p, interpolationBase = %f; stops = %@>",
+ return [NSString stringWithFormat:@"<%@: %p, \
+ stops = %@, \
+ interpolationBase = %f>",
NSStringFromClass([self class]), (void *)self,
- self.interpolationBase,
- self.stops];
+ self.stops,
+ self.interpolationBase];
}
- (BOOL)isEqual:(MGLStyleFunction *)other {
- return ([other isKindOfClass:[self class]] && other.interpolationBase == self.interpolationBase
- && [other.stops isEqualToDictionary:self.stops]);
+ return ([other isKindOfClass:[self class]]
+ && [other.stops isEqualToDictionary:self.stops]
+ && other.interpolationBase == self.interpolationBase);
+}
+
+- (NSUInteger)hash {
+ return self.stops.hash + @(self.interpolationBase).hash;
+}
+
+@end
+
+@implementation MGLCameraStyleFunction
+
+@dynamic stops;
+
++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops options:(NSDictionary *)options {
+ return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops options:options];
+}
+
+- (instancetype)initWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
+ return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:stops options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}];
+}
+
+- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops options:(NSDictionary *)options {
+ if (![stops count]) {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Camera functions must have at least one stop."];
+ return {};
+ }
+
+ if (self == [super init]) {
+ self.interpolationMode = interpolationMode;
+ self.stops = stops;
+
+ if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) {
+ if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) {
+ NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase];
+ self.interpolationBase = [value floatValue];
+ } else {
+ [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."];
+ }
+ }
+ }
+ return self;
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"<%@: %p, \
+ interpolationMode = %lu, \
+ stops = %@, \
+ interpolationBase = %f>",
+ NSStringFromClass([self class]), (void *)self,
+ (unsigned long)self.interpolationMode,
+ self.stops,
+ self.interpolationBase];
+}
+
+- (BOOL)isEqual:(MGLCameraStyleFunction *)other {
+ return ([other isKindOfClass:[self class]]
+ && other.interpolationMode == self.interpolationMode
+ && [other.stops isEqualToDictionary:self.stops]
+ && other.interpolationBase == self.interpolationBase);
+}
+
+- (NSUInteger)hash {
+ return @(self.interpolationMode).hash + self.stops.hash + @(self.interpolationBase).hash;
+}
+
+@end
+
+@implementation MGLSourceStyleFunction
+
+@dynamic stops;
+
++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options];
+}
+
+- (instancetype)initWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
+ return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:stops attributeName:@"" options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}];
+}
+
+- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ if (self == [super init]) {
+ self.interpolationMode = interpolationMode;
+ self.stops = stops;
+ _attributeName = attributeName;
+
+ if ([options.allKeys containsObject:MGLStyleFunctionOptionDefaultValue]) {
+ if ([options[MGLStyleFunctionOptionDefaultValue] isKindOfClass:[MGLStyleValue class]]) {
+ MGLStyleValue *value = (MGLStyleValue *)options[MGLStyleFunctionOptionDefaultValue];
+ _defaultValue = value;
+ } else {
+ [NSException raise:NSInvalidArgumentException format:@"Default value must be an MGLStyleValue"];
+ }
+ }
+
+ if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) {
+ if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) {
+ NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase];
+ self.interpolationBase = [value floatValue];
+ } else {
+ [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."];
+ }
+ }
+ }
+ return self;
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"<%@: %p, \
+ interpolationMode = %lu, \
+ stops = %@, \
+ attributeName = %@, \
+ defaultValue = %@, \
+ interpolationBase = %f>",
+ NSStringFromClass([self class]),
+ (void *)self,
+ (unsigned long)self.interpolationMode,
+ self.stops,
+ self.attributeName,
+ self.defaultValue,
+ self.interpolationBase];
+}
+
+- (BOOL)isEqual:(MGLSourceStyleFunction *)other {
+ return ([other isKindOfClass:[self class]]
+ && other.interpolationMode == self.interpolationMode
+ && ((self.stops && [other.stops isEqualToDictionary:self.stops]) || (!self.stops && !other.stops))
+ && [other.attributeName isEqual:self.attributeName]
+ && ((self.defaultValue && [other.defaultValue isEqual:self.defaultValue]) || (!self.defaultValue && !other.defaultValue))
+ && other.interpolationBase == self.interpolationBase);
+}
+
+- (NSUInteger)hash {
+ return @(self.interpolationMode).hash + self.stops.hash + self.attributeName.hash + self.defaultValue.hash + @(self.interpolationBase).hash;
+}
+
+@end
+
+@implementation MGLCompositeStyleFunction
+
+@dynamic stops;
+
++ (instancetype)functionWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ return [[self alloc] initWithInterpolationMode:interpolationMode stops:stops attributeName:attributeName options:options];
+}
+
+- (instancetype)initWithInterpolationBase:(CGFloat)interpolationBase stops:(NSDictionary *)stops {
+ return [self initWithInterpolationMode:MGLInterpolationModeExponential stops:stops attributeName:@"" options:@{MGLStyleFunctionOptionInterpolationBase: @(interpolationBase)}];
+}
+
+- (instancetype)initWithInterpolationMode:(MGLInterpolationMode)interpolationMode stops:(NSDictionary *)stops attributeName:(NSString *)attributeName options:(NSDictionary *)options {
+ if (self == [super init]) {
+ self.interpolationMode = interpolationMode;
+ self.stops = stops;
+ _attributeName = attributeName;
+
+ if ([options.allKeys containsObject:MGLStyleFunctionOptionDefaultValue]) {
+ if ([options[MGLStyleFunctionOptionDefaultValue] isKindOfClass:[MGLStyleValue class]]) {
+ MGLStyleValue *value = (MGLStyleValue *)options[MGLStyleFunctionOptionDefaultValue];
+ _defaultValue = value;
+ } else {
+ [NSException raise:NSInvalidArgumentException format:@"Default value must be an MGLStyleValue"];
+ }
+ }
+
+ if ([options.allKeys containsObject:MGLStyleFunctionOptionInterpolationBase]) {
+ if ([options[MGLStyleFunctionOptionInterpolationBase] isKindOfClass:[NSNumber class]]) {
+ NSNumber *value = (NSNumber *)options[MGLStyleFunctionOptionInterpolationBase];
+ self.interpolationBase = [value floatValue];
+ } else {
+ [NSException raise:NSInvalidArgumentException format:@"Interpolation base must be an NSNumber that represents a CGFloat."];
+ }
+ }
+ }
+ return self;
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"<%@: %p, \
+ interpolationMode = %lu, \
+ stops = %@, \
+ attributeName = %@, \
+ defaultValue = %@, \
+ interpolationBase = %f>",
+ NSStringFromClass([self class]), (void *)self,
+ (unsigned long)self.interpolationMode,
+ self.stops,
+ self.attributeName,
+ self.defaultValue,
+ self.interpolationBase];
+}
+
+- (BOOL)isEqual:(MGLCompositeStyleFunction *)other {
+ return ([other isKindOfClass:[self class]]
+ && other.interpolationMode == self.interpolationMode
+ && [other.stops isEqualToDictionary:self.stops]
+ && [other.attributeName isEqual:self.attributeName]
+ && ((self.defaultValue && [other.defaultValue isEqual:self.defaultValue]) || (!self.defaultValue && !other.defaultValue))
+ && other.interpolationBase == self.interpolationBase);
}
- (NSUInteger)hash {
- return self.interpolationBase + self.stops.hash;
+ return @(self.interpolationMode).hash + self.stops.hash + self.attributeName.hash + @(self.interpolationBase).hash;
}
@end