Przeglądaj źródła

Add support for SDAnimatedImageRep for HEIC sequence

DreamPiggy 6 lat temu
rodzic
commit
2afd943cd9

+ 1 - 3
SDWebImage/Core/NSData+ImageContentType.m

@@ -13,12 +13,10 @@
 #else
 #import <MobileCoreServices/MobileCoreServices.h>
 #endif
+#import "SDImageHEICCoderInternal.h"
 
 // Currently Image/IO does not support WebP
 #define kSDUTTypeWebP ((__bridge CFStringRef)@"public.webp")
-// AVFileTypeHEIC/AVFileTypeHEIF is defined in AVFoundation via iOS 11, we use this without import AVFoundation
-#define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic")
-#define kSDUTTypeHEIF ((__bridge CFStringRef)@"public.heif")
 
 @implementation NSData (ImageContentType)
 

+ 12 - 0
SDWebImage/Core/SDAnimatedImageRep.m

@@ -13,6 +13,8 @@
 #import "SDImageIOAnimatedCoderInternal.h"
 #import "SDImageGIFCoder.h"
 #import "SDImageAPNGCoder.h"
+#import "SDImageHEICCoder.h"
+#import "SDImageHEICCoderInternal.h"
 
 @implementation SDAnimatedImageRep {
     CGImageSourceRef _imageSource;
@@ -61,6 +63,13 @@
             [self setProperty:NSImageCurrentFrame withValue:@(0)];
             NSUInteger loopCount = [SDImageAPNGCoder imageLoopCountWithSource:imageSource];
             [self setProperty:NSImageLoopCount withValue:@(loopCount)];
+        } else if (CFStringCompare(type, kSDUTTypeHEICS, 0) == kCFCompareEqualTo) {
+            // HEIC
+            // Do initilize about frame count, current frame/duration and loop count
+            [self setProperty:NSImageFrameCount withValue:@(frameCount)];
+            [self setProperty:NSImageCurrentFrame withValue:@(0)];
+            NSUInteger loopCount = [SDImageHEICCoder imageLoopCountWithSource:imageSource];
+            [self setProperty:NSImageLoopCount withValue:@(loopCount)];
         }
     }
     return self;
@@ -88,6 +97,9 @@
         } else if (CFStringCompare(type, kUTTypePNG, 0) == kCFCompareEqualTo) {
             // APNG
             frameDuration = [SDImageAPNGCoder frameDurationAtIndex:index source:imageSource];
+        } else if (CFStringCompare(type, kSDUTTypeHEICS, 0) == kCFCompareEqualTo) {
+            // HEIC
+            frameDuration = [SDImageHEICCoder frameDurationAtIndex:index source:imageSource];
         }
         if (!frameDuration) {
             return;

+ 9 - 3
SDWebImage/Core/SDImageHEICCoder.m

@@ -1,7 +1,13 @@
-#import "SDImageHEICCoder.h"
+/*
+* 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.
+*/
 
-// AVFileTypeHEIC/AVFileTypeHEIF is defined in AVFoundation via iOS 11, we use this without import AVFoundation
-#define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic")
+#import "SDImageHEICCoder.h"
+#import "SDImageHEICCoderInternal.h"
 
 // These constantce are available from iOS 13+ and Xcode 11. This raw value is used for toolchain and firmware compatiblitiy
 static CFStringRef kSDCGImagePropertyHEICSDictionary = (__bridge CFStringRef)@"{HEICS}";

+ 6 - 0
SDWebImage/Private/SDImageHEICCoderInternal.h

@@ -9,6 +9,12 @@
 #import <Foundation/Foundation.h>
 #import "SDImageHEICCoder.h"
 
+// AVFileTypeHEIC/AVFileTypeHEIF is defined in AVFoundation via iOS 11, we use this without import AVFoundation
+#define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic")
+#define kSDUTTypeHEIF ((__bridge CFStringRef)@"public.heif")
+// HEIC Sequence (Animated Image)
+#define kSDUTTypeHEICS ((__bridge CFStringRef)@"public.heics")
+
 @interface SDImageHEICCoder ()
 
 + (BOOL)canDecodeFromHEICFormat;