SDImageHEICCoder.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. return (__bridge NSString *)kSDUTTypeHEIC;
  67. }
  68. + (NSString *)dictionaryProperty {
  69. return kSDCGImagePropertyHEICSDictionary;
  70. }
  71. + (NSString *)unclampedDelayTimeProperty {
  72. return kSDCGImagePropertyHEICSUnclampedDelayTime;
  73. }
  74. + (NSString *)delayTimeProperty {
  75. return kSDCGImagePropertyHEICSDelayTime;
  76. }
  77. + (NSString *)loopCountProperty {
  78. return kSDCGImagePropertyHEICSLoopCount;
  79. }
  80. + (NSUInteger)defaultLoopCount {
  81. return 0;
  82. }
  83. @end