Skip to content

Commit

Permalink
Revert "Remove old GIF code (facebook#25636)"
Browse files Browse the repository at this point in the history
This reverts commit cf77067.
  • Loading branch information
janicduplessis committed Aug 13, 2019
1 parent 919398c commit 0a5edf7
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 5 deletions.
2 changes: 2 additions & 0 deletions Libraries/Image/RCTImageLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ typedef dispatch_block_t RCTImageLoaderCancellationBlock;

@interface UIImage (React)

@property (nonatomic, copy) CAKeyframeAnimation *reactKeyframeAnimation;

/**
* Memory bytes of the image with the default calculation of static image or GIF. Custom calculations of decoded bytes can be assigned manually.
*/
Expand Down
19 changes: 18 additions & 1 deletion Libraries/Image/RCTImageLoader.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,27 @@

static NSInteger RCTImageBytesForImage(UIImage *image)
{
CAKeyframeAnimation *keyFrameAnimation = [image reactKeyframeAnimation];
NSInteger singleImageBytes = image.size.width * image.size.height * image.scale * image.scale * 4;
return image.images ? image.images.count * singleImageBytes : singleImageBytes;
if (keyFrameAnimation) {
return keyFrameAnimation.values.count * singleImageBytes;
} else {
return image.images ? image.images.count * singleImageBytes : singleImageBytes;
}
}

@implementation UIImage (React)

- (CAKeyframeAnimation *)reactKeyframeAnimation
{
return objc_getAssociatedObject(self, _cmd);
}

- (void)setReactKeyframeAnimation:(CAKeyframeAnimation *)reactKeyframeAnimation
{
objc_setAssociatedObject(self, @selector(reactKeyframeAnimation), reactKeyframeAnimation, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSInteger)reactDecodedImageBytes
{
NSNumber *imageBytes = objc_getAssociatedObject(self, _cmd);
Expand Down Expand Up @@ -265,9 +280,11 @@ - (void)setImageCache:(id<RCTImageCache>)cache
CGSizeEqualToSize(image.size, size)) {
return image;
}
CAKeyframeAnimation *animation = image.reactKeyframeAnimation;
CGRect targetSize = RCTTargetRect(image.size, size, scale, resizeMode);
CGAffineTransform transform = RCTTransformFromTargetRect(image.size, targetSize);
image = RCTTransformImage(image, size, scale, transform);
image.reactKeyframeAnimation = animation;
return image;
}

Expand Down
14 changes: 13 additions & 1 deletion Libraries/Image/RCTImageView.m
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ - (void)cancelImageLoad
- (void)clearImage
{
[self cancelImageLoad];
[_imageView.layer removeAnimationForKey:@"contents"];
self.image = nil;
_imageSource = nil;
}
Expand Down Expand Up @@ -400,7 +401,18 @@ - (void)imageLoaderLoadedImage:(UIImage *)loadedImage error:(NSError *)error for
self->_pendingImageSource = nil;
}

self.image = image;
[self->_imageView.layer removeAnimationForKey:@"contents"];
if (image.reactKeyframeAnimation) {
CGImageRef posterImageRef = (__bridge CGImageRef)[image.reactKeyframeAnimation.values firstObject];
if (!posterImageRef) {
return;
}
// Apply renderingMode to animated image.
self->_imageView.image = [[UIImage imageWithCGImage:posterImageRef] imageWithRenderingMode:self->_renderingMode];
[self->_imageView.layer addAnimation:image.reactKeyframeAnimation forKey:@"contents"];
} else {
self.image = image;
}

if (isPartialLoad) {
if (self->_onPartialLoad) {
Expand Down
6 changes: 3 additions & 3 deletions Libraries/Image/RCTUIImageViewAnimated.m
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,11 @@ - (void)setImage:(UIImage *)image
if (self.image == image) {
return;
}

[self stop];
[self resetAnimatedImage];

if ([image respondsToSelector:@selector(animatedImageFrameAtIndex:)]) {
[self stop];
[self resetAnimatedImage];

NSUInteger animatedImageFrameCount = ((UIImage<RCTAnimatedImage> *)image).animatedImageFrameCount;

// In case frame count is 0, there is no reason to continue.
Expand Down

0 comments on commit 0a5edf7

Please sign in to comment.