| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- * This file is part of the SDWebImage package.
- * (c) Olivier Poitrey <rs@dailymotion.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- #import "SDGraphicsImageRenderer.h"
- #import "SDImageGraphics.h"
- @interface SDGraphicsImageRendererFormat ()
- #if SD_UIKIT
- @property (nonatomic, strong) UIGraphicsImageRendererFormat *uiformat API_AVAILABLE(ios(10.0), tvos(10.0));
- #endif
- @end
- @implementation SDGraphicsImageRendererFormat
- @synthesize scale = _scale;
- @synthesize opaque = _opaque;
- @synthesize preferredRange = _preferredRange;
- #pragma mark - Property
- - (CGFloat)scale {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- return self.uiformat.scale;
- } else {
- return _scale;
- }
- #else
- return _scale;
- #endif
- }
- - (void)setScale:(CGFloat)scale {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- self.uiformat.scale = scale;
- } else {
- _scale = scale;
- }
- #else
- _scale = scale;
- #endif
- }
- - (BOOL)opaque {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- return self.uiformat.opaque;
- } else {
- return _opaque;
- }
- #else
- return _opaque;
- #endif
- }
- - (void)setOpaque:(BOOL)opaque {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- self.uiformat.opaque = opaque;
- } else {
- _opaque = opaque;
- }
- #else
- _opaque = opaque;
- #endif
- }
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- - (SDGraphicsImageRendererFormatRange)preferredRange {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- if (@available(iOS 12.0, tvOS 12.0, *)) {
- return (SDGraphicsImageRendererFormatRange)self.uiformat.preferredRange;
- } else {
- BOOL prefersExtendedRange = self.uiformat.prefersExtendedRange;
- if (prefersExtendedRange) {
- return SDGraphicsImageRendererFormatRangeExtended;
- } else {
- return SDGraphicsImageRendererFormatRangeStandard;
- }
- }
- } else {
- return _preferredRange;
- }
- #else
- return _preferredRange;
- #endif
- }
- - (void)setPreferredRange:(SDGraphicsImageRendererFormatRange)preferredRange {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- if (@available(iOS 12.0, tvOS 12.0, *)) {
- self.uiformat.preferredRange = (UIGraphicsImageRendererFormatRange)preferredRange;
- } else {
- switch (preferredRange) {
- case SDGraphicsImageRendererFormatRangeExtended:
- self.uiformat.prefersExtendedRange = YES;
- break;
- case SDGraphicsImageRendererFormatRangeStandard:
- self.uiformat.prefersExtendedRange = NO;
- default:
- // Automatic means default
- break;
- }
- }
- } else {
- _preferredRange = preferredRange;
- }
- #else
- _preferredRange = preferredRange;
- #endif
- }
- #pragma clang diagnostic pop
- - (instancetype)init {
- self = [super init];
- if (self) {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.10, *)) {
- UIGraphicsImageRendererFormat *uiformat = [[UIGraphicsImageRendererFormat alloc] init];
- self.uiformat = uiformat;
- } else {
- #endif
- #if SD_WATCH
- CGFloat screenScale = [WKInterfaceDevice currentDevice].screenScale;
- #elif SD_UIKIT
- CGFloat screenScale = [UIScreen mainScreen].scale;
- #elif SD_MAC
- NSScreen *mainScreen = nil;
- if (@available(macOS 10.12, *)) {
- mainScreen = [NSScreen mainScreen];
- } else {
- mainScreen = [NSScreen screens].firstObject;
- }
- CGFloat screenScale = mainScreen.backingScaleFactor ?: 1.0f;
- #endif
- self.scale = screenScale;
- self.opaque = NO;
- self.preferredRange = SDGraphicsImageRendererFormatRangeStandard;
- #if SD_UIKIT
- }
- #endif
- }
- return self;
- }
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wunguarded-availability"
- - (instancetype)initForMainScreen {
- self = [super init];
- if (self) {
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.0, *)) {
- UIGraphicsImageRendererFormat *uiformat;
- // iOS 11.0.0 GM does have `preferredFormat`, but iOS 11 betas did not (argh!)
- if ([UIGraphicsImageRenderer respondsToSelector:@selector(preferredFormat)]) {
- uiformat = [UIGraphicsImageRendererFormat preferredFormat];
- } else {
- uiformat = [UIGraphicsImageRendererFormat defaultFormat];
- }
- self.uiformat = uiformat;
- } else {
- #endif
- #if SD_WATCH
- CGFloat screenScale = [WKInterfaceDevice currentDevice].screenScale;
- #elif SD_UIKIT
- CGFloat screenScale = [UIScreen mainScreen].scale;
- #elif SD_MAC
- NSScreen *mainScreen = nil;
- if (@available(macOS 10.12, *)) {
- mainScreen = [NSScreen mainScreen];
- } else {
- mainScreen = [NSScreen screens].firstObject;
- }
- CGFloat screenScale = mainScreen.backingScaleFactor ?: 1.0f;
- #endif
- self.scale = screenScale;
- self.opaque = NO;
- self.preferredRange = SDGraphicsImageRendererFormatRangeStandard;
- #if SD_UIKIT
- }
- #endif
- }
- return self;
- }
- #pragma clang diagnostic pop
- + (instancetype)preferredFormat {
- SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] initForMainScreen];
- return format;
- }
- @end
- @interface SDGraphicsImageRenderer ()
- @property (nonatomic, assign) CGSize size;
- @property (nonatomic, strong) SDGraphicsImageRendererFormat *format;
- #if SD_UIKIT
- @property (nonatomic, strong) UIGraphicsImageRenderer *uirenderer API_AVAILABLE(ios(10.0), tvos(10.0));
- #endif
- @end
- @implementation SDGraphicsImageRenderer
- - (instancetype)initWithSize:(CGSize)size {
- return [self initWithSize:size format:SDGraphicsImageRendererFormat.preferredFormat];
- }
- - (instancetype)initWithSize:(CGSize)size format:(SDGraphicsImageRendererFormat *)format {
- NSParameterAssert(format);
- self = [super init];
- if (self) {
- self.size = size;
- self.format = format;
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.0, *)) {
- UIGraphicsImageRendererFormat *uiformat = format.uiformat;
- self.uirenderer = [[UIGraphicsImageRenderer alloc] initWithSize:size format:uiformat];
- }
- #endif
- }
- return self;
- }
- - (UIImage *)imageWithActions:(NS_NOESCAPE SDGraphicsImageDrawingActions)actions {
- NSParameterAssert(actions);
- #if SD_UIKIT
- if (@available(iOS 10.0, tvOS 10.0, *)) {
- UIGraphicsImageDrawingActions uiactions = ^(UIGraphicsImageRendererContext *rendererContext) {
- if (actions) {
- actions(rendererContext.CGContext);
- }
- };
- return [self.uirenderer imageWithActions:uiactions];
- } else {
- #endif
- SDGraphicsBeginImageContextWithOptions(self.size, self.format.opaque, self.format.scale);
- CGContextRef context = SDGraphicsGetCurrentContext();
- if (actions) {
- actions(context);
- }
- UIImage *image = SDGraphicsGetImageFromCurrentImageContext();
- SDGraphicsEndImageContext();
- return image;
- #if SD_UIKIT
- }
- #endif
- }
- @end
|