summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLRendererConfiguration.mm
blob: 7a2f95cfdab16921f2a1dd02aa75fdc55eb4d92f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#import "MGLRendererConfiguration.h"
#import "MGLOfflineStorage_Private.h"
#import "MGLFoundation_Private.h"

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#else
#import <AppKit/AppKit.h>
#endif

static NSString * const MGLCollisionBehaviorPre4_0Key = @"MGLCollisionBehaviorPre4_0";

@interface MGLRendererConfiguration ()
@property (nonatomic, readwrite) BOOL perSourceCollisions;
@end


@implementation MGLRendererConfiguration

+ (instancetype)currentConfiguration {
    return [[self alloc] init];
}

- (instancetype)init {
    return [self initWithPropertyDictionary:[[NSBundle mainBundle] infoDictionary]];
}

- (instancetype)initWithPropertyDictionary:(nonnull NSDictionary *)properties {
    self = [super init];
    
    if (self) {
        // Set the collision behaviour. A value set in `NSUserDefaults.standardUserDefaults`
        // should override anything in the application's info.plist
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

        if ([defaults objectForKey:MGLCollisionBehaviorPre4_0Key]) {
            _perSourceCollisions = [defaults boolForKey:MGLCollisionBehaviorPre4_0Key];
        }
        else {
            id collisionBehaviourValue = properties[MGLCollisionBehaviorPre4_0Key];
            
            NSNumber *collisionBehaviourNumber = MGL_OBJC_DYNAMIC_CAST(collisionBehaviourValue, NSNumber);
            
            if (collisionBehaviourNumber) {
                _perSourceCollisions = collisionBehaviourNumber.boolValue;
            } else {
                // Also support NSString to correspond with the behavior of `-[NSUserDefaults boolForKey:]`
                NSString *collisionBehaviourString = MGL_OBJC_DYNAMIC_CAST(collisionBehaviourValue, NSString);

                if (collisionBehaviourString) {
                    _perSourceCollisions = collisionBehaviourString.boolValue;
                }
            }
        }
    }
    
    return self;
}

- (mbgl::DefaultFileSource *)fileSource {
    return [MGLOfflineStorage sharedOfflineStorage].mbglFileSource;
}

- (mbgl::GLContextMode)contextMode {
    return mbgl::GLContextMode::Unique;
}

- (const float)scaleFactor {
#if TARGET_OS_IPHONE
    return [UIScreen instancesRespondToSelector:@selector(nativeScale)] ? [[UIScreen mainScreen] nativeScale] : [[UIScreen mainScreen] scale];
#else
    return [NSScreen mainScreen].backingScaleFactor;
#endif
}

- (mbgl::optional<std::string>)cacheDir {
    return mbgl::optional<std::string>();
}

- (std::string)localFontFamilyName {
    NSString *fontFamilyName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MGLIdeographicFontFamilyName"];

    return fontFamilyName ? std::string([fontFamilyName UTF8String]) : std::string("PingFang");
}

@end