Files
MapLibreParticleLab/platform/ios/MGLStyleFunctionValue.m
2015-02-09 18:01:40 -08:00

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