RCTImageSource.m 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 "RCTImageSource.h"
  8. #import "RCTUtils.h"
  9. @interface RCTImageSource ()
  10. @property (nonatomic, assign) BOOL packagerAsset;
  11. @end
  12. @implementation RCTImageSource
  13. - (instancetype)initWithURLRequest:(NSURLRequest *)request size:(CGSize)size scale:(CGFloat)scale
  14. {
  15. if ((self = [super init])) {
  16. _request = [request copy];
  17. _size = size;
  18. _scale = scale;
  19. }
  20. return self;
  21. }
  22. - (instancetype)imageSourceWithSize:(CGSize)size scale:(CGFloat)scale
  23. {
  24. RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURLRequest:_request size:size scale:scale];
  25. imageSource.packagerAsset = _packagerAsset;
  26. return imageSource;
  27. }
  28. - (BOOL)isEqual:(RCTImageSource *)object
  29. {
  30. if (![object isKindOfClass:[RCTImageSource class]]) {
  31. return NO;
  32. }
  33. return [_request isEqual:object.request] && _scale == object.scale &&
  34. (CGSizeEqualToSize(_size, object.size) || CGSizeEqualToSize(object.size, CGSizeZero));
  35. }
  36. - (NSString *)description
  37. {
  38. return [NSString stringWithFormat:@"<RCTImageSource: %p URL=%@, size=%@, scale=%0.f>",
  39. self,
  40. _request.URL,
  41. NSStringFromCGSize(_size),
  42. _scale];
  43. }
  44. @end
  45. @implementation RCTConvert (ImageSource)
  46. + (RCTImageSource *)RCTImageSource:(id)json
  47. {
  48. if (!json) {
  49. return nil;
  50. }
  51. NSURLRequest *request;
  52. CGSize size = CGSizeZero;
  53. CGFloat scale = 1.0;
  54. BOOL packagerAsset = NO;
  55. if ([json isKindOfClass:[NSDictionary class]]) {
  56. if (!(request = [self NSURLRequest:json])) {
  57. return nil;
  58. }
  59. size = [self CGSize:json];
  60. scale = [self CGFloat:json[@"scale"]] ?: [self BOOL:json[@"deprecated"]] ? 0.0 : 1.0;
  61. packagerAsset = [self BOOL:json[@"__packager_asset"]];
  62. } else if ([json isKindOfClass:[NSString class]]) {
  63. request = [self NSURLRequest:json];
  64. } else {
  65. RCTLogConvertError(json, @"an image. Did you forget to call resolveAssetSource() on the JS side?");
  66. return nil;
  67. }
  68. RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURLRequest:request size:size scale:scale];
  69. imageSource.packagerAsset = packagerAsset;
  70. return imageSource;
  71. }
  72. RCT_ARRAY_CONVERTER(RCTImageSource)
  73. @end