From 8e5897338c750513fae259d3d9f49e7007b1cd9a Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Wed, 3 Apr 2019 17:37:51 +0800 Subject: [PATCH] Clean and consolidate some logic code in SDImageIOCoder --- SDWebImage/SDImageIOCoder.m | 82 +++++++++++++++---------------------- 1 file changed, 33 insertions(+), 49 deletions(-) diff --git a/SDWebImage/SDImageIOCoder.m b/SDWebImage/SDImageIOCoder.m index c745fa1f..d52b6af3 100644 --- a/SDWebImage/SDImageIOCoder.m +++ b/SDWebImage/SDImageIOCoder.m @@ -84,19 +84,7 @@ #pragma mark - Progressive Decode - (BOOL)canIncrementalDecodeFromData:(NSData *)data { - switch ([NSData sd_imageFormatForImageData: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; - } + return [self canDecodeFromData:data]; } - (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)options { @@ -251,15 +239,21 @@ return [imageData copy]; } ++ (BOOL)canDecodeFromFormat:(SDImageFormat)format { + BOOL canDecode = NO; + CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:format]; + NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); + if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { + canDecode = YES; + } + return canDecode; +} + + (BOOL)canDecodeFromHEICFormat { static BOOL canDecode = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIC]; - NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); - if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { - canDecode = YES; - } + canDecode = [self canDecodeFromFormat:SDImageFormatHEIC]; }); return canDecode; } @@ -268,32 +262,34 @@ static BOOL canDecode = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIF]; - NSArray *imageUTTypes = (__bridge_transfer NSArray *)CGImageSourceCopyTypeIdentifiers(); - if ([imageUTTypes containsObject:(__bridge NSString *)(imageUTType)]) { - canDecode = YES; - } + canDecode = [self canDecodeFromFormat:SDImageFormatHEIF]; }); return canDecode; } ++ (BOOL)canEncodeToFormat:(SDImageFormat)format { + BOOL canEncode = NO; + NSMutableData *imageData = [NSMutableData data]; + CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:format]; + + // Create an image destination. + CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); + if (!imageDestination) { + // Can't encode to HEIC + canEncode = NO; + } else { + // Can encode to HEIC + CFRelease(imageDestination); + canEncode = YES; + } + return canEncode; +} + + (BOOL)canEncodeToHEICFormat { static BOOL canEncode = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - NSMutableData *imageData = [NSMutableData data]; - CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatHEIC]; - - // Create an image destination. - CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); - if (!imageDestination) { - // Can't encode to HEIC - canEncode = NO; - } else { - // Can encode to HEIC - CFRelease(imageDestination); - canEncode = YES; - } + canEncode = [self canEncodeToFormat:SDImageFormatHEIC]; }); return canEncode; } @@ -302,19 +298,7 @@ static BOOL canEncode = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - NSMutableData *imageData = [NSMutableData data]; - 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; - } + canEncode = [self canEncodeToFormat:SDImageFormatHEIF]; }); return canEncode; }