The markdown parsing is broken/disabled for release notes. Sorry about that, I'm chasing the source of a crash that's been bringing this website down for the last couple of days.
See [all tickets marked for the 5.15.5 release](https://github.com/SDWebImage/SDWebImage/milestone/113)
### Fixes
- Protect the disk operation when input key is nil and cause exception #3505 #3504
- Fix the blur effect logic by avoid color convert and always use three box-blur methodology #3506
5.15.4 - Hotfix
4 weeks ago
See [all tickets marked for the 5.15.4 release](https://github.com/SDWebImage/SDWebImage/milestone/112)
### Fixes
- Fix the crash because of wrong usage of NS_NOESCAPE for SDCallbackQueue async block, should matching DispatchQueue #3500
- - This crash only occurs in specified version of clang compiler. But still recommended to update
5.15.3 - Promotion Fix
5 weeks ago
See [all tickets marked for the 5.15.3 release](https://github.com/SDWebImage/SDWebImage/milestone/111)
### Fixes
- Fix the issue when multiple request for same url failed, the completedBlock will callback more times #3497 #3493
- Try to fix the SDAnimatedImageView playback speed issue in Promotion devices (iPhone Pro) #3496 #3491
5.15.2 - Race Condition Fix
6 weeks ago
See [all tickets marked for the 5.15.2 release](https://github.com/SDWebImage/SDWebImage/milestone/110)
### Fixes
- Fix the atomic logic between downloader and operation again #3483
### Warnings
- Code garden to change Objc bool from true/false to YES/NO #3484
5.15.1 - Race Condition Fix
6 weeks ago
See [all tickets marked for the 5.15.1 release](https://github.com/SDWebImage/SDWebImage/milestone/109)
### Fixes
- Ensure the Downloader and DownloaderOperation callback the completion in atomic and never miss one #3477
- - This fix a long-term issue when multiple download request for same URL at the same time, some callbacks will missing. After fix, this will cause a brand new HTTP request but never miss any callbacks.
- Fix the issue the fallback logic of ImageIO Source should avoid passing any UTI hint #3473
- Try to fix the SDAsyncBlockOperation's race condition #3479 #3275
- Avoid compiler generate the wrong property attribute with non-atomic #3474
### Performance
- Remove the unused extra copy for SDAnimatedImage data initializer #3480
5.15.0 - Performance Enhancement
9 weeks ago
See [all tickets marked for the 5.15.0 release](https://github.com/SDWebImage/SDWebImage/milestone/108)
### Features
#### Encoder
- Added encodeWithFrames API for animation encoding in custom coder, better for usage #3469
- - Previously you have to wrap `SDImageFrame` array into temp image object for encoding, this cause wrap/unwrap performance cost (even bad on macOS because it implicit triggers temp GIF encoding). Now you can directly pass it into new `encodedDataWithFrames:` APIs.
#### Decoder
- Update the decode solution to allows CoreGraphics avoid using any UIKit method #3468
#### Cache
- Seperate the SDImageCache encode queue and IO queue to match waitStoreCache behavior #3466
- - Now, the encode process does not block IO queue and query disk cache faster. Previously `SDWebImageWaitStoreCache` is useless when you use transformer or cache serializer. Now you MUST pass this if you want to query disk cache inside completionBlock.
#### Manager/Cache/Loader
- Added context option callbackQueue and SDCallbackQueue wrapper for advanced user to control which queue to callback #3465 #3457
- - If you want SDWebImage callback your completion in current non-main queue, pass `.context[.callbackQueue] = SDCallbackQueue.current`
- Added SDWebImageContextImageEncodeOptions to pass encode options like compression quality to SDImageCache storeImage API #3466
- - The re-encode and store cache logic happens if you use transformer or custom cache serializer, now you can pass the encode options.
5.14.3 - 5.14 Opt
12 weeks ago
See [all tickets marked for the 5.14.3 release](https://github.com/SDWebImage/SDWebImage/milestone/106)
### Performance
- Added ioQueueAttributes to use concurrent or control QoS for image cache internal IO Queue #3460
- When frame timestamp not reached, we should prefetch frame in advance for image render #3452
### Fixes
- Fix the iOS 15+ force-decode hack break Apple's HEIF and JPEG YUV420 optimization #3461
- The poster image should not trigger a frameChange callback #3459
5.14.2 - 5.14 Fix
18 weeks ago
See [all tickets marked for the 5.14.2 release](https://github.com/SDWebImage/SDWebImage/milestone/105)
### Fixes
- Move the `SD_CHECK_CGIMAGE_RETAIN_SOURCE` assertion to SDWebImage Demo and Tests only #3443 #3442 #3441
5.14.1 - 5.14 Crash Fix
19 weeks ago
See [all tickets marked for the 5.14.1 release](https://github.com/SDWebImage/SDWebImage/milestone/104)
### Fixes
- Fix the iOS 12 crash because the underlyingQueue is nil #3434 #3433
- Fix the missing lock for callbackTokens which may cause thread-safe issue #3439 #3438
- Use CoreGraphics to decode PDF instead of ImageIO to solve iOS 16's issue #3436
5.14.0 - Meet DecodeOptions
19 weeks ago
See [all tickets marked for the 5.14.0 release](https://github.com/SDWebImage/SDWebImage/milestone/102)
### Behavior Changes
- Introduce `SDWebImageContextImageDecodeOptions`, deprecate `SDImageCoderWebImageContext` #3421
- - Note the deprecated `SDImageCoderWebImageContext` is no longer used. Update your codebase to use `SDWebImageContextImageDecodeOptions` to pass extra information from manager to coder. Loaded image will also store the same information in `image.sd_decodeOptions`
- Refactor the hack when multiple different thumbnail image requests for same url called at the same time #3423
- - Now the SDWebImageDownloader can callback each thumbnail request for same url with the correct image size as well (previously can't)
- - Now if manager's callback image is thumbnail (`image.sd_isThumbnail == YES`), or transformed (`image.sd_isTransformed == YES`), the callback data will be nil. This because the image does not match downloaded data actually. If you really need original full size data, query the disk cache again using the original key. You may need `SDWebImageWaitStoreCache` options as well. (previously behavior is undefined, may callback with full size data, or encoded small size data, or even nil)
### Features
#### Coder
- Support use url.path or custom UTI hint passed to ImageIO, solve the TIFF/NEF/SRW raw image decoding with wrong size #3419
- - Note from 5.14.0, we may pass the file extension to coder as a UTI hint
- Added `SDImageCoderDecodeUseLazyDecoding` to control whether to use lazy-decoding for ImageIO #3425
- - Note from 5.14.0, by default we enable lazy decoding for static image coder, disable lazy decoding for animated image coder, suitable for most cases. If you want, pass `.decodeUseLazyDecoding = YES` to context option `.imageDecodeOptions`
### Performance
- Introduce new workaround to strip CGImage retained CGImageSource on iOS 15 #3425 #3387
- - Note this also fix the limitation that you can not use lazy-decoding for animated image on iOS 15+. Pass `.decodeUseLazyDecoding = YES` to context option `.imageDecodeOptions`
- Replace conformsToProtocol call with appropriate respondsToSelector check to improve performance #3429 Thanks @timonus
- Fix del redundant autoreleasepool #3388 Thanks @dongranGG
### Fixes
- Avoid store again when origin disk cache hit during Thumbnail or Transformer with smaller pixel size #3428 #3395
- Add the possible nullable logic check when the force-decode/copy failed #3427