RCTGIFImageDecoder.mm 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import <React/RCTGIFImageDecoder.h>
  8. #import <ImageIO/ImageIO.h>
  9. #import <QuartzCore/QuartzCore.h>
  10. #import <React/RCTAnimatedImage.h>
  11. #import <React/RCTUtils.h>
  12. #import <ReactCommon/RCTTurboModule.h>
  13. #import "RCTImagePlugins.h"
  14. @interface RCTGIFImageDecoder() <RCTTurboModule>
  15. @end
  16. @implementation RCTGIFImageDecoder
  17. RCT_EXPORT_MODULE()
  18. - (BOOL)canDecodeImageData:(NSData *)imageData
  19. {
  20. char header[7] = {};
  21. [imageData getBytes:header length:6];
  22. return !strcmp(header, "GIF87a") || !strcmp(header, "GIF89a");
  23. }
  24. - (RCTImageLoaderCancellationBlock)decodeImageData:(NSData *)imageData
  25. size:(CGSize)size
  26. scale:(CGFloat)scale
  27. resizeMode:(RCTResizeMode)resizeMode
  28. completionHandler:(RCTImageLoaderCompletionBlock)completionHandler
  29. {
  30. RCTAnimatedImage *image = [[RCTAnimatedImage alloc] initWithData:imageData scale:scale];
  31. if (!image) {
  32. completionHandler(nil, nil);
  33. return ^{};
  34. }
  35. completionHandler(nil, image);
  36. return ^{};
  37. }
  38. @end
  39. Class RCTGIFImageDecoderCls() {
  40. return RCTGIFImageDecoder.class;
  41. }