├── .gitattributes
├── SDWebImage_logo.png
├── SDWebImage_logo_small.png
├── Tests
├── Tests
│ ├── Images
│ │ ├── TestEXIF.png
│ │ ├── TestImage.gif
│ │ ├── TestImage.heic
│ │ ├── TestImage.heif
│ │ ├── TestImage.jpg
│ │ ├── TestImage.png
│ │ ├── TestLoopCount.gif
│ │ ├── TestImageLarge.jpg
│ │ ├── TestImageAnimated.apng
│ │ ├── TestImageAnimated.heic
│ │ └── MonochromeTestImage.jpg
│ ├── Tests-Prefix.pch
│ ├── SDWebImageTestCoder.h
│ ├── SDWebImageTestTransformer.h
│ ├── SDWebImageTestLoader.h
│ ├── SDWebImageTestTransformer.m
│ ├── SDMockFileManager.h
│ ├── Tests-Info.plist
│ ├── SDWebImageTestDownloadOperation.h
│ ├── SDWebImageTestCache.h
│ ├── SDTestCase.h
│ ├── SDMockFileManager.m
│ ├── SDTestCase.m
│ ├── SDWebImageTestCoder.m
│ ├── SDWebImageTestLoader.m
│ ├── SDWebImageTestDownloadOperation.m
│ └── SDCategoriesTests.m
├── Tests Mac
│ └── Info.plist
├── Tests TV
│ └── Info.plist
└── SDWebImage Tests.xcodeproj
│ └── xcshareddata
│ └── xcschemes
│ ├── Tests TV.xcscheme
│ └── Tests iOS.xcscheme
├── Docs
├── Diagrams
│ ├── SDWebImageClassDiagram.png
│ ├── SDWebImageSequenceDiagram.png
│ ├── SDWebImageCacheClassDiagram.png
│ ├── SDWebImageCodersClassDiagram.png
│ ├── SDWebImageHighLevelDiagram.jpeg
│ ├── SDWebImageLoaderClassDiagram.png
│ ├── SDWebImageManagerClassDiagram.png
│ └── SDWebImageTopLevelClassDiagram.png
└── API-Diff
│ └── 5.0
│ └── apidiff.css
├── Examples
├── SDWebImage Demo
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── placeholder.imageset
│ │ │ ├── placeholder.png
│ │ │ ├── placeholder@2x.png
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── MasterViewController.h
│ ├── SDWebImage Demo-Prefix.pch
│ ├── DetailViewController.h
│ ├── main.m
│ ├── AppDelegate.h
│ ├── SDWebImage Demo-Info.plist
│ ├── en.lproj
│ │ ├── MasterViewController.xib
│ │ └── DetailViewController.xib
│ ├── DetailViewController.m
│ └── LaunchScreen.storyboard
├── SDWebImage OSX Demo
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── ViewController.h
│ ├── AppDelegate.h
│ ├── main.m
│ ├── AppDelegate.m
│ └── Info.plist
├── SDWebImage TV Demo
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── App Icon & Top Shelf Image.brandassets
│ │ │ ├── App Icon - Large.imagestack
│ │ │ │ ├── Back.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ ├── Front.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ ├── Middle.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── App Icon - Small.imagestack
│ │ │ │ ├── Back.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ ├── Front.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ ├── Middle.imagestacklayer
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── Content.imageset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Top Shelf Image.imageset
│ │ │ │ └── Contents.json
│ │ │ ├── Top Shelf Image Wide.imageset
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ └── LaunchImage.launchimage
│ │ │ └── Contents.json
│ ├── ViewController.h
│ ├── AppDelegate.h
│ ├── main.m
│ ├── Info.plist
│ ├── ViewController.m
│ └── AppDelegate.m
├── SDWebImage Watch Demo Extension
│ ├── Assets.xcassets
│ │ └── README__ignoredByTemplate__
│ ├── ExtensionDelegate.h
│ ├── InterfaceController.h
│ ├── NotificationController.h
│ ├── PushNotificationPayload.apns
│ ├── NotificationController.m
│ ├── ExtensionDelegate.m
│ └── Info.plist
├── CustomPathImages
│ └── 4ad9ae8eabfec60b40bf48f0bfc2d120
├── SDWebImage Demo.xcodeproj
│ └── project.xcworkspace
│ │ └── contents.xcworkspacedata
└── SDWebImage Watch Demo
│ ├── Info.plist
│ ├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
│ └── Base.lproj
│ └── Interface.storyboard
├── codecov.yml
├── Configs
├── App-Debug.xcconfig
├── Test-Debug.xcconfig
├── App-Shared.xcconfig
├── Test-Shared.xcconfig
├── App-Release.xcconfig
├── Test-Release.xcconfig
├── Module-Release.xcconfig
└── Module-Debug.xcconfig
├── SDWebImage.xcworkspace
├── xcshareddata
│ └── WorkspaceSettings.xcsettings
└── contents.xcworkspacedata
├── SDWebImage
├── Private
│ ├── SDInternalMacros.m
│ ├── SDDeviceHelper.h
│ ├── UIColor+HexString.h
│ ├── SDWeakProxy.h
│ ├── SDImageIOAnimatedCoderInternal.h
│ ├── SDAsyncBlockOperation.h
│ ├── SDImageCachesManagerOperation.h
│ ├── NSBezierPath+RoundedCorners.h
│ ├── SDImageHEICCoderInternal.h
│ ├── SDDeviceHelper.m
│ ├── SDImageAssetManager.h
│ ├── SDDisplayLink.h
│ ├── UIColor+HexString.m
│ ├── SDInternalMacros.h
│ ├── SDAsyncBlockOperation.m
│ ├── SDWeakProxy.m
│ ├── NSBezierPath+RoundedCorners.m
│ └── SDImageCachesManagerOperation.m
└── Core
│ ├── SDWebImageError.m
│ ├── SDWebImageCompat.m
│ ├── SDWebImageOperation.h
│ ├── UIImage+GIF.m
│ ├── SDImageAPNGCoder.h
│ ├── SDImageCoder.m
│ ├── SDImageFrame.m
│ ├── UIImage+GIF.h
│ ├── SDWebImageCacheKeyFilter.m
│ ├── SDImageGIFCoder.h
│ ├── SDWebImageCacheKeyFilter.h
│ ├── SDWebImageCacheSerializer.m
│ ├── SDWebImageDownloaderRequestModifier.m
│ ├── SDImageHEICCoder.h
│ ├── SDWebImageDownloaderResponseModifier.m
│ ├── SDAnimatedImageRep.h
│ ├── SDImageFrame.h
│ ├── SDImageLoadersManager.h
│ ├── SDWebImageCacheSerializer.h
│ ├── SDImageIOCoder.h
│ ├── UIImage+MemoryCacheCost.h
│ ├── UIImage+ForceDecode.m
│ ├── SDImageGraphics.h
│ ├── SDImageGIFCoder.m
│ ├── UIImage+MemoryCacheCost.m
│ ├── UIImage+ForceDecode.h
│ ├── SDWebImageDownloaderRequestModifier.h
│ ├── SDWebImageDownloaderConfig.m
│ ├── SDWebImageDownloaderResponseModifier.h
│ ├── SDWebImageOptionsProcessor.m
│ ├── UIView+WebCacheOperation.h
│ ├── SDWebImageError.h
│ ├── SDWebImageDownloaderDecryptor.m
│ ├── NSData+ImageContentType.h
│ ├── UIImage+MultiFormat.m
│ ├── UIImage+Metadata.h
│ ├── SDWebImageDownloaderDecryptor.h
│ ├── SDImageAPNGCoder.m
│ ├── SDImageCodersManager.h
│ ├── SDWebImageCompat.h
│ ├── SDImageCacheConfig.m
│ ├── SDImageIOAnimatedCoder.h
│ ├── SDWebImageOptionsProcessor.h
│ ├── NSImage+Compatibility.h
│ ├── SDMemoryCache.h
│ └── SDImageCachesManager.h
├── .gitignore
├── WebImage
├── SDWebImageMapKit.h
└── Info.plist
├── .github
├── PULL_REQUEST_TEMPLATE.md
├── ISSUE_TEMPLATE.md
└── stale.yml
├── LICENSE
├── Podfile
├── Package.swift
├── SDWebImage.podspec
└── SDWebImage.xcodeproj
└── xcshareddata
└── xcschemes
├── SDWebImage XCFramework.xcscheme
├── SDWebImage static.xcscheme
├── SDWebImage.xcscheme
└── SDWebImageMapKit.xcscheme
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.mdj binary
--------------------------------------------------------------------------------
/SDWebImage_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/SDWebImage_logo.png
--------------------------------------------------------------------------------
/SDWebImage_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/SDWebImage_logo_small.png
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestEXIF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestEXIF.png
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImage.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImage.gif
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImage.heic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImage.heic
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImage.heif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImage.heif
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImage.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImage.jpg
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImage.png
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestLoopCount.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestLoopCount.gif
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImageLarge.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImageLarge.jpg
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageClassDiagram.png
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImageAnimated.apng:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImageAnimated.apng
--------------------------------------------------------------------------------
/Tests/Tests/Images/TestImageAnimated.heic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/TestImageAnimated.heic
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageSequenceDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageSequenceDiagram.png
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Tests/Tests/Images/MonochromeTestImage.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Tests/Tests/Images/MonochromeTestImage.jpg
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageCacheClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageCacheClassDiagram.png
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageCodersClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageCodersClassDiagram.png
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageHighLevelDiagram.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageHighLevelDiagram.jpeg
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageLoaderClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageLoaderClassDiagram.png
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageManagerClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageManagerClassDiagram.png
--------------------------------------------------------------------------------
/Docs/Diagrams/SDWebImageTopLevelClassDiagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Docs/Diagrams/SDWebImageTopLevelClassDiagram.png
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/Assets.xcassets/README__ignoredByTemplate__:
--------------------------------------------------------------------------------
1 | Did you know that git does not support storing empty directories?
2 |
--------------------------------------------------------------------------------
/Examples/CustomPathImages/4ad9ae8eabfec60b40bf48f0bfc2d120:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Examples/CustomPathImages/4ad9ae8eabfec60b40bf48f0bfc2d120
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/Assets.xcassets/placeholder.imageset/placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Examples/SDWebImage Demo/Assets.xcassets/placeholder.imageset/placeholder.png
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/Assets.xcassets/placeholder.imageset/placeholder@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcherry/SDWebImage/master/Examples/SDWebImage Demo/Assets.xcassets/placeholder.imageset/placeholder@2x.png
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/codecov.yml:
--------------------------------------------------------------------------------
1 | coverage:
2 | ignore:
3 | - "Examples"
4 | - "Vendors"
5 | - "Tests"
6 | status:
7 | project:
8 | default: off
9 | ios:
10 | flags: ios
11 | macos:
12 | flags: macos
13 | tvos:
14 | flags: tvos
15 |
--------------------------------------------------------------------------------
/Tests/Tests/Tests-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header
3 | //
4 | // The contents of this file are implicitly included at the beginning of every source file.
5 | //
6 |
7 | #ifdef __OBJC__
8 | #import
9 | #import
10 | #endif
11 |
--------------------------------------------------------------------------------
/Configs/App-Debug.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Debug.xcconfig"
5 | #include "App-Shared.xcconfig"
6 |
7 | // If enabled, only the active architecture is built.
8 | ONLY_ACTIVE_ARCH = YES
9 |
--------------------------------------------------------------------------------
/Configs/Test-Debug.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Debug.xcconfig"
5 | #include "Test-Shared.xcconfig"
6 |
7 | // If enabled, only the active architecture is built.
8 | ONLY_ACTIVE_ARCH = YES
9 |
--------------------------------------------------------------------------------
/Configs/App-Shared.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Shared.xcconfig"
5 |
6 | // Name of an asset catalog app icon set whose contents will be merged into the `Info.plist`.
7 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
8 |
--------------------------------------------------------------------------------
/SDWebImage.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/ViewController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface ViewController : UIViewController
12 |
13 | @end
14 |
15 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/MasterViewController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface MasterViewController : UITableViewController
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/ViewController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface ViewController : NSViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "tv",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "tv",
9 | "scale" : "2x"
10 | }
11 | ],
12 | "info" : {
13 | "version" : 1,
14 | "author" : "xcode"
15 | }
16 | }
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/main.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDInternalMacros.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDInternalMacros.h"
10 |
11 | void sd_executeCleanupBlock (__strong sd_cleanupBlock_t *block) {
12 | (*block)();
13 | }
14 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/SDWebImage Demo-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header for all source files of the 'SDWebImage Demo' target in the 'SDWebImage Demo' project
3 | //
4 |
5 | #import
6 |
7 | #ifndef __IPHONE_4_0
8 | #warning "This project uses features only available in iOS SDK 4.0 and later."
9 | #endif
10 |
11 | #ifdef __OBJC__
12 | #import
13 | #import
14 | #endif
15 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface ExtensionDelegate : NSObject
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "layers" : [
3 | {
4 | "filename" : "Front.imagestacklayer"
5 | },
6 | {
7 | "filename" : "Middle.imagestacklayer"
8 | },
9 | {
10 | "filename" : "Back.imagestacklayer"
11 | }
12 | ],
13 | "info" : {
14 | "version" : 1,
15 | "author" : "xcode"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "layers" : [
3 | {
4 | "filename" : "Front.imagestacklayer"
5 | },
6 | {
7 | "filename" : "Middle.imagestacklayer"
8 | },
9 | {
10 | "filename" : "Back.imagestacklayer"
11 | }
12 | ],
13 | "info" : {
14 | "version" : 1,
15 | "author" : "xcode"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/DetailViewController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface DetailViewController : UIViewController
12 |
13 | @property (strong, nonatomic) NSURL *imageURL;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/InterfaceController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import
11 |
12 | @interface InterfaceController : WKInterfaceController
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDDeviceHelper.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | @interface SDDeviceHelper : NSObject
13 |
14 | + (NSUInteger)totalMemory;
15 | + (NSUInteger)freeMemory;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | @interface SDWebImageTestCoder : NSObject
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/NotificationController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import
11 |
12 | @interface NotificationController : WKUserNotificationInterfaceController
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/Assets.xcassets/placeholder.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "placeholder.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "placeholder@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "version" : 1,
20 | "author" : "xcode"
21 | }
22 | }
--------------------------------------------------------------------------------
/Configs/Test-Shared.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Shared.xcconfig"
5 |
6 | // This is a list of paths to folders to be searched by the compiler for included or imported header files when compiling C, Objective-C, C++, or Objective-C++. Paths are delimited by whitespace, so any paths with spaces in them need to be properly quoted.
7 | HEADER_SEARCH_PATHS = $(inherited) "$(SRCROOT)/../SDWebImage/Private"
8 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/main.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestTransformer.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 |
12 | @interface SDWebImageTestTransformer : NSObject
13 |
14 | @property (nonatomic, strong, nullable) UIImage *testImage;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/main.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | #import "AppDelegate.h"
12 |
13 | int main(int argc, char *argv[])
14 | {
15 | @autoreleasepool {
16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 | @property (strong, nonatomic) UINavigationController *navigationController;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageError.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageError.h"
11 |
12 | NSErrorDomain const _Nonnull SDWebImageErrorDomain = @"SDWebImageErrorDomain";
13 | NSErrorUserInfoKey const _Nonnull SDWebImageErrorDownloadStatusCodeKey = @"SDWebImageErrorDownloadStatusCodeKey";
14 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestLoader.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | // A really naive implementation of custom image loader using `NSURLSession`
14 | @interface SDWebImageTestLoader : NSObject
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCompat.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | #if !__has_feature(objc_arc)
12 | #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag
13 | #endif
14 |
15 | #if !OS_OBJECT_USE_OBJC
16 | #error SDWebImage need ARC for dispatch object
17 | #endif
18 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "orientation" : "landscape",
5 | "idiom" : "tv",
6 | "extent" : "full-screen",
7 | "minimum-system-version" : "11.0",
8 | "scale" : "2x"
9 | },
10 | {
11 | "orientation" : "landscape",
12 | "idiom" : "tv",
13 | "extent" : "full-screen",
14 | "minimum-system-version" : "9.0",
15 | "scale" : "1x"
16 | }
17 | ],
18 | "info" : {
19 | "version" : 1,
20 | "author" : "xcode"
21 | }
22 | }
--------------------------------------------------------------------------------
/SDWebImage/Private/UIColor+HexString.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | @interface UIColor (HexString)
12 |
13 | /**
14 | Convenience way to get hex string from color. The output should always be 32-bit RGBA hex string like `#00000000`.
15 | */
16 | @property (nonatomic, copy, readonly, nonnull) NSString *sd_hexString;
17 |
18 | @end
19 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDWeakProxy.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | @interface SDWeakProxy : NSProxy
13 |
14 | @property (nonatomic, weak, readonly, nullable) id target;
15 |
16 | - (nonnull instancetype)initWithTarget:(nonnull id)target;
17 | + (nonnull instancetype)proxyWithTarget:(nonnull id)target;
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | /// A protocol represents cancelable operation.
12 | @protocol SDWebImageOperation
13 |
14 | - (void)cancel;
15 |
16 | @end
17 |
18 | /// NSOperation conform to `SDWebImageOperation`.
19 | @interface NSOperation (SDWebImageOperation)
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageIOAnimatedCoder.h"
11 |
12 | @interface SDImageIOAnimatedCoder ()
13 |
14 | + (NSTimeInterval)frameDurationAtIndex:(NSUInteger)index source:(nonnull CGImageSourceRef)source;
15 | + (NSUInteger)imageLoopCountWithSource:(nonnull CGImageSourceRef)source;
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+GIF.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Laurin Brandner
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "UIImage+GIF.h"
11 | #import "SDImageGIFCoder.h"
12 |
13 | @implementation UIImage (GIF)
14 |
15 | + (nullable UIImage *)sd_imageWithGIFData:(nullable NSData *)data {
16 | if (!data) {
17 | return nil;
18 | }
19 | return [[SDImageGIFCoder sharedCoder] decodedImageWithData:data options:0];
20 | }
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestTransformer.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageTestTransformer.h"
11 |
12 | @implementation SDWebImageTestTransformer
13 |
14 | - (NSString *)transformerKey {
15 | return @"SDWebImageTestTransformer";
16 | }
17 |
18 | - (UIImage *)transformedImageWithImage:(UIImage *)image forKey:(NSString *)key {
19 | return self.testImage;
20 | }
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageAPNGCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageIOAnimatedCoder.h"
11 |
12 | /**
13 | Built in coder using ImageIO that supports APNG encoding/decoding
14 | */
15 | @interface SDImageAPNGCoder : SDImageIOAnimatedCoder
16 |
17 | @property (nonatomic, class, readonly, nonnull) SDImageAPNGCoder *sharedCoder;
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/Configs/App-Release.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Release.xcconfig"
5 | #include "App-Shared.xcconfig"
6 |
7 | // If enabled, only the active architecture is built.
8 | ONLY_ACTIVE_ARCH = NO
9 |
10 | // Space-separated list of additional flags to pass to the compiler for C and Objective-C files. Be sure to backslash-escape any arguments that contain spaces or special characters, such as path names that may contain spaces. Use this setting if Xcode does not already provide UI for a particular C or Objective-C compiler flag.
11 | OTHER_CFLAGS = -DNS_BLOCK_ASSERTIONS=1
12 |
--------------------------------------------------------------------------------
/Configs/Test-Release.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Release.xcconfig"
5 | #include "Test-Shared.xcconfig"
6 |
7 | // If enabled, only the active architecture is built.
8 | ONLY_ACTIVE_ARCH = NO
9 |
10 | // Space-separated list of additional flags to pass to the compiler for C and Objective-C files. Be sure to backslash-escape any arguments that contain spaces or special characters, such as path names that may contain spaces. Use this setting if Xcode does not already provide UI for a particular C or Objective-C compiler flag.
11 | OTHER_CFLAGS = -DNS_BLOCK_ASSERTIONS=1
12 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDAsyncBlockOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | @class SDAsyncBlockOperation;
12 | typedef void (^SDAsyncBlock)(SDAsyncBlockOperation * __nonnull asyncOperation);
13 |
14 | @interface SDAsyncBlockOperation : NSOperation
15 |
16 | - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block;
17 | + (nonnull instancetype)blockOperationWithBlock:(nonnull SDAsyncBlock)block;
18 | - (void)complete;
19 |
20 | @end
21 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDImageCachesManagerOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | // This is used for operation management, but not for operation queue execute
13 | @interface SDImageCachesManagerOperation : NSOperation
14 |
15 | @property (nonatomic, assign, readonly) NSUInteger pendingCount;
16 |
17 | - (void)beginWithTotalCount:(NSUInteger)totalCount;
18 | - (void)completeOne;
19 | - (void)done;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/AppDelegate.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
18 | // Insert code here to initialize your application
19 | }
20 |
21 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
22 | // Insert code here to tear down your application
23 | }
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 | # Xcode
4 | #
5 | build/
6 | *.pbxuser
7 | !default.pbxuser
8 | *.mode1v3
9 | !default.mode1v3
10 | *.mode2v3
11 | !default.mode2v3
12 | *.perspectivev3
13 | !default.perspectivev3
14 | project.xcworkspace
15 | !default.xcworkspace
16 | xcuserdata
17 | *.xccheckout
18 | *.moved-aside
19 | DerivedData
20 | *.hmap
21 | *.ipa
22 | *.xcuserstate
23 | *.xcscmblueprint
24 |
25 | # CocoaPods
26 | #
27 | # We recommend against adding the Pods directory to your .gitignore. However
28 | # you should judge for yourself, the pros and cons are mentioned at:
29 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
30 | #
31 | Pods/
32 | Podfile.lock
33 |
34 | # SwiftPM
35 | .build
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageCoder.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageCoder.h"
10 |
11 | SDImageCoderOption const SDImageCoderDecodeFirstFrameOnly = @"decodeFirstFrameOnly";
12 | SDImageCoderOption const SDImageCoderDecodeScaleFactor = @"decodeScaleFactor";
13 |
14 | SDImageCoderOption const SDImageCoderEncodeFirstFrameOnly = @"encodeFirstFrameOnly";
15 | SDImageCoderOption const SDImageCoderEncodeCompressionQuality = @"encodeCompressionQuality";
16 |
17 | SDImageCoderOption const SDImageCoderWebImageContext = @"webImageContext";
18 |
--------------------------------------------------------------------------------
/SDWebImage/Private/NSBezierPath+RoundedCorners.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | #import "UIImage+Transform.h"
14 |
15 | @interface NSBezierPath (RoundedCorners)
16 |
17 | /**
18 | Convenience way to create a bezier path with the specify rounding corners on macOS. Same as the one on `UIBezierPath`.
19 | */
20 | + (nonnull instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius;
21 |
22 | @end
23 |
24 | #endif
25 |
--------------------------------------------------------------------------------
/Tests/Tests/SDMockFileManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 |
11 | // This is a mock class to provide custom error for methods
12 | @interface SDMockFileManager : NSFileManager
13 |
14 | @property (nonatomic, strong, readonly, nullable) NSError *lastError;
15 |
16 | @property (nonatomic, copy, nullable) NSDictionary *mockSelectors; // used to specify mocked selectors which will return NO with specify error instead of normal process. If you specify a NSNull, will use nil instead.
17 |
18 | @end
19 |
--------------------------------------------------------------------------------
/Tests/Tests/Tests-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundlePackageType
14 | BNDL
15 | CFBundleShortVersionString
16 | 1.0
17 | CFBundleSignature
18 | ????
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestDownloadOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | /**
14 | * A class that fits the NSOperation+SDWebImageDownloaderOperation requirement so we can test
15 | */
16 | @interface SDWebImageTestDownloadOperation : NSOperation
17 |
18 | @property (nonatomic, strong, nullable) NSURLRequest *request;
19 | @property (nonatomic, strong, nullable) NSURLResponse *response;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/WebImage/SDWebImageMapKit.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Florent Vilmart
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 |
12 | //! Project version number for WebImage.
13 | FOUNDATION_EXPORT double WebImageMapKitVersionNumber;
14 |
15 | //! Project version string for WebImage.
16 | FOUNDATION_EXPORT const unsigned char WebImageMapKitVersionString[];
17 |
18 | // In this header, you should import all the public headers of your framework using statements like #import
19 |
20 | // MapKit
21 | #import
22 |
--------------------------------------------------------------------------------
/SDWebImage.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
12 |
13 |
15 |
16 |
18 |
19 |
21 |
22 |
24 |
25 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/Tests/Tests Mac/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageFrame.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageFrame.h"
10 |
11 | @interface SDImageFrame ()
12 |
13 | @property (nonatomic, strong, readwrite, nonnull) UIImage *image;
14 | @property (nonatomic, readwrite, assign) NSTimeInterval duration;
15 |
16 | @end
17 |
18 | @implementation SDImageFrame
19 |
20 | + (instancetype)frameWithImage:(UIImage *)image duration:(NSTimeInterval)duration {
21 | SDImageFrame *frame = [[SDImageFrame alloc] init];
22 | frame.image = image;
23 | frame.duration = duration;
24 |
25 | return frame;
26 | }
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/Tests/Tests TV/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "assets" : [
3 | {
4 | "size" : "1280x768",
5 | "idiom" : "tv",
6 | "filename" : "App Icon - Large.imagestack",
7 | "role" : "primary-app-icon"
8 | },
9 | {
10 | "size" : "400x240",
11 | "idiom" : "tv",
12 | "filename" : "App Icon - Small.imagestack",
13 | "role" : "primary-app-icon"
14 | },
15 | {
16 | "size" : "2320x720",
17 | "idiom" : "tv",
18 | "filename" : "Top Shelf Image Wide.imageset",
19 | "role" : "top-shelf-image-wide"
20 | },
21 | {
22 | "size" : "1920x720",
23 | "idiom" : "tv",
24 | "filename" : "Top Shelf Image.imageset",
25 | "role" : "top-shelf-image"
26 | }
27 | ],
28 | "info" : {
29 | "version" : 1,
30 | "author" : "xcode"
31 | }
32 | }
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ### New Pull Request Checklist
2 |
3 | * [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/rs/SDWebImage/blob/master/.github/CONTRIBUTING.md)
4 | * [ ] I have read the [Documentation](http://cocoadocs.org/docsets/SDWebImage/)
5 | * [ ] I have searched for a similar pull request in the [project](https://github.com/rs/SDWebImage/pulls) and found none
6 |
7 | * [ ] I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase)
8 | * [ ] I have added the required tests to prove the fix/feature I am adding
9 | * [ ] I have updated the documentation (if necessary)
10 | * [ ] I have run the tests and they pass
11 | * [ ] I have run the lint and it passes (`pod lib lint`)
12 |
13 | This merge request fixes / refers to the following issues: ...
14 |
15 | ### Pull Request Description
16 |
17 | ...
18 |
19 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+GIF.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Laurin Brandner
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageCompat.h"
11 |
12 | /**
13 | This category is just use as a convenience method. For more detail control, use methods in `UIImage+MultiFormat.h` or directlly use `SDImageCoder`.
14 | */
15 | @interface UIImage (GIF)
16 |
17 | /**
18 | Creates an animated UIImage from an NSData.
19 | This will create animated image if the data is Animated GIF. And will create a static image is the data is Static GIF.
20 |
21 | @param data The GIF data
22 | @return The created image
23 | */
24 | + (nullable UIImage *)sd_imageWithGIFData:(nullable NSData *)data;
25 |
26 | @end
27 |
--------------------------------------------------------------------------------
/WebImage/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 5.3.2
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 5.3.2
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/PushNotificationPayload.apns:
--------------------------------------------------------------------------------
1 | {
2 | "aps": {
3 | "alert": {
4 | "body": "Test message",
5 | "title": "Optional title"
6 | },
7 | "category": "myCategory"
8 | },
9 |
10 | "WatchKit Simulator Actions": [
11 | {
12 | "title": "First Button",
13 | "identifier": "firstButtonAction"
14 | }
15 | ],
16 |
17 | "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
18 | }
19 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDImageHEICCoderInternal.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageHEICCoder.h"
11 |
12 | // AVFileTypeHEIC/AVFileTypeHEIF is defined in AVFoundation via iOS 11, we use this without import AVFoundation
13 | #define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic")
14 | #define kSDUTTypeHEIF ((__bridge CFStringRef)@"public.heif")
15 | // HEIC Sequence (Animated Image)
16 | #define kSDUTTypeHEICS ((__bridge CFStringRef)@"public.heics")
17 |
18 | @interface SDImageHEICCoder ()
19 |
20 | + (BOOL)canDecodeFromHEICFormat;
21 | + (BOOL)canDecodeFromHEIFFormat;
22 | + (BOOL)canEncodeToHEICFormat;
23 | + (BOOL)canEncodeToHEIFFormat;
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestCache.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | // A really naive implementation of custom memory cache and disk cache
14 |
15 | @interface SDWebImageTestMemoryCache : NSObject
16 |
17 | @property (nonatomic, strong, nonnull) SDImageCacheConfig *config;
18 | @property (nonatomic, strong, nonnull) NSCache *cache;
19 |
20 | @end
21 |
22 | @interface SDWebImageTestDiskCache : NSObject
23 |
24 | @property (nonatomic, strong, nonnull) SDImageCacheConfig *config;
25 | @property (nonatomic, copy, nonnull) NSString *cachePath;
26 | @property (nonatomic, strong, nonnull) NSFileManager *fileManager;
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/NotificationController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "NotificationController.h"
10 |
11 |
12 | @interface NotificationController()
13 |
14 | @end
15 |
16 |
17 | @implementation NotificationController
18 |
19 | - (instancetype)init {
20 | self = [super init];
21 | if (self){
22 | // Initialize variables here.
23 | // Configure interface objects here.
24 |
25 | }
26 | return self;
27 | }
28 |
29 | - (void)willActivate {
30 | // This method is called when watch view controller is about to be visible to user
31 | [super willActivate];
32 | }
33 |
34 | - (void)didDeactivate {
35 | // This method is called when watch view controller is no longer visible
36 | [super didDeactivate];
37 | }
38 |
39 | @end
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDDeviceHelper.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDDeviceHelper.h"
10 | #import
11 |
12 | @implementation SDDeviceHelper
13 |
14 | + (NSUInteger)totalMemory {
15 | return (NSUInteger)[[NSProcessInfo processInfo] physicalMemory];
16 | }
17 |
18 | + (NSUInteger)freeMemory {
19 | mach_port_t host_port = mach_host_self();
20 | mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
21 | vm_size_t page_size;
22 | vm_statistics_data_t vm_stat;
23 | kern_return_t kern;
24 |
25 | kern = host_page_size(host_port, &page_size);
26 | if (kern != KERN_SUCCESS) return 0;
27 | kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
28 | if (kern != KERN_SUCCESS) return 0;
29 | return vm_stat.free_count * page_size;
30 | }
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDImageAssetManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | // Apple parse the Asset Catalog compiled file(`Assets.car`) by CoreUI.framework, however it's a private framework and there are no other ways to directly get the data. So we just process the normal bundle files :)
13 |
14 | @interface SDImageAssetManager : NSObject
15 |
16 | @property (nonatomic, strong, nonnull) NSMapTable *imageTable;
17 |
18 | + (nonnull instancetype)sharedAssetManager;
19 | - (nullable NSString *)getPathForName:(nonnull NSString *)name bundle:(nonnull NSBundle *)bundle preferredScale:(nonnull CGFloat *)scale;
20 | - (nullable UIImage *)imageForName:(nonnull NSString *)name;
21 | - (void)storeImage:(nonnull UIImage *)image forName:(nonnull NSString *)name;
22 |
23 | @end
24 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCacheKeyFilter.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCacheKeyFilter.h"
10 |
11 | @interface SDWebImageCacheKeyFilter ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageCacheKeyFilterBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageCacheKeyFilter
18 |
19 | - (instancetype)initWithBlock:(SDWebImageCacheKeyFilterBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)cacheKeyFilterWithBlock:(SDWebImageCacheKeyFilterBlock)block {
28 | SDWebImageCacheKeyFilter *cacheKeyFilter = [[SDWebImageCacheKeyFilter alloc] initWithBlock:block];
29 | return cacheKeyFilter;
30 | }
31 |
32 | - (NSString *)cacheKeyForURL:(NSURL *)url {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(url);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2009-2018 Olivier Poitrey rs@dailymotion.com
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is furnished
8 | to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
21 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDDisplayLink.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | // Cross-platform display link wrapper. Do not retain the target
13 | // Use `CADisplayLink` on iOS/tvOS, `CVDisplayLink` on macOS, `NSTimer` on watchOS
14 |
15 | @interface SDDisplayLink : NSObject
16 |
17 | @property (readonly, nonatomic, weak, nullable) id target;
18 | @property (readonly, nonatomic, assign, nonnull) SEL selector;
19 | @property (readonly, nonatomic) CFTimeInterval duration;
20 | @property (readonly, nonatomic) BOOL isRunning;
21 |
22 | + (nonnull instancetype)displayLinkWithTarget:(nonnull id)target selector:(nonnull SEL)sel;
23 |
24 | - (void)addToRunLoop:(nonnull NSRunLoop *)runloop forMode:(nonnull NSRunLoopMode)mode;
25 | - (void)removeFromRunLoop:(nonnull NSRunLoop *)runloop forMode:(nonnull NSRunLoopMode)mode;
26 |
27 | - (void)start;
28 | - (void)stop;
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageGIFCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageIOAnimatedCoder.h"
11 |
12 | /**
13 | Built in coder using ImageIO that supports animated GIF encoding/decoding
14 | @note `SDImageIOCoder` supports GIF but only as static (will use the 1st frame).
15 | @note Use `SDImageGIFCoder` for fully animated GIFs. For `UIImageView`, it will produce animated `UIImage`(`NSImage` on macOS) for rendering. For `SDAnimatedImageView`, it will use `SDAnimatedImage` for rendering.
16 | @note The recommended approach for animated GIFs is using `SDAnimatedImage` with `SDAnimatedImageView`. It's more performant than `UIImageView` for GIF displaying(especially on memory usage)
17 | */
18 | @interface SDImageGIFCoder : SDImageIOAnimatedCoder
19 |
20 | @property (nonatomic, class, readonly, nonnull) SDImageGIFCoder *sharedCoder;
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "ExtensionDelegate.h"
10 |
11 | @implementation ExtensionDelegate
12 |
13 | - (void)applicationDidFinishLaunching {
14 | // Perform any final initialization of your application.
15 | }
16 |
17 | - (void)applicationDidBecomeActive {
18 | // 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.
19 | }
20 |
21 | - (void)applicationWillResignActive {
22 | // 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.
23 | // Use this method to pause ongoing tasks, disable timers, etc.
24 | }
25 |
26 | @end
27 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSAppTransportSecurity
6 |
7 | NSAllowsArbitraryLoads
8 |
9 |
10 | CFBundleDevelopmentRegion
11 | en
12 | CFBundleExecutable
13 | $(EXECUTABLE_NAME)
14 | CFBundleIdentifier
15 | $(PRODUCT_BUNDLE_IDENTIFIER)
16 | CFBundleInfoDictionaryVersion
17 | 6.0
18 | CFBundleName
19 | $(PRODUCT_NAME)
20 | CFBundlePackageType
21 | APPL
22 | CFBundleShortVersionString
23 | 1.0
24 | CFBundleSignature
25 | ????
26 | CFBundleVersion
27 | 1
28 | LSRequiresIPhoneOS
29 |
30 | UIMainStoryboardFile
31 | Main
32 | UIRequiredDeviceCapabilities
33 |
34 | arm64
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/Tests/Tests/SDTestCase.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #define EXP_SHORTHAND // required by Expecta
11 |
12 |
13 | #import
14 | #import
15 | #import
16 |
17 | #if SD_MAC
18 | #define UIWindow NSWindow
19 | #define UIScreen NSScreen
20 | #endif
21 |
22 | FOUNDATION_EXPORT const int64_t kAsyncTestTimeout;
23 | FOUNDATION_EXPORT const int64_t kMinDelayNanosecond;
24 | FOUNDATION_EXPORT NSString * _Nonnull const kTestJPEGURL;
25 | FOUNDATION_EXPORT NSString * _Nonnull const kTestProgressiveJPEGURL;
26 | FOUNDATION_EXPORT NSString * _Nonnull const kTestPNGURL;
27 | FOUNDATION_EXPORT NSString * _Nonnull const kTestGIFURL;
28 | FOUNDATION_EXPORT NSString * _Nonnull const kTestAPNGPURL;
29 |
30 | @interface SDTestCase : XCTestCase
31 |
32 | - (void)waitForExpectationsWithCommonTimeout;
33 | - (void)waitForExpectationsWithCommonTimeoutUsingHandler:(nullable XCWaitCompletionHandler)handler;
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCacheKeyFilter.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _Nonnull url);
13 |
14 | /**
15 | This is the protocol for cache key filter.
16 | We can use a block to specify the cache key filter. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageCacheKeyFilter
19 |
20 | - (nullable NSString *)cacheKeyForURL:(nonnull NSURL *)url;
21 |
22 | @end
23 |
24 | /**
25 | A cache key filter class with block.
26 | */
27 | @interface SDWebImageCacheKeyFilter : NSObject
28 |
29 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;
30 | + (nonnull instancetype)cacheKeyFilterWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCacheSerializer.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCacheSerializer.h"
10 |
11 | @interface SDWebImageCacheSerializer ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageCacheSerializerBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageCacheSerializer
18 |
19 | - (instancetype)initWithBlock:(SDWebImageCacheSerializerBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)cacheSerializerWithBlock:(SDWebImageCacheSerializerBlock)block {
28 | SDWebImageCacheSerializer *cacheSerializer = [[SDWebImageCacheSerializer alloc] initWithBlock:block];
29 | return cacheSerializer;
30 | }
31 |
32 | - (NSData *)cacheDataWithImage:(UIImage *)image originalData:(NSData *)data imageURL:(nullable NSURL *)imageURL {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(image, data, imageURL);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageDownloaderRequestModifier.h"
10 |
11 | @interface SDWebImageDownloaderRequestModifier ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageDownloaderRequestModifierBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageDownloaderRequestModifier
18 |
19 | - (instancetype)initWithBlock:(SDWebImageDownloaderRequestModifierBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)requestModifierWithBlock:(SDWebImageDownloaderRequestModifierBlock)block {
28 | SDWebImageDownloaderRequestModifier *requestModifier = [[SDWebImageDownloaderRequestModifier alloc] initWithBlock:block];
29 | return requestModifier;
30 | }
31 |
32 | - (NSURLRequest *)modifiedRequestWithRequest:(NSURLRequest *)request {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(request);
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageHEICCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageIOAnimatedCoder.h"
11 |
12 | /**
13 | This coder is used for HEIC (HEIF with HEVC container codec) image format.
14 | Image/IO provide the static HEIC (.heic) support in iOS 11/macOS 10.13/tvOS 11/watchOS 4+.
15 | Image/IO provide the animated HEIC (.heics) support in iOS 13/macOS 10.15/tvOS 13/watchOS 6+.
16 | See https://nokiatech.github.io/heif/technical.html for the standard.
17 | @note This coder is not in the default coder list for now, since HEIC animated image is really rare, and Apple's implementation still contains performance issues. You can enable if you need this.
18 | @note If you need to support lower firmware version for HEIF, you can have a try at https://github.com/SDWebImage/SDWebImageHEIFCoder
19 | */
20 | @interface SDImageHEICCoder : SDImageIOAnimatedCoder
21 |
22 | @property (nonatomic, class, readonly, nonnull) SDImageHEICCoder *sharedCoder;
23 |
24 | @end
25 |
--------------------------------------------------------------------------------
/SDWebImage/Private/UIColor+HexString.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "UIColor+HexString.h"
10 |
11 | @implementation UIColor (HexString)
12 |
13 | - (NSString *)sd_hexString {
14 | CGFloat red, green, blue, alpha;
15 | #if SD_UIKIT
16 | if (![self getRed:&red green:&green blue:&blue alpha:&alpha]) {
17 | [self getWhite:&red alpha:&alpha];
18 | green = red;
19 | blue = red;
20 | }
21 | #else
22 | @try {
23 | [self getRed:&red green:&green blue:&blue alpha:&alpha];
24 | }
25 | @catch (NSException *exception) {
26 | [self getWhite:&red alpha:&alpha];
27 | green = red;
28 | blue = red;
29 | }
30 | #endif
31 |
32 | red = roundf(red * 255.f);
33 | green = roundf(green * 255.f);
34 | blue = roundf(blue * 255.f);
35 | alpha = roundf(alpha * 255.f);
36 |
37 | uint hex = ((uint)alpha << 24) | ((uint)red << 16) | ((uint)green << 8) | ((uint)blue);
38 |
39 | return [NSString stringWithFormat:@"#%08x", hex];
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/Configs/Module-Release.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Shared.xcconfig"
5 |
6 | // Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols.
7 | COPY_PHASE_STRIP = YES
8 |
9 | // The type of debug information to produce.
10 | DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
11 |
12 | // Controls whether assertion logic provided by `NSAssert` is included in the preprocessed source code or is elided during preprocessing.
13 | ENABLE_NS_ASSERTIONS = NO
14 |
15 | // When this setting is activated, the product will be built with options appropriate for running automated tests, such as making private interfaces accessible to the tests.
16 | ENABLE_TESTABILITY = NO
17 |
18 | // Specifies the degree to which the generated code is optimized for speed and binary size.
19 | GCC_OPTIMIZATION_LEVEL = s
20 |
21 | // Metal debug info
22 | MTL_ENABLE_DEBUG_INFO = NO
23 |
24 | // If enabled, only the active architecture is built.
25 | ONLY_ACTIVE_ARCH = NO
26 |
27 | // If enabled, perform validation checks on the product as part of the build process.
28 | VALIDATE_PRODUCT = YES
29 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | SDWebImage iOS Demo
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | UISupportedInterfaceOrientations
26 |
27 | UIInterfaceOrientationPortrait
28 | UIInterfaceOrientationPortraitUpsideDown
29 |
30 | WKCompanionAppBundleIdentifier
31 | com.dailymotion.SDWebImage-iOS-Demo
32 | WKWatchKitApp
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ### New Issue Checklist
2 |
3 | * [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/rs/SDWebImage/blob/master/.github/CONTRIBUTING.md)
4 | * [ ] I have read the [Documentation](http://cocoadocs.org/docsets/SDWebImage/)
5 | * [ ] I have searched for a similar issue in the [project](https://github.com/rs/SDWebImage/issues) and found none
6 |
7 | ### Issue Info
8 |
9 | Info | Value |
10 | -------------------------|-------------------------------------|
11 | Platform Name | e.g. ios / macos / tvos / watchos
12 | Platform Version | e.g. 12.0 / 10.14.0 / 12.0 / 5.0
13 | SDWebImage Version | e.g. 5.0.0 / 4.4.0
14 | Integration Method | e.g. carthage / cocoapods / manually
15 | Xcode Version | e.g. Xcode 11 / Xcode 10
16 | Repro rate | e.g. all the time (100%) / sometimes x% / only once
17 | Repro with our demo prj | e.g. does it happen with our demo project?
18 | Demo project link | e.g. link to a demo project that highlights the issue
19 |
20 | ### Issue Description and Steps
21 |
22 | Please fill in the detailed description of the issue (full output of any stack trace, compiler error, ...) and the steps to reproduce the issue.
23 |
24 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 |
10 | #import "SDWebImageDownloaderResponseModifier.h"
11 |
12 | @interface SDWebImageDownloaderResponseModifier ()
13 |
14 | @property (nonatomic, copy, nonnull) SDWebImageDownloaderResponseModifierBlock block;
15 |
16 | @end
17 |
18 | @implementation SDWebImageDownloaderResponseModifier
19 |
20 | - (instancetype)initWithBlock:(SDWebImageDownloaderResponseModifierBlock)block {
21 | self = [super init];
22 | if (self) {
23 | self.block = block;
24 | }
25 | return self;
26 | }
27 |
28 | + (instancetype)responseModifierWithBlock:(SDWebImageDownloaderResponseModifierBlock)block {
29 | SDWebImageDownloaderResponseModifier *responseModifier = [[SDWebImageDownloaderResponseModifier alloc] initWithBlock:block];
30 | return responseModifier;
31 | }
32 |
33 | - (nullable NSURLResponse *)modifiedResponseWithResponse:(nonnull NSURLResponse *)response {
34 | if (!self.block) {
35 | return nil;
36 | }
37 | return self.block(response);
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDAnimatedImageRep.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | /**
14 | A subclass of `NSBitmapImageRep` to fix that GIF duration issue because `NSBitmapImageRep` will reset `NSImageCurrentFrameDuration` by using `kCGImagePropertyGIFDelayTime` but not `kCGImagePropertyGIFUnclampedDelayTime`.
15 | This also fix the GIF loop count issue, which will use the Netscape standard (See http://www6.uniovi.es/gifanim/gifabout.htm) to only place once when the `kCGImagePropertyGIFLoopCount` is nil. This is what modern browser's behavior.
16 | Built in GIF coder use this instead of `NSBitmapImageRep` for better GIF rendering. If you do not want this, only enable `SDImageIOCoder`, which just call `NSImage` API and actually use `NSBitmapImageRep` for GIF image.
17 | This also support APNG format using `SDImageAPNGCoder`. Which provide full alpha-channel support and the correct duration match the `kCGImagePropertyAPNGUnclampedDelayTime`.
18 | */
19 | @interface SDAnimatedImageRep : NSBitmapImageRep
20 |
21 | @end
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/Tests/Tests/SDMockFileManager.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDMockFileManager.h"
10 |
11 | @interface SDMockFileManager ()
12 |
13 | @property (nonatomic, strong, nullable) NSError *lastError;
14 |
15 | @end
16 |
17 | @implementation SDMockFileManager
18 |
19 | - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError * _Nullable __autoreleasing *)error {
20 | self.lastError = nil;
21 | NSError *mockError = [self.mockSelectors objectForKey:NSStringFromSelector(_cmd)];
22 | if ([mockError isEqual:[NSNull null]]) {
23 | if (error) {
24 | *error = nil;
25 | }
26 | return NO;
27 | } else if (mockError) {
28 | if (error) {
29 | *error = mockError;
30 | }
31 | self.lastError = mockError;
32 | return NO;
33 | } else {
34 | return [super createDirectoryAtPath:path withIntermediateDirectories:createIntermediates attributes:attributes error:error];
35 | }
36 | }
37 |
38 | @end
39 |
--------------------------------------------------------------------------------
/Tests/Tests/SDTestCase.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDTestCase.h"
11 |
12 | const int64_t kAsyncTestTimeout = 5;
13 | const int64_t kMinDelayNanosecond = NSEC_PER_MSEC * 100; // 0.1s
14 | NSString *const kTestJPEGURL = @"http://via.placeholder.com/50x50.jpg";
15 | NSString *const kTestProgressiveJPEGURL = @"https://raw.githubusercontent.com/ibireme/YYImage/master/Demo/YYImageDemo/mew_progressive.jpg";
16 | NSString *const kTestPNGURL = @"http://via.placeholder.com/50x50.png";
17 | NSString *const kTestGIFURL = @"https://media.giphy.com/media/UEsrLdv7ugRTq/giphy.gif";
18 | NSString *const kTestAPNGPURL = @"https://upload.wikimedia.org/wikipedia/commons/1/14/Animated_PNG_example_bouncing_beach_ball.png";
19 |
20 | @implementation SDTestCase
21 |
22 | - (void)waitForExpectationsWithCommonTimeout {
23 | [self waitForExpectationsWithCommonTimeoutUsingHandler:nil];
24 | }
25 |
26 | - (void)waitForExpectationsWithCommonTimeoutUsingHandler:(XCWaitCompletionHandler)handler {
27 | [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:handler];
28 | }
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageFrame.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | /**
13 | This class is used for creating animated images via `animatedImageWithFrames` in `SDImageCoderHelper`.
14 | @note If you need to specify animated images loop count, use `sd_imageLoopCount` property in `UIImage+Metadata.h`.
15 | */
16 | @interface SDImageFrame : NSObject
17 |
18 | /**
19 | The image of current frame. You should not set an animated image.
20 | */
21 | @property (nonatomic, strong, readonly, nonnull) UIImage *image;
22 | /**
23 | The duration of current frame to be displayed. The number is seconds but not milliseconds. You should not set this to zero.
24 | */
25 | @property (nonatomic, readonly, assign) NSTimeInterval duration;
26 |
27 | /**
28 | Create a frame instance with specify image and duration
29 |
30 | @param image current frame's image
31 | @param duration current frame's duration
32 | @return frame instance
33 | */
34 | + (instancetype _Nonnull)frameWithImage:(UIImage * _Nonnull)image duration:(NSTimeInterval)duration;
35 |
36 | @end
37 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageLoadersManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageLoader.h"
10 |
11 | /**
12 | A loaders manager to manage multiple loaders
13 | */
14 | @interface SDImageLoadersManager : NSObject
15 |
16 | /**
17 | Returns the global shared loaders manager instance. By default we will set [`SDWebImageDownloader.sharedDownloader`] into the loaders array.
18 | */
19 | @property (nonatomic, class, readonly, nonnull) SDImageLoadersManager *sharedManager;
20 |
21 | /**
22 | All image loaders in manager. The loaders array is a priority queue, which means the later added loader will have the highest priority
23 | */
24 | @property (nonatomic, copy, nullable) NSArray>* loaders;
25 |
26 | /**
27 | Add a new image loader to the end of loaders array. Which has the highest priority.
28 |
29 | @param loader loader
30 | */
31 | - (void)addLoader:(nonnull id)loader;
32 |
33 | /**
34 | Remove a image loader in the loaders array.
35 |
36 | @param loader loader
37 | */
38 | - (void)removeLoader:(nonnull id)loader;
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCacheSerializer.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL);
13 |
14 | /**
15 | This is the protocol for cache serializer.
16 | We can use a block to specify the cache serializer. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageCacheSerializer
19 |
20 | - (nullable NSData *)cacheDataWithImage:(nonnull UIImage *)image originalData:(nullable NSData *)data imageURL:(nullable NSURL *)imageURL;
21 |
22 | @end
23 |
24 | /**
25 | A cache serializer class with block.
26 | */
27 | @interface SDWebImageCacheSerializer : NSObject
28 |
29 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
30 | + (nonnull instancetype)cacheSerializerWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
31 |
32 | @end
33 |
--------------------------------------------------------------------------------
/Examples/SDWebImage OSX Demo/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSAppTransportSecurity
6 |
7 | NSAllowsArbitraryLoads
8 |
9 |
10 | CFBundleDevelopmentRegion
11 | en
12 | CFBundleExecutable
13 | $(EXECUTABLE_NAME)
14 | CFBundleIconFile
15 |
16 | CFBundleIdentifier
17 | $(PRODUCT_BUNDLE_IDENTIFIER)
18 | CFBundleInfoDictionaryVersion
19 | 6.0
20 | CFBundleName
21 | $(PRODUCT_NAME)
22 | CFBundlePackageType
23 | APPL
24 | CFBundleShortVersionString
25 | 1.0
26 | CFBundleSignature
27 | ????
28 | CFBundleVersion
29 | 1
30 | LSMinimumSystemVersion
31 | $(MACOSX_DEPLOYMENT_TARGET)
32 | NSHumanReadableCopyright
33 | Copyright © 2017 Dailymotion. All rights reserved.
34 | NSMainStoryboardFile
35 | Main
36 | NSPrincipalClass
37 | NSApplication
38 |
39 |
40 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - important
8 | # Label to use when marking an issue as stale
9 | staleLabel: stale
10 | # Comment to post when marking an issue as stale. Set to `false` to disable
11 | markComment: >
12 | This issue has been automatically marked as stale because it has not had
13 | recent activity. It will be closed if no further activity occurs.
14 | If this is still an issue, please make sure it is up to date and if so,
15 | add a comment that this is still an issue to keep it open.
16 | Thank you for your contributions.
17 | # Comment to post when closing a stale issue. Set to `false` to disable
18 | closeComment: false
19 |
20 | # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
21 | pulls:
22 | daysUntilStale: 60
23 | markComment: >
24 | This pull request has been automatically marked as stale because it has not had
25 | recent activity. It will be closed if no further activity occurs.
26 | If this is still applicable, please make sure it is up to date and if so,
27 | add a comment that this is still an issue to keep it open.
28 | Thank you for your contributions.
29 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageIOCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Built in coder that supports PNG, JPEG, TIFF, includes support for progressive decoding.
14 |
15 | GIF
16 | Also supports static GIF (meaning will only handle the 1st frame).
17 | For a full GIF support, we recommend `SDAnimatedImageView` to keep both CPU and memory balanced.
18 |
19 | HEIC
20 | This coder also supports HEIC format because ImageIO supports it natively. But it depends on the system capabilities, so it won't work on all devices, see: https://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf
21 | Decode(Software): !Simulator && (iOS 11 || tvOS 11 || macOS 10.13)
22 | Decode(Hardware): !Simulator && ((iOS 11 && A9Chip) || (macOS 10.13 && 6thGenerationIntelCPU))
23 | Encode(Software): macOS 10.13
24 | Encode(Hardware): !Simulator && ((iOS 11 && A10FusionChip) || (macOS 10.13 && 6thGenerationIntelCPU))
25 | */
26 | @interface SDImageIOCoder : NSObject
27 |
28 | @property (nonatomic, class, readonly, nonnull) SDImageIOCoder *sharedCoder;
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+MemoryCacheCost.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | /**
12 | UIImage category for memory cache cost.
13 | */
14 | @interface UIImage (MemoryCacheCost)
15 |
16 | /**
17 | The memory cache cost for specify image used by image cache. The cost function is the bytes size held in memory.
18 | If you set some associated object to `UIImage`, you can set the custom value to indicate the memory cost.
19 |
20 | For `UIImage`, this method return the single frame bytes size when `image.images` is nil for static image. Retuen full frame bytes size when `image.images` is not nil for animated image.
21 | For `NSImage`, this method return the single frame bytes size because `NSImage` does not store all frames in memory.
22 | @note Note that because of the limitations of category this property can get out of sync if you create another instance with CGImage or other methods.
23 | @note For custom animated class conforms to `SDAnimatedImage`, you can override this getter method in your subclass to return a more proper value instead, which representing the current frame's total bytes.
24 | */
25 | @property (assign, nonatomic) NSUInteger sd_memoryCost;
26 |
27 | @end
28 |
--------------------------------------------------------------------------------
/Configs/Module-Debug.xcconfig:
--------------------------------------------------------------------------------
1 | // Configuration settings file format documentation can be found at:
2 | // https://help.apple.com/xcode/#/dev745c5c974
3 |
4 | #include "Module-Shared.xcconfig"
5 |
6 | // Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols.
7 | COPY_PHASE_STRIP = NO
8 |
9 | // The type of debug information to produce.
10 | DEBUG_INFORMATION_FORMAT = dwarf
11 |
12 | // Controls whether assertion logic provided by `NSAssert` is included in the preprocessed source code or is elided during preprocessing.
13 | ENABLE_NS_ASSERTIONS = YES
14 |
15 | // When this setting is activated, the product will be built with options appropriate for running automated tests, such as making private interfaces accessible to the tests.
16 | ENABLE_TESTABILITY = YES
17 |
18 | // Specifies the degree to which the generated code is optimized for speed and binary size.
19 | GCC_OPTIMIZATION_LEVEL = 0
20 |
21 | // Space-separated list of preprocessor macros of the form `foo` or `foo=bar`
22 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1
23 |
24 | // Metal debug info - not sure why we need it
25 | MTL_ENABLE_DEBUG_INFO = YES
26 |
27 | // If enabled, only the active architecture is built.
28 | ONLY_ACTIVE_ARCH = YES
29 |
30 | // If enabled, perform validation checks on the product as part of the build process.
31 | VALIDATE_PRODUCT = NO
32 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+ForceDecode.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "UIImage+ForceDecode.h"
10 | #import "SDImageCoderHelper.h"
11 | #import "objc/runtime.h"
12 |
13 | @implementation UIImage (ForceDecode)
14 |
15 | - (BOOL)sd_isDecoded {
16 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_isDecoded));
17 | return value.boolValue;
18 | }
19 |
20 | - (void)setSd_isDecoded:(BOOL)sd_isDecoded {
21 | objc_setAssociatedObject(self, @selector(sd_isDecoded), @(sd_isDecoded), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
22 | }
23 |
24 | + (nullable UIImage *)sd_decodedImageWithImage:(nullable UIImage *)image {
25 | if (!image) {
26 | return nil;
27 | }
28 | return [SDImageCoderHelper decodedImageWithImage:image];
29 | }
30 |
31 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image {
32 | return [self sd_decodedAndScaledDownImageWithImage:image limitBytes:0];
33 | }
34 |
35 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image limitBytes:(NSUInteger)bytes {
36 | if (!image) {
37 | return nil;
38 | }
39 | return [SDImageCoderHelper decodedAndScaledDownImageWithImage:image limitBytes:bytes];
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo Extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSAppTransportSecurity
6 |
7 | NSAllowsArbitraryLoads
8 |
9 |
10 | CFBundleDevelopmentRegion
11 | en
12 | CFBundleDisplayName
13 | SDWebImage Watch Demo Extension
14 | CFBundleExecutable
15 | $(EXECUTABLE_NAME)
16 | CFBundleIdentifier
17 | $(PRODUCT_BUNDLE_IDENTIFIER)
18 | CFBundleInfoDictionaryVersion
19 | 6.0
20 | CFBundleName
21 | $(PRODUCT_NAME)
22 | CFBundlePackageType
23 | XPC!
24 | CFBundleShortVersionString
25 | 1.0
26 | CFBundleSignature
27 | ????
28 | CFBundleVersion
29 | 1
30 | NSExtension
31 |
32 | NSExtensionAttributes
33 |
34 | WKAppBundleIdentifier
35 | com.dailymotion.SDWebImage-iOS-Demo.watchkitapp
36 |
37 | NSExtensionPointIdentifier
38 | com.apple.watchkit
39 |
40 | WKExtensionDelegateClassName
41 | ExtensionDelegate
42 |
43 |
44 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageGraphics.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 | #import
11 |
12 | /**
13 | These following graphics context method are provided to easily write cross-platform(AppKit/UIKit) code.
14 | For UIKit, these methods just call the same method in `UIGraphics.h`. See the documentation for usage.
15 | For AppKit, these methods use `NSGraphicsContext` to create image context and match the behavior like UIKit.
16 | */
17 |
18 | /// Returns the current graphics context.
19 | FOUNDATION_EXPORT CGContextRef __nullable SDGraphicsGetCurrentContext(void) CF_RETURNS_NOT_RETAINED;
20 | /// Creates a bitmap-based graphics context and makes it the current context.
21 | FOUNDATION_EXPORT void SDGraphicsBeginImageContext(CGSize size);
22 | /// Creates a bitmap-based graphics context with the specified options.
23 | FOUNDATION_EXPORT void SDGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
24 | /// Removes the current bitmap-based graphics context from the top of the stack.
25 | FOUNDATION_EXPORT void SDGraphicsEndImageContext(void);
26 | /// Returns an image based on the contents of the current bitmap-based graphics context.
27 | FOUNDATION_EXPORT UIImage * __nullable SDGraphicsGetImageFromCurrentImageContext(void);
28 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageGIFCoder.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageGIFCoder.h"
10 | #if SD_MAC
11 | #import
12 | #else
13 | #import
14 | #endif
15 |
16 | @implementation SDImageGIFCoder
17 |
18 | + (instancetype)sharedCoder {
19 | static SDImageGIFCoder *coder;
20 | static dispatch_once_t onceToken;
21 | dispatch_once(&onceToken, ^{
22 | coder = [[SDImageGIFCoder alloc] init];
23 | });
24 | return coder;
25 | }
26 |
27 | #pragma mark - Subclass Override
28 |
29 | + (SDImageFormat)imageFormat {
30 | return SDImageFormatGIF;
31 | }
32 |
33 | + (NSString *)imageUTType {
34 | return (__bridge NSString *)kUTTypeGIF;
35 | }
36 |
37 | + (NSString *)dictionaryProperty {
38 | return (__bridge NSString *)kCGImagePropertyGIFDictionary;
39 | }
40 |
41 | + (NSString *)unclampedDelayTimeProperty {
42 | return (__bridge NSString *)kCGImagePropertyGIFUnclampedDelayTime;
43 | }
44 |
45 | + (NSString *)delayTimeProperty {
46 | return (__bridge NSString *)kCGImagePropertyGIFDelayTime;
47 | }
48 |
49 | + (NSString *)loopCountProperty {
50 | return (__bridge NSString *)kCGImagePropertyGIFLoopCount;
51 | }
52 |
53 | + (NSUInteger)defaultLoopCount {
54 | return 1;
55 | }
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+MemoryCacheCost.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "UIImage+MemoryCacheCost.h"
10 | #import "objc/runtime.h"
11 | #import "NSImage+Compatibility.h"
12 |
13 | FOUNDATION_STATIC_INLINE NSUInteger SDMemoryCacheCostForImage(UIImage *image) {
14 | CGImageRef imageRef = image.CGImage;
15 | if (!imageRef) {
16 | return 0;
17 | }
18 | NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);
19 | NSUInteger frameCount;
20 | #if SD_MAC
21 | frameCount = 1;
22 | #elif SD_UIKIT || SD_WATCH
23 | frameCount = image.images.count > 0 ? image.images.count : 1;
24 | #endif
25 | NSUInteger cost = bytesPerFrame * frameCount;
26 | return cost;
27 | }
28 |
29 | @implementation UIImage (MemoryCacheCost)
30 |
31 | - (NSUInteger)sd_memoryCost {
32 | NSNumber *value = objc_getAssociatedObject(self, @selector(sd_memoryCost));
33 | NSUInteger memoryCost;
34 | if (value != nil) {
35 | memoryCost = [value unsignedIntegerValue];
36 | } else {
37 | memoryCost = SDMemoryCacheCostForImage(self);
38 | }
39 | return memoryCost;
40 | }
41 |
42 | - (void)setSd_memoryCost:(NSUInteger)sd_memoryCost {
43 | objc_setAssociatedObject(self, @selector(sd_memoryCost), @(sd_memoryCost), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+ForceDecode.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | /**
12 | UIImage category about force decode feature (avoid Image/IO's lazy decoding during rendering behavior).
13 | */
14 | @interface UIImage (ForceDecode)
15 |
16 | /**
17 | A bool value indicating whether the image has already been decoded. This can help to avoid extra force decode.
18 | */
19 | @property (nonatomic, assign) BOOL sd_isDecoded;
20 |
21 | /**
22 | Decode the provided image. This is useful if you want to force decode the image before rendering to improve performance.
23 |
24 | @param image The image to be decoded
25 | @return The decoded image
26 | */
27 | + (nullable UIImage *)sd_decodedImageWithImage:(nullable UIImage *)image;
28 |
29 | /**
30 | Decode and scale down the provided image
31 |
32 | @param image The image to be decoded
33 | @return The decoded and scaled down image
34 | */
35 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image;
36 |
37 | /**
38 | Decode and scale down the provided image with limit bytes
39 |
40 | @param image The image to be decoded
41 | @param bytes The limit bytes size. Provide 0 to use the build-in limit.
42 | @return The decoded and scaled down image
43 | */
44 | + (nullable UIImage *)sd_decodedAndScaledDownImageWithImage:(nullable UIImage *)image limitBytes:(NSUInteger)bytes;
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/SDWebImage Demo-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | ${PRODUCT_NAME}
9 | CFBundleExecutable
10 | ${EXECUTABLE_NAME}
11 | CFBundleIcons
12 |
13 | CFBundleIcons~ipad
14 |
15 | CFBundleIdentifier
16 | $(PRODUCT_BUNDLE_IDENTIFIER)
17 | CFBundleInfoDictionaryVersion
18 | 6.0
19 | CFBundleName
20 | ${PRODUCT_NAME}
21 | CFBundlePackageType
22 | APPL
23 | CFBundleShortVersionString
24 | 1.0
25 | CFBundleSignature
26 | ????
27 | CFBundleVersion
28 | 1
29 | LSRequiresIPhoneOS
30 |
31 | NSAppTransportSecurity
32 |
33 | NSAllowsArbitraryLoads
34 |
35 |
36 | UILaunchStoryboardName
37 | LaunchScreen
38 | UIRequiredDeviceCapabilities
39 |
40 | armv7
41 |
42 | UISupportedInterfaceOrientations
43 |
44 | UIInterfaceOrientationPortrait
45 | UIInterfaceOrientationLandscapeLeft
46 | UIInterfaceOrientationLandscapeRight
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSURLRequest * _Nonnull request);
13 |
14 | /**
15 | This is the protocol for downloader request modifier.
16 | We can use a block to specify the downloader request modifier. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageDownloaderRequestModifier
19 |
20 | /// Modify the original URL request and return a new one instead. You can modify the HTTP header, cachePolicy, etc for this URL.
21 | /// @param request The original URL request for image loading
22 | /// @note If return nil, the URL request will be cancelled.
23 | - (nullable NSURLRequest *)modifiedRequestWithRequest:(nonnull NSURLRequest *)request;
24 |
25 | @end
26 |
27 | /**
28 | A downloader request modifier class with block.
29 | */
30 | @interface SDWebImageDownloaderRequestModifier : NSObject
31 |
32 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
33 | + (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | use_frameworks!
2 |
3 | def all_example_pods
4 | pod 'SDWebImage/MapKit', :path => './'
5 | pod 'SDWebImageWebPCoder', :git => 'https://github.com/SDWebImage/SDWebImageWebPCoder.git', :branch => 'master'
6 | end
7 |
8 | def watch_example_pods
9 | pod 'SDWebImage/Core', :path => './'
10 | pod 'SDWebImageWebPCoder', :git => 'https://github.com/SDWebImage/SDWebImageWebPCoder.git', :branch => 'master'
11 | end
12 |
13 | def all_test_pods
14 | pod 'SDWebImage/MapKit', :path => './'
15 | pod 'Expecta'
16 | pod 'KVOController'
17 | end
18 |
19 | example_project_path = 'Examples/SDWebImage Demo'
20 | test_project_path = 'Tests/SDWebImage Tests'
21 | workspace 'SDWebImage.xcworkspace'
22 |
23 | # Example Project
24 | target 'SDWebImage iOS Demo' do
25 | project example_project_path
26 | platform :ios, '8.0'
27 | all_example_pods
28 | end
29 |
30 | target 'SDWebImage OSX Demo' do
31 | project example_project_path
32 | platform :osx, '10.10'
33 | all_example_pods
34 | end
35 |
36 | target 'SDWebImage TV Demo' do
37 | project example_project_path
38 | platform :tvos, '9.2'
39 | all_example_pods
40 | end
41 |
42 | target 'SDWebImage Watch Demo Extension' do
43 | project example_project_path
44 | platform :watchos, '2.0'
45 | watch_example_pods
46 | end
47 |
48 | # Test Project
49 | target 'Tests iOS' do
50 | project test_project_path
51 | platform :ios, '8.0'
52 | all_test_pods
53 | end
54 |
55 | target 'Tests Mac' do
56 | project test_project_path
57 | platform :osx, '10.10'
58 | all_test_pods
59 | end
60 |
61 | target 'Tests TV' do
62 | project test_project_path
63 | platform :tvos, '9.2'
64 | all_test_pods
65 | end
66 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/en.lproj/MasterViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderConfig.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageDownloaderConfig.h"
10 |
11 | static SDWebImageDownloaderConfig * _defaultDownloaderConfig;
12 |
13 | @implementation SDWebImageDownloaderConfig
14 |
15 | + (SDWebImageDownloaderConfig *)defaultDownloaderConfig {
16 | static dispatch_once_t onceToken;
17 | dispatch_once(&onceToken, ^{
18 | _defaultDownloaderConfig = [SDWebImageDownloaderConfig new];
19 | });
20 | return _defaultDownloaderConfig;
21 | }
22 |
23 | - (instancetype)init {
24 | self = [super init];
25 | if (self) {
26 | _maxConcurrentDownloads = 6;
27 | _downloadTimeout = 15.0;
28 | _executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
29 | }
30 | return self;
31 | }
32 |
33 | - (id)copyWithZone:(NSZone *)zone {
34 | SDWebImageDownloaderConfig *config = [[[self class] allocWithZone:zone] init];
35 | config.maxConcurrentDownloads = self.maxConcurrentDownloads;
36 | config.downloadTimeout = self.downloadTimeout;
37 | config.minimumProgressInterval = self.minimumProgressInterval;
38 | config.sessionConfiguration = [self.sessionConfiguration copyWithZone:zone];
39 | config.operationClass = self.operationClass;
40 | config.executionOrder = self.executionOrder;
41 | config.urlCredential = self.urlCredential;
42 | config.username = self.username;
43 | config.password = self.password;
44 |
45 | return config;
46 | }
47 |
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/DetailViewController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "DetailViewController.h"
10 | #import
11 |
12 | @interface DetailViewController ()
13 |
14 | @property (strong, nonatomic) IBOutlet SDAnimatedImageView *imageView;
15 |
16 | @end
17 |
18 | @implementation DetailViewController
19 |
20 | - (void)configureView {
21 | if (!self.imageView.sd_imageIndicator) {
22 | self.imageView.sd_imageIndicator = SDWebImageProgressIndicator.defaultIndicator;
23 | }
24 | [self.imageView sd_setImageWithURL:self.imageURL
25 | placeholderImage:nil
26 | options:SDWebImageProgressiveLoad];
27 | self.imageView.shouldCustomLoopCount = YES;
28 | self.imageView.animationRepeatCount = 0;
29 | }
30 |
31 | - (void)viewDidLoad {
32 | [super viewDidLoad];
33 | [self configureView];
34 | self.navigationItem.rightBarButtonItem = [UIBarButtonItem.alloc initWithTitle:@"Toggle Animation"
35 | style:UIBarButtonItemStylePlain
36 | target:self
37 | action:@selector(toggleAnimation:)];
38 | }
39 |
40 | - (void)toggleAnimation:(UIResponder *)sender {
41 | self.imageView.isAnimating ? [self.imageView stopAnimating] : [self.imageView startAnimating];
42 | }
43 |
44 | @end
45 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSURLResponse * _Nullable (^SDWebImageDownloaderResponseModifierBlock)(NSURLResponse * _Nonnull response);
13 |
14 | /**
15 | This is the protocol for downloader response modifier.
16 | We can use a block to specify the downloader response modifier. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageDownloaderResponseModifier
19 |
20 | /// Modify the original URL response and return a new response. You can use this to check MIME-Type, mock server response, etc.
21 | /// @param response The original URL response, note for HTTP request it's actually a `NSHTTPURLResponse` instance
22 | /// @note If nil is returned, the image download will marked as cancelled with error `SDWebImageErrorInvalidDownloadResponse`
23 | - (nullable NSURLResponse *)modifiedResponseWithResponse:(nonnull NSURLResponse *)response;
24 |
25 | @end
26 |
27 | /**
28 | A downloader response modifier class with block.
29 | */
30 | @interface SDWebImageDownloaderResponseModifier : NSObject
31 |
32 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
33 | + (nonnull instancetype)responseModifierWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/ViewController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "ViewController.h"
10 | #import
11 | #import
12 |
13 | @interface ViewController ()
14 |
15 | @property (weak, nonatomic) IBOutlet UIImageView *imageView1;
16 | @property (weak, nonatomic) IBOutlet UIImageView *imageView2;
17 | @property (weak, nonatomic) IBOutlet SDAnimatedImageView *imageView3;
18 | @property (weak, nonatomic) IBOutlet SDAnimatedImageView *imageView4;
19 |
20 | @end
21 |
22 |
23 | @implementation ViewController
24 |
25 | - (void)viewDidLoad {
26 | [super viewDidLoad];
27 | // Do any additional setup after loading the view, typically from a nib.
28 | [[SDImageCodersManager sharedManager] addCoder:[SDImageWebPCoder sharedCoder]];
29 |
30 | [self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic"]];
31 | [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]];
32 | [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif"]];
33 | [self.imageView4 sd_setImageWithURL:[NSURL URLWithString:@"http://littlesvr.ca/apng/images/SteamEngine.webp"]];
34 | }
35 |
36 | - (void)didReceiveMemoryWarning {
37 | [super didReceiveMemoryWarning];
38 | // Dispose of any resources that can be recreated.
39 | }
40 |
41 | @end
42 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageOptionsProcessor.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageOptionsProcessor.h"
10 |
11 | @interface SDWebImageOptionsResult ()
12 |
13 | @property (nonatomic, assign) SDWebImageOptions options;
14 | @property (nonatomic, copy, nullable) SDWebImageContext *context;
15 |
16 | @end
17 |
18 | @implementation SDWebImageOptionsResult
19 |
20 | - (instancetype)initWithOptions:(SDWebImageOptions)options context:(SDWebImageContext *)context {
21 | self = [super init];
22 | if (self) {
23 | self.options = options;
24 | self.context = context;
25 | }
26 | return self;
27 | }
28 |
29 | @end
30 |
31 | @interface SDWebImageOptionsProcessor ()
32 |
33 | @property (nonatomic, copy, nonnull) SDWebImageOptionsProcessorBlock block;
34 |
35 | @end
36 |
37 | @implementation SDWebImageOptionsProcessor
38 |
39 | - (instancetype)initWithBlock:(SDWebImageOptionsProcessorBlock)block {
40 | self = [super init];
41 | if (self) {
42 | self.block = block;
43 | }
44 | return self;
45 | }
46 |
47 | + (instancetype)optionsProcessorWithBlock:(SDWebImageOptionsProcessorBlock)block {
48 | SDWebImageOptionsProcessor *optionsProcessor = [[SDWebImageOptionsProcessor alloc] initWithBlock:block];
49 | return optionsProcessor;
50 | }
51 |
52 | - (SDWebImageOptionsResult *)processedResultForURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context {
53 | if (!self.block) {
54 | return nil;
55 | }
56 | return self.block(url, options, context);
57 | }
58 |
59 | @end
60 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIView+WebCacheOperation.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 | #import "SDWebImageOperation.h"
11 |
12 | /**
13 | These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external.
14 | All the stored operations are weak, so it will be dalloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them.
15 | */
16 | @interface UIView (WebCacheOperation)
17 |
18 | /**
19 | * Get the image load operation for key
20 | *
21 | * @param key key for identifying the operations
22 | * @return the image load operation
23 | */
24 | - (nullable id)sd_imageLoadOperationForKey:(nullable NSString *)key;
25 |
26 | /**
27 | * Set the image load operation (storage in a UIView based weak map table)
28 | *
29 | * @param operation the operation
30 | * @param key key for storing the operation
31 | */
32 | - (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key;
33 |
34 | /**
35 | * Cancel all operations for the current UIView and key
36 | *
37 | * @param key key for identifying the operations
38 | */
39 | - (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key;
40 |
41 | /**
42 | * Just remove the operations corresponding to the current UIView and key without cancelling them
43 | *
44 | * @param key key for identifying the operations
45 | */
46 | - (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key;
47 |
48 | @end
49 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageError.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageCompat.h"
11 |
12 | FOUNDATION_EXPORT NSErrorDomain const _Nonnull SDWebImageErrorDomain;
13 |
14 | /// The HTTP status code for invalid download response (NSNumber *)
15 | FOUNDATION_EXPORT NSErrorUserInfoKey const _Nonnull SDWebImageErrorDownloadStatusCodeKey;
16 |
17 | /// SDWebImage error domain and codes
18 | typedef NS_ERROR_ENUM(SDWebImageErrorDomain, SDWebImageError) {
19 | SDWebImageErrorInvalidURL = 1000, // The URL is invalid, such as nil URL or corrupted URL
20 | SDWebImageErrorBadImageData = 1001, // The image data can not be decoded to image, or the image data is empty
21 | SDWebImageErrorCacheNotModified = 1002, // The remote location specify that the cached image is not modified, such as the HTTP response 304 code. It's useful for `SDWebImageRefreshCached`
22 | SDWebImageErrorInvalidDownloadOperation = 2000, // The image download operation is invalid, such as nil operation or unexpected error occur when operation initialized
23 | SDWebImageErrorInvalidDownloadStatusCode = 2001, // The image download response a invalid status code. You can check the status code in error's userInfo under `SDWebImageErrorDownloadStatusCodeKey`
24 | SDWebImageErrorCancelled = 2002, // The image loading operation is cancelled before finished, during either async disk cache query, or waiting before actual network request. For actual network request error, check `NSURLErrorDomain` error domain and code.
25 | SDWebImageErrorInvalidDownloadResponse = 2003, // When using response modifier, the modified download response is nil and marked as cancelled.
26 | };
27 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestCoder.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageTestCoder.h"
11 |
12 | @implementation SDWebImageTestCoder
13 |
14 | - (BOOL)canDecodeFromData:(nullable NSData *)data {
15 | return YES;
16 | }
17 |
18 | - (BOOL)canEncodeToFormat:(SDImageFormat)format {
19 | return YES;
20 | }
21 |
22 | - (UIImage *)decodedImageWithData:(NSData *)data options:(nullable SDImageCoderOptions *)options {
23 | NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"jpg"];
24 | UIImage *image = [[UIImage alloc] initWithContentsOfFile:testImagePath];
25 | return image;
26 | }
27 |
28 | - (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)options
29 | {
30 | self = [super init];
31 | if (self) {
32 | }
33 | return self;
34 | }
35 |
36 | - (void)updateIncrementalData:(NSData *)data finished:(BOOL)finished {
37 | return;
38 | }
39 |
40 | - (UIImage *)incrementalDecodedImageWithOptions:(SDImageCoderOptions *)options {
41 | NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"gif"];
42 | UIImage *image = [[UIImage alloc] initWithContentsOfFile:testImagePath];
43 | return image;
44 | }
45 |
46 | - (BOOL)canIncrementalDecodeFromData:(NSData *)data {
47 | return YES;
48 | }
49 |
50 | - (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format options:(nullable SDImageCoderOptions *)options {
51 | NSString *testString = @"TestEncode";
52 | NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
53 | return data;
54 | }
55 |
56 | @end
57 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderDecryptor.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageDownloaderDecryptor.h"
10 |
11 | @interface SDWebImageDownloaderDecryptor ()
12 |
13 | @property (nonatomic, copy, nonnull) SDWebImageDownloaderDecryptorBlock block;
14 |
15 | @end
16 |
17 | @implementation SDWebImageDownloaderDecryptor
18 |
19 | - (instancetype)initWithBlock:(SDWebImageDownloaderDecryptorBlock)block {
20 | self = [super init];
21 | if (self) {
22 | self.block = block;
23 | }
24 | return self;
25 | }
26 |
27 | + (instancetype)decryptorWithBlock:(SDWebImageDownloaderDecryptorBlock)block {
28 | SDWebImageDownloaderDecryptor *decryptor = [[SDWebImageDownloaderDecryptor alloc] initWithBlock:block];
29 | return decryptor;
30 | }
31 |
32 | - (nullable NSData *)decryptedDataWithData:(nonnull NSData *)data response:(nullable NSURLResponse *)response {
33 | if (!self.block) {
34 | return nil;
35 | }
36 | return self.block(data, response);
37 | }
38 |
39 | @end
40 |
41 | @implementation SDWebImageDownloaderDecryptor (Conveniences)
42 |
43 | + (SDWebImageDownloaderDecryptor *)base64Decryptor {
44 | static SDWebImageDownloaderDecryptor *decryptor;
45 | static dispatch_once_t onceToken;
46 | dispatch_once(&onceToken, ^{
47 | decryptor = [SDWebImageDownloaderDecryptor decryptorWithBlock:^NSData * _Nullable(NSData * _Nonnull data, NSURLResponse * _Nullable response) {
48 | NSData *modifiedData = [[NSData alloc] initWithBase64EncodedData:data options:NSDataBase64DecodingIgnoreUnknownCharacters];
49 | return modifiedData;
50 | }];
51 | });
52 | return decryptor;
53 | }
54 |
55 | @end
56 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDInternalMacros.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDmetamacros.h"
11 |
12 | #ifndef SD_LOCK
13 | #define SD_LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
14 | #endif
15 |
16 | #ifndef SD_UNLOCK
17 | #define SD_UNLOCK(lock) dispatch_semaphore_signal(lock);
18 | #endif
19 |
20 | #ifndef SD_OPTIONS_CONTAINS
21 | #define SD_OPTIONS_CONTAINS(options, value) (((options) & (value)) == (value))
22 | #endif
23 |
24 | #ifndef weakify
25 | #define weakify(...) \
26 | sd_keywordify \
27 | metamacro_foreach_cxt(sd_weakify_,, __weak, __VA_ARGS__)
28 | #endif
29 |
30 | #ifndef strongify
31 | #define strongify(...) \
32 | sd_keywordify \
33 | _Pragma("clang diagnostic push") \
34 | _Pragma("clang diagnostic ignored \"-Wshadow\"") \
35 | metamacro_foreach(sd_strongify_,, __VA_ARGS__) \
36 | _Pragma("clang diagnostic pop")
37 | #endif
38 |
39 | #define sd_weakify_(INDEX, CONTEXT, VAR) \
40 | CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR);
41 |
42 | #define sd_strongify_(INDEX, VAR) \
43 | __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_);
44 |
45 | #if DEBUG
46 | #define sd_keywordify autoreleasepool {}
47 | #else
48 | #define sd_keywordify try {} @catch (...) {}
49 | #endif
50 |
51 | #ifndef onExit
52 | #define onExit \
53 | sd_keywordify \
54 | __strong sd_cleanupBlock_t metamacro_concat(sd_exitBlock_, __LINE__) __attribute__((cleanup(sd_executeCleanupBlock), unused)) = ^
55 | #endif
56 |
57 | typedef void (^sd_cleanupBlock_t)(void);
58 |
59 | #if defined(__cplusplus)
60 | extern "C" {
61 | #endif
62 | void sd_executeCleanupBlock (__strong sd_cleanupBlock_t *block);
63 | #if defined(__cplusplus)
64 | }
65 | #endif
66 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDAsyncBlockOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDAsyncBlockOperation.h"
10 |
11 | @interface SDAsyncBlockOperation ()
12 |
13 | @property (assign, nonatomic, getter = isExecuting) BOOL executing;
14 | @property (assign, nonatomic, getter = isFinished) BOOL finished;
15 | @property (nonatomic, copy, nonnull) SDAsyncBlock executionBlock;
16 |
17 | @end
18 |
19 | @implementation SDAsyncBlockOperation
20 |
21 | @synthesize executing = _executing;
22 | @synthesize finished = _finished;
23 |
24 | - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block {
25 | self = [super init];
26 | if (self) {
27 | self.executionBlock = block;
28 | }
29 | return self;
30 | }
31 |
32 | + (nonnull instancetype)blockOperationWithBlock:(nonnull SDAsyncBlock)block {
33 | SDAsyncBlockOperation *operation = [[SDAsyncBlockOperation alloc] initWithBlock:block];
34 | return operation;
35 | }
36 |
37 | - (void)start {
38 | if (self.isCancelled) {
39 | return;
40 | }
41 |
42 | [self willChangeValueForKey:@"isExecuting"];
43 | self.executing = YES;
44 | [self didChangeValueForKey:@"isExecuting"];
45 |
46 | if (self.executionBlock) {
47 | self.executionBlock(self);
48 | } else {
49 | [self complete];
50 | }
51 | }
52 |
53 | - (void)cancel {
54 | [super cancel];
55 | [self complete];
56 | }
57 |
58 | - (void)complete {
59 | [self willChangeValueForKey:@"isExecuting"];
60 | [self willChangeValueForKey:@"isFinished"];
61 | self.executing = NO;
62 | self.finished = YES;
63 | [self didChangeValueForKey:@"isExecuting"];
64 | [self didChangeValueForKey:@"isFinished"];
65 | }
66 |
67 | @end
68 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "24x24",
5 | "idiom" : "watch",
6 | "scale" : "2x",
7 | "role" : "notificationCenter",
8 | "subtype" : "38mm"
9 | },
10 | {
11 | "size" : "27.5x27.5",
12 | "idiom" : "watch",
13 | "scale" : "2x",
14 | "role" : "notificationCenter",
15 | "subtype" : "42mm"
16 | },
17 | {
18 | "size" : "29x29",
19 | "idiom" : "watch",
20 | "role" : "companionSettings",
21 | "scale" : "2x"
22 | },
23 | {
24 | "size" : "29x29",
25 | "idiom" : "watch",
26 | "role" : "companionSettings",
27 | "scale" : "3x"
28 | },
29 | {
30 | "size" : "40x40",
31 | "idiom" : "watch",
32 | "scale" : "2x",
33 | "role" : "appLauncher",
34 | "subtype" : "38mm"
35 | },
36 | {
37 | "size" : "44x44",
38 | "idiom" : "watch",
39 | "scale" : "2x",
40 | "role" : "appLauncher",
41 | "subtype" : "40mm"
42 | },
43 | {
44 | "size" : "50x50",
45 | "idiom" : "watch",
46 | "scale" : "2x",
47 | "role" : "appLauncher",
48 | "subtype" : "44mm"
49 | },
50 | {
51 | "size" : "86x86",
52 | "idiom" : "watch",
53 | "scale" : "2x",
54 | "role" : "quickLook",
55 | "subtype" : "38mm"
56 | },
57 | {
58 | "size" : "98x98",
59 | "idiom" : "watch",
60 | "scale" : "2x",
61 | "role" : "quickLook",
62 | "subtype" : "42mm"
63 | },
64 | {
65 | "size" : "108x108",
66 | "idiom" : "watch",
67 | "scale" : "2x",
68 | "role" : "quickLook",
69 | "subtype" : "44mm"
70 | },
71 | {
72 | "idiom" : "watch-marketing",
73 | "size" : "1024x1024",
74 | "scale" : "1x"
75 | }
76 | ],
77 | "info" : {
78 | "version" : 1,
79 | "author" : "xcode"
80 | }
81 | }
--------------------------------------------------------------------------------
/SDWebImage/Private/SDWeakProxy.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWeakProxy.h"
10 |
11 | @implementation SDWeakProxy
12 |
13 | - (instancetype)initWithTarget:(id)target {
14 | _target = target;
15 | return self;
16 | }
17 |
18 | + (instancetype)proxyWithTarget:(id)target {
19 | return [[SDWeakProxy alloc] initWithTarget:target];
20 | }
21 |
22 | - (id)forwardingTargetForSelector:(SEL)selector {
23 | return _target;
24 | }
25 |
26 | - (void)forwardInvocation:(NSInvocation *)invocation {
27 | void *null = NULL;
28 | [invocation setReturnValue:&null];
29 | }
30 |
31 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
32 | return [NSObject instanceMethodSignatureForSelector:@selector(init)];
33 | }
34 |
35 | - (BOOL)respondsToSelector:(SEL)aSelector {
36 | return [_target respondsToSelector:aSelector];
37 | }
38 |
39 | - (BOOL)isEqual:(id)object {
40 | return [_target isEqual:object];
41 | }
42 |
43 | - (NSUInteger)hash {
44 | return [_target hash];
45 | }
46 |
47 | - (Class)superclass {
48 | return [_target superclass];
49 | }
50 |
51 | - (Class)class {
52 | return [_target class];
53 | }
54 |
55 | - (BOOL)isKindOfClass:(Class)aClass {
56 | return [_target isKindOfClass:aClass];
57 | }
58 |
59 | - (BOOL)isMemberOfClass:(Class)aClass {
60 | return [_target isMemberOfClass:aClass];
61 | }
62 |
63 | - (BOOL)conformsToProtocol:(Protocol *)aProtocol {
64 | return [_target conformsToProtocol:aProtocol];
65 | }
66 |
67 | - (BOOL)isProxy {
68 | return YES;
69 | }
70 |
71 | - (NSString *)description {
72 | return [_target description];
73 | }
74 |
75 | - (NSString *)debugDescription {
76 | return [_target debugDescription];
77 | }
78 |
79 | @end
80 |
--------------------------------------------------------------------------------
/SDWebImage/Private/NSBezierPath+RoundedCorners.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "NSBezierPath+RoundedCorners.h"
10 |
11 | #if SD_MAC
12 |
13 | @implementation NSBezierPath (RoundedCorners)
14 |
15 | + (instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius {
16 | NSBezierPath *path = [NSBezierPath bezierPath];
17 |
18 | CGFloat maxCorner = MIN(NSWidth(rect), NSHeight(rect)) / 2;
19 |
20 | CGFloat topLeftRadius = MIN(maxCorner, (corners & SDRectCornerTopLeft) ? cornerRadius : 0);
21 | CGFloat topRightRadius = MIN(maxCorner, (corners & SDRectCornerTopRight) ? cornerRadius : 0);
22 | CGFloat bottomLeftRadius = MIN(maxCorner, (corners & SDRectCornerBottomLeft) ? cornerRadius : 0);
23 | CGFloat bottomRightRadius = MIN(maxCorner, (corners & SDRectCornerBottomRight) ? cornerRadius : 0);
24 |
25 | NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect));
26 | NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect));
27 | NSPoint bottomLeft = NSMakePoint(NSMinX(rect), NSMinY(rect));
28 | NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect));
29 |
30 | [path moveToPoint:NSMakePoint(NSMidX(rect), NSMaxY(rect))];
31 | [path appendBezierPathWithArcFromPoint:topLeft toPoint:bottomLeft radius:topLeftRadius];
32 | [path appendBezierPathWithArcFromPoint:bottomLeft toPoint:bottomRight radius:bottomLeftRadius];
33 | [path appendBezierPathWithArcFromPoint:bottomRight toPoint:topRight radius:bottomRightRadius];
34 | [path appendBezierPathWithArcFromPoint:topRight toPoint:topLeft radius:topRightRadius];
35 | [path closePath];
36 |
37 | return path;
38 | }
39 |
40 | @end
41 |
42 | #endif
43 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/en.lproj/DetailViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.0
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "SDWebImage",
8 | platforms: [
9 | .macOS(.v10_10),
10 | .iOS(.v8),
11 | .tvOS(.v9),
12 | .watchOS(.v2)
13 | ],
14 | products: [
15 | // Products define the executables and libraries produced by a package, and make them visible to other packages.
16 | .library(
17 | name: "SDWebImage",
18 | targets: ["SDWebImage"]),
19 | .library(
20 | name: "SDWebImageMapKit",
21 | targets: ["SDWebImageMapKit"])
22 | ],
23 | dependencies: [
24 | // Dependencies declare other packages that this package depends on.
25 | // .package(url: /* package url */, from: "1.0.0"),
26 | ],
27 | targets: [
28 | // Targets are the basic building blocks of a package. A target can define a module or a test suite.
29 | // Targets can depend on other targets in this package, and on products in packages which this package depends on.
30 | .target(
31 | name: "SDWebImage",
32 | dependencies: [],
33 | path: ".",
34 | sources: ["SDWebImage/Core", "SDWebImage/Private"],
35 | publicHeadersPath: "SDWebImage/Core",
36 | cSettings: [
37 | .headerSearchPath("SDWebImage/Core"),
38 | .headerSearchPath("SDWebImage/Private")
39 | ]
40 | ),
41 | .target(
42 | name: "SDWebImageMapKit",
43 | dependencies: ["SDWebImage"],
44 | path: ".",
45 | sources: ["SDWebImage/MapKit"],
46 | publicHeadersPath: "SDWebImage/MapKit",
47 | cSettings: [
48 | .headerSearchPath("SDWebImage/Core"),
49 | .headerSearchPath("SDWebImage/Private")
50 | ]
51 | )
52 | ]
53 | )
54 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Demo/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/SDWebImage.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = 'SDWebImage'
3 | s.version = '5.3.2'
4 |
5 | s.osx.deployment_target = '10.10'
6 | s.ios.deployment_target = '8.0'
7 | s.tvos.deployment_target = '9.0'
8 | s.watchos.deployment_target = '2.0'
9 |
10 | s.license = 'MIT'
11 | s.summary = 'Asynchronous image downloader with cache support with an UIImageView category.'
12 | s.homepage = 'https://github.com/SDWebImage/SDWebImage'
13 | s.author = { 'Olivier Poitrey' => 'rs@dailymotion.com' }
14 | s.source = { :git => 'https://github.com/SDWebImage/SDWebImage.git', :tag => s.version.to_s }
15 |
16 | s.description = 'This library provides a category for UIImageView with support for remote ' \
17 | 'images coming from the web. It provides an UIImageView category adding web ' \
18 | 'image and cache management to the Cocoa Touch framework, an asynchronous ' \
19 | 'image downloader, an asynchronous memory + disk image caching with automatic ' \
20 | 'cache expiration handling, a guarantee that the same URL won\'t be downloaded ' \
21 | 'several times, a guarantee that bogus URLs won\'t be retried again and again, ' \
22 | 'and performances!'
23 |
24 | s.requires_arc = true
25 | s.framework = 'ImageIO'
26 |
27 | s.default_subspec = 'Core'
28 |
29 | s.pod_target_xcconfig = {
30 | 'SUPPORTS_MACCATALYST' => 'YES',
31 | 'DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER' => 'NO'
32 | }
33 |
34 | s.subspec 'Core' do |core|
35 | core.source_files = 'SDWebImage/Core/*.{h,m}', 'WebImage/SDWebImage.h', 'SDWebImage/Private/*.{h,m}'
36 | core.exclude_files = 'SDWebImage/MapKit/*.{h,m}'
37 | core.private_header_files = 'SDWebImage/Private/*.h'
38 | end
39 |
40 | s.subspec 'MapKit' do |mk|
41 | mk.osx.deployment_target = '10.10'
42 | mk.ios.deployment_target = '8.0'
43 | mk.tvos.deployment_target = '9.2'
44 | mk.source_files = 'SDWebImage/MapKit/*.{h,m}'
45 | mk.framework = 'MapKit'
46 | mk.dependency 'SDWebImage/Core'
47 | end
48 | end
49 |
--------------------------------------------------------------------------------
/SDWebImage/Core/NSData+ImageContentType.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Fabrice Aneche
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 | #import "SDWebImageCompat.h"
12 |
13 | /**
14 | You can use switch case like normal enum. It's also recommended to add a default case. You should not assume anything about the raw value.
15 | For custom coder plugin, it can also extern the enum for supported format. See `SDImageCoder` for more detailed information.
16 | */
17 | typedef NSInteger SDImageFormat NS_TYPED_EXTENSIBLE_ENUM;
18 | static const SDImageFormat SDImageFormatUndefined = -1;
19 | static const SDImageFormat SDImageFormatJPEG = 0;
20 | static const SDImageFormat SDImageFormatPNG = 1;
21 | static const SDImageFormat SDImageFormatGIF = 2;
22 | static const SDImageFormat SDImageFormatTIFF = 3;
23 | static const SDImageFormat SDImageFormatWebP = 4;
24 | static const SDImageFormat SDImageFormatHEIC = 5;
25 | static const SDImageFormat SDImageFormatHEIF = 6;
26 |
27 | /**
28 | NSData category about the image content type and UTI.
29 | */
30 | @interface NSData (ImageContentType)
31 |
32 | /**
33 | * Return image format
34 | *
35 | * @param data the input image data
36 | *
37 | * @return the image format as `SDImageFormat` (enum)
38 | */
39 | + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
40 |
41 | /**
42 | * Convert SDImageFormat to UTType
43 | *
44 | * @param format Format as SDImageFormat
45 | * @return The UTType as CFStringRef
46 | */
47 | + (nonnull CFStringRef)sd_UTTypeFromImageFormat:(SDImageFormat)format CF_RETURNS_NOT_RETAINED NS_SWIFT_NAME(sd_UTType(from:));
48 |
49 | /**
50 | * Convert UTTyppe to SDImageFormat
51 | *
52 | * @param uttype The UTType as CFStringRef
53 | * @return The Format as SDImageFormat
54 | */
55 | + (SDImageFormat)sd_imageFormatFromUTType:(nonnull CFStringRef)uttype;
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+MultiFormat.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "UIImage+MultiFormat.h"
10 | #import "SDImageCodersManager.h"
11 |
12 | @implementation UIImage (MultiFormat)
13 |
14 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data {
15 | return [self sd_imageWithData:data scale:1];
16 | }
17 |
18 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale {
19 | return [self sd_imageWithData:data scale:scale firstFrameOnly:NO];
20 | }
21 |
22 | + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale firstFrameOnly:(BOOL)firstFrameOnly {
23 | if (!data) {
24 | return nil;
25 | }
26 | SDImageCoderOptions *options = @{SDImageCoderDecodeScaleFactor : @(MAX(scale, 1)), SDImageCoderDecodeFirstFrameOnly : @(firstFrameOnly)};
27 | return [[SDImageCodersManager sharedManager] decodedImageWithData:data options:options];
28 | }
29 |
30 | - (nullable NSData *)sd_imageData {
31 | return [self sd_imageDataAsFormat:SDImageFormatUndefined];
32 | }
33 |
34 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat {
35 | return [self sd_imageDataAsFormat:imageFormat compressionQuality:1];
36 | }
37 |
38 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality {
39 | return [self sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:NO];
40 | }
41 |
42 | - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality firstFrameOnly:(BOOL)firstFrameOnly {
43 | SDImageCoderOptions *options = @{SDImageCoderEncodeCompressionQuality : @(compressionQuality), SDImageCoderEncodeFirstFrameOnly : @(firstFrameOnly)};
44 | return [[SDImageCodersManager sharedManager] encodedDataWithImage:self format:imageFormat options:options];
45 | }
46 |
47 | @end
48 |
--------------------------------------------------------------------------------
/SDWebImage/Core/UIImage+Metadata.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 | #import "NSData+ImageContentType.h"
11 |
12 | /**
13 | UIImage category for image metadata, including animation, loop count, format, incremental, etc.
14 | */
15 | @interface UIImage (Metadata)
16 |
17 | /**
18 | * UIKit:
19 | * For static image format, this value is always 0.
20 | * For animated image format, 0 means infinite looping.
21 | * Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods.
22 | * AppKit:
23 | * NSImage currently only support animated via GIF imageRep unlike UIImage.
24 | * The getter of this property will get the loop count from GIF imageRep
25 | * The setter of this property will set the loop count from GIF imageRep
26 | */
27 | @property (nonatomic, assign) NSUInteger sd_imageLoopCount;
28 |
29 | /**
30 | * UIKit:
31 | * Check the `images` array property
32 | * AppKit:
33 | * NSImage currently only support animated via GIF imageRep unlike UIImage. It will check the imageRep's frame count.
34 | */
35 | @property (nonatomic, assign, readonly) BOOL sd_isAnimated;
36 |
37 | /**
38 | * The image format represent the original compressed image data format.
39 | * If you don't manually specify a format, this information is retrieve from CGImage using `CGImageGetUTType`, which may return nil for non-CG based image. At this time it will return `SDImageFormatUndefined` as default value.
40 | * @note Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods.
41 | */
42 | @property (nonatomic, assign) SDImageFormat sd_imageFormat;
43 |
44 | /**
45 | A bool value indicating whether the image is during incremental decoding and may not contains full pixels.
46 | */
47 | @property (nonatomic, assign) BOOL sd_isIncremental;
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageDownloaderDecryptor.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 |
12 | typedef NSData * _Nullable (^SDWebImageDownloaderDecryptorBlock)(NSData * _Nonnull data, NSURLResponse * _Nullable response);
13 |
14 | /**
15 | This is the protocol for downloader decryptor. Which decrypt the original encrypted data before decoding. Note progressive decoding is not compatible for decryptor.
16 | We can use a block to specify the downloader decryptor. But Using protocol can make this extensible, and allow Swift user to use it easily instead of using `@convention(block)` to store a block into context options.
17 | */
18 | @protocol SDWebImageDownloaderDecryptor
19 |
20 | /// Decrypt the original download data and return a new data. You can use this to decrypt the data using your perfereed algorithm.
21 | /// @param data The original download data
22 | /// @param response The URL response for data. If you modifiy the original URL response via response modifier, the modified version will be here. This arg is nullable.
23 | /// @note If nil is returned, the image download will be marked as failed with error `SDWebImageErrorBadImageData`
24 | - (nullable NSData *)decryptedDataWithData:(nonnull NSData *)data response:(nullable NSURLResponse *)response;
25 |
26 | @end
27 |
28 | /**
29 | A downloader response modifier class with block.
30 | */
31 | @interface SDWebImageDownloaderDecryptor : NSObject
32 |
33 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
34 | + (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
35 |
36 | @end
37 |
38 | /// Convenience way to create decryptor for common data encryption.
39 | @interface SDWebImageDownloaderDecryptor (Conveniences)
40 |
41 | /// Base64 Encoded image data decryptor
42 | @property (class, readonly, nonnull) SDWebImageDownloaderDecryptor *base64Decryptor;
43 |
44 | @end
45 |
--------------------------------------------------------------------------------
/Docs/API-Diff/5.0/apidiff.css:
--------------------------------------------------------------------------------
1 | body {
2 | font: 12px 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;
3 | margin: 0;
4 | padding: 0 2em 2em 2em;
5 | }
6 |
7 | h1 {
8 | margin-top: 30px;
9 | margin-bottom: 30px;
10 | font-size: 28px;
11 | font-weight: bold;
12 | }
13 |
14 | .headerFile {
15 | margin-left: 20px;
16 | }
17 |
18 | .headerName {
19 | margin: 15px 0px 10px -20px;
20 | padding: 4px 4px 4px 20px;
21 | font-weight: bold;
22 | font-size: 120%;
23 | background-color: #f8f8f8;
24 | }
25 |
26 | .differenceGroup {
27 | margin-top: 5px;
28 | }
29 |
30 | .difference {
31 | padding-left: 20px;
32 | font-family: Courier, Consolas, monospace;
33 | font-size: 110%;
34 | }
35 |
36 | .status {
37 | font-style: italic;
38 | font-size: 80%;
39 | }
40 |
41 | .removed {
42 | color: red;
43 | }
44 |
45 | .added {
46 | color: blue;
47 | }
48 |
49 | .modified {
50 | color: #080;
51 | }
52 |
53 | .declaration {
54 | font-family: Courier, Consolas, monospace;
55 | }
56 |
57 | table {
58 | border: 1px #888 solid;
59 | padding: 2px;
60 | border-spacing: 0px;
61 | border-collapse: collapse;
62 | margin-left: 40px;
63 | margin-top: 7px;
64 | }
65 |
66 | td, th {
67 | font-size: 10px;
68 | border: 1px #888 solid;
69 | padding:3px 6px;
70 | }
71 |
72 | th {
73 | font-size: 10px;
74 | text-align: center;
75 | background-color: #eee;
76 | }
77 |
78 | td {
79 | font-size: 90%;
80 | text-align: left;
81 | }
82 |
83 | ul {
84 | list-style: disc outside;
85 | margin: 0 0 0 16px;
86 | padding: 0;
87 | }
88 |
89 | li {
90 | margin-top: 7px;
91 | }
92 |
93 | .message {
94 | margin-left: 20px;
95 | font-style: italic;
96 | color: #888;
97 | }
98 |
99 | a:link { color: #18396E; text-decoration: none; }
100 | a:active { color: #18396E; text-decoration: none; }
101 | a:visited { color: #003366; text-decoration: none; }
102 | a:link:hover { color: #18396E; text-decoration: underline; }
103 | a:visited:hover { color: #003366; text-decoration: underline; }
104 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageAPNGCoder.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageAPNGCoder.h"
10 | #if SD_MAC
11 | #import
12 | #else
13 | #import
14 | #endif
15 |
16 | // iOS 8 Image/IO framework binary does not contains these APNG contants, so we define them. Thanks Apple :)
17 | // We can not use runtime @available check for this issue, because it's a global symbol and should be loaded during launch time by dyld. So hack if the min deployment target version < iOS 9.0, whatever it running on iOS 9+ or not.
18 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0)
19 | const CFStringRef kCGImagePropertyAPNGLoopCount = (__bridge CFStringRef)@"LoopCount";
20 | const CFStringRef kCGImagePropertyAPNGDelayTime = (__bridge CFStringRef)@"DelayTime";
21 | const CFStringRef kCGImagePropertyAPNGUnclampedDelayTime = (__bridge CFStringRef)@"UnclampedDelayTime";
22 | #endif
23 |
24 | @implementation SDImageAPNGCoder
25 |
26 | + (instancetype)sharedCoder {
27 | static SDImageAPNGCoder *coder;
28 | static dispatch_once_t onceToken;
29 | dispatch_once(&onceToken, ^{
30 | coder = [[SDImageAPNGCoder alloc] init];
31 | });
32 | return coder;
33 | }
34 |
35 | #pragma mark - Subclass Override
36 |
37 | + (SDImageFormat)imageFormat {
38 | return SDImageFormatPNG;
39 | }
40 |
41 | + (NSString *)imageUTType {
42 | return (__bridge NSString *)kUTTypePNG;
43 | }
44 |
45 | + (NSString *)dictionaryProperty {
46 | return (__bridge NSString *)kCGImagePropertyPNGDictionary;
47 | }
48 |
49 | + (NSString *)unclampedDelayTimeProperty {
50 | return (__bridge NSString *)kCGImagePropertyAPNGUnclampedDelayTime;
51 | }
52 |
53 | + (NSString *)delayTimeProperty {
54 | return (__bridge NSString *)kCGImagePropertyAPNGDelayTime;
55 | }
56 |
57 | + (NSString *)loopCountProperty {
58 | return (__bridge NSString *)kCGImagePropertyAPNGLoopCount;
59 | }
60 |
61 | + (NSUInteger)defaultLoopCount {
62 | return 0;
63 | }
64 |
65 | @end
66 |
--------------------------------------------------------------------------------
/Examples/SDWebImage TV Demo/AppDelegate.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | return YES;
21 | }
22 |
23 | - (void)applicationWillResignActive:(UIApplication *)application {
24 | // 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.
25 | // 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.
26 | }
27 |
28 | - (void)applicationDidEnterBackground:(UIApplication *)application {
29 | // 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.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | }
32 |
33 | - (void)applicationWillEnterForeground:(UIApplication *)application {
34 | // 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.
35 | }
36 |
37 | - (void)applicationDidBecomeActive:(UIApplication *)application {
38 | // 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.
39 | }
40 |
41 | - (void)applicationWillTerminate:(UIApplication *)application {
42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
43 | }
44 |
45 | @end
46 |
--------------------------------------------------------------------------------
/SDWebImage/Private/SDImageCachesManagerOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageCachesManagerOperation.h"
10 | #import "SDInternalMacros.h"
11 |
12 | @implementation SDImageCachesManagerOperation
13 | {
14 | dispatch_semaphore_t _pendingCountLock;
15 | }
16 |
17 | @synthesize executing = _executing;
18 | @synthesize finished = _finished;
19 | @synthesize cancelled = _cancelled;
20 | @synthesize pendingCount = _pendingCount;
21 |
22 | - (instancetype)init {
23 | if (self = [super init]) {
24 | _pendingCountLock = dispatch_semaphore_create(1);
25 | _pendingCount = 0;
26 | }
27 | return self;
28 | }
29 |
30 | - (void)beginWithTotalCount:(NSUInteger)totalCount {
31 | self.executing = YES;
32 | self.finished = NO;
33 | _pendingCount = totalCount;
34 | }
35 |
36 | - (NSUInteger)pendingCount {
37 | SD_LOCK(_pendingCountLock);
38 | NSUInteger pendingCount = _pendingCount;
39 | SD_UNLOCK(_pendingCountLock);
40 | return pendingCount;
41 | }
42 |
43 | - (void)completeOne {
44 | SD_LOCK(_pendingCountLock);
45 | _pendingCount = _pendingCount > 0 ? _pendingCount - 1 : 0;
46 | SD_UNLOCK(_pendingCountLock);
47 | }
48 |
49 | - (void)cancel {
50 | self.cancelled = YES;
51 | [self reset];
52 | }
53 |
54 | - (void)done {
55 | self.finished = YES;
56 | self.executing = NO;
57 | [self reset];
58 | }
59 |
60 | - (void)reset {
61 | SD_LOCK(_pendingCountLock);
62 | _pendingCount = 0;
63 | SD_UNLOCK(_pendingCountLock);
64 | }
65 |
66 | - (void)setFinished:(BOOL)finished {
67 | [self willChangeValueForKey:@"isFinished"];
68 | _finished = finished;
69 | [self didChangeValueForKey:@"isFinished"];
70 | }
71 |
72 | - (void)setExecuting:(BOOL)executing {
73 | [self willChangeValueForKey:@"isExecuting"];
74 | _executing = executing;
75 | [self didChangeValueForKey:@"isExecuting"];
76 | }
77 |
78 | - (void)setCancelled:(BOOL)cancelled {
79 | [self willChangeValueForKey:@"isCancelled"];
80 | _cancelled = cancelled;
81 | [self didChangeValueForKey:@"isCancelled"];
82 | }
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestLoader.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageTestLoader.h"
11 | #import
12 |
13 | @interface NSURLSessionTask (SDWebImageOperation)
14 |
15 | @end
16 |
17 | @implementation SDWebImageTestLoader
18 |
19 | - (BOOL)canRequestImageForURL:(NSURL *)url {
20 | return YES;
21 | }
22 |
23 | - (id)requestImageWithURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
24 | NSURLRequest *request = [NSURLRequest requestWithURL:url];
25 |
26 | NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
27 | if (data) {
28 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
29 | UIImage *image = SDImageLoaderDecodeImageData(data, url, options, context);
30 | if (completedBlock) {
31 | completedBlock(image, data, nil, YES);
32 | }
33 | });
34 | } else {
35 | if (completedBlock) {
36 | completedBlock(nil, nil, error, YES);
37 | }
38 | }
39 | }];
40 | [self.KVOController observe:task keyPath:NSStringFromSelector(@selector(countOfBytesReceived)) options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary * _Nonnull change) {
41 | NSURLSessionTask *sessionTask = object;
42 | NSInteger receivedSize = sessionTask.countOfBytesReceived;
43 | NSInteger expectedSize = sessionTask.countOfBytesExpectedToReceive;
44 | if (progressBlock) {
45 | progressBlock(receivedSize, expectedSize, url);
46 | }
47 | }];
48 | [task resume];
49 |
50 | return task;
51 | }
52 |
53 | - (BOOL)shouldBlockFailedURLWithURL:(NSURL *)url error:(NSError *)error {
54 | return NO;
55 | }
56 |
57 | @end
58 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageCodersManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageCoder.h"
11 |
12 | /**
13 | Global object holding the array of coders, so that we avoid passing them from object to object.
14 | Uses a priority queue behind scenes, which means the latest added coders have the highest priority.
15 | This is done so when encoding/decoding something, we go through the list and ask each coder if they can handle the current data.
16 | That way, users can add their custom coders while preserving our existing prebuilt ones
17 |
18 | Note: the `coders` getter will return the coders in their reversed order
19 | Example:
20 | - by default we internally set coders = `IOCoder`, `GIFCoder`, `APNGCoder`
21 | - calling `coders` will return `@[IOCoder, GIFCoder, APNGCoder]`
22 | - call `[addCoder:[MyCrazyCoder new]]`
23 | - calling `coders` now returns `@[IOCoder, GIFCoder, APNGCoder, MyCrazyCoder]`
24 |
25 | Coders
26 | ------
27 | A coder must conform to the `SDImageCoder` protocol or even to `SDProgressiveImageCoder` if it supports progressive decoding
28 | Conformance is important because that way, they will implement `canDecodeFromData` or `canEncodeToFormat`
29 | Those methods are called on each coder in the array (using the priority order) until one of them returns YES.
30 | That means that coder can decode that data / encode to that format
31 | */
32 | @interface SDImageCodersManager : NSObject
33 |
34 | /**
35 | Returns the global shared coders manager instance.
36 | */
37 | @property (nonatomic, class, readonly, nonnull) SDImageCodersManager *sharedManager;
38 |
39 | /**
40 | All coders in coders manager. The coders array is a priority queue, which means the later added coder will have the highest priority
41 | */
42 | @property (nonatomic, copy, nullable) NSArray> *coders;
43 |
44 | /**
45 | Add a new coder to the end of coders array. Which has the highest priority.
46 |
47 | @param coder coder
48 | */
49 | - (void)addCoder:(nonnull id)coder;
50 |
51 | /**
52 | Remove a coder in the coders array.
53 |
54 | @param coder coder
55 | */
56 | - (void)removeCoder:(nonnull id)coder;
57 |
58 | @end
59 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageCompat.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Jamie Pinkham
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import
11 |
12 | #ifdef __OBJC_GC__
13 | #error SDWebImage does not support Objective-C Garbage Collection
14 | #endif
15 |
16 | // Seems like TARGET_OS_MAC is always defined (on all platforms).
17 | // To determine if we are running on macOS, use TARGET_OS_OSX in Xcode 8
18 | #if TARGET_OS_OSX
19 | #define SD_MAC 1
20 | #else
21 | #define SD_MAC 0
22 | #endif
23 |
24 | // iOS and tvOS are very similar, UIKit exists on both platforms
25 | // Note: watchOS also has UIKit, but it's very limited
26 | #if TARGET_OS_IOS || TARGET_OS_TV
27 | #define SD_UIKIT 1
28 | #else
29 | #define SD_UIKIT 0
30 | #endif
31 |
32 | #if TARGET_OS_IOS
33 | #define SD_IOS 1
34 | #else
35 | #define SD_IOS 0
36 | #endif
37 |
38 | #if TARGET_OS_TV
39 | #define SD_TV 1
40 | #else
41 | #define SD_TV 0
42 | #endif
43 |
44 | #if TARGET_OS_WATCH
45 | #define SD_WATCH 1
46 | #else
47 | #define SD_WATCH 0
48 | #endif
49 |
50 |
51 | #if SD_MAC
52 | #import
53 | #ifndef UIImage
54 | #define UIImage NSImage
55 | #endif
56 | #ifndef UIImageView
57 | #define UIImageView NSImageView
58 | #endif
59 | #ifndef UIView
60 | #define UIView NSView
61 | #endif
62 | #ifndef UIColor
63 | #define UIColor NSColor
64 | #endif
65 | #else
66 | #if SD_UIKIT
67 | #import
68 | #endif
69 | #if SD_WATCH
70 | #import
71 | #ifndef UIView
72 | #define UIView WKInterfaceObject
73 | #endif
74 | #ifndef UIImageView
75 | #define UIImageView WKInterfaceImage
76 | #endif
77 | #endif
78 | #endif
79 |
80 | #ifndef NS_ENUM
81 | #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
82 | #endif
83 |
84 | #ifndef NS_OPTIONS
85 | #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
86 | #endif
87 |
88 | #ifndef dispatch_main_async_safe
89 | #define dispatch_main_async_safe(block)\
90 | if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\
91 | block();\
92 | } else {\
93 | dispatch_async(dispatch_get_main_queue(), block);\
94 | }
95 | #endif
96 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageCacheConfig.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDImageCacheConfig.h"
10 | #import "SDMemoryCache.h"
11 | #import "SDDiskCache.h"
12 |
13 | static SDImageCacheConfig *_defaultCacheConfig;
14 | static const NSInteger kDefaultCacheMaxDiskAge = 60 * 60 * 24 * 7; // 1 week
15 |
16 | @implementation SDImageCacheConfig
17 |
18 | + (SDImageCacheConfig *)defaultCacheConfig {
19 | static dispatch_once_t onceToken;
20 | dispatch_once(&onceToken, ^{
21 | _defaultCacheConfig = [SDImageCacheConfig new];
22 | });
23 | return _defaultCacheConfig;
24 | }
25 |
26 | - (instancetype)init {
27 | if (self = [super init]) {
28 | _shouldDisableiCloud = YES;
29 | _shouldCacheImagesInMemory = YES;
30 | _shouldUseWeakMemoryCache = YES;
31 | _shouldRemoveExpiredDataWhenEnterBackground = YES;
32 | _diskCacheReadingOptions = 0;
33 | _diskCacheWritingOptions = NSDataWritingAtomic;
34 | _maxDiskAge = kDefaultCacheMaxDiskAge;
35 | _maxDiskSize = 0;
36 | _diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate;
37 | _memoryCacheClass = [SDMemoryCache class];
38 | _diskCacheClass = [SDDiskCache class];
39 | }
40 | return self;
41 | }
42 |
43 | - (id)copyWithZone:(NSZone *)zone {
44 | SDImageCacheConfig *config = [[[self class] allocWithZone:zone] init];
45 | config.shouldDisableiCloud = self.shouldDisableiCloud;
46 | config.shouldCacheImagesInMemory = self.shouldCacheImagesInMemory;
47 | config.shouldUseWeakMemoryCache = self.shouldUseWeakMemoryCache;
48 | config.shouldRemoveExpiredDataWhenEnterBackground = self.shouldRemoveExpiredDataWhenEnterBackground;
49 | config.diskCacheReadingOptions = self.diskCacheReadingOptions;
50 | config.diskCacheWritingOptions = self.diskCacheWritingOptions;
51 | config.maxDiskAge = self.maxDiskAge;
52 | config.maxDiskSize = self.maxDiskSize;
53 | config.maxMemoryCost = self.maxMemoryCost;
54 | config.maxMemoryCount = self.maxMemoryCount;
55 | config.diskCacheExpireType = self.diskCacheExpireType;
56 | config.fileManager = self.fileManager; // NSFileManager does not conform to NSCopying, just pass the reference
57 | config.memoryCacheClass = self.memoryCacheClass;
58 | config.diskCacheClass = self.diskCacheClass;
59 |
60 | return config;
61 | }
62 |
63 | @end
64 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageIOAnimatedCoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import
11 | #import "SDImageCoder.h"
12 |
13 | /**
14 | This is the abstract class for all animated coder, which use the Image/IO API. You can not use this directly as real coders. A exception will be raised if you use this class.
15 | All of the properties need the subclass to implment and works as expceted.
16 | For Image/IO, See Apple's documentation: https://developer.apple.com/documentation/imageio
17 | */
18 | @interface SDImageIOAnimatedCoder : NSObject
19 |
20 | #pragma mark - Subclass Override
21 | /**
22 | The supported animated image format. Such as `SDImageFormatGIF`.
23 | @note Subclass override.
24 | */
25 | @property (class, readonly) SDImageFormat imageFormat;
26 | /**
27 | The supported image format UTI Type. Such as `kUTTypeGIF`.
28 | This can be used for cases when we can not detect `SDImageFormat. Such as progressive decoding's hint format `kCGImageSourceTypeIdentifierHint`.
29 | @note Subclass override.
30 | */
31 | @property (class, readonly, nonnull) NSString *imageUTType;
32 | /**
33 | The image container property key used in Image/IO API. Such as `kCGImagePropertyGIFDictionary`.
34 | @note Subclass override.
35 | */
36 | @property (class, readonly, nonnull) NSString *dictionaryProperty;
37 | /**
38 | The image unclamped deply time property key used in Image/IO API. Such as `kCGImagePropertyGIFUnclampedDelayTime`
39 | @note Subclass override.
40 | */
41 | @property (class, readonly, nonnull) NSString *unclampedDelayTimeProperty;
42 | /**
43 | The image delay time property key used in Image/IO API. Such as `kCGImagePropertyGIFDelayTime`.
44 | @note Subclass override.
45 | */
46 | @property (class, readonly, nonnull) NSString *delayTimeProperty;
47 | /**
48 | The image loop count property key used in Image/IO API. Such as `kCGImagePropertyGIFLoopCount`.
49 | @note Subclass override.
50 | */
51 | @property (class, readonly, nonnull) NSString *loopCountProperty;
52 | /**
53 | The default loop count when there are no any loop count information inside image container metadata.
54 | For example, for GIF format, the standard use 1 (play once). For APNG format, the standard use 0 (infinity loop).
55 | @note Subclass override.
56 | */
57 | @property (class, readonly) NSUInteger defaultLoopCount;
58 |
59 | @end
60 |
--------------------------------------------------------------------------------
/Tests/Tests/SDWebImageTestDownloadOperation.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDWebImageTestDownloadOperation.h"
11 |
12 | @interface SDWebImageTestDownloadOperation ()
13 |
14 | @property (nonatomic, strong) NSMutableArray *completedBlocks;
15 |
16 | @end
17 |
18 | @implementation SDWebImageTestDownloadOperation
19 |
20 | @synthesize executing = _executing;
21 | @synthesize finished = _finished;
22 |
23 | - (void)start {
24 | self.finished = NO;
25 | self.executing = YES;
26 | // Do nothing but keep running
27 | }
28 |
29 | - (void)cancel {
30 | if (self.isFinished) return;
31 | [super cancel];
32 |
33 | NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:nil];
34 | for (SDWebImageDownloaderCompletedBlock completedBlock in self.completedBlocks) {
35 | completedBlock(nil, nil, error, YES);
36 | }
37 | }
38 |
39 | - (BOOL)isConcurrent {
40 | return YES;
41 | }
42 |
43 | - (void)setFinished:(BOOL)finished {
44 | [self willChangeValueForKey:@"isFinished"];
45 | _finished = finished;
46 | [self didChangeValueForKey:@"isFinished"];
47 | }
48 |
49 | - (void)setExecuting:(BOOL)executing {
50 | [self willChangeValueForKey:@"isExecuting"];
51 | _executing = executing;
52 | [self didChangeValueForKey:@"isExecuting"];
53 | }
54 |
55 | - (instancetype)initWithRequest:(NSURLRequest *)request inSession:(NSURLSession *)session options:(SDWebImageDownloaderOptions)options {
56 | return [self initWithRequest:request inSession:session options:options context:nil];
57 | }
58 |
59 | - (instancetype)initWithRequest:(NSURLRequest *)request inSession:(NSURLSession *)session options:(SDWebImageDownloaderOptions)options context:(SDWebImageContext *)context {
60 | self = [super init];
61 | if (self) {
62 | self.request = request;
63 | self.completedBlocks = [NSMutableArray array];
64 | }
65 | return self;
66 | }
67 |
68 | - (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
69 | completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock {
70 | if (completedBlock) {
71 | [self.completedBlocks addObject:completedBlock];
72 | }
73 | return NSStringFromClass([self class]);
74 | }
75 |
76 | - (BOOL)cancel:(id)token {
77 | [self cancel];
78 | return YES;
79 | }
80 |
81 | @end
82 |
--------------------------------------------------------------------------------
/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage XCFramework.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
57 |
58 |
59 |
60 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDWebImageOptionsProcessor.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDWebImageCompat.h"
11 | #import "SDWebImageDefine.h"
12 |
13 | @class SDWebImageOptionsResult;
14 |
15 | typedef SDWebImageOptionsResult * _Nullable(^SDWebImageOptionsProcessorBlock)(NSURL * _Nullable url, SDWebImageOptions options, SDWebImageContext * _Nullable context);
16 |
17 | /**
18 | The options result contains both options and context.
19 | */
20 | @interface SDWebImageOptionsResult : NSObject
21 |
22 | /**
23 | WebCache options.
24 | */
25 | @property (nonatomic, assign, readonly) SDWebImageOptions options;
26 |
27 | /**
28 | Context options.
29 | */
30 | @property (nonatomic, copy, readonly, nullable) SDWebImageContext *context;
31 |
32 | /**
33 | Create a new options result.
34 |
35 | @param options options
36 | @param context context
37 | @return The options result contains both options and context.
38 | */
39 | - (nonnull instancetype)initWithOptions:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context;
40 |
41 | @end
42 |
43 | /**
44 | This is the protocol for options processor.
45 | Options processor can be used, to control the final result for individual image request's `SDWebImageOptions` and `SDWebImageContext`
46 | Implements the protocol to have a global control for each indivadual image request's option.
47 | */
48 | @protocol SDWebImageOptionsProcessor
49 |
50 | /**
51 | Return the processed options result for specify image URL, with its options and context
52 |
53 | @param url The URL to the image
54 | @param options A mask to specify options to use for this request
55 | @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
56 | @return The processed result, contains both options and context
57 | */
58 | - (nullable SDWebImageOptionsResult *)processedResultForURL:(nullable NSURL *)url
59 | options:(SDWebImageOptions)options
60 | context:(nullable SDWebImageContext *)context;
61 |
62 | @end
63 |
64 | /**
65 | A options processor class with block.
66 | */
67 | @interface SDWebImageOptionsProcessor : NSObject
68 |
69 | - (nonnull instancetype)initWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
70 | + (nonnull instancetype)optionsProcessorWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
71 |
72 | @end
73 |
--------------------------------------------------------------------------------
/SDWebImage/Core/NSImage+Compatibility.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | #if SD_MAC
12 |
13 | /**
14 | This category is provided to easily write cross-platform(AppKit/UIKit) code. For common usage, see `UIImage+Metadata.h`.
15 | */
16 | @interface NSImage (Compatibility)
17 |
18 | /**
19 | The underlying Core Graphics image object. This will actually use `CGImageForProposedRect` with the image size.
20 | */
21 | @property (nonatomic, readonly, nullable) CGImageRef CGImage;
22 | /**
23 | The scale factor of the image. This wil actually use `bestRepresentationForRect` with image size and pixel size to calculate the scale factor. If failed, use the default value 1.0. Should be greater than or equal to 1.0.
24 | */
25 | @property (nonatomic, readonly) CGFloat scale;
26 |
27 | // These are convenience methods to make AppKit's `NSImage` match UIKit's `UIImage` behavior. The scale factor should be greater than or equal to 1.0.
28 |
29 | /**
30 | Returns an image object with the scale factor and orientation. The representation is created from the Core Graphics image object.
31 | @note The difference between this and `initWithCGImage:size` is that `initWithCGImage:size` will actually create a `NSCGImageSnapshotRep` representation and always use `backingScaleFactor` as scale factor. So we should avoid it and use `NSBitmapImageRep` with `initWithCGImage:` instead.
32 | @note The difference between this and UIKit's `UIImage` equivalent method is the way to process orientation. If the provided image orientation is not equal to Up orientation, this method will firstly rotate the CGImage to the correct orientation to work compatible with `NSImageView`. However, UIKit will not actually rotate CGImage and just store it as `imageOrientation` property.
33 |
34 | @param cgImage A Core Graphics image object
35 | @param scale The image scale factor
36 | @param orientation The orientation of the image data
37 | @return The image object
38 | */
39 | - (nonnull instancetype)initWithCGImage:(nonnull CGImageRef)cgImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation;
40 |
41 | /**
42 | Returns an image object with the scale factor. The representation is created from the image data.
43 | @note The difference between these this and `initWithData:` is that `initWithData:` will always use `backingScaleFactor` as scale factor.
44 |
45 | @param data The image data
46 | @param scale The image scale factor
47 | @return The image object
48 | */
49 | - (nullable instancetype)initWithData:(nonnull NSData *)data scale:(CGFloat)scale;
50 |
51 | @end
52 |
53 | #endif
54 |
--------------------------------------------------------------------------------
/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage static.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
45 |
46 |
52 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
66 |
67 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDMemoryCache.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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 "SDWebImageCompat.h"
10 |
11 | @class SDImageCacheConfig;
12 | /**
13 | A protocol to allow custom memory cache used in SDImageCache.
14 | */
15 | @protocol SDMemoryCache
16 |
17 | @required
18 | /**
19 | Create a new memory cache instance with the specify cache config. You can check `maxMemoryCost` and `maxMemoryCount` used for memory cache.
20 |
21 | @param config The cache config to be used to create the cache.
22 | @return The new memory cache instance.
23 | */
24 | - (nonnull instancetype)initWithConfig:(nonnull SDImageCacheConfig *)config;
25 |
26 | /**
27 | Returns the value associated with a given key.
28 |
29 | @param key An object identifying the value. If nil, just return nil.
30 | @return The value associated with key, or nil if no value is associated with key.
31 | */
32 | - (nullable id)objectForKey:(nonnull id)key;
33 |
34 | /**
35 | Sets the value of the specified key in the cache (0 cost).
36 |
37 | @param object The object to be stored in the cache. If nil, it calls `removeObjectForKey:`.
38 | @param key The key with which to associate the value. If nil, this method has no effect.
39 | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key
40 | objects that are put into it.
41 | */
42 | - (void)setObject:(nullable id)object forKey:(nonnull id)key;
43 |
44 | /**
45 | Sets the value of the specified key in the cache, and associates the key-value
46 | pair with the specified cost.
47 |
48 | @param object The object to store in the cache. If nil, it calls `removeObjectForKey`.
49 | @param key The key with which to associate the value. If nil, this method has no effect.
50 | @param cost The cost with which to associate the key-value pair.
51 | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key
52 | objects that are put into it.
53 | */
54 | - (void)setObject:(nullable id)object forKey:(nonnull id)key cost:(NSUInteger)cost;
55 |
56 | /**
57 | Removes the value of the specified key in the cache.
58 |
59 | @param key The key identifying the value to be removed. If nil, this method has no effect.
60 | */
61 | - (void)removeObjectForKey:(nonnull id)key;
62 |
63 | /**
64 | Empties the cache immediately.
65 | */
66 | - (void)removeAllObjects;
67 |
68 | @end
69 |
70 | /**
71 | A memory cache which auto purge the cache on memory warning and support weak cache.
72 | */
73 | @interface SDMemoryCache : NSCache
74 |
75 | @property (nonatomic, strong, nonnull, readonly) SDImageCacheConfig *config;
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/Tests/Tests/SDCategoriesTests.m:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
4 | * (c) Matt Galloway
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | #import "SDTestCase.h"
11 | #if SD_UIKIT
12 | #import
13 | #endif
14 |
15 | @interface SDCategoriesTests : SDTestCase
16 |
17 | @end
18 |
19 | @implementation SDCategoriesTests
20 |
21 | - (void)test01NSDataImageContentTypeCategory {
22 | // Test invalid image data
23 | SDImageFormat format = [NSData sd_imageFormatForImageData:nil];
24 | expect(format == SDImageFormatUndefined);
25 |
26 | // Test invalid format
27 | CFStringRef type = [NSData sd_UTTypeFromImageFormat:SDImageFormatUndefined];
28 | expect(CFStringCompare(kUTTypePNG, type, 0)).equal(kCFCompareEqualTo);
29 | expect([NSData sd_imageFormatFromUTType:kUTTypeImage]).equal(SDImageFormatUndefined);
30 | }
31 |
32 | - (void)test02UIImageMultiFormatCategory {
33 | // Test invalid image data
34 | UIImage *image = [UIImage sd_imageWithData:nil];
35 | expect(image).to.beNil();
36 | // Test image encode
37 | image = [[UIImage alloc] initWithContentsOfFile:[self testJPEGPath]];
38 | NSData *data = [image sd_imageData];
39 | expect(data).notTo.beNil();
40 | // Test image encode PNG
41 | data = [image sd_imageDataAsFormat:SDImageFormatPNG];
42 | expect(data).notTo.beNil();
43 | // Test image decode PNG
44 | expect([UIImage sd_imageWithData:data scale:1 firstFrameOnly:YES]).notTo.beNil();
45 | // Test image encode JPEG with compressionQuality
46 | NSData *jpegData1 = [image sd_imageDataAsFormat:SDImageFormatJPEG compressionQuality:1];
47 | NSData *jpegData2 = [image sd_imageDataAsFormat:SDImageFormatJPEG compressionQuality:0.5];
48 | expect(jpegData1).notTo.beNil();
49 | expect(jpegData2).notTo.beNil();
50 | expect(jpegData1.length).notTo.equal(jpegData2.length);
51 | }
52 |
53 | - (void)test03UIImageGIFCategory {
54 | // Test invalid image data
55 | UIImage *image = [UIImage sd_imageWithGIFData:nil];
56 | expect(image).to.beNil();
57 | // Test valid image data
58 | NSData *data = [NSData dataWithContentsOfFile:[self testGIFPath]];
59 | image = [UIImage sd_imageWithGIFData:data];
60 | expect(image).notTo.beNil();
61 | expect(image.sd_isAnimated).beTruthy();
62 | }
63 |
64 | #pragma mark - Helper
65 |
66 | - (NSString *)testJPEGPath {
67 | NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
68 | return [testBundle pathForResource:@"TestImage" ofType:@"jpg"];
69 | }
70 |
71 | - (NSString *)testGIFPath {
72 | NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
73 | return [testBundle pathForResource:@"TestImage" ofType:@"gif"];
74 | }
75 |
76 | @end
77 |
--------------------------------------------------------------------------------
/Examples/SDWebImage Watch Demo/Base.lproj/Interface.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
52 |
53 |
59 |
60 |
66 |
67 |
68 |
69 |
71 |
72 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/SDWebImage/Core/SDImageCachesManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of the SDWebImage package.
3 | * (c) Olivier Poitrey
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
10 | #import "SDImageCacheDefine.h"
11 |
12 | /// Policy for cache operation
13 | typedef NS_ENUM(NSUInteger, SDImageCachesManagerOperationPolicy) {
14 | SDImageCachesManagerOperationPolicySerial, // process all caches serially (from the highest priority to the lowest priority cache by order)
15 | SDImageCachesManagerOperationPolicyConcurrent, // process all caches concurrently
16 | SDImageCachesManagerOperationPolicyHighestOnly, // process the highest priority cache only
17 | SDImageCachesManagerOperationPolicyLowestOnly // process the lowest priority cache only
18 | };
19 |
20 | /**
21 | A caches manager to manage multiple caches.
22 | */
23 | @interface SDImageCachesManager : NSObject
24 |
25 | /**
26 | Returns the global shared caches manager instance. By default we will set [`SDImageCache.sharedImageCache`] into the caches array.
27 | */
28 | @property (nonatomic, class, readonly, nonnull) SDImageCachesManager *sharedManager;
29 |
30 | // These are op policy for cache manager.
31 |
32 | /**
33 | Operation policy for query op.
34 | Defaults to `Serial`, means query all caches serially (one completion called then next begin) until one cache query success (`image` != nil).
35 | */
36 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy queryOperationPolicy;
37 |
38 | /**
39 | Operation policy for store op.
40 | Defaults to `HighestOnly`, means store to the highest priority cache only.
41 | */
42 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy storeOperationPolicy;
43 |
44 | /**
45 | Operation policy for remove op.
46 | Defaults to `Concurrent`, means remove all caches concurrently.
47 | */
48 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy removeOperationPolicy;
49 |
50 | /**
51 | Operation policy for contains op.
52 | Defaults to `Serial`, means check all caches serially (one completion called then next begin) until one cache check success (`containsCacheType` != None).
53 | */
54 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy containsOperationPolicy;
55 |
56 | /**
57 | Operation policy for clear op.
58 | Defaults to `Concurrent`, means clear all caches concurrently.
59 | */
60 | @property (nonatomic, assign) SDImageCachesManagerOperationPolicy clearOperationPolicy;
61 |
62 | /**
63 | All caches in caches manager. The caches array is a priority queue, which means the later added cache will have the highest priority
64 | */
65 | @property (nonatomic, copy, nullable) NSArray> *caches;
66 |
67 | /**
68 | Add a new cache to the end of caches array. Which has the highest priority.
69 |
70 | @param cache cache
71 | */
72 | - (void)addCache:(nonnull id)cache;
73 |
74 | /**
75 | Remove a cache in the caches array.
76 |
77 | @param cache cache
78 | */
79 | - (void)removeCache:(nonnull id)cache;
80 |
81 | @end
82 |
--------------------------------------------------------------------------------
/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests TV.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
34 |
40 |
41 |
42 |
43 |
44 |
54 |
55 |
61 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
34 |
40 |
41 |
42 |
43 |
44 |
54 |
55 |
61 |
62 |
63 |
64 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImageMapKit.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
45 |
46 |
52 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
70 |
71 |
72 |
73 |
75 |
76 |
79 |
80 |
81 |
--------------------------------------------------------------------------------