/* * This file is part of the SDWebImage package. * (c) Olivier Poitrey * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #import "UIImage+MemoryCacheCost.h" #import "objc/runtime.h" #import "NSImage+Compatibility.h" FOUNDATION_STATIC_INLINE NSUInteger SDMemoryCacheCostForImage(UIImage *image) { CGImageRef imageRef = image.CGImage; if (!imageRef) { return 0; } NSUInteger bytesPerFrame = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef); NSUInteger frameCount; #if SD_MAC frameCount = 1; #elif SD_UIKIT || SD_WATCH // Filter the same frame in `_UIAnimatedImage`. frameCount = image.images.count > 1 ? [NSSet setWithArray:image.images].count : 1; #endif NSUInteger cost = bytesPerFrame * frameCount; return cost; } @implementation UIImage (MemoryCacheCost) - (NSUInteger)sd_memoryCost { NSNumber *value = objc_getAssociatedObject(self, @selector(sd_memoryCost)); NSUInteger memoryCost; if (value != nil) { memoryCost = [value unsignedIntegerValue]; } else { memoryCost = SDMemoryCacheCostForImage(self); } return memoryCost; } - (void)setSd_memoryCost:(NSUInteger)sd_memoryCost { objc_setAssociatedObject(self, @selector(sd_memoryCost), @(sd_memoryCost), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end