summaryrefslogtreecommitdiff
path: root/platform/ios/MGLStyleFunctionValue.m
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/MGLStyleFunctionValue.m')
-rw-r--r--platform/ios/MGLStyleFunctionValue.m190
1 files changed, 190 insertions, 0 deletions
diff --git a/platform/ios/MGLStyleFunctionValue.m b/platform/ios/MGLStyleFunctionValue.m
new file mode 100644
index 0000000000..a319114eef
--- /dev/null
+++ b/platform/ios/MGLStyleFunctionValue.m
@@ -0,0 +1,190 @@
+#import "MGLStyleFunctionValue.h"
+
+#import "MGLTypes.h"
+
+@interface MGLStyleFunctionValue ()
+
+@property (nonatomic) NSString *functionType;
+@property (nonatomic) NSDictionary *stops;
+@property (nonatomic) CGFloat zBase;
+@property (nonatomic) CGFloat val;
+@property (nonatomic) CGFloat slope;
+@property (nonatomic) CGFloat min;
+@property (nonatomic) CGFloat max;
+@property (nonatomic) CGFloat minimumZoom;
+@property (nonatomic) CGFloat maximumZoom;
+
+- (NSDictionary *)rawStyle;
+
+@end
+
+@implementation MGLStyleFunctionValue
+
+- (id)initWithFunctionType:(NSString *)functionType
+ stops:(NSDictionary *)stops
+ zBase:(CGFloat)zBase
+ val:(CGFloat)val
+ slope:(CGFloat)slope
+ min:(CGFloat)min
+ max:(CGFloat)max
+ minimumZoom:(CGFloat)minimumZoom
+ maximumZoom:(CGFloat)maximumZoom
+{
+ self = [super init];
+
+ if (self)
+ {
+ _functionType = functionType;
+ _stops = stops;
+ _zBase = zBase;
+ _val = val;
+ _slope = slope;
+ _min = min;
+ _max = max;
+ _minimumZoom = minimumZoom;
+ _maximumZoom = maximumZoom;
+ }
+
+ return self;
+}
+
+- (id)rawStyle
+{
+ if ([self.functionType isEqualToString:MGLStyleValueTypeFunctionMinimumZoom])
+ {
+ return @[ @"min", @(self.minimumZoom) ];
+ }
+ else if ([self.functionType isEqualToString:MGLStyleValueTypeFunctionMaximumZoom])
+ {
+ return @[ @"max", @(self.maximumZoom) ];
+ }
+ else if ([self.functionType isEqualToString:MGLStyleValueTypeFunctionLinear])
+ {
+ return @[ @"linear", @(self.zBase), @(self.val), @(self.slope), @(self.min), @(self.max) ];
+ }
+ else if ([self.functionType isEqualToString:MGLStyleValueTypeFunctionExponential])
+ {
+ return @[ @"exponential", @(self.zBase), @(self.val), @(self.slope), @(self.min), @(self.max) ];
+ }
+ else if ([self.functionType isEqualToString:MGLStyleValueTypeFunctionStops])
+ {
+ NSMutableArray *returnArray = [NSMutableArray array];
+
+ for (NSNumber *z in [self.stops allKeys])
+ {
+ [returnArray addObject:@{ @"z" : z, @"val" : self.stops[z] }];
+ }
+
+ [returnArray insertObject:@"stops" atIndex:0];
+
+ return returnArray;
+ }
+
+ return nil;
+}
+
++ (instancetype)stopsFunctionWithZoomLevelsAndValues:(NSNumber *)firstZoom, ...
+{
+ NSMutableArray *numbersArray = [NSMutableArray array];
+
+ va_list args;
+ va_start(args, firstZoom);
+
+ for (NSNumber *arg = firstZoom; arg != nil; arg = va_arg(args, NSNumber *))
+ {
+ [numbersArray addObject:arg];
+ }
+
+ va_end(args);
+
+ NSAssert([numbersArray count] % 2 == 0, @"invalid number of arguments");
+
+ NSMutableDictionary *stops = [NSMutableDictionary dictionary];
+
+ for (NSUInteger i = 0; i < [numbersArray count]; i = i + 2)
+ {
+ stops[numbersArray[i]] = stops[numbersArray[i + 1]];
+ }
+
+ return [[self alloc] initWithFunctionType:MGLStyleValueTypeFunctionStops
+ stops:stops
+ zBase:0
+ val:0
+ slope:0
+ min:0
+ max:0
+ minimumZoom:0
+ maximumZoom:0];
+}
+
++ (instancetype)linearFunctionWithBaseZoomLevel:(CGFloat)zBase
+ initialValue:(CGFloat)val
+ slope:(CGFloat)slope
+ minimumValue:(CGFloat)min
+ maximumValue:(CGFloat)max
+{
+ NSAssert(zBase >= 0 && zBase <= 18, @"invalid base zoom level");
+ NSAssert(min < max, @"minimum value must be less than maximum value");
+
+ return [[self alloc] initWithFunctionType:MGLStyleValueTypeFunctionLinear
+ stops:nil
+ zBase:zBase
+ val:val
+ slope:slope
+ min:min
+ max:max
+ minimumZoom:0
+ maximumZoom:0];
+}
+
++ (instancetype)exponentialFunctionWithBaseZoomLevel:(CGFloat)zBase
+ initialValue:(CGFloat)val
+ slope:(CGFloat)slope
+ minimumValue:(CGFloat)min
+ maximumValue:(CGFloat)max
+{
+ NSAssert(zBase >= 0 && zBase <= 18, @"invalid base zoom level");
+ NSAssert(min < max, @"minimum value must be less than maximum value");
+
+ return [[self alloc] initWithFunctionType:MGLStyleValueTypeFunctionExponential
+ stops:nil
+ zBase:zBase
+ val:val
+ slope:slope
+ min:min
+ max:max
+ minimumZoom:0
+ maximumZoom:0];
+}
+
++ (instancetype)minimumZoomLevelFunction:(CGFloat)minimumZoom
+{
+ NSAssert(minimumZoom >= 0 && minimumZoom <= 18, @"invalid minimum zoom value");
+
+ return [[self alloc] initWithFunctionType:MGLStyleValueTypeFunctionMinimumZoom
+ stops:nil
+ zBase:0
+ val:0
+ slope:0
+ min:0
+ max:0
+ minimumZoom:minimumZoom
+ maximumZoom:0];
+}
+
++ (instancetype)maximumZoomLevelFunction:(CGFloat)maximumZoom
+{
+ NSAssert(maximumZoom >= 0 && maximumZoom <= 18, @"invalid maximum zoom value");
+
+ return [[self alloc] initWithFunctionType:MGLStyleValueTypeFunctionMaximumZoom
+ stops:nil
+ zBase:0
+ val:0
+ slope:0
+ min:0
+ max:0
+ minimumZoom:0
+ maximumZoom:maximumZoom];
+}
+
+@end