123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /*
- * This file is part of the SDWebImage package.
- * (c) Olivier Poitrey <rs@dailymotion.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- #import "SDAnimatedImageRep.h"
- #if SD_MAC
- #import "SDWebImageGIFCoder.h"
- @interface SDWebImageGIFCoder ()
- - (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source;
- @end
- @interface SDAnimatedImageRep ()
- @property (nonatomic, assign, readonly, nullable) CGImageSourceRef imageSource;
- @end
- @implementation SDAnimatedImageRep
- // `NSBitmapImageRep` will use `kCGImagePropertyGIFDelayTime` whenever you call `setProperty:withValue:` with `NSImageCurrentFrame` to change the current frame. We override it and use the actual `kCGImagePropertyGIFUnclampedDelayTime` if need.
- - (void)setProperty:(NSBitmapImageRepPropertyKey)property withValue:(id)value {
- [super setProperty:property withValue:value];
- if ([property isEqualToString:NSImageCurrentFrame]) {
- // Access the image source
- CGImageSourceRef imageSource = self.imageSource;
- if (!imageSource) {
- return;
- }
- // Check format type
- CFStringRef type = CGImageSourceGetType(imageSource);
- if (!type) {
- return;
- }
- NSUInteger index = [value unsignedIntegerValue];
- float frameDuration = 0;
- // Through we currently process GIF only, in the 5.x we support APNG so we keep the extensibility
- if (CFStringCompare(type, kUTTypeGIF, 0) == kCFCompareEqualTo) {
- frameDuration = [[SDWebImageGIFCoder sharedCoder] sd_frameDurationAtIndex:index source:imageSource];
- }
- if (!frameDuration) {
- return;
- }
- // Reset super frame duration with the actual frame duration
- [super setProperty:NSImageCurrentFrameDuration withValue:@(frameDuration)];
- }
- }
- - (CGImageSourceRef)imageSource {
- if (_tiffData) {
- return (__bridge CGImageSourceRef)(_tiffData);
- }
- return NULL;
- }
- @end
- #endif
|