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
- // Registered with SDWebImage's coders, as the pod's setup does (unless
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-fast-image",
3
- "version": "8.28.1",
3
+ "version": "8.29.0",
4
4
  "description": "FastImage, performant React Native image component.",
5
5
  "keywords": [
6
6
  "cache",