@momo-kits/native-kits 0.0.1-beta.5 → 0.89.1-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/README.md +1 -0
  2. package/android/.gradle/8.0/checksums/checksums.lock +0 -0
  3. package/android/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock +0 -0
  4. package/android/.gradle/8.0/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.0/fileChanges/last-build.bin +0 -0
  6. package/android/.gradle/8.0/fileHashes/fileHashes.lock +0 -0
  7. package/android/.gradle/8.0/gc.properties +0 -0
  8. package/android/.gradle/config.properties +2 -0
  9. package/android/.gradle/vcs-1/gc.properties +0 -0
  10. package/android/.idea/gradle.xml +12 -0
  11. package/android/.idea/migrations.xml +10 -0
  12. package/android/.idea/misc.xml +10 -0
  13. package/android/.idea/vcs.xml +6 -0
  14. package/android/.idea/workspace.xml +50 -0
  15. package/android/build.gradle +35 -69
  16. package/android/local.properties +8 -0
  17. package/android/proguard-rules.pro +21 -0
  18. package/android/src/main/AndroidManifest.xml +2 -2
  19. package/android/src/main/java/com/momoplatform/nativekits/foundations/Button.kt +16 -0
  20. package/android/src/main/java/com/momoplatform/nativekits/libs/Logo.kt +63 -0
  21. package/android/src/main/java/com/momoplatform/nativekits/libs/TrustBanner.kt +246 -0
  22. package/android/src/main/res/drawable/ic_launcher_background.xml +170 -0
  23. package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
  24. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
  25. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
  26. package/android/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  27. package/android/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  28. package/android/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  29. package/android/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  30. package/android/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  31. package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  32. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  33. package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  34. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  35. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  36. package/android/src/main/res/values/colors.xml +10 -0
  37. package/android/src/main/res/values/strings.xml +3 -0
  38. package/android/src/main/res/values/themes.xml +3 -0
  39. package/android/src/main/res/values-night/themes.xml +3 -0
  40. package/android/src/main/res/xml/backup_rules.xml +13 -0
  41. package/android/src/main/res/xml/data_extraction_rules.xml +19 -0
  42. package/build.gradle.kts +18 -0
  43. package/compose/build.gradle.kts +82 -0
  44. package/compose/src/androidMain/AndroidManifest.xml +2 -0
  45. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  46. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +8 -0
  47. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Utils.android.kt +14 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Components.kt +194 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +197 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +133 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +62 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +27 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +288 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +80 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +42 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +126 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +51 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +299 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +246 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +223 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +244 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +281 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PromotionPopup.kt +72 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +65 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +64 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +63 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +73 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +42 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +150 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +173 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +242 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +2 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1321 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +5 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +97 -0
  83. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  84. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +9 -0
  85. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Utils.ios.kt +18 -0
  86. package/gradle.properties +19 -0
  87. package/gradlew +240 -0
  88. package/gradlew.bat +91 -0
  89. package/ios/Button/Button.swift +9 -2
  90. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
  91. package/ios/Colors+Radius+Spacing/Colors.swift +21 -19
  92. package/ios/Input/Input.swift +1 -0
  93. package/ios/OTPKeyboard/KeyboardButton.swift +12 -4
  94. package/ios/Popup/PopupDisplay.swift +72 -81
  95. package/ios/Popup/PopupInput.swift +96 -0
  96. package/ios/Popup/PopupPromotion.swift +52 -0
  97. package/ios/ScrollIndicator/ScrollIndicator.swift +79 -0
  98. package/ios/Template/Logo/Logo.swift +75 -0
  99. package/ios/Template/TrustBanner/TrustBanner.swift +189 -0
  100. package/ios/native-kits.podspec +1 -1
  101. package/local.properties +8 -0
  102. package/package.json +6 -6
  103. package/publish.sh +1 -10
  104. package/settings.gradle.kts +41 -0
  105. package/android/gradle.properties +0 -5
  106. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
  107. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
  108. package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
  109. package/example/ios/Example/Assets.xcassets/Background.colorset/Contents.json +0 -38
  110. package/example/ios/Example/Assets.xcassets/Border.colorset/Contents.json +0 -38
  111. package/example/ios/Example/Assets.xcassets/Card.colorset/Contents.json +0 -38
  112. package/example/ios/Example/Assets.xcassets/Contents.json +0 -6
  113. package/example/ios/Example/Assets.xcassets/Error.colorset/Contents.json +0 -38
  114. package/example/ios/Example/Assets.xcassets/Primary.colorset/Contents.json +0 -38
  115. package/example/ios/Example/Assets.xcassets/PrimaryDark.colorset/Contents.json +0 -38
  116. package/example/ios/Example/Assets.xcassets/PrimaryLight.colorset/Contents.json +0 -38
  117. package/example/ios/Example/Assets.xcassets/Secondary.colorset/Contents.json +0 -38
  118. package/example/ios/Example/Assets.xcassets/Success.colorset/Contents.json +0 -38
  119. package/example/ios/Example/Assets.xcassets/Text.colorset/Contents.json +0 -38
  120. package/example/ios/Example/Assets.xcassets/TextSecondary.colorset/Contents.json +0 -38
  121. package/example/ios/Example/Assets.xcassets/Warning.colorset/Contents.json +0 -38
  122. package/example/ios/Example/ComponentDetail.swift +0 -35
  123. package/example/ios/Example/ComponentItem.swift +0 -24
  124. package/example/ios/Example/ComponentModel.swift +0 -38
  125. package/example/ios/Example/ContentView.swift +0 -39
  126. package/example/ios/Example/Example.entitlements +0 -10
  127. package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
  128. package/example/ios/Example/Foundation/ImageDemo.swift +0 -43
  129. package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
  130. package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
  131. package/example/ios/Example/Foundation/Popup/Popups.swift +0 -51
  132. package/example/ios/Example/Foundation/PopupDemo.swift +0 -389
  133. package/example/ios/Example/Foundation/TextInputDemo.swift +0 -36
  134. package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
  135. package/example/ios/Example/Foundation.swift +0 -26
  136. package/example/ios/Example/Info.plist +0 -18
  137. package/example/ios/Example/Library/CheckboxDemo.swift +0 -19
  138. package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
  139. package/example/ios/Example/Library/SwitchDemo.swift +0 -19
  140. package/example/ios/Example/Library.swift +0 -26
  141. package/example/ios/Example/Main.swift +0 -27
  142. package/example/ios/Example/Overview.swift +0 -20
  143. package/example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json +0 -6
  144. package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
  145. package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
  146. package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
  147. package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
  148. package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
  149. package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
  150. package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
  151. package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
  152. package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
  153. package/example/ios/Example/Resource/foundation.json +0 -33
  154. package/example/ios/Example/Resource/library.json +0 -18
  155. package/example/ios/Example/Utils.swift +0 -30
  156. package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
  157. package/example/ios/Example.xcodeproj/project.pbxproj +0 -581
  158. package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  159. package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  160. package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  161. package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  162. package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
  163. package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  164. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  165. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  166. package/example/ios/Podfile +0 -7
  167. package/example/ios/Podfile.lock +0 -35
  168. package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -37
  169. package/example/ios/Pods/Manifest.lock +0 -35
  170. package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -2047
  171. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  172. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  173. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  174. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  175. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  176. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
  177. package/example/ios/Pods/SDWebImage/LICENSE +0 -20
  178. package/example/ios/Pods/SDWebImage/README.md +0 -352
  179. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +0 -340
  180. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +0 -172
  181. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +0 -63
  182. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +0 -165
  183. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +0 -67
  184. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +0 -120
  185. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +0 -114
  186. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +0 -392
  187. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +0 -112
  188. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +0 -420
  189. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +0 -23
  190. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +0 -133
  191. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +0 -168
  192. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +0 -79
  193. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +0 -110
  194. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +0 -540
  195. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +0 -145
  196. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +0 -326
  197. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +0 -73
  198. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +0 -256
  199. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +0 -19
  200. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +0 -58
  201. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +0 -23
  202. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +0 -98
  203. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +0 -450
  204. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +0 -1030
  205. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +0 -153
  206. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +0 -68
  207. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +0 -156
  208. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +0 -138
  209. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +0 -81
  210. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +0 -556
  211. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +0 -297
  212. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +0 -26
  213. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +0 -153
  214. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +0 -822
  215. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +0 -58
  216. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +0 -130
  217. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +0 -36
  218. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +0 -28
  219. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +0 -22
  220. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +0 -58
  221. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +0 -28
  222. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +0 -127
  223. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +0 -25
  224. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +0 -101
  225. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +0 -58
  226. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +0 -807
  227. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +0 -30
  228. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +0 -420
  229. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +0 -146
  230. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +0 -170
  231. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +0 -40
  232. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +0 -123
  233. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +0 -241
  234. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +0 -331
  235. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +0 -78
  236. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +0 -158
  237. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +0 -32
  238. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +0 -39
  239. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +0 -36
  240. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +0 -39
  241. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +0 -95
  242. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +0 -17
  243. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +0 -352
  244. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +0 -149
  245. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +0 -314
  246. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +0 -658
  247. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +0 -113
  248. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +0 -60
  249. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +0 -49
  250. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +0 -55
  251. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +0 -191
  252. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +0 -722
  253. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +0 -69
  254. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +0 -71
  255. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +0 -69
  256. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +0 -73
  257. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +0 -32
  258. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +0 -16
  259. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +0 -115
  260. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +0 -275
  261. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +0 -290
  262. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +0 -775
  263. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +0 -27
  264. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +0 -14
  265. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +0 -72
  266. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +0 -59
  267. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +0 -143
  268. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +0 -303
  269. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +0 -131
  270. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +0 -194
  271. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +0 -387
  272. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +0 -234
  273. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +0 -24
  274. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +0 -23
  275. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +0 -46
  276. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +0 -60
  277. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +0 -26
  278. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +0 -22
  279. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +0 -27
  280. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +0 -47
  281. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +0 -89
  282. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +0 -221
  283. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +0 -80
  284. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +0 -47
  285. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +0 -146
  286. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +0 -824
  287. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +0 -129
  288. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +0 -76
  289. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +0 -194
  290. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +0 -67
  291. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +0 -110
  292. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +0 -446
  293. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +0 -48
  294. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +0 -82
  295. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +0 -24
  296. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +0 -42
  297. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +0 -14
  298. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +0 -29
  299. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +0 -21
  300. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +0 -92
  301. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +0 -18
  302. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +0 -32
  303. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +0 -29
  304. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +0 -227
  305. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +0 -19
  306. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +0 -127
  307. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +0 -23
  308. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +0 -164
  309. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +0 -21
  310. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +0 -83
  311. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +0 -39
  312. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +0 -122
  313. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +0 -13
  314. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +0 -20
  315. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +0 -79
  316. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +0 -19
  317. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +0 -667
  318. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +0 -18
  319. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +0 -42
  320. package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +0 -89
  321. package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +0 -19
  322. package/example/ios/Pods/SDWebImageSwiftUI/README.md +0 -690
  323. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +0 -870
  324. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +0 -59
  325. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +0 -52
  326. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +0 -124
  327. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +0 -151
  328. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +0 -78
  329. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +0 -132
  330. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +0 -122
  331. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +0 -133
  332. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +0 -82
  333. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +0 -97
  334. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +0 -114
  335. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +0 -64
  336. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +0 -92
  337. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +0 -93
  338. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +0 -509
  339. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +0 -15
  340. package/example/ios/Pods/SkeletonUI/LICENSE +0 -21
  341. package/example/ios/Pods/SkeletonUI/README.md +0 -137
  342. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +0 -29
  343. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +0 -7
  344. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +0 -56
  345. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +0 -58
  346. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +0 -5
  347. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +0 -16
  348. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +0 -102
  349. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +0 -26
  350. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +0 -5
  351. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +0 -19
  352. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +0 -27
  353. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +0 -35
  354. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +0 -29
  355. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +0 -8
  356. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +0 -8
  357. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +0 -52
  358. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +0 -41
  359. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +0 -9
  360. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +0 -29
  361. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +0 -7
  362. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +0 -29
  363. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +0 -7
  364. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +0 -4
  365. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +0 -29
  366. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +0 -7
  367. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +0 -33
  368. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +0 -5
  369. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +0 -20
  370. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +0 -27
  371. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +0 -20
  372. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +0 -15
  373. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +0 -64
  374. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +0 -25
  375. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
  376. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
  377. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
  378. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -15
  379. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
  380. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -15
  381. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -75
  382. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -119
  383. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
  384. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
  385. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -15
  386. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
  387. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -15
  388. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +0 -5
  389. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +0 -12
  390. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +0 -75
  391. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +0 -14
  392. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +0 -6
  393. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +0 -14
  394. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +0 -5
  395. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +0 -12
  396. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +0 -17
  397. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +0 -17
  398. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +0 -6
  399. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +0 -17
  400. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +0 -5
  401. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +0 -12
  402. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +0 -16
  403. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +0 -12
  404. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +0 -6
  405. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +0 -12
  406. package/ios/Extensions/View++.swift +0 -9
@@ -1,822 +0,0 @@
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
-
9
- #import "SDImageCoderHelper.h"
10
- #import "SDImageFrame.h"
11
- #import "NSImage+Compatibility.h"
12
- #import "NSData+ImageContentType.h"
13
- #import "SDAnimatedImageRep.h"
14
- #import "UIImage+ForceDecode.h"
15
- #import "SDAssociatedObject.h"
16
- #import "UIImage+Metadata.h"
17
- #import "SDInternalMacros.h"
18
- #import "SDGraphicsImageRenderer.h"
19
- #import "SDInternalMacros.h"
20
- #import <Accelerate/Accelerate.h>
21
-
22
- static inline size_t SDByteAlign(size_t size, size_t alignment) {
23
- return ((size + (alignment - 1)) / alignment) * alignment;
24
- }
25
-
26
- #if SD_UIKIT
27
- static inline UIImage *SDImageDecodeUIKit(UIImage *image) {
28
- // See: https://developer.apple.com/documentation/uikit/uiimage/3750834-imagebypreparingfordisplay
29
- // Need CGImage-based
30
- if (@available(iOS 15, tvOS 15, *)) {
31
- UIImage *decodedImage = [image imageByPreparingForDisplay];
32
- if (decodedImage) {
33
- SDImageCopyAssociatedObject(image, decodedImage);
34
- decodedImage.sd_isDecoded = YES;
35
- return decodedImage;
36
- }
37
- }
38
- return nil;
39
- }
40
-
41
- static inline UIImage *SDImageDecodeAndScaleDownUIKit(UIImage *image, CGSize destResolution) {
42
- // See: https://developer.apple.com/documentation/uikit/uiimage/3750835-imagebypreparingthumbnailofsize
43
- // Need CGImage-based
44
- if (@available(iOS 15, tvOS 15, *)) {
45
- // Calculate thumbnail point size
46
- CGFloat scale = image.scale ?: 1;
47
- CGSize thumbnailSize = CGSizeMake(destResolution.width / scale, destResolution.height / scale);
48
- UIImage *decodedImage = [image imageByPreparingThumbnailOfSize:thumbnailSize];
49
- if (decodedImage) {
50
- SDImageCopyAssociatedObject(image, decodedImage);
51
- decodedImage.sd_isDecoded = YES;
52
- return decodedImage;
53
- }
54
- }
55
- return nil;
56
- }
57
-
58
- static inline BOOL SDImageSupportsHardwareHEVCDecoder(void) {
59
- static dispatch_once_t onceToken;
60
- static BOOL supportsHardware = NO;
61
- dispatch_once(&onceToken, ^{
62
- SEL DeviceInfoSelector = SD_SEL_SPI(deviceInfoForKey:);
63
- NSString *HEVCDecoder8bitSupported = @"N8lZxRgC7lfdRS3dRLn+Ag";
64
- #pragma clang diagnostic push
65
- #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
66
- if ([UIDevice.currentDevice respondsToSelector:DeviceInfoSelector] && [UIDevice.currentDevice performSelector:DeviceInfoSelector withObject:HEVCDecoder8bitSupported]) {
67
- supportsHardware = YES;
68
- }
69
- #pragma clang diagnostic pop
70
- });
71
- return supportsHardware;
72
- }
73
- #endif
74
-
75
- static SDImageCoderDecodeSolution kDefaultDecodeSolution = SDImageCoderDecodeSolutionAutomatic;
76
-
77
- static const size_t kBytesPerPixel = 4;
78
- static const size_t kBitsPerComponent = 8;
79
-
80
- static const CGFloat kBytesPerMB = 1024.0f * 1024.0f;
81
- /*
82
- * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set
83
- * Suggested value for iPad1 and iPhone 3GS: 60.
84
- * Suggested value for iPad2 and iPhone 4: 120.
85
- * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30.
86
- */
87
- #if SD_MAC
88
- static CGFloat kDestImageLimitBytes = 90.f * kBytesPerMB;
89
- #elif SD_UIKIT
90
- static CGFloat kDestImageLimitBytes = 60.f * kBytesPerMB;
91
- #elif SD_WATCH
92
- static CGFloat kDestImageLimitBytes = 30.f * kBytesPerMB;
93
- #endif
94
-
95
- static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet.
96
-
97
- @implementation SDImageCoderHelper
98
-
99
- + (UIImage *)animatedImageWithFrames:(NSArray<SDImageFrame *> *)frames {
100
- NSUInteger frameCount = frames.count;
101
- if (frameCount == 0) {
102
- return nil;
103
- }
104
-
105
- UIImage *animatedImage;
106
-
107
- #if SD_UIKIT || SD_WATCH
108
- NSUInteger durations[frameCount];
109
- for (size_t i = 0; i < frameCount; i++) {
110
- durations[i] = frames[i].duration * 1000;
111
- }
112
- NSUInteger const gcd = gcdArray(frameCount, durations);
113
- __block NSTimeInterval totalDuration = 0;
114
- NSMutableArray<UIImage *> *animatedImages = [NSMutableArray arrayWithCapacity:frameCount];
115
- [frames enumerateObjectsUsingBlock:^(SDImageFrame * _Nonnull frame, NSUInteger idx, BOOL * _Nonnull stop) {
116
- UIImage *image = frame.image;
117
- NSUInteger duration = frame.duration * 1000;
118
- totalDuration += frame.duration;
119
- NSUInteger repeatCount;
120
- if (gcd) {
121
- repeatCount = duration / gcd;
122
- } else {
123
- repeatCount = 1;
124
- }
125
- for (size_t i = 0; i < repeatCount; ++i) {
126
- [animatedImages addObject:image];
127
- }
128
- }];
129
-
130
- animatedImage = [UIImage animatedImageWithImages:animatedImages duration:totalDuration];
131
-
132
- #else
133
-
134
- NSMutableData *imageData = [NSMutableData data];
135
- CFStringRef imageUTType = [NSData sd_UTTypeFromImageFormat:SDImageFormatGIF];
136
- // Create an image destination. GIF does not support EXIF image orientation
137
- CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frameCount, NULL);
138
- if (!imageDestination) {
139
- // Handle failure.
140
- return nil;
141
- }
142
-
143
- for (size_t i = 0; i < frameCount; i++) {
144
- SDImageFrame *frame = frames[i];
145
- NSTimeInterval frameDuration = frame.duration;
146
- CGImageRef frameImageRef = frame.image.CGImage;
147
- NSDictionary *frameProperties = @{(__bridge NSString *)kCGImagePropertyGIFDictionary : @{(__bridge NSString *)kCGImagePropertyGIFDelayTime : @(frameDuration)}};
148
- CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties);
149
- }
150
- // Finalize the destination.
151
- if (CGImageDestinationFinalize(imageDestination) == NO) {
152
- // Handle failure.
153
- CFRelease(imageDestination);
154
- return nil;
155
- }
156
- CFRelease(imageDestination);
157
- CGFloat scale = MAX(frames.firstObject.image.scale, 1);
158
-
159
- SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:imageData];
160
- NSSize size = NSMakeSize(imageRep.pixelsWide / scale, imageRep.pixelsHigh / scale);
161
- imageRep.size = size;
162
- animatedImage = [[NSImage alloc] initWithSize:size];
163
- [animatedImage addRepresentation:imageRep];
164
- #endif
165
-
166
- return animatedImage;
167
- }
168
-
169
- + (NSArray<SDImageFrame *> *)framesFromAnimatedImage:(UIImage *)animatedImage {
170
- if (!animatedImage) {
171
- return nil;
172
- }
173
-
174
- NSMutableArray<SDImageFrame *> *frames;
175
- NSUInteger frameCount = 0;
176
-
177
- #if SD_UIKIT || SD_WATCH
178
- NSArray<UIImage *> *animatedImages = animatedImage.images;
179
- frameCount = animatedImages.count;
180
- if (frameCount == 0) {
181
- return nil;
182
- }
183
- frames = [NSMutableArray arrayWithCapacity:frameCount];
184
-
185
- NSTimeInterval avgDuration = animatedImage.duration / frameCount;
186
- if (avgDuration == 0) {
187
- avgDuration = 0.1; // if it's a animated image but no duration, set it to default 100ms (this do not have that 10ms limit like GIF or WebP to allow custom coder provide the limit)
188
- }
189
-
190
- __block NSUInteger repeatCount = 1;
191
- __block UIImage *previousImage = animatedImages.firstObject;
192
- [animatedImages enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {
193
- // ignore first
194
- if (idx == 0) {
195
- return;
196
- }
197
- if ([image isEqual:previousImage]) {
198
- repeatCount++;
199
- } else {
200
- SDImageFrame *frame = [SDImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount];
201
- [frames addObject:frame];
202
- repeatCount = 1;
203
- }
204
- previousImage = image;
205
- }];
206
- // last one
207
- SDImageFrame *frame = [SDImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount];
208
- [frames addObject:frame];
209
-
210
- #else
211
-
212
- NSRect imageRect = NSMakeRect(0, 0, animatedImage.size.width, animatedImage.size.height);
213
- NSImageRep *imageRep = [animatedImage bestRepresentationForRect:imageRect context:nil hints:nil];
214
- NSBitmapImageRep *bitmapImageRep;
215
- if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
216
- bitmapImageRep = (NSBitmapImageRep *)imageRep;
217
- }
218
- if (!bitmapImageRep) {
219
- return nil;
220
- }
221
- frameCount = [[bitmapImageRep valueForProperty:NSImageFrameCount] unsignedIntegerValue];
222
- if (frameCount == 0) {
223
- return nil;
224
- }
225
- frames = [NSMutableArray arrayWithCapacity:frameCount];
226
- CGFloat scale = animatedImage.scale;
227
-
228
- for (size_t i = 0; i < frameCount; i++) {
229
- // NSBitmapImageRep need to manually change frame. "Good taste" API
230
- [bitmapImageRep setProperty:NSImageCurrentFrame withValue:@(i)];
231
- NSTimeInterval frameDuration = [[bitmapImageRep valueForProperty:NSImageCurrentFrameDuration] doubleValue];
232
- NSImage *frameImage = [[NSImage alloc] initWithCGImage:bitmapImageRep.CGImage scale:scale orientation:kCGImagePropertyOrientationUp];
233
- SDImageFrame *frame = [SDImageFrame frameWithImage:frameImage duration:frameDuration];
234
- [frames addObject:frame];
235
- }
236
- #endif
237
-
238
- return frames;
239
- }
240
-
241
- + (CGColorSpaceRef)colorSpaceGetDeviceRGB {
242
- static CGColorSpaceRef colorSpace;
243
- static dispatch_once_t onceToken;
244
- dispatch_once(&onceToken, ^{
245
- colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
246
- });
247
- return colorSpace;
248
- }
249
-
250
- + (BOOL)CGImageContainsAlpha:(CGImageRef)cgImage {
251
- if (!cgImage) {
252
- return NO;
253
- }
254
- CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(cgImage);
255
- BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone ||
256
- alphaInfo == kCGImageAlphaNoneSkipFirst ||
257
- alphaInfo == kCGImageAlphaNoneSkipLast);
258
- return hasAlpha;
259
- }
260
-
261
- + (CGImageRef)CGImageCreateDecoded:(CGImageRef)cgImage {
262
- return [self CGImageCreateDecoded:cgImage orientation:kCGImagePropertyOrientationUp];
263
- }
264
-
265
- + (CGImageRef)CGImageCreateDecoded:(CGImageRef)cgImage orientation:(CGImagePropertyOrientation)orientation {
266
- if (!cgImage) {
267
- return NULL;
268
- }
269
- size_t width = CGImageGetWidth(cgImage);
270
- size_t height = CGImageGetHeight(cgImage);
271
- if (width == 0 || height == 0) return NULL;
272
- size_t newWidth;
273
- size_t newHeight;
274
- switch (orientation) {
275
- case kCGImagePropertyOrientationLeft:
276
- case kCGImagePropertyOrientationLeftMirrored:
277
- case kCGImagePropertyOrientationRight:
278
- case kCGImagePropertyOrientationRightMirrored: {
279
- // These orientation should swap width & height
280
- newWidth = height;
281
- newHeight = width;
282
- }
283
- break;
284
- default: {
285
- newWidth = width;
286
- newHeight = height;
287
- }
288
- break;
289
- }
290
-
291
- BOOL hasAlpha = [self CGImageContainsAlpha:cgImage];
292
- // kCGImageAlphaNone is not supported in CGBitmapContextCreate.
293
- // Check #3330 for more detail about why this bitmap is choosen.
294
- CGBitmapInfo bitmapInfo;
295
- if (hasAlpha) {
296
- // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489
297
- // BGRA8888
298
- bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst;
299
- } else {
300
- // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017
301
- // RGB888
302
- bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast;
303
- }
304
- CGContextRef context = CGBitmapContextCreate(NULL, newWidth, newHeight, 8, 0, [self colorSpaceGetDeviceRGB], bitmapInfo);
305
- if (!context) {
306
- return NULL;
307
- }
308
-
309
- // Apply transform
310
- CGAffineTransform transform = SDCGContextTransformFromOrientation(orientation, CGSizeMake(newWidth, newHeight));
311
- CGContextConcatCTM(context, transform);
312
- CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage); // The rect is bounding box of CGImage, don't swap width & height
313
- CGImageRef newImageRef = CGBitmapContextCreateImage(context);
314
- CGContextRelease(context);
315
-
316
- return newImageRef;
317
- }
318
-
319
- + (CGImageRef)CGImageCreateScaled:(CGImageRef)cgImage size:(CGSize)size {
320
- if (!cgImage) {
321
- return NULL;
322
- }
323
- size_t width = CGImageGetWidth(cgImage);
324
- size_t height = CGImageGetHeight(cgImage);
325
- if (width == size.width && height == size.height) {
326
- CGImageRetain(cgImage);
327
- return cgImage;
328
- }
329
-
330
- __block vImage_Buffer input_buffer = {}, output_buffer = {};
331
- @onExit {
332
- if (input_buffer.data) free(input_buffer.data);
333
- if (output_buffer.data) free(output_buffer.data);
334
- };
335
- BOOL hasAlpha = [self CGImageContainsAlpha:cgImage];
336
- // kCGImageAlphaNone is not supported in CGBitmapContextCreate.
337
- // Check #3330 for more detail about why this bitmap is choosen.
338
- CGBitmapInfo bitmapInfo;
339
- if (hasAlpha) {
340
- // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489
341
- // BGRA8888
342
- bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst;
343
- } else {
344
- // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017
345
- // RGB888
346
- bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast;
347
- }
348
- vImage_CGImageFormat format = (vImage_CGImageFormat) {
349
- .bitsPerComponent = 8,
350
- .bitsPerPixel = 32,
351
- .colorSpace = NULL,
352
- .bitmapInfo = bitmapInfo,
353
- .version = 0,
354
- .decode = NULL,
355
- .renderingIntent = CGImageGetRenderingIntent(cgImage)
356
- };
357
-
358
- vImage_Error a_ret = vImageBuffer_InitWithCGImage(&input_buffer, &format, NULL, cgImage, kvImageNoFlags);
359
- if (a_ret != kvImageNoError) return NULL;
360
- output_buffer.width = MAX(size.width, 0);
361
- output_buffer.height = MAX(size.height, 0);
362
- output_buffer.rowBytes = SDByteAlign(output_buffer.width * 4, 64);
363
- output_buffer.data = malloc(output_buffer.rowBytes * output_buffer.height);
364
- if (!output_buffer.data) return NULL;
365
-
366
- vImage_Error ret = vImageScale_ARGB8888(&input_buffer, &output_buffer, NULL, kvImageHighQualityResampling);
367
- if (ret != kvImageNoError) return NULL;
368
-
369
- CGImageRef outputImage = vImageCreateCGImageFromBuffer(&output_buffer, &format, NULL, NULL, kvImageNoFlags, &ret);
370
- if (ret != kvImageNoError) {
371
- CGImageRelease(outputImage);
372
- return NULL;
373
- }
374
-
375
- return outputImage;
376
- }
377
-
378
- + (CGSize)scaledSizeWithImageSize:(CGSize)imageSize scaleSize:(CGSize)scaleSize preserveAspectRatio:(BOOL)preserveAspectRatio shouldScaleUp:(BOOL)shouldScaleUp {
379
- CGFloat width = imageSize.width;
380
- CGFloat height = imageSize.height;
381
- CGFloat resultWidth;
382
- CGFloat resultHeight;
383
-
384
- if (width <= 0 || height <= 0 || scaleSize.width <= 0 || scaleSize.height <= 0) {
385
- // Protect
386
- resultWidth = width;
387
- resultHeight = height;
388
- } else {
389
- // Scale to fit
390
- if (preserveAspectRatio) {
391
- CGFloat pixelRatio = width / height;
392
- CGFloat scaleRatio = scaleSize.width / scaleSize.height;
393
- if (pixelRatio > scaleRatio) {
394
- resultWidth = scaleSize.width;
395
- resultHeight = ceil(scaleSize.width / pixelRatio);
396
- } else {
397
- resultHeight = scaleSize.height;
398
- resultWidth = ceil(scaleSize.height * pixelRatio);
399
- }
400
- } else {
401
- // Stretch
402
- resultWidth = scaleSize.width;
403
- resultHeight = scaleSize.height;
404
- }
405
- if (!shouldScaleUp) {
406
- // Scale down only
407
- resultWidth = MIN(width, resultWidth);
408
- resultHeight = MIN(height, resultHeight);
409
- }
410
- }
411
-
412
- return CGSizeMake(resultWidth, resultHeight);
413
- }
414
-
415
- + (UIImage *)decodedImageWithImage:(UIImage *)image {
416
- if (![self shouldDecodeImage:image]) {
417
- return image;
418
- }
419
-
420
- UIImage *decodedImage;
421
- #if SD_UIKIT
422
- SDImageCoderDecodeSolution decodeSolution = self.defaultDecodeSolution;
423
- if (decodeSolution == SDImageCoderDecodeSolutionAutomatic) {
424
- // See #3365, CMPhoto iOS 15 only supports JPEG/HEIF format, or it will print an error log :(
425
- SDImageFormat format = image.sd_imageFormat;
426
- if ((format == SDImageFormatHEIC || format == SDImageFormatHEIF) && SDImageSupportsHardwareHEVCDecoder()) {
427
- decodedImage = SDImageDecodeUIKit(image);
428
- } else if (format == SDImageFormatJPEG) {
429
- decodedImage = SDImageDecodeUIKit(image);
430
- }
431
- } else if (decodeSolution == SDImageCoderDecodeSolutionUIKit) {
432
- // Arbitrarily call CMPhoto
433
- decodedImage = SDImageDecodeUIKit(image);
434
- }
435
- if (decodedImage) {
436
- return decodedImage;
437
- }
438
- #endif
439
-
440
- CGImageRef imageRef = image.CGImage;
441
- if (!imageRef) {
442
- return image;
443
- }
444
- BOOL hasAlpha = [self CGImageContainsAlpha:imageRef];
445
- // Prefer to use new Image Renderer to re-draw image, instead of low-level CGBitmapContext and CGContextDrawImage
446
- // This can keep both OS compatible and don't fight with Apple's performance optimization
447
- SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
448
- format.opaque = !hasAlpha;
449
- format.scale = image.scale;
450
- CGSize imageSize = image.size;
451
- SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:imageSize format:format];
452
- decodedImage = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
453
- [image drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
454
- }];
455
- SDImageCopyAssociatedObject(image, decodedImage);
456
- decodedImage.sd_isDecoded = YES;
457
- return decodedImage;
458
- }
459
-
460
- + (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image limitBytes:(NSUInteger)bytes {
461
- if (![self shouldDecodeImage:image]) {
462
- return image;
463
- }
464
-
465
- CGFloat destTotalPixels;
466
- CGFloat tileTotalPixels;
467
- if (bytes == 0) {
468
- bytes = [self defaultScaleDownLimitBytes];
469
- }
470
- bytes = MAX(bytes, kBytesPerPixel);
471
- destTotalPixels = bytes / kBytesPerPixel;
472
- tileTotalPixels = destTotalPixels / 3;
473
-
474
- CGImageRef sourceImageRef = image.CGImage;
475
- CGSize sourceResolution = CGSizeZero;
476
- sourceResolution.width = CGImageGetWidth(sourceImageRef);
477
- sourceResolution.height = CGImageGetHeight(sourceImageRef);
478
-
479
- if (![self shouldScaleDownImagePixelSize:sourceResolution limitBytes:bytes]) {
480
- return [self decodedImageWithImage:image];
481
- }
482
-
483
- CGFloat sourceTotalPixels = sourceResolution.width * sourceResolution.height;
484
- // Determine the scale ratio to apply to the input image
485
- // that results in an output image of the defined size.
486
- // see kDestImageSizeMB, and how it relates to destTotalPixels.
487
- CGFloat imageScale = sqrt(destTotalPixels / sourceTotalPixels);
488
- CGSize destResolution = CGSizeZero;
489
- destResolution.width = MAX(1, (int)(sourceResolution.width * imageScale));
490
- destResolution.height = MAX(1, (int)(sourceResolution.height * imageScale));
491
-
492
- UIImage *decodedImage;
493
- #if SD_UIKIT
494
- SDImageCoderDecodeSolution decodeSolution = self.defaultDecodeSolution;
495
- if (decodeSolution == SDImageCoderDecodeSolutionAutomatic) {
496
- // See #3365, CMPhoto iOS 15 only supports JPEG/HEIF format, or it will print an error log :(
497
- SDImageFormat format = image.sd_imageFormat;
498
- if ((format == SDImageFormatHEIC || format == SDImageFormatHEIF) && SDImageSupportsHardwareHEVCDecoder()) {
499
- decodedImage = SDImageDecodeAndScaleDownUIKit(image, destResolution);
500
- } else if (format == SDImageFormatJPEG) {
501
- decodedImage = SDImageDecodeAndScaleDownUIKit(image, destResolution);
502
- }
503
- } else if (decodeSolution == SDImageCoderDecodeSolutionUIKit) {
504
- // Arbitrarily call CMPhoto
505
- decodedImage = SDImageDecodeAndScaleDownUIKit(image, destResolution);
506
- }
507
- if (decodedImage) {
508
- return decodedImage;
509
- }
510
- #endif
511
-
512
- // autorelease the bitmap context and all vars to help system to free memory when there are memory warning.
513
- // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory];
514
- @autoreleasepool {
515
- // device color space
516
- CGColorSpaceRef colorspaceRef = [self colorSpaceGetDeviceRGB];
517
- BOOL hasAlpha = [self CGImageContainsAlpha:sourceImageRef];
518
-
519
- // kCGImageAlphaNone is not supported in CGBitmapContextCreate.
520
- // Check #3330 for more detail about why this bitmap is choosen.
521
- CGBitmapInfo bitmapInfo;
522
- if (hasAlpha) {
523
- // iPhone GPU prefer to use BGRA8888, see: https://forums.raywenderlich.com/t/why-mtlpixelformat-bgra8unorm/53489
524
- // BGRA8888
525
- bitmapInfo = kCGBitmapByteOrder32Host | kCGImageAlphaPremultipliedFirst;
526
- } else {
527
- // BGR888 previously works on iOS 8~iOS 14, however, iOS 15+ will result a black image. FB9958017
528
- // RGB888
529
- bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast;
530
- }
531
- CGContextRef destContext = CGBitmapContextCreate(NULL,
532
- destResolution.width,
533
- destResolution.height,
534
- kBitsPerComponent,
535
- 0,
536
- colorspaceRef,
537
- bitmapInfo);
538
-
539
- if (destContext == NULL) {
540
- return image;
541
- }
542
- CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh);
543
-
544
- // Now define the size of the rectangle to be used for the
545
- // incremental bits from the input image to the output image.
546
- // we use a source tile width equal to the width of the source
547
- // image due to the way that iOS retrieves image data from disk.
548
- // iOS must decode an image from disk in full width 'bands', even
549
- // if current graphics context is clipped to a subrect within that
550
- // band. Therefore we fully utilize all of the pixel data that results
551
- // from a decoding operation by anchoring our tile size to the full
552
- // width of the input image.
553
- CGRect sourceTile = CGRectZero;
554
- sourceTile.size.width = sourceResolution.width;
555
- // The source tile height is dynamic. Since we specified the size
556
- // of the source tile in MB, see how many rows of pixels high it
557
- // can be given the input image width.
558
- sourceTile.size.height = MAX(1, (int)(tileTotalPixels / sourceTile.size.width));
559
- sourceTile.origin.x = 0.0f;
560
- // The output tile is the same proportions as the input tile, but
561
- // scaled to image scale.
562
- CGRect destTile;
563
- destTile.size.width = destResolution.width;
564
- destTile.size.height = sourceTile.size.height * imageScale;
565
- destTile.origin.x = 0.0f;
566
- // The source seem overlap is proportionate to the destination seem overlap.
567
- // this is the amount of pixels to overlap each tile as we assemble the output image.
568
- float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height);
569
- CGImageRef sourceTileImageRef;
570
- // calculate the number of read/write operations required to assemble the
571
- // output image.
572
- int iterations = (int)( sourceResolution.height / sourceTile.size.height );
573
- // If tile height doesn't divide the image height evenly, add another iteration
574
- // to account for the remaining pixels.
575
- int remainder = (int)sourceResolution.height % (int)sourceTile.size.height;
576
- if(remainder) {
577
- iterations++;
578
- }
579
- // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations.
580
- float sourceTileHeightMinusOverlap = sourceTile.size.height;
581
- sourceTile.size.height += sourceSeemOverlap;
582
- destTile.size.height += kDestSeemOverlap;
583
- for( int y = 0; y < iterations; ++y ) {
584
- sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap;
585
- destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap);
586
- sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile );
587
- if( y == iterations - 1 && remainder ) {
588
- float dify = destTile.size.height;
589
- destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale;
590
- dify -= destTile.size.height;
591
- destTile.origin.y = MIN(0, destTile.origin.y + dify);
592
- }
593
- CGContextDrawImage( destContext, destTile, sourceTileImageRef );
594
- CGImageRelease( sourceTileImageRef );
595
- }
596
-
597
- CGImageRef destImageRef = CGBitmapContextCreateImage(destContext);
598
- CGContextRelease(destContext);
599
- if (destImageRef == NULL) {
600
- return image;
601
- }
602
- #if SD_MAC
603
- decodedImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:kCGImagePropertyOrientationUp];
604
- #else
605
- decodedImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation];
606
- #endif
607
- CGImageRelease(destImageRef);
608
- SDImageCopyAssociatedObject(image, decodedImage);
609
- decodedImage.sd_isDecoded = YES;
610
- return decodedImage;
611
- }
612
- }
613
-
614
- + (SDImageCoderDecodeSolution)defaultDecodeSolution {
615
- return kDefaultDecodeSolution;
616
- }
617
-
618
- + (void)setDefaultDecodeSolution:(SDImageCoderDecodeSolution)defaultDecodeSolution {
619
- kDefaultDecodeSolution = defaultDecodeSolution;
620
- }
621
-
622
- + (NSUInteger)defaultScaleDownLimitBytes {
623
- return kDestImageLimitBytes;
624
- }
625
-
626
- + (void)setDefaultScaleDownLimitBytes:(NSUInteger)defaultScaleDownLimitBytes {
627
- if (defaultScaleDownLimitBytes < kBytesPerPixel) {
628
- return;
629
- }
630
- kDestImageLimitBytes = defaultScaleDownLimitBytes;
631
- }
632
-
633
- #if SD_UIKIT || SD_WATCH
634
- // Convert an EXIF image orientation to an iOS one.
635
- + (UIImageOrientation)imageOrientationFromEXIFOrientation:(CGImagePropertyOrientation)exifOrientation {
636
- UIImageOrientation imageOrientation = UIImageOrientationUp;
637
- switch (exifOrientation) {
638
- case kCGImagePropertyOrientationUp:
639
- imageOrientation = UIImageOrientationUp;
640
- break;
641
- case kCGImagePropertyOrientationDown:
642
- imageOrientation = UIImageOrientationDown;
643
- break;
644
- case kCGImagePropertyOrientationLeft:
645
- imageOrientation = UIImageOrientationLeft;
646
- break;
647
- case kCGImagePropertyOrientationRight:
648
- imageOrientation = UIImageOrientationRight;
649
- break;
650
- case kCGImagePropertyOrientationUpMirrored:
651
- imageOrientation = UIImageOrientationUpMirrored;
652
- break;
653
- case kCGImagePropertyOrientationDownMirrored:
654
- imageOrientation = UIImageOrientationDownMirrored;
655
- break;
656
- case kCGImagePropertyOrientationLeftMirrored:
657
- imageOrientation = UIImageOrientationLeftMirrored;
658
- break;
659
- case kCGImagePropertyOrientationRightMirrored:
660
- imageOrientation = UIImageOrientationRightMirrored;
661
- break;
662
- default:
663
- break;
664
- }
665
- return imageOrientation;
666
- }
667
-
668
- // Convert an iOS orientation to an EXIF image orientation.
669
- + (CGImagePropertyOrientation)exifOrientationFromImageOrientation:(UIImageOrientation)imageOrientation {
670
- CGImagePropertyOrientation exifOrientation = kCGImagePropertyOrientationUp;
671
- switch (imageOrientation) {
672
- case UIImageOrientationUp:
673
- exifOrientation = kCGImagePropertyOrientationUp;
674
- break;
675
- case UIImageOrientationDown:
676
- exifOrientation = kCGImagePropertyOrientationDown;
677
- break;
678
- case UIImageOrientationLeft:
679
- exifOrientation = kCGImagePropertyOrientationLeft;
680
- break;
681
- case UIImageOrientationRight:
682
- exifOrientation = kCGImagePropertyOrientationRight;
683
- break;
684
- case UIImageOrientationUpMirrored:
685
- exifOrientation = kCGImagePropertyOrientationUpMirrored;
686
- break;
687
- case UIImageOrientationDownMirrored:
688
- exifOrientation = kCGImagePropertyOrientationDownMirrored;
689
- break;
690
- case UIImageOrientationLeftMirrored:
691
- exifOrientation = kCGImagePropertyOrientationLeftMirrored;
692
- break;
693
- case UIImageOrientationRightMirrored:
694
- exifOrientation = kCGImagePropertyOrientationRightMirrored;
695
- break;
696
- default:
697
- break;
698
- }
699
- return exifOrientation;
700
- }
701
- #endif
702
-
703
- #pragma mark - Helper Function
704
- + (BOOL)shouldDecodeImage:(nullable UIImage *)image {
705
- // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error
706
- if (image == nil) {
707
- return NO;
708
- }
709
- // Avoid extra decode
710
- if (image.sd_isDecoded) {
711
- return NO;
712
- }
713
- // do not decode animated images
714
- if (image.sd_isAnimated) {
715
- return NO;
716
- }
717
- // do not decode vector images
718
- if (image.sd_isVector) {
719
- return NO;
720
- }
721
-
722
- return YES;
723
- }
724
-
725
- + (BOOL)shouldScaleDownImagePixelSize:(CGSize)sourceResolution limitBytes:(NSUInteger)bytes {
726
- BOOL shouldScaleDown = YES;
727
-
728
- CGFloat sourceTotalPixels = sourceResolution.width * sourceResolution.height;
729
- if (sourceTotalPixels <= 0) {
730
- return NO;
731
- }
732
- CGFloat destTotalPixels;
733
- if (bytes == 0) {
734
- bytes = [self defaultScaleDownLimitBytes];
735
- }
736
- bytes = MAX(bytes, kBytesPerPixel);
737
- destTotalPixels = bytes / kBytesPerPixel;
738
- CGFloat imageScale = destTotalPixels / sourceTotalPixels;
739
- if (imageScale < 1) {
740
- shouldScaleDown = YES;
741
- } else {
742
- shouldScaleDown = NO;
743
- }
744
-
745
- return shouldScaleDown;
746
- }
747
-
748
- static inline CGAffineTransform SDCGContextTransformFromOrientation(CGImagePropertyOrientation orientation, CGSize size) {
749
- // Inspiration from @libfeihu
750
- // We need to calculate the proper transformation to make the image upright.
751
- // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
752
- CGAffineTransform transform = CGAffineTransformIdentity;
753
-
754
- switch (orientation) {
755
- case kCGImagePropertyOrientationDown:
756
- case kCGImagePropertyOrientationDownMirrored:
757
- transform = CGAffineTransformTranslate(transform, size.width, size.height);
758
- transform = CGAffineTransformRotate(transform, M_PI);
759
- break;
760
-
761
- case kCGImagePropertyOrientationLeft:
762
- case kCGImagePropertyOrientationLeftMirrored:
763
- transform = CGAffineTransformTranslate(transform, size.width, 0);
764
- transform = CGAffineTransformRotate(transform, M_PI_2);
765
- break;
766
-
767
- case kCGImagePropertyOrientationRight:
768
- case kCGImagePropertyOrientationRightMirrored:
769
- transform = CGAffineTransformTranslate(transform, 0, size.height);
770
- transform = CGAffineTransformRotate(transform, -M_PI_2);
771
- break;
772
- case kCGImagePropertyOrientationUp:
773
- case kCGImagePropertyOrientationUpMirrored:
774
- break;
775
- }
776
-
777
- switch (orientation) {
778
- case kCGImagePropertyOrientationUpMirrored:
779
- case kCGImagePropertyOrientationDownMirrored:
780
- transform = CGAffineTransformTranslate(transform, size.width, 0);
781
- transform = CGAffineTransformScale(transform, -1, 1);
782
- break;
783
-
784
- case kCGImagePropertyOrientationLeftMirrored:
785
- case kCGImagePropertyOrientationRightMirrored:
786
- transform = CGAffineTransformTranslate(transform, size.height, 0);
787
- transform = CGAffineTransformScale(transform, -1, 1);
788
- break;
789
- case kCGImagePropertyOrientationUp:
790
- case kCGImagePropertyOrientationDown:
791
- case kCGImagePropertyOrientationLeft:
792
- case kCGImagePropertyOrientationRight:
793
- break;
794
- }
795
-
796
- return transform;
797
- }
798
-
799
- #if SD_UIKIT || SD_WATCH
800
- static NSUInteger gcd(NSUInteger a, NSUInteger b) {
801
- NSUInteger c;
802
- while (a != 0) {
803
- c = a;
804
- a = b % a;
805
- b = c;
806
- }
807
- return b;
808
- }
809
-
810
- static NSUInteger gcdArray(size_t const count, NSUInteger const * const values) {
811
- if (count == 0) {
812
- return 0;
813
- }
814
- NSUInteger result = values[0];
815
- for (size_t i = 1; i < count; ++i) {
816
- result = gcd(values[i], result);
817
- }
818
- return result;
819
- }
820
- #endif
821
-
822
- @end