191 lines
6.5 KiB
Objective-C
191 lines
6.5 KiB
Objective-C
#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
|