GLReactImage.m 2.3 KB
Newer Older
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

#import "GLReactImage.h"
#import "GLUtils.h"
#import "ImageData.h"
#import "RCTBridge.h"
#import "RCTImageLoader.h"
#import "RCTLog.h"


@implementation GLReactImage
{
  RCTBridge *_bridge; // React's bridge allow to access the imageLoader
  UIImage *_image; // The currently loaded image (nil if no image fully loaded yet)
  ImageData *_data; // Cache of the _data related to this image (computed by getImageData)
  void (^_onload)(void); // called everytime an image loads
  RCTImageLoaderCancellationBlock _loading; // the current loading cancellation function
}

- (instancetype)initWithBridge:(RCTBridge *)bridge withOnLoad:(void (^)(void))onload
{
  if ((self = [super init])) {
    _bridge = bridge;
    _onload = onload;
    _image = nil;
    _loading = nil;
  }
  return self;
}

- (void)dealloc
{
  [self clearImage];
  if (_loading) _loading();
  _onload = nil;
  _loading = nil;
  _bridge = nil;
}

RCT_NOT_IMPLEMENTED(-init)

- (void) clearImage
{
  _image = nil;
  _data = nil;
}

- (ImageData *) getImageData
{
  if (!_data) {
    _data = genPixelsWithImage(_image);
  }
  return _data;
}

- (void)setSrc:(NSString *)src
{
  if (![src isEqual:_src]) {
    _src = [src copy];
    [self reloadImage];
  }
}

- (void)reloadImage
{
  if (_loading) _loading();
  _loading = nil;
  if (!_src) {
    [self clearImage];
  } else {
    
    // Load the image (without resizing it)
    
    if (![_src hasPrefix:@"http://"] && ![_src hasPrefix:@"http://"]) {
      self.image = [UIImage imageNamed:_src];
      if(_onload) _onload();
    } else {
      _loading = [_bridge.imageLoader loadImageWithTag:_src
                                       size:CGSizeZero
                                      scale:0
                                 resizeMode:UIViewContentModeScaleToFill
                              progressBlock:nil
                            completionBlock:^(NSError *error, id image) {
                              _loading = nil;
                              [self clearImage];
                              if (error) {
                                NSLog(@"Image failed to load: %@", error);
                              } else {
                                self.image = image;
                                if(_onload) _onload();
                              }
                            }];
    }
  }
}


@end