Clean and consolidate some logic code in SDImageIOCoder

This commit is contained in:
zhongwuzw 2019-04-03 17:37:51 +08:00
parent efcfacebc0
commit 8e5897338c
1 changed files with 33 additions and 49 deletions

View File

@ -84,19 +84,7 @@
#pragma mark - Progressive Decode #pragma mark - Progressive Decode
- (BOOL)canIncrementalDecodeFromData:(NSData *)data { - (BOOL)canIncrementalDecodeFromData:(NSData *)data {
switch ([NSData sd_imageFormatForImageData:data]) { return [self canDecodeFromData:data];
case SDImageFormatWebP:
// Do not support WebP progressive decoding
return NO;
case SDImageFormatHEIC:
// Check HEIC decoding compatibility
return [[self class] canDecodeFromHEICFormat];
case SDImageFormatHEIF:
// Check HEIF decoding compatibility
return [[self class] canDecodeFromHEIFFormat];
default:
return YES;
}
} }
- (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)options { - (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)options {
@ -251,15 +239,21 @@
return [imageData copy]; return [imageData copy];
} }
+ (BOOL)canDecodeFromHEICFormat { + (BOOL)canDecodeFromFormat:(SDImageFormat)format {
static BOOL canDecode = NO; BOOL canDecode = NO;
static dispatch_once_t onceToken; CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:format];
dispatch_once(&onceToken, ^{
CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIC];
NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers();
if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) {
canDecode = YES; canDecode = YES;
} }
return canDecode;
}
+ (BOOL)canDecodeFromHEICFormat {
static BOOL canDecode = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
canDecode = [self canDecodeFromFormat:SDImageFormatHEIC];
}); });
return canDecode; return canDecode;
} }
@ -268,21 +262,15 @@
static BOOL canDecode = NO; static BOOL canDecode = NO;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIF]; canDecode = [self canDecodeFromFormat:SDImageFormatHEIF];
NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers();
if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) {
canDecode = YES;
}
}); });
return canDecode; return canDecode;
} }
+ (BOOL)canEncodeToHEICFormat { + (BOOL)canEncodeToFormat:(SDImageFormat)format {
static BOOL canEncode = NO; BOOL canEncode = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSMutableData *imageData = [NSMutableData data]; NSMutableData *imageData = [NSMutableData data];
CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIC]; CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:format];
// Create an image destination. // Create an image destination.
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL);
@ -294,6 +282,14 @@
CFRelease(imageDestination); CFRelease(imageDestination);
canEncode = YES; canEncode = YES;
} }
return canEncode;
}
+ (BOOL)canEncodeToHEICFormat {
static BOOL canEncode = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
canEncode = [self canEncodeToFormat:SDImageFormatHEIC];
}); });
return canEncode; return canEncode;
} }
@ -302,19 +298,7 @@
static BOOL canEncode = NO; static BOOL canEncode = NO;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
NSMutableData *imageData = [NSMutableData data]; canEncode = [self canEncodeToFormat:SDImageFormatHEIF];
CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIF];
// Create an image destination.
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL);
if (!imageDestination) {
// Can't encode to HEIF
canEncode = NO;
} else {
// Can encode to HEIF
CFRelease(imageDestination);
canEncode = YES;
}
}); });
return canEncode; return canEncode;
} }