杨锴
2025-03-11 90dc3329d1973fda691e357cf4523d5c7c67fa1d
Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m
@@ -15,6 +15,70 @@
#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
@@ -139,7 +203,14 @@
                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];