diff options
Diffstat (limited to 'platform/ios/MGLStyleFunctionValue.m')
-rw-r--r-- | platform/ios/MGLStyleFunctionValue.m | 190 |
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 |