浏览代码

thumbnail cache: add a way to fetch stuff at random sizes and if the caller believes that it should replace the cache copy, it can ask the cache to do so

Felix Paul Kühne 10 年之前
父节点
当前提交
d71564a161
共有 2 个文件被更改,包括 26 次插入1 次删除
  1. 3 1
      Sources/VLCThumbnailsCache.h
  2. 23 0
      Sources/VLCThumbnailsCache.m

+ 3 - 1
Sources/VLCThumbnailsCache.h

@@ -2,7 +2,7 @@
  * VLCThumbnailsCache.h
  * VLC for iOS
  *****************************************************************************
- * Copyright (c) 2013-2014 VideoLAN. All rights reserved.
+ * Copyright (c) 2013-2015 VideoLAN. All rights reserved.
  * $Id$
  *
  * Authors: Gleb Pinigin <gpinigin # gmail.com>
@@ -18,4 +18,6 @@
 
 + (UIImage *)thumbnailForMediaItemWithTitle:(NSString *)title Artist:(NSString*)artist andAlbumName:(NSString*)albumname;
 
++ (UIImage *)thumbnailForManagedObject:(NSManagedObject *)object toFitRect:(CGRect)rect shouldReplaceCache:(BOOL)replaceCache;
+
 @end

+ 23 - 0
Sources/VLCThumbnailsCache.m

@@ -16,6 +16,7 @@
 #import "VLCThumbnailsCache.h"
 #import <CommonCrypto/CommonDigest.h>
 #import "UIImage+Blur.h"
+#import "UIImage+Scaling.h"
 #import <WatchKit/WatchKit.h>
 
 @interface VLCThumbnailsCache() {
@@ -142,6 +143,28 @@
     return thumbnail;
 }
 
++ (UIImage *)thumbnailForManagedObject:(NSManagedObject *)object toFitRect:(CGRect)rect shouldReplaceCache:(BOOL)replaceCache
+{
+    UIImage *rawThumbnail = [self thumbnailForManagedObject:object];
+    CGSize rawSize = rawThumbnail.size;
+
+    /* scaling is potentially expensive, so we should avoid re-doing it for the same size over and over again */ 
+    if (rawSize.width <= rect.size.width && rawSize.height <= rect.size.height)
+        return rawThumbnail;
+
+    UIImage *scaledImage = [UIImage scaleImage:rawThumbnail toFitRect:rect];
+
+    if (replaceCache)
+        [[VLCThumbnailsCache sharedThumbnailCache] _setThumbnail:scaledImage forObjectId:object.objectID];
+
+    return scaledImage;
+}
+
+- (void)_setThumbnail:(UIImage *)image forObjectId:(NSManagedObjectID *)objID
+{
+    [_thumbnailCache setObject:image forKey:objID];
+}
+
 - (UIImage *)thumbnailForMediaFile:(MLFile *)mediaFile
 {
     if (mediaFile == nil || mediaFile.objectID == nil)