Skip to content

Commit 76edf76

Browse files
authored
Merge pull request #2 from SDWebImage/master
Updates from Main branch
2 parents e252beb + 864a71e commit 76edf76

File tree

9 files changed

+428
-26
lines changed

9 files changed

+428
-26
lines changed

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,32 @@ let thumbnailWebpData = SDImageWebPCoder.shared.encodedData(with: image, format:
212212

213213
See more documentation in [SDWebImage Wiki - Coders](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#custom-coder-420)
214214

215+
### Advanced WebP codec options (0.8+)
216+
217+
The WebP codec [libwebp](https://developers.google.com/speed/webp/docs/api) we use, supports some advanced control options for encoding/decoding. You can pass them to libwebp by using the wrapper top level API:
218+
219+
+ Objective-C
220+
221+
```objective-c
222+
UIImage *image;
223+
SDImageCoderOptions *options = @{SDImageCoderEncodeWebPMethod: @(0), SDImageCoderEncodeWebPAlphaCompression: @(100)};
224+
NSData *data = [SDImageWebPCoder.sharedCoder encodedDataWithImage:image format:SDImageFormatWebP options:options];
225+
// Will translate into:
226+
// config->method = 0;
227+
// config->alpha_quality = 100;
228+
```
229+
230+
+ Swift
231+
232+
```swift
233+
let image: UIImage
234+
let options = [.encodeWebPMethod: 0, .encodeWebPAlphaCompression: 100]
235+
let data = SDImageWebPCoder.shared.encodedData(with: image, format: .webP, options: options)
236+
// Will translate into:
237+
// config->method = 0;
238+
// config->alpha_quality = 100;
239+
```
240+
215241
## Example
216242

217243
To run the example project, clone the repo, and run `pod install` from the root directory first. Then open `SDWebImageWebPCoder.xcworkspace`.

SDWebImageWebPCoder.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'SDWebImageWebPCoder'
3-
s.version = '0.7.0'
3+
s.version = '0.8.0'
44
s.summary = 'WebP decoder/encoder for SDWebImage coder plugin.'
55

66
s.description = <<-DESC

SDWebImageWebPCoder.xcodeproj/project.pbxproj

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
220A623A257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */; };
11+
220A623B257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */; };
12+
220A623C257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */; };
13+
220A623D257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
14+
220A623E257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
15+
220A623F257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
16+
220A6240257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
17+
228EA36125825A52005903D9 /* SDWebImageWebPCoderDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */; };
1018
806E77B32136A2E900A316D2 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 806E77AA2136A2E900A316D2 /* UIImage+WebP.m */; };
1119
806E77B42136A2E900A316D2 /* SDImageWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 806E77AB2136A2E900A316D2 /* SDImageWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
1220
806E77B62136A2E900A316D2 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 806E77AD2136A2E900A316D2 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -38,7 +46,8 @@
3846
/* End PBXBuildFile section */
3947

4048
/* Begin PBXFileReference section */
41-
28D8AA3D3015E075692FD3E3 /* Pods-SDWebImageWebPCoderTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SDWebImageWebPCoderTests.debug.xcconfig"; path = "Tests/Pods/Target Support Files/Pods-SDWebImageWebPCoderTests/Pods-SDWebImageWebPCoderTests.debug.xcconfig"; sourceTree = "<group>"; };
49+
220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageWebPCoderDefine.m; sourceTree = "<group>"; };
50+
220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageWebPCoderDefine.h; sourceTree = "<group>"; };
4251
3217BE7B220547EB003D0310 /* SDWebImageWebPCoder.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = SDWebImageWebPCoder.modulemap; sourceTree = "<group>"; };
4352
46F21AD7D1692EBAC4D0FF33 /* Pods_SDWebImageWebPCoderTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SDWebImageWebPCoderTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4453
806E779D2136A1C000A316D2 /* SDWebImageWebPCoder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImageWebPCoder.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -59,7 +68,6 @@
5968
80BFF26E2136BE7900B95470 /* SDWebImageWebPCoder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImageWebPCoder.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6069
80BFF2772136BEE000B95470 /* SDWebImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDWebImage.framework; path = Carthage/Build/watchOS/SDWebImage.framework; sourceTree = "<group>"; };
6170
80BFF2782136BEE000B95470 /* libwebp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libwebp.framework; path = Carthage/Build/watchOS/libwebp.framework; sourceTree = "<group>"; };
62-
D92E6791BF088D1A101E670E /* Pods-SDWebImageWebPCoderTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SDWebImageWebPCoderTests.release.xcconfig"; path = "Tests/Pods/Target Support Files/Pods-SDWebImageWebPCoderTests/Pods-SDWebImageWebPCoderTests.release.xcconfig"; sourceTree = "<group>"; };
6371
/* End PBXFileReference section */
6472

6573
/* Begin PBXFrameworksBuildPhase section */
@@ -102,22 +110,12 @@
102110
/* End PBXFrameworksBuildPhase section */
103111

104112
/* Begin PBXGroup section */
105-
52FB3B532EE8775B69517E2E /* Pods */ = {
106-
isa = PBXGroup;
107-
children = (
108-
28D8AA3D3015E075692FD3E3 /* Pods-SDWebImageWebPCoderTests.debug.xcconfig */,
109-
D92E6791BF088D1A101E670E /* Pods-SDWebImageWebPCoderTests.release.xcconfig */,
110-
);
111-
name = Pods;
112-
sourceTree = "<group>";
113-
};
114113
806E77932136A1C000A316D2 = {
115114
isa = PBXGroup;
116115
children = (
117116
806E77A82136A2E900A316D2 /* SDImageWebPCoder */,
118117
806E779E2136A1C000A316D2 /* Products */,
119118
80BFF2312136AA7D00B95470 /* Frameworks */,
120-
52FB3B532EE8775B69517E2E /* Pods */,
121119
);
122120
sourceTree = "<group>";
123121
};
@@ -146,6 +144,8 @@
146144
806E77A92136A2E900A316D2 /* Classes */ = {
147145
isa = PBXGroup;
148146
children = (
147+
220A6238257EAFB300262720 /* SDWebImageWebPCoderDefine.h */,
148+
220A6237257EAFB300262720 /* SDWebImageWebPCoderDefine.m */,
149149
806E77AB2136A2E900A316D2 /* SDImageWebPCoder.h */,
150150
806E77AE2136A2E900A316D2 /* SDImageWebPCoder.m */,
151151
806E77AD2136A2E900A316D2 /* UIImage+WebP.h */,
@@ -228,6 +228,7 @@
228228
files = (
229229
806E77C72136A7AD00A316D2 /* SDWebImageWebPCoder.h in Headers */,
230230
806E77B62136A2E900A316D2 /* UIImage+WebP.h in Headers */,
231+
220A623D257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */,
231232
806E77B42136A2E900A316D2 /* SDImageWebPCoder.h in Headers */,
232233
);
233234
runOnlyForDeploymentPostprocessing = 0;
@@ -238,6 +239,7 @@
238239
files = (
239240
80BFF2502136BC1500B95470 /* UIImage+WebP.h in Headers */,
240241
80BFF24D2136BC0600B95470 /* SDWebImageWebPCoder.h in Headers */,
242+
220A623E257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */,
241243
80BFF24E2136BC1000B95470 /* SDImageWebPCoder.h in Headers */,
242244
);
243245
runOnlyForDeploymentPostprocessing = 0;
@@ -248,6 +250,7 @@
248250
files = (
249251
80BFF2632136BE2200B95470 /* SDWebImageWebPCoder.h in Headers */,
250252
80BFF2612136BE1C00B95470 /* UIImage+WebP.h in Headers */,
253+
220A623F257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */,
251254
80BFF25F2136BE1700B95470 /* SDImageWebPCoder.h in Headers */,
252255
);
253256
runOnlyForDeploymentPostprocessing = 0;
@@ -258,6 +261,7 @@
258261
files = (
259262
80BFF27F2136BEF200B95470 /* SDWebImageWebPCoder.h in Headers */,
260263
80BFF27D2136BEED00B95470 /* UIImage+WebP.h in Headers */,
264+
220A6240257EAFB300262720 /* SDWebImageWebPCoderDefine.h in Headers */,
261265
80BFF27B2136BEE700B95470 /* SDImageWebPCoder.h in Headers */,
262266
);
263267
runOnlyForDeploymentPostprocessing = 0;
@@ -416,6 +420,7 @@
416420
isa = PBXSourcesBuildPhase;
417421
buildActionMask = 2147483647;
418422
files = (
423+
228EA36125825A52005903D9 /* SDWebImageWebPCoderDefine.m in Sources */,
419424
806E77B72136A2E900A316D2 /* SDImageWebPCoder.m in Sources */,
420425
806E77B32136A2E900A316D2 /* UIImage+WebP.m in Sources */,
421426
);
@@ -425,6 +430,7 @@
425430
isa = PBXSourcesBuildPhase;
426431
buildActionMask = 2147483647;
427432
files = (
433+
220A623A257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */,
428434
80BFF24F2136BC1300B95470 /* SDImageWebPCoder.m in Sources */,
429435
80BFF2512136BC1800B95470 /* UIImage+WebP.m in Sources */,
430436
);
@@ -434,6 +440,7 @@
434440
isa = PBXSourcesBuildPhase;
435441
buildActionMask = 2147483647;
436442
files = (
443+
220A623B257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */,
437444
80BFF2602136BE1A00B95470 /* SDImageWebPCoder.m in Sources */,
438445
80BFF2622136BE1F00B95470 /* UIImage+WebP.m in Sources */,
439446
);
@@ -443,6 +450,7 @@
443450
isa = PBXSourcesBuildPhase;
444451
buildActionMask = 2147483647;
445452
files = (
453+
220A623C257EAFB300262720 /* SDWebImageWebPCoderDefine.m in Sources */,
446454
80BFF27C2136BEEB00B95470 /* SDImageWebPCoder.m in Sources */,
447455
80BFF27E2136BEF000B95470 /* UIImage+WebP.m in Sources */,
448456
);

SDWebImageWebPCoder/Classes/SDImageWebPCoder.m

Lines changed: 148 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
*/
88

99
#import "SDImageWebPCoder.h"
10+
#import "SDWebImageWebPCoderDefine.h"
11+
#import <Accelerate/Accelerate.h>
12+
#import <os/lock.h>
13+
#import <libkern/OSAtomic.h>
1014

1115
#if __has_include("webp/decode.h") && __has_include("webp/encode.h") && __has_include("webp/demux.h") && __has_include("webp/mux.h")
1216
#import "webp/decode.h"
@@ -22,7 +26,47 @@
2226
@import libwebp;
2327
#endif
2428

25-
#import <Accelerate/Accelerate.h>
29+
#define SD_USE_OS_UNFAIR_LOCK TARGET_OS_MACCATALYST ||\
30+
(__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0) ||\
31+
(__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12) ||\
32+
(__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0) ||\
33+
(__WATCH_OS_VERSION_MIN_REQUIRED >= __WATCHOS_3_0)
34+
35+
#ifndef SD_LOCK_DECLARE
36+
#if SD_USE_OS_UNFAIR_LOCK
37+
#define SD_LOCK_DECLARE(lock) os_unfair_lock lock
38+
#else
39+
#define SD_LOCK_DECLARE(lock) os_unfair_lock lock API_AVAILABLE(ios(10.0), tvos(10), watchos(3), macos(10.12)); \
40+
OSSpinLock lock##_deprecated;
41+
#endif
42+
#endif
43+
44+
#ifndef SD_LOCK_INIT
45+
#if SD_USE_OS_UNFAIR_LOCK
46+
#define SD_LOCK_INIT(lock) lock = OS_UNFAIR_LOCK_INIT
47+
#else
48+
#define SD_LOCK_INIT(lock) if (@available(iOS 10, tvOS 10, watchOS 3, macOS 10.12, *)) lock = OS_UNFAIR_LOCK_INIT; \
49+
else lock##_deprecated = OS_SPINLOCK_INIT;
50+
#endif
51+
#endif
52+
53+
#ifndef SD_LOCK
54+
#if SD_USE_OS_UNFAIR_LOCK
55+
#define SD_LOCK(lock) os_unfair_lock_lock(&lock)
56+
#else
57+
#define SD_LOCK(lock) if (@available(iOS 10, tvOS 10, watchOS 3, macOS 10.12, *)) os_unfair_lock_lock(&lock); \
58+
else OSSpinLockLock(&lock##_deprecated);
59+
#endif
60+
#endif
61+
62+
#ifndef SD_UNLOCK
63+
#if SD_USE_OS_UNFAIR_LOCK
64+
#define SD_UNLOCK(lock) os_unfair_lock_unlock(&lock)
65+
#else
66+
#define SD_UNLOCK(lock) if (@available(iOS 10, tvOS 10, watchOS 3, macOS 10.12, *)) os_unfair_lock_unlock(&lock); \
67+
else OSSpinLockUnlock(&lock##_deprecated);
68+
#endif
69+
#endif
2670

2771
/// Calculate the actual thumnail pixel size
2872
static CGSize SDCalculateThumbnailSize(CGSize fullSize, BOOL preserveAspectRatio, CGSize thumbnailSize) {
@@ -98,7 +142,7 @@ @implementation SDImageWebPCoder {
98142
BOOL _finished;
99143
CGFloat _canvasWidth;
100144
CGFloat _canvasHeight;
101-
dispatch_semaphore_t _lock;
145+
SD_LOCK_DECLARE(_lock);
102146
NSUInteger _currentBlendIndex;
103147
BOOL _preserveAspectRatio;
104148
CGSize _thumbnailSize;
@@ -291,7 +335,7 @@ - (instancetype)initIncrementalWithOptions:(nullable SDImageCoderOptions *)optio
291335
}
292336
_preserveAspectRatio = preserveAspectRatio;
293337
_currentBlendIndex = NSNotFound;
294-
_lock = dispatch_semaphore_create(1);
338+
SD_LOCK_INIT(_lock);
295339
}
296340
return self;
297341
}
@@ -617,7 +661,11 @@ - (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format o
617661
BOOL encodeFirstFrame = [options[SDImageCoderEncodeFirstFrameOnly] boolValue];
618662
if (encodeFirstFrame || frames.count == 0) {
619663
// for static single webp image
620-
data = [self sd_encodedWebpDataWithImage:image.CGImage quality:compressionQuality maxPixelSize:maxPixelSize maxFileSize:maxFileSize];
664+
data = [self sd_encodedWebpDataWithImage:image.CGImage
665+
quality:compressionQuality
666+
maxPixelSize:maxPixelSize
667+
maxFileSize:maxFileSize
668+
options:options];
621669
} else {
622670
// for animated webp image
623671
WebPMux *mux = WebPMuxNew();
@@ -626,7 +674,11 @@ - (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format o
626674
}
627675
for (size_t i = 0; i < frames.count; i++) {
628676
SDImageFrame *currentFrame = frames[i];
629-
NSData *webpData = [self sd_encodedWebpDataWithImage:currentFrame.image.CGImage quality:compressionQuality maxPixelSize:maxPixelSize maxFileSize:maxFileSize];
677+
NSData *webpData = [self sd_encodedWebpDataWithImage:currentFrame.image.CGImage
678+
quality:compressionQuality
679+
maxPixelSize:maxPixelSize
680+
maxFileSize:maxFileSize
681+
options:options];
630682
int duration = currentFrame.duration * 1000;
631683
WebPMuxFrameInfo frame = { .bitstream.bytes = webpData.bytes,
632684
.bitstream.size = webpData.length,
@@ -663,7 +715,12 @@ - (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format o
663715
return data;
664716
}
665717

666-
- (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef quality:(double)quality maxPixelSize:(CGSize)maxPixelSize maxFileSize:(NSUInteger)maxFileSize {
718+
- (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef
719+
quality:(double)quality
720+
maxPixelSize:(CGSize)maxPixelSize
721+
maxFileSize:(NSUInteger)maxFileSize
722+
options:(nullable SDImageCoderOptions *)options
723+
{
667724
NSData *webpData;
668725
if (!imageRef) {
669726
return nil;
@@ -779,10 +836,7 @@ - (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef q
779836
return nil;
780837
}
781838

782-
config.target_size = (int)maxFileSize; // Max filesize for output, 0 means use quality instead
783-
config.pass = maxFileSize > 0 ? 6 : 1; // Use 6 passes for file size limited encoding, which is the default value of `cwebp` command line
784-
config.thread_level = 1; // Thread encoding for fast
785-
config.lossless = 0; // Disable lossless encoding (If we need, can add new Encoding Options in future version)
839+
[self updateWebPOptionsToConfig:&config maxFileSize:maxFileSize options:options];
786840
picture.use_argb = 0; // Lossy encoding use YUV for internel bitstream
787841
picture.width = (int)width;
788842
picture.height = (int)height;
@@ -830,6 +884,89 @@ - (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef q
830884
return webpData;
831885
}
832886

887+
- (void) updateWebPOptionsToConfig:(WebPConfig * _Nonnull)config
888+
maxFileSize:(NSUInteger)maxFileSize
889+
options:(nullable SDImageCoderOptions *)options {
890+
891+
config->target_size = (int)maxFileSize; // Max filesize for output, 0 means use quality instead
892+
config->pass = maxFileSize > 0 ? 6 : 1; // Use 6 passes for file size limited encoding, which is the default value of `cwebp` command line
893+
config->lossless = 0; // Disable lossless encoding (If we need, can add new Encoding Options in future version)
894+
895+
if ([options[SDImageCoderEncodeWebPMethod] intValue]) {
896+
config->method = [options[SDImageCoderEncodeWebPMethod] intValue];
897+
}
898+
if ([options[SDImageCoderEncodeWebPPass] intValue]) {
899+
config->pass = [options[SDImageCoderEncodeWebPPass] intValue];
900+
}
901+
if ([options[SDImageCoderEncodeWebPPreprocessing] intValue]) {
902+
config->preprocessing = [options[SDImageCoderEncodeWebPPreprocessing] intValue];
903+
}
904+
if ([options[SDImageCoderEncodeWebPThreadLevel] intValue]) {
905+
config->thread_level = [options[SDImageCoderEncodeWebPThreadLevel] intValue];
906+
} else {
907+
config->thread_level = 1;
908+
}
909+
if ([options[SDImageCoderEncodeWebPLowMemory] intValue]) {
910+
config->low_memory = [options[SDImageCoderEncodeWebPLowMemory] intValue];
911+
}
912+
913+
if ([options[SDImageCoderEncodeWebPTargetPSNR] floatValue]) {
914+
config->target_PSNR = [options[SDImageCoderEncodeWebPTargetPSNR] floatValue];
915+
}
916+
917+
if ([options[SDImageCoderEncodeWebPSegments] intValue]) {
918+
config->segments = [options[SDImageCoderEncodeWebPSegments] intValue];
919+
}
920+
921+
if ([options[SDImageCoderEncodeWebPSnsStrength] intValue]) {
922+
config->sns_strength = [options[SDImageCoderEncodeWebPSnsStrength] intValue];
923+
}
924+
925+
if ([options[SDImageCoderEncodeWebPFilterStrength] intValue]) {
926+
config->filter_strength = [options[SDImageCoderEncodeWebPFilterStrength] intValue];
927+
}
928+
929+
if ([options[SDImageCoderEncodeWebPFilterSharpness] intValue]) {
930+
config->filter_sharpness = [options[SDImageCoderEncodeWebPFilterSharpness] intValue];
931+
}
932+
933+
if ([options[SDImageCoderEncodeWebPFilterType] intValue]) {
934+
config->filter_type = [options[SDImageCoderEncodeWebPFilterType] intValue];
935+
}
936+
937+
if ([options[SDImageCoderEncodeWebPAutofilter] intValue]) {
938+
config->autofilter = [options[SDImageCoderEncodeWebPAutofilter] intValue];
939+
}
940+
941+
if ([options[SDImageCoderEncodeWebPAlphaCompression] intValue]) {
942+
config->alpha_compression = [options[SDImageCoderEncodeWebPAlphaCompression] intValue];
943+
}
944+
945+
if ([options[SDImageCoderEncodeWebPAlphaFiltering] intValue]) {
946+
config->alpha_filtering = [options[SDImageCoderEncodeWebPAlphaFiltering] intValue];
947+
}
948+
949+
if ([options[SDImageCoderEncodeWebPAlphaQuality] intValue]) {
950+
config->alpha_quality = [options[SDImageCoderEncodeWebPAlphaQuality] intValue];
951+
}
952+
953+
if ([options[SDImageCoderEncodeWebPShowCompressed] intValue]) {
954+
config->show_compressed = [options[SDImageCoderEncodeWebPShowCompressed] intValue];
955+
}
956+
957+
if ([options[SDImageCoderEncodeWebPPartitions] intValue]) {
958+
config->partitions = [options[SDImageCoderEncodeWebPPartitions] intValue];
959+
}
960+
961+
if ([options[SDImageCoderEncodeWebPPartitionLimit] intValue]) {
962+
config->partition_limit = [options[SDImageCoderEncodeWebPPartitionLimit] intValue];
963+
}
964+
965+
if ([options[SDImageCoderEncodeWebPUseSharpYuv] intValue]) {
966+
config->use_sharp_yuv = [options[SDImageCoderEncodeWebPUseSharpYuv] intValue];
967+
}
968+
}
969+
833970
static void FreeImageData(void *info, const void *data, size_t size) {
834971
free((void *)data);
835972
}
@@ -881,7 +1018,7 @@ - (instancetype)initWithAnimatedImageData:(NSData *)data options:(nullable SDIma
8811018
_demux = demuxer;
8821019
_imageData = data;
8831020
_currentBlendIndex = NSNotFound;
884-
_lock = dispatch_semaphore_create(1);
1021+
SD_LOCK_INIT(_lock);
8851022
}
8861023
return self;
8871024
}

0 commit comments

Comments
 (0)