From 16883a5450e57a3fa68b39da2dd37c329046c2d2 Mon Sep 17 00:00:00 2001 From: SeiyaTozaki Date: Fri, 12 Jun 2026 13:54:23 +0900 Subject: [PATCH 1/3] =?UTF-8?q?chore:=20CocoaPods=20=E3=82=B5=E3=83=9D?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Example アプリ、podspec、Travis CI、_Pods シンボリックリンクを削除し、 README と .gitignore を SPM 専用に更新する。 Co-authored-by: Cursor --- .gitignore | 34 +- .travis.yml | 14 - .../project.pbxproj | 564 ------------------ .../contents.xcworkspacedata | 7 - .../Nuke-Avif-Plugin-Example.xcscheme | 117 ---- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - Example/Nuke-Avif-Plugin/AppDelegate.swift | 47 -- .../Base.lproj/LaunchScreen.xib | 46 -- .../Base.lproj/Main.storyboard | 275 --------- .../Nuke-Avif-Plugin/FoxViewController.swift | 58 -- .../AppIcon.appiconset/Contents.json | 53 -- Example/Nuke-Avif-Plugin/Info.plist | 39 -- .../Nuke-Avif-Plugin/PlumViewController.swift | 56 -- Example/Podfile | 19 - Example/Podfile.lock | 69 --- Example/Tests/Info.plist | 24 - Example/Tests/Tests.swift | 28 - Nuke-Avif-Plugin.podspec | 43 -- README.md | 50 +- _Pods.xcodeproj | 1 - 21 files changed, 41 insertions(+), 1521 deletions(-) delete mode 100644 .travis.yml delete mode 100644 Example/Nuke-Avif-Plugin.xcodeproj/project.pbxproj delete mode 100644 Example/Nuke-Avif-Plugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/Nuke-Avif-Plugin.xcodeproj/xcshareddata/xcschemes/Nuke-Avif-Plugin-Example.xcscheme delete mode 100644 Example/Nuke-Avif-Plugin.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/Nuke-Avif-Plugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 Example/Nuke-Avif-Plugin/AppDelegate.swift delete mode 100644 Example/Nuke-Avif-Plugin/Base.lproj/LaunchScreen.xib delete mode 100644 Example/Nuke-Avif-Plugin/Base.lproj/Main.storyboard delete mode 100644 Example/Nuke-Avif-Plugin/FoxViewController.swift delete mode 100644 Example/Nuke-Avif-Plugin/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Example/Nuke-Avif-Plugin/Info.plist delete mode 100644 Example/Nuke-Avif-Plugin/PlumViewController.swift delete mode 100644 Example/Podfile delete mode 100644 Example/Podfile.lock delete mode 100644 Example/Tests/Info.plist delete mode 100644 Example/Tests/Tests.swift delete mode 100644 Nuke-Avif-Plugin.podspec delete mode 120000 _Pods.xcodeproj diff --git a/.gitignore b/.gitignore index 8551b5d..a90a130 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ -# OS X +# macOS .DS_Store # Xcode build/ +DerivedData/ *.pbxuser !default.pbxuser *.mode1v3 @@ -13,30 +14,11 @@ build/ !default.perspectivev3 xcuserdata/ *.xccheckout -profile *.moved-aside -DerivedData -*.hmap -*.ipa -/.swiftpm -/.build +*.xcuserstate +*.xcscmblueprint -# Bundler -.bundle - -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control -# -# Note: if you ignore the Pods directory, make sure to uncomment -# `pod install` in .travis.yml -# -# Pods/ -Example/Pods - -/Package.resolved +# Swift Package Manager +.build/ +.swiftpm/ +Package.resolved diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 85b93db..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -# references: -# * https://www.objc.io/issues/6-build-tools/travis-ci/ -# * https://github.com/supermarin/xcpretty#usage - -osx_image: xcode7.3 -language: objective-c -# cache: cocoapods -# podfile: Example/Podfile -# before_install: -# - gem install cocoapods # Since Travis is not always on latest version -# - pod install --project-directory=Example -script: -- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/Nuke-Avif-Plugin.xcworkspace -scheme Nuke-Avif-Plugin-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty -- pod lib lint diff --git a/Example/Nuke-Avif-Plugin.xcodeproj/project.pbxproj b/Example/Nuke-Avif-Plugin.xcodeproj/project.pbxproj deleted file mode 100644 index 4e05c3c..0000000 --- a/Example/Nuke-Avif-Plugin.xcodeproj/project.pbxproj +++ /dev/null @@ -1,564 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 29965AAB27948D110004E341 /* PlumViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29965AAA27948D110004E341 /* PlumViewController.swift */; }; - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACD81AFB9204008FA782 /* FoxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* FoxViewController.swift */; }; - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; - 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; - 661BC023891FA66B5B6E916B /* libPods-Nuke-Avif-Plugin_Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CF851CE22906BF463664575 /* libPods-Nuke-Avif-Plugin_Tests.a */; }; - FC3F45D86C83C22ED4D6EB66 /* libPods-Nuke-Avif-Plugin_Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3971C18C091BB86D7B27B1A9 /* libPods-Nuke-Avif-Plugin_Example.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 607FACC81AFB9204008FA782 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 607FACCF1AFB9204008FA782; - remoteInfo = "Nuke-Avif-Plugin"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 244ABA6369D0795E06AA7F76 /* Pods-Nuke-Avif-Plugin_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuke-Avif-Plugin_Example.release.xcconfig"; path = "Target Support Files/Pods-Nuke-Avif-Plugin_Example/Pods-Nuke-Avif-Plugin_Example.release.xcconfig"; sourceTree = ""; }; - 29965AAA27948D110004E341 /* PlumViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlumViewController.swift; sourceTree = ""; }; - 2CF851CE22906BF463664575 /* libPods-Nuke-Avif-Plugin_Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuke-Avif-Plugin_Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3971C18C091BB86D7B27B1A9 /* libPods-Nuke-Avif-Plugin_Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuke-Avif-Plugin_Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4822E77378633EB7B57CF642 /* Pods-Nuke-Avif-Plugin_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuke-Avif-Plugin_Example.debug.xcconfig"; path = "Target Support Files/Pods-Nuke-Avif-Plugin_Example/Pods-Nuke-Avif-Plugin_Example.debug.xcconfig"; sourceTree = ""; }; - 5D2B7EE74A57085A4BD4E540 /* Pods-Nuke-Avif-Plugin_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuke-Avif-Plugin_Tests.debug.xcconfig"; path = "Target Support Files/Pods-Nuke-Avif-Plugin_Tests/Pods-Nuke-Avif-Plugin_Tests.debug.xcconfig"; sourceTree = ""; }; - 607FACD01AFB9204008FA782 /* Nuke-Avif-Plugin_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Nuke-Avif-Plugin_Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACD71AFB9204008FA782 /* FoxViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoxViewController.swift; sourceTree = ""; }; - 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 607FACE51AFB9204008FA782 /* Nuke-Avif-Plugin_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Nuke-Avif-Plugin_Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; - 807F08735E2E2C9A7110429D /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; - 8BA7C4489C443B33D0F86533 /* Pods-Nuke-Avif-Plugin_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuke-Avif-Plugin_Tests.release.xcconfig"; path = "Target Support Files/Pods-Nuke-Avif-Plugin_Tests/Pods-Nuke-Avif-Plugin_Tests.release.xcconfig"; sourceTree = ""; }; - D03D8BB77334962A1059A345 /* Nuke-Avif-Plugin.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = "Nuke-Avif-Plugin.podspec"; path = "../Nuke-Avif-Plugin.podspec"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - E45D3B434D4ABCA97A28B92D /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 607FACCD1AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FC3F45D86C83C22ED4D6EB66 /* libPods-Nuke-Avif-Plugin_Example.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE21AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 661BC023891FA66B5B6E916B /* libPods-Nuke-Avif-Plugin_Tests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 13C298B93B44D0B41883A613 /* Pods */ = { - isa = PBXGroup; - children = ( - 4822E77378633EB7B57CF642 /* Pods-Nuke-Avif-Plugin_Example.debug.xcconfig */, - 244ABA6369D0795E06AA7F76 /* Pods-Nuke-Avif-Plugin_Example.release.xcconfig */, - 5D2B7EE74A57085A4BD4E540 /* Pods-Nuke-Avif-Plugin_Tests.debug.xcconfig */, - 8BA7C4489C443B33D0F86533 /* Pods-Nuke-Avif-Plugin_Tests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 607FACC71AFB9204008FA782 = { - isa = PBXGroup; - children = ( - 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for Nuke-Avif-Plugin */, - 607FACE81AFB9204008FA782 /* Tests */, - 607FACD11AFB9204008FA782 /* Products */, - 13C298B93B44D0B41883A613 /* Pods */, - 9B1591F6609DFA1AC89E2AA5 /* Frameworks */, - ); - sourceTree = ""; - }; - 607FACD11AFB9204008FA782 /* Products */ = { - isa = PBXGroup; - children = ( - 607FACD01AFB9204008FA782 /* Nuke-Avif-Plugin_Example.app */, - 607FACE51AFB9204008FA782 /* Nuke-Avif-Plugin_Tests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 607FACD21AFB9204008FA782 /* Example for Nuke-Avif-Plugin */ = { - isa = PBXGroup; - children = ( - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 607FACD71AFB9204008FA782 /* FoxViewController.swift */, - 29965AAA27948D110004E341 /* PlumViewController.swift */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 607FACDC1AFB9204008FA782 /* Images.xcassets */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, - 607FACD31AFB9204008FA782 /* Supporting Files */, - ); - name = "Example for Nuke-Avif-Plugin"; - path = "Nuke-Avif-Plugin"; - sourceTree = ""; - }; - 607FACD31AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACD41AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACE81AFB9204008FA782 /* Tests */ = { - isa = PBXGroup; - children = ( - 607FACEB1AFB9204008FA782 /* Tests.swift */, - 607FACE91AFB9204008FA782 /* Supporting Files */, - ); - path = Tests; - sourceTree = ""; - }; - 607FACE91AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACEA1AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { - isa = PBXGroup; - children = ( - D03D8BB77334962A1059A345 /* Nuke-Avif-Plugin.podspec */, - E45D3B434D4ABCA97A28B92D /* README.md */, - 807F08735E2E2C9A7110429D /* LICENSE */, - ); - name = "Podspec Metadata"; - sourceTree = ""; - }; - 9B1591F6609DFA1AC89E2AA5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3971C18C091BB86D7B27B1A9 /* libPods-Nuke-Avif-Plugin_Example.a */, - 2CF851CE22906BF463664575 /* libPods-Nuke-Avif-Plugin_Tests.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 607FACCF1AFB9204008FA782 /* Nuke-Avif-Plugin_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Nuke-Avif-Plugin_Example" */; - buildPhases = ( - EE5AEE49B44361B3D1E5F1F7 /* [CP] Check Pods Manifest.lock */, - 607FACCC1AFB9204008FA782 /* Sources */, - 607FACCD1AFB9204008FA782 /* Frameworks */, - 607FACCE1AFB9204008FA782 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Nuke-Avif-Plugin_Example"; - productName = "Nuke-Avif-Plugin"; - productReference = 607FACD01AFB9204008FA782 /* Nuke-Avif-Plugin_Example.app */; - productType = "com.apple.product-type.application"; - }; - 607FACE41AFB9204008FA782 /* Nuke-Avif-Plugin_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Nuke-Avif-Plugin_Tests" */; - buildPhases = ( - 6970F929F1CA5676EDA916CD /* [CP] Check Pods Manifest.lock */, - 607FACE11AFB9204008FA782 /* Sources */, - 607FACE21AFB9204008FA782 /* Frameworks */, - 607FACE31AFB9204008FA782 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 607FACE71AFB9204008FA782 /* PBXTargetDependency */, - ); - name = "Nuke-Avif-Plugin_Tests"; - productName = Tests; - productReference = 607FACE51AFB9204008FA782 /* Nuke-Avif-Plugin_Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 607FACC81AFB9204008FA782 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; - ORGANIZATIONNAME = CocoaPods; - TargetAttributes = { - 607FACCF1AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; - }; - 607FACE41AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; - TestTargetID = 607FACCF1AFB9204008FA782; - }; - }; - }; - buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Nuke-Avif-Plugin" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - Base, - ); - mainGroup = 607FACC71AFB9204008FA782; - productRefGroup = 607FACD11AFB9204008FA782 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 607FACCF1AFB9204008FA782 /* Nuke-Avif-Plugin_Example */, - 607FACE41AFB9204008FA782 /* Nuke-Avif-Plugin_Tests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 607FACCE1AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE31AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 6970F929F1CA5676EDA916CD /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Nuke-Avif-Plugin_Tests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - EE5AEE49B44361B3D1E5F1F7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Nuke-Avif-Plugin_Example-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 607FACCC1AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACD81AFB9204008FA782 /* FoxViewController.swift in Sources */, - 29965AAB27948D110004E341 /* PlumViewController.swift in Sources */, - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE11AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 607FACCF1AFB9204008FA782 /* Nuke-Avif-Plugin_Example */; - targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 607FACD91AFB9204008FA782 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 607FACDA1AFB9204008FA782 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 607FACDF1AFB9204008FA782 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 607FACED1AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 607FACEE1AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 607FACF01AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4822E77378633EB7B57CF642 /* Pods-Nuke-Avif-Plugin_Example.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "Nuke-Avif-Plugin/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 607FACF11AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 244ABA6369D0795E06AA7F76 /* Pods-Nuke-Avif-Plugin_Example.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "Nuke-Avif-Plugin/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 607FACF31AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5D2B7EE74A57085A4BD4E540 /* Pods-Nuke-Avif-Plugin_Tests.debug.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nuke-Avif-Plugin_Example.app/Nuke-Avif-Plugin_Example"; - }; - name = Debug; - }; - 607FACF41AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8BA7C4489C443B33D0F86533 /* Pods-Nuke-Avif-Plugin_Tests.release.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(PLATFORM_DIR)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Nuke-Avif-Plugin_Example.app/Nuke-Avif-Plugin_Example"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Nuke-Avif-Plugin" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACED1AFB9204008FA782 /* Debug */, - 607FACEE1AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Nuke-Avif-Plugin_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF01AFB9204008FA782 /* Debug */, - 607FACF11AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Nuke-Avif-Plugin_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF31AFB9204008FA782 /* Debug */, - 607FACF41AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 607FACC81AFB9204008FA782 /* Project object */; -} diff --git a/Example/Nuke-Avif-Plugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Nuke-Avif-Plugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index eb36b07..0000000 --- a/Example/Nuke-Avif-Plugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/Nuke-Avif-Plugin.xcodeproj/xcshareddata/xcschemes/Nuke-Avif-Plugin-Example.xcscheme b/Example/Nuke-Avif-Plugin.xcodeproj/xcshareddata/xcschemes/Nuke-Avif-Plugin-Example.xcscheme deleted file mode 100644 index 65766a5..0000000 --- a/Example/Nuke-Avif-Plugin.xcodeproj/xcshareddata/xcschemes/Nuke-Avif-Plugin-Example.xcscheme +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Nuke-Avif-Plugin.xcworkspace/contents.xcworkspacedata b/Example/Nuke-Avif-Plugin.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 83d018d..0000000 --- a/Example/Nuke-Avif-Plugin.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Example/Nuke-Avif-Plugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Nuke-Avif-Plugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/Example/Nuke-Avif-Plugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/Example/Nuke-Avif-Plugin/AppDelegate.swift b/Example/Nuke-Avif-Plugin/AppDelegate.swift deleted file mode 100644 index a2cf8ec..0000000 --- a/Example/Nuke-Avif-Plugin/AppDelegate.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// AppDelegate.swift -// Nuke-Avif-Plugin -// -// Created by murakami on 05/27/2021. -// Copyright (c) 2021 murakami. All rights reserved. -// - -import UIKit -import NukeAvifPlugin - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - AvifImageDecoder.enable() - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Example/Nuke-Avif-Plugin/Base.lproj/LaunchScreen.xib b/Example/Nuke-Avif-Plugin/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 51b0f09..0000000 --- a/Example/Nuke-Avif-Plugin/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Nuke-Avif-Plugin/Base.lproj/Main.storyboard b/Example/Nuke-Avif-Plugin/Base.lproj/Main.storyboard deleted file mode 100644 index a75f33c..0000000 --- a/Example/Nuke-Avif-Plugin/Base.lproj/Main.storyboard +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Nuke-Avif-Plugin/FoxViewController.swift b/Example/Nuke-Avif-Plugin/FoxViewController.swift deleted file mode 100644 index c87a281..0000000 --- a/Example/Nuke-Avif-Plugin/FoxViewController.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// FoxViewController.swift -// Nuke-Avif-Plugin -// -// Created by murakami on 05/27/2021. -// Copyright (c) 2021 murakami. All rights reserved. -// - -import UIKit -import Nuke -import RxSwift -import RxCocoa - -class FoxViewController: UIViewController { - @IBOutlet var imageView: UIImageView! - @IBOutlet var profile: UISegmentedControl! - @IBOutlet var bitDepth: UISegmentedControl! - @IBOutlet var format: UISegmentedControl! - @IBOutlet var monochrome: UISegmentedControl! - @IBOutlet var oddWidth: UISegmentedControl! - @IBOutlet var oddHeight: UISegmentedControl! - @IBOutlet var notFoundLabel: UILabel! - - private let disposeBag = DisposeBag() - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - Observable - .combineLatest([profile, bitDepth, format, monochrome, oddWidth, oddHeight].map { $0.rx.selectedSegmentIndex }) - .subscribe(onNext: { [weak self] array in - let profile = ["0", "1", "2"][array[0]] - let bitDepth = ["8", "10", "12"][array[1]] - let format = ["yuv420", "yuv422", "yuv444"][array[2]] - let monochrome = ["", ".monochrome"][array[3]] - let oddWidth = ["", ".odd-width"][array[4]] - let oddHeight = ["", ".odd-height"][array[5]] - - let url = URL(string: "https://raw.githubusercontent.com/link-u/avif-sample-images/master/fox.profile\(profile).\(bitDepth)bpc.\(format)\(monochrome)\(oddWidth)\(oddHeight).avif")! - print(url.absoluteString) - guard let imageView = self?.imageView else { return } - Nuke.loadImage(with: url, into: imageView) { result in - if case let .failure(error) = result, case .dataLoadingFailed = error { - self?.notFoundLabel.isHidden = false - } else { - self?.notFoundLabel.isHidden = true - } - } - }) - .disposed(by: disposeBag) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - -} - diff --git a/Example/Nuke-Avif-Plugin/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Nuke-Avif-Plugin/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 7006c9e..0000000 --- a/Example/Nuke-Avif-Plugin/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/Example/Nuke-Avif-Plugin/Info.plist b/Example/Nuke-Avif-Plugin/Info.plist deleted file mode 100644 index eb18faa..0000000 --- a/Example/Nuke-Avif-Plugin/Info.plist +++ /dev/null @@ -1,39 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - - - diff --git a/Example/Nuke-Avif-Plugin/PlumViewController.swift b/Example/Nuke-Avif-Plugin/PlumViewController.swift deleted file mode 100644 index eecf452..0000000 --- a/Example/Nuke-Avif-Plugin/PlumViewController.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// PlumViewController.swift -// Nuke-Avif-Plugin -// -// Created by murakami on 05/27/2021. -// Copyright (c) 2021 murakami. All rights reserved. -// - -import UIKit -import Nuke -import RxSwift -import RxCocoa - -class PlumViewController: UIViewController { - @IBOutlet var imageView: UIImageView! - @IBOutlet var profile: UISegmentedControl! - @IBOutlet var bitDepth: UISegmentedControl! - @IBOutlet var format: UISegmentedControl! - @IBOutlet var monochrome: UISegmentedControl! - @IBOutlet var alpha: UISegmentedControl! - @IBOutlet var notFoundLabel: UILabel! - - private let disposeBag = DisposeBag() - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - Observable - .combineLatest([profile, bitDepth, format, monochrome, alpha].map { $0.rx.selectedSegmentIndex }) - .subscribe(onNext: { [weak self] array in - let profile = ["0", "1", "2"][array[0]] - let bitDepth = ["8", "10", "12"][array[1]] - let format = ["yuv420", "yuv422", "yuv444"][array[2]] - let monochrome = ["", ".monochrome"][array[3]] - let alpha = [".alpha-full", ".alpha-limited"][array[4]] - - let url = URL(string: "https://raw.githubusercontent.com/link-u/avif-sample-images/master/plum-blossom-large.profile\(profile).\(bitDepth)bpc.\(format)\(alpha)\(monochrome).avif")! - print(url.absoluteString) - guard let imageView = self?.imageView else { return } - Nuke.loadImage(with: url, into: imageView) { result in - if case let .failure(error) = result, case .dataLoadingFailed = error { - self?.notFoundLabel.isHidden = false - } else { - self?.notFoundLabel.isHidden = true - } - } - }) - .disposed(by: disposeBag) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - -} - diff --git a/Example/Podfile b/Example/Podfile deleted file mode 100644 index c6b774c..0000000 --- a/Example/Podfile +++ /dev/null @@ -1,19 +0,0 @@ -install! 'cocoapods', :generate_multiple_pod_projects => true -platform :ios, '11.0' -use_modular_headers! - -target 'Nuke-Avif-Plugin_Example' do - pod 'Nuke-Avif-Plugin', :path => '../' - pod 'Nuke' - pod 'libavif/libdav1d-8bit', :podspec => 'https://raw.githubusercontent.com/link-u/libavif-Xcode/workaround/dav1d-static/libavif.podspec' - pod 'libdav1d/8bit', :git => 'git@github.com:link-u/libdav1d-static.git' - - pod 'RxSwift' - pod 'RxCocoa' - - target 'Nuke-Avif-Plugin_Tests' do - inherit! :search_paths - - - end -end diff --git a/Example/Podfile.lock b/Example/Podfile.lock deleted file mode 100644 index 5eb6521..0000000 --- a/Example/Podfile.lock +++ /dev/null @@ -1,69 +0,0 @@ -PODS: - - libaom (2.0.2): - - libvmaf - - libavif (0.8.1): - - libavif/libaom (= 0.8.1) - - libavif/core (0.8.1) - - libavif/libaom (0.8.1): - - libaom (>= 1.0.2) - - libavif/core - - libavif/libdav1d-8bit (0.8.1): - - libavif/core - - libdav1d/8bit - - libdav1d/8bit (0.0.7) - - libvmaf (2.2.0) - - Nuke (10.7.1) - - Nuke-Avif-Plugin (0.0.1): - - libavif - - Nuke (~> 10.0) - - RxCocoa (6.5.0): - - RxRelay (= 6.5.0) - - RxSwift (= 6.5.0) - - RxRelay (6.5.0): - - RxSwift (= 6.5.0) - - RxSwift (6.5.0) - -DEPENDENCIES: - - libavif/libdav1d-8bit (from `https://raw.githubusercontent.com/link-u/libavif-Xcode/workaround/dav1d-static/libavif.podspec`) - - "libdav1d/8bit (from `git@github.com:link-u/libdav1d-static.git`)" - - Nuke - - Nuke-Avif-Plugin (from `../`) - - RxCocoa - - RxSwift - -SPEC REPOS: - trunk: - - libaom - - libvmaf - - Nuke - - RxCocoa - - RxRelay - - RxSwift - -EXTERNAL SOURCES: - libavif: - :podspec: https://raw.githubusercontent.com/link-u/libavif-Xcode/workaround/dav1d-static/libavif.podspec - libdav1d: - :git: "git@github.com:link-u/libdav1d-static.git" - Nuke-Avif-Plugin: - :path: "../" - -CHECKOUT OPTIONS: - libdav1d: - :commit: cd8660c52db4286cdbb167f515b923214c8cdb60 - :git: "git@github.com:link-u/libdav1d-static.git" - -SPEC CHECKSUMS: - libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 - libavif: b317b1c7c3a11c84068e0305e082e94c12e7cdf1 - libdav1d: 094dc003778d1abb26cf6a077fea154e8951e198 - libvmaf: 8d61aabc2f4ed3e6591cf7406fa00a223ec11289 - Nuke: 279f17a599fd1c83cf51de5e0e1f2db143a287b0 - Nuke-Avif-Plugin: 50b782778f52b5e07f95d956789492f44e742f67 - RxCocoa: 94f817b71c07517321eb4f9ad299112ca8af743b - RxRelay: 1de1523e604c72b6c68feadedd1af3b1b4d0ecbd - RxSwift: 5710a9e6b17f3c3d6e40d6e559b9fa1e813b2ef8 - -PODFILE CHECKSUM: 72ffcb32a0aeed1025797d7b13314fe84b09209e - -COCOAPODS: 1.11.2 diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Example/Tests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift deleted file mode 100644 index 7362636..0000000 --- a/Example/Tests/Tests.swift +++ /dev/null @@ -1,28 +0,0 @@ -import XCTest -import NukeAvifPlugin - -class Tests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Nuke-Avif-Plugin.podspec b/Nuke-Avif-Plugin.podspec deleted file mode 100644 index e4772d5..0000000 --- a/Nuke-Avif-Plugin.podspec +++ /dev/null @@ -1,43 +0,0 @@ -# -# Be sure to run `pod lib lint Nuke-Avif-Plugin.podspec' to ensure this is a -# valid spec before submitting. -# -# Any lines starting with a # are optional, but their use is encouraged -# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html -# - -Pod::Spec.new do |s| - s.name = 'Nuke-Avif-Plugin' - s.version = '0.0.4' - s.summary = "Nuke's Plugin for Avif." - -# This description is used to generate tags and improve search results. -# * Think: What does it do? Why did you write it? What is the focus? -# * Try to keep it short, snappy and to the point. -# * Write the description between the DESC delimiters below. -# * Finally, don't worry about the indent, CocoaPods strips it! - - s.description = <<-DESC -TODO: Add long description of the pod here. - DESC - - s.homepage = 'https://github.com/link-u/Nuke-Avif-Plugin' - s.license = { :type => 'MIT', :file => 'LICENSE' } - s.author = { 'murakami' => 'zonaryfund@gmail.com' } - s.source = { :git => 'git@github.com:link-u/Nuke-Avif-Plugin.git', :tag => s.version.to_s } - - s.ios.deployment_target = '11.0' - - s.source_files = 'Nuke-Avif-Plugin/**/*' - s.dependency 'Nuke', '~> 10.0' - s.dependency 'libavif' - s.module_name = 'NukeAvifPlugin' - - # s.resource_bundles = { - # 'Nuke-Avif-Plugin' => ['Nuke-Avif-Plugin/Assets/*.png'] - # } - - # s.public_header_files = 'Pod/Classes/**/*.h' - # s.frameworks = 'UIKit', 'MapKit' - # s.dependency 'AFNetworking', '~> 2.3' -end diff --git a/README.md b/README.md index a8be5fc..d50d3e6 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,48 @@ # Nuke-Avif-Plugin -[![CI Status](https://img.shields.io/travis/murakami/Nuke-Avif-Plugin.svg?style=flat)](https://travis-ci.org/murakami/Nuke-Avif-Plugin) -[![Version](https://img.shields.io/cocoapods/v/Nuke-Avif-Plugin.svg?style=flat)](https://cocoapods.org/pods/Nuke-Avif-Plugin) -[![License](https://img.shields.io/cocoapods/l/Nuke-Avif-Plugin.svg?style=flat)](https://cocoapods.org/pods/Nuke-Avif-Plugin) -[![Platform](https://img.shields.io/cocoapods/p/Nuke-Avif-Plugin.svg?style=flat)](https://cocoapods.org/pods/Nuke-Avif-Plugin) +[![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) -## Example - -```swift -import NukeAvifPlugin - -AvifImageDecoder.enable() -``` +Nuke plugin for decoding AVIF images. ## Requirements +- iOS 15+ +- Xcode 16+ (Swift 6) +- [Nuke](https://github.com/kean/Nuke) 13.x + ## Installation -Nuke-Avif-Plugin is available through [CocoaPods](https://cocoapods.org). To install -it, simply add the following line to your Podfile: +Add the package to your `Package.swift`: -```ruby -pod 'Nuke-Avif-Plugin' +```swift +dependencies: [ + .package(url: "https://github.com/link-u/Nuke-Avif-Plugin.git", from: "1.0.0"), +] ``` -## Author +Then add `NukeAvifPlugin` to your target dependencies: -murakami, zonaryfund@gmail.com +```swift +.target( + name: "YourTarget", + dependencies: [ + .product(name: "NukeAvifPlugin", package: "Nuke-Avif-Plugin"), + ] +) +``` + +In Xcode: **File → Add Package Dependencies…** and enter the repository URL. + +## Usage + +Register the decoder when configuring Nuke: + +```swift +import Nuke +import NukeAvifPlugin + +ImageDecoderRegistry.shared.register(AvifImageDecoder()) +``` ## License diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj deleted file mode 120000 index 3c5a8e7..0000000 --- a/_Pods.xcodeproj +++ /dev/null @@ -1 +0,0 @@ -Example/Pods/Pods.xcodeproj \ No newline at end of file From 7cb8db54b5affa108eb4ccbcbb942e4cab445679 Mon Sep 17 00:00:00 2001 From: SeiyaTozaki Date: Fri, 12 Jun 2026 13:56:38 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20Nuke=2013=20=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=EF=BC=881.0.0=20=E5=90=91=E3=81=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nuke 13 / iOS 15 / Swift 6 に Package.swift を更新 - 部分データに対するデコーダ登録を isCompleted ガードで抑制 - ColorSpaceCache を Swift 6 向けにシングルトン化 - AVIF フィクスチャ付き XCTest を追加 Co-authored-by: Cursor --- Nuke-Avif-Plugin/ColorSpace.swift | 18 +- Nuke-Avif-Plugin/Decoder.swift | 3 +- Package.swift | 14 +- .../AvifImageDecoderTests.swift | 176 ++++++++++++++++++ ...uv420.monochrome.odd-width.odd-height.avif | Bin 0 -> 66487 bytes .../Fixtures/test_avifenc_gray.avif | Bin 0 -> 1335 bytes .../Fixtures/test_avifenc_yuv420.avif | Bin 0 -> 1606 bytes .../Fixtures/test_avifenc_yuv422.avif | Bin 0 -> 1649 bytes .../Fixtures/test_avifenc_yuv444.avif | Bin 0 -> 1654 bytes .../Fixtures/test_cavif_gray.avif | Bin 0 -> 2120 bytes .../Fixtures/test_cavif_yuv420.avif | Bin 0 -> 2428 bytes .../Fixtures/test_cavif_yuv422.avif | Bin 0 -> 2561 bytes .../Fixtures/test_cavif_yuv444.avif | Bin 0 -> 2572 bytes 13 files changed, 198 insertions(+), 13 deletions(-) create mode 100644 Tests/NukeAvifPluginTests/AvifImageDecoderTests.swift create mode 100644 Tests/NukeAvifPluginTests/Fixtures/fox.profile0.8bpc.yuv420.monochrome.odd-width.odd-height.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_avifenc_gray.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv420.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv422.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv444.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_cavif_gray.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_cavif_yuv420.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_cavif_yuv422.avif create mode 100644 Tests/NukeAvifPluginTests/Fixtures/test_cavif_yuv444.avif diff --git a/Nuke-Avif-Plugin/ColorSpace.swift b/Nuke-Avif-Plugin/ColorSpace.swift index 54a2c02..a4086fe 100644 --- a/Nuke-Avif-Plugin/ColorSpace.swift +++ b/Nuke-Avif-Plugin/ColorSpace.swift @@ -10,12 +10,14 @@ import Accelerate import Foundation import libavif -private enum ColorSpaceCache { - private static let lock = NSLock() - private static var rgbColorSpaces: [CFString: CGColorSpace] = [:] - private static var monochromeColorSpaces: [String: CGColorSpace] = [:] +private final class ColorSpaceCache: @unchecked Sendable { + static let shared = ColorSpaceCache() - static func rgb(identifier: CFString, create: () -> CGColorSpace) -> CGColorSpace { + private let lock = NSLock() + private var rgbColorSpaces: [CFString: CGColorSpace] = [:] + private var monochromeColorSpaces: [String: CGColorSpace] = [:] + + func rgb(identifier: CFString, create: () -> CGColorSpace) -> CGColorSpace { lock.lock() defer { lock.unlock() } if let cached = rgbColorSpaces[identifier] { @@ -26,7 +28,7 @@ private enum ColorSpaceCache { return colorSpace } - static func monochrome(identifier: String, create: () throws -> CGColorSpace) throws -> CGColorSpace { + func monochrome(identifier: String, create: () throws -> CGColorSpace) throws -> CGColorSpace { lock.lock() defer { lock.unlock() } if let cached = monochromeColorSpaces[identifier] { @@ -82,7 +84,7 @@ func calcColorSpaceRGB(avif: avifImage) throws -> CGColorSpace { } func cachedColorSpace(identifier: CFString) -> CGColorSpace { - ColorSpaceCache.rgb(identifier: identifier) { + ColorSpaceCache.shared.rgb(identifier: identifier) { CGColorSpace(name: identifier)! } } @@ -159,7 +161,7 @@ func calcColorSpaceMonochrome(avif: avifImage) throws -> CGColorSpace { } func cachedColorSpace(identifier: String) throws -> CGColorSpace { - try ColorSpaceCache.monochrome(identifier: identifier) { + try ColorSpaceCache.shared.monochrome(identifier: identifier) { try createColorSpaceMonochrome( colorPrimaries: avif.colorPrimaries, transferCharacteristics: avif.transferCharacteristics diff --git a/Nuke-Avif-Plugin/Decoder.swift b/Nuke-Avif-Plugin/Decoder.swift index 8e7964b..69f2e71 100644 --- a/Nuke-Avif-Plugin/Decoder.swift +++ b/Nuke-Avif-Plugin/Decoder.swift @@ -65,7 +65,8 @@ public struct AvifImageDecoder: ImageDecoding { public extension AvifImageDecoder { static func enable() { Nuke.ImageDecoderRegistry.shared.register { context in - return context.data.isAvifData ? AvifImageDecoder() : nil + guard context.isCompleted, context.data.isAvifData else { return nil } + return AvifImageDecoder() } } } diff --git a/Package.swift b/Package.swift index a0e936f..80d7364 100644 --- a/Package.swift +++ b/Package.swift @@ -1,17 +1,17 @@ -// swift-tools-version:5.7 +// swift-tools-version:6.0 import PackageDescription let package = Package( name: "NukeAvifPlugin", platforms: [ - .iOS(.v14) + .iOS(.v15) ], products: [ .library(name: "NukeAvifPlugin", targets: ["NukeAvifPlugin"]), ], dependencies: [ - .package(url: "https://github.com/kean/Nuke.git", "12.0.0"..<"13.0.0"), // 12系までをサポートする - .package(url: "https://github.com/link-u/libavif-Xcode.git", .branch("dav1d_static_0.1.3")) // タグで指定 + .package(url: "https://github.com/kean/Nuke.git", "13.0.0"..<"14.0.0"), + .package(url: "https://github.com/link-u/libavif-Xcode.git", .branch("dav1d_static_0.1.3")) ], targets: [ .target( @@ -22,5 +22,11 @@ let package = Package( ], path: "Nuke-Avif-Plugin" ), + .testTarget( + name: "NukeAvifPluginTests", + dependencies: ["NukeAvifPlugin", "Nuke"], + path: "Tests/NukeAvifPluginTests", + resources: [.process("Fixtures")] + ), ] ) diff --git a/Tests/NukeAvifPluginTests/AvifImageDecoderTests.swift b/Tests/NukeAvifPluginTests/AvifImageDecoderTests.swift new file mode 100644 index 0000000..7d0b8bd --- /dev/null +++ b/Tests/NukeAvifPluginTests/AvifImageDecoderTests.swift @@ -0,0 +1,176 @@ +import XCTest +import Nuke +@testable import NukeAvifPlugin + +/// AvifImageDecoder および ImageDecoderRegistry 連携の回帰テスト。 +/// +/// フィクスチャ: +/// - 本番相当: manga-up CDN 由来の cavif / avifenc × gray / yuv420 / yuv422 / yuv444(8種) +/// - エッジケース: fox(monochrome, odd-size)— 本番 8 種ではカバーしないレイアウト境界用 +final class AvifImageDecoderTests: XCTestCase { + /// manga-up 検証用 AVIF(Tests/NukeAvifPluginTests/Fixtures に同梱) + private enum ProductionFixture: String, CaseIterable { + case cavifGray = "test_cavif_gray" + case cavifYUV420 = "test_cavif_yuv420" + case cavifYUV422 = "test_cavif_yuv422" + case cavifYUV444 = "test_cavif_yuv444" + case avifencGray = "test_avifenc_gray" + case avifencYUV420 = "test_avifenc_yuv420" + case avifencYUV422 = "test_avifenc_yuv422" + case avifencYUV444 = "test_avifenc_yuv444" + } + + private static let foxFixtureName = "fox.profile0.8bpc.yuv420.monochrome.odd-width.odd-height" + private static let registrySampleFixture = ProductionFixture.cavifYUV420 + + private var foxAvifData: Data! + private var jpegHeaderData: Data! + private var pngHeaderData: Data! + + /// 各テスト実行前に共通データを読み込む。 + /// - foxAvifData: 奇数サイズ monochrome エッジケース用(fox 専用テストのみ使用) + /// - jpegHeaderData / pngHeaderData: 非 AVIF 判定用の先頭バイト列 + override func setUpWithError() throws { + foxAvifData = try loadFixture(named: Self.foxFixtureName) + jpegHeaderData = Data([0xFF, 0xD8, 0xFF, 0xE0]) + pngHeaderData = Data([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) + } + + /// Bundle から AVIF フィクスチャを読み込む。 + private func loadFixture(named resourceName: String) throws -> Data { + let fixtureURL = try XCTUnwrap( + Bundle.module.url(forResource: resourceName, withExtension: "avif") + ) + return try Data(contentsOf: fixtureURL) + } + + // MARK: - Production fixtures (8種) + + /// 本番相当 8 種すべてで `Data.isAvifData` が true になることを検証する。 + /// + /// cavif / avifenc それぞれの gray・yuv420・yuv422・yuv444 が + /// libavif の `avifPeekCompatibleFileType` で AVIF と判定されることを確認する。 + func testIsAvifDataReturnsTrueForProductionFixtures() throws { + for fixture in ProductionFixture.allCases { + let data = try loadFixture(named: fixture.rawValue) + try XCTContext.runActivity(named: fixture.rawValue) { _ in + XCTAssertTrue(data.isAvifData) + } + } + } + + /// 本番相当 8 種すべてを `AvifImageDecoder.decode` できることを検証する。 + /// + /// - type が `.avif` であること + /// - プレビューではないこと (`isPreview == false`) + /// - 画像サイズが 0 より大きいこと + func testDecodeProducesImageContainerForProductionFixtures() throws { + let decoder = AvifImageDecoder() + + for fixture in ProductionFixture.allCases { + let data = try loadFixture(named: fixture.rawValue) + try XCTContext.runActivity(named: fixture.rawValue) { _ in + let container = try decoder.decode(data) + + XCTAssertEqual(container.type, AssetType.avif) + XCTAssertFalse(container.isPreview) + XCTAssertGreaterThan(container.image.size.width, 0) + XCTAssertGreaterThan(container.image.size.height, 0) + } + } + } + + /// 本番相当 8 種すべてで registry が AvifImageDecoder を返し、デコードできることを検証する。 + /// + /// ダウンロード完了 (`isCompleted == true`) かつ AVIF データの場合に + /// Nuke 13 の registry → decode フローが通ることを確認する。 + func testRegistryDecodesProductionFixtures() throws { + ImageDecoderRegistry.shared.clear() + AvifImageDecoder.enable() + + for fixture in ProductionFixture.allCases { + let data = try loadFixture(named: fixture.rawValue) + try XCTContext.runActivity(named: fixture.rawValue) { _ in + let context = ImageDecodingContext( + request: ImageRequest(url: URL(string: "https://example.com/\(fixture.rawValue).avif")!), + data: data, + isCompleted: true + ) + + let decoder = try XCTUnwrap(ImageDecoderRegistry.shared.decoder(for: context)) + XCTAssertTrue(decoder is AvifImageDecoder) + + let container = try decoder.decode(data) + XCTAssertEqual(container.type, AssetType.avif) + XCTAssertGreaterThan(container.image.size.width, 0) + XCTAssertGreaterThan(container.image.size.height, 0) + } + } + } + + // MARK: - Registry edge cases + + /// ダウンロード途中 (`isCompleted == false`) の AVIF では、プログレッシブ非対応のため registry が nil を返すことを検証する。 + /// Nuke 13 推奨: 完了前はデコーダーを登録しない。代表として本番相当フィクスチャ 1 種で確認する。 + func testRegistryReturnsNilForPartialAvifContext() throws { + ImageDecoderRegistry.shared.clear() + AvifImageDecoder.enable() + + let data = try loadFixture(named: Self.registrySampleFixture.rawValue) + let context = ImageDecodingContext( + request: ImageRequest(url: URL(string: "https://example.com/\(Self.registrySampleFixture.rawValue).avif")!), + data: data, + isCompleted: false + ) + + XCTAssertNil(ImageDecoderRegistry.shared.decoder(for: context)) + } + + /// ダウンロード完了でも非 AVIF データの場合、registry が nil を返すことを検証する。 + /// JPEG 等が誤って AvifImageDecoder に渡らないことを確認する。 + func testRegistryReturnsNilForCompletedNonAvifContext() { + ImageDecoderRegistry.shared.clear() + AvifImageDecoder.enable() + + let context = ImageDecodingContext( + request: ImageRequest(url: URL(string: "https://example.com/image.jpg")!), + data: jpegHeaderData, + isCompleted: true + ) + + XCTAssertNil(ImageDecoderRegistry.shared.decoder(for: context)) + } + + // MARK: - Format detection + + /// JPEG / PNG / 空データに対して `Data.isAvifData` が false を返すことを検証する。 + /// 誤って AVIF デコーダーが選択されないためのネガティブテスト。 + func testIsAvifDataReturnsFalseForNonAvifData() { + XCTAssertFalse(jpegHeaderData.isAvifData) + XCTAssertFalse(pngHeaderData.isAvifData) + XCTAssertFalse(Data().isAvifData) + } + + // MARK: - Fox edge case (odd-size monochrome) + + /// fox フィクスチャに対して `Data.isAvifData` が true を返すことを検証する。 + /// 奇数 width/height の monochrome AVIF でもフォーマット判定が通ることを確認する。 + func testIsAvifDataReturnsTrueForFoxFixture() { + XCTAssertTrue(foxAvifData.isAvifData) + } + + /// fox フィクスチャを `AvifImageDecoder.decode` できることを検証する。 + /// + /// 本番 8 種ではカバーしない odd-width / odd-height monochrome の decode 経路を確認する。 + /// - type が `.avif` であること + /// - プレビューではないこと (`isPreview == false`) + /// - 画像サイズが 0 より大きいこと + func testDecodeProducesImageContainerForFoxFixture() throws { + let container = try AvifImageDecoder().decode(foxAvifData) + + XCTAssertEqual(container.type, AssetType.avif) + XCTAssertFalse(container.isPreview) + XCTAssertGreaterThan(container.image.size.width, 0) + XCTAssertGreaterThan(container.image.size.height, 0) + } +} diff --git a/Tests/NukeAvifPluginTests/Fixtures/fox.profile0.8bpc.yuv420.monochrome.odd-width.odd-height.avif b/Tests/NukeAvifPluginTests/Fixtures/fox.profile0.8bpc.yuv420.monochrome.odd-width.odd-height.avif new file mode 100644 index 0000000000000000000000000000000000000000..5bfc8e7ce82ce441e9ff67c6104493cff8d6abad GIT binary patch literal 66487 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 literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_gray.avif b/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_gray.avif new file mode 100644 index 0000000000000000000000000000000000000000..fa1ff52cf2e969ab7c24cdfcbeb112c2e7a36f8b GIT binary patch literal 1335 zcmXv|4LFkv6#iDjnxC?jmDma)p*9n{W3Bm#TooR2ucDc;FPqKGsF2c7iEbrv!zh(p zto-KZ$?v@}e@iMM^`w|xtdO|6?l<@8JI3_=B`cyu8c3P4a*4j78( zfOJ)_ivXZb z1%R~^5P^JSL6rhSKuL=(#5lUmK8p5F+A^cu*D0KrQ}2!S&PCVBmJMW? zwKr2l@gu1=NVkSciA=3Uq*J@k>=mb~U;e2ZW8Z{tyjtECJ(Jagr$)P`+jZPHKhe|f zSm-;**K*vy)oO3^WVvncN<_yWVRwf%5aP&Yqgh|33mgYfL$u+^pZJ5aU*07Lu~Kr2 zSAG-v?f#b{OGk=EKh#QFt<-v38V+#ApWEs)3~!Z}+_u2_c#-Xoo3JSP?XFiBB>zldrW|XbsVjrW|&d9S6JOXq@JkI zo3OV!FD0)}t;&Q0uWpu}aGQ8(mg6T%oxpUvU47FQ$HRx;XJBemrJ?6YpIzODQZyE zN9K^jpKZ8F>#pj#z2J$?GKUi@NOdr#7$slule^9Nki@$YbU{>fduD%b32x_+(o_(C z!p2xjr=$p}vpXjBu;XOebi-`LOKOzm`utfp#Q`1Or;LY`{x&C=sT>pQ5HVYck|P5J|6rbck18@w$|;8 zqcXTr{9`j~;O$~yyF-!3_v8%9G$kbc^bPV0(90SAJg1?=i!n9(r0rlR)|Yh$ zbKqCs4!lk*==D(d6(2L1m+ZKB%+<5TaQk(#on8I+YJ?sATC#H&>+6u|Yaw_hU^7WP zrB7(#T{>xb)Nv4Zr4No4@3?*S^xk5 literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv420.avif b/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv420.avif new file mode 100644 index 0000000000000000000000000000000000000000..a4327b4e5598e9d012c7a334c2f8a648e8fa96bf GIT binary patch literal 1606 zcmXv|3pmpY6#uWevuIJPc}x*&2x+A?Qes{ul1C(WzD=9`+4y^gq2yg+lUGsRddbad zs20U~7m27`;$qT-yt)&)Tledn?>oQW`Tfp!&H(^GhY=A2QKLWxAPYINK?Z>hQW?(H z1RI$&&8A0C<(@1In8#UR|5E^fK>vu}T#hV|_Iu502#jF=@?f&M5oCq<%R5^DfXPx` z0hlHL{9!EP1|S&x>-H~4Q`XQ|$cJS!)TnI)atJHr*U3N-3WH?26A1Z-$Z#DP4$m2{dMV?Rzj%q%r_os zvJ?v6ZP2#+5x!f($v{0w_CA)}Oum>XEuYTm?CP%@s`e2b;Uw>j&nZ7U-ce!u+wGVf`kDS7ftm#@$;d2I&9TDpZ@wSx0H?*K<>sfpqzi}C zJv8>12&zPS`x5azIW9xHXQy7Ms7XpsdI!HYOg%Z_Wh1bt_6t=^1xW|R( z+%9766EG_~k>Y_~Y*cqyg%QTZhsVF-aHE45^A0T*ISNl|H@P$`U=( zA*U}~tvp^s=!&xNt<#~Vv0vRU-+nh$fp&jfqbY9ocK(p%*W-M{+-rO|9s6O(T#AE& zLl;a821U8O_bMc&&lLs|JXOn?qwG7c>k)oGis9|#$kLoMFC14ESymMfANB1R6rXj9 zv}zF6B8-GVMZJ-*HD`&-Q)jcYG`6c;VDv&*Q-)*AmXbua`5bG@OQIfNL@c`dgEDCs z-{4+CF`3A+a+aMAv2+@x}o;TYN`5Jp-`*o z-hob`N5;V`N-e1q|4jAUwrx(?raAPY;Bp#mLyIrgCLbsGa_z*ni{`GUTkt3fDSln& z0b`U??LiCV$(@I`=F$*)ain+3-4;NwMW_Aq7|Y>BY#ChD=i#gJj6Kr5w__Fgw_gef zW_qQACXJ^m&ZjgGjWl*E&haV93u>&JsU6*hy41!|`hf`i_nP+9j4wQ#Zp(bZpylix z*P=oGw$%B!jnu1iKDP_koQUUnQpZM1){*j_;`>YLoU0c{3i#_s_HoTg;!KCF)$rL0 zyK@{csuB`W(w!x5mZXlCK6Uxi>_&@1sRxikCWn# zWM1(~RZr0JoFB1s`VOx;qk4r_<2IvpO!YH*)o7eymx`B|I9CbiH0>wH(WR^Zvgq{T zd!^v+Z`wR8G;ZZsoi4s?J$*vti{TwwcUWdT>^RYy%{;EG-L3NPe;cj4VE_OC literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv422.avif b/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv422.avif new file mode 100644 index 0000000000000000000000000000000000000000..4d9a5c60dced0c2cab0b4c4f91faf80f1c2ad2d7 GIT binary patch literal 1649 zcmXv|3p~>c6#mcFl8a_4De_pFXC5~px|gh*raO;|%p-TU;m;obG>becR+A{mwZ60O&=q5+D*Ai~tm&L^>E@ zO9x5HeuhqEk(9b3Ort2Y*#9U1Kp>g*KUX3R4F7+HCIqtR-)AsI-2&2>WMzi~0GJ|` z6@YC3fK|Z?ZVG~o?{~jXHYpmaiqfp`kk~f1?o1l<`^jh!iiH%qCkT<53S0*sfv8F& z03clf0RE4Hpdc_FR4Q;)RaFJ3li0TICq0xD&?Yl!u?#XTUa?sNKq@625TcWmL=lR| z5HOWf2*p=qI)%hS18QnP=7(2=?Jx}_%C18V{Q^lcbR(TW#&0-C{dDc|h2fmY6XFJ! z>~e&)`Mhuc(_ZA4-Oo|tadsy(@xgb8xAVTIH399<%tF|bn631PjE!=?IUl02F_$i)+n)*NyPA219)S`u zdop6JVS|X3N6>JIGqUl~n!cP-NnV-{tZ$5$Q@v;pH*&s_{{W3_~sjJ`8G%<1jJ76sq@guJ$m z_=klJ?~Jj0gM(%XCL&$WvRnMHZ?ZvtOpy?$e*I&<&^oz!Ti!ysr1Uc?b0rL6G@kl~ z*O2}&PWEJ?V~y_@ll?#aK0Uo|sk3&480J((y|p!b?MiDa`po5)CLbr#-#J8q!9raT z#zmhJf%%Bk7BVDyCJwpB@%k6X?Icg!XfvH{Npd-0TKj z%S`L)4%KyW+~}U;D@~WviJ2;V7f&4m|Go@E5G;JFH8nNbF+X$q^KxOT%}P^bQJ95E zLSEa%WMpmhk1ffE>PIrtgB&~eY9{G+Ta0ymIQClna4V`kSJeJ7x_QQHatl0L=(Mp( z;I}763)P=faK-aOs0wYAa37+MQ`S2UhtA)gH}t|qceVMR-~DGPGB{B00`$wJ%Je8d zcC)PH2G)}FhYYxdpuT5Chh_&%rqD3@jhMNhRn=s8&|A9%u^QT14!f*#6Qgpww(HcO zPdMQJT5s=kX1+nk-CdjAhV4i7cRu*8|#`Yjy4=fV#S^XUD`WOE4BO8CK zs|(dG539Kttof!n9Ba*tIXl!D(j8E}Yy6y);~esJYfg=q)J=3}U-uGKcTx(+SoPc! zzO;PMXWR0&mK&LKg!0W@;$)R%J=Q3Jmbvpg!FA8C%XwoT{rp2BHrv!c*YJ+-V1@q^*7DE~Rvo+w$b#6A3Q z9B5LZj)(~5_M2S)<6aHEuZ07!>2(&~_J7mNuWxJ42o9HXCMLjDlZcj~Py3QCbRrV9 ze#I@_iqq3=Aq5xuCKgt`%iuh{%{&a(dqwZ7Bo z>Ya60SayVWdvJkG-UV9f4P_2kV)+!TnAz`o!l>k2n=OlR*QaQ-r0+&GKARwvzISup z)FLTyxT5J1Vy(Jtg|3~Bg~=6i;bLOOlN5 zPw5YnzELx2;NwO$>av)U5*fBG`z9Jkn8dq-+!~uH==7!G=cAuzyv`z2&^;7c^0Ifp f8jWIli)}uNm_3`*(N$4IJr=cJ|MK-;udd{& literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv444.avif b/Tests/NukeAvifPluginTests/Fixtures/test_avifenc_yuv444.avif new file mode 100644 index 0000000000000000000000000000000000000000..f2b790f029c4ecf215ec052d7e1aad489f1000ee GIT binary patch literal 1654 zcmXv|2~?7a7XCpbGhA~iO~vvFZcj18DUT`T=qvXvbaW`fh2Mc#B-9$irD@b^5{=Aq z!A4CJ(}5<9c>3Qpx^$35{p>+h)e@x8 zNb1f903fPVR{&xL0GhEXjt0RqpKpJ5%v4Q0R6VSkA+lXCM`;w==aWewok>^e{ve%1 zQ=t)Hca(Z95s%}G6b}>57{%6BNC_?0_iH%Hk84G-EhPVc&Z6LUcnz; z?IIhr@H5P?GQIj?#)llP*T!>OlYzi}``M&j+sXI3!1$R(?Cp$K*0Tk3zZZn0tsm46 z^r@R|Ucx^>@hq0_*@k}jYuFF9D-EhVc4$;5uE$VrdOxVYxK{tuqIX(A>+}!(SJ^)o z@YYQ4K9ZCl_!38$?+feuIOhBw`_RJ0VJn64V5Jh~tr*|4^@?;vt ztYJw{y4zMh*vIWga0LoyJ?8P*%{g*!%7C~4+7r^8c{#&h+ZDXT<7(^9`<*vm83+`~ z7gD58=feX+e#<@pYGNcGws9V0__oS1NNvYxDmx5F+QeXDVjus&7jVq4B1)9lX?G``;5?N%w# zOTcfsm>A_6@2lnzKVWWkcC=i+a@l>E`-^+p`1K_Ja7u5l&5H=eu+s zRhhh#=IA}_1kQT^L& zv@>VI^j{_lPYgP^zMa1YCHGGF;aX?jetk;2evH7ttlJ=NbmeWFW!15_`yS~K$7rSM zG2Fm55l0rDnwa%H$H1jh5iHC@iTEdqVlvmhad3Q6W=Cof*}ZySNo|{{d5y>Y`m?X! z#D!^gk`U!F48>%@UW|QJTt#z4%HY*OmjCZHZp+OT!_6kP)_PY*=zH#)U2cLEYMy8L zXrA7eE|9F&MKct<+5@sS&AU#+UN5a=dkimjeQ6TAIPb41hP*6BwBD%orP2w@bruKJ4ibN%Qj7u82%r{XEUPp6v zpT&4pF0(sgZ+gIX?K7{Q$eXLOs*7xZR(_Y6?6Ogy+##5^YAw&)ACKI`9WT}MZ%ekW z5GKl9`-l*O2){m`-b@?IInQ;Cn?=*jumk#c2T(ZvOW%Wm?*nf&D?eqja-I9V=8JS| zznR(n;`;dkLNqh2#(`IyDlQtGy55ziTJzlLjGIz*2|>vgLdj#VB%I!DhEoE-%41Q<>?|CLwPAff}?+=$Qx}EwPQR4%7SSPssGl6mZ$11QQ=Huo literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_cavif_gray.avif b/Tests/NukeAvifPluginTests/Fixtures/test_cavif_gray.avif new file mode 100644 index 0000000000000000000000000000000000000000..2e9fb5b828aa19d9282bfae4a95fd6eb87235db9 GIT binary patch literal 2120 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 literal 0 HcmV?d00001 diff --git a/Tests/NukeAvifPluginTests/Fixtures/test_cavif_yuv444.avif b/Tests/NukeAvifPluginTests/Fixtures/test_cavif_yuv444.avif new file mode 100644 index 0000000000000000000000000000000000000000..f30c0209c8d4858c2d3b0c11dfac58be7dc69673 GIT binary patch literal 2572 zcmYjL2RIb&A3t|?NcMKfUY#9&R%SMtIl4RRxI3pivP$;KR;Y|KA}h*HNg`y=Q^aLt zkK`BC<$u@z`9IJ9^FHtM8Sm%&K3@O;0QSX)V_~64UjPMEMk9S8Xe7+n+7Mz00MLk_ zeef{q8wKY6-l&`Zl>h)1iNOC)QyD=W1}lR7@pvpwTUpr;iT4kIDJhZ%BzLUVvhKfPYKW4KG0~&@ewAs%OI@ z@o1{}+ruNVH?b6b4T(hrQJ5VI!%;o;59;MY;;?_m004Re006W>$=I>TFeHTmAVx+; z3h}{0Ay;B#003rYZMopHv9~}0AefpXv1k~Dsi163M+1xl#Z&ejMSH{W|KAm0xUfv? zA|z%f-f)2>q+C9zAi`bhHm_`*jbZY6mD(cWD65yz$ns@Dm?dn4AWdU+Kip~~+DgolX7qSX9r7?R~BhTX! zavi(}w6j>H5}_xgJM1{!fx}6flvQ?jud(s-Vlu_Je;#?7MyQT9&CWASg`$id*6h&h z9Mc`d;i9pv=X7h8_Hp_Q&ZySh5rzjlSk9DNn|{nXfGig5qN}sDjN21$LcxSW(NU(9 zlYci_m$_AJ1`>5a+A4QxEsaaY&9}>)cX~Zq_QIt5chtwe_za$zw2IybOh63a5%3a!>Z78gsqFv z%}c_+!ph!ppx1kJdE+=H+jzBHo$hr)l?vJ#{v0bYi@2med(x*rw(At2R-#6Ez34V{g$%F8 z50?5>{<~&b`jUP#VNH4Xc**qMZBzgQbAMyc`}MiVmTlOp=3?4o4ELeax-MLXQ*Y?E zE>G~?m5b}XChiY%Mayva*NZw+q3HpiJnb4LWNU}Ok6(=Jbd2@i`+>EE&IRoG5Cz*OB_H17V2md` z&nvTX9J`pW^$&mDDR_W5)47AXE3+S;Jkz=>jHe~4YfqI7Rt_pRE)J-XKV8MI#}3c^ znq(17YUVdCb!%G;jw{wHGw{C*sJ>%BIFa$ZftS5+2`!zf7uW9QI}NVNhdsxSYZOPiVOA9C`3t;yZ9+urm70n8V^p7E+y*G-3UToQUwhzH0zoheh9;tV{J^i;f zD9=Xa$7_p0(udg-b;WOa-LLapLuEPOl6FL|v8>p~t3YngGsIN7jsJxt##eFRl@<)c zz{nStI&M{>GGI~zs-FVssucgm+0@8vX?ck3^T$nr!)Enu zA>0}V*^8w~hH$yGywi9>(hihY;tb09`utpMjA8pmo>i$BLPT=l)DcaU_d}p? zB&4gj>+NLe?zdxxSRtBuFSAsaQO59@D>clT&4br%NCx7gjy;+LD?nG_VzqZtcGCvb z=e1;dbKN?}CC==Na2k;bA^nH#U8Kk_HnIjt0?%(_z z{Q*Y%#rJt!Q_Sp)9H-!`k58eO0^>wsVhG0?8;$#NUF;nw$aH;#-@=^;x>nn4Mkapg zg?)*zn){(Khmt$b|0EyxF_KL;3WSE^s*FNIf|fiG{88nkmgR-$Fn9gvZ8}Xe^_pIV z{!7YQ*V`i(=~3X@UyZ>+e75uLMwZ2SBZ(Ca+4+44Q{IDljPLQ0=RH|IBXN>^hUAN* zi{wV+w<(2XgG?a?wyWM5d%|$uHp98Rkt$ zHY|iY(c5u+!iOyrf_3EXu9h+J9&DWImnn&rEyZHfYLO@H4Hpw7;AUK@mB4>efY0A; zH_=pVNMjHlSoqf-;vZD2lZBB@^NuMI0EwM}Z>q2L?tq6ptHf;ntoL_5{f-Pc7y+5L zo$^mYj8t|D20Qw_bf!Y%cbn$YIDe9zkKBcJ+uff7mUJ8+CIM5(jSP9==arXK|2s zGnJ8Z&#v!3oNWLPn;+1ZJEGL-eLcH3;&&YswJV^rxdYEeg9cq{;75CMq}$=d_ruLN zIq_c%0;o#E^Ghzyh9XS7#qM0cg>$zc7Ts%Dkw$XVvzIQ0sRHt&G8(H_&$~5$o>3FW zs2t Date: Fri, 12 Jun 2026 14:05:05 +0900 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20README=20=E3=81=AE=20Usage=20?= =?UTF-8?q?=E3=82=92=20AvifImageDecoder.enable()=20=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ImageDecoderRegistry への直接登録例を削除し、起動時の enable() 呼び出しと 手動デコード例を記載する。 Co-authored-by: Cursor --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d50d3e6..cfcb0c8 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,20 @@ In Xcode: **File → Add Package Dependencies…** and enter the repository URL. ## Usage -Register the decoder when configuring Nuke: +Call `AvifImageDecoder.enable()` once at app launch (e.g. in `AppDelegate` or `@main` App init) before loading AVIF images: ```swift -import Nuke import NukeAvifPlugin -ImageDecoderRegistry.shared.register(AvifImageDecoder()) +AvifImageDecoder.enable() +``` + +After that, use Nuke as usual — AVIF URLs are decoded automatically via `ImageDecoderRegistry`. + +To decode AVIF data manually: + +```swift +let container = try AvifImageDecoder().decode(data) ``` ## License