SDImageHEICCoder.m 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * This file is part of the SDWebImage package.
  3. * (c) Olivier Poitrey <rs@dailymotion.com>
  4. *
  5. * For the full copyright and license information, please view the LICENSE
  6. * file that was distributed with this source code.
  7. */
  8. #import "SDImageHEICCoder.h"
  9. #import "SDImageIOAnimatedCoderInternal.h"
  10. // These constants are available from iOS 13+ and Xcode 11. This raw value is used for toolchain and firmware compatibility
  11. static NSString * kSDCGImagePropertyHEICSDictionary = @"{HEICS}";
  12. static NSString * kSDCGImagePropertyHEICSLoopCount = @"LoopCount";
  13. static NSString * kSDCGImagePropertyHEICSDelayTime = @"DelayTime";
  14. static NSString * kSDCGImagePropertyHEICSUnclampedDelayTime = @"UnclampedDelayTime";
  15. @implementation SDImageHEICCoder
  16. + (void)initialize {
  17. if (@available(iOS 13, tvOS 13, macOS 10.15, watchOS 6, *)) {
  18. // Use SDK instead of raw value
  19. kSDCGImagePropertyHEICSDictionary = (__bridge NSString *)kCGImagePropertyHEICSDictionary;
  20. kSDCGImagePropertyHEICSLoopCount = (__bridge NSString *)kCGImagePropertyHEICSLoopCount;
  21. kSDCGImagePropertyHEICSDelayTime = (__bridge NSString *)kCGImagePropertyHEICSDelayTime;
  22. kSDCGImagePropertyHEICSUnclampedDelayTime = (__bridge NSString *)kCGImagePropertyHEICSUnclampedDelayTime;
  23. }
  24. }
  25. + (instancetype)sharedCoder {
  26. static SDImageHEICCoder *coder;
  27. static dispatch_once_t onceToken;
  28. dispatch_once(&onceToken, ^{
  29. coder = [[SDImageHEICCoder alloc] init];
  30. });
  31. return coder;
  32. }
  33. #pragma mark - SDImageCoder
  34. - (BOOL)canDecodeFromData:(nullable NSData *)data {
  35. switch ([NSData sd_imageFormatForImageData:data]) {
  36. case SDImageFormatHEIC:
  37. // Check HEIC decoding compatibility
  38. return [self.class canDecodeFromFormat:SDImageFormatHEIC];
  39. case SDImageFormatHEIF:
  40. // Check HEIF decoding compatibility
  41. return [self.class canDecodeFromFormat:SDImageFormatHEIF];
  42. default:
  43. return NO;
  44. }
  45. }
  46. - (BOOL)canIncrementalDecodeFromData:(NSData *)data {
  47. return [self canDecodeFromData:data];
  48. }
  49. - (BOOL)canEncodeToFormat:(SDImageFormat)format {
  50. switch (format) {
  51. case SDImageFormatHEIC:
  52. // Check HEIC encoding compatibility
  53. return [self.class canEncodeToFormat:SDImageFormatHEIC];
  54. case SDImageFormatHEIF:
  55. // Check HEIF encoding compatibility
  56. return [self.class canEncodeToFormat:SDImageFormatHEIF];
  57. default:
  58. return NO;
  59. }
  60. }
  61. #pragma mark - Subclass Override
  62. + (SDImageFormat)imageFormat {
  63. return SDImageFormatHEIC;
  64. }
  65. + (NSString *)imageUTType {
  66. // See: https://nokiatech.github.io/heif/technical.html
  67. // Actually HEIC has another concept called `non-timed Image Sequence`, which can be encoded using `public.heic`
  68. return (__bridge NSString *)kSDUTTypeHEIC;
  69. }
  70. + (NSString *)animatedImageUTType {
  71. // See: https://nokiatech.github.io/heif/technical.html
  72. // We use `timed Image Sequence`, means, `public.heics` for animated image encoding
  73. return (__bridge NSString *)kSDUTTypeHEICS;
  74. }
  75. + (NSString *)dictionaryProperty {
  76. return kSDCGImagePropertyHEICSDictionary;
  77. }
  78. + (NSString *)unclampedDelayTimeProperty {
  79. return kSDCGImagePropertyHEICSUnclampedDelayTime;
  80. }
  81. + (NSString *)delayTimeProperty {
  82. return kSDCGImagePropertyHEICSDelayTime;
  83. }
  84. + (NSString *)loopCountProperty {
  85. return kSDCGImagePropertyHEICSLoopCount;
  86. }
  87. + (NSUInteger)defaultLoopCount {
  88. return 0;
  89. }
  90. @end