48 lines
1.4 KiB
Objective-C
48 lines
1.4 KiB
Objective-C
/*
|
|
* 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 "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
|