@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.
- package/README.md +1 -0
- package/android/.gradle/8.0/checksums/checksums.lock +0 -0
- package/android/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/8.0/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.0/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.0/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.0/gc.properties +0 -0
- package/android/.gradle/config.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/gradle.xml +12 -0
- package/android/.idea/migrations.xml +10 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/.idea/workspace.xml +50 -0
- package/android/build.gradle +35 -69
- package/android/local.properties +8 -0
- package/android/proguard-rules.pro +21 -0
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/momoplatform/nativekits/foundations/Button.kt +16 -0
- package/android/src/main/java/com/momoplatform/nativekits/libs/Logo.kt +63 -0
- package/android/src/main/java/com/momoplatform/nativekits/libs/TrustBanner.kt +246 -0
- package/android/src/main/res/drawable/ic_launcher_background.xml +170 -0
- package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- package/android/src/main/res/values/colors.xml +10 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/android/src/main/res/values/themes.xml +3 -0
- package/android/src/main/res/values-night/themes.xml +3 -0
- package/android/src/main/res/xml/backup_rules.xml +13 -0
- package/android/src/main/res/xml/data_extraction_rules.xml +19 -0
- package/build.gradle.kts +18 -0
- package/compose/build.gradle.kts +82 -0
- package/compose/src/androidMain/AndroidManifest.xml +2 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +8 -0
- package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Utils.android.kt +14 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Components.kt +194 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +197 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +133 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +62 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +27 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +288 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +80 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +42 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +126 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +51 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +299 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +246 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +223 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +244 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +281 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PromotionPopup.kt +72 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +65 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +64 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +63 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +73 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +42 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +150 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +173 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +242 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1321 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +5 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +97 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +9 -0
- package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Utils.ios.kt +18 -0
- package/gradle.properties +19 -0
- package/gradlew +240 -0
- package/gradlew.bat +91 -0
- package/ios/Button/Button.swift +9 -2
- package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
- package/ios/Colors+Radius+Spacing/Colors.swift +21 -19
- package/ios/Input/Input.swift +1 -0
- package/ios/OTPKeyboard/KeyboardButton.swift +12 -4
- package/ios/Popup/PopupDisplay.swift +72 -81
- package/ios/Popup/PopupInput.swift +96 -0
- package/ios/Popup/PopupPromotion.swift +52 -0
- package/ios/ScrollIndicator/ScrollIndicator.swift +79 -0
- package/ios/Template/Logo/Logo.swift +75 -0
- package/ios/Template/TrustBanner/TrustBanner.swift +189 -0
- package/ios/native-kits.podspec +1 -1
- package/local.properties +8 -0
- package/package.json +6 -6
- package/publish.sh +1 -10
- package/settings.gradle.kts +41 -0
- package/android/gradle.properties +0 -5
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
- package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
- package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
- package/example/ios/Example/Assets.xcassets/Background.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Border.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Card.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Contents.json +0 -6
- package/example/ios/Example/Assets.xcassets/Error.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Primary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/PrimaryDark.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/PrimaryLight.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Secondary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Success.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Text.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/TextSecondary.colorset/Contents.json +0 -38
- package/example/ios/Example/Assets.xcassets/Warning.colorset/Contents.json +0 -38
- package/example/ios/Example/ComponentDetail.swift +0 -35
- package/example/ios/Example/ComponentItem.swift +0 -24
- package/example/ios/Example/ComponentModel.swift +0 -38
- package/example/ios/Example/ContentView.swift +0 -39
- package/example/ios/Example/Example.entitlements +0 -10
- package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
- package/example/ios/Example/Foundation/ImageDemo.swift +0 -43
- package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
- package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
- package/example/ios/Example/Foundation/Popup/Popups.swift +0 -51
- package/example/ios/Example/Foundation/PopupDemo.swift +0 -389
- package/example/ios/Example/Foundation/TextInputDemo.swift +0 -36
- package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
- package/example/ios/Example/Foundation.swift +0 -26
- package/example/ios/Example/Info.plist +0 -18
- package/example/ios/Example/Library/CheckboxDemo.swift +0 -19
- package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
- package/example/ios/Example/Library/SwitchDemo.swift +0 -19
- package/example/ios/Example/Library.swift +0 -26
- package/example/ios/Example/Main.swift +0 -27
- package/example/ios/Example/Overview.swift +0 -20
- package/example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json +0 -6
- package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
- package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
- package/example/ios/Example/Resource/foundation.json +0 -33
- package/example/ios/Example/Resource/library.json +0 -18
- package/example/ios/Example/Utils.swift +0 -30
- package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
- package/example/ios/Example.xcodeproj/project.pbxproj +0 -581
- package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
- package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
- package/example/ios/Podfile +0 -7
- package/example/ios/Podfile.lock +0 -35
- package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -37
- package/example/ios/Pods/Manifest.lock +0 -35
- package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -2047
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
- package/example/ios/Pods/SDWebImage/LICENSE +0 -20
- package/example/ios/Pods/SDWebImage/README.md +0 -352
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +0 -340
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +0 -172
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +0 -63
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +0 -165
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +0 -67
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +0 -120
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +0 -114
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +0 -392
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +0 -112
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +0 -420
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +0 -133
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +0 -168
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +0 -79
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +0 -110
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +0 -540
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +0 -145
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +0 -326
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +0 -73
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +0 -256
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +0 -98
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +0 -450
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +0 -1030
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +0 -153
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +0 -68
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +0 -156
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +0 -138
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +0 -81
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +0 -556
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +0 -297
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +0 -26
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +0 -153
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +0 -822
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +0 -130
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +0 -36
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +0 -28
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +0 -22
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +0 -28
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +0 -127
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +0 -25
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +0 -101
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +0 -58
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +0 -807
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +0 -30
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +0 -420
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +0 -146
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +0 -170
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +0 -40
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +0 -123
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +0 -241
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +0 -331
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +0 -78
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +0 -158
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +0 -36
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +0 -95
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +0 -17
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +0 -352
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +0 -149
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +0 -314
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +0 -658
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +0 -113
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +0 -60
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +0 -49
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +0 -55
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +0 -191
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +0 -722
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +0 -69
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +0 -71
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +0 -69
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +0 -73
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +0 -16
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +0 -115
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +0 -275
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +0 -290
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +0 -775
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +0 -27
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +0 -14
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +0 -72
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +0 -59
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +0 -143
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +0 -303
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +0 -131
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +0 -194
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +0 -387
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +0 -234
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +0 -24
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +0 -46
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +0 -60
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +0 -26
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +0 -22
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +0 -27
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +0 -47
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +0 -89
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +0 -221
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +0 -80
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +0 -47
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +0 -146
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +0 -824
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +0 -129
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +0 -76
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +0 -194
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +0 -67
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +0 -110
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +0 -446
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +0 -48
- package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +0 -82
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +0 -24
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +0 -42
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +0 -14
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +0 -29
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +0 -21
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +0 -92
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +0 -18
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +0 -32
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +0 -29
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +0 -227
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +0 -127
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +0 -23
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +0 -164
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +0 -21
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +0 -83
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +0 -39
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +0 -122
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +0 -13
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +0 -20
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +0 -79
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +0 -19
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +0 -667
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +0 -18
- package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +0 -42
- package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +0 -89
- package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +0 -19
- package/example/ios/Pods/SDWebImageSwiftUI/README.md +0 -690
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +0 -870
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +0 -59
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +0 -52
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +0 -124
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +0 -151
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +0 -78
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +0 -132
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +0 -122
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +0 -133
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +0 -82
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +0 -97
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +0 -114
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +0 -64
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +0 -92
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +0 -93
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +0 -509
- package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +0 -15
- package/example/ios/Pods/SkeletonUI/LICENSE +0 -21
- package/example/ios/Pods/SkeletonUI/README.md +0 -137
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +0 -56
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +0 -58
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +0 -16
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +0 -102
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +0 -26
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +0 -19
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +0 -27
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +0 -35
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +0 -8
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +0 -8
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +0 -52
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +0 -41
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +0 -9
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +0 -4
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +0 -29
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +0 -7
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +0 -33
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +0 -5
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +0 -20
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +0 -27
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +0 -20
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +0 -15
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +0 -64
- package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +0 -25
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -75
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -119
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -15
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +0 -75
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +0 -14
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +0 -14
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +0 -17
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +0 -17
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +0 -17
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +0 -5
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +0 -12
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +0 -16
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +0 -12
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +0 -6
- package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +0 -12
- 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
|