| | |
| | | #import "SDInternalMacros.h" |
| | | #import "objc/runtime.h" |
| | | |
| | | // A wrapper to implements the transformer on animated image, like tint color |
| | | @interface SDAnimatedImageFrameProvider : NSObject <SDAnimatedImageProvider> |
| | | @property (nonatomic, strong) id<SDAnimatedImageProvider> provider; |
| | | @property (nonatomic, strong) id<SDImageTransformer> transformer; |
| | | @end |
| | | |
| | | @implementation SDAnimatedImageFrameProvider |
| | | |
| | | - (instancetype)initWithProvider:(id<SDAnimatedImageProvider>)provider transformer:(id<SDImageTransformer>)transformer { |
| | | self = [super init]; |
| | | if (self) { |
| | | _provider = provider; |
| | | _transformer = transformer; |
| | | } |
| | | return self; |
| | | } |
| | | |
| | | - (NSUInteger)hash { |
| | | NSUInteger prime = 31; |
| | | NSUInteger result = 1; |
| | | NSUInteger providerHash = self.provider.hash; |
| | | NSUInteger transformerHash = self.transformer.transformerKey.hash; |
| | | result = prime * result + providerHash; |
| | | result = prime * result + transformerHash; |
| | | return result; |
| | | } |
| | | |
| | | - (BOOL)isEqual:(id)object { |
| | | if (nil == object) { |
| | | return NO; |
| | | } |
| | | if (self == object) { |
| | | return YES; |
| | | } |
| | | if (![object isKindOfClass:[self class]]) { |
| | | return NO; |
| | | } |
| | | return self.provider == [object provider] |
| | | && [self.transformer.transformerKey isEqualToString:[object transformer].transformerKey]; |
| | | } |
| | | |
| | | - (NSData *)animatedImageData { |
| | | return self.provider.animatedImageData; |
| | | } |
| | | |
| | | - (NSUInteger)animatedImageFrameCount { |
| | | return self.provider.animatedImageFrameCount; |
| | | } |
| | | |
| | | - (NSUInteger)animatedImageLoopCount { |
| | | return self.provider.animatedImageLoopCount; |
| | | } |
| | | |
| | | - (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index { |
| | | return [self.provider animatedImageDurationAtIndex:index]; |
| | | } |
| | | |
| | | - (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index { |
| | | UIImage *frame = [self.provider animatedImageFrameAtIndex:index]; |
| | | return [self.transformer transformedImageWithImage:frame forKey:@""]; |
| | | } |
| | | |
| | | @end |
| | | |
| | | @interface UIImageView () <CALayerDelegate> |
| | | @end |
| | | |
| | |
| | | provider = (id<SDAnimatedImage>)image; |
| | | } |
| | | // Create animated player |
| | | self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| | | if (self.animationTransformer) { |
| | | // Check if post-transform animation available |
| | | provider = [[SDAnimatedImageFrameProvider alloc] initWithProvider:provider transformer:self.animationTransformer]; |
| | | self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| | | } else { |
| | | // Normal animation without post-transform |
| | | self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| | | } |
| | | } else { |
| | | // Update Frame Count |
| | | self.player.totalFrameCount = [(id<SDAnimatedImage>)image animatedImageFrameCount]; |