react-native-fast-image 8.28.1 → 8.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#import <SDWebImageWebPCoder/SDImageWebPCoder.h>
|
|
2
|
+
|
|
3
|
+
// libwebp's WebP coder (SDWebImageWebPCoder), for animated WebPs only:
|
|
4
|
+
// SDWebImage's own coders decode a WebP's first frame. Still WebPs keep
|
|
5
|
+
// ImageIO's decoder. Registered with SDWebImage's coders by FFFastImageSource.
|
|
6
|
+
@interface FFFAnimatedWebPCoder : SDImageWebPCoder
|
|
7
|
+
|
|
8
|
+
@property (nonatomic, class, readonly, nonnull) FFFAnimatedWebPCoder* sharedCoder;
|
|
9
|
+
|
|
10
|
+
@end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#import "FFFAnimatedWebPCoder.h"
|
|
2
|
+
|
|
3
|
+
// Whether the data is an animated WebP: a RIFF WEBP file whose first chunk is
|
|
4
|
+
// VP8X (the extended format) with the animation flag set. The header comes
|
|
5
|
+
// first, so a partial download can be checked too.
|
|
6
|
+
static BOOL FFFIsAnimatedWebP(NSData* data) {
|
|
7
|
+
if (data.length < 21) {
|
|
8
|
+
return NO;
|
|
9
|
+
}
|
|
10
|
+
const uint8_t* bytes = data.bytes;
|
|
11
|
+
return memcmp(bytes, "RIFF", 4) == 0
|
|
12
|
+
&& memcmp(bytes + 8, "WEBPVP8X", 8) == 0
|
|
13
|
+
&& (bytes[20] & 0x02) != 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@implementation FFFAnimatedWebPCoder
|
|
17
|
+
|
|
18
|
+
// SDImageWebPCoder's sharedCoder is always one of its own.
|
|
19
|
+
+ (FFFAnimatedWebPCoder*) sharedCoder {
|
|
20
|
+
static FFFAnimatedWebPCoder* coder;
|
|
21
|
+
static dispatch_once_t once;
|
|
22
|
+
dispatch_once(&once, ^{
|
|
23
|
+
coder = [FFFAnimatedWebPCoder new];
|
|
24
|
+
});
|
|
25
|
+
return coder;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
- (BOOL) canDecodeFromData: (NSData*)data {
|
|
29
|
+
return FFFIsAnimatedWebP(data);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (BOOL) canIncrementalDecodeFromData: (NSData*)data {
|
|
33
|
+
return FFFIsAnimatedWebP(data);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Only for decoding: encoding WebP is left to the coders that did it before.
|
|
37
|
+
- (BOOL) canEncodeToFormat: (SDImageFormat)format {
|
|
38
|
+
return NO;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@end
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
#import <SDWebImage/SDWebImageDownloaderOperation.h>
|
|
7
7
|
#import <SDWebImage/NSData+ImageContentType.h>
|
|
8
8
|
#import <SDWebImage/SDImageCodersManager.h>
|
|
9
|
+
#import <SDWebImage/SDImageAWebPCoder.h>
|
|
10
|
+
#import "FFFAnimatedWebPCoder.h"
|
|
9
11
|
#import <objc/message.h>
|
|
10
12
|
|
|
11
13
|
// In FFFastImageView.m.
|
|
@@ -243,7 +245,22 @@ static id<SDImageCoder> FFFSVGCoder;
|
|
|
243
245
|
if (self != [FFFastImageSource class]) {
|
|
244
246
|
return;
|
|
245
247
|
}
|
|
246
|
-
//
|
|
248
|
+
// Animated WebP: SDWebImage's own coders only decode a WebP's first frame
|
|
249
|
+
// (with ImageIO), so libwebp's coder decodes animated ones (still ones
|
|
250
|
+
// keep ImageIO's). Not if the app has registered a WebP coder (libwebp's,
|
|
251
|
+
// or ImageIO's animated one), which is its choice.
|
|
252
|
+
BOOL hasWebPCoder = NO;
|
|
253
|
+
for (id<SDImageCoder> registered in SDImageCodersManager.sharedManager.coders) {
|
|
254
|
+
if ([registered isKindOfClass:[SDImageWebPCoder class]] || [registered isKindOfClass:[SDImageAWebPCoder class]]) {
|
|
255
|
+
hasWebPCoder = YES;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (!hasWebPCoder) {
|
|
260
|
+
[SDImageCodersManager.sharedManager addCoder:FFFAnimatedWebPCoder.sharedCoder];
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// SVG: registered with SDWebImage's coders, as the pod's setup does (unless
|
|
247
264
|
// the app has already): SDWebImage then picks it for SVG data, including
|
|
248
265
|
// for FastImage's animated and downsampled image classes. Giving the
|
|
249
266
|
// coder per load instead (SDWebImageContextImageCoder) would make it the
|