From df0cce01a8f45687ebb77966a66e22c7c4af9118 Mon Sep 17 00:00:00 2001 From: gsempe Date: Wed, 18 Jun 2014 20:02:30 +0200 Subject: [PATCH 001/207] Add option to scale down large images on iOS Option is SDWebImageScaleDownLargeImage --- SDWebImage/SDWebImageDecoder.h | 2 + SDWebImage/SDWebImageDecoder.m | 75 ++++++++++++++++------ SDWebImage/SDWebImageDownloader.h | 6 +- SDWebImage/SDWebImageDownloaderOperation.m | 8 +++ SDWebImage/SDWebImageManager.h | 10 ++- SDWebImage/SDWebImageManager.m | 5 ++ 6 files changed, 84 insertions(+), 22 deletions(-) diff --git a/SDWebImage/SDWebImageDecoder.h b/SDWebImage/SDWebImageDecoder.h index 0176a7ba..1ab5752e 100644 --- a/SDWebImage/SDWebImageDecoder.h +++ b/SDWebImage/SDWebImageDecoder.h @@ -15,4 +15,6 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image; ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image; + @end diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 79ddb30f..1e79372b 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -10,63 +10,98 @@ #import "SDWebImageDecoder.h" +/* + Size in MB, compatible with all iOS devices. + */ +#define kSDWebImageDecoderMaxImageSizeMB 4.f + +#define SDWebImageDecoderMaxTotalPixels(bitsPerComponent) ((kSDWebImageDecoderMaxImageSizeMB*1024.*1024.*8.)/bitsPerComponent) + +inline static CGSize SDWebImageDecoderConstrainedSize(UIImage *image) { + CGImageRef imageRef = image.CGImage; + CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); + size_t imageBitsPerComponent = CGImageGetBitsPerComponent(imageRef); + CGFloat imageTotalPixels = imageSize.width * imageSize.height; + if (imageTotalPixels < SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent)) { + return CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX); + } + CGFloat ratio = SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent) / imageTotalPixels; + CGFloat maxWidth = imageSize.width * ratio; + CGFloat maxHeight = imageSize.height *ratio; + return CGSizeMake(floorf(maxWidth), floorf(maxHeight)); +} + @implementation UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image { ++ (UIImage *)decodedAndScaledDownImageToSize:(CGSize)size withImage:(UIImage *)image { if (image.images) { // Do not decode animated images return image; } - + CGImageRef imageRef = image.CGImage; CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); - CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; + + if ((size.width < imageSize.width) && (size.height < imageSize.height)) { + imageSize = size; + } + CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); - + int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || - infoMask == kCGImageAlphaNoneSkipFirst || - infoMask == kCGImageAlphaNoneSkipLast); - + infoMask == kCGImageAlphaNoneSkipFirst || + infoMask == kCGImageAlphaNoneSkipLast); + // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. // https://developer.apple.com/library/mac/#qa/qa1037/_index.html if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { // Unset the old alpha info. bitmapInfo &= ~kCGBitmapAlphaInfoMask; - + // Set noneSkipFirst. bitmapInfo |= kCGImageAlphaNoneSkipFirst; } - // Some PNGs tell us they have alpha but only 3 components. Odd. + // Some PNGs tell us they have alpha but only 3 components. Odd. else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { // Unset the old alpha info. bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaPremultipliedFirst; } - + // It calculates the bytes-per-row based on the bitsPerComponent and width arguments. CGContextRef context = CGBitmapContextCreate(NULL, - imageSize.width, - imageSize.height, - CGImageGetBitsPerComponent(imageRef), - 0, - colorSpace, - bitmapInfo); + imageSize.width, + imageSize.height, + CGImageGetBitsPerComponent(imageRef), + 0, + colorSpace, + bitmapInfo); CGColorSpaceRelease(colorSpace); - + // If failed, return undecompressed image if (!context) return image; - + + CGContextSetInterpolationQuality(context, kCGInterpolationHigh); CGContextDrawImage(context, imageRect, imageRef); CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); - + CGContextRelease(context); - + UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation]; CGImageRelease(decompressedImageRef); return decompressedImage; } ++ (UIImage *)decodedImageWithImage:(UIImage *)image { + return [UIImage decodedAndScaledDownImageToSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) withImage:image]; +} + ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image { + return [UIImage decodedAndScaledDownImageToSize:SDWebImageDecoderConstrainedSize(image) withImage:image]; +} + @end diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index ffe5aa9d..1fae843b 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -50,7 +50,11 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { */ SDWebImageDownloaderHighPriority = 1 << 7, - + /** + * Scale down the image + */ + SDWebImageDownloaderScaleDownLargeImage = 1 << 8, + }; typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index a0b7db2f..39ebf43a 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -357,7 +357,15 @@ if (!image.images) // Do not force decod animated GIFs { +#ifdef TARGET_OS_IPHONE + if (self.options & SDWebImageDownloaderScaleDownLargeImage) { + image = [UIImage decodedAndScaledDownImageWithImage:image]; + } else { + image = [UIImage decodedImageWithImage:image]; + } +#else image = [UIImage decodedImageWithImage:image]; +#endif } if (CGSizeEqualToSize(image.size, CGSizeZero)) { diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 6a1a17da..5a47c150 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -74,7 +74,15 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { * By default, placeholder images are loaded while the image is loading. This flag will delay the loading * of the placeholder image until after the image has finished loading. */ - SDWebImageDelayPlaceholder = 1 << 9 + SDWebImageDelayPlaceholder = 1 << 9, + + /** + * By default, images are decoded respecting their original size. On iOS, this flag will scale down the + * images to a size compatible with the constrained memory of devices. + * If `SDWebImageProgressiveDownload` flag is set the scale down is deactivated. + */ + SDWebImageScaleDownLargeImage = 1 << 10 + }; typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType); diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 7c256612..56b61340 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -134,12 +134,17 @@ if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; + if (options & SDWebImageScaleDownLargeImage) downloaderOptions |= SDWebImageDownloaderScaleDownLargeImage; if (image && options & SDWebImageRefreshCached) { // force progressive off if image already cached but forced refreshing downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } + if (options & SDWebImageProgressiveDownload) { + // Progressive download deactivate scale down + downloaderOptions &= ~SDWebImageDownloaderScaleDownLargeImage; + } id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { if (weakOperation.isCancelled) { dispatch_main_sync_safe(^{ From f0732d704cb315cc1a3e208cf5e71df3697e9251 Mon Sep 17 00:00:00 2001 From: gsempe Date: Wed, 18 Jun 2014 20:02:30 +0200 Subject: [PATCH 002/207] Add option to scale down large images on iOS Option is SDWebImageScaleDownLargeImage --- SDWebImage/SDWebImageDecoder.h | 2 + SDWebImage/SDWebImageDecoder.m | 57 +++++++++++++++++----- SDWebImage/SDWebImageDownloader.h | 6 ++- SDWebImage/SDWebImageDownloaderOperation.m | 8 +++ SDWebImage/SDWebImageManager.h | 10 +++- SDWebImage/SDWebImageManager.m | 5 ++ 6 files changed, 75 insertions(+), 13 deletions(-) diff --git a/SDWebImage/SDWebImageDecoder.h b/SDWebImage/SDWebImageDecoder.h index 0176a7ba..1ab5752e 100644 --- a/SDWebImage/SDWebImageDecoder.h +++ b/SDWebImage/SDWebImageDecoder.h @@ -15,4 +15,6 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image; ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image; + @end diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 79ddb30f..271c040e 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -10,9 +10,30 @@ #import "SDWebImageDecoder.h" +/* + Size in MB, compatible with all iOS devices. + */ +#define kSDWebImageDecoderMaxImageSizeMB 4.f + +#define SDWebImageDecoderMaxTotalPixels(bitsPerComponent) ((kSDWebImageDecoderMaxImageSizeMB*1024.*1024.*8.)/bitsPerComponent) + +inline static CGSize SDWebImageDecoderConstrainedSize(UIImage *image) { + CGImageRef imageRef = image.CGImage; + CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); + size_t imageBitsPerComponent = CGImageGetBitsPerComponent(imageRef); + CGFloat imageTotalPixels = imageSize.width * imageSize.height; + if (imageTotalPixels < SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent)) { + return CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX); + } + CGFloat ratio = SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent) / imageTotalPixels; + CGFloat maxWidth = imageSize.width * ratio; + CGFloat maxHeight = imageSize.height *ratio; + return CGSizeMake(floorf(maxWidth), floorf(maxHeight)); +} + @implementation UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image { ++ (UIImage *)decodedAndScaledDownImageToSize:(CGSize)size withImage:(UIImage *)image { if (image.images) { // Do not decode animated images return image; @@ -20,15 +41,20 @@ CGImageRef imageRef = image.CGImage; CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); - CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; + + if ((size.width < imageSize.width) && (size.height < imageSize.height)) { + imageSize = size; + } + CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || - infoMask == kCGImageAlphaNoneSkipFirst || - infoMask == kCGImageAlphaNoneSkipLast); + infoMask == kCGImageAlphaNoneSkipFirst || + infoMask == kCGImageAlphaNoneSkipLast); // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. // https://developer.apple.com/library/mac/#qa/qa1037/_index.html @@ -39,7 +65,7 @@ // Set noneSkipFirst. bitmapInfo |= kCGImageAlphaNoneSkipFirst; } - // Some PNGs tell us they have alpha but only 3 components. Odd. + // Some PNGs tell us they have alpha but only 3 components. Odd. else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { // Unset the old alpha info. bitmapInfo &= ~kCGBitmapAlphaInfoMask; @@ -48,17 +74,18 @@ // It calculates the bytes-per-row based on the bitsPerComponent and width arguments. CGContextRef context = CGBitmapContextCreate(NULL, - imageSize.width, - imageSize.height, - CGImageGetBitsPerComponent(imageRef), - 0, - colorSpace, - bitmapInfo); + imageSize.width, + imageSize.height, + CGImageGetBitsPerComponent(imageRef), + 0, + colorSpace, + bitmapInfo); CGColorSpaceRelease(colorSpace); // If failed, return undecompressed image if (!context) return image; + CGContextSetInterpolationQuality(context, kCGInterpolationHigh); CGContextDrawImage(context, imageRect, imageRef); CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); @@ -69,4 +96,12 @@ return decompressedImage; } ++ (UIImage *)decodedImageWithImage:(UIImage *)image { + return [UIImage decodedAndScaledDownImageToSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) withImage:image]; +} + ++ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image { + return [UIImage decodedAndScaledDownImageToSize:SDWebImageDecoderConstrainedSize(image) withImage:image]; +} + @end diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index ffe5aa9d..1fae843b 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -50,7 +50,11 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { */ SDWebImageDownloaderHighPriority = 1 << 7, - + /** + * Scale down the image + */ + SDWebImageDownloaderScaleDownLargeImage = 1 << 8, + }; typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index a0b7db2f..39ebf43a 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -357,7 +357,15 @@ if (!image.images) // Do not force decod animated GIFs { +#ifdef TARGET_OS_IPHONE + if (self.options & SDWebImageDownloaderScaleDownLargeImage) { + image = [UIImage decodedAndScaledDownImageWithImage:image]; + } else { + image = [UIImage decodedImageWithImage:image]; + } +#else image = [UIImage decodedImageWithImage:image]; +#endif } if (CGSizeEqualToSize(image.size, CGSizeZero)) { diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 6a1a17da..5a47c150 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -74,7 +74,15 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { * By default, placeholder images are loaded while the image is loading. This flag will delay the loading * of the placeholder image until after the image has finished loading. */ - SDWebImageDelayPlaceholder = 1 << 9 + SDWebImageDelayPlaceholder = 1 << 9, + + /** + * By default, images are decoded respecting their original size. On iOS, this flag will scale down the + * images to a size compatible with the constrained memory of devices. + * If `SDWebImageProgressiveDownload` flag is set the scale down is deactivated. + */ + SDWebImageScaleDownLargeImage = 1 << 10 + }; typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType); diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 7c256612..56b61340 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -134,12 +134,17 @@ if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; + if (options & SDWebImageScaleDownLargeImage) downloaderOptions |= SDWebImageDownloaderScaleDownLargeImage; if (image && options & SDWebImageRefreshCached) { // force progressive off if image already cached but forced refreshing downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } + if (options & SDWebImageProgressiveDownload) { + // Progressive download deactivate scale down + downloaderOptions &= ~SDWebImageDownloaderScaleDownLargeImage; + } id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { if (weakOperation.isCancelled) { dispatch_main_sync_safe(^{ From dc8da77aab126913345845ad6525c7e4a99a8b3d Mon Sep 17 00:00:00 2001 From: gsempe Date: Mon, 30 Jun 2014 19:52:55 +0200 Subject: [PATCH 003/207] Implement a complete down sizing algorithm to avoid memory warnings Code copy from the Apple Sample code "Large Image Downsizing" https://developer.apple.com/Library/ios/samplecode/LargeImageDownsizing/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011173-Intro-DontLinkElementID_2 --- SDWebImage/SDWebImageDecoder.m | 222 +++++++++++++++++++++++++++------ 1 file changed, 181 insertions(+), 41 deletions(-) diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 271c040e..52a7b695 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -10,58 +10,32 @@ #import "SDWebImageDecoder.h" -/* - Size in MB, compatible with all iOS devices. - */ -#define kSDWebImageDecoderMaxImageSizeMB 4.f - -#define SDWebImageDecoderMaxTotalPixels(bitsPerComponent) ((kSDWebImageDecoderMaxImageSizeMB*1024.*1024.*8.)/bitsPerComponent) - -inline static CGSize SDWebImageDecoderConstrainedSize(UIImage *image) { - CGImageRef imageRef = image.CGImage; - CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); - size_t imageBitsPerComponent = CGImageGetBitsPerComponent(imageRef); - CGFloat imageTotalPixels = imageSize.width * imageSize.height; - if (imageTotalPixels < SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent)) { - return CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX); - } - CGFloat ratio = SDWebImageDecoderMaxTotalPixels(imageBitsPerComponent) / imageTotalPixels; - CGFloat maxWidth = imageSize.width * ratio; - CGFloat maxHeight = imageSize.height *ratio; - return CGSizeMake(floorf(maxWidth), floorf(maxHeight)); -} - @implementation UIImage (ForceDecode) -+ (UIImage *)decodedAndScaledDownImageToSize:(CGSize)size withImage:(UIImage *)image { ++ (UIImage *)decodedImageWithImage:(UIImage *)image { if (image.images) { // Do not decode animated images return image; } - + CGImageRef imageRef = image.CGImage; CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); - - if ((size.width < imageSize.width) && (size.height < imageSize.height)) { - imageSize = size; - } - CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); - + int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || infoMask == kCGImageAlphaNoneSkipFirst || infoMask == kCGImageAlphaNoneSkipLast); - + // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. // https://developer.apple.com/library/mac/#qa/qa1037/_index.html if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { // Unset the old alpha info. bitmapInfo &= ~kCGBitmapAlphaInfoMask; - + // Set noneSkipFirst. bitmapInfo |= kCGImageAlphaNoneSkipFirst; } @@ -71,7 +45,7 @@ inline static CGSize SDWebImageDecoderConstrainedSize(UIImage *image) { bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaPremultipliedFirst; } - + // It calculates the bytes-per-row based on the bitsPerComponent and width arguments. CGContextRef context = CGBitmapContextCreate(NULL, imageSize.width, @@ -81,27 +55,193 @@ inline static CGSize SDWebImageDecoderConstrainedSize(UIImage *image) { colorSpace, bitmapInfo); CGColorSpaceRelease(colorSpace); - + // If failed, return undecompressed image if (!context) return image; - - CGContextSetInterpolationQuality(context, kCGInterpolationHigh); + CGContextDrawImage(context, imageRect, imageRef); CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); - + CGContextRelease(context); - + UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation]; CGImageRelease(decompressedImageRef); return decompressedImage; } -+ (UIImage *)decodedImageWithImage:(UIImage *)image { - return [UIImage decodedAndScaledDownImageToSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) withImage:image]; -} +/* + * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImage` is set + * Suggested value for iPad1 and iPhone 3GS: 60. + * Suggested value for iPad2 and iPhone 4: 120. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. + */ +#define kDestImageSizeMB 60.0f + +/* + * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImage` is set + * Suggested value for iPad1 and iPhone 3GS: 20. + * Suggested value for iPad2 and iPhone 4: 40. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. + */ +#define kSourceImageTileSizeMB 20.0f + +#define bytesPerMB 1048576.0f +#define bytesPerPixel 4.0f +#define pixelsPerMB ( bytesPerMB / bytesPerPixel ) +#define destTotalPixels kDestImageSizeMB * pixelsPerMB +#define tileTotalPixels kSourceImageTileSizeMB * pixelsPerMB +#define destSeemOverlap 2.0f // the numbers of pixels to overlap the seems where tiles meet. + (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image { - return [UIImage decodedAndScaledDownImageToSize:SDWebImageDecoderConstrainedSize(image) withImage:image]; + + BOOL shouldDownSize = ({ + BOOL shouldDoIt = YES; + + CGImageRef sourceImageRef = image.CGImage; + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + float imageScale = destTotalPixels / sourceTotalPixels; + if (imageScale < 1) { + shouldDoIt = YES; + } else { + shouldDoIt = NO; + } + shouldDoIt; + }); + + if (NO == shouldDownSize) { + return [UIImage decodedImageWithImage:image]; + } + + CGContextRef destContext; + + @autoreleasepool { + CGImageRef sourceImageRef = image.CGImage; + + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + // Determine the scale ratio to apply to the input image + // that results in an output image of the defined size. + // see kDestImageSizeMB, and how it relates to destTotalPixels. + float imageScale = destTotalPixels / sourceTotalPixels; + CGSize destResolution = CGSizeZero; + destResolution.width = (int)(sourceResolution.width*imageScale); + destResolution.height = (int)(sourceResolution.height*imageScale); + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + int bytesPerRow = bytesPerPixel * destResolution.width; + // Allocate enough pixel data to hold the output image. + void* destBitmapData = malloc( bytesPerRow * destResolution.height ); + if (destBitmapData == NULL) { + return image; + } + CGBitmapInfo bitmapInfo = ({ + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(sourceImageRef); + int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); + BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || + infoMask == kCGImageAlphaNoneSkipFirst || + infoMask == kCGImageAlphaNoneSkipLast); + + // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. + // https://developer.apple.com/library/mac/#qa/qa1037/_index.html + if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { + // Unset the old alpha info. + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + + // Set noneSkipFirst. + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } + // Some PNGs tell us they have alpha but only 3 components. Odd. + else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { + // Unset the old alpha info. + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } + bitmapInfo; + }); + destContext = CGBitmapContextCreate(destBitmapData, + destResolution.width, + destResolution.height, + 8, + bytesPerRow, + colorSpace, + bitmapInfo); + if (destContext == NULL) { + free( destBitmapData ); + return image; + } + CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); + CGColorSpaceRelease(colorSpace); + // Now define the size of the rectangle to be used for the + // incremental blits from the input image to the output image. + // we use a source tile width equal to the width of the source + // image due to the way that iOS retrieves image data from disk. + // iOS must decode an image from disk in full width 'bands', even + // if current graphics context is clipped to a subrect within that + // band. Therefore we fully utilize all of the pixel data that results + // from a decoding opertion by achnoring our tile size to the full + // width of the input image. + CGRect sourceTile = CGRectZero; + sourceTile.size.width = sourceResolution.width; + // The source tile height is dynamic. Since we specified the size + // of the source tile in MB, see how many rows of pixels high it + // can be given the input image width. + sourceTile.size.height = (int)( tileTotalPixels / sourceTile.size.width ); + sourceTile.origin.x = 0.0f; + // The output tile is the same proportions as the input tile, but + // scaled to image scale. + CGRect destTile; + destTile.size.width = destResolution.width; + destTile.size.height = sourceTile.size.height * imageScale; + destTile.origin.x = 0.0f; + // The source seem overlap is proportionate to the destination seem overlap. + // this is the amount of pixels to overlap each tile as we assemble the ouput image. + float sourceSeemOverlap = (int)((destSeemOverlap/destResolution.height)*sourceResolution.height); + CGImageRef sourceTileImageRef; + // calculate the number of read/write operations required to assemble the + // output image. + int iterations = (int)( sourceResolution.height / sourceTile.size.height ); + // If tile height doesn't divide the image height evenly, add another iteration + // to account for the remaining pixels. + int remainder = (int)sourceResolution.height % (int)sourceTile.size.height; + if(remainder) { + iterations++; + } + // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. + float sourceTileHeightMinusOverlap = sourceTile.size.height; + sourceTile.size.height += sourceSeemOverlap; + destTile.size.height += destSeemOverlap; + for( int y = 0; y < iterations; ++y ) { + @autoreleasepool { + sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; + destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + destSeemOverlap); + sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); + if( y == iterations - 1 && remainder ) { + float dify = destTile.size.height; + destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale; + dify -= destTile.size.height; + destTile.origin.y += dify; + } + CGContextDrawImage( destContext, destTile, sourceTileImageRef ); + CGImageRelease( sourceTileImageRef ); + } + } + } + CGImageRef destImageRef = CGBitmapContextCreateImage(destContext); + CGContextRelease(destContext); + if (destImageRef == NULL) { + return image; + } + UIImage *destImage = [UIImage imageWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation]; + CGImageRelease(destImageRef); + if (destImage == nil) { + return image; + } + return destImage; } + @end From 1fdaa4e7f8553c37131758b93bf878bb58b803ad Mon Sep 17 00:00:00 2001 From: gsempe Date: Mon, 30 Jun 2014 20:00:44 +0200 Subject: [PATCH 004/207] Modify image data back when the image is too large and it has been scaled down --- SDWebImage/SDWebImageDownloaderOperation.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 39ebf43a..3d400d11 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -360,6 +360,7 @@ #ifdef TARGET_OS_IPHONE if (self.options & SDWebImageDownloaderScaleDownLargeImage) { image = [UIImage decodedAndScaledDownImageWithImage:image]; + [self.imageData setData:UIImagePNGRepresentation(image)]; } else { image = [UIImage decodedImageWithImage:image]; } From cee50eb648e59528ab71a0d44e61dcd2397b13e0 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 13 Dec 2014 13:01:24 +0800 Subject: [PATCH 005/207] Add url as param to progress block --- Examples/SDWebImage Demo/DetailViewController.m | 2 +- SDWebImage/SDWebImageDownloader.h | 2 +- SDWebImage/SDWebImageDownloader.m | 4 ++-- SDWebImage/SDWebImageDownloaderOperation.m | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Examples/SDWebImage Demo/DetailViewController.m b/Examples/SDWebImage Demo/DetailViewController.m index d7acf6a8..2623fc39 100644 --- a/Examples/SDWebImage Demo/DetailViewController.m +++ b/Examples/SDWebImage Demo/DetailViewController.m @@ -37,7 +37,7 @@ [self.imageView sd_setImageWithURL:self.imageURL placeholderImage:nil options:SDWebImageProgressiveDownload - progress:^(NSInteger receivedSize, NSInteger expectedSize) { + progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL *targetURL) { if (!activityIndicator) { [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; activityIndicator.center = weakImageView.center; diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index cf255280..940679f4 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -68,7 +68,7 @@ typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { extern NSString *const SDWebImageDownloadStartNotification; extern NSString *const SDWebImageDownloadStopNotification; -typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize); +typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL *targetURL); typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 1c008d0c..4667931c 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -132,13 +132,13 @@ static NSString *const kCompletedCallbackKey = @"completed"; } operation = [[wself.operationClass alloc] initWithRequest:request options:options - progress:^(NSInteger receivedSize, NSInteger expectedSize) { + progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL *targetURL) { SDWebImageDownloader *sself = wself; if (!sself) return; NSArray *callbacksForURL = [sself callbacksForURL:url]; for (NSDictionary *callbacks in callbacksForURL) { SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; - if (callback) callback(receivedSize, expectedSize); + if (callback) callback(receivedSize, expectedSize, targetURL); } } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 0aefae30..08e3ad5f 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -93,7 +93,7 @@ if (self.connection) { if (self.progressBlock) { - self.progressBlock(0, NSURLResponseUnknownLength); + self.progressBlock(0, NSURLResponseUnknownLength, self.request.URL); } [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; @@ -201,7 +201,7 @@ NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; if (self.progressBlock) { - self.progressBlock(0, expected); + self.progressBlock(0, expected, self.request.URL); } self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; @@ -303,7 +303,7 @@ } if (self.progressBlock) { - self.progressBlock(self.imageData.length, self.expectedSize); + self.progressBlock(self.imageData.length, self.expectedSize, self.request.URL); } } From 917c3d479dd67de8ad73bf5f3f9149c5af7c60cc Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Mon, 1 Sep 2014 11:11:27 +0100 Subject: [PATCH 006/207] Fix multiple requests for same image and then canceling one --- SDWebImage/SDWebImageDownloader.h | 17 +++-- SDWebImage/SDWebImageDownloader.m | 44 ++++++++++-- SDWebImage/SDWebImageManager.m | 6 +- .../project.pbxproj | 4 ++ Tests/Tests/SDWebImageDownloaderTests.m | 70 +++++++++++++++++++ 5 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 Tests/Tests/SDWebImageDownloaderTests.m diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index b64fb130..b11d4f48 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -176,12 +176,19 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * before to be called a last time with the full image and finished argument * set to YES. In case of error, the finished argument is always YES. * - * @return A cancellable SDWebImageOperation + * @return A token that can be passed to -cancel: to cancel this operation */ -- (id )downloadImageWithURL:(NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock; +- (id)downloadImageWithURL:(NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock; + +/** + * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: + * + * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. + */ +- (void)cancel:(id)token; /** * Sets the download queue suspension state diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 1fdcfc92..23fe351e 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -13,6 +13,16 @@ static NSString *const kProgressCallbackKey = @"progress"; static NSString *const kCompletedCallbackKey = @"completed"; +@interface _SDWebImageDownloaderToken : NSObject + +@property (nonatomic, strong) NSURL *url; +@property (nonatomic, strong) id callbacks; + +@end + +@implementation _SDWebImageDownloaderToken +@end + @interface SDWebImageDownloader () @property (strong, nonatomic) NSOperationQueue *downloadQueue; @@ -112,11 +122,11 @@ static NSString *const kCompletedCallbackKey = @"completed"; _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; } -- (id )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { +- (id)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { __block SDWebImageDownloaderOperation *operation; - __weak __typeof(self)wself = self; + __weak SDWebImageDownloader *wself = self; - [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^{ + return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ NSTimeInterval timeoutInterval = wself.downloadTimeout; if (timeoutInterval == 0.0) { timeoutInterval = 15.0; @@ -190,20 +200,34 @@ static NSString *const kCompletedCallbackKey = @"completed"; [wself.lastAddedOperation addDependency:operation]; wself.lastAddedOperation = operation; } - }]; - return operation; + return operation; + }]; } -- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback { +- (void)cancel:(id)token { + if (![token isKindOfClass:[_SDWebImageDownloaderToken class]]) { + return; + } + + dispatch_barrier_async(self.barrierQueue, ^{ + _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; + NSMutableArray *callbacksForURL = self.URLCallbacks[typedToken.url]; + [callbacksForURL removeObjectIdenticalTo:typedToken.callbacks]; + }); +} + +- (id)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. if (url == nil) { if (completedBlock != nil) { completedBlock(nil, nil, nil, NO); } - return; + return nil; } + __block _SDWebImageDownloaderToken *token = nil; + dispatch_barrier_sync(self.barrierQueue, ^{ BOOL first = NO; if (!self.URLCallbacks[url]) { @@ -222,7 +246,13 @@ static NSString *const kCompletedCallbackKey = @"completed"; if (first) { createCallback(); } + + token = [_SDWebImageDownloaderToken new]; + token.url = url; + token.callbacks = callbacks; }); + + return token; } - (void)setSuspended:(BOOL)suspended { diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index c804ee9a..81f68280 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -179,7 +179,7 @@ // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } - id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { + id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (!strongOperation || strongOperation.isCancelled) { // Do nothing if the operation was cancelled @@ -255,8 +255,8 @@ } }]; operation.cancelBlock = ^{ - [subOperation cancel]; - + [self.imageDownloader cancel:subOperation]; + @synchronized (self.runningOperations) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation) { diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index 34a8e11b..31cb7118 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; + 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */; }; ABC8501F672447AA91C788DA /* libPods-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0D107E6B4C4094BA2FEE29 /* libPods-ios.a */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; @@ -22,6 +23,7 @@ 1A6DF883515E8008203AB352 /* Pods-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.debug.xcconfig"; sourceTree = ""; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; CA88E6BDE3581B2BFE933C10 /* Pods-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.release.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.release.xcconfig"; sourceTree = ""; }; + 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderTests.m; sourceTree = ""; }; DA248D53195472AA00390AB0 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DA248D56195472AA00390AB0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; DA248D58195472AA00390AB0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; @@ -96,6 +98,7 @@ DA248D68195475D800390AB0 /* SDImageCacheTests.m */, DA248D6A195476AC00390AB0 /* SDWebImageManagerTests.m */, DA91BEBB19795BC9006F2536 /* UIImageMultiFormatTests.m */, + 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */, ); path = Tests; sourceTree = ""; @@ -207,6 +210,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */, DA248D69195475D800390AB0 /* SDImageCacheTests.m in Sources */, DA248D6B195476AC00390AB0 /* SDWebImageManagerTests.m in Sources */, DA91BEBC19795BC9006F2536 /* UIImageMultiFormatTests.m in Sources */, diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m new file mode 100644 index 00000000..972e8faf --- /dev/null +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -0,0 +1,70 @@ +// +// SDWebImageDownloaderTests.m +// SDWebImage Tests +// +// Created by Matt Galloway on 01/09/2014. +// +// + +#define EXP_SHORTHAND // required by Expecta + + +#import +#import + +#import "SDWebImageDownloader.h" + +@interface SDWebImageDownloaderTests : XCTestCase + +@end + +@implementation SDWebImageDownloaderTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testThatDownloadingSameURLTwiceAndCancellingFirstWorks { + NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; + + id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + XCTFail(@"Shouldn't have completed here."); + }]; + expect(token1).toNot.beNil(); + + __block BOOL success = NO; + id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + success = YES; + }]; + expect(token2).toNot.beNil(); + + [[SDWebImageDownloader sharedDownloader] cancel:token1]; + + CFTimeInterval timeoutDate = CACurrentMediaTime() + 5.; + while (true) { + if (CACurrentMediaTime() > timeoutDate || success) { + break; + } + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1., true); + } + + if (!success) { + XCTFail(@"Failed to download image"); + } +} + +@end From 52f7204c3482139d9a328bb162e185dd4bf0f3c3 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Mon, 1 Sep 2014 11:19:21 +0100 Subject: [PATCH 007/207] Cancel the download operation if it's the last token to be canceled --- SDWebImage/SDWebImageDownloader.m | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 23fe351e..6242774c 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -29,6 +29,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; @property (weak, nonatomic) NSOperation *lastAddedOperation; @property (assign, nonatomic) Class operationClass; @property (strong, nonatomic) NSMutableDictionary *URLCallbacks; +@property (strong, nonatomic) NSMutableDictionary *URLOperations; @property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue @property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; @@ -77,6 +78,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; _downloadQueue = [NSOperationQueue new]; _downloadQueue.maxConcurrentOperationCount = 6; _URLCallbacks = [NSMutableDictionary new]; + _URLOperations = [NSMutableDictionary new]; #ifdef SD_WEBP _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; #else @@ -206,15 +208,22 @@ static NSString *const kCompletedCallbackKey = @"completed"; } - (void)cancel:(id)token { - if (![token isKindOfClass:[_SDWebImageDownloaderToken class]]) { - return; - } + if (![token isKindOfClass:[_SDWebImageDownloaderToken class]]) { + return; + } - dispatch_barrier_async(self.barrierQueue, ^{ - _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; - NSMutableArray *callbacksForURL = self.URLCallbacks[typedToken.url]; - [callbacksForURL removeObjectIdenticalTo:typedToken.callbacks]; - }); + dispatch_barrier_async(self.barrierQueue, ^{ + _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; + + NSMutableArray *callbacksForURL = self.URLCallbacks[typedToken.url]; + [callbacksForURL removeObjectIdenticalTo:typedToken.callbacks]; + + // If this was the last set of callbacks, then cancel the operation + if (callbacksForURL.count == 0) { + SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; + [operation cancel]; + } + }); } - (id)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { @@ -229,10 +238,8 @@ static NSString *const kCompletedCallbackKey = @"completed"; __block _SDWebImageDownloaderToken *token = nil; dispatch_barrier_sync(self.barrierQueue, ^{ - BOOL first = NO; if (!self.URLCallbacks[url]) { self.URLCallbacks[url] = [NSMutableArray new]; - first = YES; } // Handle single download of simultaneous download request for the same URL @@ -243,8 +250,10 @@ static NSString *const kCompletedCallbackKey = @"completed"; [callbacksForURL addObject:callbacks]; self.URLCallbacks[url] = callbacksForURL; - if (first) { - createCallback(); + SDWebImageDownloaderOperation *operation = self.URLOperations[url]; + if (!operation) { + operation = createCallback(); + self.URLOperations[url] = operation; } token = [_SDWebImageDownloaderToken new]; From b00b09e70627a78e2af31c937356cb9136993bc3 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Fri, 5 Sep 2014 11:43:30 +0100 Subject: [PATCH 008/207] Move progress / completion handler logic to the operation --- SDWebImage/SDWebImageDownloader.m | 105 +++++---------------- SDWebImage/SDWebImageDownloaderOperation.h | 33 +++++-- SDWebImage/SDWebImageDownloaderOperation.m | 74 ++++++++------- Tests/Tests/SDWebImageDownloaderTests.m | 53 +++++++++-- 4 files changed, 138 insertions(+), 127 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 6242774c..f63c95ee 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -10,13 +10,10 @@ #import "SDWebImageDownloaderOperation.h" #import -static NSString *const kProgressCallbackKey = @"progress"; -static NSString *const kCompletedCallbackKey = @"completed"; - @interface _SDWebImageDownloaderToken : NSObject @property (nonatomic, strong) NSURL *url; -@property (nonatomic, strong) id callbacks; +@property (nonatomic, strong) id downloadOperationCancelToken; @end @@ -28,7 +25,6 @@ static NSString *const kCompletedCallbackKey = @"completed"; @property (strong, nonatomic) NSOperationQueue *downloadQueue; @property (weak, nonatomic) NSOperation *lastAddedOperation; @property (assign, nonatomic) Class operationClass; -@property (strong, nonatomic) NSMutableDictionary *URLCallbacks; @property (strong, nonatomic) NSMutableDictionary *URLOperations; @property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue @@ -77,7 +73,6 @@ static NSString *const kCompletedCallbackKey = @"completed"; _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; _downloadQueue = [NSOperationQueue new]; _downloadQueue.maxConcurrentOperationCount = 6; - _URLCallbacks = [NSMutableDictionary new]; _URLOperations = [NSMutableDictionary new]; #ifdef SD_WEBP _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; @@ -125,7 +120,6 @@ static NSString *const kCompletedCallbackKey = @"completed"; } - (id)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { - __block SDWebImageDownloaderOperation *operation; __weak SDWebImageDownloader *wself = self; return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ @@ -144,44 +138,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; else { request.allHTTPHeaderFields = wself.HTTPHeaders; } - operation = [[wself.operationClass alloc] initWithRequest:request - options:options - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - __block NSArray *callbacksForURL; - dispatch_sync(sself.barrierQueue, ^{ - callbacksForURL = [sself.URLCallbacks[url] copy]; - }); - for (NSDictionary *callbacks in callbacksForURL) { - dispatch_async(dispatch_get_main_queue(), ^{ - SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; - if (callback) callback(receivedSize, expectedSize); - }); - } - } - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - __block NSArray *callbacksForURL; - dispatch_barrier_sync(sself.barrierQueue, ^{ - callbacksForURL = [sself.URLCallbacks[url] copy]; - if (finished) { - [sself.URLCallbacks removeObjectForKey:url]; - } - }); - for (NSDictionary *callbacks in callbacksForURL) { - SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; - if (callback) callback(image, data, error, finished); - } - } - cancelled:^{ - SDWebImageDownloader *sself = wself; - if (!sself) return; - dispatch_barrier_async(sself.barrierQueue, ^{ - [sself.URLCallbacks removeObjectForKey:url]; - }); - }]; + SDWebImageDownloaderOperation *operation = [[wself.operationClass alloc] initWithRequest:request options:options]; operation.shouldDecompressImages = wself.shouldDecompressImages; if (wself.urlCredential) { @@ -212,18 +169,12 @@ static NSString *const kCompletedCallbackKey = @"completed"; return; } - dispatch_barrier_async(self.barrierQueue, ^{ - _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; - - NSMutableArray *callbacksForURL = self.URLCallbacks[typedToken.url]; - [callbacksForURL removeObjectIdenticalTo:typedToken.callbacks]; - - // If this was the last set of callbacks, then cancel the operation - if (callbacksForURL.count == 0) { - SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; - [operation cancel]; - } - }); + _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; + SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; + BOOL canceled = [operation cancel:typedToken.downloadOperationCancelToken]; + if (canceled) { + [self.URLOperations removeObjectForKey:typedToken.url]; + } } - (id)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { @@ -235,31 +186,25 @@ static NSString *const kCompletedCallbackKey = @"completed"; return nil; } - __block _SDWebImageDownloaderToken *token = nil; + SDWebImageDownloaderOperation *operation = self.URLOperations[url]; + if (!operation) { + operation = createCallback(); + self.URLOperations[url] = operation; - dispatch_barrier_sync(self.barrierQueue, ^{ - if (!self.URLCallbacks[url]) { - self.URLCallbacks[url] = [NSMutableArray new]; - } + __weak SDWebImageDownloaderOperation *woperation = operation; + operation.completionBlock = ^{ + SDWebImageDownloaderOperation *soperation = woperation; + if (!soperation) return; + if (self.URLOperations[url] == soperation) { + [self.URLOperations removeObjectForKey:url]; + }; + }; + } + id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; - // Handle single download of simultaneous download request for the same URL - NSMutableArray *callbacksForURL = self.URLCallbacks[url]; - NSMutableDictionary *callbacks = [NSMutableDictionary new]; - if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; - if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; - [callbacksForURL addObject:callbacks]; - self.URLCallbacks[url] = callbacksForURL; - - SDWebImageDownloaderOperation *operation = self.URLOperations[url]; - if (!operation) { - operation = createCallback(); - self.URLOperations[url] = operation; - } - - token = [_SDWebImageDownloaderToken new]; - token.url = url; - token.callbacks = callbacks; - }); + _SDWebImageDownloaderToken *token = [_SDWebImageDownloaderToken new]; + token.url = url; + token.downloadOperationCancelToken = downloadOperationCancelToken; return token; } diff --git a/SDWebImage/SDWebImageDownloaderOperation.h b/SDWebImage/SDWebImageDownloaderOperation.h index dd48b228..68abec23 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.h +++ b/SDWebImage/SDWebImageDownloaderOperation.h @@ -61,18 +61,33 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * @param request the URL request * @param options downloader options - * @param progressBlock the block executed when a new chunk of data arrives. - * @note the progress block is executed on a background queue - * @param completedBlock the block executed when the download is done. - * @note the completed block is executed on the main queue for success. If errors are found, there is a chance the block will be executed on a background queue - * @param cancelBlock the block executed if the download (operation) is cancelled * * @return the initialized instance */ - (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock - cancelled:(SDWebImageNoParamsBlock)cancelBlock; + options:(SDWebImageDownloaderOptions)options; + +/** + * Adds handlers for progress and completion. Returns a tokent that can be passed to -cancel: to cancel this set of + * callbacks. + * + * @param progressBlock the block executed when a new chunk of data arrives. + * @note the progress block is executed on a background queue + * @param completedBlock the block executed when the download is done. + * @note the completed block is executed on the main queue for success. If errors are found, there is a chance the block will be executed on a background queue + * + * @return the token to use to cancel this set of handlers + */ +- (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock; + +/** + * Cancels a set of callbacks. Once all callbacks are canceled, the operation is cancelled. + * + * @param token the token representing a set of callbacks to cancel + * + * @return YES if the operation was stopped because this was the last token to be canceled. NO otherwise. + */ +- (BOOL)cancel:(id)token; @end diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 5a8bd11f..4b856549 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -17,11 +17,12 @@ NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDown NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinishNotification"; +static NSString *const kProgressCallbackKey = @"progress"; +static NSString *const kCompletedCallbackKey = @"completed"; + @interface SDWebImageDownloaderOperation () -@property (copy, nonatomic) SDWebImageDownloaderProgressBlock progressBlock; -@property (copy, nonatomic) SDWebImageDownloaderCompletedBlock completedBlock; -@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; +@property (strong, nonatomic) NSMutableArray *callbackBlocks; @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; @@ -45,18 +46,13 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis @synthesize finished = _finished; - (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock - cancelled:(SDWebImageNoParamsBlock)cancelBlock { + options:(SDWebImageDownloaderOptions)options { if ((self = [super init])) { _request = request; _shouldDecompressImages = YES; _shouldUseCredentialStorage = YES; _options = options; - _progressBlock = [progressBlock copy]; - _completedBlock = [completedBlock copy]; - _cancelBlock = [cancelBlock copy]; + _callbackBlocks = [NSMutableArray new]; _executing = NO; _finished = NO; _expectedSize = 0; @@ -65,6 +61,24 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis return self; } +- (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock { + NSMutableDictionary *callbacks = [NSMutableDictionary new]; + if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; + if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; + [self.callbackBlocks addObject:callbacks]; + return callbacks; +} + +- (BOOL)cancel:(id)token { + [self.callbackBlocks removeObjectIdenticalTo:token]; + if (self.callbackBlocks.count == 0) { + [self cancel]; + return YES; + } + return NO; +} + - (void)start { @synchronized (self) { if (self.isCancelled) { @@ -100,8 +114,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis [self.connection start]; if (self.connection) { - if (self.progressBlock) { - self.progressBlock(0, NSURLResponseUnknownLength); + for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + progressBlock(0, NSURLResponseUnknownLength); } dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; @@ -123,8 +137,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis } } else { - if (self.completedBlock) { - self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); + for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); } } @@ -161,7 +175,6 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis - (void)cancelInternal { if (self.isFinished) return; [super cancel]; - if (self.cancelBlock) self.cancelBlock(); if (self.connection) { [self.connection cancel]; @@ -185,9 +198,7 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis } - (void)reset { - self.cancelBlock = nil; - self.completedBlock = nil; - self.progressBlock = nil; + [self.callbackBlocks removeAllObjects]; self.connection = nil; self.imageData = nil; self.thread = nil; @@ -217,8 +228,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; - if (self.progressBlock) { - self.progressBlock(0, expected); + for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + progressBlock(0, expected); } self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; @@ -241,8 +252,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; }); - if (self.completedBlock) { - self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); + for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); } CFRunLoopStop(CFRunLoopGetCurrent()); [self done]; @@ -252,7 +263,7 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.imageData appendData:data]; - if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0 && self.completedBlock) { + if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0) { // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ // Thanks to the author @Nyx0uf @@ -319,8 +330,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis } CGImageRelease(partialImageRef); dispatch_main_sync_safe(^{ - if (self.completedBlock) { - self.completedBlock(image, nil, nil, NO); + for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + completedBlock(image, nil, nil, NO); } }); } @@ -329,8 +340,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis CFRelease(imageSource); } - if (self.progressBlock) { - self.progressBlock(self.imageData.length, self.expectedSize); + for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + progressBlock(self.imageData.length, self.expectedSize); } } @@ -362,7 +373,7 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis } - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { - SDWebImageDownloaderCompletedBlock completionBlock = self.completedBlock; + NSArray *completionBlocks = [[self.callbackBlocks valueForKey:kCompletedCallbackKey] copy]; @synchronized(self) { CFRunLoopStop(CFRunLoopGetCurrent()); self.thread = nil; @@ -377,7 +388,7 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis responseFromCached = NO; } - if (completionBlock) { + for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached) { completionBlock(nil, nil, nil, YES); } else if (self.imageData) { @@ -401,7 +412,6 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); } } - self.completionBlock = nil; [self done]; } @@ -415,8 +425,8 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis }); } - if (self.completedBlock) { - self.completedBlock(nil, nil, error, YES); + for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + completedBlock(nil, nil, error, YES); } self.completionBlock = nil; [self done]; diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index 972e8faf..27cece8f 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -32,6 +32,20 @@ [super tearDown]; } +- (BOOL)spinRunLoopWithTimeout:(NSTimeInterval)timeout untilBlockIsTrue:(BOOL(^)())block { + CFTimeInterval timeoutDate = CACurrentMediaTime() + 5.; + while (true) { + if (block()) { + return YES; + } + if (CACurrentMediaTime() > timeoutDate) { + return NO; + } + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1., true); + } + return NO; +} + - (void)testThatDownloadingSameURLTwiceAndCancellingFirstWorks { NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; @@ -54,13 +68,40 @@ [[SDWebImageDownloader sharedDownloader] cancel:token1]; - CFTimeInterval timeoutDate = CACurrentMediaTime() + 5.; - while (true) { - if (CACurrentMediaTime() > timeoutDate || success) { - break; - } - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1., true); + success = [self spinRunLoopWithTimeout:5. untilBlockIsTrue:^BOOL{ + return success; + }]; + + if (!success) { + XCTFail(@"Failed to download image"); } +} + +- (void)testThatCancelingDownloadThenRequestingAgainWorks { + NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; + + id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + XCTFail(@"Shouldn't have completed here."); + }]; + expect(token1).toNot.beNil(); + + [[SDWebImageDownloader sharedDownloader] cancel:token1]; + + __block BOOL success = NO; + id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + success = YES; + }]; + expect(token2).toNot.beNil(); + + success = [self spinRunLoopWithTimeout:5. untilBlockIsTrue:^BOOL{ + return success; + }]; if (!success) { XCTFail(@"Failed to download image"); From ae91053a80811ee585c68d4def0ffb76368495f7 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Mon, 8 Sep 2014 20:15:43 +0100 Subject: [PATCH 009/207] Don't create a new image for each completion block --- SDWebImage/SDWebImageDownloaderOperation.m | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 4b856549..711e2a32 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -387,10 +387,12 @@ static NSString *const kCompletedCallbackKey = @"completed"; if (![[NSURLCache sharedURLCache] cachedResponseForRequest:_request]) { responseFromCached = NO; } - - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { + + if (completionBlocks.count > 0) { if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached) { - completionBlock(nil, nil, nil, YES); + for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { + completionBlock(nil, nil, nil, YES); + } } else if (self.imageData) { UIImage *image = [UIImage sd_imageWithData:self.imageData]; NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; @@ -402,14 +404,18 @@ static NSString *const kCompletedCallbackKey = @"completed"; image = [UIImage decodedImageWithImage:image]; } } - if (CGSizeEqualToSize(image.size, CGSizeZero)) { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); - } - else { - completionBlock(image, self.imageData, nil, YES); + for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { + if (CGSizeEqualToSize(image.size, CGSizeZero)) { + completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); + } + else { + completionBlock(image, self.imageData, nil, YES); + } } } else { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); + for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { + completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); + } } } [self done]; From f773870d2cc859b114e4f4fa278e154d6f0ecb56 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Mon, 15 Sep 2014 11:41:16 +0100 Subject: [PATCH 010/207] Add back some required locking --- SDWebImage/SDWebImageDownloader.m | 52 ++++++++++++---------- SDWebImage/SDWebImageDownloaderOperation.m | 51 +++++++++++++++------ 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index f63c95ee..08ae9407 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -169,12 +169,14 @@ return; } - _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; - SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; - BOOL canceled = [operation cancel:typedToken.downloadOperationCancelToken]; - if (canceled) { - [self.URLOperations removeObjectForKey:typedToken.url]; - } + dispatch_barrier_async(self.barrierQueue, ^{ + _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; + SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; + BOOL canceled = [operation cancel:typedToken.downloadOperationCancelToken]; + if (canceled) { + [self.URLOperations removeObjectForKey:typedToken.url]; + } + }); } - (id)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { @@ -186,25 +188,29 @@ return nil; } - SDWebImageDownloaderOperation *operation = self.URLOperations[url]; - if (!operation) { - operation = createCallback(); - self.URLOperations[url] = operation; + __block _SDWebImageDownloaderToken *token = nil; - __weak SDWebImageDownloaderOperation *woperation = operation; - operation.completionBlock = ^{ - SDWebImageDownloaderOperation *soperation = woperation; - if (!soperation) return; - if (self.URLOperations[url] == soperation) { - [self.URLOperations removeObjectForKey:url]; - }; - }; - } - id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; + dispatch_barrier_sync(self.barrierQueue, ^{ + SDWebImageDownloaderOperation *operation = self.URLOperations[url]; + if (!operation) { + operation = createCallback(); + self.URLOperations[url] = operation; - _SDWebImageDownloaderToken *token = [_SDWebImageDownloaderToken new]; - token.url = url; - token.downloadOperationCancelToken = downloadOperationCancelToken; + __weak SDWebImageDownloaderOperation *woperation = operation; + operation.completionBlock = ^{ + SDWebImageDownloaderOperation *soperation = woperation; + if (!soperation) return; + if (self.URLOperations[url] == soperation) { + [self.URLOperations removeObjectForKey:url]; + }; + }; + } + id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; + + token = [_SDWebImageDownloaderToken new]; + token.url = url; + token.downloadOperationCancelToken = downloadOperationCancelToken; + }); return token; } diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 711e2a32..8d5f8feb 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -29,6 +29,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; @property (strong, nonatomic) NSMutableData *imageData; @property (strong, nonatomic) NSURLConnection *connection; @property (strong, atomic) NSThread *thread; +@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; #if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; @@ -57,26 +58,46 @@ static NSString *const kCompletedCallbackKey = @"completed"; _finished = NO; _expectedSize = 0; responseFromCached = YES; // Initially wrong until `connection:willCacheResponse:` is called or not called + _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationBarrierQueue", DISPATCH_QUEUE_CONCURRENT); } return self; } +- (void)dealloc { + SDDispatchQueueRelease(_barrierQueue); +} + - (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { NSMutableDictionary *callbacks = [NSMutableDictionary new]; if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; - [self.callbackBlocks addObject:callbacks]; + dispatch_barrier_async(self.barrierQueue, ^{ + [self.callbackBlocks addObject:callbacks]; + }); + return callbacks; +} + +- (NSArray *)callbacksForKey:(NSString *)key { + __block NSArray *callbacks = nil; + dispatch_sync(self.barrierQueue, ^{ + callbacks = [self.callbackBlocks valueForKey:key]; + }); return callbacks; } - (BOOL)cancel:(id)token { - [self.callbackBlocks removeObjectIdenticalTo:token]; - if (self.callbackBlocks.count == 0) { + __block BOOL shouldCancel = NO; + dispatch_barrier_sync(self.barrierQueue, ^{ + [self.callbackBlocks removeObjectIdenticalTo:token]; + if (self.callbackBlocks.count == 0) { + shouldCancel = YES; + } + }); + if (shouldCancel) { [self cancel]; - return YES; } - return NO; + return shouldCancel; } - (void)start { @@ -114,7 +135,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; [self.connection start]; if (self.connection) { - for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { progressBlock(0, NSURLResponseUnknownLength); } dispatch_async(dispatch_get_main_queue(), ^{ @@ -137,7 +158,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; } } else { - for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); } } @@ -198,7 +219,9 @@ static NSString *const kCompletedCallbackKey = @"completed"; } - (void)reset { - [self.callbackBlocks removeAllObjects]; + dispatch_barrier_async(self.barrierQueue, ^{ + [self.callbackBlocks removeAllObjects]; + }); self.connection = nil; self.imageData = nil; self.thread = nil; @@ -228,7 +251,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; - for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { progressBlock(0, expected); } @@ -252,7 +275,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; }); - for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); } CFRunLoopStop(CFRunLoopGetCurrent()); @@ -330,7 +353,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; } CGImageRelease(partialImageRef); dispatch_main_sync_safe(^{ - for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { completedBlock(image, nil, nil, NO); } }); @@ -340,7 +363,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; CFRelease(imageSource); } - for (SDWebImageDownloaderProgressBlock progressBlock in [self.callbackBlocks valueForKey:kProgressCallbackKey]) { + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { progressBlock(self.imageData.length, self.expectedSize); } } @@ -373,7 +396,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; } - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { - NSArray *completionBlocks = [[self.callbackBlocks valueForKey:kCompletedCallbackKey] copy]; + NSArray *completionBlocks = [[self callbacksForKey:kCompletedCallbackKey] copy]; @synchronized(self) { CFRunLoopStop(CFRunLoopGetCurrent()); self.thread = nil; @@ -431,7 +454,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; }); } - for (SDWebImageDownloaderCompletedBlock completedBlock in [self.callbackBlocks valueForKey:kCompletedCallbackKey]) { + for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { completedBlock(nil, nil, error, YES); } self.completionBlock = nil; From a02aa422560b97d5222a8a5a4b43ea3b8ca257c9 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Mon, 15 Sep 2014 12:03:50 +0100 Subject: [PATCH 011/207] Switch to Xcode 6 async tests --- Tests/Tests/SDWebImageDownloaderTests.m | 40 +++++-------------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index 27cece8f..233711fa 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -32,21 +32,9 @@ [super tearDown]; } -- (BOOL)spinRunLoopWithTimeout:(NSTimeInterval)timeout untilBlockIsTrue:(BOOL(^)())block { - CFTimeInterval timeoutDate = CACurrentMediaTime() + 5.; - while (true) { - if (block()) { - return YES; - } - if (CACurrentMediaTime() > timeoutDate) { - return NO; - } - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1., true); - } - return NO; -} - - (void)testThatDownloadingSameURLTwiceAndCancellingFirstWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; + NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL @@ -57,27 +45,22 @@ }]; expect(token1).toNot.beNil(); - __block BOOL success = NO; id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - success = YES; + [expectation fulfill]; }]; expect(token2).toNot.beNil(); [[SDWebImageDownloader sharedDownloader] cancel:token1]; - success = [self spinRunLoopWithTimeout:5. untilBlockIsTrue:^BOOL{ - return success; - }]; - - if (!success) { - XCTFail(@"Failed to download image"); - } + [self waitForExpectationsWithTimeout:5. handler:nil]; } - (void)testThatCancelingDownloadThenRequestingAgainWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; + NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL @@ -90,22 +73,15 @@ [[SDWebImageDownloader sharedDownloader] cancel:token1]; - __block BOOL success = NO; id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - success = YES; + [expectation fulfill]; }]; expect(token2).toNot.beNil(); - success = [self spinRunLoopWithTimeout:5. untilBlockIsTrue:^BOOL{ - return success; - }]; - - if (!success) { - XCTFail(@"Failed to download image"); - } + [self waitForExpectationsWithTimeout:5. handler:nil]; } @end From 91fcbb635c08d293fe0f01069401daa9b85e1533 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Thu, 8 Jan 2015 22:09:35 +0000 Subject: [PATCH 012/207] Fix issue where progress block is [NSNull null] and that tries to be executed --- SDWebImage/SDWebImageDownloaderOperation.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 8d5f8feb..51f83a8a 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -79,9 +79,11 @@ static NSString *const kCompletedCallbackKey = @"completed"; } - (NSArray *)callbacksForKey:(NSString *)key { - __block NSArray *callbacks = nil; + __block NSMutableArray *callbacks = nil; dispatch_sync(self.barrierQueue, ^{ - callbacks = [self.callbackBlocks valueForKey:key]; + // We need to remove [NSNull null] because there might not always be a progress block for each callback + callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; + [callbacks removeObjectIdenticalTo:[NSNull null]]; }); return callbacks; } From c2173c1e759d8bb5a70f88f13f48d64fcd5f1534 Mon Sep 17 00:00:00 2001 From: jiangliancheng Date: Fri, 15 Jan 2016 23:47:25 +0800 Subject: [PATCH 013/207] add animated webP support --- SDWebImage.xcodeproj/project.pbxproj | 12 ++++ SDWebImage/UIImage+WebP.m | 97 +++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index c570bc2c..f563d8e1 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -173,6 +173,7 @@ 5D5B9145188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; 5D5B9146188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; 5D5B9147188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; + 750C1B8E1C494AB000DC00B9 /* demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 750C1B8A1C49491900DC00B9 /* demux.c */; }; A18A6CC7172DC28500419892 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; A18A6CC8172DC28500419892 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; A18A6CC9172DC28500419892 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; @@ -316,6 +317,7 @@ 53FB894814D35E9E0020B787 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ImageContentType.h"; sourceTree = ""; }; 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ImageContentType.m"; sourceTree = ""; }; + 750C1B8A1C49491900DC00B9 /* demux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = demux.c; sourceTree = ""; }; A18A6CC5172DC28500419892 /* UIImage+GIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+GIF.h"; sourceTree = ""; }; A18A6CC6172DC28500419892 /* UIImage+GIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+GIF.m"; sourceTree = ""; }; AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+WebCacheOperation.h"; sourceTree = ""; }; @@ -571,6 +573,14 @@ name = Utils; sourceTree = ""; }; + 750C1B891C49491900DC00B9 /* demux */ = { + isa = PBXGroup; + children = ( + 750C1B8A1C49491900DC00B9 /* demux.c */, + ); + path = demux; + sourceTree = ""; + }; DA577C121998E60B007367ED /* libwebp */ = { isa = PBXGroup; children = ( @@ -583,6 +593,7 @@ DA577C4F1998E60B007367ED /* src */ = { isa = PBXGroup; children = ( + 750C1B891C49491900DC00B9 /* demux */, DA577D5A1998E6B2007367ED /* dec */, DA577C651998E60B007367ED /* dsp */, DA577CA71998E60B007367ED /* utils */, @@ -1134,6 +1145,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 750C1B8E1C494AB000DC00B9 /* demux.c in Sources */, DA577D101998E60B007367ED /* upsampling_neon.c in Sources */, DA577D151998E60B007367ED /* yuv_sse2.c in Sources */, DA577D111998E60B007367ED /* upsampling_sse2.c in Sources */, diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index f27a1b6f..f5effec7 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -11,8 +11,12 @@ #if !COCOAPODS #import "webp/decode.h" +#import "webp/mux_types.h" +#import "webp/demux.h" #else #import "libwebp/webp/decode.h" +#import "libwebp/webpc/mux_types.h" +#import "libwebp/webp/demux.h" #endif // Callback for CGDataProviderRelease @@ -24,12 +28,101 @@ static void FreeImageData(void *info, const void *data, size_t size) @implementation UIImage (WebP) + (UIImage *)sd_imageWithWebPData:(NSData *)data { + if (!data) { + return nil; + } + + WebPData webpData; + WebPDataInit(&webpData); + webpData.bytes = data.bytes; + webpData.size = data.length; + WebPDemuxer *demuxer = WebPDemux(&webpData); + if (!demuxer) { + return nil; + } + + uint32_t flags = WebPDemuxGetI(demuxer, WEBP_FF_FORMAT_FLAGS); + if (!(flags & ANIMATION_FLAG)) { + // for static single webp image + UIImage *staticImage = [self sd_rawWepImageWithData:webpData]; + WebPDemuxDelete(demuxer); + return staticImage; + } + + WebPIterator iter; + if (!WebPDemuxGetFrame(demuxer, 1, &iter)) { + WebPDemuxReleaseIterator(&iter); + WebPDemuxDelete(demuxer); + return nil; + } + + NSMutableArray *images = [NSMutableArray array]; + NSTimeInterval duration = 0; + + do { + UIImage *image; + if (iter.blend_method == WEBP_MUX_BLEND) { + image = [self sd_blendWebpImageWithOriginImage:[images lastObject] iterator:iter]; + } else { + image = [self sd_rawWepImageWithData:iter.fragment]; + } + + if (!image) { + continue; + } + + [images addObject:image]; + duration += iter.duration / 1000.0f; + + } while (WebPDemuxNextFrame(&iter)); + + WebPDemuxReleaseIterator(&iter); + WebPDemuxDelete(demuxer); + UIImage *animateImage = [UIImage animatedImageWithImages:images duration:duration]; + return animateImage; +} + + ++ (UIImage *)sd_blendWebpImageWithOriginImage:(UIImage *)originImage iterator:(WebPIterator)iter +{ + if (!originImage) { + return nil; + } + + CGSize size = originImage.size; + CGFloat tmpX = iter.x_offset; + CGFloat tmpY = size.height - iter.height - iter.y_offset; + CGRect imageRect = CGRectMake(tmpX, tmpY, iter.width, iter.height); + + UIImage *image = [self sd_rawWepImageWithData:iter.fragment]; + if (!image) { + return nil; + } + + CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); + uint32_t bitmapInfo = iter.has_alpha ? kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast : 0; + CGContextRef blendCanvas = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpaceRef, bitmapInfo); + CGContextDrawImage(blendCanvas, CGRectMake(0, 0, size.width, size.height), originImage.CGImage); + CGContextDrawImage(blendCanvas, imageRect, image.CGImage); + CGImageRef newImageRef = CGBitmapContextCreateImage(blendCanvas); + + image = [UIImage imageWithCGImage:newImageRef]; + + CGImageRelease(newImageRef); + CGContextRelease(blendCanvas); + CGColorSpaceRelease(colorSpaceRef); + + return image; +} + ++ (UIImage *)sd_rawWepImageWithData:(WebPData)webpData +{ WebPDecoderConfig config; if (!WebPInitDecoderConfig(&config)) { return nil; } - if (WebPGetFeatures(data.bytes, data.length, &config.input) != VP8_STATUS_OK) { + if (WebPGetFeatures(webpData.bytes, webpData.size, &config.input) != VP8_STATUS_OK) { return nil; } @@ -37,7 +130,7 @@ static void FreeImageData(void *info, const void *data, size_t size) config.options.use_threads = 1; // Decode the WebP image data into a RGBA value array. - if (WebPDecode(data.bytes, data.length, &config) != VP8_STATUS_OK) { + if (WebPDecode(webpData.bytes, webpData.size, &config) != VP8_STATUS_OK) { return nil; } From 1aefd45a6b5d07935935fdc0778d1cfdc59f4919 Mon Sep 17 00:00:00 2001 From: jiangliancheng Date: Fri, 15 Jan 2016 23:48:44 +0800 Subject: [PATCH 014/207] add example for animated webP --- Examples/SDWebImage Demo/MasterViewController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 27dc465d..01af755d 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -40,6 +40,8 @@ @"http://assets.sbnation.com/assets/2512203/dogflops.gif", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test9.webp", + @"http://littlesvr.ca/apng/images/SteamEngine.webp", + @"http://littlesvr.ca/apng/images/world-cup-2014-42.webp", @"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705", @"http://static2.dmcdn.net/static/video/629/228/44822926:jpeg_preview_small.jpg?20120509181018", @"http://static2.dmcdn.net/static/video/116/367/44763611:jpeg_preview_small.jpg?20120509101749", From 20f8be7c3a0184a3a1ab76662be0c1898d389c1f Mon Sep 17 00:00:00 2001 From: jiangliancheng <1193244269@qq.com> Date: Mon, 18 Jan 2016 18:35:51 +0800 Subject: [PATCH 015/207] fix syntax bug --- SDWebImage/UIImage+WebP.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index f5effec7..0be6e12a 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -15,7 +15,7 @@ #import "webp/demux.h" #else #import "libwebp/webp/decode.h" -#import "libwebp/webpc/mux_types.h" +#import "libwebp/webp/mux_types.h" #import "libwebp/webp/demux.h" #endif From 8826031a9145cc94f66e433ea0c4e7681054e972 Mon Sep 17 00:00:00 2001 From: Mikael Date: Fri, 5 Feb 2016 15:32:18 +0900 Subject: [PATCH 016/207] Updated dispatch_ macro in order to avoid redefinition when included as Pod --- SDWebImage/SDWebImageCompat.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index 3c21b413..c0e0a807 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -57,16 +57,20 @@ typedef void(^SDWebImageNoParamsBlock)(); extern NSString *const SDWebImageErrorDomain; +#ifndef dispatch_main_sync_safe #define dispatch_main_sync_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } else {\ dispatch_sync(dispatch_get_main_queue(), block);\ } +#endif +#ifndef dispatch_main_async_safe #define dispatch_main_async_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } else {\ dispatch_async(dispatch_get_main_queue(), block);\ } +#endif From 0384a059c4bc23e69907edae19ab1f666e04d25b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 31 Oct 2014 19:12:42 +0200 Subject: [PATCH 017/207] Fixed #774 - remove deprecated methods. Since 4.0 is a major release, we don't need the backwards compatible methods Conflicts: SDWebImage/UIImageView+WebCache.h SDWebImage/UIImageView+WebCache.m --- SDWebImage/MKAnnotationView+WebCache.h | 17 ---- SDWebImage/MKAnnotationView+WebCache.m | 49 ---------- SDWebImage/NSData+ImageContentType.h | 7 -- SDWebImage/NSData+ImageContentType.m | 9 -- SDWebImage/SDWebImageManager.h | 21 ----- SDWebImage/SDWebImageManager.m | 18 ---- SDWebImage/UIButton+WebCache.h | 27 ------ SDWebImage/UIButton+WebCache.m | 94 -------------------- SDWebImage/UIImageView+HighlightedWebCache.h | 13 --- SDWebImage/UIImageView+HighlightedWebCache.m | 41 --------- SDWebImage/UIImageView+WebCache.h | 24 ----- SDWebImage/UIImageView+WebCache.m | 69 -------------- 12 files changed, 389 deletions(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index f61f3c0b..175b13fb 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -105,20 +105,3 @@ - (void)sd_cancelCurrentImageLoad; @end - - -@interface MKAnnotationView (WebCacheDeprecated) - -- (NSURL *)imageURL __deprecated_msg("Use `sd_imageURL`"); - -- (void)setImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:`"); - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:completed:`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelCurrentImageLoad`"); - -@end diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index f7031657..d8209d05 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -84,52 +84,3 @@ static char imageURLKey; } @end - - -@implementation MKAnnotationView (WebCacheDeprecated) - -- (NSURL *)imageURL { - return [self sd_imageURL]; -} - -- (void)setImageWithURL:(NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentImageLoad { - [self sd_cancelCurrentImageLoad]; -} - -@end diff --git a/SDWebImage/NSData+ImageContentType.h b/SDWebImage/NSData+ImageContentType.h index 69c76dc7..f6d452f0 100644 --- a/SDWebImage/NSData+ImageContentType.h +++ b/SDWebImage/NSData+ImageContentType.h @@ -17,10 +17,3 @@ + (NSString *)sd_contentTypeForImageData:(NSData *)data; @end - - -@interface NSData (ImageContentTypeDeprecated) - -+ (NSString *)contentTypeForImageData:(NSData *)data __deprecated_msg("Use `sd_contentTypeForImageData:`"); - -@end diff --git a/SDWebImage/NSData+ImageContentType.m b/SDWebImage/NSData+ImageContentType.m index 0941cfaa..f073fb08 100644 --- a/SDWebImage/NSData+ImageContentType.m +++ b/SDWebImage/NSData+ImageContentType.m @@ -38,12 +38,3 @@ } @end - - -@implementation NSData (ImageContentTypeDeprecated) - -+ (NSString *)contentTypeForImageData:(NSData *)data { - return [self sd_contentTypeForImageData:data]; -} - -@end diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 8750730a..6f26b9f6 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -275,24 +275,3 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; - (NSString *)cacheKeyForURL:(NSURL *)url; @end - - -#pragma mark - Deprecated - -typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionBlock`"); -typedef void(^SDWebImageCompletedWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionWithFinishedBlock`"); - - -@interface SDWebImageManager (Deprecated) - -/** - * Downloads the image at the given URL if not present in cache or return the cached version otherwise. - * - * @deprecated This method has been deprecated. Use `downloadImageWithURL:options:progress:completed:` - */ -- (id )downloadWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletedWithFinishedBlock)completedBlock __deprecated_msg("Method deprecated. Use `downloadImageWithURL:options:progress:completed:`"); - -@end diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index c804ee9a..be91bee8 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -350,21 +350,3 @@ } @end - - -@implementation SDWebImageManager (Deprecated) - -// deprecated method, uses the non deprecated method -// adapter for the completion block -- (id )downloadWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedWithFinishedBlock)completedBlock { - return [self downloadImageWithURL:url - options:options - progress:progressBlock - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType, finished); - } - }]; -} - -@end diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index ecf5ced3..fa908bb6 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -200,30 +200,3 @@ - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state; @end - - -@interface UIButton (WebCacheDeprecated) - -- (NSURL *)currentImageURL __deprecated_msg("Use `sd_currentImageURL`"); -- (NSURL *)imageURLForState:(UIControlState)state __deprecated_msg("Use `sd_imageURLForState:`"); - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:`"); - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:completed:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:completed:`"); - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:`"); - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:completed:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:completed:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:completed:`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelImageLoadForState:`"); -- (void)cancelBackgroundImageLoadForState:(UIControlState)state __deprecated_msg("Use `sd_cancelBackgroundImageLoadForState:`"); - -@end diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index ce2175d2..1cf82efd 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -174,97 +174,3 @@ static char imageURLStorageKey; } @end - - -@implementation UIButton (WebCacheDeprecated) - -- (NSURL *)currentImageURL { - return [self sd_currentImageURL]; -} - -- (NSURL *)imageURLForState:(UIControlState)state { - return [self sd_imageURLForState:state]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentImageLoad { - // in a backwards compatible manner, cancel for current state - [self sd_cancelImageLoadForState:self.state]; -} - -- (void)cancelBackgroundImageLoadForState:(UIControlState)state { - [self sd_cancelBackgroundImageLoadForState:state]; -} - -@end diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index c1d8feaf..bc94f7b0 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -85,16 +85,3 @@ - (void)sd_cancelCurrentHighlightedImageLoad; @end - - -@interface UIImageView (HighlightedWebCacheDeprecated) - -- (void)setHighlightedImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:completed:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:completed:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:progress:completed:`"); - -- (void)cancelCurrentHighlightedImageLoad __deprecated_msg("Use `sd_cancelCurrentHighlightedImageLoad`"); - -@end diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index 921134e5..7ec7ebe2 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -69,44 +69,3 @@ } @end - - -@implementation UIImageView (HighlightedWebCacheDeprecated) - -- (void)setHighlightedImageWithURL:(NSURL *)url { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:0 progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentHighlightedImageLoad { - [self sd_cancelCurrentHighlightedImageLoad]; -} - -@end diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 37ae1eb3..b057aa7f 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -189,27 +189,3 @@ - (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; @end - - -@interface UIImageView (WebCacheDeprecated) - -- (NSURL *)imageURL __deprecated_msg("Use `sd_imageURL`"); - -- (void)setImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options`"); - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:progress:completed:`"); - -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithPreviousCachedImageWithURL:placeholderImage:options:progress:completed:`"); - -- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs __deprecated_msg("Use `sd_setAnimationImagesWithURLs:`"); - -- (void)cancelCurrentArrayLoad __deprecated_msg("Use `sd_cancelCurrentAnimationImagesLoad`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelCurrentImageLoad`"); - -@end diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 889305b2..a9cdd96f 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -210,72 +210,3 @@ static char TAG_ACTIVITY_SHOW; } @end - - -@implementation UIImageView (WebCacheDeprecated) - -- (NSURL *)imageURL { - return [self sd_imageURL]; -} - -- (void)setImageWithURL:(NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_setImageWithPreviousCachedImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:completedBlock]; -} - -- (void)cancelCurrentArrayLoad { - [self sd_cancelCurrentAnimationImagesLoad]; -} - -- (void)cancelCurrentImageLoad { - [self sd_cancelCurrentImageLoad]; -} - -- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { - [self sd_setAnimationImagesWithURLs:arrayOfURLs]; -} - -@end From a32a1775c2e23c5ec0a36d45ec1b24fd79a59fdd Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 29 Jun 2015 22:42:08 +0300 Subject: [PATCH 018/207] Renamed SDWebImageManager `downloadImageWithURL:options:progress:completed:` to `loadImageWithURL:options:progress:completed:` as it makes more sense, since we check the cache first and download only if needed Conflicts: SDWebImage/UIImageView+WebCache.m --- README.md | 20 ++++++++-------- SDWebImage/MKAnnotationView+WebCache.m | 2 +- SDWebImage/SDWebImageManager.h | 24 ++++++++++---------- SDWebImage/SDWebImageManager.m | 2 +- SDWebImage/SDWebImagePrefetcher.m | 2 +- SDWebImage/UIButton+WebCache.m | 4 ++-- SDWebImage/UIImageView+HighlightedWebCache.m | 2 +- SDWebImage/UIImageView+WebCache.m | 4 ++-- Tests/Tests/SDWebImageManagerTests.m | 4 ++-- 9 files changed, 32 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 37771588..c7954cd8 100644 --- a/README.md +++ b/README.md @@ -95,16 +95,16 @@ Here is a simple example of how to use SDWebImageManager: ```objective-c SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager downloadImageWithURL:imageURL - options:0 - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - // progression tracking code - } - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; +[manager loadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + // progression tracking code + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; ``` ### Using Asynchronous Image Downloader Independently diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index d8209d05..7e982ede 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -46,7 +46,7 @@ static char imageURLKey; if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong MKAnnotationView *sself = wself; diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 6f26b9f6..4a9e6f38 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -138,14 +138,14 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * @code SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; +[manager loadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; * @endcode */ @@ -203,10 +203,10 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation */ -- (id )downloadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; +- (id )loadImageWithURL:(NSURL *)url + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; /** * Saves image to cache for given URL diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index be91bee8..61d958ad 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -107,7 +107,7 @@ }]; } -- (id )downloadImageWithURL:(NSURL *)url +- (id )loadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index f518d441..c66f995f 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -57,7 +57,7 @@ - (void)startPrefetchingAtIndex:(NSUInteger)index { if (index >= self.prefetchURLs.count) return; self.requestedCount++; - [self.manager downloadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [self.manager loadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!finished) return; self.finishedCount++; diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 1cf82efd..fd296506 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -69,7 +69,7 @@ static char imageURLStorageKey; self.imageURLStorage[@(state)] = url; __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIButton *sself = wself; @@ -117,7 +117,7 @@ static char imageURLStorageKey; if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIButton *sself = wself; diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index 7ec7ebe2..9cc10252 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -34,7 +34,7 @@ if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe (^ { diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index a9cdd96f..98ac480b 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -59,7 +59,7 @@ static char TAG_ACTIVITY_SHOW; } __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { [wself removeActivityIndicator]; if (!wself) return; dispatch_main_sync_safe(^{ @@ -113,7 +113,7 @@ static char TAG_ACTIVITY_SHOW; NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; for (NSURL *logoImageURL in arrayOfURLs) { - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIImageView *sself = wself; diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index 33bab743..e4069595 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -40,7 +40,7 @@ static int64_t kAsyncTestTimeout = 5; NSURL *originalImageURL = [NSURL URLWithString:@"https://www.google.gr/images/srpr/logo11w.png"]; - [[SDWebImageManager sharedManager] downloadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { expect(image).toNot.beNil(); expect(error).to.beNil(); expect(originalImageURL).to.equal(imageURL); @@ -57,7 +57,7 @@ static int64_t kAsyncTestTimeout = 5; NSURL *originalImageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.png"]; - [[SDWebImageManager sharedManager] downloadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { expect(image).to.beNil(); expect(error).toNot.beNil(); expect(originalImageURL).to.equal(imageURL); From 260a6f5234077051fccec7fc38ec4ffd7253d7d3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 21:59:15 +0300 Subject: [PATCH 019/207] Cleaning up the targets so they are easier to maintain. Right now the plan is to have: - SDWebImage target that build as a static library (all subspecs included) -> libSDWebImage.a - in the next step I will create "SDWebImageiOS" and "SDWebImagetvOS" targets that build as dynamic frameworks -> SDWebImageiOS.framework and SDWebImagetvOS.framework --- SDWebImage.xcodeproj/project.pbxproj | 791 ++++-------------- .../SDWebImage+MKAnnotation.xcscheme | 71 -- .../xcschemes/SDWebImage+WebP.xcscheme | 71 -- .../xcschemes/SDWebImageFramework.xcscheme | 71 -- 4 files changed, 178 insertions(+), 826 deletions(-) delete mode 100644 SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+MKAnnotation.xcscheme delete mode 100644 SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+WebP.xcscheme delete mode 100644 SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImageFramework.xcscheme diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index c570bc2c..2f476e0c 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -6,21 +6,6 @@ objectVersion = 46; objects = { -/* Begin PBXAggregateTarget section */ - 539F912B16316D2D00160719 /* SDWebImageFramework */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 539F912C16316D2D00160719 /* Build configuration list for PBXAggregateTarget "SDWebImageFramework" */; - buildPhases = ( - 539F913116316D7A00160719 /* Build Framework */, - ); - dependencies = ( - 539F913016316D3700160719 /* PBXTargetDependency */, - ); - name = SDWebImageFramework; - productName = SDWebImageFramework; - }; -/* End PBXAggregateTarget section */ - /* Begin PBXBuildFile section */ 00733A541BC4880000A5A117 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; 00733A551BC4880000A5A117 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; @@ -54,6 +39,86 @@ 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A731BC4880E00A5A117 /* WebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431738781CDFC2580008FEB9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 431738791CDFC2580008FEB9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 4317387A1CDFC2580008FEB9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 4317387B1CDFC2580008FEB9 /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 4317387C1CDFC2580008FEB9 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 4317387D1CDFC2580008FEB9 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 4317387E1CDFC2580008FEB9 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 4317387F1CDFC2580008FEB9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 431738801CDFC2580008FEB9 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 431738811CDFC2580008FEB9 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 431738821CDFC2580008FEB9 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 431738831CDFC2580008FEB9 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 431738841CDFC2580008FEB9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 431738851CDFC2580008FEB9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 431738861CDFC2580008FEB9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 431738871CDFC25E0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 431738881CDFC25E0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 431738891CDFC25E0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 4317388A1CDFC25E0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 4317388B1CDFC25E0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 4317388C1CDFC25E0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 4317388D1CDFC25E0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 4317388E1CDFC25E0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 4317388F1CDFC25E0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 431738901CDFC25E0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 431738911CDFC25E0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 431738921CDFC25E0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 431738931CDFC25E0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 431738941CDFC25E0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 431738951CDFC25E0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 431738961CDFC25E0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 431738971CDFC25E0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 431738981CDFC25E0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 431738991CDFC25E0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 4317389A1CDFC25E0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 4317389B1CDFC25E0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 4317389C1CDFC25E0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 4317389D1CDFC25E0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 4317389E1CDFC25E0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 4317389F1CDFC25E0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 431738A01CDFC25E0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 431738A11CDFC25E0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 431738A21CDFC25E0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 431738A41CDFC2630008FEB9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 431738A51CDFC2630008FEB9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 431738A61CDFC2630008FEB9 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 431738A71CDFC2630008FEB9 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 431738A81CDFC2630008FEB9 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 431738A91CDFC2630008FEB9 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 431738AA1CDFC2630008FEB9 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 431738AB1CDFC2630008FEB9 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 431738AC1CDFC2630008FEB9 /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 431738AD1CDFC2630008FEB9 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 431738AE1CDFC2630008FEB9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 431738AF1CDFC2630008FEB9 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 431738B01CDFC2630008FEB9 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 431738B11CDFC2630008FEB9 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 431738B21CDFC2630008FEB9 /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 431738B31CDFC2630008FEB9 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 431738B41CDFC2630008FEB9 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 431738B51CDFC2630008FEB9 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 431738B61CDFC2630008FEB9 /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; + 431738B71CDFC2630008FEB9 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 431738B81CDFC2630008FEB9 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 431738B91CDFC2630008FEB9 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 431738BA1CDFC2630008FEB9 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 431738BB1CDFC2630008FEB9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 431738BC1CDFC2630008FEB9 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 431738BD1CDFC2660008FEB9 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 431738BE1CDFC2660008FEB9 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 431738BF1CDFC2660008FEB9 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 431738C01CDFC2660008FEB9 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 431738C11CDFC2660008FEB9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 431738C21CDFC2660008FEB9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 431738C31CDFC2660008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; + 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; 4A2CAE041AB4BB5400B6BC39 /* WebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; @@ -89,31 +154,8 @@ 4A2CAE371AB4BB7500B6BC39 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE381AB4BB7500B6BC39 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; 530E49E816464C25002868E7 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 530E49E916464C26002868E7 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 530E49EA16464C7C002868E7 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 530E49EB16464C7F002868E7 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 530E49EC16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; - 530E49ED16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; - 531041C4157EAFA400BBABC3 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; - 531041C5157EAFA400BBABC3 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; - 531041C6157EAFA400BBABC3 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; - 531041C7157EAFA400BBABC3 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; - 531041C8157EAFA400BBABC3 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; - 531041C9157EAFA400BBABC3 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; - 531041CA157EAFA400BBABC3 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; - 531041CB157EAFA400BBABC3 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; - 531041CD157EAFA400BBABC3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB894814D35E9E0020B787 /* UIKit.framework */; }; - 531041CE157EAFA400BBABC3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53922D72148C55820056699D /* Foundation.framework */; }; - 531041CF157EAFA400BBABC3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB893F14D35D1A0020B787 /* CoreGraphics.framework */; }; - 531041D1157EAFA400BBABC3 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041D3157EAFA400BBABC3 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041D4157EAFA400BBABC3 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041D5157EAFA400BBABC3 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041D7157EAFA400BBABC3 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041D9157EAFA400BBABC3 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041DA157EAFA400BBABC3 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041DB157EAFA400BBABC3 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 531041DC157EAFA400BBABC3 /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53406750167780C40042B59E /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; 53761309155AD0D5005750A4 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; 5376130A155AD0D5005750A4 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; @@ -133,151 +175,18 @@ 5376131E155AD0D5005750A4 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5376131F155AD0D5005750A4 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53761320155AD0D5005750A4 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D957517ECC1FE0097C263 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; - 537D957617ECC1FE0097C263 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; - 537D957717ECC1FE0097C263 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; - 537D957817ECC1FE0097C263 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; - 537D957917ECC1FE0097C263 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; - 537D957A17ECC1FE0097C263 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; - 537D957B17ECC1FE0097C263 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; - 537D957C17ECC1FE0097C263 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; - 537D957D17ECC1FE0097C263 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; - 537D957E17ECC1FE0097C263 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; - 537D958017ECC1FE0097C263 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; - 537D958117ECC1FE0097C263 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; - 537D959C17ECC1FE0097C263 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB894814D35E9E0020B787 /* UIKit.framework */; }; - 537D959D17ECC1FE0097C263 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53922D72148C55820056699D /* Foundation.framework */; }; - 537D959E17ECC1FE0097C263 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB893F14D35D1A0020B787 /* CoreGraphics.framework */; }; - 537D95A017ECC1FE0097C263 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A117ECC1FE0097C263 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A217ECC1FE0097C263 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A317ECC1FE0097C263 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A417ECC1FE0097C263 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A517ECC1FE0097C263 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A617ECC1FE0097C263 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A717ECC1FE0097C263 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A817ECC1FE0097C263 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95A917ECC1FE0097C263 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537D95AA17ECC1FE0097C263 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; - 537D95AC17ECC1FE0097C263 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; }; - 537D95AD17ECC1FE0097C263 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; }; 53EDFB8A17623F7C00698166 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; }; - 53EDFB8B17623F7C00698166 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; }; 53EDFB8C17623F7C00698166 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; - 53EDFB8D17623F7C00698166 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; - 53EDFB941762547D00698166 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; }; - 53EDFB961762547D00698166 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; 5D5B9142188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; }; - 5D5B9143188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; }; - 5D5B9144188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; }; 5D5B9145188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; - 5D5B9146188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; - 5D5B9147188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; A18A6CC7172DC28500419892 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; - A18A6CC8172DC28500419892 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; A18A6CC9172DC28500419892 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; - A18A6CCA172DC28500419892 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; - AB615303192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; }; - AB615304192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; }; - AB615305192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; }; + AB615303192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; AB615306192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; - AB615307192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; - AB615308192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; ABBE71A718C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; ABBE71A818C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; - ABBE71A918C43B5800B75E91 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ABBE71AA18C43B5800B75E91 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ABBE71AB18C43B6000B75E91 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; - ABBE71AC18C43B6000B75E91 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; - DA577CFC1998E60B007367ED /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - DA577CFD1998E60B007367ED /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; - DA577CFE1998E60B007367ED /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; - DA577CFF1998E60B007367ED /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - DA577D001998E60B007367ED /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - DA577D011998E60B007367ED /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; - DA577D021998E60B007367ED /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - DA577D031998E60B007367ED /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; - DA577D041998E60B007367ED /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; - DA577D051998E60B007367ED /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; - DA577D061998E60B007367ED /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; - DA577D071998E60B007367ED /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - DA577D081998E60B007367ED /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; - DA577D091998E60B007367ED /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; - DA577D0A1998E60B007367ED /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; - DA577D0B1998E60B007367ED /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; - DA577D0C1998E60B007367ED /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - DA577D0D1998E60B007367ED /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - DA577D0E1998E60B007367ED /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; - DA577D0F1998E60B007367ED /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; - DA577D101998E60B007367ED /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; - DA577D111998E60B007367ED /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; - DA577D121998E60B007367ED /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; - DA577D131998E60B007367ED /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; - DA577D141998E60B007367ED /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; - DA577D151998E60B007367ED /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; - DA577D161998E60B007367ED /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; - DA577D341998E60B007367ED /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; - DA577D351998E60B007367ED /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; - DA577D361998E60B007367ED /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; - DA577D371998E60B007367ED /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; - DA577D381998E60B007367ED /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; - DA577D391998E60B007367ED /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; - DA577D3A1998E60B007367ED /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; - DA577D3B1998E60B007367ED /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; - DA577D3C1998E60B007367ED /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; - DA577D3D1998E60B007367ED /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; - DA577D3E1998E60B007367ED /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; - DA577D3F1998E60B007367ED /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; - DA577D401998E60B007367ED /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; - DA577D411998E60B007367ED /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; - DA577D421998E60B007367ED /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; - DA577D431998E60B007367ED /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; - DA577D441998E60B007367ED /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; - DA577D451998E60B007367ED /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; - DA577D461998E60B007367ED /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; - DA577D471998E60B007367ED /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; - DA577D481998E60B007367ED /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; - DA577D491998E60B007367ED /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; - DA577D4A1998E60B007367ED /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; - DA577D4B1998E60B007367ED /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; - DA577D4C1998E60B007367ED /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; - DA577D4D1998E60B007367ED /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; - DA577D4E1998E60B007367ED /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; - DA577D4F1998E60B007367ED /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; - DA577D501998E60B007367ED /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; - DA577D511998E60B007367ED /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; - DA577D521998E60B007367ED /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; - DA577D531998E60B007367ED /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; - DA577D541998E60B007367ED /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; - DA577D6B1998E6B2007367ED /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; - DA577D6C1998E6B2007367ED /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; - DA577D6D1998E6B2007367ED /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; - DA577D6E1998E6B2007367ED /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; - DA577D6F1998E6B2007367ED /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; - DA577D701998E6B2007367ED /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; - DA577D711998E6B2007367ED /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; - DA577D721998E6B2007367ED /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; - DA577D731998E6B2007367ED /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; - DA577D741998E6B2007367ED /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; - DA577D751998E6B2007367ED /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; - DA577D761998E6B2007367ED /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; - DA577D771998E6B2007367ED /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; - DA577D781998E6B2007367ED /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; - DA577D791998E6B2007367ED /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; - DAC075D21A08CBDA002E5D32 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; - DAFAA6C219485CAA00581B9E /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 539F912F16316D3700160719 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 53922D66148C55810056699D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 53761307155AD0D5005750A4; - remoteInfo = "SDWebImage ARC"; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 00733A4C1BC487C000A5A117 /* WebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -286,12 +195,10 @@ 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderOperation.h; sourceTree = ""; }; 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderOperation.m; sourceTree = ""; }; 530E49E71646388E002868E7 /* SDWebImageOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImageOperation.h; sourceTree = ""; }; - 531041E0157EAFA400BBABC3 /* libSDWebImage+MKAnnotation.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage+MKAnnotation.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5340674F167780C40042B59E /* SDWebImageCompat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCompat.m; sourceTree = ""; }; 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+WebCache.h"; path = "SDWebImage/MKAnnotationView+WebCache.h"; sourceTree = SOURCE_ROOT; }; 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+WebCache.m"; path = "SDWebImage/MKAnnotationView+WebCache.m"; sourceTree = SOURCE_ROOT; }; 53761325155AD0D5005750A4 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 537D95C117ECC1FE0097C263 /* libSDWebImage+WebP.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage+WebP.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 53922D72148C55820056699D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 53922D85148C56230056699D /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = SOURCE_ROOT; }; 53922D86148C56230056699D /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = SOURCE_ROOT; }; @@ -415,16 +322,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 531041CC157EAFA400BBABC3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 531041CD157EAFA400BBABC3 /* UIKit.framework in Frameworks */, - 531041CE157EAFA400BBABC3 /* Foundation.framework in Frameworks */, - 531041CF157EAFA400BBABC3 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 53761311155AD0D5005750A4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -435,16 +332,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 537D959B17ECC1FE0097C263 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 537D959C17ECC1FE0097C263 /* UIKit.framework in Frameworks */, - 537D959D17ECC1FE0097C263 /* Foundation.framework in Frameworks */, - 537D959E17ECC1FE0097C263 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -480,8 +367,6 @@ isa = PBXGroup; children = ( 53761325155AD0D5005750A4 /* libSDWebImage.a */, - 531041E0157EAFA400BBABC3 /* libSDWebImage+MKAnnotation.a */, - 537D95C117ECC1FE0097C263 /* libSDWebImage+WebP.a */, 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */, 00733A4C1BC487C000A5A117 /* WebImage.framework */, ); @@ -747,103 +632,58 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 531041D0157EAFA400BBABC3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 531041D1157EAFA400BBABC3 /* SDImageCache.h in Headers */, - 531041D3157EAFA400BBABC3 /* SDWebImageCompat.h in Headers */, - 531041D4157EAFA400BBABC3 /* SDWebImageDecoder.h in Headers */, - 531041D5157EAFA400BBABC3 /* SDWebImageDownloader.h in Headers */, - 531041D7157EAFA400BBABC3 /* SDWebImageManager.h in Headers */, - 531041D9157EAFA400BBABC3 /* SDWebImagePrefetcher.h in Headers */, - 531041DA157EAFA400BBABC3 /* UIButton+WebCache.h in Headers */, - 531041DB157EAFA400BBABC3 /* UIImageView+WebCache.h in Headers */, - 531041DC157EAFA400BBABC3 /* MKAnnotationView+WebCache.h in Headers */, - 530E49E916464C26002868E7 /* SDWebImageOperation.h in Headers */, - 530E49EB16464C7F002868E7 /* SDWebImageDownloaderOperation.h in Headers */, - A18A6CC8172DC28500419892 /* UIImage+GIF.h in Headers */, - 53EDFB8B17623F7C00698166 /* UIImage+MultiFormat.h in Headers */, - ABBE71AA18C43B5800B75E91 /* UIImageView+HighlightedWebCache.h in Headers */, - 53EDFB941762547D00698166 /* UIImage+WebP.h in Headers */, - AB615305192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */, - 5D5B9144188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 53761315155AD0D5005750A4 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 431738C21CDFC2660008FEB9 /* mux_types.h in Headers */, + 431738BE1CDFC2660008FEB9 /* demux.h in Headers */, + 4317389A1CDFC25E0008FEB9 /* neon.h in Headers */, + 431738BC1CDFC2630008FEB9 /* utils.h in Headers */, + 431738B41CDFC2630008FEB9 /* quant_levels_dec.h in Headers */, + 431738A51CDFC2630008FEB9 /* bit_reader_inl.h in Headers */, + 431738961CDFC25E0008FEB9 /* lossless.h in Headers */, + 431738A91CDFC2630008FEB9 /* color_cache.h in Headers */, + 431738861CDFC2580008FEB9 /* webpi.h in Headers */, + 431738BF1CDFC2660008FEB9 /* encode.h in Headers */, + 431738A41CDFC2630008FEB9 /* bit_reader.h in Headers */, 53761316155AD0D5005750A4 /* SDImageCache.h in Headers */, + 431738B21CDFC2630008FEB9 /* quant_levels.h in Headers */, 5D5B9142188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */, + 431738C11CDFC2660008FEB9 /* mux.h in Headers */, + 431738AE1CDFC2630008FEB9 /* huffman.h in Headers */, 53761318155AD0D5005750A4 /* SDWebImageCompat.h in Headers */, + 431738841CDFC2580008FEB9 /* vp8li.h in Headers */, + 431738C31CDFC2660008FEB9 /* types.h in Headers */, + 431738BD1CDFC2660008FEB9 /* decode.h in Headers */, 53761319155AD0D5005750A4 /* SDWebImageDecoder.h in Headers */, 5376131A155AD0D5005750A4 /* SDWebImageDownloader.h in Headers */, 5376131C155AD0D5005750A4 /* SDWebImageManager.h in Headers */, + 431738A21CDFC25E0008FEB9 /* yuv_tables_sse2.h in Headers */, + 431738B01CDFC2630008FEB9 /* huffman_encode.h in Headers */, + 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */, 5376131E155AD0D5005750A4 /* SDWebImagePrefetcher.h in Headers */, + 431738A71CDFC2630008FEB9 /* bit_writer.h in Headers */, 5376131F155AD0D5005750A4 /* UIButton+WebCache.h in Headers */, + 431738BA1CDFC2630008FEB9 /* thread.h in Headers */, 53761320155AD0D5005750A4 /* UIImageView+WebCache.h in Headers */, + 431738AA1CDFC2630008FEB9 /* endian_inl.h in Headers */, + 4317388F1CDFC25E0008FEB9 /* dsp.h in Headers */, 530E49E816464C25002868E7 /* SDWebImageOperation.h in Headers */, 530E49EA16464C7C002868E7 /* SDWebImageDownloaderOperation.h in Headers */, ABBE71A718C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h in Headers */, + 431738791CDFC2580008FEB9 /* alphai.h in Headers */, + 431738C01CDFC2660008FEB9 /* format_constants.h in Headers */, + 431738B81CDFC2630008FEB9 /* rescaler.h in Headers */, + 4317389F1CDFC25E0008FEB9 /* yuv.h in Headers */, + 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */, + 431738821CDFC2580008FEB9 /* vp8i.h in Headers */, AB615303192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */, A18A6CC7172DC28500419892 /* UIImage+GIF.h in Headers */, + 431738AC1CDFC2630008FEB9 /* filters.h in Headers */, 53EDFB8A17623F7C00698166 /* UIImage+MultiFormat.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 537D959F17ECC1FE0097C263 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DA577D4B1998E60B007367ED /* thread.h in Headers */, - DA577D3F1998E60B007367ED /* huffman.h in Headers */, - DA577D4F1998E60B007367ED /* demux.h in Headers */, - 537D95A017ECC1FE0097C263 /* SDImageCache.h in Headers */, - DA577D381998E60B007367ED /* bit_writer.h in Headers */, - 537D95A117ECC1FE0097C263 /* SDWebImageCompat.h in Headers */, - 537D95A217ECC1FE0097C263 /* SDWebImageDecoder.h in Headers */, - 537D95A317ECC1FE0097C263 /* SDWebImageDownloader.h in Headers */, - 537D95A417ECC1FE0097C263 /* SDWebImageManager.h in Headers */, - DA577D541998E60B007367ED /* types.h in Headers */, - DA577D751998E6B2007367ED /* vp8i.h in Headers */, - DA577D411998E60B007367ED /* huffman_encode.h in Headers */, - 537D95A517ECC1FE0097C263 /* SDWebImagePrefetcher.h in Headers */, - 537D95A617ECC1FE0097C263 /* UIButton+WebCache.h in Headers */, - 537D95A717ECC1FE0097C263 /* UIImageView+WebCache.h in Headers */, - 537D95A817ECC1FE0097C263 /* SDWebImageOperation.h in Headers */, - 537D95A917ECC1FE0097C263 /* SDWebImageDownloaderOperation.h in Headers */, - DA577D531998E60B007367ED /* mux_types.h in Headers */, - 537D95AA17ECC1FE0097C263 /* UIImage+GIF.h in Headers */, - DA577D3A1998E60B007367ED /* color_cache.h in Headers */, - 537D95AC17ECC1FE0097C263 /* UIImage+MultiFormat.h in Headers */, - DA577D521998E60B007367ED /* mux.h in Headers */, - DA577D771998E6B2007367ED /* vp8li.h in Headers */, - 537D95AD17ECC1FE0097C263 /* UIImage+WebP.h in Headers */, - DA577D0E1998E60B007367ED /* neon.h in Headers */, - DA577D0A1998E60B007367ED /* lossless.h in Headers */, - DA577D791998E6B2007367ED /* webpi.h in Headers */, - DA577D351998E60B007367ED /* bit_reader.h in Headers */, - DA577D361998E60B007367ED /* bit_reader_inl.h in Headers */, - DA577D491998E60B007367ED /* rescaler.h in Headers */, - DA577D161998E60B007367ED /* yuv_tables_sse2.h in Headers */, - DA577D4E1998E60B007367ED /* decode.h in Headers */, - ABBE71A918C43B5800B75E91 /* UIImageView+HighlightedWebCache.h in Headers */, - AB615304192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */, - DA577D031998E60B007367ED /* dsp.h in Headers */, - DA577D6C1998E6B2007367ED /* alphai.h in Headers */, - 5D5B9143188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */, - DA577D501998E60B007367ED /* encode.h in Headers */, - DA577D451998E60B007367ED /* quant_levels_dec.h in Headers */, - DA577D471998E60B007367ED /* random.h in Headers */, - DA577D4D1998E60B007367ED /* utils.h in Headers */, - DA577D511998E60B007367ED /* format_constants.h in Headers */, - DA577D131998E60B007367ED /* yuv.h in Headers */, - DA577D431998E60B007367ED /* quant_levels.h in Headers */, - DA577D3B1998E60B007367ED /* endian_inl.h in Headers */, - DA577D3D1998E60B007367ED /* filters.h in Headers */, - DA577D6E1998E6B2007367ED /* decode_vp8.h in Headers */, + 4317387B1CDFC2580008FEB9 /* decode_vp8.h in Headers */, + 431738B61CDFC2630008FEB9 /* random.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -886,23 +726,6 @@ productReference = 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */; productType = "com.apple.product-type.framework"; }; - 531041C2157EAFA400BBABC3 /* SDWebImage+MKAnnotation */ = { - isa = PBXNativeTarget; - buildConfigurationList = 531041DD157EAFA400BBABC3 /* Build configuration list for PBXNativeTarget "SDWebImage+MKAnnotation" */; - buildPhases = ( - 531041C3157EAFA400BBABC3 /* Sources */, - 531041CC157EAFA400BBABC3 /* Frameworks */, - 531041D0157EAFA400BBABC3 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SDWebImage+MKAnnotation"; - productName = SDWebImage; - productReference = 531041E0157EAFA400BBABC3 /* libSDWebImage+MKAnnotation.a */; - productType = "com.apple.product-type.library.static"; - }; 53761307155AD0D5005750A4 /* SDWebImage */ = { isa = PBXNativeTarget; buildConfigurationList = 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage" */; @@ -921,24 +744,6 @@ productReference = 53761325155AD0D5005750A4 /* libSDWebImage.a */; productType = "com.apple.product-type.library.static"; }; - 537D957317ECC1FE0097C263 /* SDWebImage+WebP */ = { - isa = PBXNativeTarget; - buildConfigurationList = 537D95BE17ECC1FE0097C263 /* Build configuration list for PBXNativeTarget "SDWebImage+WebP" */; - buildPhases = ( - 537D957417ECC1FE0097C263 /* Sources */, - 537D959B17ECC1FE0097C263 /* Frameworks */, - 537D959F17ECC1FE0097C263 /* Headers */, - 537D95BD17ECC1FE0097C263 /* Prepare Framework */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SDWebImage+WebP"; - productName = SDWebImage; - productReference = 537D95C117ECC1FE0097C263 /* libSDWebImage+WebP.a */; - productType = "com.apple.product-type.library.static"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -969,9 +774,6 @@ projectRoot = ""; targets = ( 53761307155AD0D5005750A4 /* SDWebImage */, - 537D957317ECC1FE0097C263 /* SDWebImage+WebP */, - 531041C2157EAFA400BBABC3 /* SDWebImage+MKAnnotation */, - 539F912B16316D2D00160719 /* SDWebImageFramework */, 4A2CADFE1AB4BB5300B6BC39 /* WebImage */, 00733A4B1BC487C000A5A117 /* WebImage tvOS */, ); @@ -996,20 +798,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 537D95BD17ECC1FE0097C263 /* Prepare Framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Prepare Framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\nmkdir -p \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n# Link the \"Current\" version to \"A\"\n/bin/ln -sfh A \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\"\n/bin/ln -sfh Versions/Current/Headers \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\"\n/bin/ln -sfh \"Versions/Current/${PRODUCT_NAME}\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\"\n\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\n# cause propagating rebuilds of files that import these headers.\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n"; - }; 539F912A16316D0500160719 /* Prepare Framework */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1024,20 +812,6 @@ shellPath = /bin/sh; shellScript = "set -e\n\nmkdir -p \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n# Link the \"Current\" version to \"A\"\n/bin/ln -sfh A \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\"\n/bin/ln -sfh Versions/Current/Headers \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\"\n/bin/ln -sfh \"Versions/Current/${PRODUCT_NAME}\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\"\n\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\n# cause propagating rebuilds of files that import these headers.\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n"; }; - 539F913116316D7A00160719 /* Build Framework */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Build Framework"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\nset +u\n# Avoid recursively calling this script.\nif [[ $SF_MASTER_SCRIPT_RUNNING ]]\nthen\n exit 0\nfi\nset -u\nexport SF_MASTER_SCRIPT_RUNNING=1\n\nSF_TARGET_NAME=\"SDWebImage\"\nSF_EXECUTABLE_PATH=\"lib${SF_TARGET_NAME}.a\"\nSF_WRAPPER_NAME=\"${SF_TARGET_NAME}.framework\"\n\n# The following conditionals come from\n# https://github.com/kstenerud/iOS-Universal-Framework\n\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]\nthen\n SF_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\n echo \"Could not find platform name from SDK_NAME: $SDK_NAME\"\n exit 1\nfi\n\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]\nthen\n SF_SDK_VERSION=${BASH_REMATCH[1]}\nelse\n echo \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\n exit 1\nfi\n\nif [[ \"$SF_SDK_PLATFORM\" = \"iphoneos\" ]]\nthen\n SF_OTHER_PLATFORM=iphonesimulator\nelse\n SF_OTHER_PLATFORM=iphoneos\nfi\n\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$SF_SDK_PLATFORM$ ]]\nthen\n SF_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}\"\nelse\n echo \"Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR\"\n exit 1\nfi\n\n# Build the other platform.\nxcodebuild -project \"${PROJECT_FILE_PATH}\" -target \"${TARGET_NAME}\" -configuration \"${CONFIGURATION}\" -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR=\"${BUILD_DIR}\" OBJROOT=\"${OBJROOT}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\" $ACTION\n\n# Smash the two static libraries into one fat binary and store it in the .framework\nlipo -create \"${BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}\" \"${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}\" -output \"${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}\"\n\n# Copy the binary to the other architecture folder to have a complete framework in both.\ncp -a \"${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}\" \"${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/A/${SF_TARGET_NAME}\"\n"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1086,127 +860,76 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 531041C3157EAFA400BBABC3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 531041C4157EAFA400BBABC3 /* SDImageCache.m in Sources */, - 531041C5157EAFA400BBABC3 /* SDWebImageDecoder.m in Sources */, - 531041C6157EAFA400BBABC3 /* SDWebImageDownloader.m in Sources */, - 531041C7157EAFA400BBABC3 /* SDWebImageManager.m in Sources */, - 531041C8157EAFA400BBABC3 /* SDWebImagePrefetcher.m in Sources */, - 531041C9157EAFA400BBABC3 /* UIButton+WebCache.m in Sources */, - 531041CA157EAFA400BBABC3 /* UIImageView+WebCache.m in Sources */, - 531041CB157EAFA400BBABC3 /* MKAnnotationView+WebCache.m in Sources */, - 530E49ED16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */, - A18A6CCA172DC28500419892 /* UIImage+GIF.m in Sources */, - 53EDFB8D17623F7C00698166 /* UIImage+MultiFormat.m in Sources */, - 53EDFB961762547D00698166 /* UIImage+WebP.m in Sources */, - AB615308192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */, - ABBE71AC18C43B6000B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, - DAFAA6C219485CAA00581B9E /* SDWebImageCompat.m in Sources */, - 5D5B9147188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 53761308155AD0D5005750A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4317388A1CDFC25E0008FEB9 /* dec.c in Sources */, + 431738AD1CDFC2630008FEB9 /* huffman.c in Sources */, + 431738B11CDFC2630008FEB9 /* quant_levels.c in Sources */, + 4317387D1CDFC2580008FEB9 /* idec.c in Sources */, + 431738B51CDFC2630008FEB9 /* random.c in Sources */, + 431738871CDFC25E0008FEB9 /* alpha_processing_sse2.c in Sources */, 53761309155AD0D5005750A4 /* SDImageCache.m in Sources */, 5376130A155AD0D5005750A4 /* SDWebImageDecoder.m in Sources */, + 431738911CDFC25E0008FEB9 /* enc_avx2.c in Sources */, + 431738B71CDFC2630008FEB9 /* rescaler.c in Sources */, + 4317388E1CDFC25E0008FEB9 /* dec_sse2.c in Sources */, + 4317389C1CDFC25E0008FEB9 /* upsampling_neon.c in Sources */, + 4317387F1CDFC2580008FEB9 /* quant.c in Sources */, + 4317388C1CDFC25E0008FEB9 /* dec_mips32.c in Sources */, + 431738881CDFC25E0008FEB9 /* alpha_processing.c in Sources */, + 431738991CDFC25E0008FEB9 /* lossless_sse2.c in Sources */, + 431738941CDFC25E0008FEB9 /* enc_sse2.c in Sources */, + 431738B91CDFC2630008FEB9 /* thread.c in Sources */, 5376130B155AD0D5005750A4 /* SDWebImageDownloader.m in Sources */, + 431738AB1CDFC2630008FEB9 /* filters.c in Sources */, + 431738A01CDFC25E0008FEB9 /* yuv_mips32.c in Sources */, + 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */, + 431738801CDFC2580008FEB9 /* tree.c in Sources */, 5376130C155AD0D5005750A4 /* SDWebImageManager.m in Sources */, 5376130D155AD0D5005750A4 /* SDWebImagePrefetcher.m in Sources */, + 431738A11CDFC25E0008FEB9 /* yuv_sse2.c in Sources */, + 431738A81CDFC2630008FEB9 /* color_cache.c in Sources */, + 431738971CDFC25E0008FEB9 /* lossless_mips32.c in Sources */, 5376130E155AD0D5005750A4 /* UIButton+WebCache.m in Sources */, + 431738921CDFC25E0008FEB9 /* enc_mips32.c in Sources */, + 431738B31CDFC2630008FEB9 /* quant_levels_dec.c in Sources */, + 431738831CDFC2580008FEB9 /* vp8l.c in Sources */, + 431738891CDFC25E0008FEB9 /* cpu.c in Sources */, 5376130F155AD0D5005750A4 /* UIImageView+WebCache.m in Sources */, 530E49EC16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */, + 431738851CDFC2580008FEB9 /* webp.c in Sources */, + 4317389E1CDFC25E0008FEB9 /* yuv.c in Sources */, + 431738A61CDFC2630008FEB9 /* bit_writer.c in Sources */, + 431738811CDFC2580008FEB9 /* vp8.c in Sources */, + 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */, + 431738931CDFC25E0008FEB9 /* enc_neon.c in Sources */, + 431738981CDFC25E0008FEB9 /* lossless_neon.c in Sources */, + 4317388B1CDFC25E0008FEB9 /* dec_clip_tables.c in Sources */, + 431738951CDFC25E0008FEB9 /* lossless.c in Sources */, 53406750167780C40042B59E /* SDWebImageCompat.m in Sources */, + 431738AF1CDFC2630008FEB9 /* huffman_encode.c in Sources */, A18A6CC9172DC28500419892 /* UIImage+GIF.m in Sources */, + 4317389B1CDFC25E0008FEB9 /* upsampling.c in Sources */, + 4317387E1CDFC2580008FEB9 /* io.c in Sources */, AB615306192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */, + 4317387A1CDFC2580008FEB9 /* buffer.c in Sources */, 5D5B9145188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */, 53EDFB8C17623F7C00698166 /* UIImage+MultiFormat.m in Sources */, + 4317389D1CDFC25E0008FEB9 /* upsampling_sse2.c in Sources */, ABBE71A818C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 537D957417ECC1FE0097C263 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DA577D101998E60B007367ED /* upsampling_neon.c in Sources */, - DA577D151998E60B007367ED /* yuv_sse2.c in Sources */, - DA577D111998E60B007367ED /* upsampling_sse2.c in Sources */, - DA577D4C1998E60B007367ED /* utils.c in Sources */, - DA577D6D1998E6B2007367ED /* buffer.c in Sources */, - DA577D021998E60B007367ED /* dec_sse2.c in Sources */, - DA577D0F1998E60B007367ED /* upsampling.c in Sources */, - 537D957517ECC1FE0097C263 /* SDImageCache.m in Sources */, - DA577CFE1998E60B007367ED /* dec.c in Sources */, - DA577CFF1998E60B007367ED /* dec_clip_tables.c in Sources */, - AB615307192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */, - DA577D0D1998E60B007367ED /* lossless_sse2.c in Sources */, - DA577D081998E60B007367ED /* enc_sse2.c in Sources */, - DA577D481998E60B007367ED /* rescaler.c in Sources */, - DA577D391998E60B007367ED /* color_cache.c in Sources */, - DA577D011998E60B007367ED /* dec_neon.c in Sources */, - DA577CFD1998E60B007367ED /* cpu.c in Sources */, - DA577D051998E60B007367ED /* enc_avx2.c in Sources */, - 537D957617ECC1FE0097C263 /* SDWebImageDecoder.m in Sources */, - DA577D781998E6B2007367ED /* webp.c in Sources */, - DA577D401998E60B007367ED /* huffman_encode.c in Sources */, - 537D957717ECC1FE0097C263 /* SDWebImageDownloader.m in Sources */, - DA577D371998E60B007367ED /* bit_writer.c in Sources */, - DA577D4A1998E60B007367ED /* thread.c in Sources */, - 537D957817ECC1FE0097C263 /* SDWebImageManager.m in Sources */, - DA577D461998E60B007367ED /* random.c in Sources */, - DA577D711998E6B2007367ED /* io.c in Sources */, - 537D957917ECC1FE0097C263 /* SDWebImagePrefetcher.m in Sources */, - DA577D121998E60B007367ED /* yuv.c in Sources */, - 537D957A17ECC1FE0097C263 /* UIButton+WebCache.m in Sources */, - DA577D3E1998E60B007367ED /* huffman.c in Sources */, - DA577D441998E60B007367ED /* quant_levels_dec.c in Sources */, - DA577D731998E6B2007367ED /* tree.c in Sources */, - 537D957B17ECC1FE0097C263 /* UIImageView+WebCache.m in Sources */, - 537D957C17ECC1FE0097C263 /* SDWebImageDownloaderOperation.m in Sources */, - DA577D701998E6B2007367ED /* idec.c in Sources */, - DA577D061998E60B007367ED /* enc_mips32.c in Sources */, - DA577D041998E60B007367ED /* enc.c in Sources */, - 537D957D17ECC1FE0097C263 /* SDWebImageCompat.m in Sources */, - DA577CFC1998E60B007367ED /* alpha_processing.c in Sources */, - DA577D761998E6B2007367ED /* vp8l.c in Sources */, - DA577D0C1998E60B007367ED /* lossless_neon.c in Sources */, - DA577D001998E60B007367ED /* dec_mips32.c in Sources */, - 537D957E17ECC1FE0097C263 /* UIImage+GIF.m in Sources */, - DA577D741998E6B2007367ED /* vp8.c in Sources */, - DA577D6B1998E6B2007367ED /* alpha.c in Sources */, - DA577D421998E60B007367ED /* quant_levels.c in Sources */, - 537D958017ECC1FE0097C263 /* UIImage+MultiFormat.m in Sources */, - DA577D141998E60B007367ED /* yuv_mips32.c in Sources */, - 537D958117ECC1FE0097C263 /* UIImage+WebP.m in Sources */, - 5D5B9146188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */, - DA577D721998E6B2007367ED /* quant.c in Sources */, - DA577D091998E60B007367ED /* lossless.c in Sources */, - DA577D0B1998E60B007367ED /* lossless_mips32.c in Sources */, - DA577D071998E60B007367ED /* enc_neon.c in Sources */, - DA577D3C1998E60B007367ED /* filters.c in Sources */, - DA577D341998E60B007367ED /* bit_reader.c in Sources */, - ABBE71AB18C43B6000B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, - DAC075D21A08CBDA002E5D32 /* alpha_processing_sse2.c in Sources */, - DA577D6F1998E6B2007367ED /* frame.c in Sources */, + 4317387C1CDFC2580008FEB9 /* frame.c in Sources */, + 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */, + 4317388D1CDFC25E0008FEB9 /* dec_neon.c in Sources */, + 431738781CDFC2580008FEB9 /* alpha.c in Sources */, + 431738901CDFC25E0008FEB9 /* enc.c in Sources */, + 431738BB1CDFC2630008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 539F913016316D3700160719 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 53761307155AD0D5005750A4 /* SDWebImage */; - targetProxy = 539F912F16316D3700160719 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 00733A511BC487C100A5A117 /* Debug */ = { isa = XCBuildConfiguration; @@ -1394,148 +1117,18 @@ }; name = Release; }; - 531041DE157EAFA400BBABC3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "SDWebImage+MKAnnotation"; - SKIP_INSTALL = YES; - STRIP_STYLE = "non-global"; - }; - name = Debug; - }; - 531041DF157EAFA400BBABC3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "SDWebImage+MKAnnotation"; - SKIP_INSTALL = YES; - STRIP_STYLE = "non-global"; - }; - name = Release; - }; 53761323155AD0D5005750A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = SDWebImage; - SKIP_INSTALL = YES; - STRIP_STYLE = debugging; }; name = Debug; }; 53761324155AD0D5005750A4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = ""; - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = SDWebImage; - SKIP_INSTALL = YES; - STRIP_STYLE = debugging; - }; - name = Release; - }; - 537D95BF17ECC1FE0097C263 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "SD_WEBP=1", - "$(inherited)", - ); - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "SDWebImage+WebP"; - SKIP_INSTALL = YES; - STRIP_STYLE = debugging; - }; - name = Debug; - }; - 537D95C017ECC1FE0097C263 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - DSTROOT = /tmp/SDWebImage.dst; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = "SD_WEBP=1"; - INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "SDWebImage+WebP"; - SKIP_INSTALL = YES; - STRIP_STYLE = debugging; }; name = Release; }; @@ -1543,12 +1136,18 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", + "SD_WEBP=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; @@ -1567,11 +1166,13 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SKIP_INSTALL = YES; }; name = Debug; }; @@ -1579,7 +1180,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1596,30 +1202,16 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = "-ObjC"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SKIP_INSTALL = YES; VALIDATE_PRODUCT = YES; }; name = Release; }; - 539F912D16316D2D00160719 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 539F912E16316D2D00160719 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1641,15 +1233,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 531041DD157EAFA400BBABC3 /* Build configuration list for PBXNativeTarget "SDWebImage+MKAnnotation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 531041DE157EAFA400BBABC3 /* Debug */, - 531041DF157EAFA400BBABC3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1659,15 +1242,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 537D95BE17ECC1FE0097C263 /* Build configuration list for PBXNativeTarget "SDWebImage+WebP" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 537D95BF17ECC1FE0097C263 /* Debug */, - 537D95C017ECC1FE0097C263 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 53922D69148C55810056699D /* Build configuration list for PBXProject "SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1677,15 +1251,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 539F912C16316D2D00160719 /* Build configuration list for PBXAggregateTarget "SDWebImageFramework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 539F912D16316D2D00160719 /* Debug */, - 539F912E16316D2D00160719 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 53922D66148C55810056699D /* Project object */; diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+MKAnnotation.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+MKAnnotation.xcscheme deleted file mode 100644 index d90fff81..00000000 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+MKAnnotation.xcscheme +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+WebP.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+WebP.xcscheme deleted file mode 100644 index 71c08786..00000000 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage+WebP.xcscheme +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImageFramework.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImageFramework.xcscheme deleted file mode 100644 index e49bc163..00000000 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImageFramework.xcscheme +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 2a29f4a0b7be9dc475c1f49f16c6be74a20cd318 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 22:41:33 +0300 Subject: [PATCH 020/207] Added the WebP files to the WebImage.framework target. Removed some old hack to define empty WebP methods (see #416), will re-add it if needed, right now it prevents the dynamic framework to build. Sample app links the libSDWebImage.a --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 65 +-- SDWebImage.xcodeproj/project.pbxproj | 409 +++++++++++++++--- .../xcschemes/SDWebImage.xcscheme | 0 .../xcshareddata/xcschemes/WebImage.xcscheme | 80 ---- SDWebImage/UIImage+WebP.h | 7 - SDWebImage/UIImage+WebP.m | 7 - 6 files changed, 380 insertions(+), 188 deletions(-) rename {SDWebImage.xcworkspace => SDWebImage.xcodeproj}/xcshareddata/xcschemes/SDWebImage.xcscheme (100%) delete mode 100644 SDWebImage.xcworkspace/xcshareddata/xcschemes/WebImage.xcscheme diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index 26927625..191729e7 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 3E75A9861742DBE700DA412D /* CustomPathImages in Resources */ = {isa = PBXBuildFile; fileRef = 3E75A9851742DBE700DA412D /* CustomPathImages */; }; + 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage.a */; }; 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E6155ABA44005750A4 /* ImageIO.framework */; }; 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53761299155AB74D005750A4 /* UIKit.framework */; }; 5376129C155AB74D005750A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5376129B155AB74D005750A4 /* Foundation.framework */; }; @@ -22,10 +23,23 @@ 53A2B50E155B155A00B12423 /* placeholder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53A2B50C155B155A00B12423 /* placeholder@2x.png */; }; 53EEC18916484553007601E1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53EEC18816484553007601E1 /* Default-568h@2x.png */; }; DA248D44195470FD00390AB0 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E3155ABA3C005750A4 /* MapKit.framework */; }; - DA248D79195484A500390AB0 /* libSDWebImage+WebP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D761954841D00390AB0 /* libSDWebImage+WebP.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4317395F1CDFCC370008FEB9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 00733A4C1BC487C000A5A117; + remoteInfo = "WebImage tvOS"; + }; + 431739681CDFCCDE0008FEB9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 53761307155AD0D5005750A4; + remoteInfo = SDWebImage; + }; 43A0FAAE1BDD16AC00B7582B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -40,20 +54,6 @@ remoteGlobalIDString = 53761325155AD0D5005750A4; remoteInfo = SDWebImage; }; - DA248D751954841D00390AB0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 537D95C117ECC1FE0097C263; - remoteInfo = "SDWebImage+WebP"; - }; - DA248D771954841D00390AB0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 531041E0157EAFA400BBABC3; - remoteInfo = "SDWebImage+MKAnnotation"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -86,7 +86,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DA248D79195484A500390AB0 /* libSDWebImage+WebP.a in Frameworks */, + 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */, DA248D44195470FD00390AB0 /* MapKit.framework in Frameworks */, 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */, 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */, @@ -162,9 +162,8 @@ isa = PBXGroup; children = ( DA248D741954841D00390AB0 /* libSDWebImage.a */, - DA248D761954841D00390AB0 /* libSDWebImage+WebP.a */, - DA248D781954841D00390AB0 /* libSDWebImage+MKAnnotation.a */, 43A0FAAF1BDD16AC00B7582B /* WebImage.framework */, + 431739601CDFCC370008FEB9 /* WebImage.framework */, ); name = Products; sourceTree = ""; @@ -183,6 +182,7 @@ buildRules = ( ); dependencies = ( + 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */, ); name = "SDWebImage Demo"; productName = "SDWebImage Demo"; @@ -222,6 +222,13 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 431739601CDFCC370008FEB9 /* WebImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = WebImage.framework; + remoteRef = 4317395F1CDFCC370008FEB9 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 43A0FAAF1BDD16AC00B7582B /* WebImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -236,20 +243,6 @@ remoteRef = DA248D731954841D00390AB0 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - DA248D761954841D00390AB0 /* libSDWebImage+WebP.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libSDWebImage+WebP.a"; - remoteRef = DA248D751954841D00390AB0 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - DA248D781954841D00390AB0 /* libSDWebImage+MKAnnotation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libSDWebImage+MKAnnotation.a"; - remoteRef = DA248D771954841D00390AB0 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -282,6 +275,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + targetProxy = 431739681CDFCCDE0008FEB9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 537612B1155AB74D005750A4 /* MasterViewController.xib */ = { isa = PBXVariantGroup; diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 2f476e0c..a94cd5b9 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -115,6 +115,158 @@ 431738C11CDFC2660008FEB9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; 431738C21CDFC2660008FEB9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; 431738C31CDFC2660008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 431738C41CDFC8A30008FEB9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 431738C61CDFC8A30008FEB9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 431738C71CDFC8A30008FEB9 /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 431738C81CDFC8A30008FEB9 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 431738C91CDFC8A30008FEB9 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 431738CA1CDFC8A30008FEB9 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 431738CB1CDFC8A30008FEB9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 431738CC1CDFC8A30008FEB9 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 431738CD1CDFC8A30008FEB9 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 431738CE1CDFC8A30008FEB9 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 431738CF1CDFC8A30008FEB9 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 431738D01CDFC8A30008FEB9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 431738D11CDFC8A30008FEB9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 431738D21CDFC8A30008FEB9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 431738D31CDFC8A40008FEB9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 431738D41CDFC8A40008FEB9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 431738D51CDFC8A40008FEB9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 431738D61CDFC8A40008FEB9 /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 431738D71CDFC8A40008FEB9 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 431738D81CDFC8A40008FEB9 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 431738D91CDFC8A40008FEB9 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 431738DA1CDFC8A40008FEB9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 431738DB1CDFC8A40008FEB9 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 431738DC1CDFC8A40008FEB9 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 431738DD1CDFC8A40008FEB9 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 431738DE1CDFC8A40008FEB9 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 431738E01CDFC8A40008FEB9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 431738E11CDFC8A40008FEB9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 431738E21CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 431738E31CDFC8AA0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 431738E41CDFC8AA0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 431738E51CDFC8AA0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 431738E61CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 431738E71CDFC8AA0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 431738E81CDFC8AA0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 431738E91CDFC8AA0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 431738EA1CDFC8AA0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 431738EB1CDFC8AA0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 431738EC1CDFC8AA0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 431738ED1CDFC8AA0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 431738EE1CDFC8AA0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 431738EF1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 431738F01CDFC8AA0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 431738F11CDFC8AA0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 431738F21CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 431738F31CDFC8AA0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 431738F41CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 431738F61CDFC8AA0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 431738F71CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 431738F81CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 431738F91CDFC8AA0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 431738FA1CDFC8AA0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 431738FB1CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 431738FC1CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 431738FD1CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 431738FE1CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 431738FF1CDFC8AA0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 431739001CDFC8AA0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 431739011CDFC8AA0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 431739021CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 431739031CDFC8AA0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 431739041CDFC8AA0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 431739051CDFC8AA0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 431739061CDFC8AA0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 431739071CDFC8AA0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 431739081CDFC8AA0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 431739091CDFC8AA0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 4317390A1CDFC8AA0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 4317390B1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 4317390C1CDFC8AA0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 4317390D1CDFC8AA0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 4317390E1CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 4317390F1CDFC8AA0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 431739101CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 431739111CDFC8AA0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 431739121CDFC8AA0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 431739131CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 431739141CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 431739151CDFC8AA0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 431739161CDFC8AA0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 431739171CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 431739181CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 431739191CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 4317391B1CDFC8B20008FEB9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 4317391C1CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 4317391D1CDFC8B20008FEB9 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 4317391E1CDFC8B20008FEB9 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 4317391F1CDFC8B20008FEB9 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 431739201CDFC8B20008FEB9 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 431739211CDFC8B20008FEB9 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 431739221CDFC8B20008FEB9 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 431739231CDFC8B20008FEB9 /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 431739241CDFC8B20008FEB9 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 431739251CDFC8B20008FEB9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 431739261CDFC8B20008FEB9 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 431739271CDFC8B20008FEB9 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 431739281CDFC8B20008FEB9 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 431739291CDFC8B20008FEB9 /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 4317392A1CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 4317392B1CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 4317392C1CDFC8B20008FEB9 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 4317392D1CDFC8B20008FEB9 /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; + 4317392E1CDFC8B20008FEB9 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 4317392F1CDFC8B20008FEB9 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 431739301CDFC8B20008FEB9 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 431739311CDFC8B20008FEB9 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 431739321CDFC8B20008FEB9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 431739331CDFC8B20008FEB9 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 431739341CDFC8B20008FEB9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 431739351CDFC8B20008FEB9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 431739371CDFC8B20008FEB9 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 431739381CDFC8B20008FEB9 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 431739391CDFC8B20008FEB9 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 4317393A1CDFC8B20008FEB9 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 4317393B1CDFC8B20008FEB9 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 4317393C1CDFC8B20008FEB9 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 4317393D1CDFC8B20008FEB9 /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 4317393E1CDFC8B20008FEB9 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 4317393F1CDFC8B20008FEB9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 431739401CDFC8B20008FEB9 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 431739411CDFC8B20008FEB9 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 431739421CDFC8B20008FEB9 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 431739431CDFC8B20008FEB9 /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 431739441CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 431739451CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 431739461CDFC8B20008FEB9 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 431739471CDFC8B20008FEB9 /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; + 431739481CDFC8B20008FEB9 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 431739491CDFC8B20008FEB9 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 4317394A1CDFC8B20008FEB9 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 4317394B1CDFC8B20008FEB9 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 4317394C1CDFC8B20008FEB9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 4317394D1CDFC8B20008FEB9 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 4317394E1CDFC8B70008FEB9 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 4317394F1CDFC8B70008FEB9 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 431739501CDFC8B70008FEB9 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 431739521CDFC8B70008FEB9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 431739531CDFC8B70008FEB9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 431739541CDFC8B70008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 431739551CDFC8B70008FEB9 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 431739561CDFC8B70008FEB9 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 431739571CDFC8B70008FEB9 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 431739581CDFC8B70008FEB9 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 431739591CDFC8B70008FEB9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 4317395A1CDFC8B70008FEB9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 4317395B1CDFC8B70008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -587,23 +739,54 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 4317395A1CDFC8B70008FEB9 /* mux_types.h in Headers */, + 431739561CDFC8B70008FEB9 /* demux.h in Headers */, + 431739111CDFC8AA0008FEB9 /* neon.h in Headers */, + 4317394D1CDFC8B20008FEB9 /* utils.h in Headers */, + 431739451CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, + 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, + 4317390D1CDFC8AA0008FEB9 /* lossless.h in Headers */, + 4317393A1CDFC8B20008FEB9 /* color_cache.h in Headers */, + 431738E11CDFC8A40008FEB9 /* webpi.h in Headers */, + 431739571CDFC8B70008FEB9 /* encode.h in Headers */, + 431739351CDFC8B20008FEB9 /* bit_reader.h in Headers */, 00733A6F1BC4880E00A5A117 /* UIImage+WebP.h in Headers */, + 431739431CDFC8B20008FEB9 /* quant_levels.h in Headers */, 00733A681BC4880E00A5A117 /* SDWebImageManager.h in Headers */, + 431739591CDFC8B70008FEB9 /* mux.h in Headers */, + 4317393F1CDFC8B20008FEB9 /* huffman.h in Headers */, 00733A6C1BC4880E00A5A117 /* UIButton+WebCache.h in Headers */, + 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */, + 4317395B1CDFC8B70008FEB9 /* types.h in Headers */, + 431739551CDFC8B70008FEB9 /* decode.h in Headers */, 00733A731BC4880E00A5A117 /* WebImage.h in Headers */, 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */, 00733A671BC4880E00A5A117 /* SDImageCache.h in Headers */, + 431739191CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */, + 431739411CDFC8B20008FEB9 /* huffman_encode.h in Headers */, 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */, 00733A631BC4880E00A5A117 /* SDWebImageCompat.h in Headers */, + 431739381CDFC8B20008FEB9 /* bit_writer.h in Headers */, 00733A661BC4880E00A5A117 /* SDWebImageDownloaderOperation.h in Headers */, + 4317394B1CDFC8B20008FEB9 /* thread.h in Headers */, 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */, + 4317393B1CDFC8B20008FEB9 /* endian_inl.h in Headers */, + 431739061CDFC8AA0008FEB9 /* dsp.h in Headers */, 00733A6B1BC4880E00A5A117 /* NSData+ImageContentType.h in Headers */, 00733A6A1BC4880E00A5A117 /* SDWebImagePrefetcher.h in Headers */, 00733A641BC4880E00A5A117 /* SDWebImageOperation.h in Headers */, + 431738D41CDFC8A40008FEB9 /* alphai.h in Headers */, + 431739581CDFC8B70008FEB9 /* format_constants.h in Headers */, + 431739491CDFC8B20008FEB9 /* rescaler.h in Headers */, + 431739161CDFC8AA0008FEB9 /* yuv.h in Headers */, 00733A6E1BC4880E00A5A117 /* UIImage+MultiFormat.h in Headers */, + 431738DD1CDFC8A40008FEB9 /* vp8i.h in Headers */, 00733A6D1BC4880E00A5A117 /* UIImage+GIF.h in Headers */, 00733A651BC4880E00A5A117 /* SDWebImageDownloader.h in Headers */, + 4317393D1CDFC8B20008FEB9 /* filters.h in Headers */, 00733A691BC4880E00A5A117 /* SDWebImageDecoder.h in Headers */, + 431738D61CDFC8A40008FEB9 /* decode_vp8.h in Headers */, + 431739471CDFC8B20008FEB9 /* random.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -611,24 +794,55 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 4317394F1CDFC8B70008FEB9 /* demux.h in Headers */, + 431739211CDFC8B20008FEB9 /* endian_inl.h in Headers */, + 431739541CDFC8B70008FEB9 /* types.h in Headers */, + 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */, + 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */, 4A2CAE041AB4BB5400B6BC39 /* WebImage.h in Headers */, + 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */, + 431739231CDFC8B20008FEB9 /* filters.h in Headers */, 4A2CAE211AB4BB7000B6BC39 /* SDWebImageManager.h in Headers */, 4A2CAE1F1AB4BB6C00B6BC39 /* SDImageCache.h in Headers */, 4A2CAE351AB4BB7500B6BC39 /* UIImageView+WebCache.h in Headers */, + 4317392D1CDFC8B20008FEB9 /* random.h in Headers */, + 4317392F1CDFC8B20008FEB9 /* rescaler.h in Headers */, 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */, + 4317391B1CDFC8B20008FEB9 /* bit_reader.h in Headers */, 4A2CAE331AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.h in Headers */, + 431739521CDFC8B70008FEB9 /* mux.h in Headers */, + 431738F11CDFC8AA0008FEB9 /* lossless.h in Headers */, + 431739271CDFC8B20008FEB9 /* huffman_encode.h in Headers */, + 431738FA1CDFC8AA0008FEB9 /* yuv.h in Headers */, 4A2CAE1D1AB4BB6800B6BC39 /* SDWebImageDownloaderOperation.h in Headers */, + 4317394E1CDFC8B70008FEB9 /* decode.h in Headers */, + 431738D21CDFC8A30008FEB9 /* webpi.h in Headers */, + 431739311CDFC8B20008FEB9 /* thread.h in Headers */, + 431739291CDFC8B20008FEB9 /* quant_levels.h in Headers */, + 4317391C1CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, + 4317392B1CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, 4A2CAE2B1AB4BB7500B6BC39 /* UIButton+WebCache.h in Headers */, 4A2CAE251AB4BB7000B6BC39 /* SDWebImagePrefetcher.h in Headers */, 4A2CAE371AB4BB7500B6BC39 /* UIView+WebCacheOperation.h in Headers */, 4A2CAE2F1AB4BB7500B6BC39 /* UIImage+MultiFormat.h in Headers */, 4A2CAE1A1AB4BB6400B6BC39 /* SDWebImageOperation.h in Headers */, + 431738CE1CDFC8A30008FEB9 /* vp8i.h in Headers */, + 431738D01CDFC8A30008FEB9 /* vp8li.h in Headers */, + 431739201CDFC8B20008FEB9 /* color_cache.h in Headers */, + 431739331CDFC8B20008FEB9 /* utils.h in Headers */, 4A2CAE1B1AB4BB6800B6BC39 /* SDWebImageDownloader.h in Headers */, + 431739251CDFC8B20008FEB9 /* huffman.h in Headers */, 4A2CAE271AB4BB7500B6BC39 /* MKAnnotationView+WebCache.h in Headers */, + 431738FD1CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */, + 4317391E1CDFC8B20008FEB9 /* bit_writer.h in Headers */, + 431739501CDFC8B70008FEB9 /* encode.h in Headers */, + 431738EA1CDFC8AA0008FEB9 /* dsp.h in Headers */, 4A2CAE231AB4BB7000B6BC39 /* SDWebImageDecoder.h in Headers */, 4A2CAE311AB4BB7500B6BC39 /* UIImage+WebP.h in Headers */, 4A2CAE2D1AB4BB7500B6BC39 /* UIImage+GIF.h in Headers */, 4A2CAE291AB4BB7500B6BC39 /* NSData+ImageContentType.h in Headers */, + 431738C71CDFC8A30008FEB9 /* decode_vp8.h in Headers */, + 431739531CDFC8B70008FEB9 /* mux_types.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -819,21 +1033,66 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431739341CDFC8B20008FEB9 /* bit_reader.c in Sources */, 00733A561BC4880000A5A117 /* SDWebImageDownloaderOperation.m in Sources */, + 431739391CDFC8B20008FEB9 /* color_cache.c in Sources */, 00733A5A1BC4880000A5A117 /* SDWebImagePrefetcher.m in Sources */, + 431739031CDFC8AA0008FEB9 /* dec_mips32.c in Sources */, + 4317390B1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, 00733A5B1BC4880000A5A117 /* NSData+ImageContentType.m in Sources */, + 431739131CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, + 431738D71CDFC8A40008FEB9 /* frame.c in Sources */, + 431739011CDFC8AA0008FEB9 /* dec.c in Sources */, + 431739171CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */, + 4317390A1CDFC8AA0008FEB9 /* enc_neon.c in Sources */, + 4317390C1CDFC8AA0008FEB9 /* lossless.c in Sources */, + 431739181CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */, 00733A551BC4880000A5A117 /* SDWebImageDownloader.m in Sources */, + 431738E01CDFC8A40008FEB9 /* webp.c in Sources */, + 431739481CDFC8B20008FEB9 /* rescaler.c in Sources */, + 431738D91CDFC8A40008FEB9 /* io.c in Sources */, + 431738D51CDFC8A40008FEB9 /* buffer.c in Sources */, + 431738FE1CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */, + 4317390F1CDFC8AA0008FEB9 /* lossless_neon.c in Sources */, + 431739121CDFC8AA0008FEB9 /* upsampling.c in Sources */, + 431739371CDFC8B20008FEB9 /* bit_writer.c in Sources */, 00733A611BC4880000A5A117 /* UIImageView+WebCache.m in Sources */, + 431738D81CDFC8A40008FEB9 /* idec.c in Sources */, + 431738DE1CDFC8A40008FEB9 /* vp8l.c in Sources */, + 431739461CDFC8B20008FEB9 /* random.c in Sources */, + 431739071CDFC8AA0008FEB9 /* enc.c in Sources */, + 431738DB1CDFC8A40008FEB9 /* tree.c in Sources */, + 431739081CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, 00733A581BC4880000A5A117 /* SDWebImageManager.m in Sources */, + 431739001CDFC8AA0008FEB9 /* cpu.c in Sources */, 00733A541BC4880000A5A117 /* SDWebImageCompat.m in Sources */, + 4317393E1CDFC8B20008FEB9 /* huffman.c in Sources */, + 431739151CDFC8AA0008FEB9 /* yuv.c in Sources */, + 431739101CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */, + 431739091CDFC8AA0008FEB9 /* enc_mips32.c in Sources */, 00733A621BC4880000A5A117 /* UIView+WebCacheOperation.m in Sources */, + 4317393C1CDFC8B20008FEB9 /* filters.c in Sources */, + 431738DA1CDFC8A40008FEB9 /* quant.c in Sources */, 00733A591BC4880000A5A117 /* SDWebImageDecoder.m in Sources */, 00733A5F1BC4880000A5A117 /* UIImage+WebP.m in Sources */, + 431739041CDFC8AA0008FEB9 /* dec_neon.c in Sources */, + 431739441CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, 00733A5C1BC4880000A5A117 /* UIButton+WebCache.m in Sources */, + 4317394C1CDFC8B20008FEB9 /* utils.c in Sources */, + 431739421CDFC8B20008FEB9 /* quant_levels.c in Sources */, + 431739141CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 00733A5D1BC4880000A5A117 /* UIImage+GIF.m in Sources */, + 431738DC1CDFC8A40008FEB9 /* vp8.c in Sources */, 00733A571BC4880000A5A117 /* SDImageCache.m in Sources */, + 4317394A1CDFC8B20008FEB9 /* thread.c in Sources */, + 431739051CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, + 431739021CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */, 00733A5E1BC4880000A5A117 /* UIImage+MultiFormat.m in Sources */, + 431738D31CDFC8A40008FEB9 /* alpha.c in Sources */, + 431738FF1CDFC8AA0008FEB9 /* alpha_processing.c in Sources */, 00733A601BC4880000A5A117 /* UIImageView+HighlightedWebCache.m in Sources */, + 4317390E1CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */, + 431739401CDFC8B20008FEB9 /* huffman_encode.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -841,22 +1100,67 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 431738E51CDFC8AA0008FEB9 /* dec.c in Sources */, + 431739241CDFC8B20008FEB9 /* huffman.c in Sources */, + 431739281CDFC8B20008FEB9 /* quant_levels.c in Sources */, + 431738C91CDFC8A30008FEB9 /* idec.c in Sources */, + 4317392C1CDFC8B20008FEB9 /* random.c in Sources */, + 431738E21CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */, 4A2CAE2E1AB4BB7500B6BC39 /* UIImage+GIF.m in Sources */, 4A2CAE321AB4BB7500B6BC39 /* UIImage+WebP.m in Sources */, + 431738EC1CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, + 4317392E1CDFC8B20008FEB9 /* rescaler.c in Sources */, + 431738E91CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, + 431738F71CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, + 431738CB1CDFC8A30008FEB9 /* quant.c in Sources */, + 431738E71CDFC8AA0008FEB9 /* dec_mips32.c in Sources */, + 431738E31CDFC8AA0008FEB9 /* alpha_processing.c in Sources */, + 431738F41CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */, + 431738EF1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, + 431739301CDFC8B20008FEB9 /* thread.c in Sources */, 4A2CAE361AB4BB7500B6BC39 /* UIImageView+WebCache.m in Sources */, + 431739221CDFC8B20008FEB9 /* filters.c in Sources */, + 431738FB1CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */, 4A2CAE1E1AB4BB6800B6BC39 /* SDWebImageDownloaderOperation.m in Sources */, + 431738CC1CDFC8A30008FEB9 /* tree.c in Sources */, 4A2CAE281AB4BB7500B6BC39 /* MKAnnotationView+WebCache.m in Sources */, 4A2CAE261AB4BB7000B6BC39 /* SDWebImagePrefetcher.m in Sources */, + 431738FC1CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */, + 4317391F1CDFC8B20008FEB9 /* color_cache.c in Sources */, + 431738F21CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */, 4A2CAE301AB4BB7500B6BC39 /* UIImage+MultiFormat.m in Sources */, + 431738ED1CDFC8AA0008FEB9 /* enc_mips32.c in Sources */, + 4317392A1CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, + 431738CF1CDFC8A30008FEB9 /* vp8l.c in Sources */, + 431738E41CDFC8AA0008FEB9 /* cpu.c in Sources */, 4A2CAE1C1AB4BB6800B6BC39 /* SDWebImageDownloader.m in Sources */, 4A2CAE2A1AB4BB7500B6BC39 /* NSData+ImageContentType.m in Sources */, + 431738D11CDFC8A30008FEB9 /* webp.c in Sources */, + 431738F91CDFC8AA0008FEB9 /* yuv.c in Sources */, + 4317391D1CDFC8B20008FEB9 /* bit_writer.c in Sources */, + 431738CD1CDFC8A30008FEB9 /* vp8.c in Sources */, 4A2CAE221AB4BB7000B6BC39 /* SDWebImageManager.m in Sources */, + 431738EE1CDFC8AA0008FEB9 /* enc_neon.c in Sources */, + 431738F31CDFC8AA0008FEB9 /* lossless_neon.c in Sources */, + 431738E61CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */, + 431738F01CDFC8AA0008FEB9 /* lossless.c in Sources */, 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */, + 431739261CDFC8B20008FEB9 /* huffman_encode.c in Sources */, 4A2CAE2C1AB4BB7500B6BC39 /* UIButton+WebCache.m in Sources */, + 431738F61CDFC8AA0008FEB9 /* upsampling.c in Sources */, + 431738CA1CDFC8A30008FEB9 /* io.c in Sources */, 4A2CAE381AB4BB7500B6BC39 /* UIView+WebCacheOperation.m in Sources */, + 431738C61CDFC8A30008FEB9 /* buffer.c in Sources */, 4A2CAE241AB4BB7000B6BC39 /* SDWebImageDecoder.m in Sources */, 4A2CAE341AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.m in Sources */, + 431738F81CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 4A2CAE201AB4BB6C00B6BC39 /* SDImageCache.m in Sources */, + 431738C81CDFC8A30008FEB9 /* frame.c in Sources */, + 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */, + 431738E81CDFC8AA0008FEB9 /* dec_neon.c in Sources */, + 431738C41CDFC8A30008FEB9 /* alpha.c in Sources */, + 431738EB1CDFC8AA0008FEB9 /* enc.c in Sources */, + 431739321CDFC8B20008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1027,47 +1331,18 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = WebImage/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = WebImage.framework/Headers; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; name = Debug; }; @@ -1075,45 +1350,18 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = WebImage/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = WebImage.framework/Headers; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; name = Release; }; @@ -1122,6 +1370,7 @@ buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; PRODUCT_NAME = SDWebImage; + PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; }; name = Debug; }; @@ -1129,6 +1378,7 @@ isa = XCBuildConfiguration; buildSettings = { PRODUCT_NAME = SDWebImage; + PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; }; name = Release; }; @@ -1136,14 +1386,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", ); + GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1156,11 +1421,12 @@ GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = NO; @@ -1169,10 +1435,10 @@ IPHONEOS_DEPLOYMENT_TARGET = 5.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; - PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -1180,23 +1446,42 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", ); - GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "SD_WEBP=1", + "$(inherited)", + ); GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = NO; @@ -1204,10 +1489,10 @@ HEADER_SEARCH_PATHS = Vendors/libwebp/src; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_LDFLAGS = "-ObjC"; - PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme similarity index 100% rename from SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage.xcscheme rename to SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/WebImage.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/WebImage.xcscheme deleted file mode 100644 index 49dd15a5..00000000 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/WebImage.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDWebImage/UIImage+WebP.h b/SDWebImage/UIImage+WebP.h index b791e6fc..48cdf030 100644 --- a/SDWebImage/UIImage+WebP.h +++ b/SDWebImage/UIImage+WebP.h @@ -10,13 +10,6 @@ #import -// Fix for issue #416 Undefined symbols for architecture armv7 since WebP introduction when deploying to device -void WebPInitPremultiplyNEON(void); - -void WebPInitUpsamplersNEON(void); - -void VP8DspInitNEON(void); - @interface UIImage (WebP) + (UIImage *)sd_imageWithWebPData:(NSData *)data; diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index f27a1b6f..b1895d78 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -68,11 +68,4 @@ static void FreeImageData(void *info, const void *data, size_t size) @end -#if !COCOAPODS -// Functions to resolve some undefined symbols when using WebP and force_load flag -void WebPInitPremultiplyNEON(void) {} -void WebPInitUpsamplersNEON(void) {} -void VP8DspInitNEON(void) {} -#endif - #endif From e3ba4110a9ffe09aede3b1e47339ca1315c6f3ce Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 22:59:32 +0300 Subject: [PATCH 021/207] Renamed the schemes for consistency, dynamic frameworks are named SDWebImage instead of WebImage. Updated the Tests Podfile + project. Renamed the WebImage.h to SDWebImage.h to match the framework naming --- SDWebImage.xcodeproj/project.pbxproj | 100 +++++---------- ...Image.xcscheme => SDWebImage iOS.xcscheme} | 14 +-- ...tvOS.xcscheme => SDWebImage tvOS.xcscheme} | 8 +- ...ge.xcscheme => SDWebImage-static.xcscheme} | 2 +- .../xcschemes/SDWebImage Demo.xcscheme | 2 +- .../xcshareddata/xcschemes/Tests.xcscheme | 99 --------------- Tests/Podfile | 12 +- .../project.pbxproj | 114 +++++++++--------- Tests/Tests/Tests-Info.plist | 2 +- WebImage/SDWebImage.h | 37 ++++++ WebImage/WebImage.h | 37 ------ 11 files changed, 141 insertions(+), 286 deletions(-) rename SDWebImage.xcodeproj/xcshareddata/xcschemes/{WebImage.xcscheme => SDWebImage iOS.xcscheme} (88%) rename SDWebImage.xcodeproj/xcshareddata/xcschemes/{WebImage tvOS.xcscheme => SDWebImage tvOS.xcscheme} (94%) rename SDWebImage.xcodeproj/xcshareddata/xcschemes/{SDWebImage.xcscheme => SDWebImage-static.xcscheme} (98%) delete mode 100644 SDWebImage.xcworkspace/xcshareddata/xcschemes/Tests.xcscheme create mode 100644 WebImage/SDWebImage.h delete mode 100644 WebImage/WebImage.h diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index a94cd5b9..49f0d811 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -38,7 +38,7 @@ 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 00733A731BC4880E00A5A117 /* WebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431738781CDFC2580008FEB9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; 431738791CDFC2580008FEB9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; 4317387A1CDFC2580008FEB9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; @@ -271,7 +271,7 @@ 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; - 4A2CAE041AB4BB5400B6BC39 /* WebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; 4A2CAE1A1AB4BB6400B6BC39 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -340,10 +340,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 00733A4C1BC487C000A5A117 /* WebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CAE021AB4BB5400B6BC39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebImage.h; sourceTree = ""; }; + 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImage.h; sourceTree = ""; }; 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderOperation.h; sourceTree = ""; }; 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderOperation.m; sourceTree = ""; }; 530E49E71646388E002868E7 /* SDWebImageOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImageOperation.h; sourceTree = ""; }; @@ -490,7 +490,7 @@ 4A2CAE001AB4BB5300B6BC39 /* WebImage */ = { isa = PBXGroup; children = ( - 4A2CAE031AB4BB5400B6BC39 /* WebImage.h */, + 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */, 4A2CAE011AB4BB5400B6BC39 /* Supporting Files */, ); path = WebImage; @@ -519,8 +519,8 @@ isa = PBXGroup; children = ( 53761325155AD0D5005750A4 /* libSDWebImage.a */, - 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */, - 00733A4C1BC487C000A5A117 /* WebImage.framework */, + 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */, + 00733A4C1BC487C000A5A117 /* SDWebImage.framework */, ); name = Products; sourceTree = ""; @@ -759,7 +759,7 @@ 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */, 4317395B1CDFC8B70008FEB9 /* types.h in Headers */, 431739551CDFC8B70008FEB9 /* decode.h in Headers */, - 00733A731BC4880E00A5A117 /* WebImage.h in Headers */, + 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */, 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */, 00733A671BC4880E00A5A117 /* SDImageCache.h in Headers */, 431739191CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */, @@ -799,7 +799,7 @@ 431739541CDFC8B70008FEB9 /* types.h in Headers */, 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */, 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */, - 4A2CAE041AB4BB5400B6BC39 /* WebImage.h in Headers */, + 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */, 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */, 431739231CDFC8B20008FEB9 /* filters.h in Headers */, 4A2CAE211AB4BB7000B6BC39 /* SDWebImageManager.h in Headers */, @@ -904,9 +904,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 00733A4B1BC487C000A5A117 /* WebImage tvOS */ = { + 00733A4B1BC487C000A5A117 /* SDWebImage tvOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 00733A531BC487C100A5A117 /* Build configuration list for PBXNativeTarget "WebImage tvOS" */; + buildConfigurationList = 00733A531BC487C100A5A117 /* Build configuration list for PBXNativeTarget "SDWebImage tvOS" */; buildPhases = ( 00733A471BC487C000A5A117 /* Sources */, 00733A481BC487C000A5A117 /* Frameworks */, @@ -917,14 +917,14 @@ ); dependencies = ( ); - name = "WebImage tvOS"; + name = "SDWebImage tvOS"; productName = "WebImage tvOS"; - productReference = 00733A4C1BC487C000A5A117 /* WebImage.framework */; + productReference = 00733A4C1BC487C000A5A117 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; - 4A2CADFE1AB4BB5300B6BC39 /* WebImage */ = { + 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "WebImage" */; + buildConfigurationList = 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */; buildPhases = ( 4A2CADFA1AB4BB5300B6BC39 /* Sources */, 4A2CADFB1AB4BB5300B6BC39 /* Frameworks */, @@ -935,9 +935,9 @@ ); dependencies = ( ); - name = WebImage; + name = "SDWebImage iOS"; productName = WebImage; - productReference = 4A2CADFF1AB4BB5300B6BC39 /* WebImage.framework */; + productReference = 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; 53761307155AD0D5005750A4 /* SDWebImage */ = { @@ -988,8 +988,8 @@ projectRoot = ""; targets = ( 53761307155AD0D5005750A4 /* SDWebImage */, - 4A2CADFE1AB4BB5300B6BC39 /* WebImage */, - 00733A4B1BC487C000A5A117 /* WebImage tvOS */, + 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */, + 00733A4B1BC487C000A5A117 /* SDWebImage tvOS */, ); }; /* End PBXProject section */ @@ -1238,19 +1238,6 @@ 00733A511BC487C100A5A117 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; @@ -1259,18 +1246,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = WebImage/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = WebImage; - PUBLIC_HEADERS_FOLDER_PATH = WebImage.framework/Headers; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).tvos"; + PRODUCT_NAME = SDWebImage; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1284,19 +1266,6 @@ 00733A521BC487C100A5A117 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -1306,18 +1275,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = WebImage/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = WebImage; - PUBLIC_HEADERS_FOLDER_PATH = WebImage.framework/Headers; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).tvos"; + PRODUCT_NAME = SDWebImage; SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; @@ -1341,8 +1305,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; + PRODUCT_NAME = SDWebImage; }; name = Debug; }; @@ -1360,8 +1324,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; + PRODUCT_NAME = SDWebImage; }; name = Release; }; @@ -1416,7 +1380,7 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; @@ -1471,7 +1435,7 @@ "SD_WEBP=1", "$(inherited)", ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; @@ -1500,7 +1464,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 00733A531BC487C100A5A117 /* Build configuration list for PBXNativeTarget "WebImage tvOS" */ = { + 00733A531BC487C100A5A117 /* Build configuration list for PBXNativeTarget "SDWebImage tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 00733A511BC487C100A5A117 /* Debug */, @@ -1509,7 +1473,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "WebImage" */ = { + 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 4A2CAE131AB4BB5400B6BC39 /* Debug */, diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme similarity index 88% rename from SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage.xcscheme rename to SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme index 49dd15a5..9f6c729e 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme @@ -1,6 +1,6 @@ @@ -46,8 +46,8 @@ @@ -64,8 +64,8 @@ diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage tvOS.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme similarity index 94% rename from SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage tvOS.xcscheme rename to SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme index 1078bd6f..3efe6430 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/WebImage tvOS.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme @@ -1,6 +1,6 @@ @@ -47,7 +47,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "00733A4B1BC487C000A5A117" BuildableName = "WebImage.framework" - BlueprintName = "WebImage tvOS" + BlueprintName = "SDWebImage tvOS" ReferencedContainer = "container:SDWebImage.xcodeproj"> @@ -65,7 +65,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "00733A4B1BC487C000A5A117" BuildableName = "WebImage.framework" - BlueprintName = "WebImage tvOS" + BlueprintName = "SDWebImage tvOS" ReferencedContainer = "container:SDWebImage.xcodeproj"> diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme similarity index 98% rename from SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme rename to SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme index 21350397..46e78df5 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/Podfile b/Tests/Podfile index 7f86b807..f2a66884 100644 --- a/Tests/Podfile +++ b/Tests/Podfile @@ -3,13 +3,9 @@ source 'https://github.com/CocoaPods/Specs.git' xcodeproj 'SDWebImage Tests' workspace '../SDWebImage' -def import_pods - pod 'Expecta', '<=0.3.1' # A Matcher Framework for Objective-C/Cocoa - pod 'SDWebImage', :path => '../' -end - -target :ios do +target 'Tests' do platform :ios, '5.0' - link_with 'Tests' - import_pods + pod 'Expecta', '<=0.3.1' + pod 'SDWebImage', :path => '../' + end diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index e1328a2b..ebf9601b 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 0D87E1F83BD319CEC7622E9F /* libPods-Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0462A7F023A057322E59B3C5 /* libPods-Tests.a */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; - ABC8501F672447AA91C788DA /* libPods-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB0D107E6B4C4094BA2FEE29 /* libPods-ios.a */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; DA248D5B195472AA00390AB0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D5A195472AA00390AB0 /* UIKit.framework */; }; @@ -19,9 +19,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 1A6DF883515E8008203AB352 /* Pods-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.debug.xcconfig"; sourceTree = ""; }; + 0462A7F023A057322E59B3C5 /* libPods-Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; - CA88E6BDE3581B2BFE933C10 /* Pods-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ios.release.xcconfig"; path = "Pods/Target Support Files/Pods-ios/Pods-ios.release.xcconfig"; sourceTree = ""; }; + 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; + A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; DA248D53195472AA00390AB0 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DA248D56195472AA00390AB0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; DA248D58195472AA00390AB0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; @@ -32,7 +33,6 @@ DA248D68195475D800390AB0 /* SDImageCacheTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCacheTests.m; sourceTree = ""; }; DA248D6A195476AC00390AB0 /* SDWebImageManagerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageManagerTests.m; sourceTree = ""; }; DA91BEBB19795BC9006F2536 /* UIImageMultiFormatTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIImageMultiFormatTests.m; sourceTree = ""; }; - EB0D107E6B4C4094BA2FEE29 /* libPods-ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ios.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -43,18 +43,18 @@ DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */, DA248D5B195472AA00390AB0 /* UIKit.framework in Frameworks */, DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */, - ABC8501F672447AA91C788DA /* libPods-ios.a in Frameworks */, + 0D87E1F83BD319CEC7622E9F /* libPods-Tests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 8D1A343B1A6D91E95D7795EF /* Pods */ = { + 3E8D7663CD326C6F44B23889 /* Pods */ = { isa = PBXGroup; children = ( - 1A6DF883515E8008203AB352 /* Pods-ios.debug.xcconfig */, - CA88E6BDE3581B2BFE933C10 /* Pods-ios.release.xcconfig */, + 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */, + A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -65,7 +65,7 @@ DA248D5C195472AA00390AB0 /* Tests */, DA248D55195472AA00390AB0 /* Frameworks */, DA248D54195472AA00390AB0 /* Products */, - 8D1A343B1A6D91E95D7795EF /* Pods */, + 3E8D7663CD326C6F44B23889 /* Pods */, ); sourceTree = ""; }; @@ -83,7 +83,7 @@ DA248D56195472AA00390AB0 /* XCTest.framework */, DA248D58195472AA00390AB0 /* Foundation.framework */, DA248D5A195472AA00390AB0 /* UIKit.framework */, - EB0D107E6B4C4094BA2FEE29 /* libPods-ios.a */, + 0462A7F023A057322E59B3C5 /* libPods-Tests.a */, ); name = Frameworks; sourceTree = ""; @@ -117,12 +117,12 @@ isa = PBXNativeTarget; buildConfigurationList = DA248D67195472AA00390AB0 /* Build configuration list for PBXNativeTarget "Tests" */; buildPhases = ( - FBC8982311CD4ED9A3006D45 /* Check Pods Manifest.lock */, + 09522B7196293172D6408744 /* 📦 Check Pods Manifest.lock */, DA248D4F195472AA00390AB0 /* Sources */, DA248D50195472AA00390AB0 /* Frameworks */, DA248D51195472AA00390AB0 /* Resources */, - D6347736BDF64FC5A4D078A4 /* Copy Pods Resources */, - 4B51E412BA3594400947AC71 /* Embed Pods Frameworks */, + C86216497B5A0BA9501E2C07 /* 📦 Embed Pods Frameworks */, + 85E5D3885A03BFC23B050908 /* 📦 Copy Pods Resources */, ); buildRules = ( ); @@ -139,7 +139,7 @@ DA248D461954721A00390AB0 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0730; }; buildConfigurationList = DA248D491954721A00390AB0 /* Build configuration list for PBXProject "SDWebImage Tests" */; compatibilityVersion = "Xcode 3.2"; @@ -171,44 +171,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 4B51E412BA3594400947AC71 /* Embed Pods Frameworks */ = { + 09522B7196293172D6408744 /* 📦 Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ios/Pods-ios-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - D6347736BDF64FC5A4D078A4 /* Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ios/Pods-ios-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - FBC8982311CD4ED9A3006D45 /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; + name = "📦 Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -216,6 +186,36 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; + 85E5D3885A03BFC23B050908 /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Tests/Pods-Tests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + C86216497B5A0BA9501E2C07 /* 📦 Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Tests/Pods-Tests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -246,18 +246,22 @@ DA248D4A1954721A00390AB0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ENABLE_TESTABILITY = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + ONLY_ACTIVE_ARCH = YES; }; name = Debug; }; DA248D4B1954721A00390AB0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + IPHONEOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; DA248D65195472AA00390AB0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1A6DF883515E8008203AB352 /* Pods-ios.debug.xcconfig */; + baseConfigurationReference = 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -273,11 +277,6 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -295,8 +294,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "Tests/Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.SDWebImage.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; WRAPPER_EXTENSION = xctest; @@ -305,7 +304,7 @@ }; DA248D66195472AA00390AB0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CA88E6BDE3581B2BFE933C10 /* Pods-ios.release.xcconfig */; + baseConfigurationReference = A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -322,11 +321,6 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; @@ -337,7 +331,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "Tests/Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.SDWebImage.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/Tests/Tests/Tests-Info.plist b/Tests/Tests/Tests-Info.plist index 82139999..169b6f71 100644 --- a/Tests/Tests/Tests-Info.plist +++ b/Tests/Tests/Tests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.SDWebImage.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h new file mode 100644 index 00000000..b95b911d --- /dev/null +++ b/WebImage/SDWebImage.h @@ -0,0 +1,37 @@ +// +// WebImage.h +// WebImage +// +// Created by Florent Vilmart on 2015-03-14. +// Copyright (c) 2015 Dailymotion. All rights reserved. +// + +#import + +//! Project version number for WebImage. +FOUNDATION_EXPORT double WebImageVersionNumber; + +//! Project version string for WebImage. +FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#if !TARGET_OS_TV +#import +#endif +#import +#import +#import +#import diff --git a/WebImage/WebImage.h b/WebImage/WebImage.h deleted file mode 100644 index b832a9a8..00000000 --- a/WebImage/WebImage.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// WebImage.h -// WebImage -// -// Created by Florent Vilmart on 2015-03-14. -// Copyright (c) 2015 Dailymotion. All rights reserved. -// - -#import - -//! Project version number for WebImage. -FOUNDATION_EXPORT double WebImageVersionNumber; - -//! Project version string for WebImage. -FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#if !TARGET_OS_TV -#import -#endif -#import -#import -#import -#import From 56c1ba63add3d9ede66b30e0abe240b3a4fa6dae Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 23:04:40 +0300 Subject: [PATCH 022/207] Cleanup for the Travis CI config file --- .travis.yml | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2d65143a..37a3f0a8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,26 +1,41 @@ language: objective-c - osx_image: xcode7.1 -before_install: +env: + global: + - LC_CTYPE=en_US.UTF-8 + - LANG=en_US.UTF-8 - - export LANG=en_US.UTF-8 + +before_install: - env - locale - - gem install cocoapods --quiet + - gem install cocoapods --no-rdoc --no-ri --no-document --quiet + - gem install xcpretty --no-rdoc --no-ri --no-document --quiet - pod --version - pod setup --silent - pod repo update --silent + - xcpretty --version + - xcodebuild -version + - xcodebuild -showsdks script: + - set -o pipefail + - echo Check if the library described by the podspec can be built - pod lib lint --allow-warnings - - xctool -workspace SDWebImage.xcworkspace -scheme 'SDWebImage' -sdk iphonesimulator -arch i386 build - - xctool -workspace SDWebImage.xcworkspace -scheme 'SDWebImage+WebP' -sdk iphonesimulator -arch i386 build - - xctool -workspace SDWebImage.xcworkspace -scheme 'SDWebImage+MKAnnotation' -sdk iphonesimulator -arch i386 build - - xctool -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Demo' -sdk iphonesimulator -arch i386 build + - echo Build as static library + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage-static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - echo Build as dynamic framework + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage tvOS' -sdk appletvsimulator -configuration Debug | xcpretty -c + + - echo Build the Demo app + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + + - echo Run the tests - pod install --project-directory=Tests - - xcodebuild -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' test \ No newline at end of file + - xcodebuild clean test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ No newline at end of file From 7913b45fae2d7bf6956dbacc52b23656b6318c27 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 23:14:48 +0300 Subject: [PATCH 023/207] Added the missing Tests scheme --- .../xcshareddata/xcschemes/Tests.xcscheme | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme diff --git a/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme new file mode 100644 index 00000000..822b3fb4 --- /dev/null +++ b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 3902ed7dec7abe4905ce4cbce95fce58ae84b873 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 23:29:29 +0300 Subject: [PATCH 024/207] Fixed the build (the test target cannot do clean) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 37a3f0a8..0c36dc64 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,4 +38,4 @@ script: - echo Run the tests - pod install --project-directory=Tests - - xcodebuild clean test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ No newline at end of file + - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ No newline at end of file From 718cbcad3e74dbe441318796e1e553ed9e7a00e0 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 23:41:31 +0300 Subject: [PATCH 025/207] The tests target should also use xcpretty --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0c36dc64..c3f111a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,4 +38,4 @@ script: - echo Run the tests - pod install --project-directory=Tests - - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' \ No newline at end of file + - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c \ No newline at end of file From 6279424b1c40f5620e9f1b9065a1b4bfc6919b08 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 8 May 2016 23:58:26 +0300 Subject: [PATCH 026/207] Added 1st version of design (StarUML) --- .gitattributes | 1 + SDWebImage.mdj | 581 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 582 insertions(+) create mode 100644 .gitattributes create mode 100644 SDWebImage.mdj diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..b3f52748 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.mdj binary \ No newline at end of file diff --git a/SDWebImage.mdj b/SDWebImage.mdj new file mode 100644 index 00000000..1dd65152 --- /dev/null +++ b/SDWebImage.mdj @@ -0,0 +1,581 @@ +{ + "_type": "Project", + "_id": "AAAAAAFF+h6SjaM2Hec=", + "name": "SDWebImage", + "ownedElements": [ + { + "_type": "UMLModel", + "_id": "AAAAAAFF+qBWK6M3Z8Y=", + "_parent": { + "$ref": "AAAAAAFF+h6SjaM2Hec=" + }, + "name": "SDWebImage Model", + "ownedElements": [ + { + "_type": "UMLClassDiagram", + "_id": "AAAAAAFF+qBtyKM79qY=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Class Diagram", + "visible": true, + "defaultDiagram": true + }, + { + "_type": "UMLCollaboration", + "_id": "AAAAAAFUkhaWOozRCy8=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Collaboration1", + "ownedElements": [ + { + "_type": "UMLInteraction", + "_id": "AAAAAAFUkhaWOozSZjs=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Interaction1", + "ownedElements": [ + { + "_type": "UMLSequenceDiagram", + "_id": "AAAAAAFUkhaWOozTHHk=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "SequenceDiagram1", + "visible": true, + "defaultDiagram": false, + "ownedViews": [ + { + "_type": "UMLFrameView", + "_id": "AAAAAAFUkhaWO4zUdVo=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUkhaWO4zVdQo=", + "_parent": { + "$ref": "AAAAAAFUkhaWO4zUdVo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 503, + "top": 605, + "width": 114, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SequenceDiagram1", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUkhaWPIzWP4I=", + "_parent": { + "$ref": "AAAAAAFUkhaWO4zUdVo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 605, + "width": 61, + "height": 13, + "autoResize": false, + "underline": false, + "text": "interaction", + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": 600, + "width": 695, + "height": 595, + "autoResize": false, + "nameLabel": { + "$ref": "AAAAAAFUkhaWO4zVdQo=" + }, + "frameTypeLabel": { + "$ref": "AAAAAAFUkhaWPIzWP4I=" + } + } + ], + "showSequenceNumber": true, + "showSignature": true, + "showActivation": true + } + ], + "visibility": "public", + "isReentrant": true + } + ], + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUkhiPbozyZ3U=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role1", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFUkhbx4ozg49g=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "SDWebImage", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFUkhgItozoKPM=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImagePrefetcher", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFUkhg5/4zs5zU=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImagePrefetcherDelegate", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUkht/NI1jZE4=", + "_parent": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "name": "didPrefetchURL:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUkhu8u41n4Ps=", + "_parent": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "name": "didFinishWithTotalCount:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUkhwuq42z3w4=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageManager", + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUkiBj3o4EzZs=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "sharedManager", + "visibility": "public", + "isStatic": true, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUkh/xZ44AqYk=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "loadImageWithURL:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFUkhyNUo23oFw=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageOptions", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhys4o27Ge0=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageRetryFailed", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhza8o2/z9E=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageLowPriority", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhzkGo3CNk8=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageCacheMemoryOnly", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhzs8o3Fkdk=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageProgressiveDownload", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhz04o3ItAc=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageRefreshCached", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkhz84Y3L96A=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageContinueInBackground", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh0C6Y3O214=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageHandleCookies", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh2TUY3YpnQ=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageAllowInvalidSSLCertificates", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh2bqY3bxlE=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageHighPriority", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh2p4Y3e22E=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageDelayPlaceholder", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh2x+Y3hQmw=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageTransformAnimatedImage", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkh31iY3ox50=", + "_parent": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "name": "SDWebImageAvoidAutoSetImage", + "visibility": "public" + } + ] + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFUkh5jeI3spbg=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageManagerDelegate", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUkh6LiI3wgxM=", + "_parent": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "name": "shouldDownloadImageForURL:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUkh65uI30vRk=", + "_parent": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "name": "transformDownloadedImage:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUkh79WI34fB0=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDImageCache", + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUkiFzJY5gThM=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "sharedImageCache", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUkh8UMI38gtY=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageDownloader", + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUkiJAhI5kL78=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "sharedDownloader", + "visibility": "public", + "isStatic": true, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFUkiDjJo5QvT4=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDImageCacheType", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkiD+ro5UDPI=", + "_parent": { + "$ref": "AAAAAAFUkiDjJo5QvT4=" + }, + "name": "SDImageCacheTypeNone", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkiEOJo5YAWk=", + "_parent": { + "$ref": "AAAAAAFUkiDjJo5QvT4=" + }, + "name": "SDImageCacheTypeDisk", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUkiEUdY5bs1I=", + "_parent": { + "$ref": "AAAAAAFUkiDjJo5QvT4=" + }, + "name": "SDImageCacheTypeMemory", + "visibility": "public" + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUkiR/Go5pUW0=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageDownloaderOperation", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + } + ], + "visibility": "public" + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFUkhchsIzka3U=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "WebP", + "visibility": "public" + } + ], + "visibility": "public" + } + ] +} \ No newline at end of file From 572f26af27fbcdc6d4ea082a9fc8fcf57400ff14 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 10 May 2016 08:36:50 +0300 Subject: [PATCH 027/207] Updated the diagrams --- Class Diagram.png | Bin 0 -> 209774 bytes SDWebImage.mdj | 10051 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 10050 insertions(+), 1 deletion(-) create mode 100644 Class Diagram.png diff --git a/Class Diagram.png b/Class Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..394437d4495223e0e895e8ebc98963fb406dea2c GIT binary patch literal 209774 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%0D7jXo3(j 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 z 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 IyX`~&3yTK5F8}}l literal 0 HcmV?d00001 diff --git a/SDWebImage.mdj b/SDWebImage.mdj index 1dd65152..6f5bbd96 100644 --- a/SDWebImage.mdj +++ b/SDWebImage.mdj @@ -19,7 +19,8439 @@ }, "name": "Class Diagram", "visible": true, - "defaultDiagram": true + "defaultDiagram": true, + "ownedViews": [ + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFUmMqaTslne2E=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmMqaT8lo2ag=", + "_parent": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmMqaT8lpMw4=", + "_parent": { + "$ref": "AAAAAAFUmMqaT8lo2ag=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 45, + "width": 209, + "height": 13, + "autoResize": false, + "underline": false, + "text": "«interface»", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMqaT8lqdv4=", + "_parent": { + "$ref": "AAAAAAFUmMqaT8lo2ag=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 60, + "width": 209, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImagePrefetcherDelegate", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMqaT8lrlno=", + "_parent": { + "$ref": "AAAAAAFUmMqaT8lo2ag=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 75, + "width": 209, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMqaT8ls+2c=", + "_parent": { + "$ref": "AAAAAAFUmMqaT8lo2ag=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -774, + "top": -630, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": 40, + "width": 219, + "height": 53, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmMqaT8lpMw4=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmMqaT8lqdv4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmMqaT8lrlno=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmMqaT8ls+2c=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmMqaT8lt/Ps=", + "_parent": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": 93, + "width": 243, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmMqaUMluvjM=", + "_parent": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmMqaV8mN2MY=", + "_parent": { + "$ref": "AAAAAAFUmMqaUMluvjM=" + }, + "model": { + "$ref": "AAAAAAFUkht/NI1jZE4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 98, + "width": 233, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+didPrefetchURL:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmMqaWMmQbyY=", + "_parent": { + "$ref": "AAAAAAFUmMqaUMluvjM=" + }, + "model": { + "$ref": "AAAAAAFUkhu8u41n4Ps=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 437, + "top": 113, + "width": 233, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+didFinishWithTotalCount:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": 93, + "width": 243, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmMqaUMlvfNw=", + "_parent": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -387, + "top": -315, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmMqaUMlwiGQ=", + "_parent": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "model": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -387, + "top": -315, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 432, + "top": 40, + "width": 243, + "height": 91, + "autoResize": false, + "stereotypeDisplay": "decoration-label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmMqaT8lo2ag=" + }, + "wordWrap": false, + "suppressAttributes": true, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmMqaT8lt/Ps=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmMqaUMluvjM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmMqaUMlvfNw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmMqaUMlwiGQ=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmMuDNcmaKIo=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmMuDNcmbtbk=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuDNsmcNWY=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmbtbk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -776, + "top": -12, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuDNsmduFE=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmbtbk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 311, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageManager", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuDNsmeXJQ=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmbtbk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 326, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuDNsmfU3g=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmbtbk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -776, + "top": -12, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 304, + "width": 285, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmMuDNsmcNWY=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmMuDNsmduFE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmMuDNsmeXJQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmMuDNsmfU3g=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmMuDNsmgAkg=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmMuDPsnATeQ=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmgAkg=" + }, + "model": { + "$ref": "AAAAAAFUkiBj3o4EzZs=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 349, + "width": 275, + "height": 13, + "autoResize": false, + "underline": true, + "text": "+sharedManager", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmMuDP8nDeko=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmgAkg=" + }, + "model": { + "$ref": "AAAAAAFUmMkoD8jx3Dk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 364, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+options: SDWebImageOptions", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 344, + "width": 285, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmMuDNsmh7I4=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmMuDQMnGch8=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUkh/xZ44AqYk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 387, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+loadImageWithURL:(): SDWebImageOperation", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNLHPdJsErg=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUmNLHKNJpLPM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 402, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+saveImageToCache:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNLtc9LfCP8=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUmNLtYNLc08o=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 417, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancelAll()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNNJz9NSJ2c=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUmNNJv9NPrNI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 432, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cachedImageExistsForURL(): BOOL", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNNp+NPFk/c=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUmNNp59PCdv8=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 447, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+diskImageExistsForURL(): BOOL", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNOR2tQ4Agg=", + "_parent": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "model": { + "$ref": "AAAAAAFUmNORx9Q1mi4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 462, + "width": 275, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cacheKeyForURL(): NSString", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 382, + "width": 285, + "height": 98, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmMuDNsmiBHA=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -388, + "top": -6, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmMuDNsmjAGU=", + "_parent": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "model": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -388, + "top": -6, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 80, + "top": 304, + "width": 285, + "height": 176, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmMuDNcmbtbk=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmMuDNsmgAkg=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmMuDNsmh7I4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmMuDNsmiBHA=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmMuDNsmjAGU=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmMuQRcnK0vE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmMuQRcnL+Ic=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuQRsnM1vc=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnL+Ic=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -924, + "top": -190, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuQRsnNOeI=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnL+Ic=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 47, + "width": 189, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImagePrefetcher", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuQRsnO2JI=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnL+Ic=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 62, + "width": 189, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmMuQRsnPnXU=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnL+Ic=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -924, + "top": -190, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 40, + "width": 199, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmMuQRsnM1vc=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmMuQRsnNOeI=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmMuQRsnO2JI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmMuQRsnPnXU=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmMuQRsnQWLc=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmM4z4Ms1XuY=", + "_parent": { + "$ref": "AAAAAAFUmMuQRsnQWLc=" + }, + "model": { + "$ref": "AAAAAAFUmM4zy8syqFU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 85, + "width": 189, + "height": 13, + "autoResize": false, + "underline": true, + "text": "+sharedImagePrefetcher", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmMwm/8n0wzU=", + "_parent": { + "$ref": "AAAAAAFUmMuQRsnQWLc=" + }, + "model": { + "$ref": "AAAAAAFUmMwm7Mnxz9U=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 100, + "width": 189, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+options: SDWebImageOptions", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 80, + "width": 199, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmMuQRsnRij4=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmM3db8r4CB0=", + "_parent": { + "$ref": "AAAAAAFUmMuQRsnRij4=" + }, + "model": { + "$ref": "AAAAAAFUmM3dVsr1bHY=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 123, + "width": 189, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+prefetchURLs:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNCMls5nNcg=", + "_parent": { + "$ref": "AAAAAAFUmMuQRsnRij4=" + }, + "model": { + "$ref": "AAAAAAFUmNCMgs5kwbc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 85, + "top": 138, + "width": 189, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancelPrefetching()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 80, + "top": 118, + "width": 199, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmMuQRsnSrDo=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -286, + "top": -95, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmMuQRsnTfoU=", + "_parent": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "model": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -286, + "top": -95, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 80, + "top": 40, + "width": 199, + "height": 116, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmMuQRcnL+Ic=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmMuQRsnQWLc=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmMuQRsnRij4=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmMuQRsnSrDo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmMuQRsnTfoU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUmMzgacoAUuo=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgacoBVB4=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 111, + "top": 231, + "width": 58, + "height": 13, + "autoResize": false, + "alpha": -4.532535318640983, + "distance": 44.721359549995796, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 1, + "underline": false, + "text": "+manager", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoCSHw=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 154, + "top": 222, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoD8nA=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 198, + "top": 223, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoEAKU=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn92Qw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 169, + "top": 272, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoFRR4=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn92Qw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 155, + "top": 269, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoGgow=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn92Qw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 196, + "top": 276, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoHXlE=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn+nz8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 169, + "top": 174, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoIWBc=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn+nz8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 155, + "top": 177, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmMzgasoJ3AM=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn+nz8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 196, + "top": 170, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmMzgasoKSrI=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn92Qw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmMzga8oL6Mo=", + "_parent": { + "$ref": "AAAAAAFUmMzgacoAUuo=" + }, + "model": { + "$ref": "AAAAAAFUmMzgZsn+nz8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "tail": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "lineStyle": 0, + "points": "184:304;184:155", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmMzgacoBVB4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmMzgasoCSHw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmMzgasoD8nA=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUmMzgasoEAKU=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUmMzgasoFRR4=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUmMzgasoGgow=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUmMzgasoHXlE=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUmMzgasoIWBc=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUmMzgasoJ3AM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUmMzgasoKSrI=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUmMzga8oL6Mo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUmM8TrMut8mA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8TrcuutTY=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 326, + "top": 47, + "width": 57, + "height": 13, + "autoResize": false, + "alpha": -1.5152983753953508, + "distance": 18.027756377319946, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 1, + "underline": false, + "text": "+delegate", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trcuv5wo=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 354, + "top": 96, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trcuwg1A=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 355, + "top": 51, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8TrcuxMbs=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuqc7A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 406, + "top": 80, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trcuy2Xg=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuqc7A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 403, + "top": 94, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8TrcuzvFU=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuqc7A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 410, + "top": 53, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trcu0K9c=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuru94=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 303, + "top": 80, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trsu1cfo=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuru94=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 306, + "top": 94, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmM8Trsu2kfM=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuru94=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 299, + "top": 53, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmM8Trsu30do=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuqc7A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": -16, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmM8Trsu4Iks=", + "_parent": { + "$ref": "AAAAAAFUmM8TrMut8mA=" + }, + "model": { + "$ref": "AAAAAAFUmM8Tqsuru94=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": -16, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuQRcnK0vE=" + }, + "tail": { + "$ref": "AAAAAAFUmMqaTslne2E=" + }, + "lineStyle": 0, + "points": "432:72;278:72", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmM8TrcuutTY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmM8Trcuv5wo=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmM8Trcuwg1A=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUmM8TrcuxMbs=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUmM8Trcuy2Xg=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUmM8TrcuzvFU=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUmM8Trcu0K9c=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUmM8Trsu1cfo=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUmM8Trsu2kfM=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUmM8Trsu30do=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUmM8Trsu4Iks=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFUmNDrqc6u4Jg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmNDrqc6vaig=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmNDrqs6wj8c=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6vaig=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 453, + "top": 309, + "width": 199, + "height": 13, + "autoResize": false, + "underline": false, + "text": "«interface»", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNDrqs6xyQA=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6vaig=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 453, + "top": 324, + "width": 199, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageManagerDelegate", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNDrqs6yURY=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6vaig=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 453, + "top": 339, + "width": 199, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNDrqs6zC2E=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6vaig=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -26, + "top": -42, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 448, + "top": 304, + "width": 209, + "height": 53, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNDrqs6wj8c=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmNDrqs6xyQA=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmNDrqs6yURY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNDrqs6zC2E=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmNDrqs60TV0=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 448, + "top": 349, + "width": 233, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmNDrq861Hmk=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNDrt87aqWo=", + "_parent": { + "$ref": "AAAAAAFUmNDrq861Hmk=" + }, + "model": { + "$ref": "AAAAAAFUkh6LiI3wgxM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 453, + "top": 362, + "width": 223, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDownloadImageForURL:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNDruM7d5ZU=", + "_parent": { + "$ref": "AAAAAAFUmNDrq861Hmk=" + }, + "model": { + "$ref": "AAAAAAFUkh65uI30vRk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 453, + "top": 377, + "width": 223, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+transformDownloadedImage:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 448, + "top": 357, + "width": 233, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmNDrq862uls=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -13, + "top": -29, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmNDrq8634fU=", + "_parent": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "model": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -13, + "top": -29, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 448, + "top": 304, + "width": 233, + "height": 91, + "autoResize": false, + "stereotypeDisplay": "decoration-label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmNDrqc6vaig=" + }, + "wordWrap": false, + "suppressAttributes": true, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmNDrqs60TV0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmNDrq861Hmk=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmNDrq862uls=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmNDrq8634fU=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUmNGSidAM2EA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSitANy3Q=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 377, + "top": 303, + "width": 57, + "height": 13, + "autoResize": false, + "alpha": -1.5152983753953508, + "distance": 18.027756377319946, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 1, + "underline": false, + "text": "+delegate", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSitAOfz8=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 405, + "top": 352, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9AP6Jk=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 406, + "top": 307, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9AQtHM=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAJw9E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 422, + "top": 336, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9ARhW0=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAJw9E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 419, + "top": 350, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9AS+50=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAJw9E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 426, + "top": 309, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9ATBrA=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAKXzo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 389, + "top": 336, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9AUntg=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAKXzo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 392, + "top": 350, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNGSi9AVGbU=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAKXzo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 385, + "top": 309, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNGSi9AWHN8=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAJw9E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNGSjNAX0Ko=", + "_parent": { + "$ref": "AAAAAAFUmNGSidAM2EA=" + }, + "model": { + "$ref": "AAAAAAFUmNGSiNAKXzo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "tail": { + "$ref": "AAAAAAFUmNDrqc6u4Jg=" + }, + "lineStyle": 0, + "points": "448:328;364:328", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmNGSitANy3Q=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNGSitAOfz8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNGSi9AP6Jk=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUmNGSi9AQtHM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUmNGSi9ARhW0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUmNGSi9AS+50=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUmNGSi9ATBrA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUmNGSi9AUntg=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUmNGSi9AVGbU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUmNGSi9AWHN8=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUmNGSjNAX0Ko=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFUmNWcUNb3p+o=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmNWcUNb4uJQ=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmNWcUdb5KuU=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb4uJQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 53, + "width": 154, + "height": 13, + "autoResize": false, + "underline": false, + "text": "«interface»", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNWcUdb69zw=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb4uJQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 68, + "width": 154, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageOperation", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNWcUdb7XbE=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb4uJQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 83, + "width": 154, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNWcUdb83AA=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb4uJQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1550, + "top": -1366, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 944, + "top": 48, + "width": 164, + "height": 53, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNWcUdb5KuU=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmNWcUdb69zw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmNWcUdb7XbE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNWcUdb83AA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmNWcUdb9dh8=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 775, + "top": -683, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmNWcUtb+mBY=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmNWcdtcm+vY=", + "_parent": { + "$ref": "AAAAAAFUmNWcUtb+mBY=" + }, + "model": { + "$ref": "AAAAAAFUmNWHXtbX7L0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 106, + "width": 178, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancel()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 944, + "top": 101, + "width": 188, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmNWcUtb/20U=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 775, + "top": -683, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmNWcUtcAYow=", + "_parent": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "model": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 775, + "top": -683, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 944, + "top": 48, + "width": 188, + "height": 76, + "autoResize": false, + "stereotypeDisplay": "decoration-label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmNWcUNb4uJQ=" + }, + "wordWrap": false, + "suppressAttributes": true, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmNWcUdb9dh8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmNWcUtb+mBY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmNWcUtb/20U=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmNWcUtcAYow=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmNdXmNnpp1I=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmNdXmNnqYDc=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdXmNnr5H4=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnqYDc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -444, + "top": 82, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdXmdnsoJE=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnqYDc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 663, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDImageCache", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdXmdntTaY=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnqYDc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 678, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdXmdnuoqs=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnqYDc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -444, + "top": 82, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 40, + "top": 656, + "width": 231, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNdXmNnr5H4=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmNdXmdnsoJE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmNdXmdntTaY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNdXmdnuoqs=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmNdXmdnvJXE=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmNdXptoY03w=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUkiFzJY5gThM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 701, + "width": 221, + "height": 13, + "autoResize": false, + "underline": true, + "text": "+sharedImageCache", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPBKbRgtQUU=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPBKVhghKWk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 716, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDecompressImages", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPBxxxjoOxU=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPBxrhjcaQc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 731, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDisableiCloud", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPCLqxmjkOk=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPCLlRmXEPs=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 746, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldCacheImagesInMemory", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPDDBhpeNqc=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPDC7hpSvPQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 761, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxMemoryCost", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPDhwxsZ7GE=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPDhrRsNyCc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 776, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxMemoryCountLimit", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPD+uBvUo+E=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPD+pRvI9sU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 791, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxCacheAge", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmPEdXByPumw=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "model": { + "$ref": "AAAAAAFUmPEdRRyDmKo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 806, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxCacheSize", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 40, + "top": 696, + "width": 231, + "height": 128, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmNdXmdnwtCw=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPGS0B3RMvU=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPGStR3F538=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 829, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+init(namespace)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPHYtR7bgKE=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPHYnB7PNs4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 844, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+init(namespace, diskCacheDirectory)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPMOcCH4C2s=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPMOWiHsOa0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 859, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+storeImage()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPMtWSKzkFI=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPMtQiKnVfM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 874, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+storeImageDataToDisk()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPN5PSOrtHg=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPN5KSOfrIg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 889, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+queryDiskCacheForKey()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPOk6SRm1Mk=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPOk0iRaSME=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 904, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+imageFromMemoryCacheForKey()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPPBnSUhpyE=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPPBiSUVHSU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 919, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+imageFromDiskCacheForKey()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPPi2SXcgfY=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPPiwSXQs7U=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 934, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+removeImageForKey()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPQzdyaXBMo=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPQzYSaLCQc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 949, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+clearMemory()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPRYeidSwZM=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPRYYSdGCZA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 964, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+clearDIsk()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPTT5SgNlm4=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPTT0CgBzK8=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 979, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cachePathForKey()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPT4dSjIhS0=", + "_parent": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "model": { + "$ref": "AAAAAAFUmPT4WSi8pg0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 45, + "top": 994, + "width": 221, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+addReadOnlyCachePath()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 40, + "top": 824, + "width": 231, + "height": 188, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmNdXmtnxgxw=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -222, + "top": 41, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmNdXmtnyo9g=", + "_parent": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "model": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -222, + "top": 41, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 40, + "top": 656, + "width": 231, + "height": 356, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmNdXmNnqYDc=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmNdXmdnvJXE=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmNdXmdnwtCw=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmNdXmtnxgxw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmNdXmtnyo9g=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmNdyjto3Jy4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmNdyjto42rU=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdyjto5HIE=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto42rU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -492, + "top": 4, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdyjto60Nw=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto42rU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 663, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageDownloader", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdyjto7L04=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto42rU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 678, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmNdyjto8yMo=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto42rU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -492, + "top": 4, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 288, + "top": 656, + "width": 311, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNdyjto5HIE=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmNdyjto60Nw=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmNdyjto7L04=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNdyjto8yMo=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmNdyjto9J7o=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmNdymdpmxgM=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUkiJAhI5kL78=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 701, + "width": 301, + "height": 13, + "autoResize": false, + "underline": true, + "text": "+sharedDownloader", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmOMr6uw/dL0=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUmOMr1ewzvaI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 716, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDecompressImages", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmONDyez68BQ=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUmONDtOzuN2c=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 731, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxConcurrentDownloads", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmOaPhvpHGUQ=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUmOaPcvo7CuM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 746, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+downloadTimeout", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmOa8FvsCenQ=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUmOa7+/r2ysU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 761, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+executionOrder", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmOiC6/5m4L8=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "model": { + "$ref": "AAAAAAFUmOiCz/5aGv0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 776, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+urlCredential", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 288, + "top": 696, + "width": 311, + "height": 98, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmNdyjto+23Y=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOOiz+21uaI=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 799, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+downloadImageWithURL(): SDWebImageOperation", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOZtyvmMqac=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFUmOZtsvmAcFQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 814, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+currentDownloadCount()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOeiAvwXuks=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFUmOeh6PwLtkk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 829, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+setValueForHTTPHeaderField()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOf3LvzSxkE=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFUmOf3GPzGjm4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 844, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+setSuspended()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOgcM/2NAEM=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFUmOgcH/2BRjw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 859, + "width": 301, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancelAllDownloads()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 288, + "top": 794, + "width": 311, + "height": 83, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmNdyj9o/7Mk=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -246, + "top": 2, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmNdyj9pAtFk=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "model": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -246, + "top": 2, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 288, + "top": 656, + "width": 311, + "height": 221, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmNdyjto42rU=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmNdyjto9J7o=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmNdyj9o/7Mk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmNdyj9pAtFk=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUmNgnH9uiFxg=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnH9ujhZU=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 30, + "top": 560, + "width": 80, + "height": 13, + "autoResize": false, + "alpha": -4.729930929882652, + "distance": 57.0087712549569, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 1, + "underline": false, + "text": "+imageCache", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnH9uk9uU=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 98, + "top": 560, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnH9ulNQM=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 142, + "top": 561, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnH9umL/o=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdufJSY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 113, + "top": 624, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnH9unkoI=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdufJSY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 99, + "top": 621, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnINuonqI=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdufJSY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 140, + "top": 628, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnINupMjs=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdugw8c=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 113, + "top": 498, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnINuqkZY=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdugw8c=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 99, + "top": 501, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNgnINur0dc=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdugw8c=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 140, + "top": 494, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNgnINusTA4=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdufJSY=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNgnINut7dA=", + "_parent": { + "$ref": "AAAAAAFUmNgnH9uiFxg=" + }, + "model": { + "$ref": "AAAAAAFUmNgnHdugw8c=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "tail": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "lineStyle": 0, + "points": "128:656;128:479", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmNgnH9ujhZU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNgnH9uk9uU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNgnH9ulNQM=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUmNgnH9umL/o=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUmNgnH9unkoI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUmNgnINuonqI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUmNgnINupMjs=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUmNgnINuqkZY=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUmNgnINur0dc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUmNgnINusTA4=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUmNgnINut7dA=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUmNjw3d8eD54=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3d8fv8Q=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 358, + "top": 559, + "width": 110, + "height": 13, + "autoResize": false, + "alpha": -1.5565114726115359, + "distance": 70.00714249274856, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 1, + "underline": false, + "text": "+imageDownloader", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3d8gCZ4=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 314, + "top": 560, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3d8hrFY=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 358, + "top": 561, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8iKUQ=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298bVKc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 329, + "top": 624, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8jrtE=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298bVKc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 315, + "top": 621, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8kP7I=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298bVKc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 356, + "top": 628, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8lsTA=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298cZas=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 329, + "top": 498, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8mhPI=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298cZas=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 315, + "top": 501, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmNjw3t8nrxk=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298cZas=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 356, + "top": 494, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNjw3t8obIo=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298bVKc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUmNjw3t8plxw=", + "_parent": { + "$ref": "AAAAAAFUmNjw3d8eD54=" + }, + "model": { + "$ref": "AAAAAAFUmNjw298cZas=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "tail": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "lineStyle": 0, + "points": "344:656;344:479", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmNjw3d8fv8Q=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmNjw3d8gCZ4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmNjw3d8hrFY=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUmNjw3t8iKUQ=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUmNjw3t8jrtE=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUmNjw3t8kP7I=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUmNjw3t8lsTA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUmNjw3t8mhPI=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUmNjw3t8nrxk=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUmNjw3t8obIo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUmNjw3t8plxw=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmN7w++U0Wt4=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmN7w++U1D3A=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmN7w/OU2AsY=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U1D3A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -104, + "top": 24, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmN7w/OU3+1Q=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U1D3A=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1053, + "top": 287, + "width": 208, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageCombinedOperation", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmN7w/OU4h5k=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U1D3A=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1053, + "top": 302, + "width": 208, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmN7w/OU5Fgw=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U1D3A=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -104, + "top": 24, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1048, + "top": 280, + "width": 218, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmN7w/OU2AsY=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmN7w/OU3+1Q=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmN7w/OU4h5k=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmN7w/OU5Fgw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmN7w/OU61Fs=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1048, + "top": 320, + "width": 218, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmN7w/eU7uaA=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1048, + "top": 330, + "width": 218, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmN7w/eU88NU=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -52, + "top": 12, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmN7w/eU9h3Y=", + "_parent": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "model": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -52, + "top": 12, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 1048, + "top": 280, + "width": 218, + "height": 60, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmN7w++U1D3A=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmN7w/OU61Fs=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmN7w/eU7uaA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmN7w/eU88NU=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmN7w/eU9h3Y=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFUmN83d+YgNU8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmN83duYfrao=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmN83d+YhTFs=", + "_parent": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "model": { + "$ref": "AAAAAAFUmN83duYfrao=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1097, + "top": 194, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmN83eOYiOlg=", + "_parent": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "model": { + "$ref": "AAAAAAFUmN83duYfrao=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1082, + "top": 194, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmN83eOYjmKI=", + "_parent": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "model": { + "$ref": "AAAAAAFUmN83duYfrao=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1126, + "top": 195, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmN83d+YgNU8=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "tail": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "lineStyle": 0, + "points": "1112:280;1112:123", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmN83d+YhTFs=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmN83eOYiOlg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmN83eOYjmKI=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmOQ29O44VzA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmOQ29O45aDI=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmOQ29O46cUE=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O45aDI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -296, + "top": -34, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOQ29e47Da4=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O45aDI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 287, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageDownloaderOperation", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOQ29e48kII=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O45aDI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 302, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOQ29e490xI=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O45aDI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -296, + "top": -34, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 712, + "top": 280, + "width": 329, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOQ29O46cUE=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmOQ29e47Da4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmOQ29e48kII=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOQ29e490xI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmOQ29e4+IBw=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO0baQoZwsQ=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO0bSwoHlgM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 325, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+request", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO4eGBB24hU=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO4eABBktMs=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 340, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+response", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO04UgrUEn4=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO04OQrC3XA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 355, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDecompressImages", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO1WIQuPqu8=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO1WCQt9gzI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 370, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldUseCredentialStorage", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO1nJAxKCkk=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO1nCQw4ACs=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 385, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+credential", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFUmO2Trw0FylY=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFUmO2TmQzzs/g=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 400, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+options: SDWebImageDownloaderOptions", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 712, + "top": 320, + "width": 329, + "height": 98, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmOQ29e4/KXY=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmO55jxH4auE=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4/KXY=" + }, + "model": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 717, + "top": 423, + "width": 319, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+init(request, options, progress, completed, cancelled)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 712, + "top": 418, + "width": 329, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmOQ29u5AeKo=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -148, + "top": -17, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmOQ29u5B6fk=", + "_parent": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "model": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -148, + "top": -17, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 712, + "top": 280, + "width": 329, + "height": 161, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmOQ29O45aDI=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmOQ29e4/KXY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmOQ29u5AeKo=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmOQ29u5B6fk=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFUmORm3fAxc2k=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmORm3vAy30U=", + "_parent": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 952, + "top": 187, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmORm3vAz3FI=", + "_parent": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 952, + "top": 172, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmORm3vA0d1I=", + "_parent": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 952, + "top": 217, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmORm3fAxc2k=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmNWcUNb3p+o=" + }, + "tail": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "lineStyle": 0, + "points": "913:280;913:208;992:208;992:123", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmORm3vAy30U=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmORm3vAz3FI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmORm3vA0d1I=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmOnlEf8pNwY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmOnlEf8qqCk=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmOnlEf8rJeA=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8qqCk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1716, + "top": 1102, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOnlEf8sqMM=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8qqCk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 157, + "top": 1079, + "width": 167, + "height": 13, + "autoResize": false, + "underline": false, + "text": "UIImage (ForceDecode)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOnlEv8tEXI=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8qqCk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 157, + "top": 1094, + "width": 167, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOnlEv8uaUA=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8qqCk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1716, + "top": 1102, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 152, + "top": 1072, + "width": 177, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOnlEf8rJeA=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmOnlEf8sqMM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmOnlEv8tEXI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOnlEv8uaUA=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmOnlEv8vph0=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 152, + "top": 1112, + "width": 177, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmOnlEv8wGVU=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmOoqDAAV8U8=", + "_parent": { + "$ref": "AAAAAAFUmOnlEv8wGVU=" + }, + "model": { + "$ref": "AAAAAAFUmOop7QADnYU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 157, + "top": 1127, + "width": 167, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+decodedImageWithImage:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 152, + "top": 1122, + "width": 177, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmOnlEv8xWoY=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -858, + "top": 551, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmOnlE/8yfdY=", + "_parent": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "model": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -858, + "top": 551, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 152, + "top": 1072, + "width": 177, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmOnlEf8qqCk=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmOnlEv8vph0=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmOnlEv8wGVU=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmOnlEv8xWoY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmOnlE/8yfdY=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFUmOqV7QIlM+0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOqV7AIjWRM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOqV7QIma44=", + "_parent": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "model": { + "$ref": "AAAAAAFUmOqV7AIjWRM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 214, + "top": 1034, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOqV7QInMUg=", + "_parent": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "model": { + "$ref": "AAAAAAFUmOqV7AIjWRM=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 229, + "top": 1034, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOqV7QIowkU=", + "_parent": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "model": { + "$ref": "AAAAAAFUmOqV7AIjWRM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 185, + "top": 1035, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOqV7QIlM+0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "tail": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "lineStyle": 0, + "points": "200:1011;200:1072", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmOqV7QIma44=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOqV7QInMUg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOqV7QIowkU=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFUmOrfAwPfSks=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOrfBAPgKuw=", + "_parent": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 315, + "top": 929, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOrfBAPhzCM=", + "_parent": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 315, + "top": 944, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOrfBAPiGjo=", + "_parent": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 316, + "top": 899, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOrfAwPfSks=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmOnlEf8pNwY=" + }, + "tail": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "lineStyle": 0, + "points": "344:876;344:920;288:920;288:1072", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmOrfBAPgKuw=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOrfBAPhzCM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOrfBAPiGjo=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmOyEIAeg9L8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmOyEIAeh4xQ=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmOyEIQei2tE=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeh4xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -110, + "top": -58, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOyEIQejH4E=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeh4xQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 765, + "top": 55, + "width": 102, + "height": 13, + "autoResize": false, + "underline": false, + "text": "NSOperation", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOyEIQek8+Q=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeh4xQ=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 765, + "top": 70, + "width": 102, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Foundation)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmOyEIQelriw=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeh4xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -110, + "top": -58, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 760, + "top": 48, + "width": 112, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOyEIQei2tE=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmOyEIQejH4E=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmOyEIQek8+Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOyEIQelriw=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmOyEIgemdqw=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 760, + "top": 88, + "width": 112, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmOyEIgen27w=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 760, + "top": 98, + "width": 112, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmOyEIgeoh1I=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -55, + "top": -29, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmOyEIwepQVY=", + "_parent": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "model": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -55, + "top": -29, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 760, + "top": 48, + "width": 112, + "height": 60, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmOyEIAeh4xQ=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmOyEIgemdqw=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmOyEIgen27w=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmOyEIgeoh1I=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmOyEIwepQVY=" + } + }, + { + "_type": "UMLGeneralizationView", + "_id": "AAAAAAFUmOy6hQh9ydE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOy6gwh7Mto=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOy6hgh+srQ=", + "_parent": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "model": { + "$ref": "AAAAAAFUmOy6gwh7Mto=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 809, + "top": 186, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOy6hgh/2nk=", + "_parent": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "model": { + "$ref": "AAAAAAFUmOy6gwh7Mto=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 794, + "top": 186, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUmOy6hgiAiKw=", + "_parent": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "model": { + "$ref": "AAAAAAFUmOy6gwh7Mto=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 838, + "top": 187, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUmOy6hQh9ydE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmOyEIAeg9L8=" + }, + "tail": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "lineStyle": 0, + "points": "824:280;824:107", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUmOy6hgh+srQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUmOy6hgh/2nk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmOy6hgiAiKw=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmPnxoSwmlwM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmPnxoSwnGWc=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmPnxoiwoWyI=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwnGWc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -22, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPnxoiwp/Pc=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwnGWc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 733, + "top": 960, + "width": 195, + "height": 13, + "autoResize": false, + "underline": false, + "text": "MKAnnotationView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPnxoiwqc/8=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwnGWc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 733, + "top": 975, + "width": 195, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPnxoiwr8yc=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwnGWc=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -22, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 728, + "top": 953, + "width": 205, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmPnxoiwoWyI=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmPnxoiwp/Pc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmPnxoiwqc/8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmPnxoiwr8yc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmPnxoiwsEx4=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 728, + "top": 993, + "width": 205, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmPnxoiwt1Co=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPnxsyxbMFU=", + "_parent": { + "$ref": "AAAAAAFUmPnxoiwt1Co=" + }, + "model": { + "$ref": "AAAAAAFUmPndIiv0KoI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 733, + "top": 1008, + "width": 195, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_setImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 728, + "top": 1003, + "width": 205, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmPnxoywuDz4=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -11, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmPnxoywvM6Y=", + "_parent": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "model": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -11, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 728, + "top": 953, + "width": 205, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmPnxoSwnGWc=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmPnxoiwsEx4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmPnxoiwt1Co=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmPnxoywuDz4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmPnxoywvM6Y=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmPsPJi0J5Fw=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmPsPJi0KI5E=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmPsPJy0L8J0=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0KI5E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -228, + "top": -48, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPsPJy0MwGc=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0KI5E=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 959, + "width": 142, + "height": 13, + "autoResize": false, + "underline": false, + "text": "UIButton (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPsPJy0Nux0=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0KI5E=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 974, + "width": 142, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPsPJy0OJqI=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0KI5E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -228, + "top": -48, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 944, + "top": 952, + "width": 152, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmPsPJy0L8J0=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmPsPJy0MwGc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmPsPJy0Nux0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmPsPJy0OJqI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmPsPKC0PxY4=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 944, + "top": 992, + "width": 152, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmPsPKC0QR5M=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPsYuS19oBM=", + "_parent": { + "$ref": "AAAAAAFUmPsPKC0QR5M=" + }, + "model": { + "$ref": "AAAAAAFUmPsYkS1rEno=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 949, + "top": 1007, + "width": 142, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_setImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 944, + "top": 1002, + "width": 152, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmPsPKC0RGsg=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -114, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmPsPKC0Ssb0=", + "_parent": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "model": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -114, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 944, + "top": 952, + "width": 152, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmPsPJi0KI5E=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmPsPKC0PxY4=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmPsPKC0QR5M=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmPsPKC0RGsg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmPsPKC0Ssb0=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFUmPubFi7kzSY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUmPubFi7ldgA=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUmPubFy7m7zM=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7ldgA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -62, + "top": -46, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPubFy7n6Dk=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7ldgA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 557, + "top": 959, + "width": 158, + "height": 13, + "autoResize": false, + "underline": false, + "text": "UIImageView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPubFy7oD0o=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7ldgA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 557, + "top": 974, + "width": 158, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUmPubFy7pkco=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7ldgA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -62, + "top": -46, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 552, + "top": 952, + "width": 168, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUmPubFy7m7zM=" + }, + "nameLabel": { + "$ref": "AAAAAAFUmPubFy7n6Dk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUmPubFy7oD0o=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUmPubFy7pkco=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFUmPubFy7qR80=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 552, + "top": 992, + "width": 168, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFUmPubGC7rOFM=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFUmPubKC8Z6Qs=", + "_parent": { + "$ref": "AAAAAAFUmPubGC7rOFM=" + }, + "model": { + "$ref": "AAAAAAFUmPuK4C6yWrI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 557, + "top": 1007, + "width": 158, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_setImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 552, + "top": 1002, + "width": 168, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFUmPubGC7scHg=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -31, + "top": -23, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFUmPubGC7t9Sw=", + "_parent": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "model": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -31, + "top": -23, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 552, + "top": 952, + "width": 168, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUmPubFi7ldgA=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFUmPubFy7qR80=" + }, + "operationCompartment": { + "$ref": "AAAAAAFUmPubGC7rOFM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFUmPubGC7scHg=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFUmPubGC7t9Sw=" + } + } + ] }, { "_type": "UMLCollaboration", @@ -181,7 +8613,172 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "SDWebImagePrefetcher", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmMzgZcn8MSQ=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "manager", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmMzgZsn92Qw=", + "_parent": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmMzgZsn+nz8=", + "_parent": { + "$ref": "AAAAAAFUmMzgZcn8MSQ=" + }, + "reference": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmM8TqsupT40=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "delegate", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmM8Tqsuqc7A=", + "_parent": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "reference": { + "$ref": "AAAAAAFUkhg5/4zs5zU=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmM8Tqsuru94=", + "_parent": { + "$ref": "AAAAAAFUmM8TqsupT40=" + }, + "reference": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmM4zy8syqFU=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "sharedImagePrefetcher", + "visibility": "public", + "isStatic": true, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmMwm7Mnxz9U=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "options", + "stereotype": "", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmM3dVsr1bHY=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "prefetchURLs:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNCMgs5kwbc=", + "_parent": { + "$ref": "AAAAAAFUkhgItozoKPM=" + }, + "name": "cancelPrefetching", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], "isAbstract": false, "isFinalSpecialization": false, "isLeaf": false, @@ -236,6 +8833,145 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "SDWebImageManager", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmNGSiNAIwc4=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "delegate", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNGSiNAJw9E=", + "_parent": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "reference": { + "$ref": "AAAAAAFUkh5jeI3spbg=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNGSiNAKXzo=", + "_parent": { + "$ref": "AAAAAAFUmNGSiNAIwc4=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmNgnHdueiaU=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "imageCache", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNgnHdufJSY=", + "_parent": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "reference": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNgnHdugw8c=", + "_parent": { + "$ref": "AAAAAAFUmNgnHdueiaU=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + }, + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmNjLG94yKqE=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNjLG94zD4E=", + "_parent": { + "$ref": "AAAAAAFUmNjLG94yKqE=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNjLG940ssQ=", + "_parent": { + "$ref": "AAAAAAFUmNjLG94yKqE=" + }, + "reference": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], "visibility": "public", "attributes": [ { @@ -255,6 +8991,27 @@ "isDerived": false, "aggregation": "none", "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmMkoD8jx3Dk=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "options", + "stereotype": "", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkhyNUo23oFw=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false } ], "operations": [ @@ -268,6 +9025,151 @@ "visibility": "public", "isStatic": false, "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmNYJLthMwcI=", + "_parent": { + "$ref": "AAAAAAFUkh/xZ44AqYk=" + }, + "name": "Parameter1", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "return" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNLHKNJpLPM=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "saveImageToCache:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNLtYNLc08o=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "cancelAll", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNNJv9NPrNI=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "cachedImageExistsForURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmNPQf9Tw0fM=", + "_parent": { + "$ref": "AAAAAAFUmNNJv9NPrNI=" + }, + "name": "Parameter1", + "stereotype": "", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "BOOL", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "return" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNNp59PCdv8=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "diskImageExistsForURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmNaUldjqLy4=", + "_parent": { + "$ref": "AAAAAAFUmNNp59PCdv8=" + }, + "name": "Parameter1", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "BOOL", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "return" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNORx9Q1mi4=", + "_parent": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "name": "cacheKeyForURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmNbDrdlJMIU=", + "_parent": { + "$ref": "AAAAAAFUmNORx9Q1mi4=" + }, + "name": "Parameter1", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "NSString", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "return" + } + ], "concurrency": "sequential", "isQuery": false, "isAbstract": false @@ -449,6 +9351,22 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "SDImageCache", + "ownedElements": [ + { + "_type": "UMLDependency", + "_id": "AAAAAAFUmOqV7AIjWRM=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "source": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "target": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "visibility": "public" + } + ], "visibility": "public", "attributes": [ { @@ -459,6 +9377,24 @@ }, "name": "sharedImageCache", "visibility": "public", + "isStatic": true, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPBKVhghKWk=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "shouldDecompressImages", + "visibility": "public", "isStatic": false, "isLeaf": false, "type": "", @@ -468,6 +9404,336 @@ "isDerived": false, "aggregation": "none", "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPBxrhjcaQc=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "shouldDisableiCloud", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPCLlRmXEPs=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "shouldCacheImagesInMemory", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPDC7hpSvPQ=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "maxMemoryCost", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPDhrRsNyCc=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "maxMemoryCountLimit", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPD+pRvI9sU=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "maxCacheAge", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPEdRRyDmKo=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "maxCacheSize", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPGStR3F538=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "init", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmPG3vB5TsDQ=", + "_parent": { + "$ref": "AAAAAAFUmPGStR3F538=" + }, + "name": "namespace", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPHYnB7PNs4=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "init", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmPHujB9dtv8=", + "_parent": { + "$ref": "AAAAAAFUmPHYnB7PNs4=" + }, + "name": "namespace", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmPH10x+6tbo=", + "_parent": { + "$ref": "AAAAAAFUmPHYnB7PNs4=" + }, + "name": "diskCacheDirectory", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPMOWiHsOa0=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "storeImage", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPMtQiKnVfM=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "storeImageDataToDisk", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPN5KSOfrIg=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "queryDiskCacheForKey", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPOk0iRaSME=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "imageFromMemoryCacheForKey", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPPBiSUVHSU=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "imageFromDiskCacheForKey", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPPiwSXQs7U=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "removeImageForKey", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPQzYSaLCQc=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "clearMemory", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPRYYSdGCZA=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "clearDIsk", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPTT0CgBzK8=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "cachePathForKey", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPT4WSi8pg0=", + "_parent": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "name": "addReadOnlyCachePath", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false } ], "isAbstract": false, @@ -482,6 +9748,68 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "SDWebImageDownloader", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUmNjw298aBP0=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "imageDownloader", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNjw298bVKc=", + "_parent": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "reference": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUmNjw298cZas=", + "_parent": { + "$ref": "AAAAAAFUmNjw298aBP0=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + }, + { + "_type": "UMLDependency", + "_id": "AAAAAAFUmOrfAwPdh8M=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "source": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "target": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "visibility": "public" + } + ], "visibility": "public", "attributes": [ { @@ -501,6 +9829,188 @@ "isDerived": false, "aggregation": "none", "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmOMr1ewzvaI=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "shouldDecompressImages", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmONDtOzuN2c=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "maxConcurrentDownloads", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmOaPcvo7CuM=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "downloadTimeout", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmOa7+/r2ysU=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "executionOrder", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmOiCz/5aGv0=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "urlCredential", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOOite2pkfo=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "downloadImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmOW7A/c+Z/0=", + "_parent": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "name": "Parameter1", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "return" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOZtsvmAcFQ=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "currentDownloadCount", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOeh6PwLtkk=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "setValueForHTTPHeaderField", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOf3GPzGjm4=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "setSuspended", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOgcH/2BRjw=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "cancelAllDownloads", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false } ], "isAbstract": false, @@ -556,7 +10066,522 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "SDWebImageDownloaderOperation", + "ownedElements": [ + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFUmORm3fAwE60=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "source": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "target": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "visibility": "public" + }, + { + "_type": "UMLGeneralization", + "_id": "AAAAAAFUmOy6gwh7Mto=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "source": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "target": { + "$ref": "AAAAAAFUmOxnEwduTCw=" + }, + "visibility": "public" + } + ], "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO0bSwoHlgM=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "request", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO4eABBktMs=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "response", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO04OQrC3XA=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "shouldDecompressImages", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO1WCQt9gzI=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "shouldUseCredentialStorage", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO1nCQw4ACs=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "credential", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmO2TmQzzs/g=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "options", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmO55eBHmK5M=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "init", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmO7d6BKxVI0=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "request", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmO731xMtljo=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "options", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmO8cHxOp5oU=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "progress", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmO8jyBQGoLQ=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "completed", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFUmO8xhxRjvng=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "cancelled", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFUmNVIhta461s=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageOperation", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmNWHXtbX7L0=", + "_parent": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "name": "cancel", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUmN6ZSOUCaRM=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageCombinedOperation", + "ownedElements": [ + { + "_type": "UMLInterfaceRealization", + "_id": "AAAAAAFUmN83duYfrao=", + "_parent": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "source": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "target": { + "$ref": "AAAAAAFUmNVIhta461s=" + }, + "visibility": "public" + } + ], + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLEnumeration", + "_id": "AAAAAAFUmOC2fugTUX8=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageDownloaderOptions", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "literals": [ + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmODurehEneQ=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderLowPriority", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOD23ehlAns=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderProgressiveDownload", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOD+neiGg3g=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderUseNSURLCache", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOEGbeinNtM=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderIgnoreCachedResponse", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOENpujIT/I=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderContinueInBackground", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOEVzujp/Q0=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderHandleCookies", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOEc/ekKMBo=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderAllowInvalidSSLCertificates", + "visibility": "public" + }, + { + "_type": "UMLEnumerationLiteral", + "_id": "AAAAAAFUmOEkLekrSQE=", + "_parent": { + "$ref": "AAAAAAFUmOC2fugTUX8=" + }, + "name": "SDWebImageDownloaderHighPriority", + "visibility": "public" + } + ] + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUmOmq1v73mh4=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "UIImage (ForceDecode)", + "ownedElements": [ + { + "_type": "UMLDependency", + "_id": "AAAAAAFUmOqEnwFlgk0=", + "_parent": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "source": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "target": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "visibility": "public" + } + ], + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmOop7QADnYU=", + "_parent": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "name": "decodedImageWithImage:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUmPjp9CtnN2Y=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "MKAnnotationView (WebCache)", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPndIiv0KoI=", + "_parent": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "name": "sd_setImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUmPoFSiy4ZTk=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "UIButton (WebCache)", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPsYkS1rEno=", + "_parent": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "name": "sd_setImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFUmPtmMC6BqlU=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "UIImageView (WebCache)", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFUmPuK4C6yWrI=", + "_parent": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "name": "sd_setImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], "isAbstract": false, "isFinalSpecialization": false, "isLeaf": false, @@ -573,6 +10598,30 @@ }, "name": "WebP", "visibility": "public" + }, + { + "_type": "UMLPackage", + "_id": "AAAAAAFUmOwkzAc9obg=", + "_parent": { + "$ref": "AAAAAAFF+qBWK6M3Z8Y=" + }, + "name": "Foundation", + "ownedElements": [ + { + "_type": "UMLClass", + "_id": "AAAAAAFUmOxnEwduTCw=", + "_parent": { + "$ref": "AAAAAAFUmOwkzAc9obg=" + }, + "name": "NSOperation", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + } + ], + "visibility": "public" } ], "visibility": "public" From 503d3aed2782fe3be2db44794bd22e53b8b70dd3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 10 May 2016 08:37:12 +0300 Subject: [PATCH 028/207] Schemes update (naming) --- .../xcshareddata/xcschemes/SDWebImage iOS.xcscheme | 6 +++--- .../xcshareddata/xcschemes/SDWebImage tvOS.xcscheme | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme index 9f6c729e..40650fee 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ @@ -64,7 +64,7 @@ diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme index 3efe6430..c766c9c3 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage tvOS.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ @@ -64,7 +64,7 @@ From 123f2fd2e674ca82389b7bff7b4324a35d053917 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 10 May 2016 08:39:46 +0300 Subject: [PATCH 029/207] Updated docs - tried to cleanup the readme, reorder based on other great projects examples and include the diagram --- ManualInstallation.md | 33 ++++ README.md | 155 +++++++----------- ... Diagram.png => SDWebImageClassDiagram.png | Bin 3 files changed, 96 insertions(+), 92 deletions(-) create mode 100644 ManualInstallation.md rename Class Diagram.png => SDWebImageClassDiagram.png (100%) diff --git a/ManualInstallation.md b/ManualInstallation.md new file mode 100644 index 00000000..937b30c8 --- /dev/null +++ b/ManualInstallation.md @@ -0,0 +1,33 @@ +### Installation by cloning the repository + +In order to gain access to all the files from the repository, you should clone it. +``` +git clone --recursive https://github.com/rs/SDWebImage.git +``` + +... TO BE CHECKED AND DESCRIBED IN DETAIL + +### Add dependencies + +- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: +- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: + +### Add Linker Flag + +Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: + +![Other Linker Flags](http://dl.dropbox.com/u/123346/SDWebImage/10_other_linker_flags.jpg) + +Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use: +``` +-force_load SDWebImage.framework/Versions/Current/SDWebImage +``` + +If you're using Cocoa Pods and have any frameworks that extend optional libraries, such as Parsen RestKit or opencv2, instead of the -ObjC flag use: +``` +-force_load $(TARGET_BUILD_DIR)/libPods.a +``` +and this: +``` +$(inherited) +``` \ No newline at end of file diff --git a/README.md b/README.md index c7954cd8..b02f259c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -Web Image -========= +SDWebImage +========== [![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) [![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) @@ -8,42 +8,54 @@ Web Image [![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) -This library provides a category for UIImageView with support for remote images coming from the web. +This library provides an async image downloader with cache support. For convenience, we added categories for some `UIControl` elements like `UIImageView`. -It provides: +## Features -- An `UIImageView` category adding web image and cache management to the Cocoa Touch framework -- An asynchronous image downloader -- An asynchronous memory + disk image caching with automatic cache expiration handling -- Animated GIF support -- WebP format support -- A background image decompression -- A guarantee that the same URL won't be downloaded several times -- A guarantee that bogus URLs won't be retried again and again -- A guarantee that main thread will never be blocked -- Performances! -- Use GCD and ARC -- Arm64 support +- [x] Categories for `UIImageView`, `UIButton`, `MKAnnotationView` adding web image and cache management +- [x] An asynchronous image downloader +- [x] An asynchronous memory + disk image caching with automatic cache expiration handling +- [x] A background image decompression +- [x] A guarantee that the same URL won't be downloaded several times +- [x] A guarantee that bogus URLs won't be retried again and again +- [x] A guarantee that main thread will never be blocked +- [x] Performances! +- [x] Use GCD and ARC -NOTE: The version 3.0 of SDWebImage isn't fully backward compatible with 2.0 and requires iOS 5.1.1 -minimum deployment version. If you need iOS < 5.0 support, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). +## Supported Image Formats -[How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) +- Image formats supported by UIImage (JPEG, PNG, ...), including GIF +- WebP format (use the `WebP` subspec) -Who Uses It ----------- +## Requirements -Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. +- iOS 5.1.1+ / tvOS 9.0+ +- Xcode 7.1+ -How To Use ----------- +#### Backwards compatibility -API documentation is available at [CocoaDocs - SDWebImage](http://cocoadocs.org/docsets/SDWebImage/) +- For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). -### Using UIImageView+WebCache category with UITableView +## Getting Started -Just #import the UIImageView+WebCache.h header, and call the sd_setImageWithURL:placeholderImage: -method from the tableView:cellForRowAtIndexPath: UITableViewDataSource method. Everything will be +- Read this Readme doc +- Read the [How to use section](https://github.com/rs/SDWebImage#how-to-use) +- Read the [documentation @ CocoaDocs](http://cocoadocs.org/docsets/SDWebImage/) +- Read [How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) +- Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` +- Get to the [installation steps](https://github.com/rs/SDWebImage#installation) + +## Who Uses It +- Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. + +## Installation + +## How To Use + +#### Using `UIImageView+WebCache` category with `UITableView` + +Just import the `UIImageView+WebCache.h` header, and call the `sd_setImageWithURL:placeholderImage:` +method from the `tableView:cellForRowAtIndexPath:` `UITableViewDataSource` method. Everything will be handled for you, from async downloads to caching management. ```objective-c @@ -69,16 +81,26 @@ handled for you, from async downloads to caching management. } ``` +```swift +import SDWebImage +... +func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { + static let myIdentifier = "MyIdentifier" + let cell = tableView.dequeueReusableCellWithIdentifier(myIdentifier, forIndexPath: indexPath) as UITableViewCell + + cell.imageView.sd_setImageWithURL(imageUrl, placeholderImage:placeholderImage) + return cell +``` + ### Using blocks -With blocks, you can be notified about the image download progress and whenever the image retrieval -has completed with success or not: +With blocks, you can be notified about the image download progress and whenever the image retrieval has completed with success or not: ```objective-c // Here we use the new provided sd_setImageWithURL: method to load the web image [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"] - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + placeholderImage:[UIImage imageNamed:@"placeholder.png"] + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { ... completion code here ... }]; ``` @@ -87,11 +109,9 @@ Note: neither your success nor failure block will be call if your image request ### Using SDWebImageManager -The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the -asynchronous downloader with the image cache store. You can use this class directly to benefit -from web image downloading with caching in another context than a UIView (ie: with Cocoa). +The `SDWebImageManager` is the class behind the `UIImageView(WebCache)` category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a `UIView` (ie: with Cocoa). -Here is a simple example of how to use SDWebImageManager: +Here is a simple example of how to use `SDWebImageManager`: ```objective-c SDWebImageManager *manager = [SDWebImageManager sharedManager]; @@ -253,63 +273,8 @@ To install with carthage, follow the instruction on [Carthage](https://github.co github "rs/SDWebImage" ``` -#### Usage -Swift - -If you installed using CocoaPods: -``` -import SDWebImage -``` - -If you installed manually: -``` -import WebImage -``` - -Objective-C - -``` -@import WebImage; -``` - ### Installation by cloning the repository - -In order to gain access to all the files from the repository, you should clone it. -``` -git clone --recursive https://github.com/rs/SDWebImage.git -``` - -### Add the SDWebImage project to your project - -- Download and unzip the last version of the framework from the [download page](https://github.com/rs/SDWebImage/releases) -- Right-click on the project navigator and select "Add Files to "Your Project": -- In the dialog, select SDWebImage.framework: -- Check the "Copy items into destination group's folder (if needed)" checkbox - -### Add dependencies - -- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: -- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: - -### Add Linker Flag - -Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: - -![Other Linker Flags](http://dl.dropbox.com/u/123346/SDWebImage/10_other_linker_flags.jpg) - -Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use: -``` --force_load SDWebImage.framework/Versions/Current/SDWebImage -``` - -If you're using Cocoa Pods and have any frameworks that extend optional libraries, such as Parsen RestKit or opencv2, instead of the -ObjC flag use: -``` --force_load $(TARGET_BUILD_DIR)/libPods.a -``` -and this: -``` -$(inherited) -``` +- see [Manual install](https://raw.github.com/rs/SDWebImage/master/ManualInstallation.md) ### Import headers in your source files @@ -332,3 +297,9 @@ Future Enhancements ## Licenses All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). + +## Architecture + +

+ +

diff --git a/Class Diagram.png b/SDWebImageClassDiagram.png similarity index 100% rename from Class Diagram.png rename to SDWebImageClassDiagram.png From aa1d2905c95283c3f5f739e47463a5f3147d608f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 10 May 2016 08:50:55 +0300 Subject: [PATCH 030/207] Created a Docs folder with md files and the diagrams. Moved all the HowToUse code samples to a dedicated file (HowToUse.md) to lighten up the Readme. --- Docs/HowToUse.md | 147 ++++++++++++++++ .../ManualInstallation.md | 0 SDWebImage.mdj => Docs/SDWebImage.mdj | 0 .../SDWebImageClassDiagram.png | Bin README.md | 157 ++---------------- 5 files changed, 160 insertions(+), 144 deletions(-) create mode 100644 Docs/HowToUse.md rename ManualInstallation.md => Docs/ManualInstallation.md (100%) rename SDWebImage.mdj => Docs/SDWebImage.mdj (100%) rename SDWebImageClassDiagram.png => Docs/SDWebImageClassDiagram.png (100%) diff --git a/Docs/HowToUse.md b/Docs/HowToUse.md new file mode 100644 index 00000000..c9857fba --- /dev/null +++ b/Docs/HowToUse.md @@ -0,0 +1,147 @@ +#### Using `UIImageView+WebCache` category with `UITableView` + +Just import the `UIImageView+WebCache.h` header, and call the `sd_setImageWithURL:placeholderImage:` +method from the `tableView:cellForRowAtIndexPath:` `UITableViewDataSource` method. Everything will be +handled for you, from async downloads to caching management. + +```objective-c +#import + +... + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *MyIdentifier = @"MyIdentifier"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:MyIdentifier] autorelease]; + } + + // Here we use the new provided sd_setImageWithURL: method to load the web image + [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; + + cell.textLabel.text = @"My Text"; + return cell; +} +``` + +```swift +import SDWebImage +... +func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { + static let myIdentifier = "MyIdentifier" + let cell = tableView.dequeueReusableCellWithIdentifier(myIdentifier, forIndexPath: indexPath) as UITableViewCell + + cell.imageView.sd_setImageWithURL(imageUrl, placeholderImage:placeholderImage) + return cell +``` + +### Using blocks + +With blocks, you can be notified about the image download progress and whenever the image retrieval has completed with success or not: + +```objective-c +// Here we use the new provided sd_setImageWithURL: method to load the web image +[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"] + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + ... completion code here ... + }]; +``` + +Note: neither your success nor failure block will be call if your image request is canceled before completion. + +### Using SDWebImageManager + +The `SDWebImageManager` is the class behind the `UIImageView(WebCache)` category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a `UIView` (ie: with Cocoa). + +Here is a simple example of how to use `SDWebImageManager`: + +```objective-c +SDWebImageManager *manager = [SDWebImageManager sharedManager]; +[manager loadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + // progression tracking code + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Downloader Independently + +It's also possible to use the async image downloader independently: + +```objective-c +SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; +[downloader downloadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + // progression tracking code + } + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + if (image && finished) { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Caching Independently + +It is also possible to use the async based image cache store independently. SDImageCache +maintains a memory cache and an optional disk cache. Disk cache write operations are performed +asynchronous so it doesn't add unnecessary latency to the UI. + +The SDImageCache class provides a singleton instance for convenience but you can create your own +instance if you want to create separated cache namespace. + +To lookup the cache, you use the `queryDiskCacheForKey:done:` method. If the method returns nil, it means the cache +doesn't currently own the image. You are thus responsible for generating and caching it. The cache +key is an application unique identifier for the image to cache. It is generally the absolute URL of +the image. + +```objective-c +SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; +[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { + // image is not nil if image was found +}]; +``` + +By default SDImageCache will lookup the disk cache if an image can't be found in the memory cache. +You can prevent this from happening by calling the alternative method `imageFromMemoryCacheForKey:`. + +To store an image into the cache, you use the storeImage:forKey: method: + +```objective-c +[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; +``` + +By default, the image will be stored in memory cache as well as on disk cache (asynchronously). If +you want only the memory cache, use the alternative method storeImage:forKey:toDisk: with a negative +third argument. + +### Using cache key filter + +Sometime, you may not want to use the image URL as cache key because part of the URL is dynamic +(i.e.: for access control purpose). SDWebImageManager provides a way to set a cache key filter that +takes the NSURL as input, and output a cache key NSString. + +The following example sets a filter in the application delegate that will remove any query-string from +the URL before to use it as a cache key: + +```objective-c +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { + url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; + return [url absoluteString]; + }; + + // Your app init code... + return YES; +} +``` \ No newline at end of file diff --git a/ManualInstallation.md b/Docs/ManualInstallation.md similarity index 100% rename from ManualInstallation.md rename to Docs/ManualInstallation.md diff --git a/SDWebImage.mdj b/Docs/SDWebImage.mdj similarity index 100% rename from SDWebImage.mdj rename to Docs/SDWebImage.mdj diff --git a/SDWebImageClassDiagram.png b/Docs/SDWebImageClassDiagram.png similarity index 100% rename from SDWebImageClassDiagram.png rename to Docs/SDWebImageClassDiagram.png diff --git a/README.md b/README.md index b02f259c..45d00ce2 100644 --- a/README.md +++ b/README.md @@ -52,153 +52,22 @@ This library provides an async image downloader with cache support. For convenie ## How To Use -#### Using `UIImageView+WebCache` category with `UITableView` - -Just import the `UIImageView+WebCache.h` header, and call the `sd_setImageWithURL:placeholderImage:` -method from the `tableView:cellForRowAtIndexPath:` `UITableViewDataSource` method. Everything will be -handled for you, from async downloads to caching management. - ```objective-c +Objective-C: + #import - ... - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *MyIdentifier = @"MyIdentifier"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:MyIdentifier] autorelease]; - } - - // Here we use the new provided sd_setImageWithURL: method to load the web image - [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; - - cell.textLabel.text = @"My Text"; - return cell; -} +[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; ``` ```swift -import SDWebImage -... -func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { - static let myIdentifier = "MyIdentifier" - let cell = tableView.dequeueReusableCellWithIdentifier(myIdentifier, forIndexPath: indexPath) as UITableViewCell +Swift: - cell.imageView.sd_setImageWithURL(imageUrl, placeholderImage:placeholderImage) - return cell +imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage:UIImage(imageNamed:"placeholder.png")) ``` -### Using blocks - -With blocks, you can be notified about the image download progress and whenever the image retrieval has completed with success or not: - -```objective-c -// Here we use the new provided sd_setImageWithURL: method to load the web image -[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"] - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - ... completion code here ... - }]; -``` - -Note: neither your success nor failure block will be call if your image request is canceled before completion. - -### Using SDWebImageManager - -The `SDWebImageManager` is the class behind the `UIImageView(WebCache)` category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a `UIView` (ie: with Cocoa). - -Here is a simple example of how to use `SDWebImageManager`: - -```objective-c -SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager loadImageWithURL:imageURL - options:0 - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - // progression tracking code - } - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; -``` - -### Using Asynchronous Image Downloader Independently - -It's also possible to use the async image downloader independently: - -```objective-c -SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; -[downloader downloadImageWithURL:imageURL - options:0 - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - // progression tracking code - } - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - if (image && finished) { - // do something with image - } - }]; -``` - -### Using Asynchronous Image Caching Independently - -It is also possible to use the async based image cache store independently. SDImageCache -maintains a memory cache and an optional disk cache. Disk cache write operations are performed -asynchronous so it doesn't add unnecessary latency to the UI. - -The SDImageCache class provides a singleton instance for convenience but you can create your own -instance if you want to create separated cache namespace. - -To lookup the cache, you use the `queryDiskCacheForKey:done:` method. If the method returns nil, it means the cache -doesn't currently own the image. You are thus responsible for generating and caching it. The cache -key is an application unique identifier for the image to cache. It is generally the absolute URL of -the image. - -```objective-c -SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; -[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { - // image is not nil if image was found -}]; -``` - -By default SDImageCache will lookup the disk cache if an image can't be found in the memory cache. -You can prevent this from happening by calling the alternative method `imageFromMemoryCacheForKey:`. - -To store an image into the cache, you use the storeImage:forKey: method: - -```objective-c -[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; -``` - -By default, the image will be stored in memory cache as well as on disk cache (asynchronously). If -you want only the memory cache, use the alternative method storeImage:forKey:toDisk: with a negative -third argument. - -### Using cache key filter - -Sometime, you may not want to use the image URL as cache key because part of the URL is dynamic -(i.e.: for access control purpose). SDWebImageManager provides a way to set a cache key filter that -takes the NSURL as input, and output a cache key NSString. - -The following example sets a filter in the application delegate that will remove any query-string from -the URL before to use it as a cache key: - -```objective-c -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { - url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; - return [url absoluteString]; - }; - - // Your app init code... - return YES; -} -``` +- For details about how to use the library and clear examples, see [The detailed How to use](https://raw.github.com/rs/SDWebImage/master/Docs/HowToUse.md) Common Problems @@ -221,8 +90,8 @@ If you don't control the image server you're using, you may not be able to chang ``` objective-c [imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] - placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] - options:SDWebImageRefreshCached]; + placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] + options:SDWebImageRefreshCached]; ``` ### Add a progress indicator @@ -234,8 +103,8 @@ Installation There are three ways to use SDWebImage in your project: - using CocoaPods -- copying all the files into your project -- importing the project as a static library +- using Carthage +- by cloning the project into your repository ### Installation with CocoaPods @@ -274,7 +143,7 @@ github "rs/SDWebImage" ``` ### Installation by cloning the repository -- see [Manual install](https://raw.github.com/rs/SDWebImage/master/ManualInstallation.md) +- see [Manual install](https://raw.github.com/rs/SDWebImage/master/Docs/ManualInstallation.md) ### Import headers in your source files @@ -301,5 +170,5 @@ All source code is licensed under the [MIT License](https://raw.github.com/rs/SD ## Architecture

- +

From 162174ccc19b45407ebbf086a59fd2da82681aad Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 17 May 2016 19:02:45 +0300 Subject: [PATCH 031/207] Updated the diagrams + new sequence diagram --- Docs/SDWebImage.mdj | 5883 ++++++++++++++++++++++++---- Docs/SDWebImageClassDiagram.png | Bin 209774 -> 228949 bytes Docs/SDWebImageSequenceDiagram.png | Bin 0 -> 37837 bytes README.md | 5 + 4 files changed, 5167 insertions(+), 721 deletions(-) create mode 100644 Docs/SDWebImageSequenceDiagram.png diff --git a/Docs/SDWebImage.mdj b/Docs/SDWebImage.mdj index 6f5bbd96..8108293c 100644 --- a/Docs/SDWebImage.mdj +++ b/Docs/SDWebImage.mdj @@ -56,9 +56,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 437, - "top": 45, - "width": 209, + "left": 957, + "top": 37, + "width": 224.10009765625, "height": 13, "autoResize": false, "underline": false, @@ -81,9 +81,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 437, - "top": 60, - "width": 209, + "left": 957, + "top": 52, + "width": 224.10009765625, "height": 13, "autoResize": false, "underline": false, @@ -106,9 +106,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 437, - "top": 75, - "width": 209, + "left": 957, + "top": 67, + "width": 224.10009765625, "height": 13, "autoResize": false, "underline": false, @@ -131,8 +131,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -774, - "top": -630, + "left": 266, + "top": -646, "width": 0, "height": 13, "autoResize": false, @@ -150,9 +150,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 432, - "top": 40, - "width": 219, + "left": 952, + "top": 32, + "width": 234.10009765625, "height": 53, "autoResize": false, "stereotypeLabel": { @@ -186,8 +186,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 432, - "top": 93, + "left": 952, + "top": 85, "width": 243, "height": 10, "autoResize": false @@ -220,9 +220,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 437, - "top": 98, - "width": 233, + "left": 957, + "top": 90, + "width": 248.10009765625, "height": 13, "autoResize": false, "underline": false, @@ -248,9 +248,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 437, - "top": 113, - "width": 233, + "left": 957, + "top": 105, + "width": 248.10009765625, "height": 13, "autoResize": false, "underline": false, @@ -268,9 +268,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 432, - "top": 93, - "width": 243, + "left": 952, + "top": 85, + "width": 258.10009765625, "height": 38, "autoResize": false }, @@ -292,8 +292,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -387, - "top": -315, + "left": 133, + "top": -323, "width": 10, "height": 10, "autoResize": false @@ -316,8 +316,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -387, - "top": -315, + "left": 133, + "top": -323, "width": 10, "height": 10, "autoResize": false @@ -332,9 +332,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 432, - "top": 40, - "width": 243, + "left": 952, + "top": 32, + "width": 258.10009765625, "height": 91, "autoResize": false, "stereotypeDisplay": "decoration-label", @@ -399,8 +399,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -776, - "top": -12, + "left": 248, + "top": -188, "width": 0, "height": 13, "autoResize": false, @@ -423,9 +423,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 311, - "width": 275, + "left": 597, + "top": 223, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -448,9 +448,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 326, - "width": 275, + "left": 597, + "top": 238, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -473,8 +473,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -776, - "top": -12, + "left": 248, + "top": -188, "width": 0, "height": 13, "autoResize": false, @@ -492,9 +492,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 304, - "width": 285, + "left": 592, + "top": 216, + "width": 298.13916015625, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -538,9 +538,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 349, - "width": 275, + "left": 597, + "top": 261, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": true, @@ -566,9 +566,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 364, - "width": 275, + "left": 597, + "top": 276, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -586,9 +586,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 344, - "width": 285, + "left": 592, + "top": 256, + "width": 298.13916015625, "height": 38, "autoResize": false }, @@ -620,9 +620,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 387, - "width": 275, + "left": 597, + "top": 299, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -648,9 +648,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 402, - "width": 275, + "left": 597, + "top": 314, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -676,9 +676,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 417, - "width": 275, + "left": 597, + "top": 329, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -704,9 +704,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 432, - "width": 275, + "left": 597, + "top": 344, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -732,9 +732,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 447, - "width": 275, + "left": 597, + "top": 359, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -760,9 +760,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 462, - "width": 275, + "left": 597, + "top": 374, + "width": 288.13916015625, "height": 13, "autoResize": false, "underline": false, @@ -780,9 +780,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 382, - "width": 285, + "left": 592, + "top": 294, + "width": 298.13916015625, "height": 98, "autoResize": false }, @@ -804,8 +804,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -388, - "top": -6, + "left": 116, + "top": -70, "width": 10, "height": 10, "autoResize": false @@ -828,8 +828,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -388, - "top": -6, + "left": 116, + "top": -70, "width": 10, "height": 10, "autoResize": false @@ -844,9 +844,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 80, - "top": 304, - "width": 285, + "left": 592, + "top": 216, + "width": 298.13916015625, "height": 176, "autoResize": false, "stereotypeDisplay": "label", @@ -911,8 +911,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -924, - "top": -190, + "left": 244, + "top": -238, "width": 0, "height": 13, "autoResize": false, @@ -935,9 +935,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 47, - "width": 189, + "left": 669, + "top": 23, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": false, @@ -960,9 +960,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 62, - "width": 189, + "left": 669, + "top": 38, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": false, @@ -985,8 +985,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -924, - "top": -190, + "left": 244, + "top": -238, "width": 0, "height": 13, "autoResize": false, @@ -1004,9 +1004,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 40, - "width": 199, + "left": 664, + "top": 16, + "width": 202.740234375, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -1050,9 +1050,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 85, - "width": 189, + "left": 669, + "top": 61, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": true, @@ -1078,9 +1078,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 100, - "width": 189, + "left": 669, + "top": 76, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": false, @@ -1098,9 +1098,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 80, - "width": 199, + "left": 664, + "top": 56, + "width": 202.740234375, "height": 38, "autoResize": false }, @@ -1132,9 +1132,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 123, - "width": 189, + "left": 669, + "top": 99, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": false, @@ -1160,9 +1160,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 138, - "width": 189, + "left": 669, + "top": 114, + "width": 192.740234375, "height": 13, "autoResize": false, "underline": false, @@ -1180,9 +1180,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 118, - "width": 199, + "left": 664, + "top": 94, + "width": 202.740234375, "height": 38, "autoResize": false }, @@ -1204,8 +1204,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -286, - "top": -95, + "left": 298, + "top": -119, "width": 10, "height": 10, "autoResize": false @@ -1228,8 +1228,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -286, - "top": -95, + "left": 298, + "top": -119, "width": 10, "height": 10, "autoResize": false @@ -1244,9 +1244,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 80, - "top": 40, - "width": 199, + "left": 664, + "top": 16, + "width": 202.740234375, "height": 116, "autoResize": false, "stereotypeDisplay": "label", @@ -1304,8 +1304,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 111, - "top": 231, + "left": 667, + "top": 175, "width": 58, "height": 13, "autoResize": false, @@ -1338,8 +1338,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 154, - "top": 222, + "left": 710, + "top": 166, "width": 0, "height": 13, "autoResize": false, @@ -1371,8 +1371,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 198, - "top": 223, + "left": 754, + "top": 167, "width": 0, "height": 13, "autoResize": false, @@ -1404,8 +1404,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 169, - "top": 272, + "left": 725, + "top": 184, "width": 0, "height": 13, "autoResize": false, @@ -1437,8 +1437,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 155, - "top": 269, + "left": 711, + "top": 181, "width": 0, "height": 13, "autoResize": false, @@ -1470,8 +1470,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 196, - "top": 276, + "left": 752, + "top": 188, "width": 0, "height": 13, "autoResize": false, @@ -1503,8 +1503,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 169, - "top": 174, + "left": 725, + "top": 150, "width": 0, "height": 13, "autoResize": false, @@ -1536,8 +1536,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 155, - "top": 177, + "left": 711, + "top": 153, "width": 0, "height": 13, "autoResize": false, @@ -1569,8 +1569,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 196, - "top": 170, + "left": 752, + "top": 146, "width": 0, "height": 13, "autoResize": false, @@ -1649,7 +1649,7 @@ "$ref": "AAAAAAFUmMuDNcmaKIo=" }, "lineStyle": 0, - "points": "184:304;184:155", + "points": "740:216;740:131", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -1717,8 +1717,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 326, - "top": 47, + "left": 880, + "top": 52, "width": 57, "height": 13, "autoResize": false, @@ -1751,8 +1751,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 354, - "top": 96, + "left": 908, + "top": 101, "width": 0, "height": 13, "autoResize": false, @@ -1784,8 +1784,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 355, - "top": 51, + "left": 909, + "top": 56, "width": 0, "height": 13, "autoResize": false, @@ -1817,8 +1817,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 406, - "top": 80, + "left": 926, + "top": 85, "width": 0, "height": 13, "autoResize": false, @@ -1850,8 +1850,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 403, - "top": 94, + "left": 923, + "top": 99, "width": 0, "height": 13, "autoResize": false, @@ -1883,8 +1883,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 410, - "top": 53, + "left": 930, + "top": 58, "width": 0, "height": 13, "autoResize": false, @@ -1916,8 +1916,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 303, - "top": 80, + "left": 891, + "top": 85, "width": 0, "height": 13, "autoResize": false, @@ -1949,8 +1949,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 306, - "top": 94, + "left": 894, + "top": 99, "width": 0, "height": 13, "autoResize": false, @@ -1982,8 +1982,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 299, - "top": 53, + "left": 887, + "top": 58, "width": 0, "height": 13, "autoResize": false, @@ -2015,8 +2015,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 0, - "top": -16, + "left": 16, + "top": 120, "width": 10, "height": 10, "autoResize": false @@ -2039,8 +2039,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 0, - "top": -16, + "left": 16, + "top": 120, "width": 10, "height": 10, "autoResize": false @@ -2062,7 +2062,7 @@ "$ref": "AAAAAAFUmMqaTslne2E=" }, "lineStyle": 0, - "points": "432:72;278:72", + "points": "952:77;866:77", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -2137,9 +2137,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 453, - "top": 309, - "width": 199, + "left": 85, + "top": 341, + "width": 213.06787109375, "height": 13, "autoResize": false, "underline": false, @@ -2162,9 +2162,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 453, - "top": 324, - "width": 199, + "left": 85, + "top": 356, + "width": 213.06787109375, "height": 13, "autoResize": false, "underline": false, @@ -2187,9 +2187,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 453, - "top": 339, - "width": 199, + "left": 85, + "top": 371, + "width": 213.06787109375, "height": 13, "autoResize": false, "underline": false, @@ -2212,8 +2212,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -26, - "top": -42, + "left": -762, + "top": 22, "width": 0, "height": 13, "autoResize": false, @@ -2231,9 +2231,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 448, - "top": 304, - "width": 209, + "left": 80, + "top": 336, + "width": 223.06787109375, "height": 53, "autoResize": false, "stereotypeLabel": { @@ -2267,8 +2267,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 448, - "top": 349, + "left": 80, + "top": 381, "width": 233, "height": 10, "autoResize": false @@ -2301,9 +2301,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 453, - "top": 362, - "width": 223, + "left": 85, + "top": 394, + "width": 237.06787109375, "height": 13, "autoResize": false, "underline": false, @@ -2329,9 +2329,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 453, - "top": 377, - "width": 223, + "left": 85, + "top": 409, + "width": 237.06787109375, "height": 13, "autoResize": false, "underline": false, @@ -2349,9 +2349,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 448, - "top": 357, - "width": 233, + "left": 80, + "top": 389, + "width": 247.06787109375, "height": 38, "autoResize": false }, @@ -2373,8 +2373,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -13, - "top": -29, + "left": -381, + "top": 3, "width": 10, "height": 10, "autoResize": false @@ -2397,8 +2397,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -13, - "top": -29, + "left": -381, + "top": 3, "width": 10, "height": 10, "autoResize": false @@ -2413,9 +2413,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 448, - "top": 304, - "width": 233, + "left": 80, + "top": 336, + "width": 247.06787109375, "height": 91, "autoResize": false, "stereotypeDisplay": "decoration-label", @@ -2473,13 +2473,13 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 377, - "top": 303, + "left": 488, + "top": 320, "width": 57, "height": 13, "autoResize": false, - "alpha": -1.5152983753953508, - "distance": 18.027756377319946, + "alpha": 0.3058788210270264, + "distance": 59.77457653551382, "hostEdge": { "$ref": "AAAAAAFUmNGSidAM2EA=" }, @@ -2507,8 +2507,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 405, - "top": 352, + "left": 459, + "top": 308, "width": 0, "height": 13, "autoResize": false, @@ -2540,8 +2540,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 406, - "top": 307, + "left": 459, + "top": 353, "width": 0, "height": 13, "autoResize": false, @@ -2573,8 +2573,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 422, - "top": 336, + "left": 351, + "top": 323, "width": 0, "height": 13, "autoResize": false, @@ -2606,8 +2606,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 419, - "top": 350, + "left": 354, + "top": 309, "width": 0, "height": 13, "autoResize": false, @@ -2639,8 +2639,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 426, - "top": 309, + "left": 347, + "top": 350, "width": 0, "height": 13, "autoResize": false, @@ -2672,8 +2672,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 389, - "top": 336, + "left": 566, + "top": 323, "width": 0, "height": 13, "autoResize": false, @@ -2705,8 +2705,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 392, - "top": 350, + "left": 563, + "top": 309, "width": 0, "height": 13, "autoResize": false, @@ -2738,8 +2738,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 385, - "top": 309, + "left": 570, + "top": 350, "width": 0, "height": 13, "autoResize": false, @@ -2818,7 +2818,7 @@ "$ref": "AAAAAAFUmNDrqc6u4Jg=" }, "lineStyle": 0, - "points": "448:328;364:328", + "points": "326:344;592:344", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -2894,8 +2894,8 @@ "containerChangeable": false, "containerExtending": false, "left": 949, - "top": 53, - "width": 154, + "top": 197, + "width": 163.28955078125, "height": 13, "autoResize": false, "underline": false, @@ -2919,8 +2919,8 @@ "containerChangeable": false, "containerExtending": false, "left": 949, - "top": 68, - "width": 154, + "top": 212, + "width": 163.28955078125, "height": 13, "autoResize": false, "underline": false, @@ -2944,8 +2944,8 @@ "containerChangeable": false, "containerExtending": false, "left": 949, - "top": 83, - "width": 154, + "top": 227, + "width": 163.28955078125, "height": 13, "autoResize": false, "underline": false, @@ -2969,7 +2969,7 @@ "containerChangeable": false, "containerExtending": false, "left": 1550, - "top": -1366, + "top": -1078, "width": 0, "height": 13, "autoResize": false, @@ -2988,8 +2988,8 @@ "containerChangeable": false, "containerExtending": false, "left": 944, - "top": 48, - "width": 164, + "top": 192, + "width": 173.28955078125, "height": 53, "autoResize": false, "stereotypeLabel": { @@ -3024,7 +3024,7 @@ "containerChangeable": false, "containerExtending": false, "left": 775, - "top": -683, + "top": -539, "width": 10, "height": 10, "autoResize": false @@ -3058,8 +3058,8 @@ "containerChangeable": false, "containerExtending": false, "left": 949, - "top": 106, - "width": 178, + "top": 250, + "width": 187.28955078125, "height": 13, "autoResize": false, "underline": false, @@ -3078,8 +3078,8 @@ "containerChangeable": false, "containerExtending": false, "left": 944, - "top": 101, - "width": 188, + "top": 245, + "width": 197.28955078125, "height": 23, "autoResize": false }, @@ -3102,7 +3102,7 @@ "containerChangeable": false, "containerExtending": false, "left": 775, - "top": -683, + "top": -539, "width": 10, "height": 10, "autoResize": false @@ -3126,7 +3126,7 @@ "containerChangeable": false, "containerExtending": false, "left": 775, - "top": -683, + "top": -539, "width": 10, "height": 10, "autoResize": false @@ -3142,8 +3142,8 @@ "containerChangeable": true, "containerExtending": false, "left": 944, - "top": 48, - "width": 188, + "top": 192, + "width": 197.28955078125, "height": 76, "autoResize": false, "stereotypeDisplay": "decoration-label", @@ -3208,8 +3208,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -444, - "top": 82, + "left": 340, + "top": -110, "width": 0, "height": 13, "autoResize": false, @@ -3232,9 +3232,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 663, - "width": 221, + "left": 437, + "top": 567, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3257,9 +3257,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 678, - "width": 221, + "left": 437, + "top": 582, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3282,8 +3282,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -444, - "top": 82, + "left": 340, + "top": -110, "width": 0, "height": 13, "autoResize": false, @@ -3301,9 +3301,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 40, - "top": 656, - "width": 231, + "left": 432, + "top": 560, + "width": 245.23779296875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -3347,9 +3347,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 701, - "width": 221, + "left": 437, + "top": 605, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": true, @@ -3375,9 +3375,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 716, - "width": 221, + "left": 437, + "top": 620, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3403,9 +3403,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 731, - "width": 221, + "left": 437, + "top": 635, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3431,9 +3431,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 746, - "width": 221, + "left": 437, + "top": 650, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3459,9 +3459,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 761, - "width": 221, + "left": 437, + "top": 665, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3487,9 +3487,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 776, - "width": 221, + "left": 437, + "top": 680, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3515,9 +3515,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 791, - "width": 221, + "left": 437, + "top": 695, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3543,9 +3543,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 806, - "width": 221, + "left": 437, + "top": 710, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3563,9 +3563,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 40, - "top": 696, - "width": 231, + "left": 432, + "top": 600, + "width": 245.23779296875, "height": 128, "autoResize": false }, @@ -3597,9 +3597,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 829, - "width": 221, + "left": 437, + "top": 733, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3625,9 +3625,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 844, - "width": 221, + "left": 437, + "top": 748, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3653,9 +3653,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 859, - "width": 221, + "left": 437, + "top": 763, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3681,9 +3681,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 874, - "width": 221, + "left": 437, + "top": 778, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3709,9 +3709,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 889, - "width": 221, + "left": 437, + "top": 793, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3737,9 +3737,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 904, - "width": 221, + "left": 437, + "top": 808, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3765,9 +3765,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 919, - "width": 221, + "left": 437, + "top": 823, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3793,9 +3793,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 934, - "width": 221, + "left": 437, + "top": 838, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3821,9 +3821,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 949, - "width": 221, + "left": 437, + "top": 853, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3849,9 +3849,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 964, - "width": 221, + "left": 437, + "top": 868, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3877,9 +3877,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 979, - "width": 221, + "left": 437, + "top": 883, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3905,9 +3905,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 45, - "top": 994, - "width": 221, + "left": 437, + "top": 898, + "width": 235.23779296875, "height": 13, "autoResize": false, "underline": false, @@ -3925,9 +3925,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 40, - "top": 824, - "width": 231, + "left": 432, + "top": 728, + "width": 245.23779296875, "height": 188, "autoResize": false }, @@ -3949,8 +3949,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -222, - "top": 41, + "left": 170, + "top": -55, "width": 10, "height": 10, "autoResize": false @@ -3973,8 +3973,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -222, - "top": 41, + "left": 170, + "top": -55, "width": 10, "height": 10, "autoResize": false @@ -3989,9 +3989,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 40, - "top": 656, - "width": 231, + "left": 432, + "top": 560, + "width": 245.23779296875, "height": 356, "autoResize": false, "stereotypeDisplay": "label", @@ -4056,8 +4056,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -492, - "top": 4, + "left": 324, + "top": -188, "width": 0, "height": 13, "autoResize": false, @@ -4080,9 +4080,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 663, - "width": 301, + "left": 701, + "top": 567, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4105,9 +4105,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 678, - "width": 301, + "left": 701, + "top": 582, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4130,8 +4130,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -492, - "top": 4, + "left": 324, + "top": -188, "width": 0, "height": 13, "autoResize": false, @@ -4149,9 +4149,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 288, - "top": 656, - "width": 311, + "left": 696, + "top": 560, + "width": 328.779296875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -4195,9 +4195,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 701, - "width": 301, + "left": 701, + "top": 605, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": true, @@ -4223,9 +4223,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 716, - "width": 301, + "left": 701, + "top": 620, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4251,9 +4251,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 731, - "width": 301, + "left": 701, + "top": 635, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4279,9 +4279,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 746, - "width": 301, + "left": 701, + "top": 650, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4307,9 +4307,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 761, - "width": 301, + "left": 701, + "top": 665, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4335,9 +4335,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 776, - "width": 301, + "left": 701, + "top": 680, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4355,9 +4355,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 288, - "top": 696, - "width": 311, + "left": 696, + "top": 600, + "width": 328.779296875, "height": 98, "autoResize": false }, @@ -4389,9 +4389,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 799, - "width": 301, + "left": 701, + "top": 703, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4417,9 +4417,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 814, - "width": 301, + "left": 701, + "top": 718, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4445,9 +4445,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 829, - "width": 301, + "left": 701, + "top": 733, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4473,9 +4473,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 844, - "width": 301, + "left": 701, + "top": 748, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4501,9 +4501,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 293, - "top": 859, - "width": 301, + "left": 701, + "top": 763, + "width": 318.779296875, "height": 13, "autoResize": false, "underline": false, @@ -4521,9 +4521,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 288, - "top": 794, - "width": 311, + "left": 696, + "top": 698, + "width": 328.779296875, "height": 83, "autoResize": false }, @@ -4545,8 +4545,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -246, - "top": 2, + "left": 162, + "top": -94, "width": 10, "height": 10, "autoResize": false @@ -4569,8 +4569,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -246, - "top": 2, + "left": 162, + "top": -94, "width": 10, "height": 10, "autoResize": false @@ -4585,9 +4585,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 288, - "top": 656, - "width": 311, + "left": 696, + "top": 560, + "width": 328.779296875, "height": 221, "autoResize": false, "stereotypeDisplay": "label", @@ -4645,13 +4645,13 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 30, - "top": 560, + "left": 601, + "top": 478, "width": 80, "height": 13, "autoResize": false, - "alpha": -4.729930929882652, - "distance": 57.0087712549569, + "alpha": -0.8668500980632798, + "distance": 69.52697318307479, "hostEdge": { "$ref": "AAAAAAFUmNgnH9uiFxg=" }, @@ -4679,8 +4679,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 98, - "top": 560, + "left": 596, + "top": 396, "width": 0, "height": 13, "autoResize": false, @@ -4712,8 +4712,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 142, - "top": 561, + "left": 596, + "top": 441, "width": 0, "height": 13, "autoResize": false, @@ -4745,8 +4745,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 113, - "top": 624, + "left": 545, + "top": 528, "width": 0, "height": 13, "autoResize": false, @@ -4778,8 +4778,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 99, - "top": 621, + "left": 531, + "top": 525, "width": 0, "height": 13, "autoResize": false, @@ -4811,8 +4811,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 140, - "top": 628, + "left": 572, + "top": 532, "width": 0, "height": 13, "autoResize": false, @@ -4844,8 +4844,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 113, - "top": 498, + "left": 617, + "top": 410, "width": 0, "height": 13, "autoResize": false, @@ -4877,8 +4877,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 99, - "top": 501, + "left": 603, + "top": 413, "width": 0, "height": 13, "autoResize": false, @@ -4910,8 +4910,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 140, - "top": 494, + "left": 644, + "top": 406, "width": 0, "height": 13, "autoResize": false, @@ -4990,7 +4990,7 @@ "$ref": "AAAAAAFUmNdXmNnpp1I=" }, "lineStyle": 0, - "points": "128:656;128:479", + "points": "560:560;560:432;632:432;632:391", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -5058,8 +5058,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 358, - "top": 559, + "left": 793, + "top": 467, "width": 110, "height": 13, "autoResize": false, @@ -5092,8 +5092,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 314, - "top": 560, + "left": 749, + "top": 468, "width": 0, "height": 13, "autoResize": false, @@ -5125,8 +5125,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 358, - "top": 561, + "left": 793, + "top": 469, "width": 0, "height": 13, "autoResize": false, @@ -5158,8 +5158,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 329, - "top": 624, + "left": 764, + "top": 528, "width": 0, "height": 13, "autoResize": false, @@ -5191,8 +5191,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 315, - "top": 621, + "left": 750, + "top": 525, "width": 0, "height": 13, "autoResize": false, @@ -5224,8 +5224,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 356, - "top": 628, + "left": 791, + "top": 532, "width": 0, "height": 13, "autoResize": false, @@ -5257,8 +5257,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 329, - "top": 498, + "left": 764, + "top": 410, "width": 0, "height": 13, "autoResize": false, @@ -5290,8 +5290,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 315, - "top": 501, + "left": 750, + "top": 413, "width": 0, "height": 13, "autoResize": false, @@ -5323,8 +5323,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 356, - "top": 494, + "left": 791, + "top": 406, "width": 0, "height": 13, "autoResize": false, @@ -5403,7 +5403,7 @@ "$ref": "AAAAAAFUmNdyjto3Jy4=" }, "lineStyle": 0, - "points": "344:656;344:479", + "points": "779:560;779:391", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -5478,8 +5478,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -104, - "top": 24, + "left": -312, + "top": 168, "width": 0, "height": 13, "autoResize": false, @@ -5502,9 +5502,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1053, - "top": 287, - "width": 208, + "left": 949, + "top": 359, + "width": 221.06982421875, "height": 13, "autoResize": false, "underline": false, @@ -5527,9 +5527,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1053, - "top": 302, - "width": 208, + "left": 949, + "top": 374, + "width": 221.06982421875, "height": 13, "autoResize": false, "underline": false, @@ -5552,8 +5552,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -104, - "top": 24, + "left": -312, + "top": 168, "width": 0, "height": 13, "autoResize": false, @@ -5571,9 +5571,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1048, - "top": 280, - "width": 218, + "left": 944, + "top": 352, + "width": 231.06982421875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -5607,9 +5607,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1048, - "top": 320, - "width": 218, + "left": 944, + "top": 392, + "width": 231.06982421875, "height": 10, "autoResize": false }, @@ -5631,9 +5631,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1048, - "top": 330, - "width": 218, + "left": 944, + "top": 402, + "width": 231.06982421875, "height": 10, "autoResize": false }, @@ -5655,8 +5655,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -52, - "top": 12, + "left": -204, + "top": 84, "width": 10, "height": 10, "autoResize": false @@ -5679,8 +5679,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -52, - "top": 12, + "left": -204, + "top": 84, "width": 10, "height": 10, "autoResize": false @@ -5695,9 +5695,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 1048, - "top": 280, - "width": 218, + "left": 944, + "top": 352, + "width": 231.06982421875, "height": 60, "autoResize": false, "stereotypeDisplay": "label", @@ -5755,8 +5755,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1097, - "top": 194, + "left": 1041, + "top": 302, "width": 0, "height": 13, "autoResize": false, @@ -5788,8 +5788,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1082, - "top": 194, + "left": 1026, + "top": 302, "width": 0, "height": 13, "autoResize": false, @@ -5821,8 +5821,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1126, - "top": 195, + "left": 1070, + "top": 303, "width": 0, "height": 13, "autoResize": false, @@ -5853,7 +5853,7 @@ "$ref": "AAAAAAFUmN7w++U0Wt4=" }, "lineStyle": 0, - "points": "1112:280;1112:123", + "points": "1056:352;1056:267", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -5902,8 +5902,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -296, - "top": -34, + "left": 680, + "top": 110, "width": 0, "height": 13, "autoResize": false, @@ -5926,9 +5926,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 287, - "width": 319, + "left": 1205, + "top": 359, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -5951,9 +5951,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 302, - "width": 319, + "left": 1205, + "top": 374, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -5976,8 +5976,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -296, - "top": -34, + "left": 680, + "top": 110, "width": 0, "height": 13, "autoResize": false, @@ -5995,9 +5995,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 712, - "top": 280, - "width": 329, + "left": 1200, + "top": 352, + "width": 347.6572265625, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -6041,9 +6041,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 325, - "width": 319, + "left": 1205, + "top": 397, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6069,9 +6069,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 340, - "width": 319, + "left": 1205, + "top": 412, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6097,9 +6097,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 355, - "width": 319, + "left": 1205, + "top": 427, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6125,9 +6125,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 370, - "width": 319, + "left": 1205, + "top": 442, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6153,9 +6153,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 385, - "width": 319, + "left": 1205, + "top": 457, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6181,9 +6181,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 400, - "width": 319, + "left": 1205, + "top": 472, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6201,9 +6201,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 712, - "top": 320, - "width": 329, + "left": 1200, + "top": 392, + "width": 347.6572265625, "height": 98, "autoResize": false }, @@ -6235,9 +6235,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 717, - "top": 423, - "width": 319, + "left": 1205, + "top": 495, + "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, @@ -6255,9 +6255,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 712, - "top": 418, - "width": 329, + "left": 1200, + "top": 490, + "width": 347.6572265625, "height": 23, "autoResize": false }, @@ -6279,8 +6279,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -148, - "top": -17, + "left": 340, + "top": 55, "width": 10, "height": 10, "autoResize": false @@ -6303,8 +6303,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -148, - "top": -17, + "left": 340, + "top": 55, "width": 10, "height": 10, "autoResize": false @@ -6319,9 +6319,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 712, - "top": 280, - "width": 329, + "left": 1200, + "top": 352, + "width": 347.6572265625, "height": 161, "autoResize": false, "stereotypeDisplay": "label", @@ -6379,8 +6379,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 952, - "top": 187, + "left": 1319, + "top": 246, "width": 0, "height": 13, "autoResize": false, @@ -6412,8 +6412,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 952, - "top": 172, + "left": 1319, + "top": 261, "width": 0, "height": 13, "autoResize": false, @@ -6445,8 +6445,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 952, - "top": 217, + "left": 1320, + "top": 216, "width": 0, "height": 13, "autoResize": false, @@ -6477,7 +6477,7 @@ "$ref": "AAAAAAFUmOQ29O44VzA=" }, "lineStyle": 0, - "points": "913:280;913:208;992:208;992:123", + "points": "1320:352;1320:237;1140:237", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -6526,8 +6526,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1716, - "top": 1102, + "left": -772, + "top": 958, "width": 0, "height": 13, "autoResize": false, @@ -6550,9 +6550,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 157, - "top": 1079, - "width": 167, + "left": 629, + "top": 1007, + "width": 177.708984375, "height": 13, "autoResize": false, "underline": false, @@ -6575,9 +6575,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 157, - "top": 1094, - "width": 167, + "left": 629, + "top": 1022, + "width": 177.708984375, "height": 13, "autoResize": false, "underline": false, @@ -6600,8 +6600,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1716, - "top": 1102, + "left": -772, + "top": 958, "width": 0, "height": 13, "autoResize": false, @@ -6619,9 +6619,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 152, - "top": 1072, - "width": 177, + "left": 624, + "top": 1000, + "width": 187.708984375, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -6655,9 +6655,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 152, - "top": 1112, - "width": 177, + "left": 624, + "top": 1040, + "width": 187.708984375, "height": 10, "autoResize": false }, @@ -6689,9 +6689,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 157, - "top": 1127, - "width": 167, + "left": 629, + "top": 1055, + "width": 177.708984375, "height": 13, "autoResize": false, "underline": false, @@ -6709,9 +6709,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 152, - "top": 1122, - "width": 177, + "left": 624, + "top": 1050, + "width": 187.708984375, "height": 23, "autoResize": false }, @@ -6733,8 +6733,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -858, - "top": 551, + "left": -386, + "top": 479, "width": 10, "height": 10, "autoResize": false @@ -6757,8 +6757,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -858, - "top": 551, + "left": -386, + "top": 479, "width": 10, "height": 10, "autoResize": false @@ -6773,9 +6773,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 152, - "top": 1072, - "width": 177, + "left": 624, + "top": 1000, + "width": 187.708984375, "height": 73, "autoResize": false, "stereotypeDisplay": "label", @@ -6833,8 +6833,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 214, - "top": 1034, + "left": 662, + "top": 950, "width": 0, "height": 13, "autoResize": false, @@ -6866,8 +6866,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 229, - "top": 1034, + "left": 677, + "top": 950, "width": 0, "height": 13, "autoResize": false, @@ -6899,8 +6899,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 185, - "top": 1035, + "left": 633, + "top": 951, "width": 0, "height": 13, "autoResize": false, @@ -6931,7 +6931,7 @@ "$ref": "AAAAAAFUmNdXmNnpp1I=" }, "lineStyle": 0, - "points": "200:1011;200:1072", + "points": "648:915;648:1000", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -6973,8 +6973,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 315, - "top": 929, + "left": 791, + "top": 883, "width": 0, "height": 13, "autoResize": false, @@ -7006,8 +7006,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 315, - "top": 944, + "left": 806, + "top": 883, "width": 0, "height": 13, "autoResize": false, @@ -7039,8 +7039,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 316, - "top": 899, + "left": 761, + "top": 884, "width": 0, "height": 13, "autoResize": false, @@ -7071,7 +7071,7 @@ "$ref": "AAAAAAFUmNdyjto3Jy4=" }, "lineStyle": 0, - "points": "344:876;344:920;288:920;288:1072", + "points": "776:780;776:1000", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -7120,8 +7120,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -110, - "top": -58, + "left": 1090, + "top": 326, "width": 0, "height": 13, "autoResize": false, @@ -7144,9 +7144,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 765, - "top": 55, - "width": 102, + "left": 1365, + "top": 247, + "width": 113.2548828125, "height": 13, "autoResize": false, "underline": false, @@ -7169,9 +7169,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 765, - "top": 70, - "width": 102, + "left": 1365, + "top": 262, + "width": 113.2548828125, "height": 13, "autoResize": false, "underline": false, @@ -7194,8 +7194,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -110, - "top": -58, + "left": 1090, + "top": 326, "width": 0, "height": 13, "autoResize": false, @@ -7213,9 +7213,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 760, - "top": 48, - "width": 112, + "left": 1360, + "top": 240, + "width": 123.2548828125, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -7249,9 +7249,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 760, - "top": 88, - "width": 112, + "left": 1360, + "top": 280, + "width": 123.2548828125, "height": 10, "autoResize": false }, @@ -7273,9 +7273,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 760, - "top": 98, - "width": 112, + "left": 1360, + "top": 290, + "width": 123.2548828125, "height": 10, "autoResize": false }, @@ -7297,8 +7297,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -55, - "top": -29, + "left": 545, + "top": 163, "width": 10, "height": 10, "autoResize": false @@ -7321,8 +7321,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -55, - "top": -29, + "left": 545, + "top": 163, "width": 10, "height": 10, "autoResize": false @@ -7337,9 +7337,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 760, - "top": 48, - "width": 112, + "left": 1360, + "top": 240, + "width": 123.2548828125, "height": 60, "autoResize": false, "stereotypeDisplay": "label", @@ -7397,8 +7397,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 809, - "top": 186, + "left": 1401, + "top": 318, "width": 0, "height": 13, "autoResize": false, @@ -7430,8 +7430,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 794, - "top": 186, + "left": 1386, + "top": 318, "width": 0, "height": 13, "autoResize": false, @@ -7463,8 +7463,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 838, - "top": 187, + "left": 1430, + "top": 319, "width": 0, "height": 13, "autoResize": false, @@ -7495,7 +7495,7 @@ "$ref": "AAAAAAFUmOQ29O44VzA=" }, "lineStyle": 0, - "points": "824:280;824:107", + "points": "1416:352;1416:299", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -7544,8 +7544,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -22, - "top": 0, + "left": -1046, + "top": -1874, "width": 0, "height": 13, "autoResize": false, @@ -7568,9 +7568,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 733, - "top": 960, - "width": 195, + "left": 221, + "top": 23, + "width": 210.23828125, "height": 13, "autoResize": false, "underline": false, @@ -7593,9 +7593,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 733, - "top": 975, - "width": 195, + "left": 221, + "top": 38, + "width": 210.23828125, "height": 13, "autoResize": false, "underline": false, @@ -7618,8 +7618,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -22, - "top": 0, + "left": -1046, + "top": -1874, "width": 0, "height": 13, "autoResize": false, @@ -7637,9 +7637,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 728, - "top": 953, - "width": 205, + "left": 216, + "top": 16, + "width": 220.23828125, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -7673,9 +7673,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 728, - "top": 993, - "width": 205, + "left": 216, + "top": 56, + "width": 220.23828125, "height": 10, "autoResize": false }, @@ -7707,9 +7707,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 733, - "top": 1008, - "width": 195, + "left": 221, + "top": 71, + "width": 210.23828125, "height": 13, "autoResize": false, "underline": false, @@ -7727,9 +7727,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 728, - "top": 1003, - "width": 205, + "left": 216, + "top": 66, + "width": 220.23828125, "height": 23, "autoResize": false }, @@ -7751,8 +7751,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -11, - "top": 0, + "left": -523, + "top": -937, "width": 10, "height": 10, "autoResize": false @@ -7775,8 +7775,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -11, - "top": 0, + "left": -523, + "top": -937, "width": 10, "height": 10, "autoResize": false @@ -7791,9 +7791,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 728, - "top": 953, - "width": 205, + "left": 216, + "top": 16, + "width": 220.23828125, "height": 73, "autoResize": false, "stereotypeDisplay": "label", @@ -7858,8 +7858,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -228, - "top": -48, + "left": -1236, + "top": -1920, "width": 0, "height": 13, "autoResize": false, @@ -7882,9 +7882,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 949, - "top": 959, - "width": 142, + "left": 445, + "top": 23, + "width": 146.2119140625, "height": 13, "autoResize": false, "underline": false, @@ -7907,9 +7907,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 949, - "top": 974, - "width": 142, + "left": 445, + "top": 38, + "width": 146.2119140625, "height": 13, "autoResize": false, "underline": false, @@ -7932,8 +7932,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -228, - "top": -48, + "left": -1236, + "top": -1920, "width": 0, "height": 13, "autoResize": false, @@ -7951,9 +7951,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 944, - "top": 952, - "width": 152, + "left": 440, + "top": 16, + "width": 156.2119140625, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -7987,9 +7987,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 944, - "top": 992, - "width": 152, + "left": 440, + "top": 56, + "width": 156.2119140625, "height": 10, "autoResize": false }, @@ -8021,9 +8021,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 949, - "top": 1007, - "width": 142, + "left": 445, + "top": 71, + "width": 146.2119140625, "height": 13, "autoResize": false, "underline": false, @@ -8041,9 +8041,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 944, - "top": 1002, - "width": 152, + "left": 440, + "top": 66, + "width": 156.2119140625, "height": 23, "autoResize": false }, @@ -8065,8 +8065,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -114, - "top": -24, + "left": -618, + "top": -960, "width": 10, "height": 10, "autoResize": false @@ -8089,8 +8089,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -114, - "top": -24, + "left": -618, + "top": -960, "width": 10, "height": 10, "autoResize": false @@ -8105,9 +8105,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 944, - "top": 952, - "width": 152, + "left": 440, + "top": 16, + "width": 156.2119140625, "height": 73, "autoResize": false, "stereotypeDisplay": "label", @@ -8172,8 +8172,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -62, - "top": -46, + "left": -1102, + "top": -1918, "width": 0, "height": 13, "autoResize": false, @@ -8196,9 +8196,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 557, - "top": 959, - "width": 158, + "left": 37, + "top": 23, + "width": 169.64501953125, "height": 13, "autoResize": false, "underline": false, @@ -8221,9 +8221,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 557, - "top": 974, - "width": 158, + "left": 37, + "top": 38, + "width": 169.64501953125, "height": 13, "autoResize": false, "underline": false, @@ -8246,8 +8246,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -62, - "top": -46, + "left": -1102, + "top": -1918, "width": 0, "height": 13, "autoResize": false, @@ -8265,9 +8265,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 552, - "top": 952, - "width": 168, + "left": 32, + "top": 16, + "width": 179.64501953125, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -8301,9 +8301,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 552, - "top": 992, - "width": 168, + "left": 32, + "top": 56, + "width": 179.64501953125, "height": 10, "autoResize": false }, @@ -8335,9 +8335,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 557, - "top": 1007, - "width": 158, + "left": 37, + "top": 71, + "width": 169.64501953125, "height": 13, "autoResize": false, "underline": false, @@ -8355,9 +8355,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 552, - "top": 1002, - "width": 168, + "left": 32, + "top": 66, + "width": 179.64501953125, "height": 23, "autoResize": false }, @@ -8379,8 +8379,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -31, - "top": -23, + "left": -551, + "top": -967, "width": 10, "height": 10, "autoResize": false @@ -8403,8 +8403,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -31, - "top": -23, + "left": -551, + "top": -967, "width": 10, "height": 10, "autoResize": false @@ -8419,9 +8419,9 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 552, - "top": 952, - "width": 168, + "left": 32, + "top": 16, + "width": 179.64501953125, "height": 73, "autoResize": false, "stereotypeDisplay": "label", @@ -8450,6 +8450,1525 @@ "templateParameterCompartment": { "$ref": "AAAAAAFUmPubGC7t9Sw=" } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUv1AAByZWi/E=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZX7g4=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 106, + "top": 281, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZYPFI=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 91, + "top": 281, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZZ23I=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 136, + "top": 282, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZa1QM=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZTkZo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 127, + "top": 263, + "width": 36, + "height": 13, + "autoResize": false, + "alpha": -0.04024671267454227, + "distance": 447.362269307549, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 2, + "underline": false, + "text": "+uses", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZbyFI=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZTkZo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 563, + "top": 310, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZc4HY=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZTkZo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 570, + "top": 269, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZd/pA=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZUFhE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 106, + "top": 107, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AAByZeoyU=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZUFhE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 92, + "top": 110, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1AACCZfWv8=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZUFhE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 133, + "top": 103, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1AACCZgYRw=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZTkZo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1AACCZhqPs=", + "_parent": { + "$ref": "AAAAAAFUv1AAByZWi/E=" + }, + "model": { + "$ref": "AAAAAAFUv1AABiZUFhE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 24, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "tail": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "lineStyle": 0, + "points": "592:288;121:288;121:88", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUv1AAByZX7g4=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv1AAByZYPFI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv1AAByZZ23I=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUv1AAByZa1QM=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUv1AAByZbyFI=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUv1AAByZc4HY=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUv1AAByZd/pA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUv1AAByZeoyU=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUv1AACCZfWv8=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUv1AACCZgYRw=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUv1AACCZhqPs=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUv1BssClPDbY=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssClQ3AU=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 319, + "top": 240, + "width": 36, + "height": 13, + "autoResize": false, + "alpha": -1.07144967568509, + "distance": 37.589892258425, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 1, + "underline": false, + "text": "+uses", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlRxLc=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 274, + "top": 257, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlSh68=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 319, + "top": 258, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlTKSg=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlMh4M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 566, + "top": 272, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlU1f0=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlMh4M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 563, + "top": 286, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlVS1Y=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlMh4M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 570, + "top": 245, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlWoUA=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlN0xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 289, + "top": 107, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlX7kE=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlN0xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 275, + "top": 110, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1BssSlYepY=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlN0xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 316, + "top": 103, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1BssilZT0Q=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlMh4M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1BssilaBvI=", + "_parent": { + "$ref": "AAAAAAFUv1BssClPDbY=" + }, + "model": { + "$ref": "AAAAAAFUv1BsrSlN0xQ=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 24, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "tail": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "lineStyle": 0, + "points": "592:264;304:264;304:88", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUv1BssClQ3AU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv1BssSlRxLc=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv1BssSlSh68=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUv1BssSlTKSg=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUv1BssSlU1f0=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUv1BssSlVS1Y=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUv1BssSlWoUA=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUv1BssSlX7kE=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUv1BssSlYepY=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUv1BssilZT0Q=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUv1BssilaBvI=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFUv1FUOzKDIjM=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUOzKEHCo=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 527, + "top": 219, + "width": 36, + "height": 13, + "autoResize": false, + "alpha": 0.4918090273266982, + "distance": 31.76476034853718, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 1, + "underline": false, + "text": "+uses", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKFW3M=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 517, + "top": 204, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKGk20=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 517, + "top": 249, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKHMMw=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKAXw0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 532, + "top": 107, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKIOmc=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKAXw0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 545, + "top": 110, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKJv6I=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKAXw0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 504, + "top": 103, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKKmqo=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKBt7k=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 566, + "top": 219, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPDKL9dg=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKBt7k=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 563, + "top": 205, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv1FUPTKMOfc=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKBt7k=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 570, + "top": 246, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1FUPTKNvCM=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKAXw0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFUv1FUPTKODmw=", + "_parent": { + "$ref": "AAAAAAFUv1FUOzKDIjM=" + }, + "model": { + "$ref": "AAAAAAFUv1FUOTKBt7k=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "tail": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "lineStyle": 0, + "points": "517:88;517:240;592:240", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUv1FUOzKEHCo=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv1FUPDKFW3M=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv1FUPDKGk20=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFUv1FUPDKHMMw=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFUv1FUPDKIOmc=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFUv1FUPDKJv6I=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFUv1FUPDKKmqo=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFUv1FUPDKL9dg=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFUv1FUPTKMOfc=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFUv1FUPTKNvCM=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFUv1FUPTKODmw=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFUv153Vizx38c=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv153VizyEA0=", + "_parent": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 916, + "top": 347, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv153Vizz7lI=", + "_parent": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 916, + "top": 332, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv153Viz0D4s=", + "_parent": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 916, + "top": 377, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv153Vizx38c=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmN7w++U0Wt4=" + }, + "tail": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "lineStyle": 0, + "points": "889:368;944:368", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUv153VizyEA0=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv153Vizz7lI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv153Viz0D4s=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFUv164Jiz16MQ=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv164Jiz2vwg=", + "_parent": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1337, + "top": 649, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv164Jiz32u4=", + "_parent": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1322, + "top": 649, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv164Jiz4K3E=", + "_parent": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "model": { + "$ref": "AAAAAAFUmOrfAwPdh8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1367, + "top": 650, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFUv164Jiz16MQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "tail": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "lineStyle": 0, + "points": "1024:656;1352:656;1352:512", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFUv164Jiz2vwg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv164Jiz32u4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv164Jiz4K3E=" + } } ] }, @@ -8480,20 +9999,159 @@ "defaultDiagram": false, "ownedViews": [ { - "_type": "UMLFrameView", - "_id": "AAAAAAFUkhaWO4zUdVo=", + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFUv2aES8ybhJ8=", "_parent": { "$ref": "AAAAAAFUkhaWOozTHHk=" }, "model": { - "$ref": "AAAAAAFUkhaWOozTHHk=" + "$ref": "AAAAAAFUv2aES8yaBvg=" }, "subViews": [ { - "_type": "LabelView", - "_id": "AAAAAAFUkhaWO4zVdQo=", + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUv2aES8ycWzA=", "_parent": { - "$ref": "AAAAAAFUkhaWO4zUdVo=" + "$ref": "AAAAAAFUv2aES8ybhJ8=" + }, + "model": { + "$ref": "AAAAAAFUv2aES8yaBvg=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUv2aETMydAio=", + "_parent": { + "$ref": "AAAAAAFUv2aES8ycWzA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2aETMyekVc=", + "_parent": { + "$ref": "AAAAAAFUv2aES8ycWzA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 221, + "top": 47, + "width": 86, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Other object", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2aETcyfM5E=", + "_parent": { + "$ref": "AAAAAAFUv2aES8ycWzA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2aETcyg6Xc=", + "_parent": { + "$ref": "AAAAAAFUv2aES8ycWzA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 216, + "top": 40, + "width": 96, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2aETMydAio=" + }, + "nameLabel": { + "$ref": "AAAAAAFUv2aETMyekVc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUv2aETcyfM5E=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2aETcyg6Xc=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFUv2aETcyhhXc=", + "_parent": { + "$ref": "AAAAAAFUv2aES8ybhJ8=" + }, + "model": { + "$ref": "AAAAAAFUv2aES8yaBvg=" }, "visible": true, "enabled": true, @@ -8504,40 +10162,11 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 503, - "top": 605, - "width": 114, - "height": 13, - "autoResize": false, - "underline": false, - "text": "SequenceDiagram1", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "LabelView", - "_id": "AAAAAAFUkhaWPIzWP4I=", - "_parent": { - "$ref": "AAAAAAFUkhaWO4zUdVo=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;1", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 605, - "width": 61, - "height": 13, - "autoResize": false, - "underline": false, - "text": "interaction", - "horizontalAlignment": 2, - "verticalAlignment": 5 + "left": 264, + "top": 80, + "width": 1, + "height": 369, + "autoResize": false } ], "visible": true, @@ -8549,17 +10178,2318 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 432, - "top": 600, - "width": 695, - "height": 595, + "left": 216, + "top": 40, + "width": 96, + "height": 409, "autoResize": false, - "nameLabel": { - "$ref": "AAAAAAFUkhaWO4zVdQo=" + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUv2aES8ycWzA=" }, - "frameTypeLabel": { - "$ref": "AAAAAAFUkhaWPIzWP4I=" + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFUv2aETcyhhXc=" } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFUv2nXaM1BaOI=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUv2nXaM1CeNE=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1BaOI=" + }, + "model": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUv2nXbM1D228=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1CeNE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1122, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2nXbM1ED74=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1CeNE=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 349, + "top": 47, + "width": 229, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Lifeline1: UIImageView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2nXbM1F5i0=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1CeNE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1122, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2nXbM1GtnA=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1CeNE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1122, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 344, + "top": 40, + "width": 239, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2nXbM1D228=" + }, + "nameLabel": { + "$ref": "AAAAAAFUv2nXbM1ED74=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUv2nXbM1F5i0=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2nXbM1GtnA=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFUv2nXbM1HcJ0=", + "_parent": { + "$ref": "AAAAAAFUv2nXaM1BaOI=" + }, + "model": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 464, + "top": 80, + "width": 1, + "height": 369, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 344, + "top": 40, + "width": 239, + "height": 409, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUv2nXaM1CeNE=" + }, + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + } + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFUv2n3Rc1gg3I=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUv2n3Rs1himo=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rc1gg3I=" + }, + "model": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUv2n3Rs1i/NA=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rs1himo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1216, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2n3Rs1joWc=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rs1himo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 605, + "top": 47, + "width": 207, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Lifeline2: SDWebImageManager", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2n3Rs1k/4Q=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rs1himo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1216, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2n3Rs1lmgQ=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rs1himo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -1216, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 600, + "top": 40, + "width": 217, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2n3Rs1i/NA=" + }, + "nameLabel": { + "$ref": "AAAAAAFUv2n3Rs1joWc=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUv2n3Rs1k/4Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2n3Rs1lmgQ=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFUv2n3Rs1mvsI=", + "_parent": { + "$ref": "AAAAAAFUv2n3Rc1gg3I=" + }, + "model": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 709, + "top": 80, + "width": 1, + "height": 369, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 600, + "top": 40, + "width": 217, + "height": 409, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUv2n3Rs1himo=" + }, + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2qLR829xEQ=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2qLR828Lgg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2qLSM2+Rpk=", + "_parent": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "model": { + "$ref": "AAAAAAFUv2qLR828Lgg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 284, + "top": 104, + "width": 153, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "edgePosition": 1, + "underline": false, + "text": "1 : sd_setImageWithURL()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2qLSM2/ZbI=", + "_parent": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "model": { + "$ref": "AAAAAAFUv2qLR828Lgg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 360, + "top": 89, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2qLSM3A+iE=", + "_parent": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "model": { + "$ref": "AAAAAAFUv2qLR828Lgg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 360, + "top": 124, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2qLSM3BCds=", + "_parent": { + "$ref": "AAAAAAFUv2qLR829xEQ=" + }, + "model": { + "$ref": "AAAAAAFUv2qLR828Lgg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 457, + "top": 120, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + }, + "tail": { + "$ref": "AAAAAAFUv2aETcyhhXc=" + }, + "lineStyle": 0, + "points": "264:120;457:120", + "nameLabel": { + "$ref": "AAAAAAFUv2qLSM2+Rpk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2qLSM2/ZbI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2qLSM3A+iE=" + }, + "activation": { + "$ref": "AAAAAAFUv2qLSM3BCds=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2rvmM3T5cQ=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2rvmM3S8xg=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2rvmc3Urws=", + "_parent": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "model": { + "$ref": "AAAAAAFUv2rvmM3S8xg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 515, + "top": 128, + "width": 142, + "height": 13, + "autoResize": false, + "alpha": 1.5707953267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "edgePosition": 1, + "underline": false, + "text": "2 : loadImageWithURL:()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2rvmc3VoDs=", + "_parent": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "model": { + "$ref": "AAAAAAFUv2rvmM3S8xg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 586, + "top": 113, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2rvmc3WRCk=", + "_parent": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "model": { + "$ref": "AAAAAAFUv2rvmM3S8xg=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 586, + "top": 148, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2rvmc3XXzY=", + "_parent": { + "$ref": "AAAAAAFUv2rvmM3T5cQ=" + }, + "model": { + "$ref": "AAAAAAFUv2rvmM3S8xg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 702, + "top": 144, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "tail": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + }, + "lineStyle": 0, + "points": "470:144;702:144", + "nameLabel": { + "$ref": "AAAAAAFUv2rvmc3Urws=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2rvmc3VoDs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2rvmc3WRCk=" + }, + "activation": { + "$ref": "AAAAAAFUv2rvmc3XXzY=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFUv2ti0c3qqN0=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUv2ti0c3rcoE=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3qqN0=" + }, + "model": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUv2ti0s3sWPY=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3rcoE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -192, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2ti0s3tDyM=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3rcoE=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 845, + "top": 47, + "width": 165, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Lifeline3: SDImageCache", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2ti0s3uihE=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3rcoE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -192, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv2ti0s3vC6k=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3rcoE=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -192, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 840, + "top": 40, + "width": 175, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2ti0s3sWPY=" + }, + "nameLabel": { + "$ref": "AAAAAAFUv2ti0s3tDyM=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUv2ti0s3uihE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2ti0s3vC6k=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFUv2ti0s3wcIg=", + "_parent": { + "$ref": "AAAAAAFUv2ti0c3qqN0=" + }, + "model": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 928, + "top": 80, + "width": 1, + "height": 361, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 840, + "top": 40, + "width": 175, + "height": 401, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUv2ti0c3rcoE=" + }, + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2v1XM4K3QQ=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1XM4L7pY=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 736, + "top": 152, + "width": 164, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "text": "3 : queryDiskCacheForKey()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1Xc4MPnU=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 818, + "top": 137, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1Xc4NX9s=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 818, + "top": 172, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2v1Xc4OIGU=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 921, + "top": 168, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + }, + "tail": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "lineStyle": 0, + "points": "715:168;921:168", + "nameLabel": { + "$ref": "AAAAAAFUv2v1XM4L7pY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2v1Xc4MPnU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2v1Xc4NX9s=" + }, + "activation": { + "$ref": "AAAAAAFUv2v1Xc4OIGU=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2z30M4lNWE=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4mUAU=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 778, + "top": 212, + "width": 79, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "text": "4 : disk result", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4nw8c=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 817, + "top": 227, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4odbY=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 818, + "top": 192, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2z30c4pSow=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 709, + "top": 208, + "width": 14, + "height": 25, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "tail": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + }, + "lineStyle": 0, + "points": "928:208;709:208", + "nameLabel": { + "$ref": "AAAAAAFUv2z30M4mUAU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2z30M4nw8c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2z30M4odbY=" + }, + "activation": { + "$ref": "AAAAAAFUv2z30c4pSow=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFUv22omM5CQm8=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv22omM5BZb4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFUv22omM5DEW0=", + "_parent": { + "$ref": "AAAAAAFUv22omM5CQm8=" + }, + "model": { + "$ref": "AAAAAAFUv22omM5BZb4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFUv22omc5E59M=", + "_parent": { + "$ref": "AAAAAAFUv22omM5DEW0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -144, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv22omc5FYM4=", + "_parent": { + "$ref": "AAAAAAFUv22omM5DEW0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1045, + "top": 47, + "width": 228, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Lifeline4: SDWebImageDownloader", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv22omc5GELE=", + "_parent": { + "$ref": "AAAAAAFUv22omM5DEW0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -144, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFUv22omc5HhQ8=", + "_parent": { + "$ref": "AAAAAAFUv22omM5DEW0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -144, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1040, + "top": 40, + "width": 238, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFUv22omc5E59M=" + }, + "nameLabel": { + "$ref": "AAAAAAFUv22omc5FYM4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFUv22omc5GELE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv22omc5HhQ8=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFUv22omc5ImFY=", + "_parent": { + "$ref": "AAAAAAFUv22omM5CQm8=" + }, + "model": { + "$ref": "AAAAAAFUv22omM5BZb4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1159, + "top": 80, + "width": 1, + "height": 271, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1040, + "top": 40, + "width": 238, + "height": 311, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFUv22omM5DEW0=" + }, + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFUv22omc5ImFY=" + } + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv235TM5iC/o=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv235TM5h8OU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv235Tc5jIuU=", + "_parent": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "model": { + "$ref": "AAAAAAFUv235TM5h8OU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 846, + "top": 256, + "width": 168, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "edgePosition": 1, + "underline": false, + "text": "5 : downloadImageWithURL()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv235Tc5kvxw=", + "_parent": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "model": { + "$ref": "AAAAAAFUv235TM5h8OU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 930, + "top": 241, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv235Tc5lN1Y=", + "_parent": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "model": { + "$ref": "AAAAAAFUv235TM5h8OU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 930, + "top": 276, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv235Tc5mBt8=", + "_parent": { + "$ref": "AAAAAAFUv235TM5iC/o=" + }, + "model": { + "$ref": "AAAAAAFUv235TM5h8OU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1152, + "top": 272, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv22omc5ImFY=" + }, + "tail": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "lineStyle": 0, + "points": "709:272;1152:272", + "nameLabel": { + "$ref": "AAAAAAFUv235Tc5jIuU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv235Tc5kvxw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv235Tc5lN1Y=" + }, + "activation": { + "$ref": "AAAAAAFUv235Tc5mBt8=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv27NWM56DH8=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv27NV855tyI=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv27NWM57KC8=", + "_parent": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "model": { + "$ref": "AAAAAAFUv27NV855tyI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 883, + "top": 324, + "width": 100, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "edgePosition": 1, + "underline": false, + "text": "6 : network result", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv27NWM58Rks=", + "_parent": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "model": { + "$ref": "AAAAAAFUv27NV855tyI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 933, + "top": 339, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv27NWc59ep8=", + "_parent": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "model": { + "$ref": "AAAAAAFUv27NV855tyI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 934, + "top": 304, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv27NWc5+otg=", + "_parent": { + "$ref": "AAAAAAFUv27NWM56DH8=" + }, + "model": { + "$ref": "AAAAAAFUv27NV855tyI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 709, + "top": 320, + "width": 14, + "height": 25, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "tail": { + "$ref": "AAAAAAFUv22omc5ImFY=" + }, + "lineStyle": 0, + "points": "1159:320;709:320", + "nameLabel": { + "$ref": "AAAAAAFUv27NWM57KC8=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv27NWM58Rks=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv27NWc59ep8=" + }, + "activation": { + "$ref": "AAAAAAFUv27NWc5+otg=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv3C4p87cxD0=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv3C4p87b5L8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3C4qM7dheQ=", + "_parent": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "model": { + "$ref": "AAAAAAFUv3C4p87b5L8=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 769, + "top": 353, + "width": 92, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "edgePosition": 1, + "underline": false, + "text": "7 : storeImage()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3C4qM7eLhs=", + "_parent": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "model": { + "$ref": "AAAAAAFUv3C4p87b5L8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 815, + "top": 338, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3C4qM7fGpA=", + "_parent": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "model": { + "$ref": "AAAAAAFUv3C4p87b5L8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 815, + "top": 373, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv3C4qM7gDWs=", + "_parent": { + "$ref": "AAAAAAFUv3C4p87cxD0=" + }, + "model": { + "$ref": "AAAAAAFUv3C4p87b5L8=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 921, + "top": 369, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + }, + "tail": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "lineStyle": 0, + "points": "709:369;921:369", + "nameLabel": { + "$ref": "AAAAAAFUv3C4qM7dheQ=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv3C4qM7eLhs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv3C4qM7fGpA=" + }, + "activation": { + "$ref": "AAAAAAFUv3C4qM7gDWs=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv3HvS870VtA=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv3HvS87z/RM=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3HvTM7122A=", + "_parent": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "model": { + "$ref": "AAAAAAFUv3HvS87z/RM=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 558, + "top": 405, + "width": 54, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "edgePosition": 1, + "underline": false, + "text": "8 : image", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3HvTM7215Q=", + "_parent": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "model": { + "$ref": "AAAAAAFUv3HvS87z/RM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 585, + "top": 420, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3HvTM73+D4=", + "_parent": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "model": { + "$ref": "AAAAAAFUv3HvS87z/RM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 586, + "top": 385, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv3HvTM74fZk=", + "_parent": { + "$ref": "AAAAAAFUv3HvS870VtA=" + }, + "model": { + "$ref": "AAAAAAFUv3HvS87z/RM=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 464, + "top": 401, + "width": 14, + "height": 25, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + }, + "tail": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "lineStyle": 0, + "points": "709:401;464:401", + "nameLabel": { + "$ref": "AAAAAAFUv3HvTM7122A=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv3HvTM7215Q=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv3HvTM73+D4=" + }, + "activation": { + "$ref": "AAAAAAFUv3HvTM74fZk=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv3Je6M8LSBs=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv3Je6M8Kzp4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3Je6M8MCNc=", + "_parent": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "model": { + "$ref": "AAAAAAFUv3Je6M8Kzp4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 325, + "top": 420, + "width": 76, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "edgePosition": 1, + "underline": false, + "text": "9 : set image", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3Je6c8NDpI=", + "_parent": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "model": { + "$ref": "AAAAAAFUv3Je6M8Kzp4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 363, + "top": 435, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv3Je6c8OBck=", + "_parent": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "model": { + "$ref": "AAAAAAFUv3Je6M8Kzp4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 364, + "top": 400, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv3Je6c8P9Dk=", + "_parent": { + "$ref": "AAAAAAFUv3Je6M8LSBs=" + }, + "model": { + "$ref": "AAAAAAFUv3Je6M8Kzp4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 264, + "top": 416, + "width": 14, + "height": 25, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2aETcyhhXc=" + }, + "tail": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + }, + "lineStyle": 0, + "points": "464:416;264:416", + "nameLabel": { + "$ref": "AAAAAAFUv3Je6M8MCNc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv3Je6c8NDpI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv3Je6c8OBck=" + }, + "activation": { + "$ref": "AAAAAAFUv3Je6c8P9Dk=" + }, + "showProperty": true, + "showType": true } ], "showSequenceNumber": true, @@ -8568,14 +12498,251 @@ } ], "visibility": "public", - "isReentrant": true + "isReentrant": true, + "messages": [ + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv2qLR828Lgg=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message1", + "source": { + "$ref": "AAAAAAFUv2aES8yaBvg=" + }, + "target": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "visibility": "public", + "messageSort": "asynchCall", + "signature": { + "$ref": "AAAAAAFUmPuK4C6yWrI=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv2rvmM3S8xg=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message2", + "source": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "target": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "visibility": "public", + "messageSort": "asynchCall", + "signature": { + "$ref": "AAAAAAFUkh/xZ44AqYk=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv2v1XM4JR/4=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message3", + "source": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "target": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "visibility": "public", + "messageSort": "asynchCall", + "signature": { + "$ref": "AAAAAAFUmPN5KSOfrIg=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv2z3z84kqYU=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "disk result", + "source": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "target": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "visibility": "public", + "messageSort": "reply", + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv235TM5h8OU=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message4", + "source": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "target": { + "$ref": "AAAAAAFUv22omM5BZb4=" + }, + "visibility": "public", + "messageSort": "asynchCall", + "signature": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv27NV855tyI=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "network result", + "source": { + "$ref": "AAAAAAFUv22omM5BZb4=" + }, + "target": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "visibility": "public", + "messageSort": "reply", + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv3C4p87b5L8=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message5", + "source": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "target": { + "$ref": "AAAAAAFUv2ti0c3pnPk=" + }, + "visibility": "public", + "messageSort": "synchCall", + "signature": { + "$ref": "AAAAAAFUmPMOWiHsOa0=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv3HvS87z/RM=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "image", + "source": { + "$ref": "AAAAAAFUv2n3Rc1fbGI=" + }, + "target": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "visibility": "public", + "messageSort": "reply", + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFUv3Je6M8Kzp4=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "set image", + "source": { + "$ref": "AAAAAAFUv2nXaM1AL0k=" + }, + "target": { + "$ref": "AAAAAAFUv2aES8yaBvg=" + }, + "visibility": "public", + "messageSort": "reply", + "isConcurrentIteration": false + } + ], + "participants": [ + { + "_type": "UMLLifeline", + "_id": "AAAAAAFUv2aES8yaBvg=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Other object", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFUv2aES8yZWGo=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFUv2nXaM1AL0k=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Lifeline1", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFUv2nXZ80/4sA=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFUv2n3Rc1fbGI=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Lifeline2", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFUv2n3Rc1e9QI=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFUv2ti0c3pnPk=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Lifeline3", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFUv2ti0c3ocQo=" + }, + "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFUv22omM5BZb4=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Lifeline4", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFUv22ol85ADFk=" + }, + "isMultiInstance": false + } + ] } ], "visibility": "public", "attributes": [ { "_type": "UMLAttribute", - "_id": "AAAAAAFUkhiPbozyZ3U=", + "_id": "AAAAAAFUv2HAQMvkinw=", "_parent": { "$ref": "AAAAAAFUkhaWOozRCy8=" }, @@ -8583,8 +12750,138 @@ "visibility": "public", "isStatic": false, "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2UwYMxGW0c=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role2", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2aES8yZWGo=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role3", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2dCAMzP0O0=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role4", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2nXZ80/4sA=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role5", + "visibility": "public", + "isStatic": false, + "isLeaf": false, "type": { - "$ref": "AAAAAAFUkhgItozoKPM=" + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2n3Rc1e9QI=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role6", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv2ti0c3ocQo=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role7", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUv22ol85ADFk=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role8", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFUkh8UMI38gtY=" }, "isReadOnly": false, "isOrdered": false, @@ -9802,10 +14099,10 @@ "$ref": "AAAAAAFUkh8UMI38gtY=" }, "source": { - "$ref": "AAAAAAFUkh8UMI38gtY=" + "$ref": "AAAAAAFUkhwuq42z3w4=" }, "target": { - "$ref": "AAAAAAFUmOmq1v73mh4=" + "$ref": "AAAAAAFUkiR/Go5pUW0=" }, "visibility": "public" } @@ -10507,6 +14804,54 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "MKAnnotationView (WebCache)", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUv1BsrSlLhko=", + "_parent": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "name": "uses", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1BsrSlMh4M=", + "_parent": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1BsrSlN0xQ=", + "_parent": { + "$ref": "AAAAAAFUv1BsrSlLhko=" + }, + "reference": { + "$ref": "AAAAAAFUmPjp9CtnN2Y=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], "visibility": "public", "operations": [ { @@ -10536,6 +14881,54 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "UIButton (WebCache)", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUv1FUOTJ/WPA=", + "_parent": { + "$ref": "AAAAAAFUmPoFSiy4ZTk=" + }, + "name": "uses", + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1FUOTKAXw0=", + "_parent": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "reference": { + "$ref": "AAAAAAFUmN6ZSOUCaRM=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1FUOTKBt7k=", + "_parent": { + "$ref": "AAAAAAFUv1FUOTJ/WPA=" + }, + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], "visibility": "public", "operations": [ { @@ -10565,6 +14958,54 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "UIImageView (WebCache)", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFUv1AABiZSvRE=", + "_parent": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1AABiZTkZo=", + "_parent": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "name": "uses", + "reference": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFUv1AABiZUFhE=", + "_parent": { + "$ref": "AAAAAAFUv1AABiZSvRE=" + }, + "reference": { + "$ref": "AAAAAAFUmPtmMC6BqlU=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], "visibility": "public", "operations": [ { diff --git a/Docs/SDWebImageClassDiagram.png b/Docs/SDWebImageClassDiagram.png index 394437d4495223e0e895e8ebc98963fb406dea2c..a20e214b51c82f446ea139ecfb554930facfc1f6 100644 GIT binary patch literal 228949 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%0D7jXo3(j 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 z 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 IyX`~&3yTK5F8}}l diff --git a/Docs/SDWebImageSequenceDiagram.png b/Docs/SDWebImageSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7d830a0e6f71f03b43dfde019da70fba1988e8 GIT binary patch literal 37837 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 45d00ce2..afc9a9fd 100644 --- a/README.md +++ b/README.md @@ -172,3 +172,8 @@ All source code is licensed under the [MIT License](https://raw.github.com/rs/SD

+ +

+ +

+ From 8a78586d4e35c91519e83dfa3b9cd25d05bced00 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 23 May 2016 07:38:48 +0300 Subject: [PATCH 032/207] Update to feature - exposed the SDWebImageDownloadToken class --- SDWebImage/SDWebImageDownloader.h | 23 ++++++++++++++------ SDWebImage/SDWebImageDownloader.m | 35 +++++++++++++------------------ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index 84592efa..a38d1e70 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -72,6 +72,17 @@ typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDictionary *headers); +/** + * A token associated with each download. Can be used to cancel a download + */ +@interface SDWebImageDownloadToken : NSObject + +@property (nonatomic, strong) NSURL *url; +@property (nonatomic, strong) id downloadOperationCancelToken; + +@end + + /** * Asynchronous downloader dedicated and optimized for image loading. */ @@ -176,19 +187,19 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * before to be called a last time with the full image and finished argument * set to YES. In case of error, the finished argument is always YES. * - * @return A token that can be passed to -cancel: to cancel this operation + * @return A token (SDWebImageDownloadToken) that can be passed to -cancel: to cancel this operation */ -- (id)downloadImageWithURL:(NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock; +- (SDWebImageDownloadToken *)downloadImageWithURL:(NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock; /** * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: * * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. */ -- (void)cancel:(id)token; +- (void)cancel:(SDWebImageDownloadToken *)token; /** * Sets the download queue suspension state diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index a6811feb..464ad1d6 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -10,15 +10,9 @@ #import "SDWebImageDownloaderOperation.h" #import -@interface _SDWebImageDownloaderToken : NSObject - -@property (nonatomic, strong) NSURL *url; -@property (nonatomic, strong) id downloadOperationCancelToken; - +@implementation SDWebImageDownloadToken @end -@implementation _SDWebImageDownloaderToken -@end @interface SDWebImageDownloader () @@ -119,7 +113,10 @@ _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; } -- (id)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { +- (SDWebImageDownloadToken *)downloadImageWithURL:(NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock { __weak SDWebImageDownloader *wself = self; return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ @@ -164,22 +161,20 @@ }]; } -- (void)cancel:(id)token { - if (![token isKindOfClass:[_SDWebImageDownloaderToken class]]) { - return; - } - +- (void)cancel:(SDWebImageDownloadToken *)token { dispatch_barrier_async(self.barrierQueue, ^{ - _SDWebImageDownloaderToken *typedToken = (_SDWebImageDownloaderToken *)token; - SDWebImageDownloaderOperation *operation = self.URLOperations[typedToken.url]; - BOOL canceled = [operation cancel:typedToken.downloadOperationCancelToken]; + SDWebImageDownloaderOperation *operation = self.URLOperations[token.url]; + BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; if (canceled) { - [self.URLOperations removeObjectForKey:typedToken.url]; + [self.URLOperations removeObjectForKey:token.url]; } }); } -- (id)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { +- (SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock + completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock + forURL:(NSURL *)url + createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. if (url == nil) { if (completedBlock != nil) { @@ -188,7 +183,7 @@ return nil; } - __block _SDWebImageDownloaderToken *token = nil; + __block SDWebImageDownloadToken *token = nil; dispatch_barrier_sync(self.barrierQueue, ^{ SDWebImageDownloaderOperation *operation = self.URLOperations[url]; @@ -207,7 +202,7 @@ } id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; - token = [_SDWebImageDownloaderToken new]; + token = [SDWebImageDownloadToken new]; token.url = url; token.downloadOperationCancelToken = downloadOperationCancelToken; }); From 64382b91009d71534af5e7e402cdd614a0c955f1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 23 May 2016 07:58:02 +0300 Subject: [PATCH 033/207] Modern Objective-C syntax --- Examples/SDWebImage Demo/AppDelegate.m | 4 +-- .../SDWebImage Demo/MasterViewController.m | 6 ++-- SDWebImage/NSData+ImageContentType.m | 2 +- SDWebImage/SDImageCache.h | 5 +-- SDWebImage/SDImageCache.m | 36 +++++++++---------- SDWebImage/SDWebImageCompat.m | 2 +- SDWebImage/SDWebImageDownloader.m | 4 +-- SDWebImage/SDWebImageDownloaderOperation.h | 4 +-- SDWebImage/SDWebImageDownloaderOperation.m | 26 ++++++++------ SDWebImage/SDWebImageManager.m | 6 ++-- SDWebImage/SDWebImagePrefetcher.h | 2 +- SDWebImage/SDWebImagePrefetcher.m | 10 +++--- SDWebImage/UIImage+GIF.m | 4 +-- SDWebImage/UIImageView+WebCache.m | 2 +- SDWebImage/UIView+WebCacheOperation.m | 4 +-- 15 files changed, 62 insertions(+), 55 deletions(-) diff --git a/Examples/SDWebImage Demo/AppDelegate.m b/Examples/SDWebImage Demo/AppDelegate.m index 3e5f51e0..4ddd8e64 100644 --- a/Examples/SDWebImage Demo/AppDelegate.m +++ b/Examples/SDWebImage Demo/AppDelegate.m @@ -20,10 +20,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Add a custom read-only cache path - NSString *bundledPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"CustomPathImages"]; + NSString *bundledPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"CustomPathImages"]; [[SDImageCache sharedImageCache] addReadOnlyCachePath:bundledPath]; - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // Override point for customization after application launch. MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil]; diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 8f7dbc84..57711c44 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -19,7 +19,7 @@ @synthesize detailViewController = _detailViewController; -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) @@ -90,7 +90,7 @@ cell.textLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; cell.imageView.contentMode = UIViewContentModeScaleAspectFill; - [cell.imageView sd_setImageWithURL:[NSURL URLWithString:[_objects objectAtIndex:indexPath.row]] + [cell.imageView sd_setImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; return cell; } @@ -101,7 +101,7 @@ { self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; } - NSString *largeImageURL = [[_objects objectAtIndex:indexPath.row] stringByReplacingOccurrencesOfString:@"small" withString:@"source"]; + NSString *largeImageURL = [_objects[indexPath.row] stringByReplacingOccurrencesOfString:@"small" withString:@"source"]; self.detailViewController.imageURL = [NSURL URLWithString:largeImageURL]; [self.navigationController pushViewController:self.detailViewController animated:YES]; } diff --git a/SDWebImage/NSData+ImageContentType.m b/SDWebImage/NSData+ImageContentType.m index f073fb08..beb73b59 100644 --- a/SDWebImage/NSData+ImageContentType.m +++ b/SDWebImage/NSData+ImageContentType.m @@ -23,7 +23,7 @@ return @"image/tiff"; case 0x52: // R as RIFF for WEBP - if ([data length] < 12) { + if (data.length < 12) { return nil; } diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 6704541e..a51095b9 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -84,7 +84,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @param ns The namespace to use for this cache store */ -- (id)initWithNamespace:(NSString *)ns; +- (instancetype)initWithNamespace:(NSString *)ns; /** * Init a new cache store with a specific namespace and directory @@ -92,7 +92,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param ns The namespace to use for this cache store * @param directory Directory to cache disk images in */ -- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory; +- (instancetype)initWithNamespace:(NSString *)ns + diskCacheDirectory:(NSString *)directory NS_DESIGNATED_INITIALIZER; -(NSString *)makeDiskCachePath:(NSString*)fullNamespace; diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index fe244824..9e994d82 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -42,8 +42,8 @@ static NSData *kPNGSignatureData = nil; BOOL ImageDataHasPNGPreffix(NSData *data); BOOL ImageDataHasPNGPreffix(NSData *data) { - NSUInteger pngSignatureLength = [kPNGSignatureData length]; - if ([data length] >= pngSignatureLength) { + NSUInteger pngSignatureLength = kPNGSignatureData.length; + if (data.length >= pngSignatureLength) { if ([[data subdataWithRange:NSMakeRange(0, pngSignatureLength)] isEqualToData:kPNGSignatureData]) { return YES; } @@ -79,16 +79,16 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return instance; } -- (id)init { +- (instancetype)init { return [self initWithNamespace:@"default"]; } -- (id)initWithNamespace:(NSString *)ns { +- (instancetype)initWithNamespace:(NSString *)ns { NSString *path = [self makeDiskCachePath:ns]; return [self initWithNamespace:ns diskCacheDirectory:path]; } -- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { +- (instancetype)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { if ((self = [super init])) { NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; @@ -175,7 +175,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #pragma mark SDImageCache (private) - (NSString *)cachedFileNameForKey:(NSString *)key { - const char *str = [key UTF8String]; + const char *str = key.UTF8String; if (str == NULL) { str = ""; } @@ -183,7 +183,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { CC_MD5(str, (CC_LONG)strlen(str), r); NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%@", r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], - r[11], r[12], r[13], r[14], r[15], [[key pathExtension] isEqualToString:@""] ? @"" : [NSString stringWithFormat:@".%@", [key pathExtension]]]; + r[11], r[12], r[13], r[14], r[15], [key.pathExtension isEqualToString:@""] ? @"" : [NSString stringWithFormat:@".%@", key.pathExtension]]; return filename; } @@ -226,7 +226,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { BOOL imageIsPng = hasAlpha; // But if we have an image data, we will look at the preffix - if ([imageData length] >= [kPNGSignatureData length]) { + if (imageData.length >= kPNGSignatureData.length) { imageIsPng = ImageDataHasPNGPreffix(imageData); } @@ -273,7 +273,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // disable iCloud backup if (self.shouldDisableiCloud) { - [fileURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]; + [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; } } @@ -287,7 +287,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension if (!exists) { - exists = [[NSFileManager defaultManager] fileExistsAtPath:[[self defaultCachePathForKey:key] stringByDeletingPathExtension]]; + exists = [[NSFileManager defaultManager] fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; } return exists; @@ -300,7 +300,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension if (!exists) { - exists = [_fileManager fileExistsAtPath:[[self defaultCachePathForKey:key] stringByDeletingPathExtension]]; + exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; } if (completionBlock) { @@ -342,7 +342,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - data = [NSData dataWithContentsOfFile:[defaultPath stringByDeletingPathExtension]]; + data = [NSData dataWithContentsOfFile:defaultPath.stringByDeletingPathExtension]; if (data) { return data; } @@ -357,7 +357,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - imageData = [NSData dataWithContentsOfFile:[filePath stringByDeletingPathExtension]]; + imageData = [NSData dataWithContentsOfFile:filePath.stringByDeletingPathExtension]; if (imageData) { return imageData; } @@ -544,8 +544,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // Store a reference to this file and account for its total size. NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize += [totalAllocatedSize unsignedIntegerValue]; - [cacheFiles setObject:resourceValues forKey:fileURL]; + currentCacheSize += totalAllocatedSize.unsignedIntegerValue; + cacheFiles[fileURL] = resourceValues; } for (NSURL *fileURL in urlsToDelete) { @@ -569,7 +569,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { if ([_fileManager removeItemAtURL:fileURL error:nil]) { NSDictionary *resourceValues = cacheFiles[fileURL]; NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize -= [totalAllocatedSize unsignedIntegerValue]; + currentCacheSize -= totalAllocatedSize.unsignedIntegerValue; if (currentCacheSize < desiredCacheSize) { break; @@ -622,7 +622,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { __block NSUInteger count = 0; dispatch_sync(self.ioQueue, ^{ NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; - count = [[fileEnumerator allObjects] count]; + count = fileEnumerator.allObjects.count; }); return count; } @@ -642,7 +642,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { for (NSURL *fileURL in fileEnumerator) { NSNumber *fileSize; [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL]; - totalSize += [fileSize unsignedIntegerValue]; + totalSize += fileSize.unsignedIntegerValue; fileCount += 1; } diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 57d94135..3de79f4e 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -17,7 +17,7 @@ inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) { return nil; } - if ([image.images count] > 0) { + if ((image.images).count > 0) { NSMutableArray *scaledImages = [NSMutableArray array]; for (UIImage *tempImage in image.images) { diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 464ad1d6..5355765c 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -60,7 +60,7 @@ return instance; } -- (id)init { +- (instancetype)init { if ((self = [super init])) { _operationClass = [SDWebImageDownloaderOperation class]; _shouldDecompressImages = YES; @@ -211,7 +211,7 @@ } - (void)setSuspended:(BOOL)suspended { - [self.downloadQueue setSuspended:suspended]; + (self.downloadQueue).suspended = suspended; } - (void)cancelAllDownloads { diff --git a/SDWebImage/SDWebImageDownloaderOperation.h b/SDWebImage/SDWebImageDownloaderOperation.h index 68abec23..69763afa 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.h +++ b/SDWebImage/SDWebImageDownloaderOperation.h @@ -64,8 +64,8 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * @return the initialized instance */ -- (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options; +- (instancetype)initWithRequest:(NSURLRequest *)request + options:(SDWebImageDownloaderOptions)options NS_DESIGNATED_INITIALIZER; /** * Adds handlers for progress and completion. Returns a tokent that can be passed to -cancel: to cancel this set of diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 51f83a8a..38844c5e 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -46,8 +46,14 @@ static NSString *const kCompletedCallbackKey = @"completed"; @synthesize executing = _executing; @synthesize finished = _finished; -- (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options { +- (instancetype)init { + if (self = [self initWithRequest:nil options:0]) { + } + return self; +} + +- (instancetype)initWithRequest:(NSURLRequest *)request + options:(SDWebImageDownloaderOptions)options { if ((self = [super init])) { _request = request; _shouldDecompressImages = YES; @@ -250,7 +256,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { //'304 Not Modified' is an exceptional one - if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { + if (![response respondsToSelector:@selector(statusCode)] || (((NSHTTPURLResponse *)response).statusCode < 400 && ((NSHTTPURLResponse *)response).statusCode != 304)) { NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { @@ -264,7 +270,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; }); } else { - NSUInteger code = [((NSHTTPURLResponse *)response) statusCode]; + NSUInteger code = ((NSHTTPURLResponse *)response).statusCode; //This is the case when server returns '304 Not Modified'. It means that remote image is not changed. //In case of 304 we need just cancel the operation and return cached image from the cache. @@ -278,7 +284,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; }); for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { - completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); + completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:((NSHTTPURLResponse *)response).statusCode userInfo:nil], YES); } CFRunLoopStop(CFRunLoopGetCurrent()); [self done]; @@ -489,17 +495,17 @@ static NSString *const kCompletedCallbackKey = @"completed"; [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; } else { NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; - [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + [challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; } } else { - if ([challenge previousFailureCount] == 0) { + if (challenge.previousFailureCount == 0) { if (self.credential) { - [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + [challenge.sender useCredential:self.credential forAuthenticationChallenge:challenge]; } else { - [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } } else { - [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } } } diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 6e2c9f51..60174c9f 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -28,7 +28,7 @@ @implementation SDWebImageManager -+ (id)sharedManager { ++ (SDWebImageManager*)sharedManager { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -37,7 +37,7 @@ return instance; } -- (id)init { +- (instancetype)init { if ((self = [super init])) { _imageCache = [self createCache]; _imageDownloader = [SDWebImageDownloader sharedDownloader]; @@ -56,7 +56,7 @@ return self.cacheKeyFilter(url); } else { - return [url absoluteString]; + return url.absoluteString; } } diff --git a/SDWebImage/SDWebImagePrefetcher.h b/SDWebImage/SDWebImagePrefetcher.h index 6c31b15f..52e74c0f 100644 --- a/SDWebImage/SDWebImagePrefetcher.h +++ b/SDWebImage/SDWebImagePrefetcher.h @@ -73,7 +73,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Allows you to instantiate a prefetcher with any arbitrary image manager. */ -- (id)initWithImageManager:(SDWebImageManager *)manager; +- (instancetype)initWithImageManager:(SDWebImageManager *)manager NS_DESIGNATED_INITIALIZER; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index c66f995f..1dfddafd 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -32,11 +32,11 @@ return instance; } -- (id)init { +- (instancetype)init { return [self initWithImageManager:[SDWebImageManager new]]; } -- (id)initWithImageManager:(SDWebImageManager *)manager { +- (instancetype)initWithImageManager:(SDWebImageManager *)manager { if ((self = [super init])) { _manager = manager; _options = SDWebImageLowPriority; @@ -63,12 +63,12 @@ if (image) { if (self.progressBlock) { - self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + self.progressBlock(self.finishedCount,(self.prefetchURLs).count); } } else { if (self.progressBlock) { - self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + self.progressBlock(self.finishedCount,(self.prefetchURLs).count); } // Add last failed self.skippedCount++; @@ -96,7 +96,7 @@ } - (void)reportStatus { - NSUInteger total = [self.prefetchURLs count]; + NSUInteger total = (self.prefetchURLs).count; if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didFinishWithTotalCount:skippedCount:)]) { [self.delegate imagePrefetcher:self didFinishWithTotalCount:(total - self.skippedCount) diff --git a/SDWebImage/UIImage+GIF.m b/SDWebImage/UIImage+GIF.m index bf74a367..de45dd35 100755 --- a/SDWebImage/UIImage+GIF.m +++ b/SDWebImage/UIImage+GIF.m @@ -63,13 +63,13 @@ NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; if (delayTimeUnclampedProp) { - frameDuration = [delayTimeUnclampedProp floatValue]; + frameDuration = delayTimeUnclampedProp.floatValue; } else { NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; if (delayTimeProp) { - frameDuration = [delayTimeProp floatValue]; + frameDuration = delayTimeProp.floatValue; } } diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 98ac480b..a86e4c06 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -156,7 +156,7 @@ static char TAG_ACTIVITY_SHOW; } - (void)setShowActivityIndicatorView:(BOOL)show{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, [NSNumber numberWithBool:show], OBJC_ASSOCIATION_RETAIN); + objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); } - (BOOL)showActivityIndicatorView{ diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index 92194780..1f391cda 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -26,13 +26,13 @@ static char loadOperationKey; - (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key { [self sd_cancelImageLoadOperationWithKey:key]; NSMutableDictionary *operationDictionary = [self operationDictionary]; - [operationDictionary setObject:operation forKey:key]; + operationDictionary[key] = operation; } - (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { // Cancel in progress downloader from queue NSMutableDictionary *operationDictionary = [self operationDictionary]; - id operations = [operationDictionary objectForKey:key]; + id operations = operationDictionary[key]; if (operations) { if ([operations isKindOfClass:[NSArray class]]) { for (id operation in operations) { From 842d6aac7b4cf8221495eb9d4d65d7faa69987c1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 May 2016 21:46:40 +0300 Subject: [PATCH 034/207] Added CONTRIBUTING, ISSUE and PULL_REQUEST TEMPLATE --- .github/CONTRIBUTING.md | 42 ++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 23 +++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 18 ++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..b7b0e6d5 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Contributing to SDWebImage + +We want to make contributing to this project as easy and transparent as possible. Here are a few guidelines for making all our lives easier. + +## Asking questions + +We don't use GitHub as a support forum. For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com/) instead. By doing so, you'll be more likely to quickly solve your problem, and you'll allow anyone else with the same question to find the answer. This also allows maintainers to focus on improving the project for others. + +## Reporting Issues + +A great way to contribute to the project is to send a detailed issue when you encounter an problem. +It is very important to check for the same problem or suggestion in the project's issue list first. If you find a match, just add a small comment there. +Doing this helps prioritize the most common problems and requests. + +When reporting issues, please include the following: + +- The platform name and version (e.g. iOS 8.1) +- The library version +- The integration method (e.g. CocoaPods/Carthage/manually) +- The version of Xcode you're using +- The full output of any stack trace or compiler error +- A small demo project that replicates the issue (especially if the way to reproduce the issue is not straight-forward) +- Any other details that would be useful in understanding the problem + +This information will help us review and fix your issue faster. + + +Please do not be offended if we close your issue and reference this document. +If you believe the issue is truely a fault in the project’s codebase, re-open it. + +## Pull Requests + +We gladly accept any PR's assuming they are well written, documented ( if necessary ) and preferably have test code. +If you're unsure if we'll accept a new feature please open an issue requesting it and we can have a discussion before you code and submit a PR. + +Checklist: +- Fork the repo and create your branch from the latest master (to minimize the conflicts) +- If you've added code that should be tested, add tests. +- If you've changed APIs, update the documentation. +- Ensure the test suite passes. +- Make sure your code lints (pod lib lint) + diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..91f119a2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,23 @@ +### New Issue Checklist + +* [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/rs/SDWebImage/blob/master/.github/CONTRIBUTING.md) +* [ ] I have read the [Documentation](http://cocoadocs.org/docsets/SDWebImage/) +* [ ] I have searched for a similar issue in the [project](https://github.com/rs/SDWebImage/issues) and found none + +### Issue Info + + Info | Value | +-------------------------|-------------------------------------| + Platform Name | e.g. ios / tvos + Platform Version | e.g. 8.0 + SDWebImage Version | e.g. 3.7.6 + Integration Method | e.g. carthage / cocoapods / manually + Xcode Version | e.g. Xcode 7.3 + Repro rate | e.g. all the time (100%) / sometimes x% / only once + Repro with our demo prj | e.g. does it happen with our demo project? + Demo project link | e.g. link to a demo project that highlights the issue + +### Issue Description and Steps + +Please fill in the detailed description of the issue (full output of any stack trace, compiler error, ...) and the steps to reproduce the issue. + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..857367b6 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +### New Pull Request Checklist + +* [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/rs/SDWebImage/blob/master/.github/CONTRIBUTING.md) +* [ ] I have read the [Documentation](http://cocoadocs.org/docsets/SDWebImage/) +* [ ] I have searched for a similar pull request in the [project](https://github.com/rs/SDWebImage/pulls) and found none + +* [ ] I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase) +* [ ] I have added the required tests to prove the fix/feature I am adding +* [ ] I have updated the documentation (if necesarry) +* [ ] I have run the tests and they pass +* [ ] I have run the lint and it passes (`pod lib lint`) + +This merge request fixes / reffers to the following issues: ... + +### Pull Request Description + +... + From 9aa95e83b915be41ab3e40bb00e456df2462ee99 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 May 2016 21:52:11 +0300 Subject: [PATCH 035/207] Added Communication section to the readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index afc9a9fd..ecb2674c 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,14 @@ This library provides an async image downloader with cache support. For convenie ## Who Uses It - Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. +## Communication + +- If you need help, use Stack Overflow. (Tag 'sdwebimage') +- If you'd like to ask a general question, use Stack Overflow. +- If you found a bug, open an issue. +- If you have a feature request, open an issue. +- If you want to contribute, submit a pull request. + ## Installation ## How To Use From 4d295fdaf0d40dd392a1c26b88f6af5f27a06c49 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 May 2016 22:08:31 +0300 Subject: [PATCH 036/207] Improved the formatting of the Readme/Communication section --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ecb2674c..bf9c4903 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,11 @@ This library provides an async image downloader with cache support. For convenie ## Communication -- If you need help, use Stack Overflow. (Tag 'sdwebimage') -- If you'd like to ask a general question, use Stack Overflow. -- If you found a bug, open an issue. -- If you have a feature request, open an issue. -- If you want to contribute, submit a pull request. +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). (Tag 'sdwebimage') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). +- If you **found a bug**, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. ## Installation From e9e7edffdefac6430c9260cf47fb9d6d10e73bba Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 May 2016 22:50:53 +0300 Subject: [PATCH 037/207] Fixed #1444 and the master build thanks to https://github.com/kenmaz/SDWebImage/commit/5034c334be50765dfe4e97c48bcb74ef64175188 --- SDWebImage.podspec | 5 ++++- SDWebImage/UIImage+WebP.m | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index 6b3c3272..646126f6 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -37,7 +37,10 @@ Pod::Spec.new do |s| s.subspec 'WebP' do |webp| webp.source_files = 'SDWebImage/UIImage+WebP.{h,m}' - webp.xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SD_WEBP=1' } + webp.xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SD_WEBP=1', + 'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/libwebp/src' + } webp.dependency 'SDWebImage/Core' webp.dependency 'libwebp' end diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index b1895d78..a7e341f6 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -12,7 +12,7 @@ #if !COCOAPODS #import "webp/decode.h" #else -#import "libwebp/webp/decode.h" +#import "webp/decode.h" #endif // Callback for CGDataProviderRelease From d625be8d98afac39d2d730253dce8fc2b38c3aa2 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 29 May 2016 00:53:49 +0300 Subject: [PATCH 038/207] Need to clean the SDWebImage scheme to allow the tests to rebuild it using their required platform. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c3f111a3..ffa29189 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,4 +38,5 @@ script: - echo Run the tests - pod install --project-directory=Tests + - xcodebuild clean -workspace SDWebImage.xcworkspace -scheme 'SDWebImage-static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c \ No newline at end of file From 512c536fcff8283ec0a1dc358abff2838dcc146a Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 29 May 2016 13:08:15 +0300 Subject: [PATCH 039/207] The pod setup output is huge with CocoaPods 1.0.0 (10.000+ lines), causes Travis to "This log is too long to be displayed. Please reduce the verbosity of your build or download the raw log." --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ffa29189..986ce3c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - gem install cocoapods --no-rdoc --no-ri --no-document --quiet - gem install xcpretty --no-rdoc --no-ri --no-document --quiet - pod --version - - pod setup --silent + - pod setup --silent > /dev/null - pod repo update --silent - xcpretty --version - xcodebuild -version From b5a504f32608b9293caaf44143a97566c395a88b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 29 May 2016 13:08:29 +0300 Subject: [PATCH 040/207] =?UTF-8?q?Trying=20to=20get=20around=20this=20las?= =?UTF-8?q?t=20build=20error=20"The=20certificate=20for=20this=20server=20?= =?UTF-8?q?is=20invalid.=20You=20might=20be=20connecting=20to=20a=20server?= =?UTF-8?q?=20that=20is=20pretending=20to=20be=20=C3=A2=E2=82=AC=C5=93www.?= =?UTF-8?q?google.gr=C3=A2=E2=82=AC=C2=9D=20which=20could=20put=20your=20c?= =?UTF-8?q?onfidential=20information=20at=20risk."=20by=20using=20a=20diff?= =?UTF-8?q?erent=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tests/Tests/SDWebImageManagerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index e4069595..cf26720b 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -38,7 +38,7 @@ static int64_t kAsyncTestTimeout = 5; - (void)testThatDownloadInvokesCompletionBlockWithCorrectParamsAsync { __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; - NSURL *originalImageURL = [NSURL URLWithString:@"https://www.google.gr/images/srpr/logo11w.png"]; + NSURL *originalImageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]; [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { expect(image).toNot.beNil(); From fb0cdb6dc423b62894dd7624eefda04ae612c90d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 29 May 2016 16:25:31 +0300 Subject: [PATCH 041/207] Fixed #1553 Cached file name with path extension UIWebView issue - for iOS 7 and above, remove the query from the url (prior to iOS 7 the behavior remains the same). --- SDWebImage/SDWebImageManager.m | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 60174c9f..70c03a1d 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -56,7 +56,13 @@ return self.cacheKeyFilter(url); } else { - return url.absoluteString; + if (NSClassFromString(@"NSURLComponents")) { + NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO]; + urlComponents.query = nil; // Strip out query parameters. + return urlComponents.string; + } else { + return url.absoluteString; + } } } From 795832aadc9bbe5833fb2ae4ed612d8312fdd7a4 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 29 May 2016 22:32:15 +0300 Subject: [PATCH 042/207] Fixed #1415 documentation was not updated when `removeImageForKey:` became async --- SDWebImage/SDImageCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index a51095b9..36293ea8 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -165,7 +165,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (UIImage *)imageFromDiskCacheForKey:(NSString *)key; /** - * Remove the image from memory and disk cache synchronously + * Remove the image from memory and disk cache asynchronously * * @param key The unique image cache key */ From 9112170ea3f4084564c100a97fe828f654f2750c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 30 May 2016 07:31:01 +0300 Subject: [PATCH 043/207] Replaces #1398 Allow to customise cache and image downloader instances used with SDWebImageManager - added a new initializer (`initWithCache:downloader:`) --- SDWebImage/SDWebImageManager.h | 6 ++++++ SDWebImage/SDWebImageManager.m | 14 ++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 4a9e6f38..7edfc74c 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -181,6 +181,12 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; */ + (SDWebImageManager *)sharedManager; +/** + * Allows to specify instance of cache and image downloader used with image manager. + * @return new instance of `SDWebImageManager` with specified cache and downloader. + */ +- (instancetype)initWithCache:(SDImageCache *)cache downloader:(SDWebImageDownloader *)downloader; + /** * Downloads the image at the given URL if not present in cache or return the cached version otherwise. * diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 70c03a1d..1f9a3a96 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -38,19 +38,21 @@ } - (instancetype)init { + SDImageCache *cache = [SDImageCache sharedImageCache]; + SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; + return [self initWithCache:cache downloader:downloader]; +} + +- (instancetype)initWithCache:(SDImageCache *)cache downloader:(SDWebImageDownloader *)downloader { if ((self = [super init])) { - _imageCache = [self createCache]; - _imageDownloader = [SDWebImageDownloader sharedDownloader]; + _imageCache = cache; + _imageDownloader = downloader; _failedURLs = [NSMutableSet new]; _runningOperations = [NSMutableArray new]; } return self; } -- (SDImageCache *)createCache { - return [SDImageCache sharedImageCache]; -} - - (NSString *)cacheKeyForURL:(NSURL *)url { if (self.cacheKeyFilter) { return self.cacheKeyFilter(url); From 22fded56cf832543f39283962d089d3f4d7d0f61 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 31 May 2016 14:51:33 +0300 Subject: [PATCH 044/207] Fixed #1573 - Update to cc510a6 - Cached file name with path extension UIWebView issue - for iOS 7 and above, remove the query from the url (prior to iOS 7 the behavior remains the same). --- SDWebImage/SDWebImageManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 1f9a3a96..bba2d124 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -58,7 +58,7 @@ return self.cacheKeyFilter(url); } else { - if (NSClassFromString(@"NSURLComponents")) { + if (NSClassFromString(@"NSURLComponents") && [NSURLComponents instancesRespondToSelector:@selector(string)]) { NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO]; urlComponents.query = nil; // Strip out query parameters. return urlComponents.string; From 81df4611a1fdcdadf8a696727ec999eec72bc4f5 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 06:54:38 +0300 Subject: [PATCH 045/207] Added FLAnimatedImage as submodule --- .gitmodules | 3 +++ Vendors/FLAnimatedImage | 1 + 2 files changed, 4 insertions(+) create mode 160000 Vendors/FLAnimatedImage diff --git a/.gitmodules b/.gitmodules index ce6396d4..c3be261d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "Vendors/libwebp"] path = Vendors/libwebp url = https://github.com/webmproject/libwebp +[submodule "Vendors/FLAnimatedImage"] + path = Vendors/FLAnimatedImage + url = git@github.com:Flipboard/FLAnimatedImage.git diff --git a/Vendors/FLAnimatedImage b/Vendors/FLAnimatedImage new file mode 160000 index 00000000..25307796 --- /dev/null +++ b/Vendors/FLAnimatedImage @@ -0,0 +1 @@ +Subproject commit 25307796cfcf66cb5b98774e050e93f64e0f2cde From b4659f764842063809819ce45091d2f31d3213f7 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 07:01:16 +0300 Subject: [PATCH 046/207] Added FLAnimatedImage to the project. Had to bump the deployment target to 6.0 since FLAnimatedImage only supports iOS 6 and later. --- SDWebImage.xcodeproj/project.pbxproj | 53 ++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 49f0d811..b2c77227 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -271,6 +271,18 @@ 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; + 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; + 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; + 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; + 43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; + 43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; + 43CE757B1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; + 43CE757C1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; + 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; + 43CE757E1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; + 43CE757F1CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; + 43CE75801CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; + 43CE75811CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; @@ -341,6 +353,10 @@ /* Begin PBXFileReference section */ 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; + 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; + 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; + 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CAE021AB4BB5400B6BC39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImage.h; sourceTree = ""; }; @@ -487,6 +503,26 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 43CE75451CFE9427006C64D0 /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + 43CE75481CFE9427006C64D0 /* FLAnimatedImage */, + ); + name = FLAnimatedImage; + path = Vendors/FLAnimatedImage; + sourceTree = ""; + }; + 43CE75481CFE9427006C64D0 /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */, + 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */, + 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */, + 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */, + ); + path = FLAnimatedImage; + sourceTree = ""; + }; 4A2CAE001AB4BB5300B6BC39 /* WebImage */ = { isa = PBXGroup; children = ( @@ -528,6 +564,7 @@ 53922D71148C55820056699D /* Frameworks */ = { isa = PBXGroup; children = ( + 43CE75451CFE9427006C64D0 /* FLAnimatedImage */, DA577C121998E60B007367ED /* libwebp */, 53FB893F14D35D1A0020B787 /* CoreGraphics.framework */, 53922D72148C55820056699D /* Foundation.framework */, @@ -778,8 +815,10 @@ 431738D41CDFC8A40008FEB9 /* alphai.h in Headers */, 431739581CDFC8B70008FEB9 /* format_constants.h in Headers */, 431739491CDFC8B20008FEB9 /* rescaler.h in Headers */, + 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, 431739161CDFC8AA0008FEB9 /* yuv.h in Headers */, 00733A6E1BC4880E00A5A117 /* UIImage+MultiFormat.h in Headers */, + 43CE757E1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431738DD1CDFC8A40008FEB9 /* vp8i.h in Headers */, 00733A6D1BC4880E00A5A117 /* UIImage+GIF.h in Headers */, 00733A651BC4880E00A5A117 /* SDWebImageDownloader.h in Headers */, @@ -796,6 +835,7 @@ files = ( 4317394F1CDFC8B70008FEB9 /* demux.h in Headers */, 431739211CDFC8B20008FEB9 /* endian_inl.h in Headers */, + 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431739541CDFC8B70008FEB9 /* types.h in Headers */, 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */, 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */, @@ -821,6 +861,7 @@ 431739291CDFC8B20008FEB9 /* quant_levels.h in Headers */, 4317391C1CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, 4317392B1CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, + 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, 4A2CAE2B1AB4BB7500B6BC39 /* UIButton+WebCache.h in Headers */, 4A2CAE251AB4BB7000B6BC39 /* SDWebImagePrefetcher.h in Headers */, 4A2CAE371AB4BB7500B6BC39 /* UIView+WebCacheOperation.h in Headers */, @@ -889,8 +930,10 @@ 431738791CDFC2580008FEB9 /* alphai.h in Headers */, 431738C01CDFC2660008FEB9 /* format_constants.h in Headers */, 431738B81CDFC2630008FEB9 /* rescaler.h in Headers */, + 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, 4317389F1CDFC25E0008FEB9 /* yuv.h in Headers */, 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */, + 43CE757C1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431738821CDFC2580008FEB9 /* vp8i.h in Headers */, AB615303192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */, A18A6CC7172DC28500419892 /* UIImage+GIF.h in Headers */, @@ -1074,6 +1117,7 @@ 4317393C1CDFC8B20008FEB9 /* filters.c in Sources */, 431738DA1CDFC8A40008FEB9 /* quant.c in Sources */, 00733A591BC4880000A5A117 /* SDWebImageDecoder.m in Sources */, + 43CE75811CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, 00733A5F1BC4880000A5A117 /* UIImage+WebP.m in Sources */, 431739041CDFC8AA0008FEB9 /* dec_neon.c in Sources */, 431739441CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, @@ -1083,6 +1127,7 @@ 431739141CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 00733A5D1BC4880000A5A117 /* UIImage+GIF.m in Sources */, 431738DC1CDFC8A40008FEB9 /* vp8.c in Sources */, + 43CE757B1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 00733A571BC4880000A5A117 /* SDImageCache.m in Sources */, 4317394A1CDFC8B20008FEB9 /* thread.c in Sources */, 431739051CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, @@ -1118,6 +1163,7 @@ 431738F41CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */, 431738EF1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, 431739301CDFC8B20008FEB9 /* thread.c in Sources */, + 43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 4A2CAE361AB4BB7500B6BC39 /* UIImageView+WebCache.m in Sources */, 431739221CDFC8B20008FEB9 /* filters.c in Sources */, 431738FB1CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */, @@ -1155,6 +1201,7 @@ 4A2CAE341AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.m in Sources */, 431738F81CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 4A2CAE201AB4BB6C00B6BC39 /* SDImageCache.m in Sources */, + 43CE75801CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, 431738C81CDFC8A30008FEB9 /* frame.c in Sources */, 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */, 431738E81CDFC8AA0008FEB9 /* dec_neon.c in Sources */, @@ -1186,6 +1233,7 @@ 431738991CDFC25E0008FEB9 /* lossless_sse2.c in Sources */, 431738941CDFC25E0008FEB9 /* enc_sse2.c in Sources */, 431738B91CDFC2630008FEB9 /* thread.c in Sources */, + 43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 5376130B155AD0D5005750A4 /* SDWebImageDownloader.m in Sources */, 431738AB1CDFC2630008FEB9 /* filters.c in Sources */, 431738A01CDFC25E0008FEB9 /* yuv_mips32.c in Sources */, @@ -1223,6 +1271,7 @@ 53EDFB8C17623F7C00698166 /* UIImage+MultiFormat.m in Sources */, 4317389D1CDFC25E0008FEB9 /* upsampling_sse2.c in Sources */, ABBE71A818C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, + 43CE757F1CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, 4317387C1CDFC2580008FEB9 /* frame.c in Sources */, 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */, 4317388D1CDFC25E0008FEB9 /* dec_neon.c in Sources */, @@ -1396,7 +1445,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; RUN_CLANG_STATIC_ANALYZER = YES; @@ -1451,7 +1500,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = "-ObjC"; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; From e775b444ef82f47a13ec456616f2cc078e6ac9c5 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:35:36 +0300 Subject: [PATCH 047/207] Extended the SDImageCache `queryDiskCacheForKey:done:` so it also returns the NSData (we will need it later for the GIF images). - had to add an NSData param to `SDWebImageQueryCompletedBlock`, so to make it simpler see this change for users, renamed the block type to `SDCacheQueryCompletedBlock` - pass the NSData when getting the image from disk cache --- SDWebImage/SDImageCache.h | 4 ++-- SDWebImage/SDImageCache.m | 9 +++++---- SDWebImage/SDWebImageManager.m | 35 +++++++++++++++------------------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 36293ea8..8aecfa1f 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -24,7 +24,7 @@ typedef NS_ENUM(NSInteger, SDImageCacheType) { SDImageCacheTypeMemory }; -typedef void(^SDWebImageQueryCompletedBlock)(UIImage *image, SDImageCacheType cacheType); +typedef void(^SDCacheQueryCompletedBlock)(UIImage *image, NSData *data, SDImageCacheType cacheType); typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); @@ -148,7 +148,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @param key The unique key used to store the wanted image */ -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; +- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDCacheQueryCompletedBlock)doneBlock; /** * Query the memory cache synchronously. diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 9e994d82..b8073cbc 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -385,20 +385,20 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return SDScaledImageForKey(key, image); } -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock { +- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDCacheQueryCompletedBlock)doneBlock { if (!doneBlock) { return nil; } if (!key) { - doneBlock(nil, SDImageCacheTypeNone); + doneBlock(nil, nil, SDImageCacheTypeNone); return nil; } // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; if (image) { - doneBlock(image, SDImageCacheTypeMemory); + doneBlock(image, nil, SDImageCacheTypeMemory); return nil; } @@ -409,6 +409,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } @autoreleasepool { + NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key]; UIImage *diskImage = [self diskImageForKey:key]; if (diskImage && self.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(diskImage); @@ -416,7 +417,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } dispatch_async(dispatch_get_main_queue(), ^{ - doneBlock(diskImage, SDImageCacheTypeDisk); + doneBlock(diskImage, diskData, SDImageCacheTypeDisk); }); } }); diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index bba2d124..8004fad9 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -154,7 +154,7 @@ } NSString *key = [self cacheKeyForURL:url]; - operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) { + operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { if (operation.isCancelled) { @synchronized (self.runningOperations) { [self.runningOperations removeObject:operation]; @@ -163,12 +163,12 @@ return; } - if ((!image || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { - if (image && options & SDWebImageRefreshCached) { + if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { + if (cachedImage && options & SDWebImageRefreshCached) { dispatch_main_sync_safe(^{ // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - completedBlock(image, nil, cacheType, YES, url); + completedBlock(cachedImage, nil, cacheType, YES, url); }); } @@ -181,20 +181,19 @@ if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; - if (image && options & SDWebImageRefreshCached) { + if (cachedImage && options & SDWebImageRefreshCached) { // force progressive off if image already cached but forced refreshing downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } - id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { + id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (!strongOperation || strongOperation.isCancelled) { // Do nothing if the operation was cancelled // See #699 for more details // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data - } - else if (error) { + } else if (error) { dispatch_main_sync_safe(^{ if (strongOperation && !strongOperation.isCancelled) { completedBlock(nil, error, SDImageCacheTypeNone, finished, url); @@ -222,16 +221,15 @@ BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); - if (options & SDWebImageRefreshCached && image && !downloadedImage) { + if (options & SDWebImageRefreshCached && cachedImage && !downloadedImage) { // Image refresh hit the NSURLCache cache, do not call the completion block - } - else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { + } else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : data) forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk]; } dispatch_main_sync_safe(^{ @@ -240,10 +238,9 @@ } }); }); - } - else { + } else { if (downloadedImage && finished) { - [self.imageCache storeImage:downloadedImage recalculateFromImage:NO imageData:data forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:downloadedImage recalculateFromImage:NO imageData:downloadedData forKey:key toDisk:cacheOnDisk]; } dispatch_main_sync_safe(^{ @@ -272,19 +269,17 @@ } } }; - } - else if (image) { + } else if (cachedImage) { dispatch_main_sync_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation && !strongOperation.isCancelled) { - completedBlock(image, nil, cacheType, YES, url); + completedBlock(cachedImage, nil, cacheType, YES, url); } }); @synchronized (self.runningOperations) { [self.runningOperations removeObject:operation]; } - } - else { + } else { // Image not in cache and download disallowed by delegate dispatch_main_sync_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; From aecb13d4210f5a91669fa5003e538f47dd8f05cb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:40:36 +0300 Subject: [PATCH 048/207] Extended the SDWebImageManager `loadImageWithURL:options:progress:completed:` so it also returns the NSData (we will need it later for the GIF images). - had to add an NSData param to `SDWebImageCompletionWithFinishedBlock `, so to make it simpler see this change for users, renamed the block type to `SDInternalCompletionBlock` - pass the NSData from the ImageCache or the Downloader - updated all classes using this method with the new signature --- SDWebImage/MKAnnotationView+WebCache.m | 2 +- SDWebImage/SDWebImageManager.h | 4 ++-- SDWebImage/SDWebImageManager.m | 20 ++++++++++---------- SDWebImage/SDWebImagePrefetcher.m | 2 +- SDWebImage/UIButton+WebCache.m | 4 ++-- SDWebImage/UIImageView+HighlightedWebCache.m | 2 +- SDWebImage/UIImageView+WebCache.m | 4 ++-- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index 7e982ede..171880fa 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -46,7 +46,7 @@ static char imageURLKey; if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong MKAnnotationView *sself = wself; diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 7edfc74c..95224d44 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -92,7 +92,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); -typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); +typedef void(^SDInternalCompletionBlock)(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); @@ -212,7 +212,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; - (id )loadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; + completed:(SDInternalCompletionBlock)completedBlock; /** * Saves image to cache for given URL diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 8004fad9..20bcb65c 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -116,9 +116,9 @@ } - (id )loadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDInternalCompletionBlock)completedBlock { // Invoking this method without a completedBlock is pointless NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); @@ -144,7 +144,7 @@ if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { dispatch_main_sync_safe(^{ NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; - completedBlock(nil, error, SDImageCacheTypeNone, YES, url); + completedBlock(nil, nil, error, SDImageCacheTypeNone, YES, url); }); return operation; } @@ -168,7 +168,7 @@ dispatch_main_sync_safe(^{ // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - completedBlock(cachedImage, nil, cacheType, YES, url); + completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); }); } @@ -196,7 +196,7 @@ } else if (error) { dispatch_main_sync_safe(^{ if (strongOperation && !strongOperation.isCancelled) { - completedBlock(nil, error, SDImageCacheTypeNone, finished, url); + completedBlock(nil, nil, error, SDImageCacheTypeNone, finished, url); } }); @@ -234,7 +234,7 @@ dispatch_main_sync_safe(^{ if (strongOperation && !strongOperation.isCancelled) { - completedBlock(transformedImage, nil, SDImageCacheTypeNone, finished, url); + completedBlock(transformedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); } }); }); @@ -245,7 +245,7 @@ dispatch_main_sync_safe(^{ if (strongOperation && !strongOperation.isCancelled) { - completedBlock(downloadedImage, nil, SDImageCacheTypeNone, finished, url); + completedBlock(downloadedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); } }); } @@ -273,7 +273,7 @@ dispatch_main_sync_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation && !strongOperation.isCancelled) { - completedBlock(cachedImage, nil, cacheType, YES, url); + completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); } }); @synchronized (self.runningOperations) { @@ -284,7 +284,7 @@ dispatch_main_sync_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation && !weakOperation.isCancelled) { - completedBlock(nil, nil, SDImageCacheTypeNone, YES, url); + completedBlock(nil, nil, nil, SDImageCacheTypeNone, YES, url); } }); @synchronized (self.runningOperations) { diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index 1dfddafd..b7876624 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -57,7 +57,7 @@ - (void)startPrefetchingAtIndex:(NSUInteger)index { if (index >= self.prefetchURLs.count) return; self.requestedCount++; - [self.manager loadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [self.manager loadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!finished) return; self.finishedCount++; diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index fd296506..10a1c066 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -69,7 +69,7 @@ static char imageURLStorageKey; self.imageURLStorage[@(state)] = url; __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIButton *sself = wself; @@ -117,7 +117,7 @@ static char imageURLStorageKey; if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIButton *sself = wself; diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index 9cc10252..716b37f2 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -34,7 +34,7 @@ if (url) { __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe (^ { diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index a86e4c06..616cc2da 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -59,7 +59,7 @@ static char TAG_ACTIVITY_SHOW; } __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { [wself removeActivityIndicator]; if (!wself) return; dispatch_main_sync_safe(^{ @@ -113,7 +113,7 @@ static char TAG_ACTIVITY_SHOW; NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; for (NSURL *logoImageURL in arrayOfURLs) { - id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ __strong UIImageView *sself = wself; From 8f4a9dae2de0e803b53c8419bc6a739b7e2b9bb3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:41:44 +0300 Subject: [PATCH 049/207] For consistency with the previous change, also renamed `SDWebImageCompletionBlock` to `SDExternalCompletionBlock` --- SDWebImage/MKAnnotationView+WebCache.h | 6 +++--- SDWebImage/MKAnnotationView+WebCache.m | 6 +++--- SDWebImage/SDWebImageManager.h | 2 +- SDWebImage/UIButton+WebCache.h | 12 ++++++------ SDWebImage/UIButton+WebCache.m | 12 ++++++------ SDWebImage/UIImageView+HighlightedWebCache.h | 6 +++--- SDWebImage/UIImageView+HighlightedWebCache.m | 6 +++--- SDWebImage/UIImageView+WebCache.h | 10 +++++----- SDWebImage/UIImageView+WebCache.m | 10 +++++----- 9 files changed, 35 insertions(+), 35 deletions(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index 175b13fb..b0df29c4 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -66,7 +66,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -81,7 +81,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -97,7 +97,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Cancel the current download diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index 171880fa..398183f4 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -30,15 +30,15 @@ static char imageURLKey; [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 95224d44..17581703 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -90,7 +90,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { SDWebImageAvoidAutoSetImage = 1 << 11 }; -typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); +typedef void(^SDExternalCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); typedef void(^SDInternalCompletionBlock)(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index fa908bb6..033e92e9 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -73,7 +73,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -89,7 +89,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -106,7 +106,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`. @@ -155,7 +155,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDExternalCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder. @@ -171,7 +171,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -187,7 +187,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Cancel the current image download diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 10a1c066..09a8ef19 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -40,15 +40,15 @@ static char imageURLStorageKey; [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { [self setImage:placeholder forState:state]; [self sd_cancelImageLoadForState:state]; @@ -102,15 +102,15 @@ static char imageURLStorageKey; [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDExternalCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { [self sd_cancelBackgroundImageLoadForState:state]; [self setBackgroundImage:placeholder forState:state]; diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index bc94f7b0..3bf0876f 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -46,7 +46,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -61,7 +61,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -77,7 +77,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; /** * Cancel the current download diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index 716b37f2..dd752b8d 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -21,15 +21,15 @@ [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { [self sd_cancelCurrentHighlightedImageLoad]; if (url) { diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index b057aa7f..f49d78c8 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -95,7 +95,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -110,7 +110,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -126,7 +126,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -143,7 +143,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url` and optionally a placeholder image. @@ -160,7 +160,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; /** * Download an array of images and starts them in an animation loop diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 616cc2da..f2a42ec6 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -29,19 +29,19 @@ static char TAG_ACTIVITY_SHOW; [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); @@ -95,7 +95,7 @@ static char TAG_ACTIVITY_SHOW; } } -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; From debc0d482763f4a48f896a16cec10fc2d90231c0 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:42:39 +0300 Subject: [PATCH 050/207] Exposed the activity indicator methods from UIImageView+WebView so we can use them in a future category --- SDWebImage/UIImageView+WebCache.h | 5 +++++ SDWebImage/UIImageView+WebCache.m | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index f49d78c8..44cd2d76 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -188,4 +188,9 @@ */ - (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; +- (BOOL)showActivityIndicatorView; +- (void)addActivityIndicator; +- (void)removeActivityIndicator; + + @end diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index f2a42ec6..f0823f17 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -155,11 +155,11 @@ static char TAG_ACTIVITY_SHOW; objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); } -- (void)setShowActivityIndicatorView:(BOOL)show{ +- (void)setShowActivityIndicatorView:(BOOL)show { objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); } -- (BOOL)showActivityIndicatorView{ +- (BOOL)showActivityIndicatorView { return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; } From 9ea1602157a6719dd2ea71172a48628eb9f7e5c3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:43:53 +0300 Subject: [PATCH 051/207] Changed the current internal GIF implementation. We will only return an UIImage with a single animated frame (basically a static image). We do set it in the images array so we can distinguish between those and real static images. Dropped all other GIF code. --- SDWebImage/UIImage+GIF.h | 10 ++- SDWebImage/UIImage+GIF.m | 141 ++++----------------------------------- 2 files changed, 20 insertions(+), 131 deletions(-) diff --git a/SDWebImage/UIImage+GIF.h b/SDWebImage/UIImage+GIF.h index 084f4241..97a9893f 100755 --- a/SDWebImage/UIImage+GIF.h +++ b/SDWebImage/UIImage+GIF.h @@ -10,10 +10,14 @@ @interface UIImage (GIF) -+ (UIImage *)sd_animatedGIFNamed:(NSString *)name; - +/** + * Compatibility method - creates an animated UIImage from an NSData, it will only contain the 1st frame image + */ + (UIImage *)sd_animatedGIFWithData:(NSData *)data; -- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size; +/** + * Checks if an UIImage instance is a GIF. Will use the `images` array + */ +- (BOOL)isGIF; @end diff --git a/SDWebImage/UIImage+GIF.m b/SDWebImage/UIImage+GIF.m index de45dd35..bf666113 100755 --- a/SDWebImage/UIImage+GIF.m +++ b/SDWebImage/UIImage+GIF.m @@ -8,6 +8,7 @@ #import "UIImage+GIF.h" #import +#import "objc/runtime.h" @implementation UIImage (GIF) @@ -20,142 +21,26 @@ size_t count = CGImageSourceGetCount(source); - UIImage *animatedImage; + UIImage *staticImage; if (count <= 1) { - animatedImage = [[UIImage alloc] initWithData:data]; - } - else { - NSMutableArray *images = [NSMutableArray array]; - - NSTimeInterval duration = 0.0f; - - for (size_t i = 0; i < count; i++) { - CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); - if (!image) { - continue; - } - - duration += [self sd_frameDurationAtIndex:i source:source]; - - [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; - - CGImageRelease(image); - } - - if (!duration) { - duration = (1.0f / 10.0f) * count; - } - - animatedImage = [UIImage animatedImageWithImages:images duration:duration]; + staticImage = [[UIImage alloc] initWithData:data]; + } else { + // we will only retrieve the 1st frame. the full GIF support is available via the FLAnimatedImageView category. + // this here is only code to allow drawing animated images as static ones + CGImageRef CGImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); + UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]; + staticImage = [UIImage animatedImageWithImages:@[frameImage] duration:0.0f]; + CGImageRelease(CGImage); } CFRelease(source); - return animatedImage; + return staticImage; } -+ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { - float frameDuration = 0.1f; - CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); - NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; - NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; - - NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; - if (delayTimeUnclampedProp) { - frameDuration = delayTimeUnclampedProp.floatValue; - } - else { - - NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; - if (delayTimeProp) { - frameDuration = delayTimeProp.floatValue; - } - } - - // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. - // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify - // a duration of <= 10 ms. See and - // for more information. - - if (frameDuration < 0.011f) { - frameDuration = 0.100f; - } - - CFRelease(cfFrameProperties); - return frameDuration; -} - -+ (UIImage *)sd_animatedGIFNamed:(NSString *)name { - CGFloat scale = [UIScreen mainScreen].scale; - - if (scale > 1.0f) { - NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"]; - - NSData *data = [NSData dataWithContentsOfFile:retinaPath]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; - - data = [NSData dataWithContentsOfFile:path]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - return [UIImage imageNamed:name]; - } - else { - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; - - NSData *data = [NSData dataWithContentsOfFile:path]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - return [UIImage imageNamed:name]; - } -} - -- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size { - if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) { - return self; - } - - CGSize scaledSize = size; - CGPoint thumbnailPoint = CGPointZero; - - CGFloat widthFactor = size.width / self.size.width; - CGFloat heightFactor = size.height / self.size.height; - CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor; - scaledSize.width = self.size.width * scaleFactor; - scaledSize.height = self.size.height * scaleFactor; - - if (widthFactor > heightFactor) { - thumbnailPoint.y = (size.height - scaledSize.height) * 0.5; - } - else if (widthFactor < heightFactor) { - thumbnailPoint.x = (size.width - scaledSize.width) * 0.5; - } - - NSMutableArray *scaledImages = [NSMutableArray array]; - - for (UIImage *image in self.images) { - UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); - - [image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)]; - UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); - - [scaledImages addObject:newImage]; - - UIGraphicsEndImageContext(); - } - - return [UIImage animatedImageWithImages:scaledImages duration:self.duration]; +- (BOOL)isGIF { + return (self.images != nil); } @end From ada86ab9396e678e66f71b395ca0c91ccd700790 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 09:45:13 +0300 Subject: [PATCH 052/207] Based on the previous change, we now can avoid the memory cache for GIFs, as the memory cache only holds UIImage instances and we need the NSData. Forced to load from disk if the image is a GIF --- SDWebImage/SDImageCache.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index b8073cbc..f04b5af5 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -10,6 +10,7 @@ #import "SDWebImageDecoder.h" #import "UIImage+MultiFormat.h" #import +#import "UIImage+GIF.h" // See https://github.com/rs/SDWebImage/pull/1141 for discussion @interface AutoPurgeCache : NSCache @@ -398,7 +399,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; if (image) { - doneBlock(image, nil, SDImageCacheTypeMemory); + NSData *diskData = nil; + if ([image isGIF]) { + diskData = [self diskImageDataBySearchingAllPathsForKey:key]; + } + doneBlock(image, diskData, SDImageCacheTypeMemory); return nil; } From 32f4e4d234e84ecf06cff18454f70093401fa650 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:02:20 +0300 Subject: [PATCH 053/207] Updated the doc with the new completion type (SDWebImageManager loadImageWithURL) --- SDWebImage/SDWebImageManager.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 17581703..1f61598d 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -197,16 +197,18 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * This parameter is required. * - * This block has no return value and takes the requested UIImage as first parameter. - * In case of error the image parameter is nil and the second parameter may contain an NSError. + * This block has no return value and takes the requested UIImage as first parameter and the NSData representation as second parameter. + * In case of error the image parameter is nil and the third parameter may contain an NSError. * - * The third parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache + * The forth parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache * or from the memory cache or from the network. * - * The last parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is + * The fith parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is * downloading. This block is thus called repeatedly with a partial image. When image is fully downloaded, the * block is called a last time with the full image and the last parameter set to YES. * + * The last parameter is the original image URL + * * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation */ - (id )loadImageWithURL:(NSURL *)url From 881da8fbe06760203c569631c5ff6aa848bb0c5f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:02:41 +0300 Subject: [PATCH 054/207] Corrected comment (was changed unintentionally). --- SDWebImage/MKAnnotationView+WebCache.h | 2 +- SDWebImage/UIImageView+WebCache.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index b0df29c4..8f87f2e3 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -18,7 +18,7 @@ * Get the current image URL. * * Note that because of the limitations of categories this property can get out of sync - * if you use sd_setImage: directly. + * if you use setImage: directly. */ - (NSURL *)sd_imageURL; diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 44cd2d76..a6c73561 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -48,7 +48,7 @@ * Get the current image URL. * * Note that because of the limitations of categories this property can get out of sync - * if you use sd_setImage: directly. + * if you use setImage: directly. */ - (NSURL *)sd_imageURL; From c1451f28af5fffbf383fe610a4c7b1a83fd9d70a Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:05:16 +0300 Subject: [PATCH 055/207] Built a FLAnimatedImageView category that hooks this class to the SDWebImage system. It's very similar to UIImageView (WebCache). There are explicit methods for loading an animated image. --- .../FLAnimatedImageView+WebCache.h | 128 ++++++++++++++++++ .../FLAnimatedImageView+WebCache.m | 115 ++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h create mode 100644 SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h new file mode 100644 index 00000000..dfccad62 --- /dev/null +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -0,0 +1,128 @@ +/* + * 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. + */ + + +#if COCOAPODS + @import FLAnimatedImage; +#else + #import "FLAnimatedImageView.h" +#endif + +#import "SDWebImageManager.h" + + +/** + * A category for the FLAnimatedImage imageView class that hooks it to the SDWebImage system. + * Very similar to the base class category (UIImageView (WebCache)) + */ +@interface FLAnimatedImageView (WebCache) + +/** + * Get the current image URL. + * + * Note that because of the limitations of categories this property can get out of sync + * if you use setImage: directly. + */ +- (NSURL *)sd_imageURL; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * + * @param url The url for the image. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * Uses a placeholder until the request finishes. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * Uses a placeholder until the request finishes. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * Uses a placeholder until the request finishes. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * Uses a placeholder until the request finishes. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; + +/** + * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images + * The download is asynchronous and cached. + * Uses a placeholder until the request finishes. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; + +/** + * Cancel the image load + */ +- (void)sd_cancelCurrentAnimatedImageLoad; + +@end diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m new file mode 100644 index 00000000..3b90f053 --- /dev/null +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -0,0 +1,115 @@ +/* + * 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 "FLAnimatedImageView+WebCache.h" +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" +#import "NSData+ImageContentType.h" +#import "FLAnimatedImage.h" +#import "UIImageView+WebCache.h" + +static char imageURLKey; + + +@implementation FLAnimatedImageView (WebCache) + +- (NSURL *)sd_imageURL { + return objc_getAssociatedObject(self, &imageURLKey); +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url { + [self sd_setAnimatedImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { + [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setAnimatedImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { + [self sd_cancelCurrentAnimatedImageLoad]; + objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + if (!(options & SDWebImageDelayPlaceholder)) { + dispatch_main_async_safe(^{ + self.image = placeholder; + }); + } + + if (url) { + // check if activityView is enabled or not + if ([self showActivityIndicatorView]) { + [self addActivityIndicator]; + } + + __weak __typeof(self)wself = self; + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe(^{ + [wself removeActivityIndicator]; + + if (!wself) return; + if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { + completedBlock(image, error, cacheType, url); + return; + } else if (image) { + NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; + if ([imageContentType isEqualToString:@"image/gif"]) { + wself.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data]; + wself.image = nil; + } else { + wself.image = image; + wself.animatedImage = nil; + } + [wself setNeedsLayout]; + } else { + if ((options & SDWebImageDelayPlaceholder)) { + wself.image = placeholder; + [wself setNeedsLayout]; + } + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:@"UIImageViewAnimatedImageLoad"]; + } else { + dispatch_main_async_safe(^{ + [self removeActivityIndicator]; + + if (completedBlock) { + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_cancelCurrentAnimatedImageLoad { + [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimatedImageLoad"]; +} + + +@end From f6cd50bb653e5964ca7badd10669bc27bb44f369 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:05:40 +0300 Subject: [PATCH 056/207] Converted our example xibs to the new Xcode format --- .../en.lproj/DetailViewController.xib | 192 +++--------------- .../en.lproj/MasterViewController.xib | 164 +++------------ 2 files changed, 53 insertions(+), 303 deletions(-) diff --git a/Examples/SDWebImage Demo/en.lproj/DetailViewController.xib b/Examples/SDWebImage Demo/en.lproj/DetailViewController.xib index ccce9b18..c3e3aad5 100644 --- a/Examples/SDWebImage Demo/en.lproj/DetailViewController.xib +++ b/Examples/SDWebImage Demo/en.lproj/DetailViewController.xib @@ -1,164 +1,28 @@ - - - - 1296 - 11D50b - 2182 - 1138.32 - 568.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUIView - IBUIImageView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 274 - {320, 460} - - - _NS:9 - 1 - NO - IBCocoaTouchFramework - - - {{0, 20}, {320, 460}} - - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - imageView - - - - 8 - - - - - - 0 - - - - - - 1 - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - - - - - DetailViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 8 - - - - - DetailViewController - UIViewController - - imageView - UIImageView - - - imageView - - imageView - UIImageView - - - - IBProjectSource - ./Classes/DetailViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage Demo/en.lproj/MasterViewController.xib b/Examples/SDWebImage Demo/en.lproj/MasterViewController.xib index 729e0153..13abc1c6 100644 --- a/Examples/SDWebImage Demo/en.lproj/MasterViewController.xib +++ b/Examples/SDWebImage Demo/en.lproj/MasterViewController.xib @@ -1,139 +1,25 @@ - - - - 1280 - 11C25 - 1919 - 1138.11 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 916 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 20}, {320, 460}} - - - - 3 - MQA - - YES - - IBCocoaTouchFramework - YES - 1 - 0 - YES - 44 - 22 - 22 - - - - - - - view - - - - 3 - - - - dataSource - - - - 4 - - - - delegate - - - - 5 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - MasterViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 5 - - - - - MasterViewController - UITableViewController - - IBProjectSource - ./Classes/MasterViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 916 - - + + + + + + + + + + + + + + + + + + + + + + + + + From 4df3934954cf34945f41d2f8fe8c779bafdc86db Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:06:19 +0300 Subject: [PATCH 057/207] Added the FLAnimatedImageView category to the project and made the FLAnimatedImage headers public --- SDWebImage.xcodeproj/project.pbxproj | 36 +++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index b2c77227..2198a5f0 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -271,18 +271,24 @@ 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; - 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; - 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; - 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; }; + 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; 43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; 43CE757B1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */; }; - 43CE757C1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; - 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; - 43CE757E1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; }; + 43CE757C1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE757E1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE757F1CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; 43CE75801CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; 43CE75811CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */; }; + 43CE75D01CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE75D11CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE75D21CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43CE75D31CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; + 43CE75D41CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; + 43CE75D51CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; @@ -357,6 +363,8 @@ 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; + 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; + 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CAE021AB4BB5400B6BC39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImage.h; sourceTree = ""; }; @@ -523,6 +531,15 @@ path = FLAnimatedImage; sourceTree = ""; }; + 43CE75CD1CFE98B3006C64D0 /* FLAnimatedImage */ = { + isa = PBXGroup; + children = ( + 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */, + 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */, + ); + path = FLAnimatedImage; + sourceTree = ""; + }; 4A2CAE001AB4BB5300B6BC39 /* WebImage */ = { isa = PBXGroup; children = ( @@ -583,6 +600,7 @@ 53922DAA148C56470056699D /* Cache */, 53922DAC148C56DD0056699D /* Utils */, 53922DA9148C562D0056699D /* Categories */, + 43CE75CD1CFE98B3006C64D0 /* FLAnimatedImage */, ); path = SDWebImage; sourceTree = ""; @@ -795,6 +813,7 @@ 00733A6C1BC4880E00A5A117 /* UIButton+WebCache.h in Headers */, 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */, 4317395B1CDFC8B70008FEB9 /* types.h in Headers */, + 43CE75D21CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, 431739551CDFC8B70008FEB9 /* decode.h in Headers */, 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */, 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */, @@ -849,6 +868,7 @@ 4317392F1CDFC8B20008FEB9 /* rescaler.h in Headers */, 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */, 4317391B1CDFC8B20008FEB9 /* bit_reader.h in Headers */, + 43CE75D11CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, 4A2CAE331AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.h in Headers */, 431739521CDFC8B70008FEB9 /* mux.h in Headers */, 431738F11CDFC8AA0008FEB9 /* lossless.h in Headers */, @@ -910,6 +930,7 @@ 53761318155AD0D5005750A4 /* SDWebImageCompat.h in Headers */, 431738841CDFC2580008FEB9 /* vp8li.h in Headers */, 431738C31CDFC2660008FEB9 /* types.h in Headers */, + 43CE75D01CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, 431738BD1CDFC2660008FEB9 /* decode.h in Headers */, 53761319155AD0D5005750A4 /* SDWebImageDecoder.h in Headers */, 5376131A155AD0D5005750A4 /* SDWebImageDownloader.h in Headers */, @@ -1081,6 +1102,7 @@ 431739391CDFC8B20008FEB9 /* color_cache.c in Sources */, 00733A5A1BC4880000A5A117 /* SDWebImagePrefetcher.m in Sources */, 431739031CDFC8AA0008FEB9 /* dec_mips32.c in Sources */, + 43CE75D51CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, 4317390B1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, 00733A5B1BC4880000A5A117 /* NSData+ImageContentType.m in Sources */, 431739131CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, @@ -1154,6 +1176,7 @@ 4A2CAE2E1AB4BB7500B6BC39 /* UIImage+GIF.m in Sources */, 4A2CAE321AB4BB7500B6BC39 /* UIImage+WebP.m in Sources */, 431738EC1CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, + 43CE75D41CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, 4317392E1CDFC8B20008FEB9 /* rescaler.c in Sources */, 431738E91CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, 431738F71CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, @@ -1224,6 +1247,7 @@ 53761309155AD0D5005750A4 /* SDImageCache.m in Sources */, 5376130A155AD0D5005750A4 /* SDWebImageDecoder.m in Sources */, 431738911CDFC25E0008FEB9 /* enc_avx2.c in Sources */, + 43CE75D31CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, 431738B71CDFC2630008FEB9 /* rescaler.c in Sources */, 4317388E1CDFC25E0008FEB9 /* dec_sse2.c in Sources */, 4317389C1CDFC25E0008FEB9 /* upsampling_neon.c in Sources */, From 8a488d377b9a92edfa655ba3ac3d1c32f8c247a6 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:06:37 +0300 Subject: [PATCH 058/207] Updated the example project so it supports the animated images as well. --- .../SDWebImage Demo/DetailViewController.h | 2 - .../SDWebImage Demo/DetailViewController.m | 33 ++++++----- .../SDWebImage Demo/MasterViewController.m | 57 +++++++++++++++---- 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/Examples/SDWebImage Demo/DetailViewController.h b/Examples/SDWebImage Demo/DetailViewController.h index f4c6b76f..1272c090 100644 --- a/Examples/SDWebImage Demo/DetailViewController.h +++ b/Examples/SDWebImage Demo/DetailViewController.h @@ -12,6 +12,4 @@ @property (strong, nonatomic) NSURL *imageURL; -@property (strong, nonatomic) IBOutlet UIImageView *imageView; - @end diff --git a/Examples/SDWebImage Demo/DetailViewController.m b/Examples/SDWebImage Demo/DetailViewController.m index d7acf6a8..ef483bde 100644 --- a/Examples/SDWebImage Demo/DetailViewController.m +++ b/Examples/SDWebImage Demo/DetailViewController.m @@ -8,9 +8,14 @@ #import "DetailViewController.h" #import +#import @interface DetailViewController () + +@property (strong, nonatomic) IBOutlet FLAnimatedImageView *imageView; + - (void)configureView; + @end @implementation DetailViewController @@ -34,20 +39,20 @@ if (self.imageURL) { __block UIActivityIndicatorView *activityIndicator; __weak UIImageView *weakImageView = self.imageView; - [self.imageView sd_setImageWithURL:self.imageURL - placeholderImage:nil - options:SDWebImageProgressiveDownload - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - if (!activityIndicator) { - [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; - activityIndicator.center = weakImageView.center; - [activityIndicator startAnimating]; - } - } - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - [activityIndicator removeFromSuperview]; - activityIndicator = nil; - }]; + [self.imageView sd_setAnimatedImageWithURL:self.imageURL + placeholderImage:nil + options:SDWebImageProgressiveDownload + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + if (!activityIndicator) { + [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; + activityIndicator.center = weakImageView.center; + [activityIndicator startAnimating]; + } + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + [activityIndicator removeFromSuperview]; + activityIndicator = nil; + }]; } } diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 57711c44..1addc8e0 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -9,6 +9,36 @@ #import "MasterViewController.h" #import #import "DetailViewController.h" +#import +#import + + +@interface MyCustomTableViewCell : UITableViewCell + +@property (nonatomic, strong) UILabel *customTextLabel; +@property (nonatomic, strong) FLAnimatedImageView *customImageView; + +@end + + +@implementation MyCustomTableViewCell + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + _customImageView = [[FLAnimatedImageView alloc] initWithFrame:CGRectMake(20.0, 2.0, 60.0, 40.0)]; + [self.contentView addSubview:_customImageView]; + _customTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 12.0, 200, 20.0)]; + [self.contentView addSubview:_customTextLabel]; + + _customImageView.clipsToBounds = YES; + _customImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return self; +} + +@end + + @interface MasterViewController () { NSMutableArray *_objects; @@ -38,6 +68,7 @@ _objects = [NSMutableArray arrayWithObjects: @"http://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?0.35786508303135633", // requires HTTP auth, used to demo the NTLM auth @"http://assets.sbnation.com/assets/2512203/dogflops.gif", + @"https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test9.webp", nil]; @@ -79,19 +110,23 @@ { static NSString *CellIdentifier = @"Cell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) - { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; + static UIImage *placeholderImage = nil; + if (!placeholderImage) { + placeholderImage = [UIImage imageNamed:@"placeholder"]; + } + + MyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } - [cell.imageView setShowActivityIndicatorView:YES]; - [cell.imageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; - - cell.textLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; - cell.imageView.contentMode = UIViewContentModeScaleAspectFill; - [cell.imageView sd_setImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] - placeholderImage:[UIImage imageNamed:@"placeholder"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; + [cell.customImageView setShowActivityIndicatorView:YES]; + [cell.customImageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; + + cell.customTextLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; + [cell.customImageView sd_setAnimatedImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] + placeholderImage:placeholderImage + options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; return cell; } From d75bc2765d3dec1b54f4640bb89ed17cab1e6a9d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:10:46 +0300 Subject: [PATCH 059/207] Updated the podspec so the GIF+FLAnimatedImage is a separate subspec --- SDWebImage.podspec | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index 646126f6..0aab1a63 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -35,6 +35,16 @@ Pod::Spec.new do |s| mk.dependency 'SDWebImage/Core' end + s.subspec 'GIF' do |gif| + gif.ios.deployment_target = '6.0' + gif.source_files = 'SDWebImage/FLAnimatedImage/*.{h,m}' + gif.dependency 'SDWebImage/Core' + gif.dependency 'FLAnimatedImage', '~> 1.0' + gif.xcconfig = { + 'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/FLAnimatedImage/FLAnimatedImage' + } + end + s.subspec 'WebP' do |webp| webp.source_files = 'SDWebImage/UIImage+WebP.{h,m}' webp.xcconfig = { From 44cb993ee9af59aad1b282c5fa414aac511cd265 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:11:46 +0300 Subject: [PATCH 060/207] Successfull attempt to override the UIImageView(WebCache) methods in the FLAnimatedImageView(WebCache) category. This should make the integration easier. Not sure if it will always work --- .../SDWebImage Demo/DetailViewController.m | 28 +++++++-------- .../SDWebImage Demo/MasterViewController.m | 6 ++-- .../FLAnimatedImageView+WebCache.h | 16 ++++----- .../FLAnimatedImageView+WebCache.m | 34 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Examples/SDWebImage Demo/DetailViewController.m b/Examples/SDWebImage Demo/DetailViewController.m index ef483bde..da57ed71 100644 --- a/Examples/SDWebImage Demo/DetailViewController.m +++ b/Examples/SDWebImage Demo/DetailViewController.m @@ -39,20 +39,20 @@ if (self.imageURL) { __block UIActivityIndicatorView *activityIndicator; __weak UIImageView *weakImageView = self.imageView; - [self.imageView sd_setAnimatedImageWithURL:self.imageURL - placeholderImage:nil - options:SDWebImageProgressiveDownload - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - if (!activityIndicator) { - [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; - activityIndicator.center = weakImageView.center; - [activityIndicator startAnimating]; - } - } - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - [activityIndicator removeFromSuperview]; - activityIndicator = nil; - }]; + [self.imageView sd_setImageWithURL:self.imageURL + placeholderImage:nil + options:SDWebImageProgressiveDownload + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + if (!activityIndicator) { + [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; + activityIndicator.center = weakImageView.center; + [activityIndicator startAnimating]; + } + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + [activityIndicator removeFromSuperview]; + activityIndicator = nil; + }]; } } diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 1addc8e0..4e580ccc 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -124,9 +124,9 @@ [cell.customImageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; cell.customTextLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; - [cell.customImageView sd_setAnimatedImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] - placeholderImage:placeholderImage - options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; + [cell.customImageView sd_setImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] + placeholderImage:placeholderImage + options:indexPath.row == 0 ? SDWebImageRefreshCached : 0]; return cell; } diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index dfccad62..b0b31f08 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -36,7 +36,7 @@ * * @param url The url for the image. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url; +- (void)sd_setImageWithURL:(NSURL *)url; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -46,7 +46,7 @@ * @param url The url for the image. * @param placeholder The image to be set initially, until the image request finishes. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -57,7 +57,7 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -70,7 +70,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -85,7 +85,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -101,7 +101,7 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock; /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images @@ -118,11 +118,11 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock; /** * Cancel the image load */ -- (void)sd_cancelCurrentAnimatedImageLoad; +- (void)sd_cancelCurrentImageLoad; @end diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index 3b90f053..9c436e5f 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -23,32 +23,32 @@ static char imageURLKey; return objc_getAssociatedObject(self, &imageURLKey); } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url { - [self sd_setAnimatedImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +- (void)sd_setImageWithURL:(NSURL *)url { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { - [self sd_setAnimatedImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { - [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { - [self sd_setAnimatedImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDExternalCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; } -- (void)sd_setAnimatedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { - [self sd_cancelCurrentAnimatedImageLoad]; +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDExternalCompletionBlock)completedBlock { + [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (!(options & SDWebImageDelayPlaceholder)) { @@ -94,7 +94,7 @@ static char imageURLKey; } }); }]; - [self sd_setImageLoadOperation:operation forKey:@"UIImageViewAnimatedImageLoad"]; + [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; } else { dispatch_main_async_safe(^{ [self removeActivityIndicator]; @@ -107,8 +107,8 @@ static char imageURLKey; } } -- (void)sd_cancelCurrentAnimatedImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimatedImageLoad"]; +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; } From d1f76940044edf53267d3e84fafd5bb4d5b38463 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:17:59 +0300 Subject: [PATCH 061/207] Trying to fix the build, seems like Travis cannot work with ssh urls --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index c3be261d..d8c3ae83 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/webmproject/libwebp [submodule "Vendors/FLAnimatedImage"] path = Vendors/FLAnimatedImage - url = git@github.com:Flipboard/FLAnimatedImage.git + url = https://github.com/Flipboard/FLAnimatedImage From b059b04fd21f666ad4137d6a1de0eac1c94a6fc9 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 10:32:40 +0300 Subject: [PATCH 062/207] Updated the tests --- Tests/Tests/SDImageCacheTests.m | 2 +- Tests/Tests/SDWebImageManagerTests.m | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Tests/Tests/SDImageCacheTests.m b/Tests/Tests/SDImageCacheTests.m index 231ea839..4480aafb 100644 --- a/Tests/Tests/SDImageCacheTests.m +++ b/Tests/Tests/SDImageCacheTests.m @@ -100,7 +100,7 @@ NSString *kImageTestKey = @"TestImageKey.jpg"; //- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; UIImage *imageForTesting = [self imageForTesting]; [self.sharedImageCache storeImage:imageForTesting forKey:kImageTestKey]; - NSOperation *operation = [self.sharedImageCache queryDiskCacheForKey:kImageTestKey done:^(UIImage *image, SDImageCacheType cacheType) { + NSOperation *operation = [self.sharedImageCache queryDiskCacheForKey:kImageTestKey done:^(UIImage *image, NSData *data, SDImageCacheType cacheType) { expect(image).to.equal(imageForTesting); }]; expect(operation).toNot.beNil; diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index cf26720b..dc34d3a9 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -40,7 +40,10 @@ static int64_t kAsyncTestTimeout = 5; NSURL *originalImageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]; - [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL + options:SDWebImageRefreshCached + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { expect(image).toNot.beNil(); expect(error).to.beNil(); expect(originalImageURL).to.equal(imageURL); @@ -57,7 +60,10 @@ static int64_t kAsyncTestTimeout = 5; NSURL *originalImageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.png"]; - [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL + options:SDWebImageRefreshCached + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { expect(image).to.beNil(); expect(error).toNot.beNil(); expect(originalImageURL).to.equal(imageURL); From 7761afca9279e6cbbd0f82b98b2db0b8d2d78af3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 11:58:39 +0300 Subject: [PATCH 063/207] Trying to fix the random build failures (probably timeout due to this image url) --- Tests/Tests/SDWebImageDownloaderTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index 233711fa..7fa5c5c8 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -35,7 +35,7 @@ - (void)testThatDownloadingSameURLTwiceAndCancellingFirstWorks { XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; - NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]; id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 From 94c1ec3ed078824071b222a87e7e42dc23b71960 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 1 Jun 2016 15:53:08 +0300 Subject: [PATCH 064/207] Revisited all copyright comments and decided for just one format --- Examples/SDWebImage Demo/AppDelegate.h | 14 +++++++------- Examples/SDWebImage Demo/AppDelegate.m | 14 +++++++------- Examples/SDWebImage Demo/DetailViewController.h | 14 +++++++------- Examples/SDWebImage Demo/DetailViewController.m | 14 +++++++------- Examples/SDWebImage Demo/MasterViewController.h | 14 +++++++------- Examples/SDWebImage Demo/MasterViewController.m | 14 +++++++------- Examples/SDWebImage Demo/main.m | 14 +++++++------- SDWebImage/MKAnnotationView+WebCache.h | 14 +++++++------- SDWebImage/MKAnnotationView+WebCache.m | 14 +++++++------- SDWebImage/NSData+ImageContentType.h | 12 ++++++++---- SDWebImage/NSData+ImageContentType.m | 12 ++++++++---- SDWebImage/SDWebImageCompat.m | 14 +++++++------- SDWebImage/SDWebImageDecoder.h | 3 +-- SDWebImage/SDWebImageDecoder.m | 3 +-- SDWebImage/UIImage+GIF.h | 15 ++++++++------- SDWebImage/UIImage+GIF.m | 15 ++++++++------- SDWebImage/UIImage+MultiFormat.h | 14 +++++++------- SDWebImage/UIImage+MultiFormat.m | 14 +++++++------- SDWebImage/UIImage+WebP.h | 14 +++++++------- SDWebImage/UIImage+WebP.m | 14 +++++++------- Tests/Tests/SDImageCacheTests.m | 14 +++++++------- Tests/Tests/SDWebImageDownloaderTests.m | 15 ++++++++------- Tests/Tests/SDWebImageManagerTests.m | 14 +++++++------- Tests/Tests/UIImageMultiFormatTests.m | 14 +++++++------- WebImage/SDWebImage.h | 15 ++++++++------- 25 files changed, 169 insertions(+), 159 deletions(-) diff --git a/Examples/SDWebImage Demo/AppDelegate.h b/Examples/SDWebImage Demo/AppDelegate.h index 7e60e229..15f2cc6e 100644 --- a/Examples/SDWebImage Demo/AppDelegate.h +++ b/Examples/SDWebImage Demo/AppDelegate.h @@ -1,10 +1,10 @@ -// -// AppDelegate.h -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage Demo/AppDelegate.m b/Examples/SDWebImage Demo/AppDelegate.m index 4ddd8e64..a7c47598 100644 --- a/Examples/SDWebImage Demo/AppDelegate.m +++ b/Examples/SDWebImage Demo/AppDelegate.m @@ -1,10 +1,10 @@ -// -// AppDelegate.m -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "AppDelegate.h" diff --git a/Examples/SDWebImage Demo/DetailViewController.h b/Examples/SDWebImage Demo/DetailViewController.h index f4c6b76f..77d3897e 100644 --- a/Examples/SDWebImage Demo/DetailViewController.h +++ b/Examples/SDWebImage Demo/DetailViewController.h @@ -1,10 +1,10 @@ -// -// DetailViewController.h -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage Demo/DetailViewController.m b/Examples/SDWebImage Demo/DetailViewController.m index d7acf6a8..899f12de 100644 --- a/Examples/SDWebImage Demo/DetailViewController.m +++ b/Examples/SDWebImage Demo/DetailViewController.m @@ -1,10 +1,10 @@ -// -// DetailViewController.m -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "DetailViewController.h" #import diff --git a/Examples/SDWebImage Demo/MasterViewController.h b/Examples/SDWebImage Demo/MasterViewController.h index 3f3a1392..96983d10 100644 --- a/Examples/SDWebImage Demo/MasterViewController.h +++ b/Examples/SDWebImage Demo/MasterViewController.h @@ -1,10 +1,10 @@ -// -// MasterViewController.h -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 57711c44..42942932 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -1,10 +1,10 @@ -// -// MasterViewController.m -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "MasterViewController.h" #import diff --git a/Examples/SDWebImage Demo/main.m b/Examples/SDWebImage Demo/main.m index 463372ca..1d5fab2c 100644 --- a/Examples/SDWebImage Demo/main.m +++ b/Examples/SDWebImage Demo/main.m @@ -1,10 +1,10 @@ -// -// main.m -// SDWebImage Demo -// -// Created by Olivier Poitrey on 09/05/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index 175b13fb..fc2d48a1 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -1,10 +1,10 @@ -// -// MKAnnotationView+WebCache.h -// SDWebImage -// -// Created by Olivier Poitrey on 14/03/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "MapKit/MapKit.h" #import "SDWebImageManager.h" diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index 7e982ede..f2eff861 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -1,10 +1,10 @@ -// -// MKAnnotationView+WebCache.m -// SDWebImage -// -// Created by Olivier Poitrey on 14/03/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "MKAnnotationView+WebCache.h" #import "objc/runtime.h" diff --git a/SDWebImage/NSData+ImageContentType.h b/SDWebImage/NSData+ImageContentType.h index f6d452f0..3a1a9f39 100644 --- a/SDWebImage/NSData+ImageContentType.h +++ b/SDWebImage/NSData+ImageContentType.h @@ -1,7 +1,11 @@ -// -// Created by Fabrice Aneche on 06/01/14. -// Copyright (c) 2014 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Fabrice Aneche + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import diff --git a/SDWebImage/NSData+ImageContentType.m b/SDWebImage/NSData+ImageContentType.m index beb73b59..0d3c1e8f 100644 --- a/SDWebImage/NSData+ImageContentType.m +++ b/SDWebImage/NSData+ImageContentType.m @@ -1,7 +1,11 @@ -// -// Created by Fabrice Aneche on 06/01/14. -// Copyright (c) 2014 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Fabrice Aneche + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "NSData+ImageContentType.h" diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 3de79f4e..958bed65 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -1,10 +1,10 @@ -// -// SDWebImageCompat.m -// SDWebImage -// -// Created by Olivier Poitrey on 11/12/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * 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 "SDWebImageCompat.h" diff --git a/SDWebImage/SDWebImageDecoder.h b/SDWebImage/SDWebImageDecoder.h index 0176a7ba..2bfe7b4d 100644 --- a/SDWebImage/SDWebImageDecoder.h +++ b/SDWebImage/SDWebImageDecoder.h @@ -1,8 +1,7 @@ /* * This file is part of the SDWebImage package. * (c) Olivier Poitrey - * - * Created by james on 9/28/11. + * (c) james * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 2bb5472f..e5d7b910 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -1,8 +1,7 @@ /* * This file is part of the SDWebImage package. * (c) Olivier Poitrey - * - * Created by james on 9/28/11. + * (c) james * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/SDWebImage/UIImage+GIF.h b/SDWebImage/UIImage+GIF.h index 084f4241..216d90e1 100755 --- a/SDWebImage/UIImage+GIF.h +++ b/SDWebImage/UIImage+GIF.h @@ -1,10 +1,11 @@ -// -// UIImage+GIF.h -// LBGIFImage -// -// Created by Laurin Brandner on 06.01.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Laurin Brandner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import diff --git a/SDWebImage/UIImage+GIF.m b/SDWebImage/UIImage+GIF.m index de45dd35..3f236d77 100755 --- a/SDWebImage/UIImage+GIF.m +++ b/SDWebImage/UIImage+GIF.m @@ -1,10 +1,11 @@ -// -// UIImage+GIF.m -// LBGIFImage -// -// Created by Laurin Brandner on 06.01.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Laurin Brandner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "UIImage+GIF.h" #import diff --git a/SDWebImage/UIImage+MultiFormat.h b/SDWebImage/UIImage+MultiFormat.h index 186ebc0a..e05c111b 100644 --- a/SDWebImage/UIImage+MultiFormat.h +++ b/SDWebImage/UIImage+MultiFormat.h @@ -1,10 +1,10 @@ -// -// UIImage+MultiFormat.h -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/SDWebImage/UIImage+MultiFormat.m b/SDWebImage/UIImage+MultiFormat.m index a8307544..178e9048 100644 --- a/SDWebImage/UIImage+MultiFormat.m +++ b/SDWebImage/UIImage+MultiFormat.m @@ -1,10 +1,10 @@ -// -// UIImage+MultiFormat.m -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * 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+MultiFormat.h" #import "UIImage+GIF.h" diff --git a/SDWebImage/UIImage+WebP.h b/SDWebImage/UIImage+WebP.h index 48cdf030..dbfb0a90 100644 --- a/SDWebImage/UIImage+WebP.h +++ b/SDWebImage/UIImage+WebP.h @@ -1,10 +1,10 @@ -// -// UIImage+WebP.h -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * 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. + */ #ifdef SD_WEBP diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index a7e341f6..9acc03cc 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -1,10 +1,10 @@ -// -// UIImage+WebP.m -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * 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. + */ #ifdef SD_WEBP #import "UIImage+WebP.h" diff --git a/Tests/Tests/SDImageCacheTests.m b/Tests/Tests/SDImageCacheTests.m index 231ea839..5a546498 100644 --- a/Tests/Tests/SDImageCacheTests.m +++ b/Tests/Tests/SDImageCacheTests.m @@ -1,10 +1,10 @@ -// -// SDImageCacheTests.m -// SDWebImage Tests -// -// Created by Bogdan Poplauschi on 20/06/14. -// -// +/* + * 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. + */ #define EXP_SHORTHAND // required by Expecta diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index 233711fa..04273565 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -1,10 +1,11 @@ -// -// SDWebImageDownloaderTests.m -// SDWebImage Tests -// -// Created by Matt Galloway on 01/09/2014. -// -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Matt Galloway + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #define EXP_SHORTHAND // required by Expecta diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index cf26720b..65176c11 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -1,10 +1,10 @@ -// -// SDWebImageManagerTests.m -// SDWebImage Tests -// -// Created by Bogdan Poplauschi on 20/06/14. -// -// +/* + * 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. + */ #define EXP_SHORTHAND // required by Expecta diff --git a/Tests/Tests/UIImageMultiFormatTests.m b/Tests/Tests/UIImageMultiFormatTests.m index 00b39549..310cfc7d 100644 --- a/Tests/Tests/UIImageMultiFormatTests.m +++ b/Tests/Tests/UIImageMultiFormatTests.m @@ -1,10 +1,10 @@ -// -// UIImageMultiFormatTests.m -// SDWebImage Tests -// -// Created by Bogdan Poplauschi on 18/07/14. -// -// +/* + * 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. + */ #define EXP_SHORTHAND // required by Expecta diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h index b95b911d..4ecf5bd2 100644 --- a/WebImage/SDWebImage.h +++ b/WebImage/SDWebImage.h @@ -1,10 +1,11 @@ -// -// WebImage.h -// WebImage -// -// Created by Florent Vilmart on 2015-03-14. -// Copyright (c) 2015 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Florent Vilmart + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import From c4dd0eee49ca0282f413be1fcca1c57f5376d0b4 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 2 Jun 2016 17:43:59 +0300 Subject: [PATCH 065/207] Opening bracket styling --- SDWebImage/SDImageCache.m | 6 ++---- SDWebImage/UIImage+WebP.m | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 9e994d82..cb68af28 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -17,8 +17,7 @@ @implementation AutoPurgeCache -- (id)init -{ +- (instancetype)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; @@ -26,8 +25,7 @@ return self; } -- (void)dealloc -{ +- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; } diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index 9acc03cc..366b3af7 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -16,8 +16,7 @@ #endif // Callback for CGDataProviderRelease -static void FreeImageData(void *info, const void *data, size_t size) -{ +static void FreeImageData(void *info, const void *data, size_t size) { free((void *)data); } From 67f943b0faec54ccbe0ef446ea45f5ac0fbf17a1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 2 Jun 2016 18:47:35 +0300 Subject: [PATCH 066/207] Implemented Lightweight Generics - both for Swift interoperability and for easier to read code --- SDWebImage/SDImageCache.m | 26 +++++++++++----------- SDWebImage/SDWebImageCompat.m | 2 +- SDWebImage/SDWebImageDownloader.h | 5 ++++- SDWebImage/SDWebImageDownloader.m | 4 ++-- SDWebImage/SDWebImageDownloaderOperation.m | 12 +++++----- SDWebImage/SDWebImageManager.m | 12 +++++----- SDWebImage/SDWebImagePrefetcher.h | 6 +++-- SDWebImage/SDWebImagePrefetcher.m | 6 ++--- SDWebImage/UIButton+WebCache.m | 6 +++-- SDWebImage/UIImageView+WebCache.h | 2 +- SDWebImage/UIImageView+WebCache.m | 8 +++---- SDWebImage/UIView+WebCacheOperation.m | 12 +++++----- 12 files changed, 56 insertions(+), 45 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index cb68af28..1eea4acb 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -58,7 +58,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { @property (strong, nonatomic) NSCache *memCache; @property (strong, nonatomic) NSString *diskCachePath; -@property (strong, nonatomic) NSMutableArray *customPaths; +@property (strong, nonatomic) NSMutableArray *customPaths; @property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue; @end @@ -190,7 +190,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // Init the disk cache -(NSString *)makeDiskCachePath:(NSString*)fullNamespace{ - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); return [paths[0] stringByAppendingPathComponent:fullNamespace]; } @@ -345,7 +345,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return data; } - NSArray *customPaths = [self.customPaths copy]; + NSArray *customPaths = [self.customPaths copy]; for (NSString *path in customPaths) { NSString *filePath = [self cachePathForKey:key inPath:path]; NSData *imageData = [NSData dataWithContentsOfFile:filePath]; @@ -508,7 +508,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { dispatch_async(self.ioQueue, ^{ NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; - NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; + NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; // This enumerator prefetches useful properties for our cache files. NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL @@ -517,16 +517,16 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { errorHandler:NULL]; NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.maxCacheAge]; - NSMutableDictionary *cacheFiles = [NSMutableDictionary dictionary]; + NSMutableDictionary *> *cacheFiles = [NSMutableDictionary dictionary]; NSUInteger currentCacheSize = 0; // Enumerate all of the files in the cache directory. This loop has two purposes: // // 1. Removing files that are older than the expiration date. // 2. Storing file attributes for the size-based cleanup pass. - NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; + NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; for (NSURL *fileURL in fileEnumerator) { - NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL]; + NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL]; // Skip directories. if ([resourceValues[NSURLIsDirectoryKey] boolValue]) { @@ -557,15 +557,15 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { const NSUInteger desiredCacheSize = self.maxCacheSize / 2; // Sort the remaining cache files by their last modification time (oldest first). - NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent - usingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; - }]; + NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent + usingComparator:^NSComparisonResult(id obj1, id obj2) { + return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; + }]; // Delete files until we fall below our desired cache size. for (NSURL *fileURL in sortedFiles) { if ([_fileManager removeItemAtURL:fileURL error:nil]) { - NSDictionary *resourceValues = cacheFiles[fileURL]; + NSDictionary *resourceValues = cacheFiles[fileURL]; NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; currentCacheSize -= totalAllocatedSize.unsignedIntegerValue; @@ -609,7 +609,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; for (NSString *fileName in fileEnumerator) { NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; - NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; + NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; size += [attrs fileSize]; } }); diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 958bed65..047d9509 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -18,7 +18,7 @@ inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) { } if ((image.images).count > 0) { - NSMutableArray *scaledImages = [NSMutableArray array]; + NSMutableArray *scaledImages = [NSMutableArray array]; for (UIImage *tempImage in image.images) { [scaledImages addObject:SDScaledImageForKey(key, tempImage)]; diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index a38d1e70..79d6bf09 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -70,7 +70,10 @@ typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteg typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); -typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDictionary *headers); +typedef NSDictionary SDHTTPHeadersDictionary; +typedef NSMutableDictionary SDHTTPHeadersMutableDictionary; + +typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, SDHTTPHeadersDictionary *headers); /** * A token associated with each download. Can be used to cancel a download diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 70b2d51d..ca0feaf1 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -19,8 +19,8 @@ @property (strong, nonatomic) NSOperationQueue *downloadQueue; @property (weak, nonatomic) NSOperation *lastAddedOperation; @property (assign, nonatomic) Class operationClass; -@property (strong, nonatomic) NSMutableDictionary *URLOperations; -@property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; +@property (strong, nonatomic) NSMutableDictionary *URLOperations; +@property (strong, nonatomic) SDHTTPHeadersMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue @property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index eb40c72d..35200f10 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -20,9 +20,11 @@ NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinis static NSString *const kProgressCallbackKey = @"progress"; static NSString *const kCompletedCallbackKey = @"completed"; +typedef NSMutableDictionary SDCallbacksDictionary; + @interface SDWebImageDownloaderOperation () -@property (strong, nonatomic) NSMutableArray *callbackBlocks; +@property (strong, nonatomic) NSMutableArray *callbackBlocks; @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; @@ -82,7 +84,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; - (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { - NSMutableDictionary *callbacks = [NSMutableDictionary new]; + SDCallbacksDictionary *callbacks = [NSMutableDictionary new]; if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; dispatch_barrier_async(self.barrierQueue, ^{ @@ -91,8 +93,8 @@ static NSString *const kCompletedCallbackKey = @"completed"; return callbacks; } -- (NSArray *)callbacksForKey:(NSString *)key { - __block NSMutableArray *callbacks = nil; +- (NSArray *)callbacksForKey:(NSString *)key { + __block NSMutableArray *callbacks = nil; dispatch_sync(self.barrierQueue, ^{ // We need to remove [NSNull null] because there might not always be a progress block for each callback callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; @@ -410,7 +412,7 @@ didReceiveResponse:(NSURLResponse *)response #pragma mark NSURLSessionTaskDelegate - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { - NSArray *completionBlocks = [[self callbacksForKey:kCompletedCallbackKey] copy]; + NSArray *completionBlocks = [[self callbacksForKey:kCompletedCallbackKey] copy]; @synchronized(self) { self.thread = nil; self.dataTask = nil; diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 7d9ac37a..b98be34f 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -21,8 +21,8 @@ @property (strong, nonatomic, readwrite) SDImageCache *imageCache; @property (strong, nonatomic, readwrite) SDWebImageDownloader *imageDownloader; -@property (strong, nonatomic) NSMutableSet *failedURLs; -@property (strong, nonatomic) NSMutableArray *runningOperations; +@property (strong, nonatomic) NSMutableSet *failedURLs; +@property (strong, nonatomic) NSMutableArray *runningOperations; @end @@ -119,9 +119,9 @@ } - (id )loadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { // Invoking this method without a completedBlock is pointless NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); @@ -313,7 +313,7 @@ - (void)cancelAll { @synchronized (self.runningOperations) { - NSArray *copiedOperations = [self.runningOperations copy]; + NSArray *copiedOperations = [self.runningOperations copy]; [copiedOperations makeObjectsPerformSelector:@selector(cancel)]; [self.runningOperations removeObjectsInArray:copiedOperations]; } diff --git a/SDWebImage/SDWebImagePrefetcher.h b/SDWebImage/SDWebImagePrefetcher.h index 52e74c0f..01046da6 100644 --- a/SDWebImage/SDWebImagePrefetcher.h +++ b/SDWebImage/SDWebImagePrefetcher.h @@ -82,7 +82,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, * * @param urls list of URLs to prefetch */ -- (void)prefetchURLs:(NSArray *)urls; +- (void)prefetchURLs:(NSArray *)urls; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, @@ -97,7 +97,9 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, * first param is the number of completed (successful or not) requests, * second parameter is the number of skipped requests */ -- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock; +- (void)prefetchURLs:(NSArray *)urls + progress:(SDWebImagePrefetcherProgressBlock)progressBlock + completed:(SDWebImagePrefetcherCompletionBlock)completionBlock; /** * Remove and cancel queued list diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index 1dfddafd..b2809989 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -11,7 +11,7 @@ @interface SDWebImagePrefetcher () @property (strong, nonatomic) SDWebImageManager *manager; -@property (strong, nonatomic) NSArray *prefetchURLs; +@property (strong, nonatomic) NSArray *prefetchURLs; @property (assign, nonatomic) NSUInteger requestedCount; @property (assign, nonatomic) NSUInteger skippedCount; @property (assign, nonatomic) NSUInteger finishedCount; @@ -105,11 +105,11 @@ } } -- (void)prefetchURLs:(NSArray *)urls { +- (void)prefetchURLs:(NSArray *)urls { [self prefetchURLs:urls progress:nil completed:nil]; } -- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock { +- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock { [self cancelPrefetching]; // Prevent duplicate prefetch request self.startedTime = CFAbsoluteTimeGetCurrent(); self.prefetchURLs = urls; diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index fd296506..781405fa 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -12,6 +12,8 @@ static char imageURLStorageKey; +typedef NSMutableDictionary SDStateImageURLDictionary; + @implementation UIButton (WebCache) - (NSURL *)sd_currentImageURL { @@ -162,8 +164,8 @@ static char imageURLStorageKey; [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; } -- (NSMutableDictionary *)imageURLStorage { - NSMutableDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); +- (SDStateImageURLDictionary *)imageURLStorage { + SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); if (!storage) { storage = [NSMutableDictionary dictionary]; diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index b057aa7f..11311a3c 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -167,7 +167,7 @@ * * @param arrayOfURLs An array of NSURL */ -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs; +- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs; /** * Cancel the current download diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index a86e4c06..190deb71 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -106,11 +106,11 @@ static char TAG_ACTIVITY_SHOW; return objc_getAssociatedObject(self, &imageURLKey); } -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { +- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; __weak __typeof(self)wself = self; - NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; + NSMutableArray> *operationsArray = [[NSMutableArray alloc] init]; for (NSURL *logoImageURL in arrayOfURLs) { id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { @@ -119,7 +119,7 @@ static char TAG_ACTIVITY_SHOW; __strong UIImageView *sself = wself; [sself stopAnimating]; if (sself && image) { - NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; + NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; if (!currentImages) { currentImages = [[NSMutableArray alloc] init]; } @@ -134,7 +134,7 @@ static char TAG_ACTIVITY_SHOW; [operationsArray addObject:operation]; } - [self sd_setImageLoadOperation:[NSArray arrayWithArray:operationsArray] forKey:@"UIImageViewAnimationImages"]; + [self sd_setImageLoadOperation:[operationsArray copy] forKey:@"UIImageViewAnimationImages"]; } - (void)sd_cancelCurrentImageLoad { diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index 1f391cda..033da216 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -11,10 +11,12 @@ static char loadOperationKey; +typedef NSMutableDictionary SDOperationsDictionary; + @implementation UIView (WebCacheOperation) -- (NSMutableDictionary *)operationDictionary { - NSMutableDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); +- (SDOperationsDictionary *)operationDictionary { + SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); if (operations) { return operations; } @@ -25,13 +27,13 @@ static char loadOperationKey; - (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key { [self sd_cancelImageLoadOperationWithKey:key]; - NSMutableDictionary *operationDictionary = [self operationDictionary]; + SDOperationsDictionary *operationDictionary = [self operationDictionary]; operationDictionary[key] = operation; } - (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { // Cancel in progress downloader from queue - NSMutableDictionary *operationDictionary = [self operationDictionary]; + SDOperationsDictionary *operationDictionary = [self operationDictionary]; id operations = operationDictionary[key]; if (operations) { if ([operations isKindOfClass:[NSArray class]]) { @@ -48,7 +50,7 @@ static char loadOperationKey; } - (void)sd_removeImageLoadOperationWithKey:(NSString *)key { - NSMutableDictionary *operationDictionary = [self operationDictionary]; + SDOperationsDictionary *operationDictionary = [self operationDictionary]; [operationDictionary removeObjectForKey:key]; } From 2064f28d2f0442357ea401e8fcd017b074a6e087 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 3 Jun 2016 17:25:21 +0300 Subject: [PATCH 067/207] Implemented Nullability according to https://developer.apple.com/swift/blog/?id=25. Decided to make explicit nullable and nonnull and not use NS_ASSUME_NONNULL_BEGIN so everything is clearer when read. Done so in the implementation files as well --- SDWebImage/MKAnnotationView+WebCache.h | 23 ++++--- SDWebImage/MKAnnotationView+WebCache.m | 17 ++--- SDWebImage/NSData+ImageContentType.h | 2 +- SDWebImage/NSData+ImageContentType.m | 6 +- SDWebImage/SDImageCache.h | 50 +++++++-------- SDWebImage/SDImageCache.m | 66 ++++++++++---------- SDWebImage/SDWebImageCompat.m | 2 +- SDWebImage/SDWebImageDecoder.h | 2 +- SDWebImage/SDWebImageDecoder.m | 2 +- SDWebImage/SDWebImageDownloader.h | 38 +++++------ SDWebImage/SDWebImageDownloader.m | 40 ++++++------ SDWebImage/SDWebImageDownloaderOperation.h | 28 ++++----- SDWebImage/SDWebImageDownloaderOperation.m | 32 +++++----- SDWebImage/SDWebImageManager.h | 46 +++++++------- SDWebImage/SDWebImageManager.m | 44 ++++++------- SDWebImage/SDWebImagePrefetcher.h | 22 +++---- SDWebImage/SDWebImagePrefetcher.m | 20 +++--- SDWebImage/UIButton+WebCache.h | 58 ++++++++++++----- SDWebImage/UIButton+WebCache.m | 36 ++++++----- SDWebImage/UIImage+MultiFormat.h | 2 +- SDWebImage/UIImage+MultiFormat.m | 4 +- SDWebImage/UIImage+WebP.h | 2 +- SDWebImage/UIImage+WebP.m | 2 +- SDWebImage/UIImageView+HighlightedWebCache.h | 17 +++-- SDWebImage/UIImageView+HighlightedWebCache.m | 13 ++-- SDWebImage/UIImageView+WebCache.h | 37 ++++++++--- SDWebImage/UIImageView+WebCache.m | 28 ++++++--- SDWebImage/UIView+WebCacheOperation.h | 6 +- SDWebImage/UIView+WebCacheOperation.m | 20 +++--- 29 files changed, 380 insertions(+), 285 deletions(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index fc2d48a1..fb03b0a9 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -20,7 +20,7 @@ * Note that because of the limitations of categories this property can get out of sync * if you use sd_setImage: directly. */ -- (NSURL *)sd_imageURL; +- (nullable NSURL *)sd_imageURL; /** * Set the imageView `image` with an `url`. @@ -29,7 +29,7 @@ * * @param url The url for the image. */ -- (void)sd_setImageWithURL:(NSURL *)url; +- (void)sd_setImageWithURL:(nullable NSURL *)url; /** * Set the imageView `image` with an `url` and a placeholder. @@ -40,7 +40,8 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -52,7 +53,9 @@ * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the imageView `image` with an `url`. @@ -66,7 +69,8 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -81,7 +85,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -97,7 +103,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Cancel the current download diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index f2eff861..14ee55b8 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -14,31 +14,34 @@ static char imageURLKey; @implementation MKAnnotationView (WebCache) -- (NSURL *)sd_imageURL { +- (nullable NSURL *)sd_imageURL { return objc_getAssociatedObject(self, &imageURLKey); } -- (void)sd_setImageWithURL:(NSURL *)url { +- (void)sd_setImageWithURL:(nullable NSURL *)url { [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); diff --git a/SDWebImage/NSData+ImageContentType.h b/SDWebImage/NSData+ImageContentType.h index 3a1a9f39..6bdf0b28 100644 --- a/SDWebImage/NSData+ImageContentType.h +++ b/SDWebImage/NSData+ImageContentType.h @@ -18,6 +18,6 @@ * * @return the content type as string (i.e. image/jpeg, image/gif) */ -+ (NSString *)sd_contentTypeForImageData:(NSData *)data; ++ (nullable NSString *)sd_contentTypeForImageData:(nullable NSData *)data; @end diff --git a/SDWebImage/NSData+ImageContentType.m b/SDWebImage/NSData+ImageContentType.m index 0d3c1e8f..fbbb0157 100644 --- a/SDWebImage/NSData+ImageContentType.m +++ b/SDWebImage/NSData+ImageContentType.m @@ -12,7 +12,11 @@ @implementation NSData (ImageContentType) -+ (NSString *)sd_contentTypeForImageData:(NSData *)data { ++ (nullable NSString *)sd_contentTypeForImageData:(nullable NSData *)data { + if (!data) { + return nil; + } + uint8_t c; [data getBytes:&c length:1]; switch (c) { diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 36293ea8..02441614 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -24,7 +24,7 @@ typedef NS_ENUM(NSInteger, SDImageCacheType) { SDImageCacheTypeMemory }; -typedef void(^SDWebImageQueryCompletedBlock)(UIImage *image, SDImageCacheType cacheType); +typedef void(^SDWebImageQueryCompletedBlock)(UIImage * _Nullable image, SDImageCacheType cacheType); typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); @@ -77,14 +77,14 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return SDImageCache global instance */ -+ (SDImageCache *)sharedImageCache; ++ (nonnull SDImageCache *)sharedImageCache; /** * Init a new cache store with a specific namespace * * @param ns The namespace to use for this cache store */ -- (instancetype)initWithNamespace:(NSString *)ns; +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns; /** * Init a new cache store with a specific namespace and directory @@ -92,10 +92,10 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param ns The namespace to use for this cache store * @param directory Directory to cache disk images in */ -- (instancetype)initWithNamespace:(NSString *)ns - diskCacheDirectory:(NSString *)directory NS_DESIGNATED_INITIALIZER; +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns + diskCacheDirectory:(nonnull NSString *)directory NS_DESIGNATED_INITIALIZER; --(NSString *)makeDiskCachePath:(NSString*)fullNamespace; +- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace; /** * Add a read-only cache path to search for images pre-cached by SDImageCache @@ -103,7 +103,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @param path The path to use for this read-only cache path */ -- (void)addReadOnlyCachePath:(NSString *)path; +- (void)addReadOnlyCachePath:(nonnull NSString *)path; /** * Store an image into memory and disk cache at the given key. @@ -111,7 +111,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param image The image to store * @param key The unique image cache key, usually it's image absolute URL */ -- (void)storeImage:(UIImage *)image forKey:(NSString *)key; +- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key; /** * Store an image into memory and optionally disk cache at the given key. @@ -120,7 +120,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param key The unique image cache key, usually it's image absolute URL * @param toDisk Store the image to disk cache if YES */ -- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key toDisk:(BOOL)toDisk; /** * Store an image into memory and optionally disk cache at the given key. @@ -133,7 +133,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param key The unique image cache key, usually it's image absolute URL * @param toDisk Store the image to disk cache if YES */ -- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImage:(nullable UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk; /** * Store image NSData into disk cache at the given key. @@ -141,35 +141,35 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param imageData The image data to store * @param key The unique image cache key, usually it's image absolute URL */ -- (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key; +- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; /** * Query the disk cache asynchronously. * * @param key The unique key used to store the wanted image */ -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; +- (nullable NSOperation *)queryDiskCacheForKey:(nullable NSString *)key done:(nullable SDWebImageQueryCompletedBlock)doneBlock; /** * Query the memory cache synchronously. * * @param key The unique key used to store the wanted image */ -- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key; +- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key; /** * Query the disk cache synchronously after checking the memory cache. * * @param key The unique key used to store the wanted image */ -- (UIImage *)imageFromDiskCacheForKey:(NSString *)key; +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key; /** * Remove the image from memory and disk cache asynchronously * * @param key The unique image cache key */ -- (void)removeImageForKey:(NSString *)key; +- (void)removeImageForKey:(nullable NSString *)key; /** @@ -178,7 +178,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param key The unique image cache key * @param completion An block that should be executed after the image has been removed (optional) */ -- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion; +- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion; /** * Remove the image from memory and optionally disk cache asynchronously @@ -186,7 +186,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param key The unique image cache key * @param fromDisk Also remove cache entry from disk if YES */ -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk; +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk; /** * Remove the image from memory and optionally disk cache asynchronously @@ -195,7 +195,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param fromDisk Also remove cache entry from disk if YES * @param completion An block that should be executed after the image has been removed (optional) */ -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion; +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion; /** * Clear all memory cached images @@ -206,7 +206,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * Clear all disk cached images. Non-blocking method - returns immediately. * @param completion An block that should be executed after cache expiration completes (optional) */ -- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion; +- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion; /** * Clear all disk cached images @@ -218,7 +218,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * Remove all expired cached image from disk. Non-blocking method - returns immediately. * @param completionBlock An block that should be executed after cache expiration completes (optional) */ -- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock; +- (void)cleanDiskWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; /** * Remove all expired cached image from disk @@ -239,7 +239,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Asynchronously calculate the disk cache's size. */ -- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock; +- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock; /** * Async check if image exists in disk cache already (does not load the image) @@ -248,7 +248,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param completionBlock the block to be executed when the check is done. * @note the completion block will be always executed on the main queue */ -- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** * Check if image exists in disk cache already (does not load the image) @@ -257,7 +257,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return YES if an image exists for the given key */ -- (BOOL)diskImageExistsWithKey:(NSString *)key; +- (BOOL)diskImageExistsWithKey:(nullable NSString *)key; /** * Get the cache path for a certain key (needs the cache path root folder) @@ -267,7 +267,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return the cache path */ -- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path; +- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path; /** * Get the default cache path for a certain key @@ -276,6 +276,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return the default cache path */ -- (NSString *)defaultCachePathForKey:(NSString *)key; +- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key; @end diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 1eea4acb..8087ee0c 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -17,7 +17,7 @@ @implementation AutoPurgeCache -- (instancetype)init { +- (nonnull instancetype)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; @@ -56,10 +56,10 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { @interface SDImageCache () -@property (strong, nonatomic) NSCache *memCache; -@property (strong, nonatomic) NSString *diskCachePath; -@property (strong, nonatomic) NSMutableArray *customPaths; -@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue; +@property (strong, nonatomic, nonnull) NSCache *memCache; +@property (strong, nonatomic, nonnull) NSString *diskCachePath; +@property (strong, nonatomic, nullable) NSMutableArray *customPaths; +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t ioQueue; @end @@ -68,7 +68,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSFileManager *_fileManager; } -+ (SDImageCache *)sharedImageCache { ++ (nonnull SDImageCache *)sharedImageCache { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -81,12 +81,13 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return [self initWithNamespace:@"default"]; } -- (instancetype)initWithNamespace:(NSString *)ns { +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns { NSString *path = [self makeDiskCachePath:ns]; return [self initWithNamespace:ns diskCacheDirectory:path]; } -- (instancetype)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns + diskCacheDirectory:(nonnull NSString *)directory { if ((self = [super init])) { NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; @@ -151,7 +152,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { SDDispatchQueueRelease(_ioQueue); } -- (void)addReadOnlyCachePath:(NSString *)path { +- (void)addReadOnlyCachePath:(nonnull NSString *)path { if (!self.customPaths) { self.customPaths = [NSMutableArray new]; } @@ -161,18 +162,18 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } -- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path { +- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path { NSString *filename = [self cachedFileNameForKey:key]; return [path stringByAppendingPathComponent:filename]; } -- (NSString *)defaultCachePathForKey:(NSString *)key { +- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key { return [self cachePathForKey:key inPath:self.diskCachePath]; } #pragma mark SDImageCache (private) -- (NSString *)cachedFileNameForKey:(NSString *)key { +- (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key { const char *str = key.UTF8String; if (str == NULL) { str = ""; @@ -189,12 +190,12 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #pragma mark ImageCache // Init the disk cache --(NSString *)makeDiskCachePath:(NSString*)fullNamespace{ +- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); return [paths[0] stringByAppendingPathComponent:fullNamespace]; } -- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk { +- (void)storeImage:(nullable UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk { if (!image || !key) { return; } @@ -244,15 +245,15 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } -- (void)storeImage:(UIImage *)image forKey:(NSString *)key { +- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key { [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:YES]; } -- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk { +- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key toDisk:(BOOL)toDisk { [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:toDisk]; } -- (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key { +- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { if (!imageData) { return; @@ -275,7 +276,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } -- (BOOL)diskImageExistsWithKey:(NSString *)key { +- (BOOL)diskImageExistsWithKey:(nullable NSString *)key { BOOL exists = NO; // this is an exception to access the filemanager on another queue than ioQueue, but we are using the shared instance @@ -291,7 +292,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return exists; } -- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { dispatch_async(_ioQueue, ^{ BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; @@ -309,11 +310,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } -- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key { +- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; } -- (UIImage *)imageFromDiskCacheForKey:(NSString *)key { +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; @@ -331,7 +332,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return diskImage; } -- (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { +- (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString *)key { NSString *defaultPath = [self defaultCachePathForKey:key]; NSData *data = [NSData dataWithContentsOfFile:defaultPath]; if (data) { @@ -364,7 +365,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return nil; } -- (UIImage *)diskImageForKey:(NSString *)key { +- (nullable UIImage *)diskImageForKey:(nullable NSString *)key { NSData *data = [self diskImageDataBySearchingAllPathsForKey:key]; if (data) { UIImage *image = [UIImage sd_imageWithData:data]; @@ -379,11 +380,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } -- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { +- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); } -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock { +- (nullable NSOperation *)queryDiskCacheForKey:(nullable NSString *)key done:(nullable SDWebImageQueryCompletedBlock)doneBlock { if (!doneBlock) { return nil; } @@ -422,19 +423,19 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return operation; } -- (void)removeImageForKey:(NSString *)key { +- (void)removeImageForKey:(nullable NSString *)key { [self removeImageForKey:key withCompletion:nil]; } -- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion { +- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion { [self removeImageForKey:key fromDisk:YES withCompletion:completion]; } -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk { +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk { [self removeImageForKey:key fromDisk:fromDisk withCompletion:nil]; } -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion { +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion { if (key == nil) { return; @@ -484,8 +485,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { [self clearDiskOnCompletion:nil]; } -- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion -{ +- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion { dispatch_async(self.ioQueue, ^{ [_fileManager removeItemAtPath:self.diskCachePath error:nil]; [_fileManager createDirectoryAtPath:self.diskCachePath @@ -505,7 +505,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { [self cleanDiskWithCompletionBlock:nil]; } -- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { +- (void)cleanDiskWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { dispatch_async(self.ioQueue, ^{ NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; @@ -625,7 +625,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return count; } -- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock { +- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock { NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; dispatch_async(self.ioQueue, ^{ diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 047d9509..77a8c504 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -12,7 +12,7 @@ #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag #endif -inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) { +inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullable image) { if (!image) { return nil; } diff --git a/SDWebImage/SDWebImageDecoder.h b/SDWebImage/SDWebImageDecoder.h index 2bfe7b4d..22597207 100644 --- a/SDWebImage/SDWebImageDecoder.h +++ b/SDWebImage/SDWebImageDecoder.h @@ -12,6 +12,6 @@ @interface UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image; ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image; @end diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index e5d7b910..904fed21 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -11,7 +11,7 @@ @implementation UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image { ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { // while downloading huge amount of images // autorelease the bitmap context // and all vars to help system to free memory diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index 79d6bf09..a4d7d4b7 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -63,25 +63,25 @@ typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { SDWebImageDownloaderLIFOExecutionOrder }; -extern NSString *const SDWebImageDownloadStartNotification; -extern NSString *const SDWebImageDownloadStopNotification; +extern NSString * _Nonnull const SDWebImageDownloadStartNotification; +extern NSString * _Nonnull const SDWebImageDownloadStopNotification; typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize); -typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); +typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished); typedef NSDictionary SDHTTPHeadersDictionary; typedef NSMutableDictionary SDHTTPHeadersMutableDictionary; -typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, SDHTTPHeadersDictionary *headers); +typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterBlock)(NSURL * _Nullable url, SDHTTPHeadersDictionary * _Nullable headers); /** * A token associated with each download. Can be used to cancel a download */ @interface SDWebImageDownloadToken : NSObject -@property (nonatomic, strong) NSURL *url; -@property (nonatomic, strong) id downloadOperationCancelToken; +@property (nonatomic, strong, nullable) NSURL *url; +@property (nonatomic, strong, nullable) id downloadOperationCancelToken; @end @@ -121,22 +121,22 @@ typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL * * @return global shared instance of downloader class */ -+ (SDWebImageDownloader *)sharedDownloader; ++ (nonnull SDWebImageDownloader *)sharedDownloader; /** * Set the default URL credential to be set for request operations. */ -@property (strong, nonatomic) NSURLCredential *urlCredential; +@property (strong, nonatomic, nullable) NSURLCredential *urlCredential; /** * Set username */ -@property (strong, nonatomic) NSString *username; +@property (strong, nonatomic, nullable) NSString *username; /** * Set password */ -@property (strong, nonatomic) NSString *password; +@property (strong, nonatomic, nullable) NSString *password; /** * Set filter to pick headers for downloading image HTTP request. @@ -144,7 +144,7 @@ typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL * This block will be invoked for each downloading image request, returned * NSDictionary will be used as headers in corresponding HTTP request. */ -@property (nonatomic, copy) SDWebImageDownloaderHeadersFilterBlock headersFilter; +@property (nonatomic, copy, nullable) SDWebImageDownloaderHeadersFilterBlock headersFilter; /** * Set a value for a HTTP header to be appended to each download HTTP request. @@ -152,14 +152,14 @@ typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL * @param value The value for the header field. Use `nil` value to remove the header. * @param field The name of the header field to set. */ -- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field; +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field; /** * Returns the value of the specified HTTP header field. * * @return The value associated with the header field field, or `nil` if there is no corresponding header field. */ -- (NSString *)valueForHTTPHeaderField:(NSString *)field; +- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field; /** * Sets a subclass of `SDWebImageDownloaderOperation` as the default @@ -169,7 +169,7 @@ typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. */ -- (void)setOperationClass:(Class)operationClass; +- (void)setOperationClass:(nullable Class)operationClass; /** * Creates a SDWebImageDownloader async downloader instance with a given URL @@ -192,17 +192,17 @@ typedef SDHTTPHeadersDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL * * @return A token (SDWebImageDownloadToken) that can be passed to -cancel: to cancel this operation */ -- (SDWebImageDownloadToken *)downloadImageWithURL:(NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock; +- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; /** * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: * * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. */ -- (void)cancel:(SDWebImageDownloadToken *)token; +- (void)cancel:(nullable SDWebImageDownloadToken *)token; /** * Sets the download queue suspension state diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index ca0feaf1..97f4677e 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -16,13 +16,13 @@ @interface SDWebImageDownloader () -@property (strong, nonatomic) NSOperationQueue *downloadQueue; -@property (weak, nonatomic) NSOperation *lastAddedOperation; -@property (assign, nonatomic) Class operationClass; -@property (strong, nonatomic) NSMutableDictionary *URLOperations; -@property (strong, nonatomic) SDHTTPHeadersMutableDictionary *HTTPHeaders; +@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; +@property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; +@property (assign, nonatomic, nullable) Class operationClass; +@property (strong, nonatomic, nonnull) NSMutableDictionary *URLOperations; +@property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue -@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; // The session in which data tasks will run @property (strong, nonatomic) NSURLSession *session; @@ -54,7 +54,7 @@ } } -+ (SDWebImageDownloader *)sharedDownloader { ++ (nonnull SDWebImageDownloader *)sharedDownloader { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -63,7 +63,7 @@ return instance; } -- (instancetype)init { +- (nonnull instancetype)init { if ((self = [super init])) { _operationClass = [SDWebImageDownloaderOperation class]; _shouldDecompressImages = YES; @@ -102,7 +102,7 @@ SDDispatchQueueRelease(_barrierQueue); } -- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { if (value) { self.HTTPHeaders[field] = value; } @@ -111,7 +111,7 @@ } } -- (NSString *)valueForHTTPHeaderField:(NSString *)field { +- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { return self.HTTPHeaders[field]; } @@ -127,14 +127,14 @@ return _downloadQueue.maxConcurrentOperationCount; } -- (void)setOperationClass:(Class)operationClass { +- (void)setOperationClass:(nullable Class)operationClass { _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; } -- (SDWebImageDownloadToken *)downloadImageWithURL:(NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock { +- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { __weak SDWebImageDownloader *wself = self; return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ @@ -180,7 +180,7 @@ }]; } -- (void)cancel:(SDWebImageDownloadToken *)token { +- (void)cancel:(nullable SDWebImageDownloadToken *)token { dispatch_barrier_async(self.barrierQueue, ^{ SDWebImageDownloaderOperation *operation = self.URLOperations[token.url]; BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; @@ -190,10 +190,10 @@ }); } -- (SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock - completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock - forURL:(NSURL *)url - createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { +- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock + completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock + forURL:(nullable NSURL *)url + createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. if (url == nil) { if (completedBlock != nil) { diff --git a/SDWebImage/SDWebImageDownloaderOperation.h b/SDWebImage/SDWebImageDownloaderOperation.h index 34f42291..141f1800 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.h +++ b/SDWebImage/SDWebImageDownloaderOperation.h @@ -10,22 +10,22 @@ #import "SDWebImageDownloader.h" #import "SDWebImageOperation.h" -extern NSString *const SDWebImageDownloadStartNotification; -extern NSString *const SDWebImageDownloadReceiveResponseNotification; -extern NSString *const SDWebImageDownloadStopNotification; -extern NSString *const SDWebImageDownloadFinishNotification; +extern NSString * _Nonnull const SDWebImageDownloadStartNotification; +extern NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; +extern NSString * _Nonnull const SDWebImageDownloadStopNotification; +extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; @interface SDWebImageDownloaderOperation : NSOperation /** * The request used by the operation's task. */ -@property (strong, nonatomic, readonly) NSURLRequest *request; +@property (strong, nonatomic, readonly, nullable) NSURLRequest *request; /** * The operation's task */ -@property (strong, nonatomic, readonly) NSURLSessionTask *dataTask; +@property (strong, nonatomic, readonly, nullable) NSURLSessionTask *dataTask; @property (assign, nonatomic) BOOL shouldDecompressImages; @@ -41,7 +41,7 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. */ -@property (nonatomic, strong) NSURLCredential *credential; +@property (nonatomic, strong, nullable) NSURLCredential *credential; /** * The SDWebImageDownloaderOptions for the receiver. @@ -56,7 +56,7 @@ extern NSString *const SDWebImageDownloadFinishNotification; /** * The response returned by the operation's connection. */ -@property (strong, nonatomic) NSURLResponse *response; +@property (strong, nonatomic, nullable) NSURLResponse *response; /** * Initializes a `SDWebImageDownloaderOperation` object @@ -69,9 +69,9 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * @return the initialized instance */ -- (instancetype)initWithRequest:(NSURLRequest *)request - inSession:(NSURLSession *)session - options:(SDWebImageDownloaderOptions)options NS_DESIGNATED_INITIALIZER; +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options NS_DESIGNATED_INITIALIZER; /** * Adds handlers for progress and completion. Returns a tokent that can be passed to -cancel: to cancel this set of @@ -84,8 +84,8 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * @return the token to use to cancel this set of handlers */ -- (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock; +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; /** * Cancels a set of callbacks. Once all callbacks are canceled, the operation is cancelled. @@ -94,6 +94,6 @@ extern NSString *const SDWebImageDownloadFinishNotification; * * @return YES if the operation was stopped because this was the last token to be canceled. NO otherwise. */ -- (BOOL)cancel:(id)token; +- (BOOL)cancel:(nullable id)token; @end diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 35200f10..5baa83a1 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -24,22 +24,22 @@ typedef NSMutableDictionary SDCallbacksDictionary; @interface SDWebImageDownloaderOperation () -@property (strong, nonatomic) NSMutableArray *callbackBlocks; +@property (strong, nonatomic, nonnull) NSMutableArray *callbackBlocks; @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; -@property (strong, nonatomic) NSMutableData *imageData; +@property (strong, nonatomic, nullable) NSMutableData *imageData; // This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run // the task associated with this operation -@property (weak, nonatomic) NSURLSession *unownedSession; +@property (weak, nonatomic, nullable) NSURLSession *unownedSession; // This is set if we're using not using an injected NSURLSession. We're responsible of invalidating this one -@property (strong, nonatomic) NSURLSession *ownedSession; +@property (strong, nonatomic, nullable) NSURLSession *ownedSession; -@property (strong, nonatomic, readwrite) NSURLSessionTask *dataTask; +@property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask; -@property (strong, atomic) NSThread *thread; -@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; +@property (strong, atomic, nullable) NSThread *thread; +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; #if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; @@ -56,13 +56,13 @@ typedef NSMutableDictionary SDCallbacksDictionary; @synthesize executing = _executing; @synthesize finished = _finished; -- (instancetype)init { +- (nonnull instancetype)init { return [self initWithRequest:nil inSession:nil options:0]; } -- (instancetype)initWithRequest:(NSURLRequest *)request - inSession:(NSURLSession *)session - options:(SDWebImageDownloaderOptions)options { +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options { if ((self = [super init])) { _request = request; _shouldDecompressImages = YES; @@ -82,8 +82,8 @@ typedef NSMutableDictionary SDCallbacksDictionary; SDDispatchQueueRelease(_barrierQueue); } -- (id)addHandlersForProgress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock { +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { SDCallbacksDictionary *callbacks = [NSMutableDictionary new]; if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; @@ -93,7 +93,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; return callbacks; } -- (NSArray *)callbacksForKey:(NSString *)key { +- (nullable NSArray *)callbacksForKey:(NSString *)key { __block NSMutableArray *callbacks = nil; dispatch_sync(self.barrierQueue, ^{ // We need to remove [NSNull null] because there might not always be a progress block for each callback @@ -103,7 +103,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; return callbacks; } -- (BOOL)cancel:(id)token { +- (BOOL)cancel:(nullable id)token { __block BOOL shouldCancel = NO; dispatch_barrier_sync(self.barrierQueue, ^{ [self.callbackBlocks removeObjectIdenticalTo:token]; @@ -523,7 +523,7 @@ didReceiveResponse:(NSURLResponse *)response } } -- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { +- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); } diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 7edfc74c..84d4fabe 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -90,11 +90,11 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { SDWebImageAvoidAutoSetImage = 1 << 11 }; -typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); +typedef void(^SDWebImageCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL); -typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); +typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL); -typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); +typedef NSString * _Nullable (^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable url); @class SDWebImageManager; @@ -111,7 +111,7 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * * @return Return NO to prevent the downloading of the image on cache misses. If not implemented, YES is implied. */ -- (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL; +- (BOOL)imageManager:(nonnull SDWebImageManager *)imageManager shouldDownloadImageForURL:(nullable NSURL *)imageURL; /** * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. @@ -123,7 +123,7 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * * @return The transformed image object. */ -- (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL; +- (nullable UIImage *)imageManager:(nonnull SDWebImageManager *)imageManager transformDownloadedImage:(nullable UIImage *)image withURL:(nullable NSURL *)imageURL; @end @@ -151,10 +151,10 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; */ @interface SDWebImageManager : NSObject -@property (weak, nonatomic) id delegate; +@property (weak, nonatomic, nullable) id delegate; -@property (strong, nonatomic, readonly) SDImageCache *imageCache; -@property (strong, nonatomic, readonly) SDWebImageDownloader *imageDownloader; +@property (strong, nonatomic, readonly, nullable) SDImageCache *imageCache; +@property (strong, nonatomic, readonly, nullable) SDWebImageDownloader *imageDownloader; /** * The cache filter is a block used each time SDWebImageManager need to convert an URL into a cache key. This can @@ -172,20 +172,20 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * @endcode */ -@property (nonatomic, copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; +@property (nonatomic, copy, nullable) SDWebImageCacheKeyFilterBlock cacheKeyFilter; /** * Returns global SDWebImageManager instance. * * @return SDWebImageManager shared instance */ -+ (SDWebImageManager *)sharedManager; ++ (nonnull SDWebImageManager *)sharedManager; /** * Allows to specify instance of cache and image downloader used with image manager. * @return new instance of `SDWebImageManager` with specified cache and downloader. */ -- (instancetype)initWithCache:(SDImageCache *)cache downloader:(SDWebImageDownloader *)downloader; +- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader; /** * Downloads the image at the given URL if not present in cache or return the cached version otherwise. @@ -209,10 +209,10 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation */ -- (id )loadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; +- (nullable id )loadImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionWithFinishedBlock)completedBlock; /** * Saves image to cache for given URL @@ -222,7 +222,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * */ -- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url; +- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url; /** * Cancel all current operations @@ -241,7 +241,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @return if the image was already cached */ -- (BOOL)cachedImageExistsForURL:(NSURL *)url; +- (BOOL)cachedImageExistsForURL:(nullable NSURL *)url; /** * Check if image has already been cached on disk only @@ -250,7 +250,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @return if the image was already cached (disk only) */ -- (BOOL)diskImageExistsForURL:(NSURL *)url; +- (BOOL)diskImageExistsForURL:(nullable NSURL *)url; /** * Async check if image has already been cached @@ -260,8 +260,8 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @note the completion block is always executed on the main queue */ -- (void)cachedImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)cachedImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** * Async check if image has already been cached on disk only @@ -271,13 +271,13 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @note the completion block is always executed on the main queue */ -- (void)diskImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)diskImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** *Return the cache key for a given URL */ -- (NSString *)cacheKeyForURL:(NSURL *)url; +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url; @end diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index b98be34f..6318e009 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -12,23 +12,23 @@ @interface SDWebImageCombinedOperation : NSObject @property (assign, nonatomic, getter = isCancelled) BOOL cancelled; -@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; -@property (strong, nonatomic) NSOperation *cacheOperation; +@property (copy, nonatomic, nullable) SDWebImageNoParamsBlock cancelBlock; +@property (strong, nonatomic, nullable) NSOperation *cacheOperation; @end @interface SDWebImageManager () -@property (strong, nonatomic, readwrite) SDImageCache *imageCache; -@property (strong, nonatomic, readwrite) SDWebImageDownloader *imageDownloader; -@property (strong, nonatomic) NSMutableSet *failedURLs; -@property (strong, nonatomic) NSMutableArray *runningOperations; +@property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache; +@property (strong, nonatomic, readwrite, nonnull) SDWebImageDownloader *imageDownloader; +@property (strong, nonatomic, nonnull) NSMutableSet *failedURLs; +@property (strong, nonatomic, nonnull) NSMutableArray *runningOperations; @end @implementation SDWebImageManager -+ (SDWebImageManager*)sharedManager { ++ (nonnull SDWebImageManager*)sharedManager { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -37,13 +37,13 @@ return instance; } -- (instancetype)init { +- (nonnull instancetype)init { SDImageCache *cache = [SDImageCache sharedImageCache]; SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; return [self initWithCache:cache downloader:downloader]; } -- (instancetype)initWithCache:(SDImageCache *)cache downloader:(SDWebImageDownloader *)downloader { +- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader { if ((self = [super init])) { _imageCache = cache; _imageDownloader = downloader; @@ -53,11 +53,11 @@ return self; } -- (NSString *)cacheKeyForURL:(NSURL *)url { +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url { if (!url) { return @""; } - + if (self.cacheKeyFilter) { return self.cacheKeyFilter(url); } else { @@ -71,19 +71,19 @@ } } -- (BOOL)cachedImageExistsForURL:(NSURL *)url { +- (BOOL)cachedImageExistsForURL:(nullable NSURL *)url { NSString *key = [self cacheKeyForURL:url]; if ([self.imageCache imageFromMemoryCacheForKey:key] != nil) return YES; return [self.imageCache diskImageExistsWithKey:key]; } -- (BOOL)diskImageExistsForURL:(NSURL *)url { +- (BOOL)diskImageExistsForURL:(nullable NSURL *)url { NSString *key = [self cacheKeyForURL:url]; return [self.imageCache diskImageExistsWithKey:key]; } -- (void)cachedImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)cachedImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; BOOL isInMemoryCache = ([self.imageCache imageFromMemoryCacheForKey:key] != nil); @@ -106,8 +106,8 @@ }]; } -- (void)diskImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)diskImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { @@ -118,10 +118,10 @@ }]; } -- (id )loadImageWithURL:(NSURL *)url +- (id )loadImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionWithFinishedBlock)completedBlock { // Invoking this method without a completedBlock is pointless NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); @@ -304,7 +304,7 @@ return operation; } -- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url { +- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url { if (image && url) { NSString *key = [self cacheKeyForURL:url]; [self.imageCache storeImage:image forKey:key toDisk:YES]; @@ -332,7 +332,7 @@ @implementation SDWebImageCombinedOperation -- (void)setCancelBlock:(SDWebImageNoParamsBlock)cancelBlock { +- (void)setCancelBlock:(nullable SDWebImageNoParamsBlock)cancelBlock { // check if the operation is already cancelled, then we just call the cancelBlock if (self.isCancelled) { if (cancelBlock) { diff --git a/SDWebImage/SDWebImagePrefetcher.h b/SDWebImage/SDWebImagePrefetcher.h index 01046da6..0d656362 100644 --- a/SDWebImage/SDWebImagePrefetcher.h +++ b/SDWebImage/SDWebImagePrefetcher.h @@ -23,7 +23,7 @@ * @param finishedCount The total number of images that were prefetched (successful or not) * @param totalCount The total number of images that were to be prefetched */ -- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; +- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(nullable NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; /** * Called when all images are prefetched. @@ -31,7 +31,7 @@ * @param totalCount The total number of images that were prefetched (whether successful or not) * @param skippedCount The total number of images that were skipped */ -- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; +- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; @end @@ -46,7 +46,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * The web image manager */ -@property (strong, nonatomic, readonly) SDWebImageManager *manager; +@property (strong, nonatomic, readonly, nonnull) SDWebImageManager *manager; /** * Maximum number of URLs to prefetch at the same time. Defaults to 3. @@ -61,19 +61,19 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Queue options for Prefetcher. Defaults to Main Queue. */ -@property (nonatomic, assign) dispatch_queue_t prefetcherQueue; +@property (nonatomic, assign, nonnull) dispatch_queue_t prefetcherQueue; -@property (weak, nonatomic) id delegate; +@property (weak, nonatomic, nullable) id delegate; /** * Return the global image prefetcher instance. */ -+ (SDWebImagePrefetcher *)sharedImagePrefetcher; ++ (nonnull SDWebImagePrefetcher *)sharedImagePrefetcher; /** * Allows you to instantiate a prefetcher with any arbitrary image manager. */ -- (instancetype)initWithImageManager:(SDWebImageManager *)manager NS_DESIGNATED_INITIALIZER; +- (nonnull instancetype)initWithImageManager:(nonnull SDWebImageManager *)manager NS_DESIGNATED_INITIALIZER; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, @@ -82,7 +82,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, * * @param urls list of URLs to prefetch */ -- (void)prefetchURLs:(NSArray *)urls; +- (void)prefetchURLs:(nullable NSArray *)urls; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, @@ -97,9 +97,9 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, * first param is the number of completed (successful or not) requests, * second parameter is the number of skipped requests */ -- (void)prefetchURLs:(NSArray *)urls - progress:(SDWebImagePrefetcherProgressBlock)progressBlock - completed:(SDWebImagePrefetcherCompletionBlock)completionBlock; +- (void)prefetchURLs:(nullable NSArray *)urls + progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock + completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock; /** * Remove and cancel queued list diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index b2809989..596aefd3 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -10,20 +10,20 @@ @interface SDWebImagePrefetcher () -@property (strong, nonatomic) SDWebImageManager *manager; -@property (strong, nonatomic) NSArray *prefetchURLs; +@property (strong, nonatomic, nonnull) SDWebImageManager *manager; +@property (strong, nonatomic, nullable) NSArray *prefetchURLs; @property (assign, nonatomic) NSUInteger requestedCount; @property (assign, nonatomic) NSUInteger skippedCount; @property (assign, nonatomic) NSUInteger finishedCount; @property (assign, nonatomic) NSTimeInterval startedTime; -@property (copy, nonatomic) SDWebImagePrefetcherCompletionBlock completionBlock; -@property (copy, nonatomic) SDWebImagePrefetcherProgressBlock progressBlock; +@property (copy, nonatomic, nullable) SDWebImagePrefetcherCompletionBlock completionBlock; +@property (copy, nonatomic, nullable) SDWebImagePrefetcherProgressBlock progressBlock; @end @implementation SDWebImagePrefetcher -+ (SDWebImagePrefetcher *)sharedImagePrefetcher { ++ (nonnull SDWebImagePrefetcher *)sharedImagePrefetcher { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -32,11 +32,11 @@ return instance; } -- (instancetype)init { +- (nonnull instancetype)init { return [self initWithImageManager:[SDWebImageManager new]]; } -- (instancetype)initWithImageManager:(SDWebImageManager *)manager { +- (nonnull instancetype)initWithImageManager:(SDWebImageManager *)manager { if ((self = [super init])) { _manager = manager; _options = SDWebImageLowPriority; @@ -105,11 +105,13 @@ } } -- (void)prefetchURLs:(NSArray *)urls { +- (void)prefetchURLs:(nullable NSArray *)urls { [self prefetchURLs:urls progress:nil completed:nil]; } -- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock { +- (void)prefetchURLs:(nullable NSArray *)urls + progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock + completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock { [self cancelPrefetching]; // Prevent duplicate prefetch request self.startedTime = CFAbsoluteTimeGetCurrent(); self.prefetchURLs = urls; diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index fa908bb6..bad09d71 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -17,14 +17,14 @@ /** * Get the current image URL. */ -- (NSURL *)sd_currentImageURL; +- (nullable NSURL *)sd_currentImageURL; /** * Get the image URL for a control state. * * @param state Which state you want to know the URL for. The values are described in UIControlState. */ -- (NSURL *)sd_imageURLForState:(UIControlState)state; +- (nullable NSURL *)sd_imageURLForState:(UIControlState)state; /** * Set the imageView `image` with an `url`. @@ -34,7 +34,8 @@ * @param url The url for the image. * @param state The state that uses the specified title. The values are described in UIControlState. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state; /** * Set the imageView `image` with an `url` and a placeholder. @@ -46,7 +47,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -58,7 +61,10 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the imageView `image` with an `url`. @@ -73,7 +79,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -89,7 +97,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -106,7 +117,11 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`. @@ -116,7 +131,8 @@ * @param url The url for the image. * @param state The state that uses the specified title. The values are described in UIControlState. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state; /** * Set the backgroundImageView `image` with an `url` and a placeholder. @@ -128,7 +144,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -140,7 +158,10 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the backgroundImageView `image` with an `url`. @@ -155,7 +176,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder. @@ -171,7 +194,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -187,7 +213,11 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Cancel the current image download diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 781405fa..329c24e9 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -16,7 +16,7 @@ typedef NSMutableDictionary SDStateImageURLDictionary; @implementation UIButton (WebCache) -- (NSURL *)sd_currentImageURL { +- (nullable NSURL *)sd_currentImageURL { NSURL *url = self.imageURLStorage[@(self.state)]; if (!url) { @@ -26,31 +26,35 @@ typedef NSMutableDictionary SDStateImageURLDictionary; return url; } -- (NSURL *)sd_imageURLForState:(UIControlState)state { +- (nullable NSURL *)sd_imageURLForState:(UIControlState)state { return self.imageURLStorage[@(state)]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock { [self setImage:placeholder forState:state]; [self sd_cancelImageLoadForState:state]; @@ -92,27 +96,31 @@ typedef NSMutableDictionary SDStateImageURLDictionary; [self sd_setImageLoadOperation:operation forState:state]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_cancelBackgroundImageLoadForState:state]; [self setBackgroundImage:placeholder forState:state]; diff --git a/SDWebImage/UIImage+MultiFormat.h b/SDWebImage/UIImage+MultiFormat.h index e05c111b..d94c657a 100644 --- a/SDWebImage/UIImage+MultiFormat.h +++ b/SDWebImage/UIImage+MultiFormat.h @@ -10,6 +10,6 @@ @interface UIImage (MultiFormat) -+ (UIImage *)sd_imageWithData:(NSData *)data; ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; @end diff --git a/SDWebImage/UIImage+MultiFormat.m b/SDWebImage/UIImage+MultiFormat.m index 178e9048..3c462d43 100644 --- a/SDWebImage/UIImage+MultiFormat.m +++ b/SDWebImage/UIImage+MultiFormat.m @@ -17,7 +17,7 @@ @implementation UIImage (MultiFormat) -+ (UIImage *)sd_imageWithData:(NSData *)data { ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data { if (!data) { return nil; } @@ -48,7 +48,7 @@ } -+(UIImageOrientation)sd_imageOrientationFromImageData:(NSData *)imageData { ++(UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData { UIImageOrientation result = UIImageOrientationUp; CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); if (imageSource) { diff --git a/SDWebImage/UIImage+WebP.h b/SDWebImage/UIImage+WebP.h index dbfb0a90..5e0de881 100644 --- a/SDWebImage/UIImage+WebP.h +++ b/SDWebImage/UIImage+WebP.h @@ -12,7 +12,7 @@ @interface UIImage (WebP) -+ (UIImage *)sd_imageWithWebPData:(NSData *)data; ++ (nullable UIImage *)sd_imageWithWebPData:(nullable NSData *)data; @end diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index 366b3af7..91bec099 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -22,7 +22,7 @@ static void FreeImageData(void *info, const void *data, size_t size) { @implementation UIImage (WebP) -+ (UIImage *)sd_imageWithWebPData:(NSData *)data { ++ (nullable UIImage *)sd_imageWithWebPData:(nullable NSData *)data { WebPDecoderConfig config; if (!WebPInitDecoderConfig(&config)) { return nil; diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index bc94f7b0..dfbc1817 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -22,7 +22,7 @@ * * @param url The url for the image. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -32,7 +32,8 @@ * @param url The url for the image. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options; /** * Set the imageView `highlightedImage` with an `url`. @@ -46,7 +47,8 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -61,7 +63,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -77,7 +81,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Cancel the current download diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index 9cc10252..ea94438f 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -13,23 +13,26 @@ @implementation UIImageView (HighlightedWebCache) -- (void)sd_setHighlightedImageWithURL:(NSURL *)url { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url { [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options { [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_cancelCurrentHighlightedImageLoad]; if (url) { diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 11311a3c..46ec8663 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -50,7 +50,7 @@ * Note that because of the limitations of categories this property can get out of sync * if you use sd_setImage: directly. */ -- (NSURL *)sd_imageURL; +- (nullable NSURL *)sd_imageURL; /** * Set the imageView `image` with an `url`. @@ -59,7 +59,7 @@ * * @param url The url for the image. */ -- (void)sd_setImageWithURL:(NSURL *)url; +- (void)sd_setImageWithURL:(nullable NSURL *)url; /** * Set the imageView `image` with an `url` and a placeholder. @@ -70,7 +70,8 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -81,7 +82,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the imageView `image` with an `url`. @@ -95,7 +98,8 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -110,7 +114,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -126,7 +132,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -143,7 +152,11 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url` and optionally a placeholder image. @@ -160,14 +173,18 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock; /** * Download an array of images and starts them in an animation loop * * @param arrayOfURLs An array of NSURL */ -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs; +- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs; /** * Cancel the current download diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 190deb71..1ff6f0eb 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -17,31 +17,35 @@ static char TAG_ACTIVITY_SHOW; @implementation UIImageView (WebCache) -- (void)sd_setImageWithURL:(NSURL *)url { +- (void)sd_setImageWithURL:(nullable NSURL *)url { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock { [self sd_cancelCurrentImageLoad]; objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); @@ -95,18 +99,22 @@ static char TAG_ACTIVITY_SHOW; } } -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageCompletionBlock)completedBlock { NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; } -- (NSURL *)sd_imageURL { +- (nullable NSURL *)sd_imageURL { return objc_getAssociatedObject(self, &imageURLKey); } -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { +- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; __weak __typeof(self)wself = self; diff --git a/SDWebImage/UIView+WebCacheOperation.h b/SDWebImage/UIView+WebCacheOperation.h index 67190362..8f83eda3 100644 --- a/SDWebImage/UIView+WebCacheOperation.h +++ b/SDWebImage/UIView+WebCacheOperation.h @@ -17,20 +17,20 @@ * @param operation the operation * @param key key for storing the operation */ -- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key; +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key; /** * Cancel all operations for the current UIView and key * * @param key key for identifying the operations */ -- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key; +- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key; /** * Just remove the operations corresponding to the current UIView and key without cancelling them * * @param key key for identifying the operations */ -- (void)sd_removeImageLoadOperationWithKey:(NSString *)key; +- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key; @end diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index 033da216..2533930b 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -25,13 +25,15 @@ typedef NSMutableDictionary SDOperationsDictionary; return operations; } -- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key { - [self sd_cancelImageLoadOperationWithKey:key]; - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - operationDictionary[key] = operation; +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { + if (key) { + [self sd_cancelImageLoadOperationWithKey:key]; + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + operationDictionary[key] = operation; + } } -- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { +- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { // Cancel in progress downloader from queue SDOperationsDictionary *operationDictionary = [self operationDictionary]; id operations = operationDictionary[key]; @@ -49,9 +51,11 @@ typedef NSMutableDictionary SDOperationsDictionary; } } -- (void)sd_removeImageLoadOperationWithKey:(NSString *)key { - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - [operationDictionary removeObjectForKey:key]; +- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key { + if (key) { + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + [operationDictionary removeObjectForKey:key]; + } } @end From 0df12218b7b9a4c633d057158272a33df388ff58 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 6 Jun 2016 12:10:51 +0300 Subject: [PATCH 068/207] Enabled CLANG_ANALYZER_NONNULL per http://indiestack.com/2016/06/nullable-edge-cases/. Small fix for a case where trying to get from a set using a nil key --- SDWebImage.xcodeproj/project.pbxproj | 2 ++ SDWebImage/SDWebImageManager.m | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 1747cd6b..e30fc04e 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -1350,6 +1350,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -1410,6 +1411,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 6318e009..b213cec7 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -140,8 +140,10 @@ __weak SDWebImageCombinedOperation *weakOperation = operation; BOOL isFailedUrl = NO; - @synchronized (self.failedURLs) { - isFailedUrl = [self.failedURLs containsObject:url]; + if (url) { + @synchronized (self.failedURLs) { + isFailedUrl = [self.failedURLs containsObject:url]; + } } if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { From 546a579c62510b745d68ab430cfe2a3d86e47722 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 10 Jun 2016 07:04:34 +0300 Subject: [PATCH 069/207] Added short description about how to use GIFs --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 35830601..160cb6d1 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,11 @@ imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image. - For details about how to use the library and clear examples, see [The detailed How to use](https://raw.github.com/rs/SDWebImage/master/Docs/HowToUse.md) +## Animated Images (GIF) support + +- Starting with the 4.0 version, we relly on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. +- To use it, simply make sure you us `FLAnimatedImageView` instead of `UIImageView`. +- Note: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. Common Problems --------------- From 3d122e550b906aebb690a57f97fa3b211ed4ccf8 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 10 Jun 2016 07:28:09 +0300 Subject: [PATCH 070/207] WatchOS support - just added a target and the conditional compiling - seems to work (pod lib lint works). There is an issue, the SDWebImage watchOS target doesn't show the simulator, only Generic Device. Also need to add some demo and test code. --- SDWebImage.podspec | 4 +- SDWebImage.xcodeproj/project.pbxproj | 190 +++++++++++++++++- .../xcschemes/SDWebImage watchOS.xcscheme | 80 ++++++++ .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../FLAnimatedImageView+WebCache.h | 3 + .../FLAnimatedImageView+WebCache.m | 3 + SDWebImage/SDImageCache.m | 11 +- SDWebImage/SDWebImageCompat.h | 21 +- SDWebImage/SDWebImageCompat.m | 4 + SDWebImage/SDWebImageDownloaderOperation.m | 8 +- SDWebImage/UIButton+WebCache.h | 4 + SDWebImage/UIButton+WebCache.m | 4 + SDWebImage/UIImage+GIF.h | 3 + SDWebImage/UIImage+GIF.m | 10 +- SDWebImage/UIImageView+HighlightedWebCache.h | 4 + SDWebImage/UIImageView+HighlightedWebCache.m | 4 + SDWebImage/UIImageView+WebCache.h | 4 + SDWebImage/UIImageView+WebCache.m | 4 + SDWebImage/UIView+WebCacheOperation.h | 4 + SDWebImage/UIView+WebCacheOperation.m | 4 + 20 files changed, 351 insertions(+), 26 deletions(-) create mode 100644 SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS.xcscheme create mode 100644 SDWebImage.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/SDWebImage.podspec b/SDWebImage.podspec index 5f64d5ad..f205158a 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -3,6 +3,8 @@ Pod::Spec.new do |s| s.version = '3.8.1' s.ios.deployment_target = '7.0' s.tvos.deployment_target = '9.0' + s.watchos.deployment_target = '2.0' + s.license = 'MIT' s.summary = 'Asynchronous image downloader with cache support with an UIImageView category.' s.homepage = 'https://github.com/rs/SDWebImage' @@ -36,7 +38,7 @@ Pod::Spec.new do |s| end s.subspec 'GIF' do |gif| - gif.ios.deployment_target = '6.0' + gif.ios.deployment_target = '7.0' gif.source_files = 'SDWebImage/FLAnimatedImage/*.{h,m}' gif.dependency 'SDWebImage/Core' gif.dependency 'FLAnimatedImage', '~> 1.0' diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 477ddd7d..af5c9cfc 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -267,6 +267,40 @@ 431739591CDFC8B70008FEB9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; 4317395A1CDFC8B70008FEB9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; 4317395B1CDFC8B70008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; + 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; + 431BB6901D06D2C1006A3455 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; + 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; + 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; + 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; + 431BB6AA1D06D2C1006A3455 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; + 431BB6AC1D06D2C1006A3455 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; + 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; + 431BB6B41D06D2C1006A3455 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; + 431BB6B61D06D2C1006A3455 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; + 431BB6B91D06D2C1006A3455 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; + 431BB6BD1D06D2C1006A3455 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; + 431BB6C01D06D2C1006A3455 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; + 431BB6C41D06D2C1006A3455 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; + 431BB6C71D06D2C1006A3455 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; + 431BB6D71D06D2C1006A3455 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6D91D06D2C1006A3455 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6DF1D06D2C1006A3455 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E61D06D2C1006A3455 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E71D06D2C1006A3455 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6E91D06D2C1006A3455 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6EB1D06D2C1006A3455 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6EE1D06D2C1006A3455 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6EF1D06D2C1006A3455 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6F01D06D2C1006A3455 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6F61D06D2C1006A3455 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 431BB6FC1D06D2C1006A3455 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -359,6 +393,7 @@ /* Begin PBXFileReference section */ 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 431BB7031D06D2C1006A3455 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; @@ -491,6 +526,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 431BB6CA1D06D2C1006A3455 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFB1AB4BB5300B6BC39 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -574,6 +616,7 @@ 53761325155AD0D5005750A4 /* libSDWebImage.a */, 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */, 00733A4C1BC487C000A5A117 /* SDWebImage.framework */, + 431BB7031D06D2C1006A3455 /* SDWebImage.framework */, ); name = Products; sourceTree = ""; @@ -848,6 +891,31 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 431BB6CB1D06D2C1006A3455 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 431BB6D71D06D2C1006A3455 /* UIImage+WebP.h in Headers */, + 431BB6D91D06D2C1006A3455 /* SDWebImageManager.h in Headers */, + 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */, + 431BB6DF1D06D2C1006A3455 /* FLAnimatedImageView+WebCache.h in Headers */, + 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */, + 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */, + 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */, + 431BB6E61D06D2C1006A3455 /* UIImageView+WebCache.h in Headers */, + 431BB6E71D06D2C1006A3455 /* SDWebImageCompat.h in Headers */, + 431BB6E91D06D2C1006A3455 /* SDWebImageDownloaderOperation.h in Headers */, + 431BB6EB1D06D2C1006A3455 /* UIView+WebCacheOperation.h in Headers */, + 431BB6EE1D06D2C1006A3455 /* NSData+ImageContentType.h in Headers */, + 431BB6EF1D06D2C1006A3455 /* SDWebImagePrefetcher.h in Headers */, + 431BB6F01D06D2C1006A3455 /* SDWebImageOperation.h in Headers */, + 431BB6F61D06D2C1006A3455 /* UIImage+MultiFormat.h in Headers */, + 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */, + 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */, + 431BB6FC1D06D2C1006A3455 /* SDWebImageDecoder.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFC1AB4BB5300B6BC39 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -986,6 +1054,24 @@ productReference = 00733A4C1BC487C000A5A117 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; + 431BB6891D06D2C1006A3455 /* SDWebImage watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 431BB7001D06D2C1006A3455 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS" */; + buildPhases = ( + 431BB68A1D06D2C1006A3455 /* Sources */, + 431BB6CA1D06D2C1006A3455 /* Frameworks */, + 431BB6CB1D06D2C1006A3455 /* Headers */, + 431BB6FF1D06D2C1006A3455 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SDWebImage watchOS"; + productName = "WebImage tvOS"; + productReference = 431BB7031D06D2C1006A3455 /* SDWebImage.framework */; + productType = "com.apple.product-type.framework"; + }; 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */; @@ -1054,6 +1140,7 @@ 53761307155AD0D5005750A4 /* SDWebImage */, 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */, 00733A4B1BC487C000A5A117 /* SDWebImage tvOS */, + 431BB6891D06D2C1006A3455 /* SDWebImage watchOS */, ); }; /* End PBXProject section */ @@ -1066,6 +1153,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 431BB6FF1D06D2C1006A3455 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFD1AB4BB5300B6BC39 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1163,6 +1257,29 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 431BB68A1D06D2C1006A3455 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */, + 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */, + 431BB6901D06D2C1006A3455 /* FLAnimatedImageView+WebCache.m in Sources */, + 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */, + 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */, + 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, + 431BB6AA1D06D2C1006A3455 /* SDWebImageManager.m in Sources */, + 431BB6AC1D06D2C1006A3455 /* SDWebImageCompat.m in Sources */, + 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */, + 431BB6B41D06D2C1006A3455 /* SDWebImageDecoder.m in Sources */, + 431BB6B61D06D2C1006A3455 /* UIImage+WebP.m in Sources */, + 431BB6B91D06D2C1006A3455 /* UIButton+WebCache.m in Sources */, + 431BB6BD1D06D2C1006A3455 /* UIImage+GIF.m in Sources */, + 431BB6C01D06D2C1006A3455 /* SDImageCache.m in Sources */, + 431BB6C41D06D2C1006A3455 /* UIImage+MultiFormat.m in Sources */, + 431BB6C71D06D2C1006A3455 /* UIImageView+HighlightedWebCache.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFA1AB4BB5300B6BC39 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1321,7 +1438,6 @@ ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = WebImage/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).tvos"; @@ -1350,7 +1466,6 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = WebImage/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).tvos"; @@ -1364,6 +1479,62 @@ }; name = Release; }; + 431BB7011D06D2C1006A3455 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = WebImage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).watchos"; + PRODUCT_NAME = SDWebImage; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "watchsimulator watchos"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 431BB7021D06D2C1006A3455 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = WebImage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).watchos"; + PRODUCT_NAME = SDWebImage; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "watchsimulator watchos"; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; 4A2CAE131AB4BB5400B6BC39 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1450,7 +1621,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", - "SD_WEBP=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; @@ -1506,10 +1676,7 @@ ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "SD_WEBP=1", - "$(inherited)", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; @@ -1548,6 +1715,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 431BB7001D06D2C1006A3455 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 431BB7011D06D2C1006A3455 /* Debug */, + 431BB7021D06D2C1006A3455 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS.xcscheme new file mode 100644 index 00000000..70ec4055 --- /dev/null +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SDWebImage.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/SDWebImage.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/SDWebImage.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index acd4a8a6..e7610a36 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -6,6 +6,7 @@ * file that was distributed with this source code. */ +#if TARGET_OS_IOS || TARGET_OS_TV #if COCOAPODS @import FLAnimatedImage; @@ -139,3 +140,5 @@ - (void)sd_cancelCurrentImageLoad; @end + +#endif diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index 145ef5f2..eca04203 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -6,6 +6,7 @@ * file that was distributed with this source code. */ +#if TARGET_OS_IOS || TARGET_OS_TV #import "FLAnimatedImageView+WebCache.h" #import "objc/runtime.h" @@ -117,3 +118,5 @@ static char imageURLKey; @end + +#endif diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index f49e3819..4727a3d1 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -21,14 +21,17 @@ - (nonnull instancetype)init { self = [super init]; if (self) { +#if TARGET_OS_IOS || TARGET_OS_TV [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#endif } return self; } - (void)dealloc { +#if TARGET_OS_IOS || TARGET_OS_TV [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; - +#endif } @end @@ -126,7 +129,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { _fileManager = [NSFileManager new]; }); -#if TARGET_OS_IOS +#if TARGET_OS_IOS || TARGET_OS_TV // Subscribe to app events [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearMemory) @@ -211,7 +214,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSData *data = imageData; if (image && (recalculate || !data)) { -#if TARGET_OS_IPHONE +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH // We need to determine if the image is a PNG or a JPEG // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html) // The first eight bytes of a PNG file always contain the following (decimal) values: @@ -589,6 +592,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } +#if TARGET_OS_IOS || TARGET_OS_TV - (void)backgroundCleanDisk { Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { @@ -608,6 +612,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { bgTask = UIBackgroundTaskInvalid; }]; } +#endif - (NSUInteger)getSize { __block NSUInteger size = 0; diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index 3c21b413..3d4b48d8 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -18,17 +18,18 @@ #endif #if !TARGET_OS_IPHONE -#import -#ifndef UIImage -#define UIImage NSImage -#endif -#ifndef UIImageView -#define UIImageView NSImageView -#endif + #import + #ifndef UIImage + #define UIImage NSImage + #endif + #ifndef UIImageView + #define UIImageView NSImageView + #endif #else - -#import - + #import + #if TARGET_OS_WATCH + #import + #endif #endif #ifndef NS_ENUM diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 77a8c504..1380f3d3 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -27,7 +27,11 @@ inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullabl return [UIImage animatedImageWithImages:scaledImages duration:image.duration]; } else { +#if TARGET_OS_WATCH + if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) { +#else if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { +#endif CGFloat scale = 1; if (key.length >= 8) { NSRange range = [key rangeOfString:@"@2x."]; diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 5baa83a1..766e683f 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -41,7 +41,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; @property (strong, atomic, nullable) NSThread *thread; @property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if TARGET_OS_IOS || TARGET_OS_TV @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; #endif @@ -125,7 +125,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; return; } -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if TARGET_OS_IOS || TARGET_OS_TV Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication && [self shouldContinueWhenAppEntersBackground]) { @@ -179,7 +179,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; } } -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if TARGET_OS_IOS || TARGET_OS_TV Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { return; @@ -345,7 +345,7 @@ didReceiveResponse:(NSURLResponse *)response // Create the image CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); -#ifdef TARGET_OS_IPHONE +#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH // Workaround for iOS anamorphic image if (partialImageRef) { const size_t partialHeight = CGImageGetHeight(partialImageRef); diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index 122c29dc..e0115010 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -9,6 +9,8 @@ #import "SDWebImageCompat.h" #import "SDWebImageManager.h" +#if TARGET_OS_IOS || TARGET_OS_TV + /** * Integrates SDWebImage async downloading and caching of remote images with UIButtonView. */ @@ -230,3 +232,5 @@ - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state; @end + +#endif diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 84b9c5d2..5ffaa576 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -10,6 +10,8 @@ #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" +#if TARGET_OS_IOS || TARGET_OS_TV + static char imageURLStorageKey; typedef NSMutableDictionary SDStateImageURLDictionary; @@ -183,3 +185,5 @@ typedef NSMutableDictionary SDStateImageURLDictionary; } @end + +#endif diff --git a/SDWebImage/UIImage+GIF.h b/SDWebImage/UIImage+GIF.h index 63cb856d..a177969d 100755 --- a/SDWebImage/UIImage+GIF.h +++ b/SDWebImage/UIImage+GIF.h @@ -8,6 +8,9 @@ */ #import +#if TARGET_OS_WATCH + #import +#endif @interface UIImage (GIF) diff --git a/SDWebImage/UIImage+GIF.m b/SDWebImage/UIImage+GIF.m index 37c5130b..e8bcca0c 100755 --- a/SDWebImage/UIImage+GIF.m +++ b/SDWebImage/UIImage+GIF.m @@ -29,8 +29,16 @@ } else { // we will only retrieve the 1st frame. the full GIF support is available via the FLAnimatedImageView category. // this here is only code to allow drawing animated images as static ones + CGFloat scale = 1; +#if TARGET_OS_WATCH + scale = [WKInterfaceDevice currentDevice].screenScale; +#else + scale = [UIScreen mainScreen].scale; +#endif + + CGImageRef CGImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); - UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]; + UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:scale orientation:UIImageOrientationUp]; staticImage = [UIImage animatedImageWithImages:@[frameImage] duration:0.0f]; CGImageRelease(CGImage); } diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index d97b4f04..1605b97d 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -10,6 +10,8 @@ #import "SDWebImageCompat.h" #import "SDWebImageManager.h" +#if TARGET_OS_IOS || TARGET_OS_TV + /** * Integrates SDWebImage async downloading and caching of remote images with UIImageView for highlighted state. */ @@ -92,3 +94,5 @@ - (void)sd_cancelCurrentHighlightedImageLoad; @end + +#endif diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index dbc3374a..fe581b8b 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -9,6 +9,8 @@ #import "UIImageView+HighlightedWebCache.h" #import "UIView+WebCacheOperation.h" +#if TARGET_OS_IOS || TARGET_OS_TV + #define UIImageViewHighlightedWebCacheOperationKey @"highlightedImage" @implementation UIImageView (HighlightedWebCache) @@ -71,3 +73,5 @@ } @end + +#endif diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 85ca2eda..a41102b1 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -9,6 +9,8 @@ #import "SDWebImageCompat.h" #import "SDWebImageManager.h" +#if TARGET_OS_IOS || TARGET_OS_TV + /** * Integrates SDWebImage async downloading and caching of remote images with UIImageView. * @@ -211,3 +213,5 @@ @end + +#endif diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index a9286606..5f2bca56 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -10,6 +10,8 @@ #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" +#if TARGET_OS_IOS || TARGET_OS_TV + static char imageURLKey; static char TAG_ACTIVITY_INDICATOR; static char TAG_ACTIVITY_STYLE; @@ -218,3 +220,5 @@ static char TAG_ACTIVITY_SHOW; } @end + +#endif diff --git a/SDWebImage/UIView+WebCacheOperation.h b/SDWebImage/UIView+WebCacheOperation.h index 8f83eda3..1c6fa235 100644 --- a/SDWebImage/UIView+WebCacheOperation.h +++ b/SDWebImage/UIView+WebCacheOperation.h @@ -9,6 +9,8 @@ #import #import "SDWebImageManager.h" +#if TARGET_OS_IOS || TARGET_OS_TV + @interface UIView (WebCacheOperation) /** @@ -34,3 +36,5 @@ - (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key; @end + +#endif diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index 2533930b..dd607f97 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -9,6 +9,8 @@ #import "UIView+WebCacheOperation.h" #import "objc/runtime.h" +#if TARGET_OS_IOS || TARGET_OS_TV + static char loadOperationKey; typedef NSMutableDictionary SDOperationsDictionary; @@ -59,3 +61,5 @@ typedef NSMutableDictionary SDOperationsDictionary; } @end + +#endif From f4875b0efbb11339bb522dbeaceae74706683e04 Mon Sep 17 00:00:00 2001 From: Cory Dolphin Date: Sat, 11 Jun 2016 21:43:28 -0700 Subject: [PATCH 071/207] Enables BITCODE for tvOS builds --- SDWebImage.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index ffdd535f..a53e0fc5 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -1230,6 +1230,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1277,6 +1278,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; From f63a23654699bc519dacc7bf93670a42dfc1580f Mon Sep 17 00:00:00 2001 From: Cory Dolphin Date: Sat, 11 Jun 2016 21:48:09 -0700 Subject: [PATCH 072/207] Adds automatic building with carthage to CI --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 313c5929..ef7dceb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ before_install: - pod --version - pod setup --silent > /dev/null - pod repo update --silent + - brew install carthage script: @@ -24,4 +25,6 @@ script: - pod install --project-directory=Tests - xctool -workspace SDWebImage.xcworkspace -scheme 'SDWebImage' -sdk iphonesimulator clean - - xctool -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' test \ No newline at end of file + - xctool -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' test + + - carthage build --no-skip-current \ No newline at end of file From cc7fa8fd93975069acc927829ec32f48619f73f0 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 12 Jun 2016 21:10:18 +0300 Subject: [PATCH 073/207] Projects cleanup, properly set targeted device family, sdkroot and supported platforms. Tried not to set things on the project level that need redefinition at the target level --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 27 ++++++++++++++----- SDWebImage.xcodeproj/project.pbxproj | 22 ++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index 85b45889..c5413158 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -40,6 +40,13 @@ remoteGlobalIDString = 53761307155AD0D5005750A4; remoteInfo = SDWebImage; }; + 4397D2741D0DDBE100BB2784 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 431BB7031D06D2C1006A3455; + remoteInfo = "SDWebImage watchOS"; + }; 43A0FAAE1BDD16AC00B7582B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -162,8 +169,9 @@ isa = PBXGroup; children = ( DA248D741954841D00390AB0 /* libSDWebImage.a */, - 43A0FAAF1BDD16AC00B7582B /* WebImage.framework */, - 431739601CDFCC370008FEB9 /* WebImage.framework */, + 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */, + 431739601CDFCC370008FEB9 /* SDWebImage.framework */, + 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */, ); name = Products; sourceTree = ""; @@ -222,17 +230,24 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - 431739601CDFCC370008FEB9 /* WebImage.framework */ = { + 431739601CDFCC370008FEB9 /* SDWebImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = WebImage.framework; + path = SDWebImage.framework; remoteRef = 4317395F1CDFCC370008FEB9 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 43A0FAAF1BDD16AC00B7582B /* WebImage.framework */ = { + 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = WebImage.framework; + path = SDWebImage.framework; + remoteRef = 4397D2741D0DDBE100BB2784 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SDWebImage.framework; remoteRef = 43A0FAAE1BDD16AC00B7582B /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index af5c9cfc..84bd63ea 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -1498,9 +1498,8 @@ PRODUCT_NAME = SDWebImage; SDKROOT = watchos; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "watchsimulator watchos"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = 3; + TARGETED_DEVICE_FAMILY = 4; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 2.0; @@ -1527,8 +1526,7 @@ PRODUCT_NAME = SDWebImage; SDKROOT = watchos; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "watchsimulator watchos"; - TARGETED_DEVICE_FAMILY = 3; + TARGETED_DEVICE_FAMILY = 4; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 2.0; @@ -1551,6 +1549,8 @@ MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -1570,6 +1570,8 @@ MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; @@ -1577,16 +1579,22 @@ isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = SDWebImage; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 53761324155AD0D5005750A4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + IPHONEOS_DEPLOYMENT_TARGET = 7.0; PRODUCT_NAME = SDWebImage; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; @@ -1640,13 +1648,10 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -1693,12 +1698,9 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = Vendors/libwebp/src; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_LDFLAGS = "-ObjC"; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; From b8e210dae9cf02f81f082fa76f0657b9985f97f6 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 12 Jun 2016 21:11:35 +0300 Subject: [PATCH 074/207] Added the watch framework build to the Travis CI script --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 4f7979c9..71c69831 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,6 +32,7 @@ script: - echo Build as dynamic framework - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage tvOS' -sdk appletvsimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage watchOS' -sdk watchsimulator -configuration Debug | xcpretty -c - echo Build the Demo app - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c From 4c6eb5e72e79c58d46ad5b0bdf9b4386ebf1736b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 12 Jun 2016 23:23:53 +0300 Subject: [PATCH 075/207] OSX compatibility and target. (NSImage+WebCache) for UIImage compatibility Clarified and simplified the usage of TARGET_OS_* macros. Added SD_MAC, SD_UIKIT, SD_IOS, SD_TV, SD_WATCH. Updated Travis CI --- .travis.yml | 1 + SDWebImage.xcodeproj/project.pbxproj | 334 +++++++++++++++++- .../xcschemes/SDWebImage OSX.xcscheme | 80 +++++ .../FLAnimatedImageView+WebCache.h | 4 +- .../FLAnimatedImageView+WebCache.m | 2 +- SDWebImage/MKAnnotationView+WebCache.h | 6 + SDWebImage/MKAnnotationView+WebCache.m | 13 + SDWebImage/NSImage+WebCache.h | 22 ++ SDWebImage/NSImage+WebCache.m | 26 ++ SDWebImage/SDImageCache.m | 28 +- SDWebImage/SDWebImageCompat.h | 61 +++- SDWebImage/SDWebImageCompat.m | 8 +- SDWebImage/SDWebImageDecoder.m | 4 + SDWebImage/SDWebImageDownloaderOperation.m | 19 +- SDWebImage/SDWebImageManager.m | 1 + SDWebImage/UIButton+WebCache.h | 5 +- SDWebImage/UIButton+WebCache.m | 5 +- SDWebImage/UIImage+GIF.h | 5 +- SDWebImage/UIImage+GIF.m | 11 +- SDWebImage/UIImage+MultiFormat.h | 2 +- SDWebImage/UIImage+MultiFormat.m | 6 +- SDWebImage/UIImage+WebP.h | 2 +- SDWebImage/UIImage+WebP.m | 6 +- SDWebImage/UIImageView+HighlightedWebCache.h | 6 +- SDWebImage/UIImageView+HighlightedWebCache.m | 5 +- SDWebImage/UIImageView+WebCache.h | 10 +- SDWebImage/UIImageView+WebCache.m | 29 +- SDWebImage/UIView+WebCacheOperation.h | 7 +- SDWebImage/UIView+WebCacheOperation.m | 5 +- WebImage/SDWebImage.h | 2 +- 30 files changed, 649 insertions(+), 66 deletions(-) create mode 100644 SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX.xcscheme create mode 100644 SDWebImage/NSImage+WebCache.h create mode 100644 SDWebImage/NSImage+WebCache.m diff --git a/.travis.yml b/.travis.yml index 71c69831..e59092b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,7 @@ script: - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage-static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - echo Build as dynamic framework + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX' -sdk macosx -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage tvOS' -sdk appletvsimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage watchOS' -sdk watchsimulator -configuration Debug | xcpretty -c diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 84bd63ea..d68dc3dd 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -269,7 +269,6 @@ 4317395B1CDFC8B70008FEB9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; - 431BB6901D06D2C1006A3455 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; @@ -286,7 +285,6 @@ 431BB6D71D06D2C1006A3455 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6D91D06D2C1006A3455 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 431BB6DF1D06D2C1006A3455 /* FLAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -305,6 +303,120 @@ 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; + 4397D2781D0DDD8C00BB2784 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 4397D2791D0DDD8C00BB2784 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 4397D27A1D0DDD8C00BB2784 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 4397D27B1D0DDD8C00BB2784 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 4397D27C1D0DDD8C00BB2784 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 4397D27D1D0DDD8C00BB2784 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 4397D27E1D0DDD8C00BB2784 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; + 4397D27F1D0DDD8C00BB2784 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; + 4397D2801D0DDD8C00BB2784 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 4397D2821D0DDD8C00BB2784 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 4397D2831D0DDD8C00BB2784 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 4397D2841D0DDD8C00BB2784 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 4397D2851D0DDD8C00BB2784 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 4397D2861D0DDD8C00BB2784 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 4397D2871D0DDD8C00BB2784 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 4397D2881D0DDD8C00BB2784 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 4397D2891D0DDD8C00BB2784 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 4397D28A1D0DDD8C00BB2784 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 4397D28C1D0DDD8C00BB2784 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; + 4397D28D1D0DDD8C00BB2784 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 4397D28E1D0DDD8C00BB2784 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 4397D28F1D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; + 4397D2901D0DDD8C00BB2784 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 4397D2911D0DDD8C00BB2784 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; + 4397D2921D0DDD8C00BB2784 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; + 4397D2931D0DDD8C00BB2784 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 4397D2941D0DDD8C00BB2784 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 4397D2951D0DDD8C00BB2784 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 4397D2961D0DDD8C00BB2784 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; + 4397D2971D0DDD8C00BB2784 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 4397D2981D0DDD8C00BB2784 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 4397D29A1D0DDD8C00BB2784 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; + 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; + 4397D29D1D0DDD8C00BB2784 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 4397D29E1D0DDD8C00BB2784 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 4397D29F1D0DDD8C00BB2784 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 4397D2A01D0DDD8C00BB2784 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 4397D2A11D0DDD8C00BB2784 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; + 4397D2A21D0DDD8C00BB2784 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 4397D2A31D0DDD8C00BB2784 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 4397D2A41D0DDD8C00BB2784 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 4397D2A51D0DDD8C00BB2784 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 4397D2A61D0DDD8C00BB2784 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; + 4397D2A71D0DDD8C00BB2784 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 4397D2A81D0DDD8C00BB2784 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; + 4397D2A91D0DDD8C00BB2784 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 4397D2AA1D0DDD8C00BB2784 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 4397D2AB1D0DDD8C00BB2784 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; + 4397D2AC1D0DDD8C00BB2784 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 4397D2AD1D0DDD8C00BB2784 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; + 4397D2AE1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; + 4397D2AF1D0DDD8C00BB2784 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 4397D2B01D0DDD8C00BB2784 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; + 4397D2B21D0DDD8C00BB2784 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 4397D2B31D0DDD8C00BB2784 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 4397D2B41D0DDD8C00BB2784 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 4397D2B51D0DDD8C00BB2784 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 4397D2B61D0DDD8C00BB2784 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 4397D2B71D0DDD8C00BB2784 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 4397D2BA1D0DDD8C00BB2784 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 4397D2BB1D0DDD8C00BB2784 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 4397D2BD1D0DDD8C00BB2784 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 4397D2BE1D0DDD8C00BB2784 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 4397D2BF1D0DDD8C00BB2784 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 4397D2C01D0DDD8C00BB2784 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2C11D0DDD8C00BB2784 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 4397D2C21D0DDD8C00BB2784 /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 4397D2C31D0DDD8C00BB2784 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2C41D0DDD8C00BB2784 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2C51D0DDD8C00BB2784 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2C61D0DDD8C00BB2784 /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; + 4397D2C71D0DDD8C00BB2784 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 4397D2C81D0DDD8C00BB2784 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2C91D0DDD8C00BB2784 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 4397D2CB1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2CC1D0DDD8C00BB2784 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 4397D2CD1D0DDD8C00BB2784 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 4397D2CE1D0DDD8C00BB2784 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 4397D2CF1D0DDD8C00BB2784 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 4397D2D01D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2D11D0DDD8C00BB2784 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 4397D2D21D0DDD8C00BB2784 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 4397D2D31D0DDD8C00BB2784 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 4397D2D41D0DDD8C00BB2784 /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 4397D2D51D0DDD8C00BB2784 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 4397D2D61D0DDD8C00BB2784 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 4397D2D81D0DDD8C00BB2784 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2D91D0DDD8C00BB2784 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2DA1D0DDD8C00BB2784 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2DB1D0DDD8C00BB2784 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2DC1D0DDD8C00BB2784 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2DD1D0DDD8C00BB2784 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 4397D2DE1D0DDD8C00BB2784 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 4397D2DF1D0DDD8C00BB2784 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 4397D2E01D0DDD8C00BB2784 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 4397D2E11D0DDD8C00BB2784 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2E21D0DDD8C00BB2784 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 4397D2E31D0DDD8C00BB2784 /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2E41D0DDD8C00BB2784 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 4397D2E51D0DDD8C00BB2784 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 4397D2E61D0DDD8C00BB2784 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 4397D2E71D0DDD8C00BB2784 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 4397D2E81D0DDD8C00BB2784 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2E91D0DDD8C00BB2784 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2EA1D0DDD8C00BB2784 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2EB1D0DDD8C00BB2784 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2EC1D0DDD8C00BB2784 /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 4397D2ED1D0DDD8C00BB2784 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 4397D2F61D0DE2DF00BB2784 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2F71D0DE2DF00BB2784 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */; }; + 4397D2F81D0DF44200BB2784 /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4397D2F91D0DF44A00BB2784 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -394,6 +506,9 @@ /* Begin PBXFileReference section */ 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 431BB7031D06D2C1006A3455 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+WebCache.h"; sourceTree = ""; }; + 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+WebCache.m"; sourceTree = ""; }; 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; @@ -533,6 +648,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4397D2B81D0DDD8C00BB2784 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFB1AB4BB5300B6BC39 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -617,6 +739,7 @@ 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */, 00733A4C1BC487C000A5A117 /* SDWebImage.framework */, 431BB7031D06D2C1006A3455 /* SDWebImage.framework */, + 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */, ); name = Products; sourceTree = ""; @@ -669,6 +792,8 @@ 53922D96148C56230056699D /* UIImageView+WebCache.m */, AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */, AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */, + 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */, + 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */, ); name = Categories; sourceTree = ""; @@ -841,6 +966,7 @@ 431739561CDFC8B70008FEB9 /* demux.h in Headers */, 431739111CDFC8AA0008FEB9 /* neon.h in Headers */, 4317394D1CDFC8B20008FEB9 /* utils.h in Headers */, + 4397D2F81D0DF44200BB2784 /* MKAnnotationView+WebCache.h in Headers */, 431739451CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, 4317390D1CDFC8AA0008FEB9 /* lossless.h in Headers */, @@ -898,7 +1024,6 @@ 431BB6D71D06D2C1006A3455 /* UIImage+WebP.h in Headers */, 431BB6D91D06D2C1006A3455 /* SDWebImageManager.h in Headers */, 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */, - 431BB6DF1D06D2C1006A3455 /* FLAnimatedImageView+WebCache.h in Headers */, 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */, 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */, 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */, @@ -916,6 +1041,63 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4397D2B91D0DDD8C00BB2784 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4397D2BA1D0DDD8C00BB2784 /* demux.h in Headers */, + 4397D2BB1D0DDD8C00BB2784 /* endian_inl.h in Headers */, + 4397D2BD1D0DDD8C00BB2784 /* types.h in Headers */, + 4397D2BE1D0DDD8C00BB2784 /* neon.h in Headers */, + 4397D2BF1D0DDD8C00BB2784 /* alphai.h in Headers */, + 4397D2C01D0DDD8C00BB2784 /* SDWebImage.h in Headers */, + 4397D2C11D0DDD8C00BB2784 /* format_constants.h in Headers */, + 4397D2C21D0DDD8C00BB2784 /* filters.h in Headers */, + 4397D2C31D0DDD8C00BB2784 /* SDWebImageManager.h in Headers */, + 4397D2C41D0DDD8C00BB2784 /* SDImageCache.h in Headers */, + 4397D2C51D0DDD8C00BB2784 /* UIImageView+WebCache.h in Headers */, + 4397D2C61D0DDD8C00BB2784 /* random.h in Headers */, + 4397D2C71D0DDD8C00BB2784 /* rescaler.h in Headers */, + 4397D2C81D0DDD8C00BB2784 /* SDWebImageCompat.h in Headers */, + 4397D2C91D0DDD8C00BB2784 /* bit_reader.h in Headers */, + 4397D2CB1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.h in Headers */, + 4397D2CC1D0DDD8C00BB2784 /* mux.h in Headers */, + 4397D2CD1D0DDD8C00BB2784 /* lossless.h in Headers */, + 4397D2CE1D0DDD8C00BB2784 /* huffman_encode.h in Headers */, + 4397D2CF1D0DDD8C00BB2784 /* yuv.h in Headers */, + 4397D2D01D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.h in Headers */, + 4397D2D11D0DDD8C00BB2784 /* decode.h in Headers */, + 4397D2D21D0DDD8C00BB2784 /* webpi.h in Headers */, + 4397D2D31D0DDD8C00BB2784 /* thread.h in Headers */, + 4397D2D41D0DDD8C00BB2784 /* quant_levels.h in Headers */, + 4397D2D51D0DDD8C00BB2784 /* bit_reader_inl.h in Headers */, + 4397D2D61D0DDD8C00BB2784 /* quant_levels_dec.h in Headers */, + 4397D2D81D0DDD8C00BB2784 /* UIButton+WebCache.h in Headers */, + 4397D2D91D0DDD8C00BB2784 /* SDWebImagePrefetcher.h in Headers */, + 4397D2DA1D0DDD8C00BB2784 /* UIView+WebCacheOperation.h in Headers */, + 4397D2DB1D0DDD8C00BB2784 /* UIImage+MultiFormat.h in Headers */, + 4397D2DC1D0DDD8C00BB2784 /* SDWebImageOperation.h in Headers */, + 4397D2DD1D0DDD8C00BB2784 /* vp8i.h in Headers */, + 4397D2F61D0DE2DF00BB2784 /* NSImage+WebCache.h in Headers */, + 4397D2DE1D0DDD8C00BB2784 /* vp8li.h in Headers */, + 4397D2DF1D0DDD8C00BB2784 /* color_cache.h in Headers */, + 4397D2E01D0DDD8C00BB2784 /* utils.h in Headers */, + 4397D2E11D0DDD8C00BB2784 /* SDWebImageDownloader.h in Headers */, + 4397D2E21D0DDD8C00BB2784 /* huffman.h in Headers */, + 4397D2E31D0DDD8C00BB2784 /* MKAnnotationView+WebCache.h in Headers */, + 4397D2E41D0DDD8C00BB2784 /* yuv_tables_sse2.h in Headers */, + 4397D2E51D0DDD8C00BB2784 /* bit_writer.h in Headers */, + 4397D2E61D0DDD8C00BB2784 /* encode.h in Headers */, + 4397D2E71D0DDD8C00BB2784 /* dsp.h in Headers */, + 4397D2E81D0DDD8C00BB2784 /* SDWebImageDecoder.h in Headers */, + 4397D2E91D0DDD8C00BB2784 /* UIImage+WebP.h in Headers */, + 4397D2EA1D0DDD8C00BB2784 /* UIImage+GIF.h in Headers */, + 4397D2EB1D0DDD8C00BB2784 /* NSData+ImageContentType.h in Headers */, + 4397D2EC1D0DDD8C00BB2784 /* decode_vp8.h in Headers */, + 4397D2ED1D0DDD8C00BB2784 /* mux_types.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFC1AB4BB5300B6BC39 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1072,6 +1254,24 @@ productReference = 431BB7031D06D2C1006A3455 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; + 4397D2761D0DDD8C00BB2784 /* SDWebImage OSX */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4397D2EF1D0DDD8C00BB2784 /* Build configuration list for PBXNativeTarget "SDWebImage OSX" */; + buildPhases = ( + 4397D2771D0DDD8C00BB2784 /* Sources */, + 4397D2B81D0DDD8C00BB2784 /* Frameworks */, + 4397D2B91D0DDD8C00BB2784 /* Headers */, + 4397D2EE1D0DDD8C00BB2784 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SDWebImage OSX"; + productName = WebImage; + productReference = 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */; + productType = "com.apple.product-type.framework"; + }; 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */; @@ -1141,6 +1341,7 @@ 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */, 00733A4B1BC487C000A5A117 /* SDWebImage tvOS */, 431BB6891D06D2C1006A3455 /* SDWebImage watchOS */, + 4397D2761D0DDD8C00BB2784 /* SDWebImage OSX */, ); }; /* End PBXProject section */ @@ -1160,6 +1361,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4397D2EE1D0DDD8C00BB2784 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFD1AB4BB5300B6BC39 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1224,6 +1432,7 @@ 431739081CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, 00733A581BC4880000A5A117 /* SDWebImageManager.m in Sources */, 431739001CDFC8AA0008FEB9 /* cpu.c in Sources */, + 4397D2F91D0DF44A00BB2784 /* MKAnnotationView+WebCache.m in Sources */, 00733A541BC4880000A5A117 /* SDWebImageCompat.m in Sources */, 4317393E1CDFC8B20008FEB9 /* huffman.c in Sources */, 431739151CDFC8AA0008FEB9 /* yuv.c in Sources */, @@ -1263,7 +1472,6 @@ files = ( 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */, 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */, - 431BB6901D06D2C1006A3455 /* FLAnimatedImageView+WebCache.m in Sources */, 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */, 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */, 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, @@ -1280,6 +1488,75 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4397D2771D0DDD8C00BB2784 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4397D2781D0DDD8C00BB2784 /* dec.c in Sources */, + 4397D2791D0DDD8C00BB2784 /* huffman.c in Sources */, + 4397D27A1D0DDD8C00BB2784 /* quant_levels.c in Sources */, + 4397D27B1D0DDD8C00BB2784 /* idec.c in Sources */, + 4397D27C1D0DDD8C00BB2784 /* random.c in Sources */, + 4397D27D1D0DDD8C00BB2784 /* alpha_processing_sse2.c in Sources */, + 4397D27E1D0DDD8C00BB2784 /* UIImage+GIF.m in Sources */, + 4397D27F1D0DDD8C00BB2784 /* UIImage+WebP.m in Sources */, + 4397D2F71D0DE2DF00BB2784 /* NSImage+WebCache.m in Sources */, + 4397D2801D0DDD8C00BB2784 /* enc_avx2.c in Sources */, + 4397D2821D0DDD8C00BB2784 /* rescaler.c in Sources */, + 4397D2831D0DDD8C00BB2784 /* dec_sse2.c in Sources */, + 4397D2841D0DDD8C00BB2784 /* upsampling_neon.c in Sources */, + 4397D2851D0DDD8C00BB2784 /* quant.c in Sources */, + 4397D2861D0DDD8C00BB2784 /* dec_mips32.c in Sources */, + 4397D2871D0DDD8C00BB2784 /* alpha_processing.c in Sources */, + 4397D2881D0DDD8C00BB2784 /* lossless_sse2.c in Sources */, + 4397D2891D0DDD8C00BB2784 /* enc_sse2.c in Sources */, + 4397D28A1D0DDD8C00BB2784 /* thread.c in Sources */, + 4397D28C1D0DDD8C00BB2784 /* UIImageView+WebCache.m in Sources */, + 4397D28D1D0DDD8C00BB2784 /* filters.c in Sources */, + 4397D28E1D0DDD8C00BB2784 /* yuv_mips32.c in Sources */, + 4397D28F1D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.m in Sources */, + 4397D2901D0DDD8C00BB2784 /* tree.c in Sources */, + 4397D2911D0DDD8C00BB2784 /* MKAnnotationView+WebCache.m in Sources */, + 4397D2921D0DDD8C00BB2784 /* SDWebImagePrefetcher.m in Sources */, + 4397D2931D0DDD8C00BB2784 /* yuv_sse2.c in Sources */, + 4397D2941D0DDD8C00BB2784 /* color_cache.c in Sources */, + 4397D2951D0DDD8C00BB2784 /* lossless_mips32.c in Sources */, + 4397D2961D0DDD8C00BB2784 /* UIImage+MultiFormat.m in Sources */, + 4397D2971D0DDD8C00BB2784 /* enc_mips32.c in Sources */, + 4397D2981D0DDD8C00BB2784 /* quant_levels_dec.c in Sources */, + 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */, + 4397D29A1D0DDD8C00BB2784 /* cpu.c in Sources */, + 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */, + 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */, + 4397D29D1D0DDD8C00BB2784 /* webp.c in Sources */, + 4397D29E1D0DDD8C00BB2784 /* yuv.c in Sources */, + 4397D29F1D0DDD8C00BB2784 /* bit_writer.c in Sources */, + 4397D2A01D0DDD8C00BB2784 /* vp8.c in Sources */, + 4397D2A11D0DDD8C00BB2784 /* SDWebImageManager.m in Sources */, + 4397D2A21D0DDD8C00BB2784 /* enc_neon.c in Sources */, + 4397D2A31D0DDD8C00BB2784 /* lossless_neon.c in Sources */, + 4397D2A41D0DDD8C00BB2784 /* dec_clip_tables.c in Sources */, + 4397D2A51D0DDD8C00BB2784 /* lossless.c in Sources */, + 4397D2A61D0DDD8C00BB2784 /* SDWebImageCompat.m in Sources */, + 4397D2A71D0DDD8C00BB2784 /* huffman_encode.c in Sources */, + 4397D2A81D0DDD8C00BB2784 /* UIButton+WebCache.m in Sources */, + 4397D2A91D0DDD8C00BB2784 /* upsampling.c in Sources */, + 4397D2AA1D0DDD8C00BB2784 /* io.c in Sources */, + 4397D2AB1D0DDD8C00BB2784 /* UIView+WebCacheOperation.m in Sources */, + 4397D2AC1D0DDD8C00BB2784 /* buffer.c in Sources */, + 4397D2AD1D0DDD8C00BB2784 /* SDWebImageDecoder.m in Sources */, + 4397D2AE1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.m in Sources */, + 4397D2AF1D0DDD8C00BB2784 /* upsampling_sse2.c in Sources */, + 4397D2B01D0DDD8C00BB2784 /* SDImageCache.m in Sources */, + 4397D2B21D0DDD8C00BB2784 /* frame.c in Sources */, + 4397D2B31D0DDD8C00BB2784 /* bit_reader.c in Sources */, + 4397D2B41D0DDD8C00BB2784 /* dec_neon.c in Sources */, + 4397D2B51D0DDD8C00BB2784 /* alpha.c in Sources */, + 4397D2B61D0DDD8C00BB2784 /* enc.c in Sources */, + 4397D2B71D0DDD8C00BB2784 /* utils.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2CADFA1AB4BB5300B6BC39 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1533,6 +1810,46 @@ }; name = Release; }; + 4397D2F01D0DDD8C00BB2784 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + INFOPLIST_FILE = WebImage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; + PRODUCT_NAME = SDWebImage; + SDKROOT = macosx; + }; + name = Debug; + }; + 4397D2F11D0DDD8C00BB2784 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = WebImage/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; + PRODUCT_NAME = SDWebImage; + SDKROOT = macosx; + }; + name = Release; + }; 4A2CAE131AB4BB5400B6BC39 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1726,6 +2043,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4397D2EF1D0DDD8C00BB2784 /* Build configuration list for PBXNativeTarget "SDWebImage OSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4397D2F01D0DDD8C00BB2784 /* Debug */, + 4397D2F11D0DDD8C00BB2784 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4A2CAE121AB4BB5400B6BC39 /* Build configuration list for PBXNativeTarget "SDWebImage iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX.xcscheme new file mode 100644 index 00000000..ab7eb094 --- /dev/null +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index e7610a36..ea1e5966 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -6,7 +6,9 @@ * file that was distributed with this source code. */ -#if TARGET_OS_IOS || TARGET_OS_TV +#import "SDWebImageCompat.h" + +#if SD_UIKIT #if COCOAPODS @import FLAnimatedImage; diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index eca04203..03918aab 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -6,7 +6,7 @@ * file that was distributed with this source code. */ -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT #import "FLAnimatedImageView+WebCache.h" #import "objc/runtime.h" diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index 5744ffd8..a7e7b743 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -6,6 +6,10 @@ * file that was distributed with this source code. */ +#import "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC + #import "MapKit/MapKit.h" #import "SDWebImageManager.h" @@ -114,3 +118,5 @@ - (void)sd_cancelCurrentImageLoad; @end + +#endif diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index 9b69fb5b..b5d82059 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -7,6 +7,9 @@ */ #import "MKAnnotationView+WebCache.h" + +#if SD_UIKIT || SD_MAC + #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" @@ -59,11 +62,19 @@ static char imageURLKey; return; } else if (image) { wself.image = image; +#if SD_UIKIT [wself setNeedsLayout]; +#elif SD_MAC + [wself setNeedsLayout:YES]; +#endif } else { if ((options & SDWebImageDelayPlaceholder)) { wself.image = placeholder; +#if SD_UIKIT [wself setNeedsLayout]; +#elif SD_MAC + [wself setNeedsDisplay:YES]; +#endif } } if (completedBlock && finished) { @@ -87,3 +98,5 @@ static char imageURLKey; } @end + +#endif diff --git a/SDWebImage/NSImage+WebCache.h b/SDWebImage/NSImage+WebCache.h new file mode 100644 index 00000000..de24f436 --- /dev/null +++ b/SDWebImage/NSImage+WebCache.h @@ -0,0 +1,22 @@ +// +// NSImage+WebCache.h +// SDWebImage +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "SDWebImageCompat.h" + +#if SD_MAC + +#import + +@interface NSImage (WebCache) + +- (NSArray *)images; +- (BOOL)isGIF; + +@end + +#endif diff --git a/SDWebImage/NSImage+WebCache.m b/SDWebImage/NSImage+WebCache.m new file mode 100644 index 00000000..ff511a5d --- /dev/null +++ b/SDWebImage/NSImage+WebCache.m @@ -0,0 +1,26 @@ +// +// NSImage+WebCache.m +// SDWebImage +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "NSImage+WebCache.h" + +#if SD_MAC + +@implementation NSImage (WebCache) + +- (NSArray *)images { + return nil; +} + +- (BOOL)isGIF { + return NO; +} + +@end + +#endif + diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 4727a3d1..6512767b 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -11,6 +11,8 @@ #import "UIImage+MultiFormat.h" #import #import "UIImage+GIF.h" +#import "NSData+ImageContentType.h" +#import "NSImage+WebCache.h" // See https://github.com/rs/SDWebImage/pull/1141 for discussion @interface AutoPurgeCache : NSCache @@ -21,7 +23,7 @@ - (nonnull instancetype)init { self = [super init]; if (self) { -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; #endif } @@ -29,7 +31,7 @@ } - (void)dealloc { -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; #endif } @@ -55,7 +57,11 @@ BOOL ImageDataHasPNGPreffix(NSData *data) { } FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { +#if SD_MAC + return image.size.height * image.size.width; +#elif SD_UIKIT || SD_WATCH return image.size.height * image.size.width * image.scale * image.scale; +#endif } @interface SDImageCache () @@ -129,7 +135,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { _fileManager = [NSFileManager new]; }); -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT // Subscribe to app events [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearMemory) @@ -214,7 +220,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSData *data = imageData; if (image && (recalculate || !data)) { -#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH +#if SD_UIKIT || SD_WATCH // We need to determine if the image is a PNG or a JPEG // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html) // The first eight bytes of a PNG file always contain the following (decimal) values: @@ -240,7 +246,17 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { data = UIImageJPEGRepresentation(image, (CGFloat)1.0); } #else - data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations usingType: NSJPEGFileType properties:nil]; + NSString *contentType = [NSData sd_contentTypeForImageData:data]; + NSBitmapImageFileType imageFileType = NSJPEGFileType; + if ([contentType isEqualToString:@"image/gif"]) { + imageFileType = NSGIFFileType; + } else if ([contentType isEqualToString:@"image/png"]) { + imageFileType = NSPNGFileType; + } + + data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations + usingType:imageFileType + properties:@{}]; #endif } @@ -592,7 +608,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT - (void)backgroundCleanDisk { Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index 3d4b48d8..0c886e61 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -10,14 +10,46 @@ #import #ifdef __OBJC_GC__ -#error SDWebImage does not support Objective-C Garbage Collection + #error SDWebImage does not support Objective-C Garbage Collection #endif -#if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 -#error SDWebImage doesn't support Deployment Target version < 5.0 +// Apple's defines from TargetConditionals.h are a bit weird. +// Seems like TARGET_OS_MAC is always defined (on all platforms). +// To determine if we are running on OSX, we can only relly on TARGET_OS_IPHONE=0 and all the other platforms +#if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH + #define SD_MAC 1 +#else + #define SD_MAC 0 #endif -#if !TARGET_OS_IPHONE +// iOS and tvOS are very similar, UIKit exists on both platforms +// Note: watchOS also has UIKit, but it's very limited +#if TARGET_OS_IOS || TARGET_OS_TV + #define SD_UIKIT 1 +#else + #define SD_UIKIT 0 +#endif + +#if TARGET_OS_IOS + #define SD_IOS 1 +#else + #define SD_IOS 0 +#endif + +#if TARGET_OS_TV + #define SD_TV 1 +#else + #define SD_TV 0 +#endif + +#if TARGET_OS_WATCH + #define SD_WATCH 1 +#else + #define SD_WATCH 0 +#endif + + +#if SD_MAC #import #ifndef UIImage #define UIImage NSImage @@ -25,9 +57,18 @@ #ifndef UIImageView #define UIImageView NSImageView #endif + #ifndef UIView + #define UIView NSView + #endif #else - #import - #if TARGET_OS_WATCH + #if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 + #error SDWebImage doesn't support Deployment Target version < 5.0 + #endif + + #if SD_UIKIT + #import + #endif + #if SD_WATCH #import #endif #endif @@ -46,10 +87,10 @@ #define SDDispatchQueueRelease(q) #define SDDispatchQueueSetterSementics strong #else -#undef SDDispatchQueueRelease -#undef SDDispatchQueueSetterSementics -#define SDDispatchQueueRelease(q) (dispatch_release(q)) -#define SDDispatchQueueSetterSementics assign + #undef SDDispatchQueueRelease + #undef SDDispatchQueueSetterSementics + #define SDDispatchQueueRelease(q) (dispatch_release(q)) + #define SDDispatchQueueSetterSementics assign #endif extern UIImage *SDScaledImageForKey(NSString *key, UIImage *image); diff --git a/SDWebImage/SDWebImageCompat.m b/SDWebImage/SDWebImageCompat.m index 1380f3d3..ade04be1 100644 --- a/SDWebImage/SDWebImageCompat.m +++ b/SDWebImage/SDWebImageCompat.m @@ -17,6 +17,9 @@ inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullabl return nil; } +#if SD_MAC + return image; +#elif SD_UIKIT || SD_WATCH if ((image.images).count > 0) { NSMutableArray *scaledImages = [NSMutableArray array]; @@ -27,9 +30,9 @@ inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullabl return [UIImage animatedImageWithImages:scaledImages duration:image.duration]; } else { -#if TARGET_OS_WATCH +#if SD_WATCH if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) { -#else +#elif SD_UIKIT if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { #endif CGFloat scale = 1; @@ -50,6 +53,7 @@ inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullabl } return image; } +#endif } NSString *const SDWebImageErrorDomain = @"SDWebImageErrorDomain"; diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 904fed21..cb450423 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -23,6 +23,9 @@ return nil; } +#if SD_MAC + return image; +#elif SD_UIKIT || SD_WATCH @autoreleasepool{ // do not decode animated images if (image.images != nil) { @@ -86,6 +89,7 @@ return imageWithoutAlpha; } +#endif } @end diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 766e683f..2a82deb7 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -11,6 +11,7 @@ #import "UIImage+MultiFormat.h" #import #import "SDWebImageManager.h" +#import "NSImage+WebCache.h" NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; @@ -41,7 +42,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; @property (strong, atomic, nullable) NSThread *thread; @property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; #endif @@ -49,7 +50,9 @@ typedef NSMutableDictionary SDCallbacksDictionary; @implementation SDWebImageDownloaderOperation { size_t width, height; +#if SD_UIKIT || SD_WATCH UIImageOrientation orientation; +#endif BOOL responseFromCached; } @@ -125,7 +128,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; return; } -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication && [self shouldContinueWhenAppEntersBackground]) { @@ -179,7 +182,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; } } -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { return; @@ -337,7 +340,9 @@ didReceiveResponse:(NSURLResponse *)response // which means the image below born of initWithCGIImage will be // oriented incorrectly sometimes. (Unlike the image born of initWithData // in didCompleteWithError.) So save it here and pass it on later. +#if SD_UIKIT || SD_WATCH orientation = [[self class] orientationFromPropertyValue:(orientationValue == -1 ? 1 : orientationValue)]; +#endif } } @@ -345,7 +350,7 @@ didReceiveResponse:(NSURLResponse *)response // Create the image CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); -#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH +#if SD_UIKIT || SD_WATCH // Workaround for iOS anamorphic image if (partialImageRef) { const size_t partialHeight = CGImageGetHeight(partialImageRef); @@ -366,7 +371,11 @@ didReceiveResponse:(NSURLResponse *)response #endif if (partialImageRef) { +#if SD_UIKIT || SD_WATCH UIImage *image = [UIImage imageWithCGImage:partialImageRef scale:1 orientation:orientation]; +#elif SD_MAC + UIImage *image = [[UIImage alloc] initWithCGImage:partialImageRef size:NSZeroSize]; +#endif NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; UIImage *scaledImage = [self scaledImageForKey:key image:image]; if (self.shouldDecompressImages) { @@ -500,6 +509,7 @@ didReceiveResponse:(NSURLResponse *)response #pragma mark Helper methods +#if SD_UIKIT || SD_WATCH + (UIImageOrientation)orientationFromPropertyValue:(NSInteger)value { switch (value) { case 1: @@ -522,6 +532,7 @@ didReceiveResponse:(NSURLResponse *)response return UIImageOrientationUp; } } +#endif - (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 1f8f00ab..e23c9e64 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -8,6 +8,7 @@ #import "SDWebImageManager.h" #import +#import "NSImage+WebCache.h" @interface SDWebImageCombinedOperation : NSObject diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index e0115010..fccc0584 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -7,9 +7,10 @@ */ #import "SDWebImageCompat.h" -#import "SDWebImageManager.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT + +#import "SDWebImageManager.h" /** * Integrates SDWebImage async downloading and caching of remote images with UIButtonView. diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 5ffaa576..4efda1f0 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -7,11 +7,12 @@ */ #import "UIButton+WebCache.h" + +#if SD_UIKIT + #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" -#if TARGET_OS_IOS || TARGET_OS_TV - static char imageURLStorageKey; typedef NSMutableDictionary SDStateImageURLDictionary; diff --git a/SDWebImage/UIImage+GIF.h b/SDWebImage/UIImage+GIF.h index a177969d..479d5723 100755 --- a/SDWebImage/UIImage+GIF.h +++ b/SDWebImage/UIImage+GIF.h @@ -7,10 +7,7 @@ * file that was distributed with this source code. */ -#import -#if TARGET_OS_WATCH - #import -#endif +#import "SDWebImageCompat.h" @interface UIImage (GIF) diff --git a/SDWebImage/UIImage+GIF.m b/SDWebImage/UIImage+GIF.m index e8bcca0c..9301777f 100755 --- a/SDWebImage/UIImage+GIF.m +++ b/SDWebImage/UIImage+GIF.m @@ -10,6 +10,7 @@ #import "UIImage+GIF.h" #import #import "objc/runtime.h" +#import "NSImage+WebCache.h" @implementation UIImage (GIF) @@ -29,17 +30,21 @@ } else { // we will only retrieve the 1st frame. the full GIF support is available via the FLAnimatedImageView category. // this here is only code to allow drawing animated images as static ones +#if SD_WATCH CGFloat scale = 1; -#if TARGET_OS_WATCH scale = [WKInterfaceDevice currentDevice].screenScale; -#else +#elif SD_UIKIT + CGFloat scale = 1; scale = [UIScreen mainScreen].scale; #endif - CGImageRef CGImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); +#if SD_UIKIT || SD_WATCH UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:scale orientation:UIImageOrientationUp]; staticImage = [UIImage animatedImageWithImages:@[frameImage] duration:0.0f]; +#elif SD_MAC + staticImage = [[UIImage alloc] initWithCGImage:CGImage size:NSZeroSize]; +#endif CGImageRelease(CGImage); } diff --git a/SDWebImage/UIImage+MultiFormat.h b/SDWebImage/UIImage+MultiFormat.h index d94c657a..a799929b 100644 --- a/SDWebImage/UIImage+MultiFormat.h +++ b/SDWebImage/UIImage+MultiFormat.h @@ -6,7 +6,7 @@ * file that was distributed with this source code. */ -#import +#import "SDWebImageCompat.h" @interface UIImage (MultiFormat) diff --git a/SDWebImage/UIImage+MultiFormat.m b/SDWebImage/UIImage+MultiFormat.m index 3c462d43..64cefbb3 100644 --- a/SDWebImage/UIImage+MultiFormat.m +++ b/SDWebImage/UIImage+MultiFormat.m @@ -35,19 +35,21 @@ #endif else { image = [[UIImage alloc] initWithData:data]; +#if SD_UIKIT || SD_WATCH UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data]; if (orientation != UIImageOrientationUp) { image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:orientation]; } +#endif } return image; } - +#if SD_UIKIT || SD_WATCH +(UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData { UIImageOrientation result = UIImageOrientationUp; CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); @@ -112,7 +114,7 @@ } return orientation; } - +#endif @end diff --git a/SDWebImage/UIImage+WebP.h b/SDWebImage/UIImage+WebP.h index 5e0de881..cd9f27b1 100644 --- a/SDWebImage/UIImage+WebP.h +++ b/SDWebImage/UIImage+WebP.h @@ -8,7 +8,7 @@ #ifdef SD_WEBP -#import +#import "SDWebImageCompat.h" @interface UIImage (WebP) diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index 91bec099..b4e34648 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -7,13 +7,9 @@ */ #ifdef SD_WEBP -#import "UIImage+WebP.h" -#if !COCOAPODS +#import "UIImage+WebP.h" #import "webp/decode.h" -#else -#import "webp/decode.h" -#endif // Callback for CGDataProviderRelease static void FreeImageData(void *info, const void *data, size_t size) { diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index 1605b97d..c0775c45 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -6,11 +6,11 @@ * file that was distributed with this source code. */ -#import #import "SDWebImageCompat.h" -#import "SDWebImageManager.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT + +#import "SDWebImageManager.h" /** * Integrates SDWebImage async downloading and caching of remote images with UIImageView for highlighted state. diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index fe581b8b..f853697d 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -7,9 +7,10 @@ */ #import "UIImageView+HighlightedWebCache.h" -#import "UIView+WebCacheOperation.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT + +#import "UIView+WebCacheOperation.h" #define UIImageViewHighlightedWebCacheOperationKey @"highlightedImage" diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index a41102b1..8e998f4d 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -7,9 +7,10 @@ */ #import "SDWebImageCompat.h" -#import "SDWebImageManager.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT || SD_MAC + +#import "SDWebImageManager.h" /** * Integrates SDWebImage async downloading and caching of remote images with UIImageView. @@ -181,18 +182,21 @@ progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock; +#if SD_UIKIT /** * Download an array of images and starts them in an animation loop * * @param arrayOfURLs An array of NSURL */ - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs; +#endif /** * Cancel the current download */ - (void)sd_cancelCurrentImageLoad; +#if SD_UIKIT - (void)sd_cancelCurrentAnimationImagesLoad; /** @@ -210,7 +214,7 @@ - (BOOL)showActivityIndicatorView; - (void)addActivityIndicator; - (void)removeActivityIndicator; - +#endif @end diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 5f2bca56..e71ef1ce 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -7,14 +7,17 @@ */ #import "UIImageView+WebCache.h" + +#if SD_UIKIT || SD_MAC + #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" -#if TARGET_OS_IOS || TARGET_OS_TV - static char imageURLKey; +#if SD_UIKIT static char TAG_ACTIVITY_INDICATOR; static char TAG_ACTIVITY_STYLE; +#endif static char TAG_ACTIVITY_SHOW; @implementation UIImageView (WebCache) @@ -77,11 +80,19 @@ static char TAG_ACTIVITY_SHOW; } else if (image) { wself.image = image; +#if SD_UIKIT [wself setNeedsLayout]; +#elif SD_MAC + [wself setNeedsLayout:YES]; +#endif } else { if ((options & SDWebImageDelayPlaceholder)) { wself.image = placeholder; +#if SD_UIKIT [wself setNeedsLayout]; +#elif SD_MAC + [wself setNeedsLayout:YES]; +#endif } } if (completedBlock && finished) { @@ -116,6 +127,7 @@ static char TAG_ACTIVITY_SHOW; return objc_getAssociatedObject(self, &imageURLKey); } +#if SD_UIKIT - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; __weak __typeof(self)wself = self; @@ -146,17 +158,20 @@ static char TAG_ACTIVITY_SHOW; [self sd_setImageLoadOperation:[operationsArray copy] forKey:@"UIImageViewAnimationImages"]; } +#endif - (void)sd_cancelCurrentImageLoad { [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; } +#if SD_UIKIT - (void)sd_cancelCurrentAnimationImagesLoad { [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimationImages"]; } - +#endif #pragma mark - +#if SD_UIKIT - (UIActivityIndicatorView *)activityIndicator { return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); } @@ -164,6 +179,7 @@ static char TAG_ACTIVITY_SHOW; - (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); } +#endif - (void)setShowActivityIndicatorView:(BOOL)show { objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); @@ -173,6 +189,7 @@ static char TAG_ACTIVITY_SHOW; return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; } +#if SD_UIKIT - (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); } @@ -180,8 +197,10 @@ static char TAG_ACTIVITY_SHOW; - (int)getIndicatorStyle{ return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; } +#endif - (void)addActivityIndicator { +#if SD_UIKIT if (!self.activityIndicator) { self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self getIndicatorStyle]]; self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; @@ -209,14 +228,16 @@ static char TAG_ACTIVITY_SHOW; dispatch_main_async_safe(^{ [self.activityIndicator startAnimating]; }); - +#endif } - (void)removeActivityIndicator { +#if SD_UIKIT if (self.activityIndicator) { [self.activityIndicator removeFromSuperview]; self.activityIndicator = nil; } +#endif } @end diff --git a/SDWebImage/UIView+WebCacheOperation.h b/SDWebImage/UIView+WebCacheOperation.h index 1c6fa235..f5e95fa6 100644 --- a/SDWebImage/UIView+WebCacheOperation.h +++ b/SDWebImage/UIView+WebCacheOperation.h @@ -6,10 +6,11 @@ * file that was distributed with this source code. */ -#import -#import "SDWebImageManager.h" +#import "SDWebImageCompat.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT || SD_MAC + +#import "SDWebImageManager.h" @interface UIView (WebCacheOperation) diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index dd607f97..7742473c 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -7,9 +7,10 @@ */ #import "UIView+WebCacheOperation.h" -#import "objc/runtime.h" -#if TARGET_OS_IOS || TARGET_OS_TV +#if SD_UIKIT || SD_MAC + +#import "objc/runtime.h" static char loadOperationKey; diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h index 4ecf5bd2..f23c46ef 100644 --- a/WebImage/SDWebImage.h +++ b/WebImage/SDWebImage.h @@ -29,7 +29,7 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; #import #import #import -#if !TARGET_OS_TV +#if SD_MAC || SD_UIKIT #import #endif #import From 442b134206a3660986b557f620b2ddd0a39c59b2 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 00:09:55 +0300 Subject: [PATCH 076/207] OSX Example --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 233 +++++- .../xcschemes/SDWebImage OSX Demo.xcscheme | 91 +++ Examples/SDWebImage OSX Demo/AppDelegate.h | 15 + Examples/SDWebImage OSX Demo/AppDelegate.m | 25 + .../AppIcon.appiconset/Contents.json | 58 ++ .../Base.lproj/Main.storyboard | 706 ++++++++++++++++++ Examples/SDWebImage OSX Demo/Info.plist | 39 + Examples/SDWebImage OSX Demo/ViewController.h | 15 + Examples/SDWebImage OSX Demo/ViewController.m | 42 ++ Examples/SDWebImage OSX Demo/main.m | 13 + SDWebImage.xcodeproj/project.pbxproj | 6 +- ....xcscheme => SDWebImage iOS Demo.xcscheme} | 16 +- SDWebImage/UIImage+WebP.m | 4 + WebImage/SDWebImage.h | 8 +- 14 files changed, 1251 insertions(+), 20 deletions(-) create mode 100644 Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme create mode 100644 Examples/SDWebImage OSX Demo/AppDelegate.h create mode 100644 Examples/SDWebImage OSX Demo/AppDelegate.m create mode 100644 Examples/SDWebImage OSX Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/SDWebImage OSX Demo/Base.lproj/Main.storyboard create mode 100644 Examples/SDWebImage OSX Demo/Info.plist create mode 100644 Examples/SDWebImage OSX Demo/ViewController.h create mode 100644 Examples/SDWebImage OSX Demo/ViewController.m create mode 100644 Examples/SDWebImage OSX Demo/main.m rename SDWebImage.xcworkspace/xcshareddata/xcschemes/{SDWebImage Demo.xcscheme => SDWebImage iOS Demo.xcscheme} (87%) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index c5413158..a4276162 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -9,6 +9,12 @@ /* Begin PBXBuildFile section */ 3E75A9861742DBE700DA412D /* CustomPathImages in Resources */ = {isa = PBXBuildFile; fileRef = 3E75A9851742DBE700DA412D /* CustomPathImages */; }; 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage.a */; }; + 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D21D0DFD000089D7DD /* AppDelegate.m */; }; + 43A629D61D0DFD000089D7DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D51D0DFD000089D7DD /* main.m */; }; + 43A629D91D0DFD000089D7DD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D81D0DFD000089D7DD /* ViewController.m */; }; + 43A629DB1D0DFD000089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A629DA1D0DFD000089D7DD /* Assets.xcassets */; }; + 43A629DE1D0DFD000089D7DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43A629DC1D0DFD000089D7DD /* Main.storyboard */; }; + 43A629EB1D0DFDD40089D7DD /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A629E71D0DFD000089D7DD /* SDWebImage.framework */; }; 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E6155ABA44005750A4 /* ImageIO.framework */; }; 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53761299155AB74D005750A4 /* UIKit.framework */; }; 5376129C155AB74D005750A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5376129B155AB74D005750A4 /* Foundation.framework */; }; @@ -54,6 +60,20 @@ remoteGlobalIDString = 4A2CADFF1AB4BB5300B6BC39; remoteInfo = WebImage; }; + 43A629E61D0DFD000089D7DD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4397D2F21D0DDD8C00BB2784; + remoteInfo = "SDWebImage OSX"; + }; + 43A629E91D0DFDCA0089D7DD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 4397D2761D0DDD8C00BB2784; + remoteInfo = "SDWebImage OSX"; + }; DA248D731954841D00390AB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -65,7 +85,16 @@ /* Begin PBXFileReference section */ 3E75A9851742DBE700DA412D /* CustomPathImages */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CustomPathImages; sourceTree = SOURCE_ROOT; }; - 53761295155AB74D005750A4 /* SDWebImage Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage OSX Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A629D11D0DFD000089D7DD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 43A629D21D0DFD000089D7DD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 43A629D51D0DFD000089D7DD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 43A629D71D0DFD000089D7DD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 43A629D81D0DFD000089D7DD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 43A629DA1D0DFD000089D7DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 43A629DD1D0DFD000089D7DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 43A629DF1D0DFD000089D7DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53761295155AB74D005750A4 /* SDWebImage iOS Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage iOS Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 53761299155AB74D005750A4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 5376129B155AB74D005750A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5376129D155AB74D005750A4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -89,6 +118,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 43A629CC1D0DFD000089D7DD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A629EB1D0DFDD40089D7DD /* SDWebImage.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761292155AB74D005750A4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -105,11 +142,35 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 43A629D01D0DFD000089D7DD /* SDWebImage OSX Demo */ = { + isa = PBXGroup; + children = ( + 43A629D11D0DFD000089D7DD /* AppDelegate.h */, + 43A629D21D0DFD000089D7DD /* AppDelegate.m */, + 43A629D71D0DFD000089D7DD /* ViewController.h */, + 43A629D81D0DFD000089D7DD /* ViewController.m */, + 43A629DA1D0DFD000089D7DD /* Assets.xcassets */, + 43A629DC1D0DFD000089D7DD /* Main.storyboard */, + 43A629DF1D0DFD000089D7DD /* Info.plist */, + 43A629D41D0DFD000089D7DD /* Supporting Files */, + ); + path = "SDWebImage OSX Demo"; + sourceTree = ""; + }; + 43A629D41D0DFD000089D7DD /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 43A629D51D0DFD000089D7DD /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 5376128A155AB74D005750A4 = { isa = PBXGroup; children = ( DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */, 5376129F155AB74D005750A4 /* SDWebImage Demo */, + 43A629D01D0DFD000089D7DD /* SDWebImage OSX Demo */, 53761298155AB74D005750A4 /* Frameworks */, 53761296155AB74D005750A4 /* Products */, ); @@ -118,7 +179,8 @@ 53761296155AB74D005750A4 /* Products */ = { isa = PBXGroup; children = ( - 53761295155AB74D005750A4 /* SDWebImage Demo.app */, + 53761295155AB74D005750A4 /* SDWebImage iOS Demo.app */, + 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */, ); name = Products; sourceTree = ""; @@ -172,6 +234,7 @@ 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */, 431739601CDFCC370008FEB9 /* SDWebImage.framework */, 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */, + 43A629E71D0DFD000089D7DD /* SDWebImage.framework */, ); name = Products; sourceTree = ""; @@ -179,9 +242,27 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 53761294155AB74D005750A4 /* SDWebImage Demo */ = { + 43A629CE1D0DFD000089D7DD /* SDWebImage OSX Demo */ = { isa = PBXNativeTarget; - buildConfigurationList = 537612B9155AB74D005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage Demo" */; + buildConfigurationList = 43A629E81D0DFD000089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage OSX Demo" */; + buildPhases = ( + 43A629CB1D0DFD000089D7DD /* Sources */, + 43A629CC1D0DFD000089D7DD /* Frameworks */, + 43A629CD1D0DFD000089D7DD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 43A629EA1D0DFDCA0089D7DD /* PBXTargetDependency */, + ); + name = "SDWebImage OSX Demo"; + productName = "SDWebImage OSX Demo"; + productReference = 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */; + productType = "com.apple.product-type.application"; + }; + 53761294155AB74D005750A4 /* SDWebImage iOS Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 537612B9155AB74D005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage iOS Demo" */; buildPhases = ( 53761291155AB74D005750A4 /* Sources */, 53761292155AB74D005750A4 /* Frameworks */, @@ -192,9 +273,9 @@ dependencies = ( 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */, ); - name = "SDWebImage Demo"; + name = "SDWebImage iOS Demo"; productName = "SDWebImage Demo"; - productReference = 53761295155AB74D005750A4 /* SDWebImage Demo.app */; + productReference = 53761295155AB74D005750A4 /* SDWebImage iOS Demo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -205,6 +286,11 @@ attributes = { LastUpgradeCheck = 0710; ORGANIZATIONNAME = Dailymotion; + TargetAttributes = { + 43A629CE1D0DFD000089D7DD = { + CreatedOnToolsVersion = 7.3.1; + }; + }; }; buildConfigurationList = 5376128F155AB74D005750A4 /* Build configuration list for PBXProject "SDWebImage Demo" */; compatibilityVersion = "Xcode 3.2"; @@ -212,6 +298,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 5376128A155AB74D005750A4; productRefGroup = 53761296155AB74D005750A4 /* Products */; @@ -224,7 +311,8 @@ ); projectRoot = ""; targets = ( - 53761294155AB74D005750A4 /* SDWebImage Demo */, + 53761294155AB74D005750A4 /* SDWebImage iOS Demo */, + 43A629CE1D0DFD000089D7DD /* SDWebImage OSX Demo */, ); }; /* End PBXProject section */ @@ -251,6 +339,13 @@ remoteRef = 43A0FAAE1BDD16AC00B7582B /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A629E71D0DFD000089D7DD /* SDWebImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SDWebImage.framework; + remoteRef = 43A629E61D0DFD000089D7DD /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; DA248D741954841D00390AB0 /* libSDWebImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -261,6 +356,15 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 43A629CD1D0DFD000089D7DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A629DB1D0DFD000089D7DD /* Assets.xcassets in Resources */, + 43A629DE1D0DFD000089D7DD /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761293155AB74D005750A4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -277,6 +381,16 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 43A629CB1D0DFD000089D7DD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A629D91D0DFD000089D7DD /* ViewController.m in Sources */, + 43A629D61D0DFD000089D7DD /* main.m in Sources */, + 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761291155AB74D005750A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -296,9 +410,22 @@ name = SDWebImage; targetProxy = 431739681CDFCCDE0008FEB9 /* PBXContainerItemProxy */; }; + 43A629EA1D0DFDCA0089D7DD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage OSX"; + targetProxy = 43A629E91D0DFDCA0089D7DD /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 43A629DC1D0DFD000089D7DD /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 43A629DD1D0DFD000089D7DD /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; 537612B1155AB74D005750A4 /* MasterViewController.xib */ = { isa = PBXVariantGroup; children = ( @@ -318,6 +445,84 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 43A629E01D0DFD000089D7DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage OSX Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-OSX-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + 43A629E11D0DFD000089D7DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage OSX Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-OSX-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; 537612B7155AB74D005750A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -340,7 +545,6 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; }; name = Debug; }; @@ -358,7 +562,6 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; @@ -382,6 +585,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; WRAPPER_EXTENSION = app; }; name = Debug; @@ -404,6 +608,7 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; WRAPPER_EXTENSION = app; }; name = Release; @@ -411,6 +616,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 43A629E81D0DFD000089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage OSX Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43A629E01D0DFD000089D7DD /* Debug */, + 43A629E11D0DFD000089D7DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 5376128F155AB74D005750A4 /* Build configuration list for PBXProject "SDWebImage Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -420,7 +633,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 537612B9155AB74D005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage Demo" */ = { + 537612B9155AB74D005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage iOS Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( 537612BA155AB74D005750A4 /* Debug */, diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme new file mode 100644 index 00000000..ec237513 --- /dev/null +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage OSX Demo/AppDelegate.h b/Examples/SDWebImage OSX Demo/AppDelegate.h new file mode 100644 index 00000000..ea817525 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/AppDelegate.h @@ -0,0 +1,15 @@ +// +// AppDelegate.h +// SDWebImage OSX Demo +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface AppDelegate : NSObject + + +@end + diff --git a/Examples/SDWebImage OSX Demo/AppDelegate.m b/Examples/SDWebImage OSX Demo/AppDelegate.m new file mode 100644 index 00000000..8ec881f5 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/AppDelegate.m @@ -0,0 +1,25 @@ +// +// AppDelegate.m +// SDWebImage OSX Demo +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +@end diff --git a/Examples/SDWebImage OSX Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/SDWebImage OSX Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..2db2b1c7 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage OSX Demo/Base.lproj/Main.storyboard b/Examples/SDWebImage OSX Demo/Base.lproj/Main.storyboard new file mode 100644 index 00000000..29684e48 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/Base.lproj/Main.storyboard @@ -0,0 +1,706 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage OSX Demo/Info.plist b/Examples/SDWebImage OSX Demo/Info.plist new file mode 100644 index 00000000..65d439aa --- /dev/null +++ b/Examples/SDWebImage OSX Demo/Info.plist @@ -0,0 +1,39 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2016 Dailymotion. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/Examples/SDWebImage OSX Demo/ViewController.h b/Examples/SDWebImage OSX Demo/ViewController.h new file mode 100644 index 00000000..fe44811e --- /dev/null +++ b/Examples/SDWebImage OSX Demo/ViewController.h @@ -0,0 +1,15 @@ +// +// ViewController.h +// SDWebImage OSX Demo +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface ViewController : NSViewController + + +@end + diff --git a/Examples/SDWebImage OSX Demo/ViewController.m b/Examples/SDWebImage OSX Demo/ViewController.m new file mode 100644 index 00000000..56166279 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/ViewController.m @@ -0,0 +1,42 @@ +// +// ViewController.m +// SDWebImage OSX Demo +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "ViewController.h" + +@import SDWebImage; + +@interface ViewController () + +@property (weak) IBOutlet NSImageView *imageView1; +@property (weak) IBOutlet NSImageView *imageView2; +@property (weak) IBOutlet NSImageView *imageView3; +@property (weak) IBOutlet NSImageView *imageView4; + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // NOTE: https links or authentication ones do not work (there is a crash) + +// Do any additional setup after loading the view. + [self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"http://assets.sbnation.com/assets/2512203/dogflops.gif"]]; + [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]]; + [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]]; + [self.imageView4 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"]]; +} + +- (void)setRepresentedObject:(id)representedObject { + [super setRepresentedObject:representedObject]; + + // Update the view, if already loaded. +} + +@end diff --git a/Examples/SDWebImage OSX Demo/main.m b/Examples/SDWebImage OSX Demo/main.m new file mode 100644 index 00000000..e49dcdc1 --- /dev/null +++ b/Examples/SDWebImage OSX Demo/main.m @@ -0,0 +1,13 @@ +// +// main.m +// SDWebImage OSX Demo +// +// Created by Bogdan on 12/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +int main(int argc, const char * argv[]) { + return NSApplicationMain(argc, argv); +} diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index d68dc3dd..fb7fb28f 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -1945,6 +1945,7 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( + "SD_WEBP=1", "DEBUG=1", "$(inherited)", ); @@ -1998,7 +1999,10 @@ ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "SD_WEBP=1", + "$(inherited)", + ); GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage Demo.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme similarity index 87% rename from SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage Demo.xcscheme rename to SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme index e9d725b8..1c16b25f 100644 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage Demo.xcscheme +++ b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme @@ -15,8 +15,8 @@ @@ -33,8 +33,8 @@ @@ -56,8 +56,8 @@ @@ -75,8 +75,8 @@ diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index b4e34648..66d8a072 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -55,7 +55,11 @@ static void FreeImageData(void *info, const void *data, size_t size) { CGColorSpaceRelease(colorSpaceRef); CGDataProviderRelease(provider); +#if SD_UIKIT || SD_WATCH UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; +#else + UIImage *image = [[UIImage alloc] initWithCGImage:imageRef size:NSZeroSize]; +#endif CGImageRelease(imageRef); return image; diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h index f23c46ef..c997f138 100644 --- a/WebImage/SDWebImage.h +++ b/WebImage/SDWebImage.h @@ -7,7 +7,11 @@ * file that was distributed with this source code. */ +#import + +#if SD_UIKIT #import +#endif //! Project version number for WebImage. FOUNDATION_EXPORT double WebImageVersionNumber; @@ -20,7 +24,6 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; #import #import #import -#import #import #import #import @@ -36,3 +39,6 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; #import #import #import +#if SD_MAC +#import +#endif From 683c7edce5dfe8f44b3c48249454c674c74b44d0 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 00:53:08 +0300 Subject: [PATCH 077/207] watchOS Demo, created a static watchos lib target, renamed static SDWebImage to "SDWebImage iOS static", added the webp files to all targets (as libwebp is compatible with all 4 platforms). Updated Travis CI --- .travis.yml | 9 +- .../SDWebImage Demo.xcodeproj/project.pbxproj | 398 ++++++++++++++ .../xcschemes/SDWebImage Watch Demo.xcscheme | 141 +++++ .../README__ignoredByTemplate__ | 1 + .../ExtensionDelegate.h | 13 + .../ExtensionDelegate.m | 26 + .../Info.plist | 43 ++ .../InterfaceController.h | 14 + .../InterfaceController.m | 46 ++ .../NotificationController.h | 14 + .../NotificationController.m | 64 +++ .../PushNotificationPayload.apns | 18 + .../AppIcon.appiconset/Contents.json | 55 ++ .../Base.lproj/Interface.storyboard | 46 ++ Examples/SDWebImage Watch Demo/Info.plist | 35 ++ SDWebImage.xcodeproj/project.pbxproj | 484 +++++++++++++++++- ...cscheme => SDWebImage iOS static.xcscheme} | 4 +- .../SDWebImage watchOS static.xcscheme | 80 +++ 18 files changed, 1475 insertions(+), 16 deletions(-) create mode 100644 Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme create mode 100644 Examples/SDWebImage Watch Demo Extension/Assets.xcassets/README__ignoredByTemplate__ create mode 100644 Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h create mode 100644 Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m create mode 100644 Examples/SDWebImage Watch Demo Extension/Info.plist create mode 100644 Examples/SDWebImage Watch Demo Extension/InterfaceController.h create mode 100644 Examples/SDWebImage Watch Demo Extension/InterfaceController.m create mode 100644 Examples/SDWebImage Watch Demo Extension/NotificationController.h create mode 100644 Examples/SDWebImage Watch Demo Extension/NotificationController.m create mode 100644 Examples/SDWebImage Watch Demo Extension/PushNotificationPayload.apns create mode 100644 Examples/SDWebImage Watch Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Examples/SDWebImage Watch Demo/Base.lproj/Interface.storyboard create mode 100644 Examples/SDWebImage Watch Demo/Info.plist rename SDWebImage.xcodeproj/xcshareddata/xcschemes/{SDWebImage-static.xcscheme => SDWebImage iOS static.xcscheme} (95%) create mode 100644 SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS static.xcscheme diff --git a/.travis.yml b/.travis.yml index e59092b5..8394487f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,8 @@ script: - pod lib lint --allow-warnings - echo Build as static library - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage-static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage watchOS static' -sdk watchsimulator -configuration Debug | xcpretty -c - echo Build as dynamic framework - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX' -sdk macosx -configuration Debug | xcpretty -c @@ -35,8 +36,10 @@ script: - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage tvOS' -sdk appletvsimulator -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage watchOS' -sdk watchsimulator -configuration Debug | xcpretty -c - - echo Build the Demo app - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - echo Build the Demo apps + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Watch Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - echo Run the tests - pod install --project-directory=Tests diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index a4276162..dde3e2af 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 3E75A9861742DBE700DA412D /* CustomPathImages in Resources */ = {isa = PBXBuildFile; fileRef = 3E75A9851742DBE700DA412D /* CustomPathImages */; }; + 4314D1A11D0E0EE2004B36C9 /* libSDWebImage watchOS static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */; }; 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage.a */; }; 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D21D0DFD000089D7DD /* AppDelegate.m */; }; 43A629D61D0DFD000089D7DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D51D0DFD000089D7DD /* main.m */; }; @@ -15,6 +16,14 @@ 43A629DB1D0DFD000089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A629DA1D0DFD000089D7DD /* Assets.xcassets */; }; 43A629DE1D0DFD000089D7DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43A629DC1D0DFD000089D7DD /* Main.storyboard */; }; 43A629EB1D0DFDD40089D7DD /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A629E71D0DFD000089D7DD /* SDWebImage.framework */; }; + 43A629F21D0E07600089D7DD /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43A629F01D0E07600089D7DD /* Interface.storyboard */; }; + 43A629F41D0E07600089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A629F31D0E07600089D7DD /* Assets.xcassets */; }; + 43A629FB1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 43A629FA1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 43A62A031D0E07600089D7DD /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A62A021D0E07600089D7DD /* InterfaceController.m */; }; + 43A62A061D0E07600089D7DD /* ExtensionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A62A051D0E07600089D7DD /* ExtensionDelegate.m */; }; + 43A62A091D0E07600089D7DD /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A62A081D0E07600089D7DD /* NotificationController.m */; }; + 43A62A0B1D0E07600089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A62A0A1D0E07600089D7DD /* Assets.xcassets */; }; + 43A62A0F1D0E07600089D7DD /* SDWebImage Watch Demo.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */; }; 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E6155ABA44005750A4 /* ImageIO.framework */; }; 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53761299155AB74D005750A4 /* UIKit.framework */; }; 5376129C155AB74D005750A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5376129B155AB74D005750A4 /* Foundation.framework */; }; @@ -32,6 +41,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4314D19D1D0E0EB6004B36C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4314D1991D0E0E3B004B36C9; + remoteInfo = "SDWebImage watchOS static"; + }; + 4314D19F1D0E0EBD004B36C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 4314D11B1D0E0E3B004B36C9; + remoteInfo = "SDWebImage watchOS static"; + }; 4317395F1CDFCC370008FEB9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -74,6 +97,20 @@ remoteGlobalIDString = 4397D2761D0DDD8C00BB2784; remoteInfo = "SDWebImage OSX"; }; + 43A629FC1D0E07600089D7DD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5376128C155AB74D005750A4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 43A629F91D0E07600089D7DD; + remoteInfo = "SDWebImage Watch Demo Extension"; + }; + 43A62A0D1D0E07600089D7DD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5376128C155AB74D005750A4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 43A629ED1D0E07600089D7DD; + remoteInfo = "SDWebImage Watch Demo"; + }; DA248D731954841D00390AB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -83,6 +120,31 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 43A62A131D0E07600089D7DD /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 43A629FB1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 43A62A171D0E07600089D7DD /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 43A62A0F1D0E07600089D7DD /* SDWebImage Watch Demo.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 3E75A9851742DBE700DA412D /* CustomPathImages */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CustomPathImages; sourceTree = SOURCE_ROOT; }; 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage OSX Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -94,6 +156,20 @@ 43A629DA1D0DFD000089D7DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43A629DD1D0DFD000089D7DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 43A629DF1D0DFD000089D7DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage Watch Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A629F11D0E07600089D7DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + 43A629F31D0E07600089D7DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 43A629F51D0E07600089D7DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 43A629FA1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SDWebImage Watch Demo Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 43A62A001D0E07600089D7DD /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + 43A62A011D0E07600089D7DD /* InterfaceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = ""; }; + 43A62A021D0E07600089D7DD /* InterfaceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = ""; }; + 43A62A041D0E07600089D7DD /* ExtensionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtensionDelegate.h; sourceTree = ""; }; + 43A62A051D0E07600089D7DD /* ExtensionDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExtensionDelegate.m; sourceTree = ""; }; + 43A62A071D0E07600089D7DD /* NotificationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationController.h; sourceTree = ""; }; + 43A62A081D0E07600089D7DD /* NotificationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationController.m; sourceTree = ""; }; + 43A62A0A1D0E07600089D7DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 43A62A0C1D0E07600089D7DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53761295155AB74D005750A4 /* SDWebImage iOS Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage iOS Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 53761299155AB74D005750A4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 5376129B155AB74D005750A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -126,6 +202,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 43A629F71D0E07600089D7DD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D1A11D0E0EE2004B36C9 /* libSDWebImage watchOS static.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761292155AB74D005750A4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -165,12 +249,48 @@ name = "Supporting Files"; sourceTree = ""; }; + 43A629EF1D0E07600089D7DD /* SDWebImage Watch Demo */ = { + isa = PBXGroup; + children = ( + 43A629F01D0E07600089D7DD /* Interface.storyboard */, + 43A629F31D0E07600089D7DD /* Assets.xcassets */, + 43A629F51D0E07600089D7DD /* Info.plist */, + ); + path = "SDWebImage Watch Demo"; + sourceTree = ""; + }; + 43A629FE1D0E07600089D7DD /* SDWebImage Watch Demo Extension */ = { + isa = PBXGroup; + children = ( + 43A62A011D0E07600089D7DD /* InterfaceController.h */, + 43A62A021D0E07600089D7DD /* InterfaceController.m */, + 43A62A041D0E07600089D7DD /* ExtensionDelegate.h */, + 43A62A051D0E07600089D7DD /* ExtensionDelegate.m */, + 43A62A071D0E07600089D7DD /* NotificationController.h */, + 43A62A081D0E07600089D7DD /* NotificationController.m */, + 43A62A0A1D0E07600089D7DD /* Assets.xcassets */, + 43A62A0C1D0E07600089D7DD /* Info.plist */, + 43A629FF1D0E07600089D7DD /* Supporting Files */, + ); + path = "SDWebImage Watch Demo Extension"; + sourceTree = ""; + }; + 43A629FF1D0E07600089D7DD /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 43A62A001D0E07600089D7DD /* PushNotificationPayload.apns */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 5376128A155AB74D005750A4 = { isa = PBXGroup; children = ( DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */, 5376129F155AB74D005750A4 /* SDWebImage Demo */, 43A629D01D0DFD000089D7DD /* SDWebImage OSX Demo */, + 43A629EF1D0E07600089D7DD /* SDWebImage Watch Demo */, + 43A629FE1D0E07600089D7DD /* SDWebImage Watch Demo Extension */, 53761298155AB74D005750A4 /* Frameworks */, 53761296155AB74D005750A4 /* Products */, ); @@ -181,6 +301,8 @@ children = ( 53761295155AB74D005750A4 /* SDWebImage iOS Demo.app */, 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */, + 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */, + 43A629FA1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex */, ); name = Products; sourceTree = ""; @@ -231,6 +353,7 @@ isa = PBXGroup; children = ( DA248D741954841D00390AB0 /* libSDWebImage.a */, + 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */, 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */, 431739601CDFCC370008FEB9 /* SDWebImage.framework */, 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */, @@ -260,6 +383,41 @@ productReference = 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */; productType = "com.apple.product-type.application"; }; + 43A629ED1D0E07600089D7DD /* SDWebImage Watch Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43A62A141D0E07600089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage Watch Demo" */; + buildPhases = ( + 43A629EC1D0E07600089D7DD /* Resources */, + 43A62A131D0E07600089D7DD /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 43A629FD1D0E07600089D7DD /* PBXTargetDependency */, + ); + name = "SDWebImage Watch Demo"; + productName = "SDWebImage Watch Demo"; + productReference = 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */; + productType = "com.apple.product-type.application.watchapp2"; + }; + 43A629F91D0E07600089D7DD /* SDWebImage Watch Demo Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 43A62A101D0E07600089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage Watch Demo Extension" */; + buildPhases = ( + 43A629F61D0E07600089D7DD /* Sources */, + 43A629F71D0E07600089D7DD /* Frameworks */, + 43A629F81D0E07600089D7DD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4314D1A01D0E0EBD004B36C9 /* PBXTargetDependency */, + ); + name = "SDWebImage Watch Demo Extension"; + productName = "SDWebImage Watch Demo Extension"; + productReference = 43A629FA1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex */; + productType = "com.apple.product-type.watchkit2-extension"; + }; 53761294155AB74D005750A4 /* SDWebImage iOS Demo */ = { isa = PBXNativeTarget; buildConfigurationList = 537612B9155AB74D005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage iOS Demo" */; @@ -267,11 +425,13 @@ 53761291155AB74D005750A4 /* Sources */, 53761292155AB74D005750A4 /* Frameworks */, 53761293155AB74D005750A4 /* Resources */, + 43A62A171D0E07600089D7DD /* Embed Watch Content */, ); buildRules = ( ); dependencies = ( 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */, + 43A62A0E1D0E07600089D7DD /* PBXTargetDependency */, ); name = "SDWebImage iOS Demo"; productName = "SDWebImage Demo"; @@ -290,6 +450,12 @@ 43A629CE1D0DFD000089D7DD = { CreatedOnToolsVersion = 7.3.1; }; + 43A629ED1D0E07600089D7DD = { + CreatedOnToolsVersion = 7.3.1; + }; + 43A629F91D0E07600089D7DD = { + CreatedOnToolsVersion = 7.3.1; + }; }; }; buildConfigurationList = 5376128F155AB74D005750A4 /* Build configuration list for PBXProject "SDWebImage Demo" */; @@ -313,11 +479,20 @@ targets = ( 53761294155AB74D005750A4 /* SDWebImage iOS Demo */, 43A629CE1D0DFD000089D7DD /* SDWebImage OSX Demo */, + 43A629ED1D0E07600089D7DD /* SDWebImage Watch Demo */, + 43A629F91D0E07600089D7DD /* SDWebImage Watch Demo Extension */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ + 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libSDWebImage watchOS static.a"; + remoteRef = 4314D19D1D0E0EB6004B36C9 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 431739601CDFCC370008FEB9 /* SDWebImage.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -365,6 +540,23 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 43A629EC1D0E07600089D7DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A629F41D0E07600089D7DD /* Assets.xcassets in Resources */, + 43A629F21D0E07600089D7DD /* Interface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 43A629F81D0E07600089D7DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A62A0B1D0E07600089D7DD /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761293155AB74D005750A4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -391,6 +583,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 43A629F61D0E07600089D7DD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43A62A061D0E07600089D7DD /* ExtensionDelegate.m in Sources */, + 43A62A031D0E07600089D7DD /* InterfaceController.m in Sources */, + 43A62A091D0E07600089D7DD /* NotificationController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 53761291155AB74D005750A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -405,6 +607,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 4314D1A01D0E0EBD004B36C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage watchOS static"; + targetProxy = 4314D19F1D0E0EBD004B36C9 /* PBXContainerItemProxy */; + }; 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; @@ -415,6 +622,16 @@ name = "SDWebImage OSX"; targetProxy = 43A629E91D0DFDCA0089D7DD /* PBXContainerItemProxy */; }; + 43A629FD1D0E07600089D7DD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 43A629F91D0E07600089D7DD /* SDWebImage Watch Demo Extension */; + targetProxy = 43A629FC1D0E07600089D7DD /* PBXContainerItemProxy */; + }; + 43A62A0E1D0E07600089D7DD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 43A629ED1D0E07600089D7DD /* SDWebImage Watch Demo */; + targetProxy = 43A62A0D1D0E07600089D7DD /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -426,6 +643,14 @@ name = Main.storyboard; sourceTree = ""; }; + 43A629F01D0E07600089D7DD /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 43A629F11D0E07600089D7DD /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; 537612B1155AB74D005750A4 /* MasterViewController.xib */ = { isa = PBXVariantGroup; children = ( @@ -523,6 +748,160 @@ }; name = Release; }; + 43A62A111D0E07600089D7DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage Watch Demo Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-iOS-Demo.watchkitapp.watchkitextension"; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + 43A62A121D0E07600089D7DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage Watch Demo Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-iOS-Demo.watchkitapp.watchkitextension"; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; + 43A62A151D0E07600089D7DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + IBSC_MODULE = SDWebImage_Watch_Demo_Extension; + INFOPLIST_FILE = "SDWebImage Watch Demo/Info.plist"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-iOS-Demo.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + 43A62A161D0E07600089D7DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + IBSC_MODULE = SDWebImage_Watch_Demo_Extension; + INFOPLIST_FILE = "SDWebImage Watch Demo/Info.plist"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-iOS-Demo.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; 537612B7155AB74D005750A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -623,6 +1002,25 @@ 43A629E11D0DFD000089D7DD /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43A62A101D0E07600089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage Watch Demo Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43A62A111D0E07600089D7DD /* Debug */, + 43A62A121D0E07600089D7DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 43A62A141D0E07600089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage Watch Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43A62A151D0E07600089D7DD /* Debug */, + 43A62A161D0E07600089D7DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 5376128F155AB74D005750A4 /* Build configuration list for PBXProject "SDWebImage Demo" */ = { isa = XCConfigurationList; diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme new file mode 100644 index 00000000..f45b63d2 --- /dev/null +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage Watch Demo Extension/Assets.xcassets/README__ignoredByTemplate__ b/Examples/SDWebImage Watch Demo Extension/Assets.xcassets/README__ignoredByTemplate__ new file mode 100644 index 00000000..b601d383 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/Assets.xcassets/README__ignoredByTemplate__ @@ -0,0 +1 @@ +Did you know that git does not support storing empty directories? diff --git a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h new file mode 100644 index 00000000..0560a719 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h @@ -0,0 +1,13 @@ +// +// ExtensionDelegate.h +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface ExtensionDelegate : NSObject + +@end diff --git a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m new file mode 100644 index 00000000..673db3b9 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m @@ -0,0 +1,26 @@ +// +// ExtensionDelegate.m +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "ExtensionDelegate.h" + +@implementation ExtensionDelegate + +- (void)applicationDidFinishLaunching { + // Perform any final initialization of your application. +} + +- (void)applicationDidBecomeActive { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillResignActive { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, etc. +} + +@end diff --git a/Examples/SDWebImage Watch Demo Extension/Info.plist b/Examples/SDWebImage Watch Demo Extension/Info.plist new file mode 100644 index 00000000..4c0bf52c --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/Info.plist @@ -0,0 +1,43 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + SDWebImage Watch Demo Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + com.dailymotion.SDWebImage-iOS-Demo.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + WKExtensionDelegateClassName + ExtensionDelegate + + diff --git a/Examples/SDWebImage Watch Demo Extension/InterfaceController.h b/Examples/SDWebImage Watch Demo Extension/InterfaceController.h new file mode 100644 index 00000000..ffd77550 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/InterfaceController.h @@ -0,0 +1,14 @@ +// +// InterfaceController.h +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import +#import + +@interface InterfaceController : WKInterfaceController + +@end diff --git a/Examples/SDWebImage Watch Demo Extension/InterfaceController.m b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m new file mode 100644 index 00000000..66b2439a --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m @@ -0,0 +1,46 @@ +// +// InterfaceController.m +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "InterfaceController.h" +#import + + +@interface InterfaceController() + +@property (weak) IBOutlet WKInterfaceImage *imageInterface; + +@end + + +@implementation InterfaceController + +- (void)awakeWithContext:(id)context { + [super awakeWithContext:context]; + + // Configure interface objects here. +} + +- (void)willActivate { + // This method is called when watch view controller is about to be visible to user + [super willActivate]; + + NSString *urlString = @"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"; + [[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:urlString] options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { + self.imageInterface.image = image; + }]; +} + +- (void)didDeactivate { + // This method is called when watch view controller is no longer visible + [super didDeactivate]; +} + +@end + + + diff --git a/Examples/SDWebImage Watch Demo Extension/NotificationController.h b/Examples/SDWebImage Watch Demo Extension/NotificationController.h new file mode 100644 index 00000000..ac4cf287 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/NotificationController.h @@ -0,0 +1,14 @@ +// +// NotificationController.h +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import +#import + +@interface NotificationController : WKUserNotificationInterfaceController + +@end diff --git a/Examples/SDWebImage Watch Demo Extension/NotificationController.m b/Examples/SDWebImage Watch Demo Extension/NotificationController.m new file mode 100644 index 00000000..a72703d9 --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/NotificationController.m @@ -0,0 +1,64 @@ +// +// NotificationController.m +// SDWebImage Watch Demo Extension +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "NotificationController.h" + + +@interface NotificationController() + +@end + + +@implementation NotificationController + +- (instancetype)init { + self = [super init]; + if (self){ + // Initialize variables here. + // Configure interface objects here. + + } + return self; +} + +- (void)willActivate { + // This method is called when watch view controller is about to be visible to user + [super willActivate]; +} + +- (void)didDeactivate { + // This method is called when watch view controller is no longer visible + [super didDeactivate]; +} + +/* +- (void)didReceiveLocalNotification:(UILocalNotification *)localNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { + // This method is called when a local notification needs to be presented. + // Implement it if you use a dynamic notification interface. + // Populate your dynamic notification interface as quickly as possible. + // + // After populating your dynamic notification interface call the completion block. + completionHandler(WKUserNotificationInterfaceTypeCustom); +} +*/ + +/* +- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { + // This method is called when a remote notification needs to be presented. + // Implement it if you use a dynamic notification interface. + // Populate your dynamic notification interface as quickly as possible. + // + // After populating your dynamic notification interface call the completion block. + completionHandler(WKUserNotificationInterfaceTypeCustom); +} +*/ + +@end + + + diff --git a/Examples/SDWebImage Watch Demo Extension/PushNotificationPayload.apns b/Examples/SDWebImage Watch Demo Extension/PushNotificationPayload.apns new file mode 100644 index 00000000..e793a02b --- /dev/null +++ b/Examples/SDWebImage Watch Demo Extension/PushNotificationPayload.apns @@ -0,0 +1,18 @@ +{ + "aps": { + "alert": { + "body": "Test message", + "title": "Optional title" + }, + "category": "myCategory" + }, + + "WatchKit Simulator Actions": [ + { + "title": "First Button", + "identifier": "firstButtonAction" + } + ], + + "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." +} diff --git a/Examples/SDWebImage Watch Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/SDWebImage Watch Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..dd221ba5 --- /dev/null +++ b/Examples/SDWebImage Watch Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,55 @@ +{ + "images" : [ + { + "size" : "24x24", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Examples/SDWebImage Watch Demo/Base.lproj/Interface.storyboard b/Examples/SDWebImage Watch Demo/Base.lproj/Interface.storyboard new file mode 100644 index 00000000..d2788c7e --- /dev/null +++ b/Examples/SDWebImage Watch Demo/Base.lproj/Interface.storyboard @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage Watch Demo/Info.plist b/Examples/SDWebImage Watch Demo/Info.plist new file mode 100644 index 00000000..c4c89f9b --- /dev/null +++ b/Examples/SDWebImage Watch Demo/Info.plist @@ -0,0 +1,35 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + SDWebImage iOS Demo + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + com.dailymotion.SDWebImage-iOS-Demo + WKWatchKitApp + + + diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index fb7fb28f..1f6cc3eb 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -39,6 +39,116 @@ 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D11D1D0E0E3B004B36C9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 4314D11E1D0E0E3B004B36C9 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 4314D11F1D0E0E3B004B36C9 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 4314D1201D0E0E3B004B36C9 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 4314D1211D0E0E3B004B36C9 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 4314D1221D0E0E3B004B36C9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 4314D1231D0E0E3B004B36C9 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; + 4314D1241D0E0E3B004B36C9 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; + 4314D1251D0E0E3B004B36C9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 4314D1271D0E0E3B004B36C9 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 4314D1281D0E0E3B004B36C9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 4314D1291D0E0E3B004B36C9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 4314D12A1D0E0E3B004B36C9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 4314D12B1D0E0E3B004B36C9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 4314D12C1D0E0E3B004B36C9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 4314D12D1D0E0E3B004B36C9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 4314D12E1D0E0E3B004B36C9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; + 4314D1321D0E0E3B004B36C9 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 4314D1331D0E0E3B004B36C9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 4314D1341D0E0E3B004B36C9 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; + 4314D1351D0E0E3B004B36C9 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 4314D1361D0E0E3B004B36C9 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; + 4314D1371D0E0E3B004B36C9 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; + 4314D1381D0E0E3B004B36C9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 4314D13A1D0E0E3B004B36C9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; + 4314D13C1D0E0E3B004B36C9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 4314D13D1D0E0E3B004B36C9 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 4314D13E1D0E0E3B004B36C9 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 4314D13F1D0E0E3B004B36C9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; + 4314D1411D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; + 4314D1421D0E0E3B004B36C9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 4314D1431D0E0E3B004B36C9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 4314D1441D0E0E3B004B36C9 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 4314D1451D0E0E3B004B36C9 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 4314D1471D0E0E3B004B36C9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 4314D1481D0E0E3B004B36C9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 4314D1491D0E0E3B004B36C9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 4314D14A1D0E0E3B004B36C9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 4314D14B1D0E0E3B004B36C9 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; + 4314D14C1D0E0E3B004B36C9 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 4314D14D1D0E0E3B004B36C9 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; + 4314D14E1D0E0E3B004B36C9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 4314D14F1D0E0E3B004B36C9 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 4314D1501D0E0E3B004B36C9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; + 4314D1511D0E0E3B004B36C9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 4314D1521D0E0E3B004B36C9 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; + 4314D1531D0E0E3B004B36C9 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; + 4314D1541D0E0E3B004B36C9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 4314D1551D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; + 4314D1571D0E0E3B004B36C9 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 4314D1581D0E0E3B004B36C9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 4314D1591D0E0E3B004B36C9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 4314D15A1D0E0E3B004B36C9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 4314D15B1D0E0E3B004B36C9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 4314D15C1D0E0E3B004B36C9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 4314D15E1D0E0E3B004B36C9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB894814D35E9E0020B787 /* UIKit.framework */; }; + 4314D15F1D0E0E3B004B36C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53922D72148C55820056699D /* Foundation.framework */; }; + 4314D1601D0E0E3B004B36C9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB893F14D35D1A0020B787 /* CoreGraphics.framework */; }; + 4314D1621D0E0E3B004B36C9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 4314D1631D0E0E3B004B36C9 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 4314D1641D0E0E3B004B36C9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 4314D1651D0E0E3B004B36C9 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 4314D1661D0E0E3B004B36C9 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 4314D1671D0E0E3B004B36C9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 4314D1681D0E0E3B004B36C9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 4314D1691D0E0E3B004B36C9 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 4314D16A1D0E0E3B004B36C9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 4314D16B1D0E0E3B004B36C9 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 4314D16C1D0E0E3B004B36C9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 4314D16D1D0E0E3B004B36C9 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D85148C56230056699D /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D16E1D0E0E3B004B36C9 /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 4314D16F1D0E0E3B004B36C9 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */; }; + 4314D1701D0E0E3B004B36C9 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 4314D1711D0E0E3B004B36C9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 4314D1721D0E0E3B004B36C9 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1731D0E0E3B004B36C9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 4314D1741D0E0E3B004B36C9 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 4314D1761D0E0E3B004B36C9 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 4314D1771D0E0E3B004B36C9 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D17A1D0E0E3B004B36C9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 4314D17B1D0E0E3B004B36C9 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 4314D17C1D0E0E3B004B36C9 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D17D1D0E0E3B004B36C9 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D17E1D0E0E3B004B36C9 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 4314D17F1D0E0E3B004B36C9 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D93148C56230056699D /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1801D0E0E3B004B36C9 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 4314D1811D0E0E3B004B36C9 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1821D0E0E3B004B36C9 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 4314D1831D0E0E3B004B36C9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 4314D1841D0E0E3B004B36C9 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1851D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1861D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1871D0E0E3B004B36C9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 4314D1881D0E0E3B004B36C9 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 4314D1891D0E0E3B004B36C9 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 4314D18B1D0E0E3B004B36C9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 4314D18E1D0E0E3B004B36C9 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 4314D18F1D0E0E3B004B36C9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4314D1901D0E0E3B004B36C9 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; + 4314D1911D0E0E3B004B36C9 /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 4314D1921D0E0E3B004B36C9 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */; }; + 4314D1931D0E0E3B004B36C9 /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 4314D1941D0E0E3B004B36C9 /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; 431738781CDFC2580008FEB9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; 431738791CDFC2580008FEB9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; 4317387A1CDFC2580008FEB9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; @@ -417,6 +527,82 @@ 4397D2F71D0DE2DF00BB2784 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */; }; 4397D2F81D0DF44200BB2784 /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2F91D0DF44A00BB2784 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; + 43A62A1B1D0E0A800089D7DD /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; + 43A62A1C1D0E0A800089D7DD /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; + 43A62A1D1D0E0A800089D7DD /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; + 43A62A1E1D0E0A800089D7DD /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; + 43A62A1F1D0E0A800089D7DD /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; + 43A62A201D0E0A800089D7DD /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; + 43A62A211D0E0A800089D7DD /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; + 43A62A221D0E0A860089D7DD /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; + 43A62A231D0E0A860089D7DD /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; + 43A62A241D0E0A860089D7DD /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; + 43A62A251D0E0A860089D7DD /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; + 43A62A261D0E0A860089D7DD /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; + 43A62A271D0E0A860089D7DD /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; + 43A62A281D0E0A860089D7DD /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; + 43A62A291D0E0A860089D7DD /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; + 43A62A2A1D0E0A860089D7DD /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; + 43A62A2B1D0E0A860089D7DD /* filters.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB11998E60B007367ED /* filters.h */; }; + 43A62A2C1D0E0A860089D7DD /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; + 43A62A2D1D0E0A860089D7DD /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; + 43A62A2E1D0E0A860089D7DD /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; + 43A62A2F1D0E0A860089D7DD /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; + 43A62A301D0E0A860089D7DD /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; + 43A62A311D0E0A860089D7DD /* quant_levels.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB81998E60B007367ED /* quant_levels.h */; }; + 43A62A321D0E0A860089D7DD /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; + 43A62A331D0E0A860089D7DD /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; + 43A62A341D0E0A860089D7DD /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; + 43A62A351D0E0A860089D7DD /* random.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBC1998E60B007367ED /* random.h */; }; + 43A62A361D0E0A860089D7DD /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; + 43A62A371D0E0A860089D7DD /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; + 43A62A381D0E0A860089D7DD /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; + 43A62A391D0E0A860089D7DD /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; + 43A62A3A1D0E0A860089D7DD /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; + 43A62A3B1D0E0A860089D7DD /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; + 43A62A3C1D0E0A8B0089D7DD /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; + 43A62A3D1D0E0A8B0089D7DD /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; + 43A62A3E1D0E0A8B0089D7DD /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; + 43A62A3F1D0E0A8B0089D7DD /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; + 43A62A401D0E0A8B0089D7DD /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; + 43A62A411D0E0A8B0089D7DD /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; + 43A62A421D0E0A8B0089D7DD /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; + 43A62A431D0E0A8B0089D7DD /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; + 43A62A441D0E0A8B0089D7DD /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; + 43A62A451D0E0A8B0089D7DD /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; + 43A62A461D0E0A8B0089D7DD /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; + 43A62A471D0E0A8B0089D7DD /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; + 43A62A481D0E0A8B0089D7DD /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; + 43A62A491D0E0A8B0089D7DD /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; + 43A62A4A1D0E0A8B0089D7DD /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; + 43A62A4B1D0E0A8B0089D7DD /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; + 43A62A4C1D0E0A8B0089D7DD /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; + 43A62A4D1D0E0A8B0089D7DD /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; + 43A62A4E1D0E0A8B0089D7DD /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; + 43A62A4F1D0E0A8B0089D7DD /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; + 43A62A501D0E0A8B0089D7DD /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; + 43A62A511D0E0A8B0089D7DD /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; + 43A62A521D0E0A8B0089D7DD /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; + 43A62A531D0E0A8B0089D7DD /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; + 43A62A541D0E0A8B0089D7DD /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; + 43A62A551D0E0A8B0089D7DD /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; + 43A62A561D0E0A8B0089D7DD /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; + 43A62A571D0E0A8B0089D7DD /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; + 43A62A581D0E0A8F0089D7DD /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; + 43A62A591D0E0A8F0089D7DD /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; + 43A62A5A1D0E0A8F0089D7DD /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; + 43A62A5B1D0E0A8F0089D7DD /* decode_vp8.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5E1998E6B2007367ED /* decode_vp8.h */; }; + 43A62A5C1D0E0A8F0089D7DD /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; + 43A62A5D1D0E0A8F0089D7DD /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; + 43A62A5E1D0E0A8F0089D7DD /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; + 43A62A5F1D0E0A8F0089D7DD /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; + 43A62A601D0E0A8F0089D7DD /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; + 43A62A611D0E0A8F0089D7DD /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; + 43A62A621D0E0A8F0089D7DD /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; + 43A62A631D0E0A8F0089D7DD /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; + 43A62A641D0E0A8F0089D7DD /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; + 43A62A651D0E0A8F0089D7DD /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; + 43A62A661D0E0A8F0089D7DD /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -505,6 +691,7 @@ /* Begin PBXFileReference section */ 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage watchOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 431BB7031D06D2C1006A3455 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+WebCache.h"; sourceTree = ""; }; @@ -524,7 +711,7 @@ 5340674F167780C40042B59E /* SDWebImageCompat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCompat.m; sourceTree = ""; }; 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+WebCache.h"; path = "SDWebImage/MKAnnotationView+WebCache.h"; sourceTree = SOURCE_ROOT; }; 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+WebCache.m"; path = "SDWebImage/MKAnnotationView+WebCache.m"; sourceTree = SOURCE_ROOT; }; - 53761325155AD0D5005750A4 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 53761325155AD0D5005750A4 /* libSDWebImage iOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage iOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 53922D72148C55820056699D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 53922D85148C56230056699D /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = SOURCE_ROOT; }; 53922D86148C56230056699D /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = SOURCE_ROOT; }; @@ -641,6 +828,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4314D15D1D0E0E3B004B36C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D15E1D0E0E3B004B36C9 /* UIKit.framework in Frameworks */, + 4314D15F1D0E0E3B004B36C9 /* Foundation.framework in Frameworks */, + 4314D1601D0E0E3B004B36C9 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 431BB6CA1D06D2C1006A3455 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -735,11 +932,12 @@ 53922D70148C55820056699D /* Products */ = { isa = PBXGroup; children = ( - 53761325155AD0D5005750A4 /* libSDWebImage.a */, + 53761325155AD0D5005750A4 /* libSDWebImage iOS static.a */, 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */, 00733A4C1BC487C000A5A117 /* SDWebImage.framework */, 431BB7031D06D2C1006A3455 /* SDWebImage.framework */, 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */, + 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */, ); name = Products; sourceTree = ""; @@ -1017,23 +1215,108 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4314D1611D0E0E3B004B36C9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D1621D0E0E3B004B36C9 /* mux_types.h in Headers */, + 4314D1631D0E0E3B004B36C9 /* demux.h in Headers */, + 4314D1641D0E0E3B004B36C9 /* neon.h in Headers */, + 4314D1651D0E0E3B004B36C9 /* utils.h in Headers */, + 4314D1661D0E0E3B004B36C9 /* quant_levels_dec.h in Headers */, + 4314D1671D0E0E3B004B36C9 /* bit_reader_inl.h in Headers */, + 4314D1681D0E0E3B004B36C9 /* lossless.h in Headers */, + 4314D1691D0E0E3B004B36C9 /* color_cache.h in Headers */, + 4314D16A1D0E0E3B004B36C9 /* webpi.h in Headers */, + 4314D16B1D0E0E3B004B36C9 /* encode.h in Headers */, + 4314D16C1D0E0E3B004B36C9 /* bit_reader.h in Headers */, + 4314D16D1D0E0E3B004B36C9 /* SDImageCache.h in Headers */, + 4314D16E1D0E0E3B004B36C9 /* quant_levels.h in Headers */, + 4314D16F1D0E0E3B004B36C9 /* NSData+ImageContentType.h in Headers */, + 4314D1701D0E0E3B004B36C9 /* mux.h in Headers */, + 4314D1711D0E0E3B004B36C9 /* huffman.h in Headers */, + 4314D1721D0E0E3B004B36C9 /* SDWebImageCompat.h in Headers */, + 4314D1731D0E0E3B004B36C9 /* vp8li.h in Headers */, + 4314D1741D0E0E3B004B36C9 /* types.h in Headers */, + 4314D1761D0E0E3B004B36C9 /* decode.h in Headers */, + 4314D1771D0E0E3B004B36C9 /* SDWebImageDecoder.h in Headers */, + 4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */, + 4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */, + 4314D17A1D0E0E3B004B36C9 /* yuv_tables_sse2.h in Headers */, + 4314D17B1D0E0E3B004B36C9 /* huffman_encode.h in Headers */, + 4314D17C1D0E0E3B004B36C9 /* UIImage+WebP.h in Headers */, + 4314D17D1D0E0E3B004B36C9 /* SDWebImagePrefetcher.h in Headers */, + 4314D17E1D0E0E3B004B36C9 /* bit_writer.h in Headers */, + 4314D17F1D0E0E3B004B36C9 /* UIButton+WebCache.h in Headers */, + 4314D1801D0E0E3B004B36C9 /* thread.h in Headers */, + 4314D1811D0E0E3B004B36C9 /* UIImageView+WebCache.h in Headers */, + 4314D1821D0E0E3B004B36C9 /* endian_inl.h in Headers */, + 4314D1831D0E0E3B004B36C9 /* dsp.h in Headers */, + 4314D1841D0E0E3B004B36C9 /* SDWebImageOperation.h in Headers */, + 4314D1851D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.h in Headers */, + 4314D1861D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.h in Headers */, + 4314D1871D0E0E3B004B36C9 /* alphai.h in Headers */, + 4314D1881D0E0E3B004B36C9 /* format_constants.h in Headers */, + 4314D1891D0E0E3B004B36C9 /* rescaler.h in Headers */, + 4314D18B1D0E0E3B004B36C9 /* yuv.h in Headers */, + 4314D18E1D0E0E3B004B36C9 /* vp8i.h in Headers */, + 4314D18F1D0E0E3B004B36C9 /* UIView+WebCacheOperation.h in Headers */, + 4314D1901D0E0E3B004B36C9 /* UIImage+GIF.h in Headers */, + 4314D1911D0E0E3B004B36C9 /* filters.h in Headers */, + 4314D1921D0E0E3B004B36C9 /* UIImage+MultiFormat.h in Headers */, + 4314D1931D0E0E3B004B36C9 /* decode_vp8.h in Headers */, + 4314D1941D0E0E3B004B36C9 /* random.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 431BB6CB1D06D2C1006A3455 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 431BB6D71D06D2C1006A3455 /* UIImage+WebP.h in Headers */, + 43A62A291D0E0A860089D7DD /* endian_inl.h in Headers */, 431BB6D91D06D2C1006A3455 /* SDWebImageManager.h in Headers */, + 43A62A1B1D0E0A800089D7DD /* decode.h in Headers */, 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */, + 43A62A371D0E0A860089D7DD /* rescaler.h in Headers */, 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */, + 43A62A2B1D0E0A860089D7DD /* filters.h in Headers */, + 43A62A281D0E0A860089D7DD /* color_cache.h in Headers */, + 43A62A641D0E0A8F0089D7DD /* vp8li.h in Headers */, + 43A62A541D0E0A8B0089D7DD /* yuv.h in Headers */, 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */, + 43A62A3B1D0E0A860089D7DD /* utils.h in Headers */, + 43A62A231D0E0A860089D7DD /* bit_reader.h in Headers */, + 43A62A4F1D0E0A8B0089D7DD /* neon.h in Headers */, + 43A62A2D1D0E0A860089D7DD /* huffman.h in Headers */, + 43A62A1C1D0E0A800089D7DD /* demux.h in Headers */, + 43A62A331D0E0A860089D7DD /* quant_levels_dec.h in Headers */, + 43A62A591D0E0A8F0089D7DD /* alphai.h in Headers */, + 43A62A571D0E0A8B0089D7DD /* yuv_tables_sse2.h in Headers */, 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */, + 43A62A1D1D0E0A800089D7DD /* encode.h in Headers */, 431BB6E61D06D2C1006A3455 /* UIImageView+WebCache.h in Headers */, 431BB6E71D06D2C1006A3455 /* SDWebImageCompat.h in Headers */, + 43A62A621D0E0A8F0089D7DD /* vp8i.h in Headers */, + 43A62A261D0E0A860089D7DD /* bit_writer.h in Headers */, + 43A62A1F1D0E0A800089D7DD /* mux.h in Headers */, 431BB6E91D06D2C1006A3455 /* SDWebImageDownloaderOperation.h in Headers */, 431BB6EB1D06D2C1006A3455 /* UIView+WebCacheOperation.h in Headers */, 431BB6EE1D06D2C1006A3455 /* NSData+ImageContentType.h in Headers */, 431BB6EF1D06D2C1006A3455 /* SDWebImagePrefetcher.h in Headers */, 431BB6F01D06D2C1006A3455 /* SDWebImageOperation.h in Headers */, + 43A62A201D0E0A800089D7DD /* mux_types.h in Headers */, + 43A62A2F1D0E0A860089D7DD /* huffman_encode.h in Headers */, + 43A62A241D0E0A860089D7DD /* bit_reader_inl.h in Headers */, + 43A62A211D0E0A800089D7DD /* types.h in Headers */, + 43A62A661D0E0A8F0089D7DD /* webpi.h in Headers */, + 43A62A351D0E0A860089D7DD /* random.h in Headers */, + 43A62A1E1D0E0A800089D7DD /* format_constants.h in Headers */, + 43A62A4B1D0E0A8B0089D7DD /* lossless.h in Headers */, + 43A62A311D0E0A860089D7DD /* quant_levels.h in Headers */, + 43A62A441D0E0A8B0089D7DD /* dsp.h in Headers */, + 43A62A5B1D0E0A8F0089D7DD /* decode_vp8.h in Headers */, + 43A62A391D0E0A860089D7DD /* thread.h in Headers */, 431BB6F61D06D2C1006A3455 /* UIImage+MultiFormat.h in Headers */, 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */, 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */, @@ -1236,6 +1519,24 @@ productReference = 00733A4C1BC487C000A5A117 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; + 4314D11B1D0E0E3B004B36C9 /* SDWebImage watchOS static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4314D1961D0E0E3B004B36C9 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS static" */; + buildPhases = ( + 4314D11C1D0E0E3B004B36C9 /* Sources */, + 4314D15D1D0E0E3B004B36C9 /* Frameworks */, + 4314D1611D0E0E3B004B36C9 /* Headers */, + 4314D1951D0E0E3B004B36C9 /* Prepare Framework */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SDWebImage watchOS static"; + productName = SDWebImage; + productReference = 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */; + productType = "com.apple.product-type.library.static"; + }; 431BB6891D06D2C1006A3455 /* SDWebImage watchOS */ = { isa = PBXNativeTarget; buildConfigurationList = 431BB7001D06D2C1006A3455 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS" */; @@ -1290,9 +1591,9 @@ productReference = 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; - 53761307155AD0D5005750A4 /* SDWebImage */ = { + 53761307155AD0D5005750A4 /* SDWebImage iOS static */ = { isa = PBXNativeTarget; - buildConfigurationList = 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildConfigurationList = 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage iOS static" */; buildPhases = ( 53761308155AD0D5005750A4 /* Sources */, 53761311155AD0D5005750A4 /* Frameworks */, @@ -1303,9 +1604,9 @@ ); dependencies = ( ); - name = SDWebImage; + name = "SDWebImage iOS static"; productName = SDWebImage; - productReference = 53761325155AD0D5005750A4 /* libSDWebImage.a */; + productReference = 53761325155AD0D5005750A4 /* libSDWebImage iOS static.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ @@ -1314,7 +1615,7 @@ 53922D66148C55810056699D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0730; ORGANIZATIONNAME = Dailymotion; TargetAttributes = { 00733A4B1BC487C000A5A117 = { @@ -1337,7 +1638,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 53761307155AD0D5005750A4 /* SDWebImage */, + 53761307155AD0D5005750A4 /* SDWebImage iOS static */, + 4314D11B1D0E0E3B004B36C9 /* SDWebImage watchOS static */, 4A2CADFE1AB4BB5300B6BC39 /* SDWebImage iOS */, 00733A4B1BC487C000A5A117 /* SDWebImage tvOS */, 431BB6891D06D2C1006A3455 /* SDWebImage watchOS */, @@ -1378,6 +1680,20 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 4314D1951D0E0E3B004B36C9 /* Prepare Framework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Prepare Framework"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nmkdir -p \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n\n# Link the \"Current\" version to \"A\"\n/bin/ln -sfh A \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\"\n/bin/ln -sfh Versions/Current/Headers \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\"\n/bin/ln -sfh \"Versions/Current/${PRODUCT_NAME}\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\"\n\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\n# cause propagating rebuilds of files that import these headers.\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\"\n"; + }; 539F912A16316D0500160719 /* Prepare Framework */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1466,25 +1782,137 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 4314D11C1D0E0E3B004B36C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D11D1D0E0E3B004B36C9 /* dec.c in Sources */, + 4314D11E1D0E0E3B004B36C9 /* huffman.c in Sources */, + 4314D11F1D0E0E3B004B36C9 /* quant_levels.c in Sources */, + 4314D1201D0E0E3B004B36C9 /* idec.c in Sources */, + 4314D1211D0E0E3B004B36C9 /* random.c in Sources */, + 4314D1221D0E0E3B004B36C9 /* alpha_processing_sse2.c in Sources */, + 4314D1231D0E0E3B004B36C9 /* SDImageCache.m in Sources */, + 4314D1241D0E0E3B004B36C9 /* SDWebImageDecoder.m in Sources */, + 4314D1251D0E0E3B004B36C9 /* enc_avx2.c in Sources */, + 4314D1271D0E0E3B004B36C9 /* rescaler.c in Sources */, + 4314D1281D0E0E3B004B36C9 /* dec_sse2.c in Sources */, + 4314D1291D0E0E3B004B36C9 /* upsampling_neon.c in Sources */, + 4314D12A1D0E0E3B004B36C9 /* quant.c in Sources */, + 4314D12B1D0E0E3B004B36C9 /* dec_mips32.c in Sources */, + 4314D12C1D0E0E3B004B36C9 /* alpha_processing.c in Sources */, + 4314D12D1D0E0E3B004B36C9 /* lossless_sse2.c in Sources */, + 4314D12E1D0E0E3B004B36C9 /* enc_sse2.c in Sources */, + 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */, + 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */, + 4314D1321D0E0E3B004B36C9 /* filters.c in Sources */, + 4314D1331D0E0E3B004B36C9 /* yuv_mips32.c in Sources */, + 4314D1341D0E0E3B004B36C9 /* UIImage+WebP.m in Sources */, + 4314D1351D0E0E3B004B36C9 /* tree.c in Sources */, + 4314D1361D0E0E3B004B36C9 /* SDWebImageManager.m in Sources */, + 4314D1371D0E0E3B004B36C9 /* SDWebImagePrefetcher.m in Sources */, + 4314D1381D0E0E3B004B36C9 /* yuv_sse2.c in Sources */, + 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */, + 4314D13A1D0E0E3B004B36C9 /* lossless_mips32.c in Sources */, + 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */, + 4314D13C1D0E0E3B004B36C9 /* enc_mips32.c in Sources */, + 4314D13D1D0E0E3B004B36C9 /* quant_levels_dec.c in Sources */, + 4314D13E1D0E0E3B004B36C9 /* vp8l.c in Sources */, + 4314D13F1D0E0E3B004B36C9 /* cpu.c in Sources */, + 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */, + 4314D1411D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.m in Sources */, + 4314D1421D0E0E3B004B36C9 /* webp.c in Sources */, + 4314D1431D0E0E3B004B36C9 /* yuv.c in Sources */, + 4314D1441D0E0E3B004B36C9 /* bit_writer.c in Sources */, + 4314D1451D0E0E3B004B36C9 /* vp8.c in Sources */, + 4314D1471D0E0E3B004B36C9 /* enc_neon.c in Sources */, + 4314D1481D0E0E3B004B36C9 /* lossless_neon.c in Sources */, + 4314D1491D0E0E3B004B36C9 /* dec_clip_tables.c in Sources */, + 4314D14A1D0E0E3B004B36C9 /* lossless.c in Sources */, + 4314D14B1D0E0E3B004B36C9 /* SDWebImageCompat.m in Sources */, + 4314D14C1D0E0E3B004B36C9 /* huffman_encode.c in Sources */, + 4314D14D1D0E0E3B004B36C9 /* UIImage+GIF.m in Sources */, + 4314D14E1D0E0E3B004B36C9 /* upsampling.c in Sources */, + 4314D14F1D0E0E3B004B36C9 /* io.c in Sources */, + 4314D1501D0E0E3B004B36C9 /* UIView+WebCacheOperation.m in Sources */, + 4314D1511D0E0E3B004B36C9 /* buffer.c in Sources */, + 4314D1521D0E0E3B004B36C9 /* NSData+ImageContentType.m in Sources */, + 4314D1531D0E0E3B004B36C9 /* UIImage+MultiFormat.m in Sources */, + 4314D1541D0E0E3B004B36C9 /* upsampling_sse2.c in Sources */, + 4314D1551D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.m in Sources */, + 4314D1571D0E0E3B004B36C9 /* frame.c in Sources */, + 4314D1581D0E0E3B004B36C9 /* bit_reader.c in Sources */, + 4314D1591D0E0E3B004B36C9 /* dec_neon.c in Sources */, + 4314D15A1D0E0E3B004B36C9 /* alpha.c in Sources */, + 4314D15B1D0E0E3B004B36C9 /* enc.c in Sources */, + 4314D15C1D0E0E3B004B36C9 /* utils.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 431BB68A1D06D2C1006A3455 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */, + 43A62A4A1D0E0A8B0089D7DD /* lossless.c in Sources */, + 43A62A2A1D0E0A860089D7DD /* filters.c in Sources */, 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */, + 43A62A4D1D0E0A8B0089D7DD /* lossless_neon.c in Sources */, + 43A62A651D0E0A8F0089D7DD /* webp.c in Sources */, + 43A62A431D0E0A8B0089D7DD /* dec_sse2.c in Sources */, + 43A62A3A1D0E0A860089D7DD /* utils.c in Sources */, + 43A62A271D0E0A860089D7DD /* color_cache.c in Sources */, 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */, + 43A62A3F1D0E0A8B0089D7DD /* dec.c in Sources */, 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */, + 43A62A631D0E0A8F0089D7DD /* vp8l.c in Sources */, + 43A62A511D0E0A8B0089D7DD /* upsampling_neon.c in Sources */, + 43A62A421D0E0A8B0089D7DD /* dec_neon.c in Sources */, + 43A62A471D0E0A8B0089D7DD /* enc_mips32.c in Sources */, 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, + 43A62A5E1D0E0A8F0089D7DD /* io.c in Sources */, + 43A62A321D0E0A860089D7DD /* quant_levels_dec.c in Sources */, + 43A62A451D0E0A8B0089D7DD /* enc.c in Sources */, 431BB6AA1D06D2C1006A3455 /* SDWebImageManager.m in Sources */, + 43A62A461D0E0A8B0089D7DD /* enc_avx2.c in Sources */, + 43A62A5A1D0E0A8F0089D7DD /* buffer.c in Sources */, 431BB6AC1D06D2C1006A3455 /* SDWebImageCompat.m in Sources */, + 43A62A411D0E0A8B0089D7DD /* dec_mips32.c in Sources */, + 43A62A3D1D0E0A8B0089D7DD /* alpha_processing.c in Sources */, + 43A62A3E1D0E0A8B0089D7DD /* cpu.c in Sources */, + 43A62A341D0E0A860089D7DD /* random.c in Sources */, + 43A62A491D0E0A8B0089D7DD /* enc_sse2.c in Sources */, + 43A62A401D0E0A8B0089D7DD /* dec_clip_tables.c in Sources */, 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */, + 43A62A481D0E0A8B0089D7DD /* enc_neon.c in Sources */, 431BB6B41D06D2C1006A3455 /* SDWebImageDecoder.m in Sources */, 431BB6B61D06D2C1006A3455 /* UIImage+WebP.m in Sources */, 431BB6B91D06D2C1006A3455 /* UIButton+WebCache.m in Sources */, + 43A62A5F1D0E0A8F0089D7DD /* quant.c in Sources */, + 43A62A501D0E0A8B0089D7DD /* upsampling.c in Sources */, 431BB6BD1D06D2C1006A3455 /* UIImage+GIF.m in Sources */, + 43A62A581D0E0A8F0089D7DD /* alpha.c in Sources */, + 43A62A2E1D0E0A860089D7DD /* huffman_encode.c in Sources */, + 43A62A4E1D0E0A8B0089D7DD /* lossless_sse2.c in Sources */, + 43A62A561D0E0A8B0089D7DD /* yuv_sse2.c in Sources */, + 43A62A5D1D0E0A8F0089D7DD /* idec.c in Sources */, + 43A62A251D0E0A860089D7DD /* bit_writer.c in Sources */, + 43A62A2C1D0E0A860089D7DD /* huffman.c in Sources */, + 43A62A381D0E0A860089D7DD /* thread.c in Sources */, + 43A62A551D0E0A8B0089D7DD /* yuv_mips32.c in Sources */, + 43A62A361D0E0A860089D7DD /* rescaler.c in Sources */, 431BB6C01D06D2C1006A3455 /* SDImageCache.m in Sources */, 431BB6C41D06D2C1006A3455 /* UIImage+MultiFormat.m in Sources */, + 43A62A4C1D0E0A8B0089D7DD /* lossless_mips32.c in Sources */, + 43A62A531D0E0A8B0089D7DD /* yuv.c in Sources */, + 43A62A611D0E0A8F0089D7DD /* vp8.c in Sources */, + 43A62A5C1D0E0A8F0089D7DD /* frame.c in Sources */, + 43A62A221D0E0A860089D7DD /* bit_reader.c in Sources */, + 43A62A301D0E0A860089D7DD /* quant_levels.c in Sources */, + 43A62A3C1D0E0A8B0089D7DD /* alpha_processing_sse2.c in Sources */, + 43A62A601D0E0A8F0089D7DD /* tree.c in Sources */, 431BB6C71D06D2C1006A3455 /* UIImageView+HighlightedWebCache.m in Sources */, + 43A62A521D0E0A8B0089D7DD /* upsampling_sse2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1756,6 +2184,29 @@ }; name = Release; }; + 4314D1971D0E0E3B004B36C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; + SDKROOT = watchos; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 4314D1981D0E0E3B004B36C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; + SDKROOT = watchos; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; 431BB7011D06D2C1006A3455 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1814,6 +2265,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1834,6 +2286,7 @@ isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; + COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1897,7 +2350,7 @@ buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - PRODUCT_NAME = SDWebImage; + PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1908,7 +2361,7 @@ isa = XCBuildConfiguration; buildSettings = { IPHONEOS_DEPLOYMENT_TARGET = 7.0; - PRODUCT_NAME = SDWebImage; + PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2038,6 +2491,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4314D1961D0E0E3B004B36C9 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4314D1971D0E0E3B004B36C9 /* Debug */, + 4314D1981D0E0E3B004B36C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 431BB7001D06D2C1006A3455 /* Build configuration list for PBXNativeTarget "SDWebImage watchOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2065,7 +2527,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + 53761322155AD0D5005750A4 /* Build configuration list for PBXNativeTarget "SDWebImage iOS static" */ = { isa = XCConfigurationList; buildConfigurations = ( 53761323155AD0D5005750A4 /* Debug */, diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme similarity index 95% rename from SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme rename to SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme index 46e78df5..64d296a0 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage-static.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme @@ -16,7 +16,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "53761307155AD0D5005750A4" BuildableName = "libSDWebImage.a" - BlueprintName = "SDWebImage" + BlueprintName = "SDWebImage iOS static" ReferencedContainer = "container:SDWebImage.xcodeproj"> @@ -47,7 +47,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "53761307155AD0D5005750A4" BuildableName = "libSDWebImage.a" - BlueprintName = "SDWebImage" + BlueprintName = "SDWebImage iOS static" ReferencedContainer = "container:SDWebImage.xcodeproj"> diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS static.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS static.xcscheme new file mode 100644 index 00000000..1ca670d3 --- /dev/null +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage watchOS static.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f5171b3ba8efb1d40b386b4d7a76b92dcdc3adcb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 01:13:46 +0300 Subject: [PATCH 078/207] Added tvOS demo --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 195 ++++++++++++++++++ .../xcschemes/SDWebImage TV Demo.xcscheme | 91 ++++++++ Examples/SDWebImage TV Demo/AppDelegate.h | 17 ++ Examples/SDWebImage TV Demo/AppDelegate.m | 45 ++++ .../Content.imageset/Contents.json | 12 ++ .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Large.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 ++ .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 ++ .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 ++ .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Small.imagestack/Contents.json | 17 ++ .../Content.imageset/Contents.json | 12 ++ .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 ++ .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 26 +++ .../Top Shelf Image.imageset/Contents.json | 12 ++ .../Assets.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 15 ++ .../Base.lproj/Main.storyboard | 45 ++++ Examples/SDWebImage TV Demo/Info.plist | 37 ++++ Examples/SDWebImage TV Demo/ViewController.h | 14 ++ Examples/SDWebImage TV Demo/ViewController.m | 39 ++++ Examples/SDWebImage TV Demo/main.m | 16 ++ WebImage/SDWebImage.h | 3 + 28 files changed, 703 insertions(+) create mode 100644 Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme create mode 100644 Examples/SDWebImage TV Demo/AppDelegate.h create mode 100644 Examples/SDWebImage TV Demo/AppDelegate.m create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 Examples/SDWebImage TV Demo/Base.lproj/Main.storyboard create mode 100644 Examples/SDWebImage TV Demo/Info.plist create mode 100644 Examples/SDWebImage TV Demo/ViewController.h create mode 100644 Examples/SDWebImage TV Demo/ViewController.m create mode 100644 Examples/SDWebImage TV Demo/main.m diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index dde3e2af..0424145b 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -9,6 +9,12 @@ /* Begin PBXBuildFile section */ 3E75A9861742DBE700DA412D /* CustomPathImages in Resources */ = {isa = PBXBuildFile; fileRef = 3E75A9851742DBE700DA412D /* CustomPathImages */; }; 4314D1A11D0E0EE2004B36C9 /* libSDWebImage watchOS static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */; }; + 4314D1AA1D0E1181004B36C9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1A91D0E1181004B36C9 /* main.m */; }; + 4314D1AD1D0E1181004B36C9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1AC1D0E1181004B36C9 /* AppDelegate.m */; }; + 4314D1B01D0E1182004B36C9 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1AF1D0E1182004B36C9 /* ViewController.m */; }; + 4314D1B31D0E1182004B36C9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B11D0E1182004B36C9 /* Main.storyboard */; }; + 4314D1B51D0E1182004B36C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B41D0E1182004B36C9 /* Assets.xcassets */; }; + 4314D1BC1D0E11A8004B36C9 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 431739601CDFCC370008FEB9 /* SDWebImage.framework */; }; 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage.a */; }; 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D21D0DFD000089D7DD /* AppDelegate.m */; }; 43A629D61D0DFD000089D7DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D51D0DFD000089D7DD /* main.m */; }; @@ -55,6 +61,13 @@ remoteGlobalIDString = 4314D11B1D0E0E3B004B36C9; remoteInfo = "SDWebImage watchOS static"; }; + 4314D1BA1D0E11A0004B36C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 00733A4B1BC487C000A5A117; + remoteInfo = "SDWebImage tvOS"; + }; 4317395F1CDFCC370008FEB9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -147,6 +160,15 @@ /* Begin PBXFileReference section */ 3E75A9851742DBE700DA412D /* CustomPathImages */ = {isa = PBXFileReference; lastKnownFileType = folder; path = CustomPathImages; sourceTree = SOURCE_ROOT; }; + 4314D1A61D0E1181004B36C9 /* SDWebImage TV Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage TV Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4314D1A91D0E1181004B36C9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 4314D1AB1D0E1181004B36C9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 4314D1AC1D0E1181004B36C9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 4314D1AE1D0E1181004B36C9 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 4314D1AF1D0E1182004B36C9 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 4314D1B21D0E1182004B36C9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 4314D1B41D0E1182004B36C9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4314D1B61D0E1182004B36C9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDWebImage OSX Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 43A629D11D0DFD000089D7DD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 43A629D21D0DFD000089D7DD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -194,6 +216,14 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 4314D1A31D0E1181004B36C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D1BC1D0E11A8004B36C9 /* SDWebImage.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 43A629CC1D0DFD000089D7DD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -226,6 +256,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4314D1A71D0E1181004B36C9 /* SDWebImage TV Demo */ = { + isa = PBXGroup; + children = ( + 4314D1AB1D0E1181004B36C9 /* AppDelegate.h */, + 4314D1AC1D0E1181004B36C9 /* AppDelegate.m */, + 4314D1AE1D0E1181004B36C9 /* ViewController.h */, + 4314D1AF1D0E1182004B36C9 /* ViewController.m */, + 4314D1B11D0E1182004B36C9 /* Main.storyboard */, + 4314D1B41D0E1182004B36C9 /* Assets.xcassets */, + 4314D1B61D0E1182004B36C9 /* Info.plist */, + 4314D1A81D0E1181004B36C9 /* Supporting Files */, + ); + path = "SDWebImage TV Demo"; + sourceTree = ""; + }; + 4314D1A81D0E1181004B36C9 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 4314D1A91D0E1181004B36C9 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 43A629D01D0DFD000089D7DD /* SDWebImage OSX Demo */ = { isa = PBXGroup; children = ( @@ -291,6 +344,7 @@ 43A629D01D0DFD000089D7DD /* SDWebImage OSX Demo */, 43A629EF1D0E07600089D7DD /* SDWebImage Watch Demo */, 43A629FE1D0E07600089D7DD /* SDWebImage Watch Demo Extension */, + 4314D1A71D0E1181004B36C9 /* SDWebImage TV Demo */, 53761298155AB74D005750A4 /* Frameworks */, 53761296155AB74D005750A4 /* Products */, ); @@ -303,6 +357,7 @@ 43A629CF1D0DFD000089D7DD /* SDWebImage OSX Demo.app */, 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */, 43A629FA1D0E07600089D7DD /* SDWebImage Watch Demo Extension.appex */, + 4314D1A61D0E1181004B36C9 /* SDWebImage TV Demo.app */, ); name = Products; sourceTree = ""; @@ -365,6 +420,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 4314D1A51D0E1181004B36C9 /* SDWebImage TV Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4314D1B71D0E1182004B36C9 /* Build configuration list for PBXNativeTarget "SDWebImage TV Demo" */; + buildPhases = ( + 4314D1A21D0E1181004B36C9 /* Sources */, + 4314D1A31D0E1181004B36C9 /* Frameworks */, + 4314D1A41D0E1181004B36C9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4314D1BB1D0E11A0004B36C9 /* PBXTargetDependency */, + ); + name = "SDWebImage TV Demo"; + productName = "SDWebImage TV Demo"; + productReference = 4314D1A61D0E1181004B36C9 /* SDWebImage TV Demo.app */; + productType = "com.apple.product-type.application"; + }; 43A629CE1D0DFD000089D7DD /* SDWebImage OSX Demo */ = { isa = PBXNativeTarget; buildConfigurationList = 43A629E81D0DFD000089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage OSX Demo" */; @@ -447,6 +520,9 @@ LastUpgradeCheck = 0710; ORGANIZATIONNAME = Dailymotion; TargetAttributes = { + 4314D1A51D0E1181004B36C9 = { + CreatedOnToolsVersion = 7.3.1; + }; 43A629CE1D0DFD000089D7DD = { CreatedOnToolsVersion = 7.3.1; }; @@ -481,6 +557,7 @@ 43A629CE1D0DFD000089D7DD /* SDWebImage OSX Demo */, 43A629ED1D0E07600089D7DD /* SDWebImage Watch Demo */, 43A629F91D0E07600089D7DD /* SDWebImage Watch Demo Extension */, + 4314D1A51D0E1181004B36C9 /* SDWebImage TV Demo */, ); }; /* End PBXProject section */ @@ -531,6 +608,15 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 4314D1A41D0E1181004B36C9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D1B51D0E1182004B36C9 /* Assets.xcassets in Resources */, + 4314D1B31D0E1182004B36C9 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 43A629CD1D0DFD000089D7DD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -573,6 +659,16 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4314D1A21D0E1181004B36C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4314D1B01D0E1182004B36C9 /* ViewController.m in Sources */, + 4314D1AD1D0E1181004B36C9 /* AppDelegate.m in Sources */, + 4314D1AA1D0E1181004B36C9 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 43A629CB1D0DFD000089D7DD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -612,6 +708,11 @@ name = "SDWebImage watchOS static"; targetProxy = 4314D19F1D0E0EBD004B36C9 /* PBXContainerItemProxy */; }; + 4314D1BB1D0E11A0004B36C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage tvOS"; + targetProxy = 4314D1BA1D0E11A0004B36C9 /* PBXContainerItemProxy */; + }; 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; @@ -635,6 +736,14 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 4314D1B11D0E1182004B36C9 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4314D1B21D0E1182004B36C9 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; 43A629DC1D0DFD000089D7DD /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -670,6 +779,84 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 4314D1B81D0E1182004B36C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage TV Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-TV-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Debug; + }; + 4314D1B91D0E1182004B36C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SDWebImage TV Demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-TV-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Release; + }; 43A629E01D0DFD000089D7DD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -995,6 +1182,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 4314D1B71D0E1182004B36C9 /* Build configuration list for PBXNativeTarget "SDWebImage TV Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4314D1B81D0E1182004B36C9 /* Debug */, + 4314D1B91D0E1182004B36C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 43A629E81D0DFD000089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage OSX Demo" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme new file mode 100644 index 00000000..85d41d2f --- /dev/null +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage TV Demo/AppDelegate.h b/Examples/SDWebImage TV Demo/AppDelegate.h new file mode 100644 index 00000000..30bd3fcd --- /dev/null +++ b/Examples/SDWebImage TV Demo/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// SDWebImage TV Demo +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/Examples/SDWebImage TV Demo/AppDelegate.m b/Examples/SDWebImage TV Demo/AppDelegate.m new file mode 100644 index 00000000..29ff38e8 --- /dev/null +++ b/Examples/SDWebImage TV Demo/AppDelegate.m @@ -0,0 +1,45 @@ +// +// AppDelegate.m +// SDWebImage TV Demo +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json new file mode 100644 index 00000000..8bf75d9f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json new file mode 100644 index 00000000..8bf75d9f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100644 index 00000000..6a3dcfa5 --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,26 @@ +{ + "assets" : [ + { + "size" : "1280x768", + "idiom" : "tv", + "filename" : "App Icon - Large.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "400x240", + "idiom" : "tv", + "filename" : "App Icon - Small.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "1920x720", + "idiom" : "tv", + "filename" : "Top Shelf Image.imageset", + "role" : "top-shelf-image" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100644 index 00000000..0564959f --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Examples/SDWebImage TV Demo/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 00000000..29d94c78 --- /dev/null +++ b/Examples/SDWebImage TV Demo/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "orientation" : "landscape", + "idiom" : "tv", + "extent" : "full-screen", + "minimum-system-version" : "9.0", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/SDWebImage TV Demo/Base.lproj/Main.storyboard b/Examples/SDWebImage TV Demo/Base.lproj/Main.storyboard new file mode 100644 index 00000000..91f4335d --- /dev/null +++ b/Examples/SDWebImage TV Demo/Base.lproj/Main.storyboard @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SDWebImage TV Demo/Info.plist b/Examples/SDWebImage TV Demo/Info.plist new file mode 100644 index 00000000..256f5b19 --- /dev/null +++ b/Examples/SDWebImage TV Demo/Info.plist @@ -0,0 +1,37 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/Examples/SDWebImage TV Demo/ViewController.h b/Examples/SDWebImage TV Demo/ViewController.h new file mode 100644 index 00000000..c2346e52 --- /dev/null +++ b/Examples/SDWebImage TV Demo/ViewController.h @@ -0,0 +1,14 @@ +// +// ViewController.h +// SDWebImage TV Demo +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface ViewController : UIViewController + +@end + diff --git a/Examples/SDWebImage TV Demo/ViewController.m b/Examples/SDWebImage TV Demo/ViewController.m new file mode 100644 index 00000000..2df00a55 --- /dev/null +++ b/Examples/SDWebImage TV Demo/ViewController.m @@ -0,0 +1,39 @@ +// +// ViewController.m +// SDWebImage TV Demo +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "ViewController.h" +#import + +@interface ViewController () + +@property (weak, nonatomic) IBOutlet FLAnimatedImageView *imageView1; +@property (weak, nonatomic) IBOutlet FLAnimatedImageView *imageView2; +@property (weak, nonatomic) IBOutlet FLAnimatedImageView *imageView3; +@property (weak, nonatomic) IBOutlet FLAnimatedImageView *imageView4; + +@end + + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + [self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"http://assets.sbnation.com/assets/2512203/dogflops.gif"]]; + [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]]; + [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]]; + [self.imageView4 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"]]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Examples/SDWebImage TV Demo/main.m b/Examples/SDWebImage TV Demo/main.m new file mode 100644 index 00000000..13aa3614 --- /dev/null +++ b/Examples/SDWebImage TV Demo/main.m @@ -0,0 +1,16 @@ +// +// main.m +// SDWebImage TV Demo +// +// Created by Bogdan on 13/06/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h index c997f138..9772a34b 100644 --- a/WebImage/SDWebImage.h +++ b/WebImage/SDWebImage.h @@ -42,3 +42,6 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; #if SD_MAC #import #endif +#if SD_UIKIT +#import +#endif From d760b43b6673adabc49b78973d2ea74e49b55534 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 01:15:28 +0300 Subject: [PATCH 079/207] Travis CI update --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8394487f..bf1a3cf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,9 +37,10 @@ script: - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage watchOS' -sdk watchsimulator -configuration Debug | xcpretty -c - echo Build the Demo apps + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX Demo' -sdk macosx -configuration Debug | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Watch Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage TV Demo' -sdk appletvsimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Watch Demo' -sdk watchsimulator -configuration Debug | xcpretty -c - echo Run the tests - pod install --project-directory=Tests From ac36b84463042799607a854a4078bbfdd7a36435 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 01:23:39 +0300 Subject: [PATCH 080/207] Update on the libSDWebImage.a rename to libSDWebImage iOS static.a --- Examples/SDWebImage Demo.xcodeproj/project.pbxproj | 11 ++++++----- .../xcschemes/SDWebImage iOS static.xcscheme | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index 0424145b..4222f7c4 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ 4314D1B31D0E1182004B36C9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B11D0E1182004B36C9 /* Main.storyboard */; }; 4314D1B51D0E1182004B36C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B41D0E1182004B36C9 /* Assets.xcassets */; }; 4314D1BC1D0E11A8004B36C9 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 431739601CDFCC370008FEB9 /* SDWebImage.framework */; }; - 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage.a */; }; + 4317396A1CDFCCE20008FEB9 /* libSDWebImage iOS static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage iOS static.a */; }; 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D21D0DFD000089D7DD /* AppDelegate.m */; }; 43A629D61D0DFD000089D7DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D51D0DFD000089D7DD /* main.m */; }; 43A629D91D0DFD000089D7DD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D81D0DFD000089D7DD /* ViewController.m */; }; @@ -244,7 +244,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4317396A1CDFCCE20008FEB9 /* libSDWebImage.a in Frameworks */, + 4317396A1CDFCCE20008FEB9 /* libSDWebImage iOS static.a in Frameworks */, DA248D44195470FD00390AB0 /* MapKit.framework in Frameworks */, 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */, 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */, @@ -407,7 +407,7 @@ DA248D6D1954841D00390AB0 /* Products */ = { isa = PBXGroup; children = ( - DA248D741954841D00390AB0 /* libSDWebImage.a */, + DA248D741954841D00390AB0 /* libSDWebImage iOS static.a */, 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */, 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */, 431739601CDFCC370008FEB9 /* SDWebImage.framework */, @@ -598,10 +598,10 @@ remoteRef = 43A629E61D0DFD000089D7DD /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - DA248D741954841D00390AB0 /* libSDWebImage.a */ = { + DA248D741954841D00390AB0 /* libSDWebImage iOS static.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; - path = libSDWebImage.a; + path = "libSDWebImage iOS static.a"; remoteRef = DA248D731954841D00390AB0 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1189,6 +1189,7 @@ 4314D1B91D0E1182004B36C9 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 43A629E81D0DFD000089D7DD /* Build configuration list for PBXNativeTarget "SDWebImage OSX Demo" */ = { isa = XCConfigurationList; diff --git a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme index 64d296a0..e227d93a 100644 --- a/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme +++ b/SDWebImage.xcodeproj/xcshareddata/xcschemes/SDWebImage iOS static.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ From 9523b0543a4cec93bef7fff0fcbca706f53ad919 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 01:47:00 +0300 Subject: [PATCH 081/207] Correct import of MapKit --- SDWebImage/MKAnnotationView+WebCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index a7e7b743..f056218f 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -10,7 +10,7 @@ #if SD_UIKIT || SD_MAC -#import "MapKit/MapKit.h" +#import #import "SDWebImageManager.h" /** From a6dcf79e3bf09541c03a2efaa7602a6974ad70f4 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 01:48:04 +0300 Subject: [PATCH 082/207] Updated the Travis CI script --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bf1a3cf7..a6b2151e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,5 +44,5 @@ script: - echo Run the tests - pod install --project-directory=Tests - - xcodebuild clean -workspace SDWebImage.xcworkspace -scheme 'SDWebImage-static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c From 67ef868d37a00cbd8fc005f5f9592085869cef49 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 08:25:34 +0300 Subject: [PATCH 083/207] Let's try the build with Xcode 7.3 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a6b2151e..5bb46fd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: objective-c -osx_image: xcode7.1 +osx_image: xcode7.3 env: global: From a4da728a08d31a2bfda995e98a61508db5cb9712 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 08:55:05 +0300 Subject: [PATCH 084/207] Updated deployment targets for the Demo project (no longer project level iOS target, set watch to 2.0 and appletv to 9.0) --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 16 ++++++++-------- .../xcschemes/SDWebImage Watch Demo.xcscheme | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index 4222f7c4..ee45f863 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -813,7 +813,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -853,7 +853,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -968,7 +968,7 @@ SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; @@ -1007,7 +1007,7 @@ SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; @@ -1045,7 +1045,7 @@ SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; @@ -1085,7 +1085,7 @@ SDKROOT = watchos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; @@ -1109,7 +1109,6 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = YES; }; name = Debug; @@ -1126,7 +1125,6 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; VALIDATE_PRODUCT = YES; }; @@ -1147,6 +1145,7 @@ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", ); INFOPLIST_FILE = "SDWebImage Demo/SDWebImage Demo-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_CFLAGS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; @@ -1171,6 +1170,7 @@ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", ); INFOPLIST_FILE = "SDWebImage Demo/SDWebImage Demo-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme index f45b63d2..704d316c 100644 --- a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme @@ -78,7 +78,8 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" - allowLocationSimulation = "YES"> + allowLocationSimulation = "YES" + notificationPayloadFile = "SDWebImage Watch Demo Extension/PushNotificationPayload.apns"> Date: Mon, 13 Jun 2016 08:56:06 +0300 Subject: [PATCH 085/207] Updated the Travis CI script so it doesn't fail - both the "SDWebImage iOS Demo" and "SDWebImage Watch Demo" have dependencies with other platforms, so removing the -sdk option and added destination to make sure it builds for simulator --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5bb46fd2..7a317312 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,9 +38,9 @@ script: - echo Build the Demo apps - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage OSX Demo' -sdk macosx -configuration Debug | xcpretty -c - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS Demo' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS Demo' -configuration Debug -destination 'name=iPhone 6s' | xcpretty -c - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage TV Demo' -sdk appletvsimulator -configuration Debug | xcpretty -c - - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Watch Demo' -sdk watchsimulator -configuration Debug | xcpretty -c + - xcodebuild clean build -workspace SDWebImage.xcworkspace -scheme 'SDWebImage Watch Demo' -configuration Debug -destination 'name=iPhone 6s' | xcpretty -c - echo Run the tests - pod install --project-directory=Tests From 13cfa24cfe08c632bb456072ddbc9ef6bd39c75e Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 09:14:02 +0300 Subject: [PATCH 086/207] Proper file header copyright --- Examples/SDWebImage OSX Demo/AppDelegate.h | 14 +++++++------- Examples/SDWebImage OSX Demo/AppDelegate.m | 14 +++++++------- Examples/SDWebImage OSX Demo/ViewController.h | 14 +++++++------- Examples/SDWebImage OSX Demo/ViewController.m | 14 +++++++------- Examples/SDWebImage OSX Demo/main.m | 14 +++++++------- Examples/SDWebImage TV Demo/AppDelegate.h | 14 +++++++------- Examples/SDWebImage TV Demo/AppDelegate.m | 14 +++++++------- Examples/SDWebImage TV Demo/ViewController.h | 14 +++++++------- Examples/SDWebImage TV Demo/ViewController.m | 14 +++++++------- Examples/SDWebImage TV Demo/main.m | 14 +++++++------- .../ExtensionDelegate.h | 14 +++++++------- .../ExtensionDelegate.m | 14 +++++++------- .../InterfaceController.h | 14 +++++++------- .../InterfaceController.m | 14 +++++++------- .../NotificationController.h | 14 +++++++------- .../NotificationController.m | 14 +++++++------- SDWebImage/NSImage+WebCache.h | 14 +++++++------- SDWebImage/NSImage+WebCache.m | 14 +++++++------- 18 files changed, 126 insertions(+), 126 deletions(-) diff --git a/Examples/SDWebImage OSX Demo/AppDelegate.h b/Examples/SDWebImage OSX Demo/AppDelegate.h index ea817525..a9a60529 100644 --- a/Examples/SDWebImage OSX Demo/AppDelegate.h +++ b/Examples/SDWebImage OSX Demo/AppDelegate.h @@ -1,10 +1,10 @@ -// -// AppDelegate.h -// SDWebImage OSX Demo -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage OSX Demo/AppDelegate.m b/Examples/SDWebImage OSX Demo/AppDelegate.m index 8ec881f5..4ddb742b 100644 --- a/Examples/SDWebImage OSX Demo/AppDelegate.m +++ b/Examples/SDWebImage OSX Demo/AppDelegate.m @@ -1,10 +1,10 @@ -// -// AppDelegate.m -// SDWebImage OSX Demo -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "AppDelegate.h" diff --git a/Examples/SDWebImage OSX Demo/ViewController.h b/Examples/SDWebImage OSX Demo/ViewController.h index fe44811e..918665e4 100644 --- a/Examples/SDWebImage OSX Demo/ViewController.h +++ b/Examples/SDWebImage OSX Demo/ViewController.h @@ -1,10 +1,10 @@ -// -// ViewController.h -// SDWebImage OSX Demo -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage OSX Demo/ViewController.m b/Examples/SDWebImage OSX Demo/ViewController.m index 56166279..45dce71d 100644 --- a/Examples/SDWebImage OSX Demo/ViewController.m +++ b/Examples/SDWebImage OSX Demo/ViewController.m @@ -1,10 +1,10 @@ -// -// ViewController.m -// SDWebImage OSX Demo -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "ViewController.h" diff --git a/Examples/SDWebImage OSX Demo/main.m b/Examples/SDWebImage OSX Demo/main.m index e49dcdc1..a66418e2 100644 --- a/Examples/SDWebImage OSX Demo/main.m +++ b/Examples/SDWebImage OSX Demo/main.m @@ -1,10 +1,10 @@ -// -// main.m -// SDWebImage OSX Demo -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage TV Demo/AppDelegate.h b/Examples/SDWebImage TV Demo/AppDelegate.h index 30bd3fcd..8b9276d4 100644 --- a/Examples/SDWebImage TV Demo/AppDelegate.h +++ b/Examples/SDWebImage TV Demo/AppDelegate.h @@ -1,10 +1,10 @@ -// -// AppDelegate.h -// SDWebImage TV Demo -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage TV Demo/AppDelegate.m b/Examples/SDWebImage TV Demo/AppDelegate.m index 29ff38e8..1d02f83a 100644 --- a/Examples/SDWebImage TV Demo/AppDelegate.m +++ b/Examples/SDWebImage TV Demo/AppDelegate.m @@ -1,10 +1,10 @@ -// -// AppDelegate.m -// SDWebImage TV Demo -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "AppDelegate.h" diff --git a/Examples/SDWebImage TV Demo/ViewController.h b/Examples/SDWebImage TV Demo/ViewController.h index c2346e52..7acfb742 100644 --- a/Examples/SDWebImage TV Demo/ViewController.h +++ b/Examples/SDWebImage TV Demo/ViewController.h @@ -1,10 +1,10 @@ -// -// ViewController.h -// SDWebImage TV Demo -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage TV Demo/ViewController.m b/Examples/SDWebImage TV Demo/ViewController.m index 2df00a55..2fb918e5 100644 --- a/Examples/SDWebImage TV Demo/ViewController.m +++ b/Examples/SDWebImage TV Demo/ViewController.m @@ -1,10 +1,10 @@ -// -// ViewController.m -// SDWebImage TV Demo -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "ViewController.h" #import diff --git a/Examples/SDWebImage TV Demo/main.m b/Examples/SDWebImage TV Demo/main.m index 13aa3614..e840b532 100644 --- a/Examples/SDWebImage TV Demo/main.m +++ b/Examples/SDWebImage TV Demo/main.m @@ -1,10 +1,10 @@ -// -// main.m -// SDWebImage TV Demo -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 #import "AppDelegate.h" diff --git a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h index 0560a719..dc3988b4 100644 --- a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h +++ b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.h @@ -1,10 +1,10 @@ -// -// ExtensionDelegate.h -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 diff --git a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m index 673db3b9..1aa5784e 100644 --- a/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m +++ b/Examples/SDWebImage Watch Demo Extension/ExtensionDelegate.m @@ -1,10 +1,10 @@ -// -// ExtensionDelegate.m -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "ExtensionDelegate.h" diff --git a/Examples/SDWebImage Watch Demo Extension/InterfaceController.h b/Examples/SDWebImage Watch Demo Extension/InterfaceController.h index ffd77550..2408aab4 100644 --- a/Examples/SDWebImage Watch Demo Extension/InterfaceController.h +++ b/Examples/SDWebImage Watch Demo Extension/InterfaceController.h @@ -1,10 +1,10 @@ -// -// InterfaceController.h -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 #import diff --git a/Examples/SDWebImage Watch Demo Extension/InterfaceController.m b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m index 66b2439a..a71ef5be 100644 --- a/Examples/SDWebImage Watch Demo Extension/InterfaceController.m +++ b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m @@ -1,10 +1,10 @@ -// -// InterfaceController.m -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "InterfaceController.h" #import diff --git a/Examples/SDWebImage Watch Demo Extension/NotificationController.h b/Examples/SDWebImage Watch Demo Extension/NotificationController.h index ac4cf287..13a3bd3e 100644 --- a/Examples/SDWebImage Watch Demo Extension/NotificationController.h +++ b/Examples/SDWebImage Watch Demo Extension/NotificationController.h @@ -1,10 +1,10 @@ -// -// NotificationController.h -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 #import diff --git a/Examples/SDWebImage Watch Demo Extension/NotificationController.m b/Examples/SDWebImage Watch Demo Extension/NotificationController.m index a72703d9..5482f38e 100644 --- a/Examples/SDWebImage Watch Demo Extension/NotificationController.m +++ b/Examples/SDWebImage Watch Demo Extension/NotificationController.m @@ -1,10 +1,10 @@ -// -// NotificationController.m -// SDWebImage Watch Demo Extension -// -// Created by Bogdan on 13/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "NotificationController.h" diff --git a/SDWebImage/NSImage+WebCache.h b/SDWebImage/NSImage+WebCache.h index de24f436..d68bdf03 100644 --- a/SDWebImage/NSImage+WebCache.h +++ b/SDWebImage/NSImage+WebCache.h @@ -1,10 +1,10 @@ -// -// NSImage+WebCache.h -// SDWebImage -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "SDWebImageCompat.h" diff --git a/SDWebImage/NSImage+WebCache.m b/SDWebImage/NSImage+WebCache.m index ff511a5d..de8e0049 100644 --- a/SDWebImage/NSImage+WebCache.m +++ b/SDWebImage/NSImage+WebCache.m @@ -1,10 +1,10 @@ -// -// NSImage+WebCache.m -// SDWebImage -// -// Created by Bogdan on 12/06/16. -// Copyright © 2016 Dailymotion. All rights reserved. -// +/* + * 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 "NSImage+WebCache.h" From 8e81f4273f7f646f943ddb2b3c509b5cdbad9357 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 09:47:09 +0300 Subject: [PATCH 087/207] Added the osx platform to the podspec and set the osx deployment target to 10.8 because of some compiler issues (pod lib lint) --- Examples/SDWebImage Demo.xcodeproj/project.pbxproj | 4 ++-- SDWebImage.podspec | 3 +++ SDWebImage.xcodeproj/project.pbxproj | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index ee45f863..83a6441f 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -887,7 +887,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "SDWebImage OSX Demo/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-OSX-Demo"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -927,7 +927,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "SDWebImage OSX Demo/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.SDWebImage-OSX-Demo"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/SDWebImage.podspec b/SDWebImage.podspec index f205158a..bcdde91f 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -1,6 +1,7 @@ Pod::Spec.new do |s| s.name = 'SDWebImage' s.version = '3.8.1' + s.osx.deployment_target = '10.8' s.ios.deployment_target = '7.0' s.tvos.deployment_target = '9.0' s.watchos.deployment_target = '2.0' @@ -31,7 +32,9 @@ Pod::Spec.new do |s| end s.subspec 'MapKit' do |mk| + mk.osx.deployment_target = '10.8' mk.ios.deployment_target = '7.0' + mk.tvos.deployment_target = '9.0' mk.source_files = 'SDWebImage/MKAnnotationView+WebCache.*' mk.framework = 'MapKit' mk.dependency 'SDWebImage/Core' diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 1f6cc3eb..32025ea1 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -2274,7 +2274,7 @@ GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = WebImage/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; PRODUCT_NAME = SDWebImage; @@ -2295,7 +2295,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; INFOPLIST_FILE = WebImage/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.$(PRODUCT_NAME:rfc1034identifier).ios"; PRODUCT_NAME = SDWebImage; From 179362f55df39f5e80bdb9ac173109adf998b477 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 13 Jun 2016 09:49:10 +0300 Subject: [PATCH 088/207] Attempt to fix the tests as they were 2 tests trying to get the same image --- Tests/Tests/SDWebImageManagerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index aeb00426..f2059e48 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -38,7 +38,7 @@ static int64_t kAsyncTestTimeout = 5; - (void)testThatDownloadInvokesCompletionBlockWithCorrectParamsAsync { __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; - NSURL *originalImageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]; + NSURL *originalImageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"]; [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached From ccacfc768d82c662c7dd30f0a9284025df2b995d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 14 Jun 2016 22:03:58 +0300 Subject: [PATCH 089/207] Started using libwep 0.5.0 (changed the submodule hash, updated the files added to our project). To fix "gnu-style inline assembly is disabled" issues, explicitly set WEBP_USE_INTRINSICS for the watchOS targets --- SDWebImage.xcodeproj/project.pbxproj | 1207 +++++++++++++++++--------- Vendors/libwebp | 2 +- 2 files changed, 815 insertions(+), 394 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 32025ea1..9faba8a7 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -39,76 +39,51 @@ 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4314D11D1D0E0E3B004B36C9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; 4314D11E1D0E0E3B004B36C9 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; 4314D11F1D0E0E3B004B36C9 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; 4314D1201D0E0E3B004B36C9 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; 4314D1211D0E0E3B004B36C9 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; - 4314D1221D0E0E3B004B36C9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; 4314D1231D0E0E3B004B36C9 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; 4314D1241D0E0E3B004B36C9 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; - 4314D1251D0E0E3B004B36C9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; 4314D1271D0E0E3B004B36C9 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; - 4314D1281D0E0E3B004B36C9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 4314D1291D0E0E3B004B36C9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; 4314D12A1D0E0E3B004B36C9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; - 4314D12B1D0E0E3B004B36C9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 4314D12C1D0E0E3B004B36C9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 4314D12D1D0E0E3B004B36C9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 4314D12E1D0E0E3B004B36C9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; 4314D1321D0E0E3B004B36C9 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; - 4314D1331D0E0E3B004B36C9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; 4314D1341D0E0E3B004B36C9 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; 4314D1351D0E0E3B004B36C9 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; 4314D1361D0E0E3B004B36C9 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; 4314D1371D0E0E3B004B36C9 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; - 4314D1381D0E0E3B004B36C9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; - 4314D13A1D0E0E3B004B36C9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; - 4314D13C1D0E0E3B004B36C9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; 4314D13D1D0E0E3B004B36C9 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; 4314D13E1D0E0E3B004B36C9 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; - 4314D13F1D0E0E3B004B36C9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; 4314D1411D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; 4314D1421D0E0E3B004B36C9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; - 4314D1431D0E0E3B004B36C9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; 4314D1441D0E0E3B004B36C9 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; 4314D1451D0E0E3B004B36C9 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; - 4314D1471D0E0E3B004B36C9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 4314D1481D0E0E3B004B36C9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 4314D1491D0E0E3B004B36C9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 4314D14A1D0E0E3B004B36C9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; 4314D14B1D0E0E3B004B36C9 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; 4314D14C1D0E0E3B004B36C9 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; 4314D14D1D0E0E3B004B36C9 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; - 4314D14E1D0E0E3B004B36C9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; 4314D14F1D0E0E3B004B36C9 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; 4314D1501D0E0E3B004B36C9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; 4314D1511D0E0E3B004B36C9 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; 4314D1521D0E0E3B004B36C9 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; 4314D1531D0E0E3B004B36C9 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; - 4314D1541D0E0E3B004B36C9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; 4314D1551D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; 4314D1571D0E0E3B004B36C9 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; 4314D1581D0E0E3B004B36C9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; - 4314D1591D0E0E3B004B36C9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; 4314D15A1D0E0E3B004B36C9 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; - 4314D15B1D0E0E3B004B36C9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; 4314D15C1D0E0E3B004B36C9 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; 4314D15E1D0E0E3B004B36C9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB894814D35E9E0020B787 /* UIKit.framework */; }; 4314D15F1D0E0E3B004B36C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53922D72148C55820056699D /* Foundation.framework */; }; 4314D1601D0E0E3B004B36C9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53FB893F14D35D1A0020B787 /* CoreGraphics.framework */; }; 4314D1621D0E0E3B004B36C9 /* mux_types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC91998E60B007367ED /* mux_types.h */; }; 4314D1631D0E0E3B004B36C9 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; - 4314D1641D0E0E3B004B36C9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; 4314D1651D0E0E3B004B36C9 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; 4314D1661D0E0E3B004B36C9 /* quant_levels_dec.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBA1998E60B007367ED /* quant_levels_dec.h */; }; 4314D1671D0E0E3B004B36C9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; - 4314D1681D0E0E3B004B36C9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; 4314D1691D0E0E3B004B36C9 /* color_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAE1998E60B007367ED /* color_cache.h */; }; 4314D16A1D0E0E3B004B36C9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; 4314D16B1D0E0E3B004B36C9 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; @@ -125,7 +100,6 @@ 4314D1771D0E0E3B004B36C9 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8E148C56230056699D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4314D17A1D0E0E3B004B36C9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; 4314D17B1D0E0E3B004B36C9 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; 4314D17C1D0E0E3B004B36C9 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D17D1D0E0E3B004B36C9 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D91148C56230056699D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -134,14 +108,12 @@ 4314D1801D0E0E3B004B36C9 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; 4314D1811D0E0E3B004B36C9 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D95148C56230056699D /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1821D0E0E3B004B36C9 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; - 4314D1831D0E0E3B004B36C9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; 4314D1841D0E0E3B004B36C9 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E71646388E002868E7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1851D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1861D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1871D0E0E3B004B36C9 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; 4314D1881D0E0E3B004B36C9 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; 4314D1891D0E0E3B004B36C9 /* rescaler.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CBE1998E60B007367ED /* rescaler.h */; }; - 4314D18B1D0E0E3B004B36C9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; 4314D18E1D0E0E3B004B36C9 /* vp8i.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D661998E6B2007367ED /* vp8i.h */; }; 4314D18F1D0E0E3B004B36C9 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4314D1901D0E0E3B004B36C9 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; }; @@ -164,34 +136,6 @@ 431738841CDFC2580008FEB9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; 431738851CDFC2580008FEB9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; 431738861CDFC2580008FEB9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; - 431738871CDFC25E0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; - 431738881CDFC25E0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 431738891CDFC25E0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; - 4317388A1CDFC25E0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; - 4317388B1CDFC25E0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 4317388C1CDFC25E0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 4317388D1CDFC25E0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; - 4317388E1CDFC25E0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 4317388F1CDFC25E0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; - 431738901CDFC25E0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; - 431738911CDFC25E0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; - 431738921CDFC25E0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; - 431738931CDFC25E0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 431738941CDFC25E0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; - 431738951CDFC25E0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; - 431738961CDFC25E0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; - 431738971CDFC25E0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; - 431738981CDFC25E0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 431738991CDFC25E0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 4317389A1CDFC25E0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; - 4317389B1CDFC25E0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; - 4317389C1CDFC25E0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; - 4317389D1CDFC25E0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; - 4317389E1CDFC25E0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; - 4317389F1CDFC25E0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; - 431738A01CDFC25E0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; - 431738A11CDFC25E0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; - 431738A21CDFC25E0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; 431738A41CDFC2630008FEB9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; 431738A51CDFC2630008FEB9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; @@ -255,62 +199,6 @@ 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; 431738E01CDFC8A40008FEB9 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; 431738E11CDFC8A40008FEB9 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; - 431738E21CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; - 431738E31CDFC8AA0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 431738E41CDFC8AA0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; - 431738E51CDFC8AA0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; - 431738E61CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 431738E71CDFC8AA0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 431738E81CDFC8AA0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; - 431738E91CDFC8AA0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 431738EA1CDFC8AA0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; - 431738EB1CDFC8AA0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; - 431738EC1CDFC8AA0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; - 431738ED1CDFC8AA0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; - 431738EE1CDFC8AA0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 431738EF1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; - 431738F01CDFC8AA0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; - 431738F11CDFC8AA0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; - 431738F21CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; - 431738F31CDFC8AA0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 431738F41CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; - 431738F61CDFC8AA0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; - 431738F71CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; - 431738F81CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; - 431738F91CDFC8AA0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; - 431738FA1CDFC8AA0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; - 431738FB1CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; - 431738FC1CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; - 431738FD1CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; - 431738FE1CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; - 431738FF1CDFC8AA0008FEB9 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 431739001CDFC8AA0008FEB9 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; - 431739011CDFC8AA0008FEB9 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; - 431739021CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 431739031CDFC8AA0008FEB9 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 431739041CDFC8AA0008FEB9 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; - 431739051CDFC8AA0008FEB9 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 431739061CDFC8AA0008FEB9 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; - 431739071CDFC8AA0008FEB9 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; - 431739081CDFC8AA0008FEB9 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; - 431739091CDFC8AA0008FEB9 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; - 4317390A1CDFC8AA0008FEB9 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 4317390B1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; - 4317390C1CDFC8AA0008FEB9 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; - 4317390D1CDFC8AA0008FEB9 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; - 4317390E1CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; - 4317390F1CDFC8AA0008FEB9 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 431739101CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 431739111CDFC8AA0008FEB9 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; - 431739121CDFC8AA0008FEB9 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; - 431739131CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; - 431739141CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; - 431739151CDFC8AA0008FEB9 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; - 431739161CDFC8AA0008FEB9 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; - 431739171CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; - 431739181CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; - 431739191CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; 4317391B1CDFC8B20008FEB9 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; 4317391C1CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAA1998E60B007367ED /* bit_reader_inl.h */; }; @@ -413,71 +301,47 @@ 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; - 4397D2781D0DDD8C00BB2784 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; 4397D2791D0DDD8C00BB2784 /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB21998E60B007367ED /* huffman.c */; }; 4397D27A1D0DDD8C00BB2784 /* quant_levels.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB71998E60B007367ED /* quant_levels.c */; }; 4397D27B1D0DDD8C00BB2784 /* idec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D601998E6B2007367ED /* idec.c */; }; 4397D27C1D0DDD8C00BB2784 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBB1998E60B007367ED /* random.c */; }; - 4397D27D1D0DDD8C00BB2784 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; 4397D27E1D0DDD8C00BB2784 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A18A6CC6172DC28500419892 /* UIImage+GIF.m */; }; 4397D27F1D0DDD8C00BB2784 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB921762547C00698166 /* UIImage+WebP.m */; }; - 4397D2801D0DDD8C00BB2784 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; 4397D2821D0DDD8C00BB2784 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBD1998E60B007367ED /* rescaler.c */; }; - 4397D2831D0DDD8C00BB2784 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 4397D2841D0DDD8C00BB2784 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; 4397D2851D0DDD8C00BB2784 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D631998E6B2007367ED /* quant.c */; }; - 4397D2861D0DDD8C00BB2784 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 4397D2871D0DDD8C00BB2784 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 4397D2881D0DDD8C00BB2784 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 4397D2891D0DDD8C00BB2784 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; 4397D28A1D0DDD8C00BB2784 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CBF1998E60B007367ED /* thread.c */; }; 4397D28C1D0DDD8C00BB2784 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D96148C56230056699D /* UIImageView+WebCache.m */; }; 4397D28D1D0DDD8C00BB2784 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB01998E60B007367ED /* filters.c */; }; - 4397D28E1D0DDD8C00BB2784 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; 4397D28F1D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 530E49E416460AE2002868E7 /* SDWebImageDownloaderOperation.m */; }; 4397D2901D0DDD8C00BB2784 /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D641998E6B2007367ED /* tree.c */; }; 4397D2911D0DDD8C00BB2784 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 4397D2921D0DDD8C00BB2784 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D92148C56230056699D /* SDWebImagePrefetcher.m */; }; - 4397D2931D0DDD8C00BB2784 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; 4397D2941D0DDD8C00BB2784 /* color_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAD1998E60B007367ED /* color_cache.c */; }; - 4397D2951D0DDD8C00BB2784 /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; 4397D2961D0DDD8C00BB2784 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */; }; - 4397D2971D0DDD8C00BB2784 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; 4397D2981D0DDD8C00BB2784 /* quant_levels_dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB91998E60B007367ED /* quant_levels_dec.c */; }; 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D671998E6B2007367ED /* vp8l.c */; }; - 4397D29A1D0DDD8C00BB2784 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8C148C56230056699D /* SDWebImageDownloader.m */; }; 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */; }; 4397D29D1D0DDD8C00BB2784 /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; - 4397D29E1D0DDD8C00BB2784 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; 4397D29F1D0DDD8C00BB2784 /* bit_writer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CAB1998E60B007367ED /* bit_writer.c */; }; 4397D2A01D0DDD8C00BB2784 /* vp8.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D651998E6B2007367ED /* vp8.c */; }; 4397D2A11D0DDD8C00BB2784 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8F148C56230056699D /* SDWebImageManager.m */; }; - 4397D2A21D0DDD8C00BB2784 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 4397D2A31D0DDD8C00BB2784 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 4397D2A41D0DDD8C00BB2784 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 4397D2A51D0DDD8C00BB2784 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; 4397D2A61D0DDD8C00BB2784 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; 4397D2A71D0DDD8C00BB2784 /* huffman_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CB41998E60B007367ED /* huffman_encode.c */; }; 4397D2A81D0DDD8C00BB2784 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D94148C56230056699D /* UIButton+WebCache.m */; }; - 4397D2A91D0DDD8C00BB2784 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; 4397D2AA1D0DDD8C00BB2784 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D611998E6B2007367ED /* io.c */; }; 4397D2AB1D0DDD8C00BB2784 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */; }; 4397D2AC1D0DDD8C00BB2784 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; 4397D2AD1D0DDD8C00BB2784 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D8A148C56230056699D /* SDWebImageDecoder.m */; }; 4397D2AE1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */; }; - 4397D2AF1D0DDD8C00BB2784 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; 4397D2B01D0DDD8C00BB2784 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 53922D86148C56230056699D /* SDImageCache.m */; }; 4397D2B21D0DDD8C00BB2784 /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5F1998E6B2007367ED /* frame.c */; }; 4397D2B31D0DDD8C00BB2784 /* bit_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CA81998E60B007367ED /* bit_reader.c */; }; - 4397D2B41D0DDD8C00BB2784 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; 4397D2B51D0DDD8C00BB2784 /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; - 4397D2B61D0DDD8C00BB2784 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; 4397D2B71D0DDD8C00BB2784 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; 4397D2BA1D0DDD8C00BB2784 /* demux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC51998E60B007367ED /* demux.h */; }; 4397D2BB1D0DDD8C00BB2784 /* endian_inl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAF1998E60B007367ED /* endian_inl.h */; }; 4397D2BD1D0DDD8C00BB2784 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CCA1998E60B007367ED /* types.h */; }; - 4397D2BE1D0DDD8C00BB2784 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; 4397D2BF1D0DDD8C00BB2784 /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; 4397D2C01D0DDD8C00BB2784 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2C11D0DDD8C00BB2784 /* format_constants.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC71998E60B007367ED /* format_constants.h */; }; @@ -491,9 +355,7 @@ 4397D2C91D0DDD8C00BB2784 /* bit_reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CA91998E60B007367ED /* bit_reader.h */; }; 4397D2CB1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2CC1D0DDD8C00BB2784 /* mux.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC81998E60B007367ED /* mux.h */; }; - 4397D2CD1D0DDD8C00BB2784 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; 4397D2CE1D0DDD8C00BB2784 /* huffman_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB51998E60B007367ED /* huffman_encode.h */; }; - 4397D2CF1D0DDD8C00BB2784 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; 4397D2D01D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 530E49E316460AE2002868E7 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2D11D0DDD8C00BB2784 /* decode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC41998E60B007367ED /* decode.h */; }; 4397D2D21D0DDD8C00BB2784 /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; @@ -513,10 +375,8 @@ 4397D2E11D0DDD8C00BB2784 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2E21D0DDD8C00BB2784 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CB31998E60B007367ED /* huffman.h */; }; 4397D2E31D0DDD8C00BB2784 /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4397D2E41D0DDD8C00BB2784 /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; 4397D2E51D0DDD8C00BB2784 /* bit_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CAC1998E60B007367ED /* bit_writer.h */; }; 4397D2E61D0DDD8C00BB2784 /* encode.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC61998E60B007367ED /* encode.h */; }; - 4397D2E71D0DDD8C00BB2784 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; 4397D2E81D0DDD8C00BB2784 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2E91D0DDD8C00BB2784 /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4397D2EA1D0DDD8C00BB2784 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -560,34 +420,6 @@ 43A62A391D0E0A860089D7DD /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC01998E60B007367ED /* thread.h */; }; 43A62A3A1D0E0A860089D7DD /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577CC11998E60B007367ED /* utils.c */; }; 43A62A3B1D0E0A860089D7DD /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577CC21998E60B007367ED /* utils.h */; }; - 43A62A3C1D0E0A8B0089D7DD /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */; }; - 43A62A3D1D0E0A8B0089D7DD /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C661998E60B007367ED /* alpha_processing.c */; }; - 43A62A3E1D0E0A8B0089D7DD /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C671998E60B007367ED /* cpu.c */; }; - 43A62A3F1D0E0A8B0089D7DD /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C681998E60B007367ED /* dec.c */; }; - 43A62A401D0E0A8B0089D7DD /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C691998E60B007367ED /* dec_clip_tables.c */; }; - 43A62A411D0E0A8B0089D7DD /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6A1998E60B007367ED /* dec_mips32.c */; }; - 43A62A421D0E0A8B0089D7DD /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6B1998E60B007367ED /* dec_neon.c */; }; - 43A62A431D0E0A8B0089D7DD /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6C1998E60B007367ED /* dec_sse2.c */; }; - 43A62A441D0E0A8B0089D7DD /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C6D1998E60B007367ED /* dsp.h */; }; - 43A62A451D0E0A8B0089D7DD /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6E1998E60B007367ED /* enc.c */; }; - 43A62A461D0E0A8B0089D7DD /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C6F1998E60B007367ED /* enc_avx2.c */; }; - 43A62A471D0E0A8B0089D7DD /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C701998E60B007367ED /* enc_mips32.c */; }; - 43A62A481D0E0A8B0089D7DD /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C711998E60B007367ED /* enc_neon.c */; }; - 43A62A491D0E0A8B0089D7DD /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C721998E60B007367ED /* enc_sse2.c */; }; - 43A62A4A1D0E0A8B0089D7DD /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C731998E60B007367ED /* lossless.c */; }; - 43A62A4B1D0E0A8B0089D7DD /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C741998E60B007367ED /* lossless.h */; }; - 43A62A4C1D0E0A8B0089D7DD /* lossless_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C751998E60B007367ED /* lossless_mips32.c */; }; - 43A62A4D1D0E0A8B0089D7DD /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C761998E60B007367ED /* lossless_neon.c */; }; - 43A62A4E1D0E0A8B0089D7DD /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C771998E60B007367ED /* lossless_sse2.c */; }; - 43A62A4F1D0E0A8B0089D7DD /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C791998E60B007367ED /* neon.h */; }; - 43A62A501D0E0A8B0089D7DD /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7A1998E60B007367ED /* upsampling.c */; }; - 43A62A511D0E0A8B0089D7DD /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7B1998E60B007367ED /* upsampling_neon.c */; }; - 43A62A521D0E0A8B0089D7DD /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7C1998E60B007367ED /* upsampling_sse2.c */; }; - 43A62A531D0E0A8B0089D7DD /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7D1998E60B007367ED /* yuv.c */; }; - 43A62A541D0E0A8B0089D7DD /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C7E1998E60B007367ED /* yuv.h */; }; - 43A62A551D0E0A8B0089D7DD /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C7F1998E60B007367ED /* yuv_mips32.c */; }; - 43A62A561D0E0A8B0089D7DD /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577C801998E60B007367ED /* yuv_sse2.c */; }; - 43A62A571D0E0A8B0089D7DD /* yuv_tables_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577C811998E60B007367ED /* yuv_tables_sse2.h */; }; 43A62A581D0E0A8F0089D7DD /* alpha.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5B1998E6B2007367ED /* alpha.c */; }; 43A62A591D0E0A8F0089D7DD /* alphai.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D5C1998E6B2007367ED /* alphai.h */; }; 43A62A5A1D0E0A8F0089D7DD /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D5D1998E6B2007367ED /* buffer.c */; }; @@ -621,6 +453,348 @@ 43CE75D31CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; 43CE75D41CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; 43CE75D51CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */; }; + 43DA7C161D1086000028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C171D1086100028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C181D1086110028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C191D1086120028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C1A1D1086120028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C1B1D1086130028BE58 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C151D1086000028BE58 /* common.h */; }; + 43DA7C911D1086570028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7C921D1086570028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7C931D1086570028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7C941D1086570028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7C951D1086570028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7C961D1086570028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7C971D1086570028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7C981D1086570028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7C991D1086570028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7C9A1D1086570028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7C9B1D1086570028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7C9C1D1086570028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7C9D1D1086570028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7C9E1D1086570028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7C9F1D1086570028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7CA01D1086570028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7CA11D1086570028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7CA21D1086570028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7CA31D1086570028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7CA41D1086570028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7CA51D1086570028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7CA61D1086570028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7CA71D1086570028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7CA81D1086570028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7CA91D1086570028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7CAA1D1086570028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7CAB1D1086570028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7CAC1D1086570028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7CAD1D1086570028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7CAE1D1086570028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7CAF1D1086570028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7CB01D1086570028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7CB11D1086570028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7CB21D1086570028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7CB31D1086570028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7CB41D1086570028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7CB51D1086570028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7CB61D1086570028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7CB71D1086570028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7CB81D1086570028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7CB91D1086570028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7CBA1D1086570028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7CBB1D1086570028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7CBC1D1086570028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7CBD1D1086570028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7CBE1D1086570028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7CBF1D1086570028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7CC01D1086570028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7CC11D1086570028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7CC21D1086570028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7CC31D1086570028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7CC41D1086570028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7CC51D1086570028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7CC61D1086570028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7CC71D1086570028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7CC81D10865E0028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7CC91D10865E0028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7CCA1D10865E0028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7CCB1D10865E0028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7CCC1D10865E0028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7CCD1D10865E0028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7CCE1D10865E0028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7CCF1D10865E0028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7CD01D10865E0028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7CD11D10865E0028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7CD21D10865E0028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7CD31D10865E0028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7CD41D10865E0028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7CD51D10865E0028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7CD61D10865E0028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7CD71D10865E0028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7CD81D10865E0028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7CD91D10865E0028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7CDA1D10865E0028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7CDB1D10865E0028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7CDC1D10865E0028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7CDD1D10865E0028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7CDE1D10865E0028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7CDF1D10865E0028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7CE01D10865E0028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7CE11D10865E0028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7CE21D10865E0028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7CE31D10865E0028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7CE41D10865E0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7CE51D10865E0028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7CE61D10865E0028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7CE71D10865E0028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7CE81D10865E0028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7CE91D10865E0028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7CEA1D10865E0028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7CEB1D10865E0028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7CEC1D10865E0028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7CED1D10865E0028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7CEE1D10865E0028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7CEF1D10865E0028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7CF01D10865E0028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7CF11D10865E0028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7CF21D10865E0028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7CF31D10865E0028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7CF41D10865E0028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7CF51D10865E0028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7CF61D10865E0028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7CF71D10865E0028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7CF81D10865E0028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7CF91D10865E0028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7CFA1D10865E0028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7CFB1D10865E0028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7CFC1D10865E0028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7CFD1D10865E0028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7CFE1D10865E0028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7CFF1D10865F0028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7D001D10865F0028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7D011D10865F0028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7D021D10865F0028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7D031D10865F0028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7D041D10865F0028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7D051D10865F0028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7D061D10865F0028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7D071D10865F0028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7D081D10865F0028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7D091D10865F0028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7D0A1D10865F0028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7D0B1D10865F0028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7D0C1D10865F0028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7D0D1D10865F0028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7D0E1D10865F0028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7D0F1D10865F0028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7D101D10865F0028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7D111D10865F0028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7D121D10865F0028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7D131D10865F0028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7D141D10865F0028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7D151D10865F0028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7D161D10865F0028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7D171D10865F0028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7D181D10865F0028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7D191D10865F0028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7D1A1D10865F0028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7D1B1D10865F0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7D1C1D10865F0028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7D1D1D10865F0028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7D1E1D10865F0028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7D1F1D10865F0028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7D201D10865F0028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7D211D10865F0028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7D221D10865F0028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7D231D10865F0028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7D241D10865F0028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7D251D10865F0028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7D261D10865F0028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7D271D10865F0028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7D281D10865F0028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7D291D10865F0028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7D2A1D10865F0028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7D2B1D10865F0028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7D2C1D10865F0028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7D2D1D10865F0028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7D2E1D10865F0028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7D2F1D10865F0028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7D301D10865F0028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7D311D10865F0028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7D321D10865F0028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7D331D10865F0028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7D341D10865F0028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7D351D10865F0028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7D361D1086600028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7D371D1086600028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7D381D1086600028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7D391D1086600028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7D3A1D1086600028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7D3B1D1086600028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7D3C1D1086600028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7D3D1D1086600028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7D3E1D1086600028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7D3F1D1086600028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7D401D1086600028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7D411D1086600028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7D421D1086600028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7D431D1086600028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7D441D1086600028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7D451D1086600028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7D461D1086600028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7D471D1086600028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7D481D1086600028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7D491D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7D4A1D1086600028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7D4B1D1086600028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7D4C1D1086600028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7D4D1D1086600028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7D4E1D1086600028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7D4F1D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7D501D1086600028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7D511D1086600028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7D521D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7D531D1086600028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7D541D1086600028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7D551D1086600028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7D561D1086600028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7D571D1086600028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7D581D1086600028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7D591D1086600028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7D5A1D1086600028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7D5B1D1086600028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7D5C1D1086600028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7D5D1D1086600028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7D5E1D1086600028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7D5F1D1086600028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7D601D1086600028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7D611D1086600028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7D621D1086600028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7D631D1086600028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7D641D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7D651D1086600028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7D661D1086600028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7D671D1086600028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7D681D1086600028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7D691D1086600028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7D6A1D1086600028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7D6B1D1086600028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7D6C1D1086600028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7D6D1D1086600028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7D6E1D1086600028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7D6F1D1086600028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7D701D1086600028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7D711D1086600028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7D721D1086600028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7D731D1086600028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7D741D1086600028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7D751D1086600028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7D761D1086600028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7D771D1086600028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7D781D1086600028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7D791D1086600028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7D7A1D1086600028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7D7B1D1086600028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7D7C1D1086600028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7D7D1D1086600028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7D7E1D1086600028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7D7F1D1086600028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7D801D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7D811D1086600028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7D821D1086600028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7D831D1086600028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7D841D1086600028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7D851D1086600028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7D861D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7D871D1086600028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7D881D1086600028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7D891D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7D8A1D1086600028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7D8B1D1086600028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7D8C1D1086600028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7D8D1D1086600028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7D8E1D1086600028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7D8F1D1086600028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7D901D1086600028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7D911D1086600028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7D921D1086600028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7D931D1086600028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7D941D1086600028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7D951D1086600028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7D961D1086600028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7D971D1086600028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7D981D1086600028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7D991D1086600028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7D9A1D1086600028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7D9B1D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7D9C1D1086600028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7D9D1D1086600028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7D9E1D1086600028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7D9F1D1086600028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7DA01D1086600028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7DA11D1086600028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7DA21D1086600028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7DA31D1086600028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7DA41D1086610028BE58 /* alpha_processing_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */; }; + 43DA7DA51D1086610028BE58 /* alpha_processing.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5B1D1086570028BE58 /* alpha_processing.c */; }; + 43DA7DA61D1086610028BE58 /* argb_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */; }; + 43DA7DA71D1086610028BE58 /* argb_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5D1D1086570028BE58 /* argb_sse2.c */; }; + 43DA7DA81D1086610028BE58 /* argb.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5E1D1086570028BE58 /* argb.c */; }; + 43DA7DA91D1086610028BE58 /* cost_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */; }; + 43DA7DAA1D1086610028BE58 /* cost_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C601D1086570028BE58 /* cost_mips32.c */; }; + 43DA7DAB1D1086610028BE58 /* cost_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C611D1086570028BE58 /* cost_sse2.c */; }; + 43DA7DAC1D1086610028BE58 /* cost.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C621D1086570028BE58 /* cost.c */; }; + 43DA7DAD1D1086610028BE58 /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C631D1086570028BE58 /* cpu.c */; }; + 43DA7DAE1D1086610028BE58 /* dec_clip_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C641D1086570028BE58 /* dec_clip_tables.c */; }; + 43DA7DAF1D1086610028BE58 /* dec_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */; }; + 43DA7DB01D1086610028BE58 /* dec_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C661D1086570028BE58 /* dec_mips32.c */; }; + 43DA7DB11D1086610028BE58 /* dec_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C671D1086570028BE58 /* dec_neon.c */; }; + 43DA7DB21D1086610028BE58 /* dec_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C681D1086570028BE58 /* dec_sse2.c */; }; + 43DA7DB31D1086610028BE58 /* dec_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C691D1086570028BE58 /* dec_sse41.c */; }; + 43DA7DB41D1086610028BE58 /* dec.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6A1D1086570028BE58 /* dec.c */; }; + 43DA7DB51D1086610028BE58 /* dsp.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C6B1D1086570028BE58 /* dsp.h */; }; + 43DA7DB61D1086610028BE58 /* enc_avx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6C1D1086570028BE58 /* enc_avx2.c */; }; + 43DA7DB71D1086610028BE58 /* enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */; }; + 43DA7DB81D1086610028BE58 /* enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6E1D1086570028BE58 /* enc_mips32.c */; }; + 43DA7DB91D1086610028BE58 /* enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C6F1D1086570028BE58 /* enc_neon.c */; }; + 43DA7DBA1D1086610028BE58 /* enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C701D1086570028BE58 /* enc_sse2.c */; }; + 43DA7DBB1D1086610028BE58 /* enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C711D1086570028BE58 /* enc_sse41.c */; }; + 43DA7DBC1D1086610028BE58 /* enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C721D1086570028BE58 /* enc.c */; }; + 43DA7DBD1D1086610028BE58 /* filters_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */; }; + 43DA7DBE1D1086610028BE58 /* filters_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C741D1086570028BE58 /* filters_sse2.c */; }; + 43DA7DBF1D1086610028BE58 /* filters.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C751D1086570028BE58 /* filters.c */; }; + 43DA7DC01D1086610028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */; }; + 43DA7DC11D1086610028BE58 /* lossless_enc_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */; }; + 43DA7DC21D1086610028BE58 /* lossless_enc_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */; }; + 43DA7DC31D1086610028BE58 /* lossless_enc_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */; }; + 43DA7DC41D1086610028BE58 /* lossless_enc_sse41.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */; }; + 43DA7DC51D1086610028BE58 /* lossless_enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7B1D1086570028BE58 /* lossless_enc.c */; }; + 43DA7DC61D1086610028BE58 /* lossless_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */; }; + 43DA7DC71D1086610028BE58 /* lossless_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7D1D1086570028BE58 /* lossless_neon.c */; }; + 43DA7DC81D1086610028BE58 /* lossless_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */; }; + 43DA7DC91D1086610028BE58 /* lossless.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C7F1D1086570028BE58 /* lossless.c */; }; + 43DA7DCA1D1086610028BE58 /* lossless.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C801D1086570028BE58 /* lossless.h */; }; + 43DA7DCB1D1086610028BE58 /* mips_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C811D1086570028BE58 /* mips_macro.h */; }; + 43DA7DCC1D1086610028BE58 /* neon.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C821D1086570028BE58 /* neon.h */; }; + 43DA7DCD1D1086610028BE58 /* rescaler_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */; }; + 43DA7DCE1D1086610028BE58 /* rescaler_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C841D1086570028BE58 /* rescaler_mips32.c */; }; + 43DA7DCF1D1086610028BE58 /* rescaler_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C851D1086570028BE58 /* rescaler_neon.c */; }; + 43DA7DD01D1086610028BE58 /* rescaler_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C861D1086570028BE58 /* rescaler_sse2.c */; }; + 43DA7DD11D1086610028BE58 /* rescaler.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C871D1086570028BE58 /* rescaler.c */; }; + 43DA7DD21D1086610028BE58 /* upsampling_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */; }; + 43DA7DD31D1086610028BE58 /* upsampling_neon.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C891D1086570028BE58 /* upsampling_neon.c */; }; + 43DA7DD41D1086610028BE58 /* upsampling_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */; }; + 43DA7DD51D1086610028BE58 /* upsampling.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8B1D1086570028BE58 /* upsampling.c */; }; + 43DA7DD61D1086610028BE58 /* yuv_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */; }; + 43DA7DD71D1086610028BE58 /* yuv_mips32.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */; }; + 43DA7DD81D1086610028BE58 /* yuv_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */; }; + 43DA7DD91D1086610028BE58 /* yuv.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7C8F1D1086570028BE58 /* yuv.c */; }; + 43DA7DDA1D1086610028BE58 /* yuv.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7C901D1086570028BE58 /* yuv.h */; }; + 43DA7DDC1D1086740028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DDD1D10867A0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DDE1D10867B0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DDF1D10867B0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DE01D10867C0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DE11D10867D0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; @@ -702,6 +876,63 @@ 43CE754C1CFE9427006C64D0 /* FLAnimatedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImageView.m; sourceTree = ""; }; 43CE75CE1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImageView+WebCache.h"; sourceTree = ""; }; 43CE75CF1CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImageView+WebCache.m"; sourceTree = ""; }; + 43DA7C151D1086000028BE58 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing_sse41.c; sourceTree = ""; }; + 43DA7C5B1D1086570028BE58 /* alpha_processing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing.c; sourceTree = ""; }; + 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = argb_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C5D1D1086570028BE58 /* argb_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = argb_sse2.c; sourceTree = ""; }; + 43DA7C5E1D1086570028BE58 /* argb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = argb.c; sourceTree = ""; }; + 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cost_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C601D1086570028BE58 /* cost_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cost_mips32.c; sourceTree = ""; }; + 43DA7C611D1086570028BE58 /* cost_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cost_sse2.c; sourceTree = ""; }; + 43DA7C621D1086570028BE58 /* cost.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cost.c; sourceTree = ""; }; + 43DA7C631D1086570028BE58 /* cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpu.c; sourceTree = ""; }; + 43DA7C641D1086570028BE58 /* dec_clip_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_clip_tables.c; sourceTree = ""; }; + 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C661D1086570028BE58 /* dec_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_mips32.c; sourceTree = ""; }; + 43DA7C671D1086570028BE58 /* dec_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_neon.c; sourceTree = ""; }; + 43DA7C681D1086570028BE58 /* dec_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_sse2.c; sourceTree = ""; }; + 43DA7C691D1086570028BE58 /* dec_sse41.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_sse41.c; sourceTree = ""; }; + 43DA7C6A1D1086570028BE58 /* dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec.c; sourceTree = ""; }; + 43DA7C6B1D1086570028BE58 /* dsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsp.h; sourceTree = ""; }; + 43DA7C6C1D1086570028BE58 /* enc_avx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_avx2.c; sourceTree = ""; }; + 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C6E1D1086570028BE58 /* enc_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_mips32.c; sourceTree = ""; }; + 43DA7C6F1D1086570028BE58 /* enc_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_neon.c; sourceTree = ""; }; + 43DA7C701D1086570028BE58 /* enc_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_sse2.c; sourceTree = ""; }; + 43DA7C711D1086570028BE58 /* enc_sse41.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_sse41.c; sourceTree = ""; }; + 43DA7C721D1086570028BE58 /* enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc.c; sourceTree = ""; }; + 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filters_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C741D1086570028BE58 /* filters_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filters_sse2.c; sourceTree = ""; }; + 43DA7C751D1086570028BE58 /* filters.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = filters.c; sourceTree = ""; }; + 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc_mips32.c; sourceTree = ""; }; + 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc_neon.c; sourceTree = ""; }; + 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc_sse2.c; sourceTree = ""; }; + 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc_sse41.c; sourceTree = ""; }; + 43DA7C7B1D1086570028BE58 /* lossless_enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_enc.c; sourceTree = ""; }; + 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C7D1D1086570028BE58 /* lossless_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_neon.c; sourceTree = ""; }; + 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_sse2.c; sourceTree = ""; }; + 43DA7C7F1D1086570028BE58 /* lossless.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless.c; sourceTree = ""; }; + 43DA7C801D1086570028BE58 /* lossless.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lossless.h; sourceTree = ""; }; + 43DA7C811D1086570028BE58 /* mips_macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mips_macro.h; sourceTree = ""; }; + 43DA7C821D1086570028BE58 /* neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = neon.h; sourceTree = ""; }; + 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C841D1086570028BE58 /* rescaler_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler_mips32.c; sourceTree = ""; }; + 43DA7C851D1086570028BE58 /* rescaler_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler_neon.c; sourceTree = ""; }; + 43DA7C861D1086570028BE58 /* rescaler_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler_sse2.c; sourceTree = ""; }; + 43DA7C871D1086570028BE58 /* rescaler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rescaler.c; sourceTree = ""; }; + 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C891D1086570028BE58 /* upsampling_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_neon.c; sourceTree = ""; }; + 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_sse2.c; sourceTree = ""; }; + 43DA7C8B1D1086570028BE58 /* upsampling.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling.c; sourceTree = ""; }; + 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv_mips32.c; sourceTree = ""; }; + 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv_sse2.c; sourceTree = ""; }; + 43DA7C8F1D1086570028BE58 /* yuv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv.c; sourceTree = ""; }; + 43DA7C901D1086570028BE58 /* yuv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv.h; sourceTree = ""; }; + 43DA7DDB1D1086740028BE58 /* extras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extras.h; sourceTree = ""; }; 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CAE021AB4BB5400B6BC39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImage.h; sourceTree = ""; }; @@ -742,33 +973,6 @@ AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+WebCacheOperation.m"; sourceTree = ""; }; ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - DA577C661998E60B007367ED /* alpha_processing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing.c; sourceTree = ""; }; - DA577C671998E60B007367ED /* cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpu.c; sourceTree = ""; }; - DA577C681998E60B007367ED /* dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec.c; sourceTree = ""; }; - DA577C691998E60B007367ED /* dec_clip_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_clip_tables.c; sourceTree = ""; }; - DA577C6A1998E60B007367ED /* dec_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_mips32.c; sourceTree = ""; }; - DA577C6B1998E60B007367ED /* dec_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_neon.c; sourceTree = ""; }; - DA577C6C1998E60B007367ED /* dec_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_sse2.c; sourceTree = ""; }; - DA577C6D1998E60B007367ED /* dsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsp.h; sourceTree = ""; }; - DA577C6E1998E60B007367ED /* enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc.c; sourceTree = ""; }; - DA577C6F1998E60B007367ED /* enc_avx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_avx2.c; sourceTree = ""; }; - DA577C701998E60B007367ED /* enc_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_mips32.c; sourceTree = ""; }; - DA577C711998E60B007367ED /* enc_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_neon.c; sourceTree = ""; }; - DA577C721998E60B007367ED /* enc_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enc_sse2.c; sourceTree = ""; }; - DA577C731998E60B007367ED /* lossless.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless.c; sourceTree = ""; }; - DA577C741998E60B007367ED /* lossless.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lossless.h; sourceTree = ""; }; - DA577C751998E60B007367ED /* lossless_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_mips32.c; sourceTree = ""; }; - DA577C761998E60B007367ED /* lossless_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_neon.c; sourceTree = ""; }; - DA577C771998E60B007367ED /* lossless_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lossless_sse2.c; sourceTree = ""; }; - DA577C791998E60B007367ED /* neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = neon.h; sourceTree = ""; }; - DA577C7A1998E60B007367ED /* upsampling.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling.c; sourceTree = ""; }; - DA577C7B1998E60B007367ED /* upsampling_neon.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_neon.c; sourceTree = ""; }; - DA577C7C1998E60B007367ED /* upsampling_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upsampling_sse2.c; sourceTree = ""; }; - DA577C7D1998E60B007367ED /* yuv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv.c; sourceTree = ""; }; - DA577C7E1998E60B007367ED /* yuv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv.h; sourceTree = ""; }; - DA577C7F1998E60B007367ED /* yuv_mips32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv_mips32.c; sourceTree = ""; }; - DA577C801998E60B007367ED /* yuv_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv_sse2.c; sourceTree = ""; }; - DA577C811998E60B007367ED /* yuv_tables_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv_tables_sse2.h; sourceTree = ""; }; DA577CA81998E60B007367ED /* bit_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bit_reader.c; sourceTree = ""; }; DA577CA91998E60B007367ED /* bit_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_reader.h; sourceTree = ""; }; DA577CAA1998E60B007367ED /* bit_reader_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_reader_inl.h; sourceTree = ""; }; @@ -817,7 +1021,6 @@ DA577D681998E6B2007367ED /* vp8li.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vp8li.h; sourceTree = ""; }; DA577D691998E6B2007367ED /* webp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = webp.c; sourceTree = ""; }; DA577D6A1998E6B2007367ED /* webpi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webpi.h; sourceTree = ""; }; - DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing_sse2.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1052,34 +1255,61 @@ DA577C651998E60B007367ED /* dsp */ = { isa = PBXGroup; children = ( - DAC075D01A08CB9C002E5D32 /* alpha_processing_sse2.c */, - DA577C661998E60B007367ED /* alpha_processing.c */, - DA577C671998E60B007367ED /* cpu.c */, - DA577C681998E60B007367ED /* dec.c */, - DA577C691998E60B007367ED /* dec_clip_tables.c */, - DA577C6A1998E60B007367ED /* dec_mips32.c */, - DA577C6B1998E60B007367ED /* dec_neon.c */, - DA577C6C1998E60B007367ED /* dec_sse2.c */, - DA577C6D1998E60B007367ED /* dsp.h */, - DA577C6E1998E60B007367ED /* enc.c */, - DA577C6F1998E60B007367ED /* enc_avx2.c */, - DA577C701998E60B007367ED /* enc_mips32.c */, - DA577C711998E60B007367ED /* enc_neon.c */, - DA577C721998E60B007367ED /* enc_sse2.c */, - DA577C731998E60B007367ED /* lossless.c */, - DA577C741998E60B007367ED /* lossless.h */, - DA577C751998E60B007367ED /* lossless_mips32.c */, - DA577C761998E60B007367ED /* lossless_neon.c */, - DA577C771998E60B007367ED /* lossless_sse2.c */, - DA577C791998E60B007367ED /* neon.h */, - DA577C7A1998E60B007367ED /* upsampling.c */, - DA577C7B1998E60B007367ED /* upsampling_neon.c */, - DA577C7C1998E60B007367ED /* upsampling_sse2.c */, - DA577C7D1998E60B007367ED /* yuv.c */, - DA577C7E1998E60B007367ED /* yuv.h */, - DA577C7F1998E60B007367ED /* yuv_mips32.c */, - DA577C801998E60B007367ED /* yuv_sse2.c */, - DA577C811998E60B007367ED /* yuv_tables_sse2.h */, + 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */, + 43DA7C5B1D1086570028BE58 /* alpha_processing.c */, + 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */, + 43DA7C5D1D1086570028BE58 /* argb_sse2.c */, + 43DA7C5E1D1086570028BE58 /* argb.c */, + 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */, + 43DA7C601D1086570028BE58 /* cost_mips32.c */, + 43DA7C611D1086570028BE58 /* cost_sse2.c */, + 43DA7C621D1086570028BE58 /* cost.c */, + 43DA7C631D1086570028BE58 /* cpu.c */, + 43DA7C641D1086570028BE58 /* dec_clip_tables.c */, + 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */, + 43DA7C661D1086570028BE58 /* dec_mips32.c */, + 43DA7C671D1086570028BE58 /* dec_neon.c */, + 43DA7C681D1086570028BE58 /* dec_sse2.c */, + 43DA7C691D1086570028BE58 /* dec_sse41.c */, + 43DA7C6A1D1086570028BE58 /* dec.c */, + 43DA7C6B1D1086570028BE58 /* dsp.h */, + 43DA7C6C1D1086570028BE58 /* enc_avx2.c */, + 43DA7C6D1D1086570028BE58 /* enc_mips_dsp_r2.c */, + 43DA7C6E1D1086570028BE58 /* enc_mips32.c */, + 43DA7C6F1D1086570028BE58 /* enc_neon.c */, + 43DA7C701D1086570028BE58 /* enc_sse2.c */, + 43DA7C711D1086570028BE58 /* enc_sse41.c */, + 43DA7C721D1086570028BE58 /* enc.c */, + 43DA7C731D1086570028BE58 /* filters_mips_dsp_r2.c */, + 43DA7C741D1086570028BE58 /* filters_sse2.c */, + 43DA7C751D1086570028BE58 /* filters.c */, + 43DA7C761D1086570028BE58 /* lossless_enc_mips_dsp_r2.c */, + 43DA7C771D1086570028BE58 /* lossless_enc_mips32.c */, + 43DA7C781D1086570028BE58 /* lossless_enc_neon.c */, + 43DA7C791D1086570028BE58 /* lossless_enc_sse2.c */, + 43DA7C7A1D1086570028BE58 /* lossless_enc_sse41.c */, + 43DA7C7B1D1086570028BE58 /* lossless_enc.c */, + 43DA7C7C1D1086570028BE58 /* lossless_mips_dsp_r2.c */, + 43DA7C7D1D1086570028BE58 /* lossless_neon.c */, + 43DA7C7E1D1086570028BE58 /* lossless_sse2.c */, + 43DA7C7F1D1086570028BE58 /* lossless.c */, + 43DA7C801D1086570028BE58 /* lossless.h */, + 43DA7C811D1086570028BE58 /* mips_macro.h */, + 43DA7C821D1086570028BE58 /* neon.h */, + 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */, + 43DA7C841D1086570028BE58 /* rescaler_mips32.c */, + 43DA7C851D1086570028BE58 /* rescaler_neon.c */, + 43DA7C861D1086570028BE58 /* rescaler_sse2.c */, + 43DA7C871D1086570028BE58 /* rescaler.c */, + 43DA7C881D1086570028BE58 /* upsampling_mips_dsp_r2.c */, + 43DA7C891D1086570028BE58 /* upsampling_neon.c */, + 43DA7C8A1D1086570028BE58 /* upsampling_sse2.c */, + 43DA7C8B1D1086570028BE58 /* upsampling.c */, + 43DA7C8C1D1086570028BE58 /* yuv_mips_dsp_r2.c */, + 43DA7C8D1D1086570028BE58 /* yuv_mips32.c */, + 43DA7C8E1D1086570028BE58 /* yuv_sse2.c */, + 43DA7C8F1D1086570028BE58 /* yuv.c */, + 43DA7C901D1086570028BE58 /* yuv.h */, ); path = dsp; sourceTree = ""; @@ -1123,6 +1353,7 @@ DA577CC41998E60B007367ED /* decode.h */, DA577CC51998E60B007367ED /* demux.h */, DA577CC61998E60B007367ED /* encode.h */, + 43DA7DDB1D1086740028BE58 /* extras.h */, DA577CC71998E60B007367ED /* format_constants.h */, DA577CC81998E60B007367ED /* mux.h */, DA577CC91998E60B007367ED /* mux_types.h */, @@ -1137,6 +1368,7 @@ DA577D5B1998E6B2007367ED /* alpha.c */, DA577D5C1998E6B2007367ED /* alphai.h */, DA577D5D1998E6B2007367ED /* buffer.c */, + 43DA7C151D1086000028BE58 /* common.h */, DA577D5E1998E6B2007367ED /* decode_vp8.h */, DA577D5F1998E6B2007367ED /* frame.c */, DA577D601998E6B2007367ED /* idec.c */, @@ -1160,19 +1392,20 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 43DA7D5E1D1086600028BE58 /* neon.h in Headers */, 4317395A1CDFC8B70008FEB9 /* mux_types.h in Headers */, 431739561CDFC8B70008FEB9 /* demux.h in Headers */, - 431739111CDFC8AA0008FEB9 /* neon.h in Headers */, 4317394D1CDFC8B20008FEB9 /* utils.h in Headers */, 4397D2F81D0DF44200BB2784 /* MKAnnotationView+WebCache.h in Headers */, 431739451CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, - 4317390D1CDFC8AA0008FEB9 /* lossless.h in Headers */, 4317393A1CDFC8B20008FEB9 /* color_cache.h in Headers */, 431738E11CDFC8A40008FEB9 /* webpi.h in Headers */, 431739571CDFC8B70008FEB9 /* encode.h in Headers */, 431739351CDFC8B20008FEB9 /* bit_reader.h in Headers */, + 43DA7D5D1D1086600028BE58 /* mips_macro.h in Headers */, 00733A6F1BC4880E00A5A117 /* UIImage+WebP.h in Headers */, + 43DA7D471D1086600028BE58 /* dsp.h in Headers */, 431739431CDFC8B20008FEB9 /* quant_levels.h in Headers */, 00733A681BC4880E00A5A117 /* SDWebImageManager.h in Headers */, 431739591CDFC8B70008FEB9 /* mux.h in Headers */, @@ -1185,24 +1418,25 @@ 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */, 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */, 00733A671BC4880E00A5A117 /* SDImageCache.h in Headers */, - 431739191CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */, 431739411CDFC8B20008FEB9 /* huffman_encode.h in Headers */, 00733A711BC4880E00A5A117 /* UIImageView+WebCache.h in Headers */, 00733A631BC4880E00A5A117 /* SDWebImageCompat.h in Headers */, 431739381CDFC8B20008FEB9 /* bit_writer.h in Headers */, 00733A661BC4880E00A5A117 /* SDWebImageDownloaderOperation.h in Headers */, 4317394B1CDFC8B20008FEB9 /* thread.h in Headers */, + 43DA7C191D1086120028BE58 /* common.h in Headers */, 00733A721BC4880E00A5A117 /* UIView+WebCacheOperation.h in Headers */, + 43DA7D6C1D1086600028BE58 /* yuv.h in Headers */, + 43DA7D5C1D1086600028BE58 /* lossless.h in Headers */, 4317393B1CDFC8B20008FEB9 /* endian_inl.h in Headers */, - 431739061CDFC8AA0008FEB9 /* dsp.h in Headers */, 00733A6B1BC4880E00A5A117 /* NSData+ImageContentType.h in Headers */, 00733A6A1BC4880E00A5A117 /* SDWebImagePrefetcher.h in Headers */, + 43DA7DDF1D10867B0028BE58 /* extras.h in Headers */, 00733A641BC4880E00A5A117 /* SDWebImageOperation.h in Headers */, 431738D41CDFC8A40008FEB9 /* alphai.h in Headers */, 431739581CDFC8B70008FEB9 /* format_constants.h in Headers */, 431739491CDFC8B20008FEB9 /* rescaler.h in Headers */, 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, - 431739161CDFC8AA0008FEB9 /* yuv.h in Headers */, 00733A6E1BC4880E00A5A117 /* UIImage+MultiFormat.h in Headers */, 43CE757E1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431738DD1CDFC8A40008FEB9 /* vp8i.h in Headers */, @@ -1221,11 +1455,10 @@ files = ( 4314D1621D0E0E3B004B36C9 /* mux_types.h in Headers */, 4314D1631D0E0E3B004B36C9 /* demux.h in Headers */, - 4314D1641D0E0E3B004B36C9 /* neon.h in Headers */, + 43DA7DDD1D10867A0028BE58 /* extras.h in Headers */, 4314D1651D0E0E3B004B36C9 /* utils.h in Headers */, 4314D1661D0E0E3B004B36C9 /* quant_levels_dec.h in Headers */, 4314D1671D0E0E3B004B36C9 /* bit_reader_inl.h in Headers */, - 4314D1681D0E0E3B004B36C9 /* lossless.h in Headers */, 4314D1691D0E0E3B004B36C9 /* color_cache.h in Headers */, 4314D16A1D0E0E3B004B36C9 /* webpi.h in Headers */, 4314D16B1D0E0E3B004B36C9 /* encode.h in Headers */, @@ -1233,7 +1466,10 @@ 4314D16D1D0E0E3B004B36C9 /* SDImageCache.h in Headers */, 4314D16E1D0E0E3B004B36C9 /* quant_levels.h in Headers */, 4314D16F1D0E0E3B004B36C9 /* NSData+ImageContentType.h in Headers */, + 43DA7CEE1D10865E0028BE58 /* lossless.h in Headers */, 4314D1701D0E0E3B004B36C9 /* mux.h in Headers */, + 43DA7CEF1D10865E0028BE58 /* mips_macro.h in Headers */, + 43DA7CFE1D10865E0028BE58 /* yuv.h in Headers */, 4314D1711D0E0E3B004B36C9 /* huffman.h in Headers */, 4314D1721D0E0E3B004B36C9 /* SDWebImageCompat.h in Headers */, 4314D1731D0E0E3B004B36C9 /* vp8li.h in Headers */, @@ -1242,23 +1478,23 @@ 4314D1771D0E0E3B004B36C9 /* SDWebImageDecoder.h in Headers */, 4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */, 4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */, - 4314D17A1D0E0E3B004B36C9 /* yuv_tables_sse2.h in Headers */, 4314D17B1D0E0E3B004B36C9 /* huffman_encode.h in Headers */, + 43DA7CD91D10865E0028BE58 /* dsp.h in Headers */, 4314D17C1D0E0E3B004B36C9 /* UIImage+WebP.h in Headers */, 4314D17D1D0E0E3B004B36C9 /* SDWebImagePrefetcher.h in Headers */, 4314D17E1D0E0E3B004B36C9 /* bit_writer.h in Headers */, + 43DA7CF01D10865E0028BE58 /* neon.h in Headers */, 4314D17F1D0E0E3B004B36C9 /* UIButton+WebCache.h in Headers */, + 43DA7C171D1086100028BE58 /* common.h in Headers */, 4314D1801D0E0E3B004B36C9 /* thread.h in Headers */, 4314D1811D0E0E3B004B36C9 /* UIImageView+WebCache.h in Headers */, 4314D1821D0E0E3B004B36C9 /* endian_inl.h in Headers */, - 4314D1831D0E0E3B004B36C9 /* dsp.h in Headers */, 4314D1841D0E0E3B004B36C9 /* SDWebImageOperation.h in Headers */, 4314D1851D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.h in Headers */, 4314D1861D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.h in Headers */, 4314D1871D0E0E3B004B36C9 /* alphai.h in Headers */, 4314D1881D0E0E3B004B36C9 /* format_constants.h in Headers */, 4314D1891D0E0E3B004B36C9 /* rescaler.h in Headers */, - 4314D18B1D0E0E3B004B36C9 /* yuv.h in Headers */, 4314D18E1D0E0E3B004B36C9 /* vp8i.h in Headers */, 4314D18F1D0E0E3B004B36C9 /* UIView+WebCacheOperation.h in Headers */, 4314D1901D0E0E3B004B36C9 /* UIImage+GIF.h in Headers */, @@ -1280,19 +1516,20 @@ 431BB6DC1D06D2C1006A3455 /* UIButton+WebCache.h in Headers */, 43A62A371D0E0A860089D7DD /* rescaler.h in Headers */, 431BB6E11D06D2C1006A3455 /* SDWebImage.h in Headers */, + 43DA7DE01D10867C0028BE58 /* extras.h in Headers */, + 43DA7C1A1D1086120028BE58 /* common.h in Headers */, 43A62A2B1D0E0A860089D7DD /* filters.h in Headers */, 43A62A281D0E0A860089D7DD /* color_cache.h in Headers */, 43A62A641D0E0A8F0089D7DD /* vp8li.h in Headers */, - 43A62A541D0E0A8B0089D7DD /* yuv.h in Headers */, 431BB6E21D06D2C1006A3455 /* UIImageView+HighlightedWebCache.h in Headers */, + 43DA7D951D1086600028BE58 /* neon.h in Headers */, + 43DA7D7E1D1086600028BE58 /* dsp.h in Headers */, 43A62A3B1D0E0A860089D7DD /* utils.h in Headers */, 43A62A231D0E0A860089D7DD /* bit_reader.h in Headers */, - 43A62A4F1D0E0A8B0089D7DD /* neon.h in Headers */, 43A62A2D1D0E0A860089D7DD /* huffman.h in Headers */, 43A62A1C1D0E0A800089D7DD /* demux.h in Headers */, 43A62A331D0E0A860089D7DD /* quant_levels_dec.h in Headers */, 43A62A591D0E0A8F0089D7DD /* alphai.h in Headers */, - 43A62A571D0E0A8B0089D7DD /* yuv_tables_sse2.h in Headers */, 431BB6E31D06D2C1006A3455 /* SDImageCache.h in Headers */, 43A62A1D1D0E0A800089D7DD /* encode.h in Headers */, 431BB6E61D06D2C1006A3455 /* UIImageView+WebCache.h in Headers */, @@ -1302,6 +1539,7 @@ 43A62A1F1D0E0A800089D7DD /* mux.h in Headers */, 431BB6E91D06D2C1006A3455 /* SDWebImageDownloaderOperation.h in Headers */, 431BB6EB1D06D2C1006A3455 /* UIView+WebCacheOperation.h in Headers */, + 43DA7D931D1086600028BE58 /* lossless.h in Headers */, 431BB6EE1D06D2C1006A3455 /* NSData+ImageContentType.h in Headers */, 431BB6EF1D06D2C1006A3455 /* SDWebImagePrefetcher.h in Headers */, 431BB6F01D06D2C1006A3455 /* SDWebImageOperation.h in Headers */, @@ -1311,12 +1549,12 @@ 43A62A211D0E0A800089D7DD /* types.h in Headers */, 43A62A661D0E0A8F0089D7DD /* webpi.h in Headers */, 43A62A351D0E0A860089D7DD /* random.h in Headers */, + 43DA7D941D1086600028BE58 /* mips_macro.h in Headers */, 43A62A1E1D0E0A800089D7DD /* format_constants.h in Headers */, - 43A62A4B1D0E0A8B0089D7DD /* lossless.h in Headers */, 43A62A311D0E0A860089D7DD /* quant_levels.h in Headers */, - 43A62A441D0E0A8B0089D7DD /* dsp.h in Headers */, 43A62A5B1D0E0A8F0089D7DD /* decode_vp8.h in Headers */, 43A62A391D0E0A860089D7DD /* thread.h in Headers */, + 43DA7DA31D1086600028BE58 /* yuv.h in Headers */, 431BB6F61D06D2C1006A3455 /* UIImage+MultiFormat.h in Headers */, 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */, 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */, @@ -1328,10 +1566,10 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 43DA7DCC1D1086610028BE58 /* neon.h in Headers */, 4397D2BA1D0DDD8C00BB2784 /* demux.h in Headers */, 4397D2BB1D0DDD8C00BB2784 /* endian_inl.h in Headers */, 4397D2BD1D0DDD8C00BB2784 /* types.h in Headers */, - 4397D2BE1D0DDD8C00BB2784 /* neon.h in Headers */, 4397D2BF1D0DDD8C00BB2784 /* alphai.h in Headers */, 4397D2C01D0DDD8C00BB2784 /* SDWebImage.h in Headers */, 4397D2C11D0DDD8C00BB2784 /* format_constants.h in Headers */, @@ -1341,24 +1579,28 @@ 4397D2C51D0DDD8C00BB2784 /* UIImageView+WebCache.h in Headers */, 4397D2C61D0DDD8C00BB2784 /* random.h in Headers */, 4397D2C71D0DDD8C00BB2784 /* rescaler.h in Headers */, + 43DA7DE11D10867D0028BE58 /* extras.h in Headers */, 4397D2C81D0DDD8C00BB2784 /* SDWebImageCompat.h in Headers */, 4397D2C91D0DDD8C00BB2784 /* bit_reader.h in Headers */, 4397D2CB1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.h in Headers */, 4397D2CC1D0DDD8C00BB2784 /* mux.h in Headers */, - 4397D2CD1D0DDD8C00BB2784 /* lossless.h in Headers */, 4397D2CE1D0DDD8C00BB2784 /* huffman_encode.h in Headers */, - 4397D2CF1D0DDD8C00BB2784 /* yuv.h in Headers */, 4397D2D01D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.h in Headers */, + 43DA7C1B1D1086130028BE58 /* common.h in Headers */, 4397D2D11D0DDD8C00BB2784 /* decode.h in Headers */, 4397D2D21D0DDD8C00BB2784 /* webpi.h in Headers */, + 43DA7DCB1D1086610028BE58 /* mips_macro.h in Headers */, 4397D2D31D0DDD8C00BB2784 /* thread.h in Headers */, 4397D2D41D0DDD8C00BB2784 /* quant_levels.h in Headers */, 4397D2D51D0DDD8C00BB2784 /* bit_reader_inl.h in Headers */, + 43DA7DCA1D1086610028BE58 /* lossless.h in Headers */, 4397D2D61D0DDD8C00BB2784 /* quant_levels_dec.h in Headers */, 4397D2D81D0DDD8C00BB2784 /* UIButton+WebCache.h in Headers */, 4397D2D91D0DDD8C00BB2784 /* SDWebImagePrefetcher.h in Headers */, 4397D2DA1D0DDD8C00BB2784 /* UIView+WebCacheOperation.h in Headers */, 4397D2DB1D0DDD8C00BB2784 /* UIImage+MultiFormat.h in Headers */, + 43DA7DB51D1086610028BE58 /* dsp.h in Headers */, + 43DA7DDA1D1086610028BE58 /* yuv.h in Headers */, 4397D2DC1D0DDD8C00BB2784 /* SDWebImageOperation.h in Headers */, 4397D2DD1D0DDD8C00BB2784 /* vp8i.h in Headers */, 4397D2F61D0DE2DF00BB2784 /* NSImage+WebCache.h in Headers */, @@ -1368,10 +1610,8 @@ 4397D2E11D0DDD8C00BB2784 /* SDWebImageDownloader.h in Headers */, 4397D2E21D0DDD8C00BB2784 /* huffman.h in Headers */, 4397D2E31D0DDD8C00BB2784 /* MKAnnotationView+WebCache.h in Headers */, - 4397D2E41D0DDD8C00BB2784 /* yuv_tables_sse2.h in Headers */, 4397D2E51D0DDD8C00BB2784 /* bit_writer.h in Headers */, 4397D2E61D0DDD8C00BB2784 /* encode.h in Headers */, - 4397D2E71D0DDD8C00BB2784 /* dsp.h in Headers */, 4397D2E81D0DDD8C00BB2784 /* SDWebImageDecoder.h in Headers */, 4397D2E91D0DDD8C00BB2784 /* UIImage+WebP.h in Headers */, 4397D2EA1D0DDD8C00BB2784 /* UIImage+GIF.h in Headers */, @@ -1385,18 +1625,20 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 43DA7D271D10865F0028BE58 /* neon.h in Headers */, 4317394F1CDFC8B70008FEB9 /* demux.h in Headers */, 431739211CDFC8B20008FEB9 /* endian_inl.h in Headers */, 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431739541CDFC8B70008FEB9 /* types.h in Headers */, - 431738F51CDFC8AA0008FEB9 /* neon.h in Headers */, 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */, 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */, 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */, 431739231CDFC8B20008FEB9 /* filters.h in Headers */, 4A2CAE211AB4BB7000B6BC39 /* SDWebImageManager.h in Headers */, 4A2CAE1F1AB4BB6C00B6BC39 /* SDImageCache.h in Headers */, + 43DA7D261D10865F0028BE58 /* mips_macro.h in Headers */, 4A2CAE351AB4BB7500B6BC39 /* UIImageView+WebCache.h in Headers */, + 43DA7D101D10865F0028BE58 /* dsp.h in Headers */, 4317392D1CDFC8B20008FEB9 /* random.h in Headers */, 4317392F1CDFC8B20008FEB9 /* rescaler.h in Headers */, 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */, @@ -1404,9 +1646,7 @@ 43CE75D11CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, 4A2CAE331AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.h in Headers */, 431739521CDFC8B70008FEB9 /* mux.h in Headers */, - 431738F11CDFC8AA0008FEB9 /* lossless.h in Headers */, 431739271CDFC8B20008FEB9 /* huffman_encode.h in Headers */, - 431738FA1CDFC8AA0008FEB9 /* yuv.h in Headers */, 4A2CAE1D1AB4BB6800B6BC39 /* SDWebImageDownloaderOperation.h in Headers */, 4317394E1CDFC8B70008FEB9 /* decode.h in Headers */, 431738D21CDFC8A30008FEB9 /* webpi.h in Headers */, @@ -1416,21 +1656,23 @@ 4317392B1CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, 4A2CAE2B1AB4BB7500B6BC39 /* UIButton+WebCache.h in Headers */, + 43DA7C181D1086110028BE58 /* common.h in Headers */, 4A2CAE251AB4BB7000B6BC39 /* SDWebImagePrefetcher.h in Headers */, 4A2CAE371AB4BB7500B6BC39 /* UIView+WebCacheOperation.h in Headers */, + 43DA7D351D10865F0028BE58 /* yuv.h in Headers */, + 43DA7D251D10865F0028BE58 /* lossless.h in Headers */, 4A2CAE2F1AB4BB7500B6BC39 /* UIImage+MultiFormat.h in Headers */, 4A2CAE1A1AB4BB6400B6BC39 /* SDWebImageOperation.h in Headers */, 431738CE1CDFC8A30008FEB9 /* vp8i.h in Headers */, + 43DA7DDE1D10867B0028BE58 /* extras.h in Headers */, 431738D01CDFC8A30008FEB9 /* vp8li.h in Headers */, 431739201CDFC8B20008FEB9 /* color_cache.h in Headers */, 431739331CDFC8B20008FEB9 /* utils.h in Headers */, 4A2CAE1B1AB4BB6800B6BC39 /* SDWebImageDownloader.h in Headers */, 431739251CDFC8B20008FEB9 /* huffman.h in Headers */, 4A2CAE271AB4BB7500B6BC39 /* MKAnnotationView+WebCache.h in Headers */, - 431738FD1CDFC8AA0008FEB9 /* yuv_tables_sse2.h in Headers */, 4317391E1CDFC8B20008FEB9 /* bit_writer.h in Headers */, 431739501CDFC8B70008FEB9 /* encode.h in Headers */, - 431738EA1CDFC8AA0008FEB9 /* dsp.h in Headers */, 4A2CAE231AB4BB7000B6BC39 /* SDWebImageDecoder.h in Headers */, 4A2CAE311AB4BB7500B6BC39 /* UIImage+WebP.h in Headers */, 4A2CAE2D1AB4BB7500B6BC39 /* UIImage+GIF.h in Headers */, @@ -1446,16 +1688,16 @@ files = ( 431738C21CDFC2660008FEB9 /* mux_types.h in Headers */, 431738BE1CDFC2660008FEB9 /* demux.h in Headers */, - 4317389A1CDFC25E0008FEB9 /* neon.h in Headers */, 431738BC1CDFC2630008FEB9 /* utils.h in Headers */, + 43DA7CB91D1086570028BE58 /* neon.h in Headers */, 431738B41CDFC2630008FEB9 /* quant_levels_dec.h in Headers */, 431738A51CDFC2630008FEB9 /* bit_reader_inl.h in Headers */, - 431738961CDFC25E0008FEB9 /* lossless.h in Headers */, 431738A91CDFC2630008FEB9 /* color_cache.h in Headers */, 431738861CDFC2580008FEB9 /* webpi.h in Headers */, 431738BF1CDFC2660008FEB9 /* encode.h in Headers */, 431738A41CDFC2630008FEB9 /* bit_reader.h in Headers */, 53761316155AD0D5005750A4 /* SDImageCache.h in Headers */, + 43DA7CB81D1086570028BE58 /* mips_macro.h in Headers */, 431738B21CDFC2630008FEB9 /* quant_levels.h in Headers */, 5D5B9142188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */, 431738C11CDFC2660008FEB9 /* mux.h in Headers */, @@ -1463,12 +1705,14 @@ 53761318155AD0D5005750A4 /* SDWebImageCompat.h in Headers */, 431738841CDFC2580008FEB9 /* vp8li.h in Headers */, 431738C31CDFC2660008FEB9 /* types.h in Headers */, + 43DA7CC71D1086570028BE58 /* yuv.h in Headers */, 43CE75D01CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, + 43DA7CB71D1086570028BE58 /* lossless.h in Headers */, + 43DA7CA21D1086570028BE58 /* dsp.h in Headers */, 431738BD1CDFC2660008FEB9 /* decode.h in Headers */, 53761319155AD0D5005750A4 /* SDWebImageDecoder.h in Headers */, 5376131A155AD0D5005750A4 /* SDWebImageDownloader.h in Headers */, 5376131C155AD0D5005750A4 /* SDWebImageManager.h in Headers */, - 431738A21CDFC25E0008FEB9 /* yuv_tables_sse2.h in Headers */, 431738B01CDFC2630008FEB9 /* huffman_encode.h in Headers */, 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */, 5376131E155AD0D5005750A4 /* SDWebImagePrefetcher.h in Headers */, @@ -1477,19 +1721,19 @@ 431738BA1CDFC2630008FEB9 /* thread.h in Headers */, 53761320155AD0D5005750A4 /* UIImageView+WebCache.h in Headers */, 431738AA1CDFC2630008FEB9 /* endian_inl.h in Headers */, - 4317388F1CDFC25E0008FEB9 /* dsp.h in Headers */, 530E49E816464C25002868E7 /* SDWebImageOperation.h in Headers */, 530E49EA16464C7C002868E7 /* SDWebImageDownloaderOperation.h in Headers */, ABBE71A718C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h in Headers */, 431738791CDFC2580008FEB9 /* alphai.h in Headers */, + 43DA7C161D1086000028BE58 /* common.h in Headers */, 431738C01CDFC2660008FEB9 /* format_constants.h in Headers */, 431738B81CDFC2630008FEB9 /* rescaler.h in Headers */, 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */, - 4317389F1CDFC25E0008FEB9 /* yuv.h in Headers */, 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */, 43CE757C1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431738821CDFC2580008FEB9 /* vp8i.h in Headers */, AB615303192DA24600A2D8E9 /* UIView+WebCacheOperation.h in Headers */, + 43DA7DDC1D1086740028BE58 /* extras.h in Headers */, A18A6CC7172DC28500419892 /* UIImage+GIF.h in Headers */, 431738AC1CDFC2630008FEB9 /* filters.h in Headers */, 53EDFB8A17623F7C00698166 /* UIImage+MultiFormat.h in Headers */, @@ -1715,69 +1959,96 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 43DA7D661D1086600028BE58 /* upsampling_sse2.c in Sources */, 431739341CDFC8B20008FEB9 /* bit_reader.c in Sources */, 00733A561BC4880000A5A117 /* SDWebImageDownloaderOperation.m in Sources */, 431739391CDFC8B20008FEB9 /* color_cache.c in Sources */, + 43DA7D521D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43DA7D6A1D1086600028BE58 /* yuv_sse2.c in Sources */, + 43DA7D441D1086600028BE58 /* dec_sse2.c in Sources */, + 43DA7D461D1086600028BE58 /* dec.c in Sources */, 00733A5A1BC4880000A5A117 /* SDWebImagePrefetcher.m in Sources */, - 431739031CDFC8AA0008FEB9 /* dec_mips32.c in Sources */, 43CE75D51CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, - 4317390B1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, + 43DA7D4C1D1086600028BE58 /* enc_sse2.c in Sources */, 00733A5B1BC4880000A5A117 /* NSData+ImageContentType.m in Sources */, - 431739131CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, + 43DA7D5A1D1086600028BE58 /* lossless_sse2.c in Sources */, + 43DA7D451D1086600028BE58 /* dec_sse41.c in Sources */, 431738D71CDFC8A40008FEB9 /* frame.c in Sources */, - 431739011CDFC8AA0008FEB9 /* dec.c in Sources */, - 431739171CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */, - 4317390A1CDFC8AA0008FEB9 /* enc_neon.c in Sources */, - 4317390C1CDFC8AA0008FEB9 /* lossless.c in Sources */, - 431739181CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */, + 43DA7D561D1086600028BE58 /* lossless_enc_sse41.c in Sources */, + 43DA7D4A1D1086600028BE58 /* enc_mips32.c in Sources */, + 43DA7D581D1086600028BE58 /* lossless_mips_dsp_r2.c in Sources */, + 43DA7D551D1086600028BE58 /* lossless_enc_sse2.c in Sources */, + 43DA7D621D1086600028BE58 /* rescaler_sse2.c in Sources */, + 43DA7D401D1086600028BE58 /* dec_clip_tables.c in Sources */, 00733A551BC4880000A5A117 /* SDWebImageDownloader.m in Sources */, 431738E01CDFC8A40008FEB9 /* webp.c in Sources */, + 43DA7D3F1D1086600028BE58 /* cpu.c in Sources */, 431739481CDFC8B20008FEB9 /* rescaler.c in Sources */, + 43DA7D3E1D1086600028BE58 /* cost.c in Sources */, 431738D91CDFC8A40008FEB9 /* io.c in Sources */, + 43DA7D591D1086600028BE58 /* lossless_neon.c in Sources */, + 43DA7D411D1086600028BE58 /* dec_mips_dsp_r2.c in Sources */, 431738D51CDFC8A40008FEB9 /* buffer.c in Sources */, - 431738FE1CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */, - 4317390F1CDFC8AA0008FEB9 /* lossless_neon.c in Sources */, - 431739121CDFC8AA0008FEB9 /* upsampling.c in Sources */, + 43DA7D4B1D1086600028BE58 /* enc_neon.c in Sources */, 431739371CDFC8B20008FEB9 /* bit_writer.c in Sources */, + 43DA7D511D1086600028BE58 /* filters.c in Sources */, 00733A611BC4880000A5A117 /* UIImageView+WebCache.m in Sources */, + 43DA7D491D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */, + 43DA7D601D1086600028BE58 /* rescaler_mips32.c in Sources */, 431738D81CDFC8A40008FEB9 /* idec.c in Sources */, 431738DE1CDFC8A40008FEB9 /* vp8l.c in Sources */, + 43DA7D611D1086600028BE58 /* rescaler_neon.c in Sources */, + 43DA7D361D1086600028BE58 /* alpha_processing_sse41.c in Sources */, + 43DA7D641D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 431739461CDFC8B20008FEB9 /* random.c in Sources */, - 431739071CDFC8AA0008FEB9 /* enc.c in Sources */, + 43DA7D3D1D1086600028BE58 /* cost_sse2.c in Sources */, 431738DB1CDFC8A40008FEB9 /* tree.c in Sources */, - 431739081CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, 00733A581BC4880000A5A117 /* SDWebImageManager.m in Sources */, - 431739001CDFC8AA0008FEB9 /* cpu.c in Sources */, 4397D2F91D0DF44A00BB2784 /* MKAnnotationView+WebCache.m in Sources */, + 43DA7D541D1086600028BE58 /* lossless_enc_neon.c in Sources */, + 43DA7D4D1D1086600028BE58 /* enc_sse41.c in Sources */, + 43DA7D3B1D1086600028BE58 /* cost_mips_dsp_r2.c in Sources */, 00733A541BC4880000A5A117 /* SDWebImageCompat.m in Sources */, 4317393E1CDFC8B20008FEB9 /* huffman.c in Sources */, - 431739151CDFC8AA0008FEB9 /* yuv.c in Sources */, - 431739101CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */, - 431739091CDFC8AA0008FEB9 /* enc_mips32.c in Sources */, + 43DA7D3A1D1086600028BE58 /* argb.c in Sources */, + 43DA7D671D1086600028BE58 /* upsampling.c in Sources */, + 43DA7D421D1086600028BE58 /* dec_mips32.c in Sources */, + 43DA7D5B1D1086600028BE58 /* lossless.c in Sources */, 00733A621BC4880000A5A117 /* UIView+WebCacheOperation.m in Sources */, 4317393C1CDFC8B20008FEB9 /* filters.c in Sources */, + 43DA7D391D1086600028BE58 /* argb_sse2.c in Sources */, + 43DA7D631D1086600028BE58 /* rescaler.c in Sources */, + 43DA7D481D1086600028BE58 /* enc_avx2.c in Sources */, + 43DA7D571D1086600028BE58 /* lossless_enc.c in Sources */, 431738DA1CDFC8A40008FEB9 /* quant.c in Sources */, 00733A591BC4880000A5A117 /* SDWebImageDecoder.m in Sources */, 43CE75811CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, 00733A5F1BC4880000A5A117 /* UIImage+WebP.m in Sources */, - 431739041CDFC8AA0008FEB9 /* dec_neon.c in Sources */, 431739441CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, + 43DA7D4F1D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */, 00733A5C1BC4880000A5A117 /* UIButton+WebCache.m in Sources */, 4317394C1CDFC8B20008FEB9 /* utils.c in Sources */, + 43DA7D381D1086600028BE58 /* argb_mips_dsp_r2.c in Sources */, + 43DA7D3C1D1086600028BE58 /* cost_mips32.c in Sources */, 431739421CDFC8B20008FEB9 /* quant_levels.c in Sources */, - 431739141CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 00733A5D1BC4880000A5A117 /* UIImage+GIF.m in Sources */, + 43DA7D501D1086600028BE58 /* filters_sse2.c in Sources */, + 43DA7D4E1D1086600028BE58 /* enc.c in Sources */, + 43DA7D6B1D1086600028BE58 /* yuv.c in Sources */, 431738DC1CDFC8A40008FEB9 /* vp8.c in Sources */, 43CE757B1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 00733A571BC4880000A5A117 /* SDImageCache.m in Sources */, + 43DA7D531D1086600028BE58 /* lossless_enc_mips32.c in Sources */, 4317394A1CDFC8B20008FEB9 /* thread.c in Sources */, - 431739051CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, - 431739021CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */, + 43DA7D681D1086600028BE58 /* yuv_mips_dsp_r2.c in Sources */, + 43DA7D651D1086600028BE58 /* upsampling_neon.c in Sources */, + 43DA7D371D1086600028BE58 /* alpha_processing.c in Sources */, + 43DA7D691D1086600028BE58 /* yuv_mips32.c in Sources */, + 43DA7D5F1D1086600028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 00733A5E1BC4880000A5A117 /* UIImage+MultiFormat.m in Sources */, 431738D31CDFC8A40008FEB9 /* alpha.c in Sources */, - 431738FF1CDFC8AA0008FEB9 /* alpha_processing.c in Sources */, 00733A601BC4880000A5A117 /* UIImageView+HighlightedWebCache.m in Sources */, - 4317390E1CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */, + 43DA7D431D1086600028BE58 /* dec_neon.c in Sources */, 431739401CDFC8B20008FEB9 /* huffman_encode.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1786,65 +2057,92 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4314D11D1D0E0E3B004B36C9 /* dec.c in Sources */, 4314D11E1D0E0E3B004B36C9 /* huffman.c in Sources */, + 43DA7CED1D10865E0028BE58 /* lossless.c in Sources */, + 43DA7CCC1D10865E0028BE58 /* argb.c in Sources */, + 43DA7CDD1D10865E0028BE58 /* enc_neon.c in Sources */, 4314D11F1D0E0E3B004B36C9 /* quant_levels.c in Sources */, 4314D1201D0E0E3B004B36C9 /* idec.c in Sources */, 4314D1211D0E0E3B004B36C9 /* random.c in Sources */, - 4314D1221D0E0E3B004B36C9 /* alpha_processing_sse2.c in Sources */, 4314D1231D0E0E3B004B36C9 /* SDImageCache.m in Sources */, 4314D1241D0E0E3B004B36C9 /* SDWebImageDecoder.m in Sources */, - 4314D1251D0E0E3B004B36C9 /* enc_avx2.c in Sources */, 4314D1271D0E0E3B004B36C9 /* rescaler.c in Sources */, - 4314D1281D0E0E3B004B36C9 /* dec_sse2.c in Sources */, - 4314D1291D0E0E3B004B36C9 /* upsampling_neon.c in Sources */, + 43DA7CF61D10865E0028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 4314D12A1D0E0E3B004B36C9 /* quant.c in Sources */, - 4314D12B1D0E0E3B004B36C9 /* dec_mips32.c in Sources */, - 4314D12C1D0E0E3B004B36C9 /* alpha_processing.c in Sources */, - 4314D12D1D0E0E3B004B36C9 /* lossless_sse2.c in Sources */, - 4314D12E1D0E0E3B004B36C9 /* enc_sse2.c in Sources */, + 43DA7CDB1D10865E0028BE58 /* enc_mips_dsp_r2.c in Sources */, 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */, 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */, + 43DA7CC91D10865E0028BE58 /* alpha_processing.c in Sources */, 4314D1321D0E0E3B004B36C9 /* filters.c in Sources */, - 4314D1331D0E0E3B004B36C9 /* yuv_mips32.c in Sources */, 4314D1341D0E0E3B004B36C9 /* UIImage+WebP.m in Sources */, + 43DA7CD41D10865E0028BE58 /* dec_mips32.c in Sources */, + 43DA7CD31D10865E0028BE58 /* dec_mips_dsp_r2.c in Sources */, 4314D1351D0E0E3B004B36C9 /* tree.c in Sources */, + 43DA7CF31D10865E0028BE58 /* rescaler_neon.c in Sources */, + 43DA7CE81D10865E0028BE58 /* lossless_enc_sse41.c in Sources */, + 43DA7CE31D10865E0028BE58 /* filters.c in Sources */, + 43DA7CF41D10865E0028BE58 /* rescaler_sse2.c in Sources */, + 43DA7CF71D10865E0028BE58 /* upsampling_neon.c in Sources */, 4314D1361D0E0E3B004B36C9 /* SDWebImageManager.m in Sources */, 4314D1371D0E0E3B004B36C9 /* SDWebImagePrefetcher.m in Sources */, - 4314D1381D0E0E3B004B36C9 /* yuv_sse2.c in Sources */, + 43DA7CD61D10865E0028BE58 /* dec_sse2.c in Sources */, + 43DA7CE11D10865E0028BE58 /* filters_mips_dsp_r2.c in Sources */, + 43DA7CCB1D10865E0028BE58 /* argb_sse2.c in Sources */, + 43DA7CE41D10865E0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */, - 4314D13A1D0E0E3B004B36C9 /* lossless_mips32.c in Sources */, 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */, - 4314D13C1D0E0E3B004B36C9 /* enc_mips32.c in Sources */, + 43DA7CCF1D10865E0028BE58 /* cost_sse2.c in Sources */, 4314D13D1D0E0E3B004B36C9 /* quant_levels_dec.c in Sources */, 4314D13E1D0E0E3B004B36C9 /* vp8l.c in Sources */, - 4314D13F1D0E0E3B004B36C9 /* cpu.c in Sources */, + 43DA7CD51D10865E0028BE58 /* dec_neon.c in Sources */, + 43DA7CF91D10865E0028BE58 /* upsampling.c in Sources */, + 43DA7CFD1D10865E0028BE58 /* yuv.c in Sources */, 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */, + 43DA7CDC1D10865E0028BE58 /* enc_mips32.c in Sources */, 4314D1411D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.m in Sources */, + 43DA7CCE1D10865E0028BE58 /* cost_mips32.c in Sources */, 4314D1421D0E0E3B004B36C9 /* webp.c in Sources */, - 4314D1431D0E0E3B004B36C9 /* yuv.c in Sources */, 4314D1441D0E0E3B004B36C9 /* bit_writer.c in Sources */, + 43DA7CF11D10865E0028BE58 /* rescaler_mips_dsp_r2.c in Sources */, + 43DA7CEB1D10865E0028BE58 /* lossless_neon.c in Sources */, + 43DA7CFA1D10865E0028BE58 /* yuv_mips_dsp_r2.c in Sources */, + 43DA7CCA1D10865E0028BE58 /* argb_mips_dsp_r2.c in Sources */, 4314D1451D0E0E3B004B36C9 /* vp8.c in Sources */, - 4314D1471D0E0E3B004B36C9 /* enc_neon.c in Sources */, - 4314D1481D0E0E3B004B36C9 /* lossless_neon.c in Sources */, - 4314D1491D0E0E3B004B36C9 /* dec_clip_tables.c in Sources */, - 4314D14A1D0E0E3B004B36C9 /* lossless.c in Sources */, + 43DA7CF51D10865E0028BE58 /* rescaler.c in Sources */, + 43DA7CDF1D10865E0028BE58 /* enc_sse41.c in Sources */, + 43DA7CE91D10865E0028BE58 /* lossless_enc.c in Sources */, + 43DA7CCD1D10865E0028BE58 /* cost_mips_dsp_r2.c in Sources */, + 43DA7CE51D10865E0028BE58 /* lossless_enc_mips32.c in Sources */, + 43DA7CFB1D10865E0028BE58 /* yuv_mips32.c in Sources */, + 43DA7CD21D10865E0028BE58 /* dec_clip_tables.c in Sources */, 4314D14B1D0E0E3B004B36C9 /* SDWebImageCompat.m in Sources */, 4314D14C1D0E0E3B004B36C9 /* huffman_encode.c in Sources */, 4314D14D1D0E0E3B004B36C9 /* UIImage+GIF.m in Sources */, - 4314D14E1D0E0E3B004B36C9 /* upsampling.c in Sources */, 4314D14F1D0E0E3B004B36C9 /* io.c in Sources */, 4314D1501D0E0E3B004B36C9 /* UIView+WebCacheOperation.m in Sources */, 4314D1511D0E0E3B004B36C9 /* buffer.c in Sources */, + 43DA7CF81D10865E0028BE58 /* upsampling_sse2.c in Sources */, + 43DA7CD81D10865E0028BE58 /* dec.c in Sources */, + 43DA7CEC1D10865E0028BE58 /* lossless_sse2.c in Sources */, 4314D1521D0E0E3B004B36C9 /* NSData+ImageContentType.m in Sources */, + 43DA7CEA1D10865E0028BE58 /* lossless_mips_dsp_r2.c in Sources */, 4314D1531D0E0E3B004B36C9 /* UIImage+MultiFormat.m in Sources */, - 4314D1541D0E0E3B004B36C9 /* upsampling_sse2.c in Sources */, + 43DA7CE71D10865E0028BE58 /* lossless_enc_sse2.c in Sources */, + 43DA7CC81D10865E0028BE58 /* alpha_processing_sse41.c in Sources */, + 43DA7CD01D10865E0028BE58 /* cost.c in Sources */, + 43DA7CD11D10865E0028BE58 /* cpu.c in Sources */, + 43DA7CF21D10865E0028BE58 /* rescaler_mips32.c in Sources */, + 43DA7CE61D10865E0028BE58 /* lossless_enc_neon.c in Sources */, 4314D1551D0E0E3B004B36C9 /* UIImageView+HighlightedWebCache.m in Sources */, + 43DA7CE01D10865E0028BE58 /* enc.c in Sources */, 4314D1571D0E0E3B004B36C9 /* frame.c in Sources */, 4314D1581D0E0E3B004B36C9 /* bit_reader.c in Sources */, - 4314D1591D0E0E3B004B36C9 /* dec_neon.c in Sources */, + 43DA7CDE1D10865E0028BE58 /* enc_sse2.c in Sources */, + 43DA7CDA1D10865E0028BE58 /* enc_avx2.c in Sources */, + 43DA7CFC1D10865E0028BE58 /* yuv_sse2.c in Sources */, + 43DA7CD71D10865E0028BE58 /* dec_sse41.c in Sources */, + 43DA7CE21D10865E0028BE58 /* filters_sse2.c in Sources */, 4314D15A1D0E0E3B004B36C9 /* alpha.c in Sources */, - 4314D15B1D0E0E3B004B36C9 /* enc.c in Sources */, 4314D15C1D0E0E3B004B36C9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1854,65 +2152,92 @@ buildActionMask = 2147483647; files = ( 431BB68C1D06D2C1006A3455 /* SDWebImageDownloaderOperation.m in Sources */, - 43A62A4A1D0E0A8B0089D7DD /* lossless.c in Sources */, + 43DA7D921D1086600028BE58 /* lossless.c in Sources */, + 43DA7D711D1086600028BE58 /* argb.c in Sources */, + 43DA7D821D1086600028BE58 /* enc_neon.c in Sources */, 43A62A2A1D0E0A860089D7DD /* filters.c in Sources */, 431BB68E1D06D2C1006A3455 /* SDWebImagePrefetcher.m in Sources */, - 43A62A4D1D0E0A8B0089D7DD /* lossless_neon.c in Sources */, 43A62A651D0E0A8F0089D7DD /* webp.c in Sources */, - 43A62A431D0E0A8B0089D7DD /* dec_sse2.c in Sources */, 43A62A3A1D0E0A860089D7DD /* utils.c in Sources */, 43A62A271D0E0A860089D7DD /* color_cache.c in Sources */, 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */, - 43A62A3F1D0E0A8B0089D7DD /* dec.c in Sources */, + 43DA7D9B1D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */, + 43DA7D801D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */, 43A62A631D0E0A8F0089D7DD /* vp8l.c in Sources */, - 43A62A511D0E0A8B0089D7DD /* upsampling_neon.c in Sources */, - 43A62A421D0E0A8B0089D7DD /* dec_neon.c in Sources */, - 43A62A471D0E0A8B0089D7DD /* enc_mips32.c in Sources */, 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, + 43DA7D6E1D1086600028BE58 /* alpha_processing.c in Sources */, 43A62A5E1D0E0A8F0089D7DD /* io.c in Sources */, 43A62A321D0E0A860089D7DD /* quant_levels_dec.c in Sources */, - 43A62A451D0E0A8B0089D7DD /* enc.c in Sources */, + 43DA7D791D1086600028BE58 /* dec_mips32.c in Sources */, + 43DA7D781D1086600028BE58 /* dec_mips_dsp_r2.c in Sources */, 431BB6AA1D06D2C1006A3455 /* SDWebImageManager.m in Sources */, - 43A62A461D0E0A8B0089D7DD /* enc_avx2.c in Sources */, + 43DA7D981D1086600028BE58 /* rescaler_neon.c in Sources */, + 43DA7D8D1D1086600028BE58 /* lossless_enc_sse41.c in Sources */, + 43DA7D881D1086600028BE58 /* filters.c in Sources */, + 43DA7D991D1086600028BE58 /* rescaler_sse2.c in Sources */, + 43DA7D9C1D1086600028BE58 /* upsampling_neon.c in Sources */, 43A62A5A1D0E0A8F0089D7DD /* buffer.c in Sources */, 431BB6AC1D06D2C1006A3455 /* SDWebImageCompat.m in Sources */, - 43A62A411D0E0A8B0089D7DD /* dec_mips32.c in Sources */, - 43A62A3D1D0E0A8B0089D7DD /* alpha_processing.c in Sources */, - 43A62A3E1D0E0A8B0089D7DD /* cpu.c in Sources */, + 43DA7D7B1D1086600028BE58 /* dec_sse2.c in Sources */, + 43DA7D861D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */, + 43DA7D701D1086600028BE58 /* argb_sse2.c in Sources */, + 43DA7D891D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, 43A62A341D0E0A860089D7DD /* random.c in Sources */, - 43A62A491D0E0A8B0089D7DD /* enc_sse2.c in Sources */, - 43A62A401D0E0A8B0089D7DD /* dec_clip_tables.c in Sources */, 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */, - 43A62A481D0E0A8B0089D7DD /* enc_neon.c in Sources */, + 43DA7D741D1086600028BE58 /* cost_sse2.c in Sources */, 431BB6B41D06D2C1006A3455 /* SDWebImageDecoder.m in Sources */, 431BB6B61D06D2C1006A3455 /* UIImage+WebP.m in Sources */, + 43DA7D7A1D1086600028BE58 /* dec_neon.c in Sources */, + 43DA7D9E1D1086600028BE58 /* upsampling.c in Sources */, + 43DA7DA21D1086600028BE58 /* yuv.c in Sources */, 431BB6B91D06D2C1006A3455 /* UIButton+WebCache.m in Sources */, + 43DA7D811D1086600028BE58 /* enc_mips32.c in Sources */, 43A62A5F1D0E0A8F0089D7DD /* quant.c in Sources */, - 43A62A501D0E0A8B0089D7DD /* upsampling.c in Sources */, + 43DA7D731D1086600028BE58 /* cost_mips32.c in Sources */, 431BB6BD1D06D2C1006A3455 /* UIImage+GIF.m in Sources */, 43A62A581D0E0A8F0089D7DD /* alpha.c in Sources */, + 43DA7D961D1086600028BE58 /* rescaler_mips_dsp_r2.c in Sources */, + 43DA7D901D1086600028BE58 /* lossless_neon.c in Sources */, + 43DA7D9F1D1086600028BE58 /* yuv_mips_dsp_r2.c in Sources */, + 43DA7D6F1D1086600028BE58 /* argb_mips_dsp_r2.c in Sources */, 43A62A2E1D0E0A860089D7DD /* huffman_encode.c in Sources */, - 43A62A4E1D0E0A8B0089D7DD /* lossless_sse2.c in Sources */, - 43A62A561D0E0A8B0089D7DD /* yuv_sse2.c in Sources */, + 43DA7D9A1D1086600028BE58 /* rescaler.c in Sources */, + 43DA7D841D1086600028BE58 /* enc_sse41.c in Sources */, + 43DA7D8E1D1086600028BE58 /* lossless_enc.c in Sources */, + 43DA7D721D1086600028BE58 /* cost_mips_dsp_r2.c in Sources */, + 43DA7D8A1D1086600028BE58 /* lossless_enc_mips32.c in Sources */, + 43DA7DA01D1086600028BE58 /* yuv_mips32.c in Sources */, + 43DA7D771D1086600028BE58 /* dec_clip_tables.c in Sources */, 43A62A5D1D0E0A8F0089D7DD /* idec.c in Sources */, 43A62A251D0E0A860089D7DD /* bit_writer.c in Sources */, 43A62A2C1D0E0A860089D7DD /* huffman.c in Sources */, 43A62A381D0E0A860089D7DD /* thread.c in Sources */, - 43A62A551D0E0A8B0089D7DD /* yuv_mips32.c in Sources */, 43A62A361D0E0A860089D7DD /* rescaler.c in Sources */, 431BB6C01D06D2C1006A3455 /* SDImageCache.m in Sources */, + 43DA7D9D1D1086600028BE58 /* upsampling_sse2.c in Sources */, + 43DA7D7D1D1086600028BE58 /* dec.c in Sources */, + 43DA7D911D1086600028BE58 /* lossless_sse2.c in Sources */, 431BB6C41D06D2C1006A3455 /* UIImage+MultiFormat.m in Sources */, - 43A62A4C1D0E0A8B0089D7DD /* lossless_mips32.c in Sources */, - 43A62A531D0E0A8B0089D7DD /* yuv.c in Sources */, + 43DA7D8F1D1086600028BE58 /* lossless_mips_dsp_r2.c in Sources */, 43A62A611D0E0A8F0089D7DD /* vp8.c in Sources */, + 43DA7D8C1D1086600028BE58 /* lossless_enc_sse2.c in Sources */, + 43DA7D6D1D1086600028BE58 /* alpha_processing_sse41.c in Sources */, + 43DA7D751D1086600028BE58 /* cost.c in Sources */, + 43DA7D761D1086600028BE58 /* cpu.c in Sources */, + 43DA7D971D1086600028BE58 /* rescaler_mips32.c in Sources */, + 43DA7D8B1D1086600028BE58 /* lossless_enc_neon.c in Sources */, 43A62A5C1D0E0A8F0089D7DD /* frame.c in Sources */, + 43DA7D851D1086600028BE58 /* enc.c in Sources */, 43A62A221D0E0A860089D7DD /* bit_reader.c in Sources */, 43A62A301D0E0A860089D7DD /* quant_levels.c in Sources */, - 43A62A3C1D0E0A8B0089D7DD /* alpha_processing_sse2.c in Sources */, + 43DA7D831D1086600028BE58 /* enc_sse2.c in Sources */, + 43DA7D7F1D1086600028BE58 /* enc_avx2.c in Sources */, + 43DA7DA11D1086600028BE58 /* yuv_sse2.c in Sources */, + 43DA7D7C1D1086600028BE58 /* dec_sse41.c in Sources */, + 43DA7D871D1086600028BE58 /* filters_sse2.c in Sources */, 43A62A601D0E0A8F0089D7DD /* tree.c in Sources */, 431BB6C71D06D2C1006A3455 /* UIImageView+HighlightedWebCache.m in Sources */, - 43A62A521D0E0A8B0089D7DD /* upsampling_sse2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1920,67 +2245,94 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4397D2781D0DDD8C00BB2784 /* dec.c in Sources */, + 43DA7DAC1D1086610028BE58 /* cost.c in Sources */, + 43DA7DA61D1086610028BE58 /* argb_mips_dsp_r2.c in Sources */, 4397D2791D0DDD8C00BB2784 /* huffman.c in Sources */, + 43DA7DC91D1086610028BE58 /* lossless.c in Sources */, 4397D27A1D0DDD8C00BB2784 /* quant_levels.c in Sources */, + 43DA7DC51D1086610028BE58 /* lossless_enc.c in Sources */, + 43DA7DA81D1086610028BE58 /* argb.c in Sources */, + 43DA7DA41D1086610028BE58 /* alpha_processing_sse41.c in Sources */, 4397D27B1D0DDD8C00BB2784 /* idec.c in Sources */, + 43DA7DD91D1086610028BE58 /* yuv.c in Sources */, + 43DA7DB31D1086610028BE58 /* dec_sse41.c in Sources */, + 43DA7DD11D1086610028BE58 /* rescaler.c in Sources */, 4397D27C1D0DDD8C00BB2784 /* random.c in Sources */, - 4397D27D1D0DDD8C00BB2784 /* alpha_processing_sse2.c in Sources */, 4397D27E1D0DDD8C00BB2784 /* UIImage+GIF.m in Sources */, + 43DA7DBE1D1086610028BE58 /* filters_sse2.c in Sources */, 4397D27F1D0DDD8C00BB2784 /* UIImage+WebP.m in Sources */, 4397D2F71D0DE2DF00BB2784 /* NSImage+WebCache.m in Sources */, - 4397D2801D0DDD8C00BB2784 /* enc_avx2.c in Sources */, 4397D2821D0DDD8C00BB2784 /* rescaler.c in Sources */, - 4397D2831D0DDD8C00BB2784 /* dec_sse2.c in Sources */, - 4397D2841D0DDD8C00BB2784 /* upsampling_neon.c in Sources */, + 43DA7DC41D1086610028BE58 /* lossless_enc_sse41.c in Sources */, 4397D2851D0DDD8C00BB2784 /* quant.c in Sources */, - 4397D2861D0DDD8C00BB2784 /* dec_mips32.c in Sources */, - 4397D2871D0DDD8C00BB2784 /* alpha_processing.c in Sources */, - 4397D2881D0DDD8C00BB2784 /* lossless_sse2.c in Sources */, - 4397D2891D0DDD8C00BB2784 /* enc_sse2.c in Sources */, + 43DA7DA51D1086610028BE58 /* alpha_processing.c in Sources */, + 43DA7DD51D1086610028BE58 /* upsampling.c in Sources */, + 43DA7DD31D1086610028BE58 /* upsampling_neon.c in Sources */, 4397D28A1D0DDD8C00BB2784 /* thread.c in Sources */, + 43DA7DB11D1086610028BE58 /* dec_neon.c in Sources */, + 43DA7DBB1D1086610028BE58 /* enc_sse41.c in Sources */, + 43DA7DBA1D1086610028BE58 /* enc_sse2.c in Sources */, + 43DA7DCD1D1086610028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 4397D28C1D0DDD8C00BB2784 /* UIImageView+WebCache.m in Sources */, 4397D28D1D0DDD8C00BB2784 /* filters.c in Sources */, - 4397D28E1D0DDD8C00BB2784 /* yuv_mips32.c in Sources */, 4397D28F1D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.m in Sources */, + 43DA7DB61D1086610028BE58 /* enc_avx2.c in Sources */, 4397D2901D0DDD8C00BB2784 /* tree.c in Sources */, + 43DA7DD01D1086610028BE58 /* rescaler_sse2.c in Sources */, + 43DA7DC01D1086610028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43DA7DD21D1086610028BE58 /* upsampling_mips_dsp_r2.c in Sources */, + 43DA7DD41D1086610028BE58 /* upsampling_sse2.c in Sources */, 4397D2911D0DDD8C00BB2784 /* MKAnnotationView+WebCache.m in Sources */, + 43DA7DD61D1086610028BE58 /* yuv_mips_dsp_r2.c in Sources */, 4397D2921D0DDD8C00BB2784 /* SDWebImagePrefetcher.m in Sources */, - 4397D2931D0DDD8C00BB2784 /* yuv_sse2.c in Sources */, + 43DA7DAD1D1086610028BE58 /* cpu.c in Sources */, 4397D2941D0DDD8C00BB2784 /* color_cache.c in Sources */, - 4397D2951D0DDD8C00BB2784 /* lossless_mips32.c in Sources */, 4397D2961D0DDD8C00BB2784 /* UIImage+MultiFormat.m in Sources */, - 4397D2971D0DDD8C00BB2784 /* enc_mips32.c in Sources */, 4397D2981D0DDD8C00BB2784 /* quant_levels_dec.c in Sources */, 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */, - 4397D29A1D0DDD8C00BB2784 /* cpu.c in Sources */, 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */, + 43DA7DBD1D1086610028BE58 /* filters_mips_dsp_r2.c in Sources */, + 43DA7DC61D1086610028BE58 /* lossless_mips_dsp_r2.c in Sources */, 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */, 4397D29D1D0DDD8C00BB2784 /* webp.c in Sources */, - 4397D29E1D0DDD8C00BB2784 /* yuv.c in Sources */, 4397D29F1D0DDD8C00BB2784 /* bit_writer.c in Sources */, + 43DA7DD71D1086610028BE58 /* yuv_mips32.c in Sources */, 4397D2A01D0DDD8C00BB2784 /* vp8.c in Sources */, 4397D2A11D0DDD8C00BB2784 /* SDWebImageManager.m in Sources */, - 4397D2A21D0DDD8C00BB2784 /* enc_neon.c in Sources */, - 4397D2A31D0DDD8C00BB2784 /* lossless_neon.c in Sources */, - 4397D2A41D0DDD8C00BB2784 /* dec_clip_tables.c in Sources */, - 4397D2A51D0DDD8C00BB2784 /* lossless.c in Sources */, + 43DA7DC71D1086610028BE58 /* lossless_neon.c in Sources */, + 43DA7DBF1D1086610028BE58 /* filters.c in Sources */, + 43DA7DC81D1086610028BE58 /* lossless_sse2.c in Sources */, + 43DA7DC21D1086610028BE58 /* lossless_enc_neon.c in Sources */, + 43DA7DB41D1086610028BE58 /* dec.c in Sources */, 4397D2A61D0DDD8C00BB2784 /* SDWebImageCompat.m in Sources */, + 43DA7DD81D1086610028BE58 /* yuv_sse2.c in Sources */, 4397D2A71D0DDD8C00BB2784 /* huffman_encode.c in Sources */, 4397D2A81D0DDD8C00BB2784 /* UIButton+WebCache.m in Sources */, - 4397D2A91D0DDD8C00BB2784 /* upsampling.c in Sources */, 4397D2AA1D0DDD8C00BB2784 /* io.c in Sources */, + 43DA7DCF1D1086610028BE58 /* rescaler_neon.c in Sources */, + 43DA7DC31D1086610028BE58 /* lossless_enc_sse2.c in Sources */, 4397D2AB1D0DDD8C00BB2784 /* UIView+WebCacheOperation.m in Sources */, + 43DA7DA91D1086610028BE58 /* cost_mips_dsp_r2.c in Sources */, + 43DA7DB01D1086610028BE58 /* dec_mips32.c in Sources */, + 43DA7DAA1D1086610028BE58 /* cost_mips32.c in Sources */, + 43DA7DAB1D1086610028BE58 /* cost_sse2.c in Sources */, + 43DA7DB71D1086610028BE58 /* enc_mips_dsp_r2.c in Sources */, + 43DA7DC11D1086610028BE58 /* lossless_enc_mips32.c in Sources */, + 43DA7DBC1D1086610028BE58 /* enc.c in Sources */, 4397D2AC1D0DDD8C00BB2784 /* buffer.c in Sources */, 4397D2AD1D0DDD8C00BB2784 /* SDWebImageDecoder.m in Sources */, 4397D2AE1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.m in Sources */, - 4397D2AF1D0DDD8C00BB2784 /* upsampling_sse2.c in Sources */, 4397D2B01D0DDD8C00BB2784 /* SDImageCache.m in Sources */, 4397D2B21D0DDD8C00BB2784 /* frame.c in Sources */, + 43DA7DCE1D1086610028BE58 /* rescaler_mips32.c in Sources */, + 43DA7DAE1D1086610028BE58 /* dec_clip_tables.c in Sources */, 4397D2B31D0DDD8C00BB2784 /* bit_reader.c in Sources */, - 4397D2B41D0DDD8C00BB2784 /* dec_neon.c in Sources */, 4397D2B51D0DDD8C00BB2784 /* alpha.c in Sources */, - 4397D2B61D0DDD8C00BB2784 /* enc.c in Sources */, + 43DA7DA71D1086610028BE58 /* argb_sse2.c in Sources */, + 43DA7DB81D1086610028BE58 /* enc_mips32.c in Sources */, + 43DA7DB91D1086610028BE58 /* enc_neon.c in Sources */, + 43DA7DB21D1086610028BE58 /* dec_sse2.c in Sources */, + 43DA7DAF1D1086610028BE58 /* dec_mips_dsp_r2.c in Sources */, 4397D2B71D0DDD8C00BB2784 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1989,69 +2341,96 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 431738E51CDFC8AA0008FEB9 /* dec.c in Sources */, + 43DA7D2F1D10865F0028BE58 /* upsampling_sse2.c in Sources */, 431739241CDFC8B20008FEB9 /* huffman.c in Sources */, 431739281CDFC8B20008FEB9 /* quant_levels.c in Sources */, 431738C91CDFC8A30008FEB9 /* idec.c in Sources */, + 43DA7D1B1D10865F0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43DA7D331D10865F0028BE58 /* yuv_sse2.c in Sources */, + 43DA7D0D1D10865F0028BE58 /* dec_sse2.c in Sources */, + 43DA7D0F1D10865F0028BE58 /* dec.c in Sources */, 4317392C1CDFC8B20008FEB9 /* random.c in Sources */, - 431738E21CDFC8AA0008FEB9 /* alpha_processing_sse2.c in Sources */, 4A2CAE2E1AB4BB7500B6BC39 /* UIImage+GIF.m in Sources */, + 43DA7D151D10865F0028BE58 /* enc_sse2.c in Sources */, 4A2CAE321AB4BB7500B6BC39 /* UIImage+WebP.m in Sources */, - 431738EC1CDFC8AA0008FEB9 /* enc_avx2.c in Sources */, + 43DA7D231D10865F0028BE58 /* lossless_sse2.c in Sources */, + 43DA7D0E1D10865F0028BE58 /* dec_sse41.c in Sources */, 43CE75D41CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, + 43DA7D1F1D10865F0028BE58 /* lossless_enc_sse41.c in Sources */, + 43DA7D131D10865F0028BE58 /* enc_mips32.c in Sources */, + 43DA7D211D10865F0028BE58 /* lossless_mips_dsp_r2.c in Sources */, + 43DA7D1E1D10865F0028BE58 /* lossless_enc_sse2.c in Sources */, + 43DA7D2B1D10865F0028BE58 /* rescaler_sse2.c in Sources */, + 43DA7D091D10865F0028BE58 /* dec_clip_tables.c in Sources */, 4317392E1CDFC8B20008FEB9 /* rescaler.c in Sources */, - 431738E91CDFC8AA0008FEB9 /* dec_sse2.c in Sources */, - 431738F71CDFC8AA0008FEB9 /* upsampling_neon.c in Sources */, 431738CB1CDFC8A30008FEB9 /* quant.c in Sources */, - 431738E71CDFC8AA0008FEB9 /* dec_mips32.c in Sources */, - 431738E31CDFC8AA0008FEB9 /* alpha_processing.c in Sources */, - 431738F41CDFC8AA0008FEB9 /* lossless_sse2.c in Sources */, - 431738EF1CDFC8AA0008FEB9 /* enc_sse2.c in Sources */, + 43DA7D081D10865F0028BE58 /* cpu.c in Sources */, 431739301CDFC8B20008FEB9 /* thread.c in Sources */, + 43DA7D071D10865F0028BE58 /* cost.c in Sources */, 43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, + 43DA7D221D10865F0028BE58 /* lossless_neon.c in Sources */, + 43DA7D0A1D10865F0028BE58 /* dec_mips_dsp_r2.c in Sources */, 4A2CAE361AB4BB7500B6BC39 /* UIImageView+WebCache.m in Sources */, + 43DA7D141D10865F0028BE58 /* enc_neon.c in Sources */, 431739221CDFC8B20008FEB9 /* filters.c in Sources */, - 431738FB1CDFC8AA0008FEB9 /* yuv_mips32.c in Sources */, + 43DA7D1A1D10865F0028BE58 /* filters.c in Sources */, 4A2CAE1E1AB4BB6800B6BC39 /* SDWebImageDownloaderOperation.m in Sources */, + 43DA7D121D10865F0028BE58 /* enc_mips_dsp_r2.c in Sources */, + 43DA7D291D10865F0028BE58 /* rescaler_mips32.c in Sources */, 431738CC1CDFC8A30008FEB9 /* tree.c in Sources */, 4A2CAE281AB4BB7500B6BC39 /* MKAnnotationView+WebCache.m in Sources */, + 43DA7D2A1D10865F0028BE58 /* rescaler_neon.c in Sources */, + 43DA7CFF1D10865F0028BE58 /* alpha_processing_sse41.c in Sources */, + 43DA7D2D1D10865F0028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 4A2CAE261AB4BB7000B6BC39 /* SDWebImagePrefetcher.m in Sources */, - 431738FC1CDFC8AA0008FEB9 /* yuv_sse2.c in Sources */, + 43DA7D061D10865F0028BE58 /* cost_sse2.c in Sources */, 4317391F1CDFC8B20008FEB9 /* color_cache.c in Sources */, - 431738F21CDFC8AA0008FEB9 /* lossless_mips32.c in Sources */, 4A2CAE301AB4BB7500B6BC39 /* UIImage+MultiFormat.m in Sources */, - 431738ED1CDFC8AA0008FEB9 /* enc_mips32.c in Sources */, 4317392A1CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, + 43DA7D1D1D10865F0028BE58 /* lossless_enc_neon.c in Sources */, + 43DA7D161D10865F0028BE58 /* enc_sse41.c in Sources */, + 43DA7D041D10865F0028BE58 /* cost_mips_dsp_r2.c in Sources */, 431738CF1CDFC8A30008FEB9 /* vp8l.c in Sources */, - 431738E41CDFC8AA0008FEB9 /* cpu.c in Sources */, 4A2CAE1C1AB4BB6800B6BC39 /* SDWebImageDownloader.m in Sources */, + 43DA7D031D10865F0028BE58 /* argb.c in Sources */, + 43DA7D301D10865F0028BE58 /* upsampling.c in Sources */, + 43DA7D0B1D10865F0028BE58 /* dec_mips32.c in Sources */, + 43DA7D241D10865F0028BE58 /* lossless.c in Sources */, 4A2CAE2A1AB4BB7500B6BC39 /* NSData+ImageContentType.m in Sources */, 431738D11CDFC8A30008FEB9 /* webp.c in Sources */, - 431738F91CDFC8AA0008FEB9 /* yuv.c in Sources */, + 43DA7D021D10865F0028BE58 /* argb_sse2.c in Sources */, + 43DA7D2C1D10865F0028BE58 /* rescaler.c in Sources */, + 43DA7D111D10865F0028BE58 /* enc_avx2.c in Sources */, + 43DA7D201D10865F0028BE58 /* lossless_enc.c in Sources */, 4317391D1CDFC8B20008FEB9 /* bit_writer.c in Sources */, 431738CD1CDFC8A30008FEB9 /* vp8.c in Sources */, 4A2CAE221AB4BB7000B6BC39 /* SDWebImageManager.m in Sources */, - 431738EE1CDFC8AA0008FEB9 /* enc_neon.c in Sources */, - 431738F31CDFC8AA0008FEB9 /* lossless_neon.c in Sources */, - 431738E61CDFC8AA0008FEB9 /* dec_clip_tables.c in Sources */, - 431738F01CDFC8AA0008FEB9 /* lossless.c in Sources */, 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */, 431739261CDFC8B20008FEB9 /* huffman_encode.c in Sources */, + 43DA7D181D10865F0028BE58 /* filters_mips_dsp_r2.c in Sources */, 4A2CAE2C1AB4BB7500B6BC39 /* UIButton+WebCache.m in Sources */, - 431738F61CDFC8AA0008FEB9 /* upsampling.c in Sources */, 431738CA1CDFC8A30008FEB9 /* io.c in Sources */, + 43DA7D011D10865F0028BE58 /* argb_mips_dsp_r2.c in Sources */, + 43DA7D051D10865F0028BE58 /* cost_mips32.c in Sources */, 4A2CAE381AB4BB7500B6BC39 /* UIView+WebCacheOperation.m in Sources */, 431738C61CDFC8A30008FEB9 /* buffer.c in Sources */, + 43DA7D191D10865F0028BE58 /* filters_sse2.c in Sources */, + 43DA7D171D10865F0028BE58 /* enc.c in Sources */, + 43DA7D341D10865F0028BE58 /* yuv.c in Sources */, 4A2CAE241AB4BB7000B6BC39 /* SDWebImageDecoder.m in Sources */, 4A2CAE341AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.m in Sources */, - 431738F81CDFC8AA0008FEB9 /* upsampling_sse2.c in Sources */, 4A2CAE201AB4BB6C00B6BC39 /* SDImageCache.m in Sources */, + 43DA7D1C1D10865F0028BE58 /* lossless_enc_mips32.c in Sources */, 43CE75801CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, + 43DA7D311D10865F0028BE58 /* yuv_mips_dsp_r2.c in Sources */, + 43DA7D2E1D10865F0028BE58 /* upsampling_neon.c in Sources */, + 43DA7D001D10865F0028BE58 /* alpha_processing.c in Sources */, + 43DA7D321D10865F0028BE58 /* yuv_mips32.c in Sources */, + 43DA7D281D10865F0028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 431738C81CDFC8A30008FEB9 /* frame.c in Sources */, 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */, - 431738E81CDFC8AA0008FEB9 /* dec_neon.c in Sources */, 431738C41CDFC8A30008FEB9 /* alpha.c in Sources */, - 431738EB1CDFC8AA0008FEB9 /* enc.c in Sources */, + 43DA7D0C1D10865F0028BE58 /* dec_neon.c in Sources */, 431739321CDFC8B20008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2060,69 +2439,96 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4317388A1CDFC25E0008FEB9 /* dec.c in Sources */, + 43DA7CC11D1086570028BE58 /* upsampling_sse2.c in Sources */, 431738AD1CDFC2630008FEB9 /* huffman.c in Sources */, 431738B11CDFC2630008FEB9 /* quant_levels.c in Sources */, 4317387D1CDFC2580008FEB9 /* idec.c in Sources */, + 43DA7CAD1D1086570028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43DA7CC51D1086570028BE58 /* yuv_sse2.c in Sources */, + 43DA7C9F1D1086570028BE58 /* dec_sse2.c in Sources */, + 43DA7CA11D1086570028BE58 /* dec.c in Sources */, 431738B51CDFC2630008FEB9 /* random.c in Sources */, - 431738871CDFC25E0008FEB9 /* alpha_processing_sse2.c in Sources */, 53761309155AD0D5005750A4 /* SDImageCache.m in Sources */, + 43DA7CA71D1086570028BE58 /* enc_sse2.c in Sources */, 5376130A155AD0D5005750A4 /* SDWebImageDecoder.m in Sources */, - 431738911CDFC25E0008FEB9 /* enc_avx2.c in Sources */, + 43DA7CB51D1086570028BE58 /* lossless_sse2.c in Sources */, + 43DA7CA01D1086570028BE58 /* dec_sse41.c in Sources */, 43CE75D31CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.m in Sources */, + 43DA7CB11D1086570028BE58 /* lossless_enc_sse41.c in Sources */, + 43DA7CA51D1086570028BE58 /* enc_mips32.c in Sources */, + 43DA7CB31D1086570028BE58 /* lossless_mips_dsp_r2.c in Sources */, + 43DA7CB01D1086570028BE58 /* lossless_enc_sse2.c in Sources */, + 43DA7CBD1D1086570028BE58 /* rescaler_sse2.c in Sources */, + 43DA7C9B1D1086570028BE58 /* dec_clip_tables.c in Sources */, 431738B71CDFC2630008FEB9 /* rescaler.c in Sources */, - 4317388E1CDFC25E0008FEB9 /* dec_sse2.c in Sources */, - 4317389C1CDFC25E0008FEB9 /* upsampling_neon.c in Sources */, 4317387F1CDFC2580008FEB9 /* quant.c in Sources */, - 4317388C1CDFC25E0008FEB9 /* dec_mips32.c in Sources */, - 431738881CDFC25E0008FEB9 /* alpha_processing.c in Sources */, - 431738991CDFC25E0008FEB9 /* lossless_sse2.c in Sources */, - 431738941CDFC25E0008FEB9 /* enc_sse2.c in Sources */, + 43DA7C9A1D1086570028BE58 /* cpu.c in Sources */, 431738B91CDFC2630008FEB9 /* thread.c in Sources */, + 43DA7C991D1086570028BE58 /* cost.c in Sources */, 43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, + 43DA7CB41D1086570028BE58 /* lossless_neon.c in Sources */, + 43DA7C9C1D1086570028BE58 /* dec_mips_dsp_r2.c in Sources */, 5376130B155AD0D5005750A4 /* SDWebImageDownloader.m in Sources */, + 43DA7CA61D1086570028BE58 /* enc_neon.c in Sources */, 431738AB1CDFC2630008FEB9 /* filters.c in Sources */, - 431738A01CDFC25E0008FEB9 /* yuv_mips32.c in Sources */, + 43DA7CAC1D1086570028BE58 /* filters.c in Sources */, 438096751CDFC0A100DC626B /* UIImage+WebP.m in Sources */, + 43DA7CA41D1086570028BE58 /* enc_mips_dsp_r2.c in Sources */, + 43DA7CBB1D1086570028BE58 /* rescaler_mips32.c in Sources */, 431738801CDFC2580008FEB9 /* tree.c in Sources */, 5376130C155AD0D5005750A4 /* SDWebImageManager.m in Sources */, + 43DA7CBC1D1086570028BE58 /* rescaler_neon.c in Sources */, + 43DA7C911D1086570028BE58 /* alpha_processing_sse41.c in Sources */, + 43DA7CBF1D1086570028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 5376130D155AD0D5005750A4 /* SDWebImagePrefetcher.m in Sources */, - 431738A11CDFC25E0008FEB9 /* yuv_sse2.c in Sources */, + 43DA7C981D1086570028BE58 /* cost_sse2.c in Sources */, 431738A81CDFC2630008FEB9 /* color_cache.c in Sources */, - 431738971CDFC25E0008FEB9 /* lossless_mips32.c in Sources */, 5376130E155AD0D5005750A4 /* UIButton+WebCache.m in Sources */, - 431738921CDFC25E0008FEB9 /* enc_mips32.c in Sources */, 431738B31CDFC2630008FEB9 /* quant_levels_dec.c in Sources */, + 43DA7CAF1D1086570028BE58 /* lossless_enc_neon.c in Sources */, + 43DA7CA81D1086570028BE58 /* enc_sse41.c in Sources */, + 43DA7C961D1086570028BE58 /* cost_mips_dsp_r2.c in Sources */, 431738831CDFC2580008FEB9 /* vp8l.c in Sources */, - 431738891CDFC25E0008FEB9 /* cpu.c in Sources */, 5376130F155AD0D5005750A4 /* UIImageView+WebCache.m in Sources */, + 43DA7C951D1086570028BE58 /* argb.c in Sources */, + 43DA7CC21D1086570028BE58 /* upsampling.c in Sources */, + 43DA7C9D1D1086570028BE58 /* dec_mips32.c in Sources */, + 43DA7CB61D1086570028BE58 /* lossless.c in Sources */, 530E49EC16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */, 431738851CDFC2580008FEB9 /* webp.c in Sources */, - 4317389E1CDFC25E0008FEB9 /* yuv.c in Sources */, + 43DA7C941D1086570028BE58 /* argb_sse2.c in Sources */, + 43DA7CBE1D1086570028BE58 /* rescaler.c in Sources */, + 43DA7CA31D1086570028BE58 /* enc_avx2.c in Sources */, + 43DA7CB21D1086570028BE58 /* lossless_enc.c in Sources */, 431738A61CDFC2630008FEB9 /* bit_writer.c in Sources */, 431738811CDFC2580008FEB9 /* vp8.c in Sources */, 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */, - 431738931CDFC25E0008FEB9 /* enc_neon.c in Sources */, - 431738981CDFC25E0008FEB9 /* lossless_neon.c in Sources */, - 4317388B1CDFC25E0008FEB9 /* dec_clip_tables.c in Sources */, - 431738951CDFC25E0008FEB9 /* lossless.c in Sources */, 53406750167780C40042B59E /* SDWebImageCompat.m in Sources */, 431738AF1CDFC2630008FEB9 /* huffman_encode.c in Sources */, + 43DA7CAA1D1086570028BE58 /* filters_mips_dsp_r2.c in Sources */, A18A6CC9172DC28500419892 /* UIImage+GIF.m in Sources */, - 4317389B1CDFC25E0008FEB9 /* upsampling.c in Sources */, 4317387E1CDFC2580008FEB9 /* io.c in Sources */, + 43DA7C931D1086570028BE58 /* argb_mips_dsp_r2.c in Sources */, + 43DA7C971D1086570028BE58 /* cost_mips32.c in Sources */, AB615306192DA24600A2D8E9 /* UIView+WebCacheOperation.m in Sources */, 4317387A1CDFC2580008FEB9 /* buffer.c in Sources */, + 43DA7CAB1D1086570028BE58 /* filters_sse2.c in Sources */, + 43DA7CA91D1086570028BE58 /* enc.c in Sources */, + 43DA7CC61D1086570028BE58 /* yuv.c in Sources */, 5D5B9145188EE8DD006D06BD /* NSData+ImageContentType.m in Sources */, 53EDFB8C17623F7C00698166 /* UIImage+MultiFormat.m in Sources */, - 4317389D1CDFC25E0008FEB9 /* upsampling_sse2.c in Sources */, ABBE71A818C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m in Sources */, + 43DA7CAE1D1086570028BE58 /* lossless_enc_mips32.c in Sources */, 43CE757F1CFE9427006C64D0 /* FLAnimatedImageView.m in Sources */, + 43DA7CC31D1086570028BE58 /* yuv_mips_dsp_r2.c in Sources */, + 43DA7CC01D1086570028BE58 /* upsampling_neon.c in Sources */, + 43DA7C921D1086570028BE58 /* alpha_processing.c in Sources */, + 43DA7CC41D1086570028BE58 /* yuv_mips32.c in Sources */, + 43DA7CBA1D1086570028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 4317387C1CDFC2580008FEB9 /* frame.c in Sources */, 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */, - 4317388D1CDFC25E0008FEB9 /* dec_neon.c in Sources */, 431738781CDFC2580008FEB9 /* alpha.c in Sources */, - 431738901CDFC25E0008FEB9 /* enc.c in Sources */, + 43DA7C9E1D1086570028BE58 /* dec_neon.c in Sources */, 431738BB1CDFC2630008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2187,7 +2593,10 @@ 4314D1971D0E0E3B004B36C9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "WEBP_USE_INTRINSICS=1", + "$(inherited)", + ); PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; SDKROOT = watchos; @@ -2199,6 +2608,10 @@ 4314D1981D0E0E3B004B36C9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + "WEBP_USE_INTRINSICS=1", + "$(inherited)", + ); PRODUCT_NAME = "$(TARGET_NAME)"; PUBLIC_HEADERS_FOLDER_PATH = include/SDWebImage; SDKROOT = watchos; @@ -2219,6 +2632,10 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "WEBP_USE_INTRINSICS=1", + "$(inherited)", + ); INFOPLIST_FILE = WebImage/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -2247,6 +2664,10 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "WEBP_USE_INTRINSICS=1", + "$(inherited)", + ); INFOPLIST_FILE = WebImage/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; diff --git a/Vendors/libwebp b/Vendors/libwebp index 1525784d..37f04949 160000 --- a/Vendors/libwebp +++ b/Vendors/libwebp @@ -1 +1 @@ -Subproject commit 1525784d5bc1d9e7e74ff18f9d21a910b60552af +Subproject commit 37f049490d573f8c153e1b2c74c3a5bcca3a3d8b From 0bcb35d6977609d4032466137a39456ad0aa32ac Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 14 Jun 2016 23:08:28 +0300 Subject: [PATCH 090/207] Last commit missed to add 2 alpha_processing files. --- SDWebImage.xcodeproj/project.pbxproj | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 9faba8a7..8711534d 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -795,6 +795,18 @@ 43DA7DDF1D10867B0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; 43DA7DE01D10867C0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; 43DA7DE11D10867D0028BE58 /* extras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DA7DDB1D1086740028BE58 /* extras.h */; }; + 43DA7DE41D109B160028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DE51D109B160028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; + 43DA7DE61D109B980028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DE71D109B980028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; + 43DA7DE81D109B990028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DE91D109B990028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; + 43DA7DEA1D109B9A0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DEB1D109B9A0028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; + 43DA7DEC1D109B9B0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DED1D109B9B0028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; + 43DA7DEE1D109B9B0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */; }; + 43DA7DEF1D109B9B0028BE58 /* alpha_processing_sse2.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */; }; 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D88148C56230056699D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A2CAE191AB4BB6400B6BC39 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 5340674F167780C40042B59E /* SDWebImageCompat.m */; }; @@ -933,6 +945,8 @@ 43DA7C8F1D1086570028BE58 /* yuv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yuv.c; sourceTree = ""; }; 43DA7C901D1086570028BE58 /* yuv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yuv.h; sourceTree = ""; }; 43DA7DDB1D1086740028BE58 /* extras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extras.h; sourceTree = ""; }; + 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing_mips_dsp_r2.c; sourceTree = ""; }; + 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = alpha_processing_sse2.c; sourceTree = ""; }; 4A2CADFF1AB4BB5300B6BC39 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A2CAE021AB4BB5400B6BC39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 4A2CAE031AB4BB5400B6BC39 /* SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImage.h; sourceTree = ""; }; @@ -1255,6 +1269,8 @@ DA577C651998E60B007367ED /* dsp */ = { isa = PBXGroup; children = ( + 43DA7DE21D109B160028BE58 /* alpha_processing_mips_dsp_r2.c */, + 43DA7DE31D109B160028BE58 /* alpha_processing_sse2.c */, 43DA7C5A1D1086570028BE58 /* alpha_processing_sse41.c */, 43DA7C5B1D1086570028BE58 /* alpha_processing.c */, 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */, @@ -2017,6 +2033,7 @@ 00733A621BC4880000A5A117 /* UIView+WebCacheOperation.m in Sources */, 4317393C1CDFC8B20008FEB9 /* filters.c in Sources */, 43DA7D391D1086600028BE58 /* argb_sse2.c in Sources */, + 43DA7DEA1D109B9A0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7D631D1086600028BE58 /* rescaler.c in Sources */, 43DA7D481D1086600028BE58 /* enc_avx2.c in Sources */, 43DA7D571D1086600028BE58 /* lossless_enc.c in Sources */, @@ -2049,6 +2066,7 @@ 431738D31CDFC8A40008FEB9 /* alpha.c in Sources */, 00733A601BC4880000A5A117 /* UIImageView+HighlightedWebCache.m in Sources */, 43DA7D431D1086600028BE58 /* dec_neon.c in Sources */, + 43DA7DEB1D109B9A0028BE58 /* alpha_processing_sse2.c in Sources */, 431739401CDFC8B20008FEB9 /* huffman_encode.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2069,6 +2087,7 @@ 4314D1271D0E0E3B004B36C9 /* rescaler.c in Sources */, 43DA7CF61D10865E0028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 4314D12A1D0E0E3B004B36C9 /* quant.c in Sources */, + 43DA7DE71D109B980028BE58 /* alpha_processing_sse2.c in Sources */, 43DA7CDB1D10865E0028BE58 /* enc_mips_dsp_r2.c in Sources */, 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */, 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */, @@ -2091,6 +2110,7 @@ 43DA7CE41D10865E0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */, 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */, + 43DA7DE61D109B980028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7CCF1D10865E0028BE58 /* cost_sse2.c in Sources */, 4314D13D1D0E0E3B004B36C9 /* quant_levels_dec.c in Sources */, 4314D13E1D0E0E3B004B36C9 /* vp8l.c in Sources */, @@ -2163,6 +2183,7 @@ 431BB6921D06D2C1006A3455 /* NSData+ImageContentType.m in Sources */, 43DA7D9B1D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 431BB69A1D06D2C1006A3455 /* SDWebImageDownloader.m in Sources */, + 43DA7DED1D109B9B0028BE58 /* alpha_processing_sse2.c in Sources */, 43DA7D801D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */, 43A62A631D0E0A8F0089D7DD /* vp8l.c in Sources */, 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, @@ -2185,6 +2206,7 @@ 43DA7D891D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, 43A62A341D0E0A860089D7DD /* random.c in Sources */, 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */, + 43DA7DEC1D109B9B0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7D741D1086600028BE58 /* cost_sse2.c in Sources */, 431BB6B41D06D2C1006A3455 /* SDWebImageDecoder.m in Sources */, 431BB6B61D06D2C1006A3455 /* UIImage+WebP.m in Sources */, @@ -2279,6 +2301,7 @@ 43DA7DB61D1086610028BE58 /* enc_avx2.c in Sources */, 4397D2901D0DDD8C00BB2784 /* tree.c in Sources */, 43DA7DD01D1086610028BE58 /* rescaler_sse2.c in Sources */, + 43DA7DEE1D109B9B0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7DC01D1086610028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, 43DA7DD21D1086610028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 43DA7DD41D1086610028BE58 /* upsampling_sse2.c in Sources */, @@ -2291,6 +2314,7 @@ 4397D2981D0DDD8C00BB2784 /* quant_levels_dec.c in Sources */, 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */, 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */, + 43DA7DEF1D109B9B0028BE58 /* alpha_processing_sse2.c in Sources */, 43DA7DBD1D1086610028BE58 /* filters_mips_dsp_r2.c in Sources */, 43DA7DC61D1086610028BE58 /* lossless_mips_dsp_r2.c in Sources */, 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */, @@ -2399,6 +2423,7 @@ 4A2CAE2A1AB4BB7500B6BC39 /* NSData+ImageContentType.m in Sources */, 431738D11CDFC8A30008FEB9 /* webp.c in Sources */, 43DA7D021D10865F0028BE58 /* argb_sse2.c in Sources */, + 43DA7DE81D109B990028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7D2C1D10865F0028BE58 /* rescaler.c in Sources */, 43DA7D111D10865F0028BE58 /* enc_avx2.c in Sources */, 43DA7D201D10865F0028BE58 /* lossless_enc.c in Sources */, @@ -2431,6 +2456,7 @@ 4317391A1CDFC8B20008FEB9 /* bit_reader.c in Sources */, 431738C41CDFC8A30008FEB9 /* alpha.c in Sources */, 43DA7D0C1D10865F0028BE58 /* dec_neon.c in Sources */, + 43DA7DE91D109B990028BE58 /* alpha_processing_sse2.c in Sources */, 431739321CDFC8B20008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2497,6 +2523,7 @@ 530E49EC16464C84002868E7 /* SDWebImageDownloaderOperation.m in Sources */, 431738851CDFC2580008FEB9 /* webp.c in Sources */, 43DA7C941D1086570028BE58 /* argb_sse2.c in Sources */, + 43DA7DE41D109B160028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, 43DA7CBE1D1086570028BE58 /* rescaler.c in Sources */, 43DA7CA31D1086570028BE58 /* enc_avx2.c in Sources */, 43DA7CB21D1086570028BE58 /* lossless_enc.c in Sources */, @@ -2529,6 +2556,7 @@ 431738A31CDFC2630008FEB9 /* bit_reader.c in Sources */, 431738781CDFC2580008FEB9 /* alpha.c in Sources */, 43DA7C9E1D1086570028BE58 /* dec_neon.c in Sources */, + 43DA7DE51D109B160028BE58 /* alpha_processing_sse2.c in Sources */, 431738BB1CDFC2630008FEB9 /* utils.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 5851f78aee7104a595cb3aee14a261c10c6a7418 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 14 Jun 2016 23:10:33 +0300 Subject: [PATCH 091/207] Fixed issue "The value of CFBundleVersion in your WatchKit app's Info.plist (1) does not match the value in your companion app's Info.plist (1.0). There values are required to match" --- Examples/SDWebImage Demo/SDWebImage Demo-Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/SDWebImage Demo/SDWebImage Demo-Info.plist b/Examples/SDWebImage Demo/SDWebImage Demo-Info.plist index fa6aa71a..0f061f00 100644 --- a/Examples/SDWebImage Demo/SDWebImage Demo-Info.plist +++ b/Examples/SDWebImage Demo/SDWebImage Demo-Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 1.0 + 1 LSRequiresIPhoneOS NSAppTransportSecurity From 1ac8c23723a1b2eac13562fbedcdbf3cac77d014 Mon Sep 17 00:00:00 2001 From: Sash Zats Date: Wed, 24 Aug 2016 14:06:12 -0700 Subject: [PATCH 092/207] Allow to specify NSURLSessionConfiguration for SDWebImageDownloader --- SDWebImage/SDWebImageDownloader.h | 9 ++++++++- SDWebImage/SDWebImageDownloader.m | 13 ++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index d440e043..ae4af26b 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -107,7 +107,7 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * * @return global shared instance of downloader class */ -+ (SDWebImageDownloader *)sharedDownloader; ++ (instancetype)sharedDownloader; /** * Set the default URL credential to be set for request operations. @@ -132,6 +132,13 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi */ @property (nonatomic, copy) SDWebImageDownloaderHeadersFilterBlock headersFilter; +/** + * Creates an instance of a downloader with specified session configuration. + * *Note*: `timeoutIntervalForRequest` is going to be overwritten. + * @return new instance of downloader class + */ +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)sessionConfiguration NS_DESIGNATED_INITIALIZER; + /** * Set a value for a HTTP header to be appended to each download HTTP request. * diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index ca703033..8deb2474 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -53,7 +53,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; } } -+ (SDWebImageDownloader *)sharedDownloader { ++ (instancetype)sharedDownloader { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -62,7 +62,11 @@ static NSString *const kCompletedCallbackKey = @"completed"; return instance; } -- (id)init { +- (instancetype)init { + return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)sessionConfiguration { if ((self = [super init])) { _operationClass = [SDWebImageDownloaderOperation class]; _shouldDecompressImages = YES; @@ -78,15 +82,14 @@ static NSString *const kCompletedCallbackKey = @"completed"; _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); _downloadTimeout = 15.0; - NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; - sessionConfig.timeoutIntervalForRequest = _downloadTimeout; + sessionConfiguration.timeoutIntervalForRequest = _downloadTimeout; /** * Create the session for this task * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate * method calls and completion handler calls. */ - self.session = [NSURLSession sessionWithConfiguration:sessionConfig + self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; } From 6de3e4c3bf77272141b974e8948d8ff0b7770768 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 26 Aug 2016 12:45:33 +0300 Subject: [PATCH 093/207] Added logos and included in the readme --- README.md | 7 +++++-- SDWebImage_logo.png | Bin 0 -> 8210 bytes SDWebImage_logo_small.png | Bin 0 -> 1981 bytes 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 SDWebImage_logo.png create mode 100644 SDWebImage_logo_small.png diff --git a/README.md b/README.md index 160cb6d1..0750aadc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ -SDWebImage -========== +

+ +

+ + [![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) [![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) diff --git a/SDWebImage_logo.png b/SDWebImage_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2ec3a5faedc91a024b5c3d824a2eb7722e6f09 GIT binary patch literal 8210 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 literal 0 HcmV?d00001 From 1a2f81a5d5cf3371aa66a38735603fef9f694e4b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 26 Aug 2016 19:52:44 +0300 Subject: [PATCH 094/207] Added the `WEBP_USE_INTRINSICS` flag per https://github.com/rs/SDWebImage/pull/1595#issuecomment-225984546 --- SDWebImage.podspec | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index bcdde91f..c3b964a1 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -56,6 +56,10 @@ Pod::Spec.new do |s| 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SD_WEBP=1', 'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/libwebp/src' } + webp.watchos.xcconfig = { + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SD_WEBP=1 WEBP_USE_INTRINSICS=1', + 'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/libwebp/src' + } webp.dependency 'SDWebImage/Core' webp.dependency 'libwebp' end From b360cbdc8031e9f1bef377f839a1d4183ff07aba Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 26 Aug 2016 20:07:49 +0300 Subject: [PATCH 095/207] Updated the Readme with the supported platforms --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 160cb6d1..1927462a 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,15 @@ This library provides an async image downloader with cache support. For convenie ## Requirements -- iOS 5.1.1+ / tvOS 9.0+ -- Xcode 7.1+ +- iOS 7.0 or later +- tvOS 9.0 or later +- watchOS 2.0 or later +- OS X 10.8 or later +- Xcode 7.3 or later #### Backwards compatibility +- For iOS < 7.0, please use the last [3.x version - currently 3.8.1](https://github.com/rs/SDWebImage/tree/3.8.1) - For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). ## Getting Started @@ -81,7 +85,8 @@ imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image. - Starting with the 4.0 version, we relly on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. - To use it, simply make sure you us `FLAnimatedImageView` instead of `UIImageView`. -- Note: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. +- **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. +- **Important**: FLAnimatedImage only works on the iOS platform, so for all the other platforms (OS X, tvOS, watchOS) we will fallback to the backwards compatibility feature described above Common Problems --------------- From 823b615281662b93e5a8f0339fd4afd89d139b26 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 26 Aug 2016 21:35:37 +0300 Subject: [PATCH 096/207] Set 4.0.0-beta as the version from the podspec and the Info.plist file --- SDWebImage.podspec | 3 ++- WebImage/Info.plist | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index c3b964a1..61d216c7 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -1,6 +1,7 @@ Pod::Spec.new do |s| s.name = 'SDWebImage' - s.version = '3.8.1' + s.version = '4.0.0-beta' + s.osx.deployment_target = '10.8' s.ios.deployment_target = '7.0' s.tvos.deployment_target = '9.0' diff --git a/WebImage/Info.plist b/WebImage/Info.plist index 9467a966..233da96f 100644 --- a/WebImage/Info.plist +++ b/WebImage/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.8.1 + 4.0.0-beta CFBundleSignature ???? CFBundleVersion From 203c3712b2b7f894c71ef1295aa008854228a337 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 26 Aug 2016 21:46:17 +0300 Subject: [PATCH 097/207] Updated the CHANGELOG so it's easier when 4.0 is actually released --- CHANGELOG.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ada48e0..24750035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,66 @@ +## [4.0.0 - In progress](https://github.com/rs/SDWebImage/tree/4.x) + +#### Infrastructure: + +- support for **watchOS** and **OS X** platforms #1595 +- the `SDWebImage xcodeproj` contains the following targets: + - `SDWebImage iOS static` (iOS static lib) + - `SDWebImage watchOS static` (watchOS static lib) + - `SDWebImage OSX` (OSX dynamic framework) + - `SDWebImage iOS` (iOS dynamic framework) + - `SDWebImage tvOS` (tvOS dynamic framework) + - `SDWebImage watchOS` (watchOS dynamic framework) + - the `SDWebImage Demo xcodeproj` contains the following targets: + - `SDWebImage OSX Demo` + - `SDWebImage iOS Demo` + - `SDWebImage TV Demo` + - `SDWebImage Watch Demo` +- bumped `libwep` version to `0.5.0` + +#### Backwards incompatible changes + +- removed all deprecated methods (that we carried around for backwards compatibility in previous versions) #774 +- Renamed `SDWebImageManager` `downloadImageWithURL:options:progress:completed:` to `loadImageWithURL:options:progress:completed:` as it makes more sense, since we check the cache first and download only if needed a32a177 +- Deleted targets: `SDWebImage+MKAnnotation`, `SDWebImage+WebP`, `SDWebImageFramework`: + - `SDWebImage `target that build as a static library (all subspecs included) -> `libSDWebImage.a` + - `SDWebImageiOS` and `SDWebImagetvOS` targets that build as dynamic frameworks +- Renamed the dynamic frameworks targets from `WebImage` to `SDWebImage`. Renamed the `WebImage.h` to `SDWebImage.h` to match the framework naming +- Renamed the schemes for consistency. Updated the Tests Podfile + project. +- For #883 Fix multiple requests for same image and then canceling one, several breaking changes were needed: + - `SDWebImageDownloader` method `- downloadImageWithURL:options:progress:completed:` now returns a `SDWebImageDownloadToken *` instead of `id ` (give the ability to cancel downloads using the returned token) + - `SDWebImageDownloaderOperation` initializer `- initWithRequest:options:progress:completed:cancelled` split into `- initWithRequest:options` and `addHandlersForProgress:completed:`. Note: there is no more cancel block +- Modern Objective-C syntax done in 64382b9 includes: + - initializers now return `instancetype` instead of `id` + - explicit designated initializers (i.e. for `SDImageCache`) +- For #1575 GIF support using FLAnimatedImage, several changes were needed: + - replaced type `SDWebImageQueryCompletedBlock` with `SDCacheQueryCompletedBlock` and added an `NSData *` param + - because of the change above, the `done` param of `SDImageCache` `queryDiskCacheForKey:done:` is now a `SDCacheQueryCompletedBlock` and those blocks must now include an `NSData *` param + - replaced type `SDWebImageCompletionWithFinishedBlock` with `SDInternalCompletionBlock` and added an `NSData *` param + - because of the change above, the `completed` param of `SDWebImageManager` `loadImageWithURL:options:progress:completed:` is now `SDInternalCompletionBlock` and those blocks must now include an `NSData *` param + - for consistency with the previous change, also renamed `SDWebImageCompletionBlock` to `SDExternalCompletionBlock` + - `UIImage` will no longer respond to `sd_animatedGIFNamed:` or `sd_animatedImageByScalingAndCroppingToSize:` +- Xcode 7 Objective-C updates (Lightweight Generics and Nullability) #1581 + - breaks compatibility at least for Swift users of the framework +- **watchOS** and **OS X** support #1595 required + - renamed `SDWebImage` iOS static lib target to `SDWebImage iOS static` for clarity + +#### Features: + +- Switched our GIF support to a better implementation: [FLAnimatedImage by Flipboard](https://github.com/Flipboard/FLAnimatedImage) #1575 + - requires iOS 8+ (it's the only way due to FLAnimatedImage requirements) + - the implementation relies on a `WebCache` category on top of `FLAnimatedImageView` + - details in the [README](README.md#animated-images-gif-support) +- Converted any remaining code to Modern Objective-C syntax - 64382b9 +- Xcode 7 Objective-C updates (Lightweight Generics and Nullability) #1581 +- via #1595 Clarified and simplified the usage of `TARGET_OS_*` macros. Added `SD_MAC`, `SD_UIKIT`, `SD_IOS`, `SD_TV`, `SD_WATCH`. The biggest issue here was `TARGET_OS_MAC` was 1 for all platforms and we couldn't rely on it. +- Replaces #1398 Allow to customise cache and image downloader instances used with `SDWebImageManager` - added a new initializer (`initWithCache:downloader:`) 9112170 + +#### Fixes: + +- Fix multiple requests for same image and then canceling one #883 + 8a78586 +- Fixed #1444 and the master build thanks to [@kenmaz](https://github.com/kenmaz/SDWebImage/commit/5034c334be50765dfe4e97c48bcb74ef64175188) + + ## [3.8.1 Patch release for 3.8.0 on Jun 7th, 2016](https://github.com/rs/SDWebImage/releases/tag/3.8.1) #### Fixes: From 71da8bad7d392af909db2b3e745b7f9a9932b93f Mon Sep 17 00:00:00 2001 From: "Macko, Jeffrey" Date: Tue, 30 Aug 2016 18:56:15 +0200 Subject: [PATCH 098/207] Add support for downloading image behind a redirect --- SDWebImage/SDWebImageDownloader.m | 5 +++++ Tests/Tests/SDWebImageManagerTests.m | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index ca703033..4a00ec16 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -306,6 +306,11 @@ didReceiveResponse:(NSURLResponse *)response [dataOperation URLSession:session task:task didCompleteWithError:error]; } +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { + + completionHandler(request); +} + - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { // Identify the operation that runs this task and pass it the delegate method diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index e19d4e4e..64875fb0 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -69,4 +69,23 @@ static int64_t kAsyncTestTimeout = 5; [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } +- (void)testTestThatItCanDownloadAnImageWithARedirection { + __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; + + NSURL *originalImageURL = [NSURL URLWithString:@"https://graph.facebook.com/10153629359641544/picture?width=640&height=640"]; + + [[SDWebImageManager sharedManager] downloadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).toNot.equal(imageURL); + + [expectation fulfill]; + expectation = nil; + }]; + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; + +} + @end From 3aa987db430a2d18a59ce9a5e12c21bd3d1e7711 Mon Sep 17 00:00:00 2001 From: Jeffrey Macko Date: Tue, 30 Aug 2016 19:01:45 +0200 Subject: [PATCH 099/207] Update SDWebImageManagerTests.m Using my cat for the test --- Tests/Tests/SDWebImageManagerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index 64875fb0..463584dc 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -72,7 +72,7 @@ static int64_t kAsyncTestTimeout = 5; - (void)testTestThatItCanDownloadAnImageWithARedirection { __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; - NSURL *originalImageURL = [NSURL URLWithString:@"https://graph.facebook.com/10153629359641544/picture?width=640&height=640"]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://graph.facebook.com/1815229585429909/picture?width=640&height=640"]; [[SDWebImageManager sharedManager] downloadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { From 9d0e0c11185e0afe63f9bfcd72aa2fcdcc63ffb6 Mon Sep 17 00:00:00 2001 From: Jeffrey Macko Date: Mon, 12 Sep 2016 22:31:24 +0200 Subject: [PATCH 100/207] Update SDWebImageManagerTests.m Remove the test --- Tests/Tests/SDWebImageManagerTests.m | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index 463584dc..e19d4e4e 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -69,23 +69,4 @@ static int64_t kAsyncTestTimeout = 5; [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } -- (void)testTestThatItCanDownloadAnImageWithARedirection { - __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; - - NSURL *originalImageURL = [NSURL URLWithString:@"https://graph.facebook.com/1815229585429909/picture?width=640&height=640"]; - - [[SDWebImageManager sharedManager] downloadImageWithURL:originalImageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - - expect(image).toNot.beNil(); - expect(error).to.beNil(); - expect(originalImageURL).toNot.equal(imageURL); - - [expectation fulfill]; - expectation = nil; - }]; - - [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; - -} - @end From 806bce3134fe76f868b675fe1c2a1aca82f26947 Mon Sep 17 00:00:00 2001 From: Jimmie Jensen Date: Thu, 22 Sep 2016 09:47:47 +0200 Subject: [PATCH 101/207] #1619: Adds NSError as input to resourceValuesForKeys:error: method to be able to determine if we should skip due to an error while looking up resources --- SDWebImage/SDImageCache.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index fe244824..1af4a6f6 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -528,10 +528,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // 2. Storing file attributes for the size-based cleanup pass. NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; for (NSURL *fileURL in fileEnumerator) { - NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL]; - - // Skip directories. - if ([resourceValues[NSURLIsDirectoryKey] boolValue]) { + NSError *error; + NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; + + // Skip directories and errors. + if (error || [resourceValues[NSURLIsDirectoryKey] boolValue]) { continue; } From 3ef030e0283d9719242ffef5bd2390394daa7849 Mon Sep 17 00:00:00 2001 From: Jimmie Jensen Date: Thu, 22 Sep 2016 10:17:28 +0200 Subject: [PATCH 102/207] #1619: Adds unit test that touches affeted code --- SDWebImage/SDImageCache.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 1af4a6f6..6de4b896 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -532,7 +532,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; // Skip directories and errors. - if (error || [resourceValues[NSURLIsDirectoryKey] boolValue]) { + if (/*error || */[resourceValues[NSURLIsDirectoryKey] boolValue]) { continue; } From fb65b04983f4746bd7f4b6559ef4590a3a722f1f Mon Sep 17 00:00:00 2001 From: Jimmie Jensen Date: Thu, 22 Sep 2016 10:27:33 +0200 Subject: [PATCH 103/207] #1619: Removed commenting out the actualt error check --- SDWebImage/SDImageCache.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 6de4b896..1af4a6f6 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -532,7 +532,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; // Skip directories and errors. - if (/*error || */[resourceValues[NSURLIsDirectoryKey] boolValue]) { + if (error || [resourceValues[NSURLIsDirectoryKey] boolValue]) { continue; } From 0869c6915d95dd3ce7be3a40fe4af0e089e4d806 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:12:13 +0300 Subject: [PATCH 104/207] Added PNG image to demo app --- Examples/SDWebImage Demo/MasterViewController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 57327de6..e8f47355 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -71,6 +71,7 @@ @"https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp", @"http://www.ioncannon.net/wp-content/uploads/2011/06/test9.webp", + @"https://nr-platform.s3.amazonaws.com/uploads/platform/published_extension/branding_icon/275/AmazonS3.png", nil]; for (int i=0; i<100; i++) { From f32f24f9c477518080d8d53d2e967c6741fee567 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:20:24 +0300 Subject: [PATCH 105/207] Refactored NSData ImageContentType category, instead of returning the contentType as a string, the new added method `sd_imageFormatForImageData` will return a `SDImageFormat` enum value --- .../FLAnimatedImageView+WebCache.m | 4 ++-- SDWebImage/NSData+ImageContentType.h | 17 +++++++++---- SDWebImage/NSData+ImageContentType.m | 24 +++++++++---------- SDWebImage/UIImage+MultiFormat.m | 6 ++--- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index 03918aab..4e33b7dd 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -79,8 +79,8 @@ static char imageURLKey; completedBlock(image, error, cacheType, url); return; } else if (image) { - NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; - if ([imageContentType isEqualToString:@"image/gif"]) { + SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; + if (imageFormat == SDImageFormatGIF) { wself.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data]; wself.image = nil; } else { diff --git a/SDWebImage/NSData+ImageContentType.h b/SDWebImage/NSData+ImageContentType.h index 6bdf0b28..f446f869 100644 --- a/SDWebImage/NSData+ImageContentType.h +++ b/SDWebImage/NSData+ImageContentType.h @@ -9,15 +9,24 @@ #import +typedef NS_ENUM(NSInteger, SDImageFormat) { + SDImageFormatUndefined = -1, + SDImageFormatJPEG = 0, + SDImageFormatPNG, + SDImageFormatGIF, + SDImageFormatTIFF, + SDImageFormatWebP +}; + @interface NSData (ImageContentType) /** - * Compute the content type for an image data + * Return image format * - * @param data the input data + * @param data the input image data * - * @return the content type as string (i.e. image/jpeg, image/gif) + * @return the image format as `SDImageFormat` (enum) */ -+ (nullable NSString *)sd_contentTypeForImageData:(nullable NSData *)data; ++ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data; @end diff --git a/SDWebImage/NSData+ImageContentType.m b/SDWebImage/NSData+ImageContentType.m index fbbb0157..7364715f 100644 --- a/SDWebImage/NSData+ImageContentType.m +++ b/SDWebImage/NSData+ImageContentType.m @@ -12,37 +12,35 @@ @implementation NSData (ImageContentType) -+ (nullable NSString *)sd_contentTypeForImageData:(nullable NSData *)data { ++ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { if (!data) { - return nil; + return SDImageFormatUndefined; } - + uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: - return @"image/jpeg"; + return SDImageFormatJPEG; case 0x89: - return @"image/png"; + return SDImageFormatPNG; case 0x47: - return @"image/gif"; + return SDImageFormatGIF; case 0x49: case 0x4D: - return @"image/tiff"; + return SDImageFormatTIFF; case 0x52: // R as RIFF for WEBP if (data.length < 12) { - return nil; + return SDImageFormatUndefined; } - + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { - return @"image/webp"; + return SDImageFormatWebP; } - - return nil; } - return nil; + return SDImageFormatUndefined; } @end diff --git a/SDWebImage/UIImage+MultiFormat.m b/SDWebImage/UIImage+MultiFormat.m index 64cefbb3..b0053b49 100644 --- a/SDWebImage/UIImage+MultiFormat.m +++ b/SDWebImage/UIImage+MultiFormat.m @@ -23,12 +23,12 @@ } UIImage *image; - NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; - if ([imageContentType isEqualToString:@"image/gif"]) { + SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; + if (imageFormat == SDImageFormatGIF) { image = [UIImage sd_animatedGIFWithData:data]; } #ifdef SD_WEBP - else if ([imageContentType isEqualToString:@"image/webp"]) + else if (imageFormat == SDImageFormatWebP) { image = [UIImage sd_imageWithWebPData:data]; } From 82d1f2e49a50c263dc04363633c59f4e0a0fb6f4 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:26:46 +0300 Subject: [PATCH 106/207] Preparing to remove the need for the `recalculateFromImage` param for store in cache. Only if the data provided is nil and we have an image, we will recaculate. Moved the NSData calculation in the UIImage MultiFormat categ, plus instead of another variant to check for PNG, relly on `sd_imageFormatForImageData` --- SDWebImage/SDImageCache.m | 65 +++----------------------------- SDWebImage/UIImage+MultiFormat.h | 3 ++ SDWebImage/UIImage+MultiFormat.m | 41 ++++++++++++++++++++ 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 6512767b..91a815a6 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -39,22 +39,6 @@ @end static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week -// PNG signature bytes and data (below) -static unsigned char kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; -static NSData *kPNGSignatureData = nil; - -BOOL ImageDataHasPNGPreffix(NSData *data); - -BOOL ImageDataHasPNGPreffix(NSData *data) { - NSUInteger pngSignatureLength = kPNGSignatureData.length; - if (data.length >= pngSignatureLength) { - if ([[data subdataWithRange:NSMakeRange(0, pngSignatureLength)] isEqualToData:kPNGSignatureData]) { - return YES; - } - } - - return NO; -} FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #if SD_MAC @@ -100,10 +84,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { diskCacheDirectory:(nonnull NSString *)directory { if ((self = [super init])) { NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; - - // initialise PNG signature data - kPNGSignatureData = [NSData dataWithBytes:kPNGSignatureBytes length:8]; - + // Create IO serial queue _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); @@ -218,46 +199,10 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { if (toDisk) { dispatch_async(self.ioQueue, ^{ NSData *data = imageData; - - if (image && (recalculate || !data)) { -#if SD_UIKIT || SD_WATCH - // We need to determine if the image is a PNG or a JPEG - // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html) - // The first eight bytes of a PNG file always contain the following (decimal) values: - // 137 80 78 71 13 10 26 10 - - // If the imageData is nil (i.e. if trying to save a UIImage directly or the image was transformed on download) - // and the image has an alpha channel, we will consider it PNG to avoid losing the transparency - int alphaInfo = CGImageGetAlphaInfo(image.CGImage); - BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || - alphaInfo == kCGImageAlphaNoneSkipFirst || - alphaInfo == kCGImageAlphaNoneSkipLast); - BOOL imageIsPng = hasAlpha; - - // But if we have an image data, we will look at the preffix - if (imageData.length >= kPNGSignatureData.length) { - imageIsPng = ImageDataHasPNGPreffix(imageData); - } - - if (imageIsPng) { - data = UIImagePNGRepresentation(image); - } - else { - data = UIImageJPEGRepresentation(image, (CGFloat)1.0); - } -#else - NSString *contentType = [NSData sd_contentTypeForImageData:data]; - NSBitmapImageFileType imageFileType = NSJPEGFileType; - if ([contentType isEqualToString:@"image/gif"]) { - imageFileType = NSGIFFileType; - } else if ([contentType isEqualToString:@"image/png"]) { - imageFileType = NSPNGFileType; - } - - data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations - usingType:imageFileType - properties:@{}]; -#endif + + if (!data && image) { + SDImageFormat imageFormatFromData = [NSData sd_imageFormatForImageData:data]; + data = [image sd_imageDataAsFormat:imageFormatFromData]; } [self storeImageDataToDisk:data forKey:key]; diff --git a/SDWebImage/UIImage+MultiFormat.h b/SDWebImage/UIImage+MultiFormat.h index a799929b..bec411e0 100644 --- a/SDWebImage/UIImage+MultiFormat.h +++ b/SDWebImage/UIImage+MultiFormat.h @@ -7,9 +7,12 @@ */ #import "SDWebImageCompat.h" +#import "NSData+ImageContentType.h" @interface UIImage (MultiFormat) + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; +- (nullable NSData *)sd_imageData; +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat; @end diff --git a/SDWebImage/UIImage+MultiFormat.m b/SDWebImage/UIImage+MultiFormat.m index b0053b49..378f3892 100644 --- a/SDWebImage/UIImage+MultiFormat.m +++ b/SDWebImage/UIImage+MultiFormat.m @@ -116,5 +116,46 @@ } #endif +- (nullable NSData *)sd_imageData { + return [self sd_imageDataAsFormat:SDImageFormatUndefined]; +} + +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat { + NSData *imageData = nil; + if (self) { +#if SD_UIKIT || SD_WATCH + int alphaInfo = CGImageGetAlphaInfo(self.CGImage); + BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || + alphaInfo == kCGImageAlphaNoneSkipFirst || + alphaInfo == kCGImageAlphaNoneSkipLast); + + BOOL usePNG = hasAlpha; + + // the imageFormat param has priority here. But if the format is undefined, we relly on the alpha channel + if (imageFormat != SDImageFormatUndefined) { + usePNG = (imageFormat == SDImageFormatPNG); + } + + if (usePNG) { + imageData = UIImagePNGRepresentation(self); + } else { + imageData = UIImageJPEGRepresentation(self, (CGFloat)1.0); + } +#else + NSBitmapImageFileType imageFileType = NSJPEGFileType; + if (imageFormat == SDImageFormatGIF) { + imageFileType = NSGIFFileType; + } else if (imageFormat == SDImageFormatPNG) { + imageFileType = NSPNGFileType; + } + + imageData = [NSBitmapImageRep representationOfImageRepsInArray:self.representations + usingType:imageFileType + properties:@{}]; +#endif + } + return imageData; +} + @end From f1d749218e98c4698d563ca71b2f3b3f04b838e1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:35:25 +0300 Subject: [PATCH 107/207] Created a new class SDImageCacheConfig holding the configuration of the ImageCache. Easier to read code --- SDWebImage/SDImageCache.h | 30 +++++++--------------- SDWebImage/SDImageCache.m | 45 +++++++++++++-------------------- SDWebImage/SDImageCacheConfig.h | 39 ++++++++++++++++++++++++++++ SDWebImage/SDImageCacheConfig.m | 26 +++++++++++++++++++ 4 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 SDWebImage/SDImageCacheConfig.h create mode 100644 SDWebImage/SDImageCacheConfig.m diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index a470ef8d..38c64617 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -9,6 +9,8 @@ #import #import "SDWebImageCompat.h" +@class SDImageCacheConfig; + typedef NS_ENUM(NSInteger, SDImageCacheType) { /** * The image wasn't available the SDWebImage caches, but was downloaded from the web. @@ -30,27 +32,19 @@ typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize); + /** * SDImageCache maintains a memory cache and an optional disk cache. Disk cache write operations are performed * asynchronous so it doesn’t add unnecessary latency to the UI. */ @interface SDImageCache : NSObject -/** - * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. - * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. - */ -@property (assign, nonatomic) BOOL shouldDecompressImages; +#pragma mark - Properties /** - * disable iCloud backup [defaults to YES] + * Cache Config object - storing all kind of settings */ -@property (assign, nonatomic) BOOL shouldDisableiCloud; - -/** - * use memory cache [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; +@property (nonatomic, nonnull, readonly) SDImageCacheConfig *config; /** * The maximum "total cost" of the in-memory image cache. The cost function is the number of pixels held in memory. @@ -62,15 +56,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ @property (assign, nonatomic) NSUInteger maxMemoryCountLimit; -/** - * The maximum length of time to keep an image in the cache, in seconds - */ -@property (assign, nonatomic) NSInteger maxCacheAge; - -/** - * The maximum size of the cache, in bytes. - */ -@property (assign, nonatomic) NSUInteger maxCacheSize; +#pragma mark - Singleton and initialization /** * Returns global shared cache instance @@ -95,6 +81,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns diskCacheDirectory:(nonnull NSString *)directory NS_DESIGNATED_INITIALIZER; +#pragma mark - Cache paths + - (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace; /** diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 91a815a6..dca679d5 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -13,6 +13,7 @@ #import "UIImage+GIF.h" #import "NSData+ImageContentType.h" #import "NSImage+WebCache.h" +#import "SDImageCacheConfig.h" // See https://github.com/rs/SDWebImage/pull/1141 for discussion @interface AutoPurgeCache : NSCache @@ -38,7 +39,6 @@ @end -static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #if SD_MAC @@ -50,6 +50,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { @interface SDImageCache () +#pragma mark - Properties @property (strong, nonatomic, nonnull) NSCache *memCache; @property (strong, nonatomic, nonnull) NSString *diskCachePath; @property (strong, nonatomic, nullable) NSMutableArray *customPaths; @@ -62,6 +63,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSFileManager *_fileManager; } +#pragma mark - Singleton, init, dealloc + + (nonnull SDImageCache *)sharedImageCache { static dispatch_once_t once; static id instance; @@ -87,10 +90,9 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // Create IO serial queue _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); - - // Init default values - _maxCacheAge = kDefaultCacheMaxCacheAge; - + + _config = [[SDImageCacheConfig alloc] init]; + // Init the memory cache _memCache = [[AutoPurgeCache alloc] init]; _memCache.name = fullNamespace; @@ -103,15 +105,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { _diskCachePath = path; } - // Set decompression to YES - _shouldDecompressImages = YES; - - // memory cache enabled - _shouldCacheImagesInMemory = YES; - - // Disable iCloud - _shouldDisableiCloud = YES; - dispatch_sync(_ioQueue, ^{ _fileManager = [NSFileManager new]; }); @@ -143,6 +136,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { SDDispatchQueueRelease(_ioQueue); } +#pragma mark - Cache paths + - (void)addReadOnlyCachePath:(nonnull NSString *)path { if (!self.customPaths) { self.customPaths = [NSMutableArray new]; @@ -162,8 +157,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return [self cachePathForKey:key inPath:self.diskCachePath]; } -#pragma mark SDImageCache (private) - - (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key { const char *str = key.UTF8String; if (str == NULL) { @@ -178,9 +171,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return filename; } -#pragma mark ImageCache - -// Init the disk cache - (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); return [paths[0] stringByAppendingPathComponent:fullNamespace]; @@ -191,7 +181,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return; } // if memory cache is enabled - if (self.shouldCacheImagesInMemory) { + if (self.config.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(image); [self.memCache setObject:image forKey:key cost:cost]; } @@ -236,7 +226,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { [_fileManager createFileAtPath:cachePathForKey contents:imageData attributes:nil]; // disable iCloud backup - if (self.shouldDisableiCloud) { + if (self.config.shouldDisableiCloud) { [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; } } @@ -335,7 +325,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { if (data) { UIImage *image = [UIImage sd_imageWithData:data]; image = [self scaledImageForKey:key image:image]; - if (self.shouldDecompressImages) { + if (self.config.shouldDecompressImages) { image = [UIImage decodedImageWithImage:image]; } return image; @@ -379,7 +369,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { @autoreleasepool { NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key]; UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.shouldCacheImagesInMemory) { + if (diskImage && self.config.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(diskImage); [self.memCache setObject:diskImage forKey:key cost:cost]; } @@ -411,7 +401,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return; } - if (self.shouldCacheImagesInMemory) { + if (self.config.shouldCacheImagesInMemory) { [self.memCache removeObjectForKey:key]; } @@ -486,7 +476,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:NULL]; - NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.maxCacheAge]; + NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.config.maxCacheAge]; NSMutableDictionary *> *cacheFiles = [NSMutableDictionary dictionary]; NSUInteger currentCacheSize = 0; @@ -522,9 +512,9 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { // If our remaining disk cache exceeds a configured maximum size, perform a second // size-based cleanup pass. We delete the oldest files first. - if (self.maxCacheSize > 0 && currentCacheSize > self.maxCacheSize) { + if (self.config.maxCacheSize > 0 && currentCacheSize > self.config.maxCacheSize) { // Target half of our maximum cache size for this cleanup pass. - const NSUInteger desiredCacheSize = self.maxCacheSize / 2; + const NSUInteger desiredCacheSize = self.config.maxCacheSize / 2; // Sort the remaining cache files by their last modification time (oldest first). NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent @@ -625,3 +615,4 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } @end + diff --git a/SDWebImage/SDImageCacheConfig.h b/SDWebImage/SDImageCacheConfig.h new file mode 100644 index 00000000..a8883ecb --- /dev/null +++ b/SDWebImage/SDImageCacheConfig.h @@ -0,0 +1,39 @@ +// +// SDImageCacheConfig.h +// SDWebImage +// +// Created by Bogdan on 09/09/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import + +@interface SDImageCacheConfig : NSObject + +/** + * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. + * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. + */ +@property (assign, nonatomic) BOOL shouldDecompressImages; + +/** + * disable iCloud backup [defaults to YES] + */ +@property (assign, nonatomic) BOOL shouldDisableiCloud; + +/** + * use memory cache [defaults to YES] + */ +@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; + +/** + * The maximum length of time to keep an image in the cache, in seconds + */ +@property (assign, nonatomic) NSInteger maxCacheAge; + +/** + * The maximum size of the cache, in bytes. + */ +@property (assign, nonatomic) NSUInteger maxCacheSize; + +@end diff --git a/SDWebImage/SDImageCacheConfig.m b/SDWebImage/SDImageCacheConfig.m new file mode 100644 index 00000000..c154265a --- /dev/null +++ b/SDWebImage/SDImageCacheConfig.m @@ -0,0 +1,26 @@ +// +// SDImageCacheConfig.m +// SDWebImage +// +// Created by Bogdan on 09/09/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "SDImageCacheConfig.h" + +static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week + +@implementation SDImageCacheConfig + +- (instancetype)init { + if (self = [super init]) { + _shouldDecompressImages = YES; + _shouldDisableiCloud = YES; + _shouldCacheImagesInMemory = YES; + _maxCacheAge = kDefaultCacheMaxCacheAge; + _maxCacheSize = 0; + } + return self; +} + +@end From fbb310b494d5dab4e26f453b1b4a4c7f49d1be41 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:37:17 +0300 Subject: [PATCH 108/207] Expecta can use the latest version, using the WebP subspec in the Tests Podfile so we can get all the files --- Tests/Podfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Tests/Podfile b/Tests/Podfile index ba09b915..c85b5732 100644 --- a/Tests/Podfile +++ b/Tests/Podfile @@ -5,7 +5,8 @@ workspace '../SDWebImage' target 'Tests' do platform :ios, '7.0' - pod 'Expecta', '<=0.3.1' - pod 'SDWebImage', :path => '../' + pod 'Expecta' + pod 'OCMockito' + pod 'SDWebImage/WebP', :path => '../' end From 7d73623203186929b0952a25d9e2891588f25ecb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:37:48 +0300 Subject: [PATCH 109/207] Will use a single definition for all async tests duration: kAsyncTestTimeout --- SDWebImage/SDWebImageCompat.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index 0c886e61..a11f3916 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -112,3 +112,5 @@ extern NSString *const SDWebImageErrorDomain; } else {\ dispatch_async(dispatch_get_main_queue(), block);\ } + +static int64_t kAsyncTestTimeout = 5; From 712f49733445d3c1f2c603add5db5e5d15f1b23c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:38:04 +0300 Subject: [PATCH 110/207] Added missing property code comment --- SDWebImage/SDWebImageDownloader.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index a4d7d4b7..8f49514b 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -97,6 +97,9 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB */ @property (assign, nonatomic) BOOL shouldDecompressImages; +/** + * The maximum number of concurrent downloads + */ @property (assign, nonatomic) NSInteger maxConcurrentDownloads; /** From 84be05b867cab53f4cd800a770b35e8c4882ff81 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:42:22 +0300 Subject: [PATCH 111/207] Removed the synchronous methods `diskImageExistsForURL:` and `cachedImageExistsForURL:` from `SDWebImageManager` --- SDWebImage/SDWebImageManager.h | 18 ------------------ SDWebImage/SDWebImageManager.m | 11 ----------- 2 files changed, 29 deletions(-) diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index 19b45d6c..ce54bec7 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -236,24 +236,6 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; */ - (BOOL)isRunning; -/** - * Check if image has already been cached - * - * @param url image url - * - * @return if the image was already cached - */ -- (BOOL)cachedImageExistsForURL:(nullable NSURL *)url; - -/** - * Check if image has already been cached on disk only - * - * @param url image url - * - * @return if the image was already cached (disk only) - */ -- (BOOL)diskImageExistsForURL:(nullable NSURL *)url; - /** * Async check if image has already been cached * diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index e23c9e64..b4fd334e 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -66,17 +66,6 @@ } } -- (BOOL)cachedImageExistsForURL:(nullable NSURL *)url { - NSString *key = [self cacheKeyForURL:url]; - if ([self.imageCache imageFromMemoryCacheForKey:key] != nil) return YES; - return [self.imageCache diskImageExistsWithKey:key]; -} - -- (BOOL)diskImageExistsForURL:(nullable NSURL *)url { - NSString *key = [self cacheKeyForURL:url]; - return [self.imageCache diskImageExistsWithKey:key]; -} - - (void)cachedImageExistsForURL:(nullable NSURL *)url completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; From f4bdae687004e6691dcf9f703cad21c86f179880 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:46:30 +0300 Subject: [PATCH 112/207] Fixed an issue with the `SDWebImageDownloaderOperation` : `cancelInternal` was not called because of the old mechanism rellying on the `thread` property - probably because that thread did not have a runloop. Removed that and now cancelInternal is called as expected --- SDWebImage/SDWebImageDownloaderOperation.m | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 4c913b8f..615cc062 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -39,7 +39,6 @@ typedef NSMutableDictionary SDCallbacksDictionary; @property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask; -@property (strong, atomic, nullable) NSThread *thread; @property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; #if SD_UIKIT @@ -164,7 +163,6 @@ typedef NSMutableDictionary SDCallbacksDictionary; self.dataTask = [session dataTaskWithRequest:self.request]; self.executing = YES; - self.thread = [NSThread currentThread]; } [self.dataTask resume]; @@ -197,20 +195,10 @@ typedef NSMutableDictionary SDCallbacksDictionary; - (void)cancel { @synchronized (self) { - if (self.thread) { - [self performSelector:@selector(cancelInternalAndStop) onThread:self.thread withObject:nil waitUntilDone:NO]; - } - else { - [self cancelInternal]; - } + [self cancelInternal]; } } -- (void)cancelInternalAndStop { - if (self.isFinished) return; - [self cancelInternal]; -} - - (void)cancelInternal { if (self.isFinished) return; [super cancel]; @@ -242,7 +230,6 @@ typedef NSMutableDictionary SDCallbacksDictionary; }); self.dataTask = nil; self.imageData = nil; - self.thread = nil; if (self.ownedSession) { [self.ownedSession invalidateAndCancel]; self.ownedSession = nil; @@ -423,7 +410,6 @@ didReceiveResponse:(NSURLResponse *)response - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSArray *completionBlocks = [[self callbacksForKey:kCompletedCallbackKey] copy]; @synchronized(self) { - self.thread = nil; self.dataTask = nil; dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; From 04e963b90d8b69756a6aece80d7b883b0f6a7799 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:52:30 +0300 Subject: [PATCH 113/207] Get rid of the confusion cause by `cleanDisk` and `clearDisk`. Renamed `cleanDisk` to `deleteOldFiles`. No longer expose the sync `clearDisk` and `deleteOldFiles`, just the async ones --- SDWebImage/SDImageCache.h | 22 +++++----------------- SDWebImage/SDImageCache.m | 18 +++++++----------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 38c64617..55e5a30d 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -191,28 +191,16 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)clearMemory; /** - * Clear all disk cached images. Non-blocking method - returns immediately. - * @param completion An block that should be executed after cache expiration completes (optional) + * Async clear all disk cached images. Non-blocking method - returns immediately. + * @param completion A block that should be executed after cache expiration completes (optional) */ - (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion; /** - * Clear all disk cached images - * @see clearDiskOnCompletion: + * Async remove all expired cached image from disk. Non-blocking method - returns immediately. + * @param completionBlock A block that should be executed after cache expiration completes (optional) */ -- (void)clearDisk; - -/** - * Remove all expired cached image from disk. Non-blocking method - returns immediately. - * @param completionBlock An block that should be executed after cache expiration completes (optional) - */ -- (void)cleanDiskWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; - -/** - * Remove all expired cached image from disk - * @see cleanDiskWithCompletionBlock: - */ -- (void)cleanDisk; +- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; /** * Get the size used by the disk cache diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index dca679d5..66742ca6 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -117,12 +117,12 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(cleanDisk) + selector:@selector(deleteOldFiles) name:UIApplicationWillTerminateNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(backgroundCleanDisk) + selector:@selector(backgroundDeleteOldFiles) name:UIApplicationDidEnterBackgroundNotification object:nil]; #endif @@ -441,10 +441,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { [self.memCache removeAllObjects]; } -- (void)clearDisk { - [self clearDiskOnCompletion:nil]; -} - - (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion { dispatch_async(self.ioQueue, ^{ [_fileManager removeItemAtPath:self.diskCachePath error:nil]; @@ -461,11 +457,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } -- (void)cleanDisk { - [self cleanDiskWithCompletionBlock:nil]; +- (void)deleteOldFiles { + [self deleteOldFilesWithCompletionBlock:nil]; } -- (void)cleanDiskWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { +- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { dispatch_async(self.ioQueue, ^{ NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; @@ -544,7 +540,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } #if SD_UIKIT -- (void)backgroundCleanDisk { +- (void)backgroundDeleteOldFiles { Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { return; @@ -558,7 +554,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }]; // Start the long-running task and return immediately. - [self cleanDiskWithCompletionBlock:^{ + [self deleteOldFilesWithCompletionBlock:^{ [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; From e9fcf0ce039f8da2a55ed4b05a08c14244e55628 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 20:58:10 +0300 Subject: [PATCH 114/207] Removed sync method `diskImageExistsWithKey:` from `SDImageCache` --- SDWebImage/SDImageCache.h | 9 --------- SDWebImage/SDImageCache.m | 15 --------------- 2 files changed, 24 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 55e5a30d..e396ffe0 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -226,15 +226,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; -/** - * Check if image exists in disk cache already (does not load the image) - * - * @param key the key describing the url - * - * @return YES if an image exists for the given key - */ -- (BOOL)diskImageExistsWithKey:(nullable NSString *)key; - /** * Get the cache path for a certain key (needs the cache path root folder) * diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 66742ca6..82352e30 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -231,21 +231,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } -- (BOOL)diskImageExistsWithKey:(nullable NSString *)key { - BOOL exists = NO; - - // this is an exception to access the filemanager on another queue than ioQueue, but we are using the shared instance - // from apple docs on NSFileManager: The methods of the shared NSFileManager object can be called from multiple threads safely. - exists = [[NSFileManager defaultManager] fileExistsAtPath:[self defaultCachePathForKey:key]]; - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - if (!exists) { - exists = [[NSFileManager defaultManager] fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; - } - - return exists; -} - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { dispatch_async(_ioQueue, ^{ From 6202f05e7ad12ffbb63ca16090f0151c00edd456 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:02:44 +0300 Subject: [PATCH 115/207] Renamed `SDImageCache` `queryDiskCacheForKey:done:` to `queryCacheOperationForKey:done:` --- SDWebImage/SDImageCache.h | 9 ++++++--- SDWebImage/SDImageCache.m | 2 +- SDWebImage/SDWebImageManager.m | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index e396ffe0..ccb4ce0f 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -132,11 +132,14 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; /** - * Query the disk cache asynchronously. + * Query the cache asynchronously and call the completion when done. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the wanted image + * @param doneBlock The completion block + * + * @return a NSOperation instance containing the cache op */ -- (nullable NSOperation *)queryDiskCacheForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock; +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock; /** * Query the memory cache synchronously. diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 82352e30..eb9f0e6d 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -324,7 +324,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return SDScaledImageForKey(key, image); } -- (nullable NSOperation *)queryDiskCacheForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock { +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock { if (!doneBlock) { return nil; } diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index b4fd334e..018a1888 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -143,7 +143,7 @@ } NSString *key = [self cacheKeyForURL:url]; - operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { + operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { if (operation.isCancelled) { @synchronized (self.runningOperations) { [self.runningOperations removeObject:operation]; From df3b6a52ebbeb0624afa969f816487067e53ef12 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:11:34 +0300 Subject: [PATCH 116/207] Created `SDWebImageDownloaderOperationInterface` to describe the behavior of a downloader operation. Any custom operation must conform to this protocol. --- SDWebImage/SDWebImageDownloader.m | 6 +++++- SDWebImage/SDWebImageDownloaderOperation.h | 25 +++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index d20b309e..3cd276ae 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -129,7 +129,11 @@ } - (void)setOperationClass:(nullable Class)operationClass { - _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; + if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { + _operationClass = operationClass; + } else { + _operationClass = [SDWebImageDownloaderOperation class]; + } } - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url diff --git a/SDWebImage/SDWebImageDownloaderOperation.h b/SDWebImage/SDWebImageDownloaderOperation.h index 141f1800..b1908550 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.h +++ b/SDWebImage/SDWebImageDownloaderOperation.h @@ -15,7 +15,30 @@ extern NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; extern NSString * _Nonnull const SDWebImageDownloadStopNotification; extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; -@interface SDWebImageDownloaderOperation : NSOperation + + +/** + Describes a downloader operation. If one wants to use a custom downloader op, it needs to inherit from `NSOperation` and conform to this protocol + */ +@protocol SDWebImageDownloaderOperationInterface + +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options; + +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; + +- (BOOL)shouldDecompressImages; +- (void)setShouldDecompressImages:(BOOL)value; + +- (nullable NSURLCredential *)credential; +- (void)setCredential:(nullable NSURLCredential *)value; + +@end + + +@interface SDWebImageDownloaderOperation : NSOperation /** * The request used by the operation's task. From ebf40c7ca030ea4fd7bf8ad67a2904a6ea40e56a Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:14:53 +0300 Subject: [PATCH 117/207] Another clarification: `imageFromDiskCacheForKey:` used to also check the memory cache which I think is misleading. Now `imageFromDiskCacheForKey` only checks the disk cache and the new method `imageFromCacheForKey` checks both caches --- SDWebImage/SDImageCache.h | 13 ++++++++++--- SDWebImage/SDImageCache.m | 23 +++++++++++++---------- SDWebImage/UIImageView+WebCache.m | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index ccb4ce0f..e7451c3f 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -144,17 +144,24 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Query the memory cache synchronously. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the image */ - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key; /** - * Query the disk cache synchronously after checking the memory cache. + * Query the disk cache synchronously. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the image */ - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key; +/** + * Query the cache (memory and or disk) synchronously after checking the memory cache. + * + * @param key The unique key used to store the image + */ +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key; + /** * Remove the image from memory and disk cache asynchronously * diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index eb9f0e6d..d53620db 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -231,7 +231,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } - - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { dispatch_async(_ioQueue, ^{ BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; @@ -255,16 +254,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { - - // First check the in-memory cache... - UIImage *image = [self imageFromMemoryCacheForKey:key]; - if (image) { - return image; - } - - // Second check the disk cache... UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.shouldCacheImagesInMemory) { + if (diskImage && self.config.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(diskImage); [self.memCache setObject:diskImage forKey:key cost:cost]; } @@ -272,6 +263,18 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return diskImage; } +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key { + // First check the in-memory cache... + UIImage *image = [self imageFromMemoryCacheForKey:key]; + if (image) { + return image; + } + + // Second check the disk cache... + image = [self imageFromDiskCacheForKey:key]; + return image; +} + - (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString *)key { NSString *defaultPath = [self defaultCachePathForKey:key]; NSData *data = [NSData dataWithContentsOfFile:defaultPath]; diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index e71ef1ce..14848fba 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -118,7 +118,7 @@ static char TAG_ACTIVITY_SHOW; progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; - UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; + UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:key]; [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; } From 3fc19996c24bafb13f11f34f05ebd9edd8462c49 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:15:15 +0300 Subject: [PATCH 118/207] Fixed misspell --- SDWebImage/SDImageCache.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index e7451c3f..822148b4 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -174,7 +174,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * Remove the image from memory and disk cache asynchronously * * @param key The unique image cache key - * @param completion An block that should be executed after the image has been removed (optional) + * @param completion A block that should be executed after the image has been removed (optional) */ - (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion; @@ -191,7 +191,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @param key The unique image cache key * @param fromDisk Also remove cache entry from disk if YES - * @param completion An block that should be executed after the image has been removed (optional) + * @param completion A block that should be executed after the image has been removed (optional) */ - (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion; From a6316d1cce5742192ead612467042bba3dfbf7c6 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:15:38 +0300 Subject: [PATCH 119/207] Fixed the demo project, `clearDisk` no longer exists --- Examples/SDWebImage Demo/MasterViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index e8f47355..1448a1da 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -87,7 +87,7 @@ - (void)flushCache { [SDWebImageManager.sharedManager.imageCache clearMemory]; - [SDWebImageManager.sharedManager.imageCache clearDisk]; + [SDWebImageManager.sharedManager.imageCache clearDiskOnCompletion:nil]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation From 2eafdd6df03d9ce5d456a9b7c91bab7080c36f66 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:33:28 +0300 Subject: [PATCH 120/207] Updated `storeImageDataToDisk:forKey:` asserting when called from other queue than ioQueue. Updated the header comments --- SDWebImage/SDImageCache.h | 8 +++++--- SDWebImage/SDImageCache.m | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 822148b4..b537d668 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -124,10 +124,12 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)storeImage:(nullable UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk; /** - * Store image NSData into disk cache at the given key. + * Synchronously store image NSData into disk cache at the given key. * - * @param imageData The image data to store - * @param key The unique image cache key, usually it's image absolute URL + * @warning This method is synchronous, make sure to call it from the ioQueue + * + * @param imageData The image data to store + * @param key The unique image cache key, usually it's image absolute URL */ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index d53620db..b2a91395 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -209,11 +209,14 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { - - if (!imageData) { + if (!imageData || !key) { return; } + const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); + const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); + NSAssert(strcmp(currentQueueLabel, ioQueueLabel) == 0, @"This method should be called from the ioQueue"); + if (![_fileManager fileExistsAtPath:_diskCachePath]) { [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; } From d9424345ab699c61dfeec9ee0a70febbb17b74b4 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 21:37:38 +0300 Subject: [PATCH 121/207] The `storeImage:` methods from `SDImageCache` were async already, but declared as sync. Properly marked them as async + added completion. Got rid of the recalculate param. If the `NSData` is provided, use it. Otherwise, recalculate from the `UIImage` --- SDWebImage/SDImageCache.h | 55 +++++++++++++++++++++------------- SDWebImage/SDImageCache.m | 45 +++++++++++++++++++++------- SDWebImage/SDWebImageManager.m | 7 +++-- 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index b537d668..c5da963f 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -93,35 +93,48 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)addReadOnlyCachePath:(nonnull NSString *)path; -/** - * Store an image into memory and disk cache at the given key. - * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - */ -- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key; +#pragma mark - Store Ops /** - * Store an image into memory and optionally disk cache at the given key. + * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param completion A block executed after the operation is finished */ -- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + completion:(nullable SDWebImageNoParamsBlock)completionBlock; /** - * Store an image into memory and optionally disk cache at the given key. + * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param recalculate BOOL indicates if imageData can be used or a new data should be constructed from the UIImage - * @param imageData The image data as returned by the server, this representation will be used for disk storage - * instead of converting the given image object into a storable/compressed image format in order - * to save quality and CPU - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completion A block executed after the operation is finished */ -- (void)storeImage:(nullable UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock; + +/** + * Asynchronously store an image into memory and disk cache at the given key. + * + * @param image The image to store + * @param imageData The image data as returned by the server, this representation will be used for disk storage + * instead of converting the given image object into a storable/compressed image format in order + * to save quality and CPU + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completion A block executed after the operation is finished + */ +- (void)storeImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock; /** * Synchronously store image NSData into disk cache at the given key. diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index b2a91395..2965784f 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -176,8 +176,30 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return [paths[0] stringByAppendingPathComponent:fullNamespace]; } -- (void)storeImage:(nullable UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(nullable NSData *)imageData forKey:(nullable NSString *)key toDisk:(BOOL)toDisk { +#pragma mark - Store Ops + +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + completion:(nullable SDWebImageNoParamsBlock)completionBlock { + [self storeImage:image imageData:nil forKey:key toDisk:YES completion:completionBlock]; +} + +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock { + [self storeImage:image imageData:nil forKey:key toDisk:toDisk completion:completionBlock]; +} + +- (void)storeImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock { if (!image || !key) { + if (completionBlock) { + completionBlock(); + } return; } // if memory cache is enabled @@ -185,7 +207,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSUInteger cost = SDCacheCostForImage(image); [self.memCache setObject:image forKey:key cost:cost]; } - + if (toDisk) { dispatch_async(self.ioQueue, ^{ NSData *data = imageData; @@ -194,20 +216,21 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { SDImageFormat imageFormatFromData = [NSData sd_imageFormatForImageData:data]; data = [image sd_imageDataAsFormat:imageFormatFromData]; } - + [self storeImageDataToDisk:data forKey:key]; + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(); + }); + } }); + } else { + if (completionBlock) { + completionBlock(); + } } } -- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key { - [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:YES]; -} - -- (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key toDisk:(BOOL)toDisk { - [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:toDisk]; -} - - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { if (!imageData || !key) { return; diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 018a1888..751f9210 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -218,7 +218,8 @@ if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk]; + // pass nil if the image was transformed, so we can recalculate the data from the image + [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; } dispatch_main_sync_safe(^{ @@ -229,7 +230,7 @@ }); } else { if (downloadedImage && finished) { - [self.imageCache storeImage:downloadedImage recalculateFromImage:NO imageData:downloadedData forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; } dispatch_main_sync_safe(^{ @@ -288,7 +289,7 @@ - (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url { if (image && url) { NSString *key = [self cacheKeyForURL:url]; - [self.imageCache storeImage:image forKey:key toDisk:YES]; + [self.imageCache storeImage:image forKey:key toDisk:YES completion:nil]; } } From f202b50330537858a8c793ca934f03f9cd556a44 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 23:42:21 +0300 Subject: [PATCH 122/207] Updated `queryCacheOperationForKey:image:` comments and method still works if the doneBlock is nil --- SDWebImage/SDImageCache.h | 6 ++++-- SDWebImage/SDImageCache.m | 23 ++++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index c5da963f..cf87c62f 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -146,11 +146,13 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; +#pragma mark - Query Ops + /** - * Query the cache asynchronously and call the completion when done. + * Operation that queries the cache asynchronously and call the completion when done. * * @param key The unique key used to store the wanted image - * @param doneBlock The completion block + * @param doneBlock The completion block. Will not get called if the operation is cancelled * * @return a NSOperation instance containing the cache op */ diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 2965784f..97b07a03 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -275,6 +275,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } +#pragma mark - Query Ops + - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; } @@ -354,12 +356,10 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } - (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock { - if (!doneBlock) { - return nil; - } - if (!key) { - doneBlock(nil, nil, SDImageCacheTypeNone); + if (doneBlock) { + doneBlock(nil, nil, SDImageCacheTypeNone); + } return nil; } @@ -370,13 +370,16 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { if ([image isGIF]) { diskData = [self diskImageDataBySearchingAllPathsForKey:key]; } - doneBlock(image, diskData, SDImageCacheTypeMemory); + if (doneBlock) { + doneBlock(image, diskData, SDImageCacheTypeMemory); + } return nil; } NSOperation *operation = [NSOperation new]; dispatch_async(self.ioQueue, ^{ if (operation.isCancelled) { + // do not call the completion if cancelled return; } @@ -388,9 +391,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { [self.memCache setObject:diskImage forKey:key cost:cost]; } - dispatch_async(dispatch_get_main_queue(), ^{ - doneBlock(diskImage, diskData, SDImageCacheTypeDisk); - }); + if (doneBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + doneBlock(diskImage, diskData, SDImageCacheTypeDisk); + }); + } } }); From 3e78e29480780c8e4711fbf6dd8b3c21974a631c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 23:43:06 +0300 Subject: [PATCH 123/207] Pragma marks for code readability --- SDWebImage/SDImageCache.h | 11 +++++++++-- SDWebImage/SDImageCache.m | 10 +++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index cf87c62f..f308689c 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -146,7 +146,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; -#pragma mark - Query Ops +#pragma mark - Query and Retrieve Ops /** * Operation that queries the cache asynchronously and call the completion when done. @@ -179,6 +179,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key; +#pragma mark - Remove Ops + /** * Remove the image from memory and disk cache asynchronously * @@ -186,7 +188,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)removeImageForKey:(nullable NSString *)key; - /** * Remove the image from memory and disk cache asynchronously * @@ -212,6 +213,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion; +#pragma mark - Cache clean Ops + /** * Clear all memory cached images */ @@ -229,6 +232,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; +#pragma mark - Cache Info + /** * Get the size used by the disk cache */ @@ -253,6 +258,8 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; +#pragma mark - Cache Paths + /** * Get the cache path for a certain key (needs the cache path root folder) * diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 97b07a03..531e17c3 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -275,7 +275,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } -#pragma mark - Query Ops +#pragma mark - Query and Retrieve Ops - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; @@ -402,6 +402,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return operation; } +#pragma mark - Remove Ops + - (void)removeImageForKey:(nullable NSString *)key { [self removeImageForKey:key withCompletion:nil]; } @@ -440,6 +442,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } +# pragma mark - Mem Cache settings + - (void)setMaxMemoryCost:(NSUInteger)maxMemoryCost { self.memCache.totalCostLimit = maxMemoryCost; } @@ -456,6 +460,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { self.memCache.countLimit = maxCountLimit; } +#pragma mark - Cache clean Ops + - (void)clearMemory { [self.memCache removeAllObjects]; } @@ -580,6 +586,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } #endif +#pragma mark - Cache Info + - (NSUInteger)getSize { __block NSUInteger size = 0; dispatch_sync(self.ioQueue, ^{ From 537b039012ace8c033b4cda94c4741e755cb14c1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 23:53:18 +0300 Subject: [PATCH 124/207] Got rid of `removeImageForKey:` and `removeImageForKey:fromDisk:` that looked sync but were async. Left only the 2 async ones --- SDWebImage/SDImageCache.h | 15 --------------- SDWebImage/SDImageCache.m | 9 --------- 2 files changed, 24 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index f308689c..623a7274 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -181,13 +181,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot #pragma mark - Remove Ops -/** - * Remove the image from memory and disk cache asynchronously - * - * @param key The unique image cache key - */ -- (void)removeImageForKey:(nullable NSString *)key; - /** * Remove the image from memory and disk cache asynchronously * @@ -196,14 +189,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion; -/** - * Remove the image from memory and optionally disk cache asynchronously - * - * @param key The unique image cache key - * @param fromDisk Also remove cache entry from disk if YES - */ -- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk; - /** * Remove the image from memory and optionally disk cache asynchronously * diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 531e17c3..64b31128 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -404,20 +404,11 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #pragma mark - Remove Ops -- (void)removeImageForKey:(nullable NSString *)key { - [self removeImageForKey:key withCompletion:nil]; -} - - (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion { [self removeImageForKey:key fromDisk:YES withCompletion:completion]; } -- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk { - [self removeImageForKey:key fromDisk:fromDisk withCompletion:nil]; -} - - (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion { - if (key == nil) { return; } From ba88022c304dfec56c6458c853ebd93cb45d37df Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 23:53:51 +0300 Subject: [PATCH 125/207] Moved the `diskImageExistsWithKey:completion:` to the right place in the header --- SDWebImage/SDImageCache.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 623a7274..2f710839 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -148,6 +148,15 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot #pragma mark - Query and Retrieve Ops +/** + * Async check if image exists in disk cache already (does not load the image) + * + * @param key the key describing the url + * @param completionBlock the block to be executed when the check is done. + * @note the completion block will be always executed on the main queue + */ +- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; + /** * Operation that queries the cache asynchronously and call the completion when done. * @@ -234,15 +243,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock; -/** - * Async check if image exists in disk cache already (does not load the image) - * - * @param key the key describing the url - * @param completionBlock the block to be executed when the check is done. - * @note the completion block will be always executed on the main queue - */ -- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; - #pragma mark - Cache Paths /** From 2fa77435c16e19add517689ea9385e47cdd2ef96 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 23 Sep 2016 23:54:23 +0300 Subject: [PATCH 126/207] Proper place for the pragma mark and used a function to check for the proper queue --- SDWebImage/SDImageCache.m | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 64b31128..53c924e2 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -136,6 +136,12 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { SDDispatchQueueRelease(_ioQueue); } +- (void)checkIfQueueIsIOQueue { + const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); + const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); + NSAssert(strcmp(currentQueueLabel, ioQueueLabel) == 0, @"This method should be called from the ioQueue"); +} + #pragma mark - Cache paths - (void)addReadOnlyCachePath:(nonnull NSString *)path { @@ -236,9 +242,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { return; } - const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); - const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); - NSAssert(strcmp(currentQueueLabel, ioQueueLabel) == 0, @"This method should be called from the ioQueue"); + [self checkIfQueueIsIOQueue]; if (![_fileManager fileExistsAtPath:_diskCachePath]) { [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; @@ -257,6 +261,8 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { } } +#pragma mark - Query and Retrieve Ops + - (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { dispatch_async(_ioQueue, ^{ BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; @@ -275,8 +281,6 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { }); } -#pragma mark - Query and Retrieve Ops - - (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; } From 0612504f1baeb95b8df4fd7ac174d2e4cb53513e Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 24 Sep 2016 00:07:43 +0300 Subject: [PATCH 127/207] Instead of assert, just nslog --- SDWebImage/SDImageCache.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 53c924e2..0460222c 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -139,7 +139,9 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { - (void)checkIfQueueIsIOQueue { const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); - NSAssert(strcmp(currentQueueLabel, ioQueueLabel) == 0, @"This method should be called from the ioQueue"); + if (strcmp(currentQueueLabel, ioQueueLabel) != 0) { + NSLog(@"This method should be called from the ioQueue"); + } } #pragma mark - Cache paths From cfc182f2e5639e706e0bc465af5da25fbd62a602 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 24 Sep 2016 00:14:13 +0300 Subject: [PATCH 128/207] Added SDImageCacheConfig to all targets, test images, code coverage setting, tests for SDImageCache, SDWebImageDownloader, SDWebImageDownloaderOperation, SDWebImageDecoder --- SDWebImage.xcodeproj/project.pbxproj | 34 +- .../project.pbxproj | 16 + .../xcshareddata/xcschemes/Tests.xcscheme | 3 +- Tests/Tests/MonochromeTestImage.jpg | Bin 0 -> 7096 bytes Tests/Tests/SDImageCacheTests.m | 185 ++++----- Tests/Tests/SDWebImageDecoderTests.m | 61 +++ Tests/Tests/SDWebImageDownloaderTests.m | 356 +++++++++++++++--- Tests/Tests/SDWebImageManagerTests.m | 2 - Tests/Tests/TestImage.gif | Bin 0 -> 3109 bytes Tests/Tests/TestImage.png | Bin 0 -> 6822 bytes 10 files changed, 517 insertions(+), 140 deletions(-) create mode 100644 Tests/Tests/MonochromeTestImage.jpg create mode 100644 Tests/Tests/SDWebImageDecoderTests.m create mode 100644 Tests/Tests/TestImage.gif create mode 100644 Tests/Tests/TestImage.png diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 8711534d..cccebbdb 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -435,6 +435,18 @@ 43A62A641D0E0A8F0089D7DD /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; 43A62A651D0E0A8F0089D7DD /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; 43A62A661D0E0A8F0089D7DD /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; + 43A918641D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918651D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918661D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918671D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918681D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918691D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A9186B1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43A9186C1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43A9186D1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43A9186E1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43A9186F1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43A918701D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -882,6 +894,8 @@ 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+WebCache.h"; sourceTree = ""; }; 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+WebCache.m"; sourceTree = ""; }; + 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheConfig.h; sourceTree = ""; }; + 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCacheConfig.m; sourceTree = ""; }; 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; @@ -1218,6 +1232,8 @@ children = ( 53922D85148C56230056699D /* SDImageCache.h */, 53922D86148C56230056699D /* SDImageCache.m */, + 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */, + 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */, ); name = Cache; sourceTree = ""; @@ -1417,6 +1433,7 @@ 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, 4317393A1CDFC8B20008FEB9 /* color_cache.h in Headers */, 431738E11CDFC8A40008FEB9 /* webpi.h in Headers */, + 43A918671D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, 431739571CDFC8B70008FEB9 /* encode.h in Headers */, 431739351CDFC8B20008FEB9 /* bit_reader.h in Headers */, 43DA7D5D1D1086600028BE58 /* mips_macro.h in Headers */, @@ -1488,6 +1505,7 @@ 43DA7CFE1D10865E0028BE58 /* yuv.h in Headers */, 4314D1711D0E0E3B004B36C9 /* huffman.h in Headers */, 4314D1721D0E0E3B004B36C9 /* SDWebImageCompat.h in Headers */, + 43A918651D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, 4314D1731D0E0E3B004B36C9 /* vp8li.h in Headers */, 4314D1741D0E0E3B004B36C9 /* types.h in Headers */, 4314D1761D0E0E3B004B36C9 /* decode.h in Headers */, @@ -1575,6 +1593,7 @@ 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */, 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */, 431BB6FC1D06D2C1006A3455 /* SDWebImageDecoder.h in Headers */, + 43A918681D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1606,6 +1625,7 @@ 4397D2D11D0DDD8C00BB2784 /* decode.h in Headers */, 4397D2D21D0DDD8C00BB2784 /* webpi.h in Headers */, 43DA7DCB1D1086610028BE58 /* mips_macro.h in Headers */, + 43A918691D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, 4397D2D31D0DDD8C00BB2784 /* thread.h in Headers */, 4397D2D41D0DDD8C00BB2784 /* quant_levels.h in Headers */, 4397D2D51D0DDD8C00BB2784 /* bit_reader_inl.h in Headers */, @@ -1650,6 +1670,7 @@ 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */, 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */, 431739231CDFC8B20008FEB9 /* filters.h in Headers */, + 43A918661D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, 4A2CAE211AB4BB7000B6BC39 /* SDWebImageManager.h in Headers */, 4A2CAE1F1AB4BB6C00B6BC39 /* SDImageCache.h in Headers */, 43DA7D261D10865F0028BE58 /* mips_macro.h in Headers */, @@ -1755,6 +1776,7 @@ 53EDFB8A17623F7C00698166 /* UIImage+MultiFormat.h in Headers */, 4317387B1CDFC2580008FEB9 /* decode_vp8.h in Headers */, 431738B61CDFC2630008FEB9 /* random.h in Headers */, + 43A918641D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2017,6 +2039,7 @@ 43DA7D361D1086600028BE58 /* alpha_processing_sse41.c in Sources */, 43DA7D641D1086600028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 431739461CDFC8B20008FEB9 /* random.c in Sources */, + 43A9186E1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 43DA7D3D1D1086600028BE58 /* cost_sse2.c in Sources */, 431738DB1CDFC8A40008FEB9 /* tree.c in Sources */, 00733A581BC4880000A5A117 /* SDWebImageManager.m in Sources */, @@ -2119,6 +2142,7 @@ 43DA7CFD1D10865E0028BE58 /* yuv.c in Sources */, 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */, 43DA7CDC1D10865E0028BE58 /* enc_mips32.c in Sources */, + 43A9186C1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 4314D1411D0E0E3B004B36C9 /* SDWebImageDownloaderOperation.m in Sources */, 43DA7CCE1D10865E0028BE58 /* cost_mips32.c in Sources */, 4314D1421D0E0E3B004B36C9 /* webp.c in Sources */, @@ -2215,6 +2239,7 @@ 43DA7DA21D1086600028BE58 /* yuv.c in Sources */, 431BB6B91D06D2C1006A3455 /* UIButton+WebCache.m in Sources */, 43DA7D811D1086600028BE58 /* enc_mips32.c in Sources */, + 43A9186F1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 43A62A5F1D0E0A8F0089D7DD /* quant.c in Sources */, 43DA7D731D1086600028BE58 /* cost_mips32.c in Sources */, 431BB6BD1D06D2C1006A3455 /* UIImage+GIF.m in Sources */, @@ -2335,6 +2360,7 @@ 4397D2AA1D0DDD8C00BB2784 /* io.c in Sources */, 43DA7DCF1D1086610028BE58 /* rescaler_neon.c in Sources */, 43DA7DC31D1086610028BE58 /* lossless_enc_sse2.c in Sources */, + 43A918701D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 4397D2AB1D0DDD8C00BB2784 /* UIView+WebCacheOperation.m in Sources */, 43DA7DA91D1086610028BE58 /* cost_mips_dsp_r2.c in Sources */, 43DA7DB01D1086610028BE58 /* dec_mips32.c in Sources */, @@ -2407,6 +2433,7 @@ 43DA7CFF1D10865F0028BE58 /* alpha_processing_sse41.c in Sources */, 43DA7D2D1D10865F0028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 4A2CAE261AB4BB7000B6BC39 /* SDWebImagePrefetcher.m in Sources */, + 43A9186D1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 43DA7D061D10865F0028BE58 /* cost_sse2.c in Sources */, 4317391F1CDFC8B20008FEB9 /* color_cache.c in Sources */, 4A2CAE301AB4BB7500B6BC39 /* UIImage+MultiFormat.m in Sources */, @@ -2507,6 +2534,7 @@ 43DA7C911D1086570028BE58 /* alpha_processing_sse41.c in Sources */, 43DA7CBF1D1086570028BE58 /* upsampling_mips_dsp_r2.c in Sources */, 5376130D155AD0D5005750A4 /* SDWebImagePrefetcher.m in Sources */, + 43A9186B1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 43DA7C981D1086570028BE58 /* cost_sse2.c in Sources */, 431738A81CDFC2630008FEB9 /* color_cache.c in Sources */, 5376130E155AD0D5005750A4 /* UIButton+WebCache.m in Sources */, @@ -2847,7 +2875,6 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "SD_WEBP=1", "DEBUG=1", "$(inherited)", ); @@ -2901,10 +2928,7 @@ ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "SD_WEBP=1", - "$(inherited)", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index 2f8b8053..953240cd 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -9,6 +9,10 @@ /* Begin PBXBuildFile section */ 0D87E1F83BD319CEC7622E9F /* libPods-Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0462A7F023A057322E59B3C5 /* libPods-Tests.a */; }; 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */; }; + 433BBBB51D7EF5C00086B6E9 /* SDWebImageDecoderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */; }; + 433BBBB71D7EF8200086B6E9 /* TestImage.gif in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB61D7EF8200086B6E9 /* TestImage.gif */; }; + 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB81D7EF8260086B6E9 /* TestImage.png */; }; + 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; @@ -22,6 +26,10 @@ /* Begin PBXFileReference section */ 0462A7F023A057322E59B3C5 /* libPods-Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderTests.m; sourceTree = ""; }; + 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoderTests.m; sourceTree = ""; }; + 433BBBB61D7EF8200086B6E9 /* TestImage.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = TestImage.gif; sourceTree = ""; }; + 433BBBB81D7EF8260086B6E9 /* TestImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TestImage.png; sourceTree = ""; }; + 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = MonochromeTestImage.jpg; sourceTree = ""; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; @@ -93,12 +101,16 @@ DA248D5C195472AA00390AB0 /* Tests */ = { isa = PBXGroup; children = ( + 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */, + 433BBBB61D7EF8200086B6E9 /* TestImage.gif */, 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */, + 433BBBB81D7EF8260086B6E9 /* TestImage.png */, DA248D5D195472AA00390AB0 /* Supporting Files */, DA248D68195475D800390AB0 /* SDImageCacheTests.m */, DA248D6A195476AC00390AB0 /* SDWebImageManagerTests.m */, DA91BEBB19795BC9006F2536 /* UIImageMultiFormatTests.m */, 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */, + 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */, ); path = Tests; sourceTree = ""; @@ -167,7 +179,10 @@ buildActionMask = 2147483647; files = ( 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */, + 433BBBB71D7EF8200086B6E9 /* TestImage.gif in Resources */, DA248D61195472AA00390AB0 /* InfoPlist.strings in Resources */, + 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */, + 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -229,6 +244,7 @@ 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */, DA248D69195475D800390AB0 /* SDImageCacheTests.m in Sources */, DA248D6B195476AC00390AB0 /* SDWebImageManagerTests.m in Sources */, + 433BBBB51D7EF5C00086B6E9 /* SDWebImageDecoderTests.m in Sources */, DA91BEBC19795BC9006F2536 /* UIImageMultiFormatTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme index 822b3fb4..29613b7e 100644 --- a/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme +++ b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -10,7 +10,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> diff --git a/Tests/Tests/MonochromeTestImage.jpg b/Tests/Tests/MonochromeTestImage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..169bae042b96bd7727e11b7aa5e1d49121ec66d4 GIT binary patch literal 7096 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 MeT~IShR5aq1Ig#&M*si- literal 0 HcmV?d00001 diff --git a/Tests/Tests/SDImageCacheTests.m b/Tests/Tests/SDImageCacheTests.m index f4f066b6..da82904b 100644 --- a/Tests/Tests/SDImageCacheTests.m +++ b/Tests/Tests/SDImageCacheTests.m @@ -22,172 +22,179 @@ NSString *kImageTestKey = @"TestImageKey.jpg"; @implementation SDImageCacheTests -- (void)setUp -{ +- (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. self.sharedImageCache = [SDImageCache sharedImageCache]; [self clearAllCaches]; } -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testSharedImageCache { +- (void)test01SharedImageCache { expect(self.sharedImageCache).toNot.beNil(); } -- (void)testSingleton{ +- (void)test02Singleton{ expect(self.sharedImageCache).to.equal([SDImageCache sharedImageCache]); } -- (void)testClearDiskCache{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; - [self.sharedImageCache clearDiskOnCompletion:^{ - expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(NO); - expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal([self imageForTesting]); - }]; +- (void)test03ImageCacheCanBeInstantiated { + SDImageCache *imageCache = [[SDImageCache alloc] init]; + expect(imageCache).toNot.equal([SDImageCache sharedImageCache]); } -- (void)testClearMemoryCache{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test04ClearDiskCache{ + XCTestExpectation *expectation = [self expectationWithDescription:@"Clear disk cache"]; + + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; + [self.sharedImageCache clearDiskOnCompletion:^{ + [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { + if (!isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should not be in cache"); + } + }]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal([self imageForTesting]); + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test05ClearMemoryCache{ + XCTestExpectation *expectation = [self expectationWithDescription:@"Clear memory cache"]; + + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; [self.sharedImageCache clearMemory]; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; - // Seems not able to access the files correctly (maybe only from test?) - //expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(YES); [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { - expect(isInCache).to.equal(YES); + if (isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should be in cache"); + } }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } // Testing storeImage:forKey: -- (void)testInsertionOfImage { +- (void)test06InsertionOfImage { + XCTestExpectation *expectation = [self expectationWithDescription:@"storeImage forKey"]; + UIImage *image = [self imageForTesting]; - [self.sharedImageCache storeImage:image forKey:kImageTestKey]; + [self.sharedImageCache storeImage:image forKey:kImageTestKey completion:nil]; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal(image); - expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.equal(image); + [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { + if (isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should be in cache"); + } + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } // Testing storeImage:forKey:toDisk:YES -- (void)testInsertionOfImageForcingDiskStorage{ +- (void)test07InsertionOfImageForcingDiskStorage{ + XCTestExpectation *expectation = [self expectationWithDescription:@"storeImage forKey toDisk=YES"]; + UIImage *image = [self imageForTesting]; - [self.sharedImageCache storeImage:image forKey:kImageTestKey toDisk:YES]; + [self.sharedImageCache storeImage:image forKey:kImageTestKey toDisk:YES completion:nil]; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal(image); - // Seems not able to access the files correctly (maybe only from test?) - //expect([self.sharedImageCache diskImageExistsWithKey:kImageTestKey]).to.equal(YES); [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { - expect(isInCache).to.equal(YES); + if (isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should be in cache"); + } }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } // Testing storeImage:forKey:toDisk:NO -- (void)testInsertionOfImageOnlyInMemory { +- (void)test08InsertionOfImageOnlyInMemory { + XCTestExpectation *expectation = [self expectationWithDescription:@"storeImage forKey toDisk=NO"]; UIImage *image = [self imageForTesting]; - [self.sharedImageCache storeImage:image forKey:@"TestImage" toDisk:NO]; - [self.sharedImageCache diskImageExistsWithKey:@"TestImage" completion:^(BOOL isInCache) { - expect(isInCache).to.equal(YES); + [self.sharedImageCache storeImage:image forKey:kImageTestKey toDisk:NO completion:nil]; + + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.equal([self imageForTesting]); + [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { + if (!isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should not be in cache"); + } }]; [self.sharedImageCache clearMemory]; - [self.sharedImageCache diskImageExistsWithKey:@"TestImage" completion:^(BOOL isInCache) { - expect(isInCache).to.equal(NO); - }]; + expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil(); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } -- (void)testRetrievalImageThroughNSOperation{ - //- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; +- (void)test09RetrieveImageThroughNSOperation{ + //- (NSOperation *)queryCacheOperationForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; UIImage *imageForTesting = [self imageForTesting]; - [self.sharedImageCache storeImage:imageForTesting forKey:kImageTestKey]; - NSOperation *operation = [self.sharedImageCache queryDiskCacheForKey:kImageTestKey done:^(UIImage *image, NSData *data, SDImageCacheType cacheType) { + [self.sharedImageCache storeImage:imageForTesting forKey:kImageTestKey completion:nil]; + NSOperation *operation = [self.sharedImageCache queryCacheOperationForKey:kImageTestKey done:^(UIImage *image, NSData *data, SDImageCacheType cacheType) { expect(image).to.equal(imageForTesting); }]; expect(operation).toNot.beNil; } -- (void)testRemoveImageForKey{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; - [self.sharedImageCache removeImageForKey:kImageTestKey]; - expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; - expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; -} - -- (void)testRemoveImageForKeyWithCompletion{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test10RemoveImageForKeyWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; [self.sharedImageCache removeImageForKey:kImageTestKey withCompletion:^{ expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; }]; } -- (void)testRemoveImageForKeyNotFromDisk{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; - [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO]; - expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).toNot.beNil; - expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; -} - -- (void)testRemoveImageForKeyFromDisk{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; - [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO]; - expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; - expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; -} - -- (void)testRemoveImageforKeyNotFromDiskWithCompletion{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test11RemoveImageforKeyNotFromDiskWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:NO withCompletion:^{ expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).toNot.beNil; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; }]; } -- (void)testRemoveImageforKeyFromDiskWithCompletion{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test12RemoveImageforKeyFromDiskWithCompletion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; [self.sharedImageCache removeImageForKey:kImageTestKey fromDisk:YES withCompletion:^{ expect([self.sharedImageCache imageFromDiskCacheForKey:kImageTestKey]).to.beNil; expect([self.sharedImageCache imageFromMemoryCacheForKey:kImageTestKey]).to.beNil; }]; } -// TODO -- Testing insertion with recalculate -- (void)testInsertionOfImageOnlyInDisk { -} - -- (void)testInitialCacheSize{ +- (void)test20InitialCacheSize{ expect([self.sharedImageCache getSize]).to.equal(0); } -- (void)testInitialDiskCount{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test21InitialDiskCount{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; expect([self.sharedImageCache getDiskCount]).to.equal(1); } -- (void)testDiskCountAfterInsertion{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test22DiskCountAfterInsertion{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; expect([self.sharedImageCache getDiskCount]).to.equal(1); } -- (void)testDefaultCachePathForAnyKey{ +- (void)test31DefaultCachePathForAnyKey{ NSString *path = [self.sharedImageCache defaultCachePathForKey:kImageTestKey]; expect(path).toNot.beNil; } -- (void)testCachePathForNonExistingKey{ +- (void)test32CachePathForNonExistingKey{ NSString *path = [self.sharedImageCache cachePathForKey:kImageTestKey inPath:[self.sharedImageCache defaultCachePathForKey:kImageTestKey]]; expect(path).to.beNil; } -- (void)testCachePathForExistingKey{ - [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey]; +- (void)test33CachePathForExistingKey{ + [self.sharedImageCache storeImage:[self imageForTesting] forKey:kImageTestKey completion:nil]; NSString *path = [self.sharedImageCache cachePathForKey:kImageTestKey inPath:[self.sharedImageCache defaultCachePathForKey:kImageTestKey]]; expect(path).notTo.beNil; } // TODO -- Testing image data insertion -- (void)testInsertionOfImageData { +- (void)test40InsertionOfImageData { NSData *imageData = [NSData dataWithContentsOfFile:[self testImagePath]]; [self.sharedImageCache storeImageDataToDisk:imageData forKey:kImageTestKey]; @@ -202,18 +209,28 @@ NSString *kImageTestKey = @"TestImageKey.jpg"; [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { expect(isInCache).to.equal(YES); }]; + + [self.sharedImageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) { + expect(fileCount).to.beLessThan(100); + }]; } #pragma mark Helper methods - (void)clearAllCaches{ - [self.sharedImageCache clearDisk]; + [self.sharedImageCache deleteOldFilesWithCompletionBlock:nil]; + + // TODO: this is not ok, clearDiskOnCompletion will clear async, this means that when we execute the tests, the cache might not be cleared + [self.sharedImageCache clearDiskOnCompletion:nil]; [self.sharedImageCache clearMemory]; } - (UIImage *)imageForTesting{ - - return [UIImage imageWithContentsOfFile:[self testImagePath]]; + static UIImage *reusableImage = nil; + if (!reusableImage) { + reusableImage = [UIImage imageWithContentsOfFile:[self testImagePath]]; + } + return reusableImage; } - (NSString *)testImagePath { diff --git a/Tests/Tests/SDWebImageDecoderTests.m b/Tests/Tests/SDWebImageDecoderTests.m new file mode 100644 index 00000000..56bcaf91 --- /dev/null +++ b/Tests/Tests/SDWebImageDecoderTests.m @@ -0,0 +1,61 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Matt Galloway + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#define EXP_SHORTHAND // required by Expecta + + +#import +#import + +#import "SDWebImageDecoder.h" + +@interface SDWebImageDecoderTests : XCTestCase + +@end + +@implementation SDWebImageDecoderTests + +- (void)test01ThatDecodedImageWithNilImageReturnsNil { + expect([UIImage decodedImageWithImage:nil]).to.beNil(); +} + +- (void)test02ThatDecodedImageWithImageWorksWithARegularJPGImage { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"jpg"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *decodedImage = [UIImage decodedImageWithImage:image]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).toNot.equal(image); +} + +- (void)test03ThatDecodedImageWithImageDoesNotDecodeAnimatedImages { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"gif"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *animatedImage = [UIImage animatedImageWithImages:@[image] duration:0]; + UIImage *decodedImage = [UIImage decodedImageWithImage:animatedImage]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).to.equal(animatedImage); +} + +- (void)test04ThatDecodedImageWithImageDoesNotDecodeImagesWithAlpha { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"png"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *decodedImage = [UIImage decodedImageWithImage:image]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).to.equal(image); +} + +- (void)test05ThatDecodedImageWithImageWorksEvenWithMonochromeImage { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"MonochromeTestImage" ofType:@"jpg"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *decodedImage = [UIImage decodedImageWithImage:image]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).toNot.equal(image); +} + +@end diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index f7b7641a..d42bee18 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -14,6 +14,46 @@ #import #import "SDWebImageDownloader.h" +#import "SDWebImageDownloaderOperation.h" + +/** + * Category for SDWebImageDownloader so we can access the operationClass + */ +@interface SDWebImageDownloader () +@property (assign, nonatomic, nullable) Class operationClass; +@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; + +- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock + completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock + forURL:(nullable NSURL *)url + createCallback:(SDWebImageDownloaderOperation *(^)())createCallback; +@end + +/** + * A class that fits the NSOperation+SDWebImageDownloaderOperationInterface requirement so we can test + */ +@interface CustomDownloaderOperation : NSOperation + +@property (nonatomic, assign) BOOL shouldDecompressImages; +@property (nonatomic, strong, nullable) NSURLCredential *credential; + +@end + +@implementation CustomDownloaderOperation + +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)req inSession:(nullable NSURLSession *)ses options:(SDWebImageDownloaderOptions)opt { + if ((self = [super init])) { } + return self; +} + +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { + return nil; +} + +@end + + @interface SDWebImageDownloaderTests : XCTestCase @@ -21,68 +61,288 @@ @implementation SDWebImageDownloaderTests -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. +- (void)test01ThatSharedDownloaderIsNotEqualToInitDownloader { + SDWebImageDownloader *downloader = [[SDWebImageDownloader alloc] init]; + expect(downloader).toNot.equal([SDWebImageDownloader sharedDownloader]); } -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; +- (void)test02ThatByDefaultDownloaderSetsTheAcceptHTTPHeader { + expect([[SDWebImageDownloader sharedDownloader] valueForHTTPHeaderField:@"Accept"]).to.match(@"image/\\*"); } -- (void)testThatDownloadingSameURLTwiceAndCancellingFirstWorks { - XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; - - NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]; - - id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - XCTFail(@"Shouldn't have completed here."); - }]; - expect(token1).toNot.beNil(); - - id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - [expectation fulfill]; - }]; - expect(token2).toNot.beNil(); - - [[SDWebImageDownloader sharedDownloader] cancel:token1]; - - [self waitForExpectationsWithTimeout:5. handler:nil]; +- (void)test03ThatSetAndGetValueForHTTPHeaderFieldWork { + NSString *headerValue = @"Tests"; + NSString *headerName = @"AppName"; + // set it + [[SDWebImageDownloader sharedDownloader] setValue:headerValue forHTTPHeaderField:headerName]; + expect([[SDWebImageDownloader sharedDownloader] valueForHTTPHeaderField:headerName]).to.equal(headerValue); + // clear it + [[SDWebImageDownloader sharedDownloader] setValue:nil forHTTPHeaderField:headerName]; + expect([[SDWebImageDownloader sharedDownloader] valueForHTTPHeaderField:headerName]).to.beNil(); } -- (void)testThatCancelingDownloadThenRequestingAgainWorks { - XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; +- (void)test04ThatASimpleDownloadWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Simple download"]; + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage004.jpg"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} +- (void)test05ThatSetAndGetMaxConcurrentDownloadsWorks { + NSInteger initialValue = [SDWebImageDownloader sharedDownloader].maxConcurrentDownloads; + + [[SDWebImageDownloader sharedDownloader] setMaxConcurrentDownloads:3]; + expect([SDWebImageDownloader sharedDownloader].maxConcurrentDownloads).to.equal(3); + + [[SDWebImageDownloader sharedDownloader] setMaxConcurrentDownloads:initialValue]; +} + +- (void)test06ThatUsingACustomDownloaderOperationWorks { + // we try to set a usual NSOperation as operation class. Should not work + [[SDWebImageDownloader sharedDownloader] setOperationClass:[NSOperation class]]; + expect([SDWebImageDownloader sharedDownloader].operationClass).to.equal([SDWebImageDownloaderOperation class]); + + // setting an NSOperation subclass that conforms to SDWebImageDownloaderOperationInterface - should work + [[SDWebImageDownloader sharedDownloader] setOperationClass:[CustomDownloaderOperation class]]; + expect([SDWebImageDownloader sharedDownloader].operationClass).to.equal([CustomDownloaderOperation class]); + + // back to the original value + [[SDWebImageDownloader sharedDownloader] setOperationClass:nil]; + expect([SDWebImageDownloader sharedDownloader].operationClass).to.equal([SDWebImageDownloaderOperation class]); +} + +- (void)test07ThatAddProgressCallbackCompletedBlockWithNilURLCallsTheCompletionBlockWithNils { + XCTestExpectation *expectation = [self expectationWithDescription:@"Completion is called with nils"]; + [[SDWebImageDownloader sharedDownloader] addProgressCallback:nil completedBlock:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (!image && !data && !error) { + [expectation fulfill]; + } else { + XCTFail(@"All params should be nil"); + } + } forURL:nil createCallback:nil]; + [self waitForExpectationsWithTimeout:0.5 handler:nil]; +} + +- (void)test08ThatAHTTPAuthDownloadWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"HTTP Auth download"]; + [SDWebImageDownloader sharedDownloader].username = @"httpwatch"; + [SDWebImageDownloader sharedDownloader].password = @"httpwatch01"; + NSURL *imageURL = [NSURL URLWithString:@"http://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?0.35786508303135633"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; + [SDWebImageDownloader sharedDownloader].username = nil; + [SDWebImageDownloader sharedDownloader].password = nil; +} + +- (void)test09ThatProgressiveJPEGWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Progressive JPEG download"]; + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage009.jpg"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:SDWebImageDownloaderProgressiveDownload progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else if (finished) { + XCTFail(@"Something went wrong"); + } else { + // progressive updates + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test10That404CaseCallsCompletionWithError { NSURL *imageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"404"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (!image && !data && error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} - id token1 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - XCTFail(@"Shouldn't have completed here."); - }]; +- (void)test11ThatCancelWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Cancel"]; + + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage011.jpg"]; + SDWebImageDownloadToken *token = [[SDWebImageDownloader sharedDownloader] + downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + XCTFail(@"Should not get here"); + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + + [[SDWebImageDownloader sharedDownloader] cancel:token]; + + // doesn't cancel immediately - since it uses dispatch async + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(0); + [expectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test12ThatWeCanUseAnotherSessionForEachDownloadOperation { + XCTestExpectation *expectation = [self expectationWithDescription:@"Owned session"]; + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage012.jpg"]; + + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15]; + request.HTTPShouldUsePipelining = YES; + request.allHTTPHeaderFields = @{@"Accept": @"image/*;q=0.8"}; + + SDWebImageDownloaderOperation *operation = [[SDWebImageDownloaderOperation alloc] initWithRequest:request + inSession:nil + options:0]; + [operation addHandlersForProgress:^(NSInteger receivedSize, NSInteger expectedSize) { + + } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + + [operation start]; + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test13ThatDownloadCanContinueWhenTheAppEntersBackground { + XCTestExpectation *expectation = [self expectationWithDescription:@"Simple download"]; + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage013.jpg"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:SDWebImageDownloaderContinueInBackground progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test14ThatPNGWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"WEBP"]; + NSURL *imageURL = [NSURL URLWithString:@"https://nr-platform.s3.amazonaws.com/uploads/platform/published_extension/branding_icon/275/AmazonS3.png"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test15ThatWEBPWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"WEBP"]; + NSURL *imageURL = [NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]; + [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect([SDWebImageDownloader sharedDownloader].currentDownloadCount).to.equal(1); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +/** + * Per #883 - Fix multiple requests for same image and then canceling one + * Old SDWebImage (3.x) could not handle correctly multiple requests for the same image + cancel + * In 4.0, via #883 added `SDWebImageDownloadToken` so we can cancel exactly the request we want + * This test validates the scenario of making 2 requests for the same image and cancelling the 1st one + */ +- (void)test20ThatDownloadingSameURLTwiceAndCancellingFirstWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; + + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage020.jpg"]; + + SDWebImageDownloadToken *token1 = [[SDWebImageDownloader sharedDownloader] + downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + XCTFail(@"Shouldn't have completed here."); + }]; expect(token1).toNot.beNil(); + + SDWebImageDownloadToken *token2 = [[SDWebImageDownloader sharedDownloader] + downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + XCTFail(@"Something went wrong"); + } + }]; + expect(token2).toNot.beNil(); [[SDWebImageDownloader sharedDownloader] cancel:token1]; - id token2 = [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - [expectation fulfill]; - }]; - expect(token2).toNot.beNil(); + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} - [self waitForExpectationsWithTimeout:5. handler:nil]; +/** + * Per #883 - Fix multiple requests for same image and then canceling one + * Old SDWebImage (3.x) could not handle correctly multiple requests for the same image + cancel + * In 4.0, via #883 added `SDWebImageDownloadToken` so we can cancel exactly the request we want + * This test validates the scenario of requesting an image, cancel and then requesting it again + */ +- (void)test21ThatCancelingDownloadThenRequestingAgainWorks { + XCTestExpectation *expectation = [self expectationWithDescription:@"Correct image downloads"]; + + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage021.jpg"]; + + SDWebImageDownloadToken *token1 = [[SDWebImageDownloader sharedDownloader] + downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + XCTFail(@"Shouldn't have completed here."); + }]; + expect(token1).toNot.beNil(); + + [[SDWebImageDownloader sharedDownloader] cancel:token1]; + + SDWebImageDownloadToken *token2 = [[SDWebImageDownloader sharedDownloader] + downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + if (image && data && !error && finished) { + [expectation fulfill]; + } else { + NSLog(@"image = %@, data = %@, error = %@", image, data, error); + XCTFail(@"Something went wrong"); + } + }]; + expect(token2).toNot.beNil(); + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } @end diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index f2059e48..f12455a2 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -14,8 +14,6 @@ #import "SDWebImageManager.h" -static int64_t kAsyncTestTimeout = 5; - @interface SDWebImageManagerTests : XCTestCase diff --git a/Tests/Tests/TestImage.gif b/Tests/Tests/TestImage.gif new file mode 100644 index 0000000000000000000000000000000000000000..a47fd4b99311bc8a3f18c7fc8de85161e94428c5 GIT binary patch literal 3109 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 TNmFQAY7{c1sb;NktaIT%%KXL_ literal 0 HcmV?d00001 diff --git a/Tests/Tests/TestImage.png b/Tests/Tests/TestImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9dd87742e52fa78e9750b88d8758636c78677e GIT binary patch literal 6822 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 literal 0 HcmV?d00001 From fbca6a6dc3bdb3da1bfba21c0cd7a0ff5f66bfd2 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 14:57:51 +0300 Subject: [PATCH 129/207] Removed unneded code --- Tests/Tests/UIImageMultiFormatTests.m | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Tests/Tests/UIImageMultiFormatTests.m b/Tests/Tests/UIImageMultiFormatTests.m index 310cfc7d..d4cbf296 100644 --- a/Tests/Tests/UIImageMultiFormatTests.m +++ b/Tests/Tests/UIImageMultiFormatTests.m @@ -22,18 +22,6 @@ @implementation UIImageMultiFormatTests -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - - (void)testImageOrientationFromImageDataWithInvalidData { // sync download image SEL selector = @selector(sd_imageOrientationFromImageData:); From ea0bd97d101a82ad4135147861c9f6301fbc078d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 15:17:21 +0300 Subject: [PATCH 130/207] Tests for SDWebImageManager --- Tests/Tests/SDWebImageManagerTests.m | 66 ++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index f12455a2..31a22b7f 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -14,6 +14,7 @@ #import "SDWebImageManager.h" +NSString *workingImageURL = @"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"; @interface SDWebImageManagerTests : XCTestCase @@ -21,22 +22,15 @@ @implementation SDWebImageManagerTests -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. +- (void)test01ThatSharedManagerIsNotEqualToInitManager { + SDWebImageManager *manager = [[SDWebImageManager alloc] init]; + expect(manager).toNot.equal([SDWebImageManager sharedManager]); } -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testThatDownloadInvokesCompletionBlockWithCorrectParamsAsync { +- (void)test02ThatDownloadInvokesCompletionBlockWithCorrectParamsAsync { __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; - NSURL *originalImageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"]; + NSURL *originalImageURL = [NSURL URLWithString:workingImageURL]; [[SDWebImageManager sharedManager] loadImageWithURL:originalImageURL options:SDWebImageRefreshCached @@ -49,11 +43,12 @@ [expectation fulfill]; expectation = nil; }]; + expect([[SDWebImageManager sharedManager] isRunning]).to.equal(YES); [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } -- (void)testThatDownloadWithIncorrectURLInvokesCompletionBlockWithAnErrorAsync { +- (void)test03ThatDownloadWithIncorrectURLInvokesCompletionBlockWithAnErrorAsync { __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image download completes"]; NSURL *originalImageURL = [NSURL URLWithString:@"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.png"]; @@ -73,4 +68,49 @@ [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; } +- (void)test04CachedImageExistsForURL { + __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image exists in cache"]; + NSURL *imageURL = [NSURL URLWithString:workingImageURL]; + [[SDWebImageManager sharedManager] cachedImageExistsForURL:imageURL completion:^(BOOL isInCache) { + if (isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should be in cache"); + } + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test05DiskImageExistsForURL { + __block XCTestExpectation *expectation = [self expectationWithDescription:@"Image exists in disk cache"]; + NSURL *imageURL = [NSURL URLWithString:workingImageURL]; + [[SDWebImageManager sharedManager] diskImageExistsForURL:imageURL completion:^(BOOL isInCache) { + if (isInCache) { + [expectation fulfill]; + } else { + XCTFail(@"Image should be in cache"); + } + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test06CancellAll { + XCTestExpectation *expectation = [self expectationWithDescription:@"Cancel"]; + + NSURL *imageURL = [NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage006.jpg"]; + [[SDWebImageManager sharedManager] loadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { + XCTFail(@"Should not get here"); + }]; + + [[SDWebImageManager sharedManager] cancelAll]; + + // doesn't cancel immediately - since it uses dispatch async + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + expect([[SDWebImageManager sharedManager] isRunning]).to.equal(NO); + [expectation fulfill]; + }); + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + @end From f48a133f1b0d4cff4b594866db046ac7aed2bc59 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 15:49:33 +0300 Subject: [PATCH 131/207] Prefetcher tests --- .../project.pbxproj | 4 ++ Tests/Tests/SDWebImagePrefetcherTests.m | 71 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 Tests/Tests/SDWebImagePrefetcherTests.m diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index 953240cd..dca395ad 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 433BBBB71D7EF8200086B6E9 /* TestImage.gif in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB61D7EF8200086B6E9 /* TestImage.gif */; }; 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB81D7EF8260086B6E9 /* TestImage.png */; }; 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */; }; + 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; @@ -30,6 +31,7 @@ 433BBBB61D7EF8200086B6E9 /* TestImage.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = TestImage.gif; sourceTree = ""; }; 433BBBB81D7EF8260086B6E9 /* TestImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TestImage.png; sourceTree = ""; }; 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = MonochromeTestImage.jpg; sourceTree = ""; }; + 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcherTests.m; sourceTree = ""; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; @@ -111,6 +113,7 @@ DA91BEBB19795BC9006F2536 /* UIImageMultiFormatTests.m */, 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */, 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */, + 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */, ); path = Tests; sourceTree = ""; @@ -242,6 +245,7 @@ buildActionMask = 2147483647; files = ( 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */, + 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */, DA248D69195475D800390AB0 /* SDImageCacheTests.m in Sources */, DA248D6B195476AC00390AB0 /* SDWebImageManagerTests.m in Sources */, 433BBBB51D7EF5C00086B6E9 /* SDWebImageDecoderTests.m in Sources */, diff --git a/Tests/Tests/SDWebImagePrefetcherTests.m b/Tests/Tests/SDWebImagePrefetcherTests.m new file mode 100644 index 00000000..9c97317b --- /dev/null +++ b/Tests/Tests/SDWebImagePrefetcherTests.m @@ -0,0 +1,71 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Matt Galloway + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#define EXP_SHORTHAND // required by Expecta + + +#import +#import + +#import "SDWebImagePrefetcher.h" + +@interface SDWebImagePrefetcherTests : XCTestCase + +@end + +@implementation SDWebImagePrefetcherTests + +- (void)test01ThatSharedPrefetcherIsNotEqualToInitPrefetcher { + SDWebImagePrefetcher *prefetcher = [[SDWebImagePrefetcher alloc] init]; + expect(prefetcher).toNot.equal([SDWebImagePrefetcher sharedImagePrefetcher]); +} + +- (void)test02PrefetchMultipleImages { + XCTestExpectation *expectation = [self expectationWithDescription:@"Correct prefetch of multiple images"]; + + NSMutableArray *imageURLs = [NSMutableArray array]; + + for (int i=40; i<43; i++) { + NSString *imageURLString = [NSString stringWithFormat:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage%03d.jpg", i]; + NSURL *imageURL = [NSURL URLWithString:imageURLString]; + [imageURLs addObject:imageURL]; + } + + __block int numberOfPrefetched = 0; + + [[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:imageURLs progress:^(NSUInteger noOfFinishedUrls, NSUInteger noOfTotalUrls) { + numberOfPrefetched += 1; + expect(numberOfPrefetched).to.equal(noOfFinishedUrls); + expect(noOfFinishedUrls).to.beLessThanOrEqualTo(noOfTotalUrls); + expect(noOfTotalUrls).to.equal(imageURLs.count); + } completed:^(NSUInteger noOfFinishedUrls, NSUInteger noOfSkippedUrls) { + expect(numberOfPrefetched).to.equal(noOfFinishedUrls); + expect(noOfFinishedUrls).to.equal(imageURLs.count); + expect(noOfSkippedUrls).to.equal(0); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)test03PrefetchWithEmptyArrayWillCallTheCompletionWithAllZeros { + XCTestExpectation *expectation = [self expectationWithDescription:@"Prefetch with empty array"]; + + [[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:@[] progress:nil completed:^(NSUInteger noOfFinishedUrls, NSUInteger noOfSkippedUrls) { + expect(noOfFinishedUrls).to.equal(0); + expect(noOfSkippedUrls).to.equal(0); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +// TODO: test the prefetcher delegate works + +@end From 2daeffc773229d8b2e3f499ff6e401ac42405fae Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 19:27:10 +0300 Subject: [PATCH 132/207] SDImageCacheConfig.h made public --- SDWebImage.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index cccebbdb..66d9fb31 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -435,12 +435,12 @@ 43A62A641D0E0A8F0089D7DD /* vp8li.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D681998E6B2007367ED /* vp8li.h */; }; 43A62A651D0E0A8F0089D7DD /* webp.c in Sources */ = {isa = PBXBuildFile; fileRef = DA577D691998E6B2007367ED /* webp.c */; }; 43A62A661D0E0A8F0089D7DD /* webpi.h in Headers */ = {isa = PBXBuildFile; fileRef = DA577D6A1998E6B2007367ED /* webpi.h */; }; - 43A918641D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; - 43A918651D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; - 43A918661D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; - 43A918671D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; - 43A918681D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; - 43A918691D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; }; + 43A918641D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A918651D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A918661D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A918671D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A918681D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43A918691D8308FE00B3925F /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43A9186B1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; 43A9186C1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; 43A9186D1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; From 7d02ffd6ab3ce7f042e7c2ed4bbf64f3c367c105 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 19:29:14 +0300 Subject: [PATCH 133/207] Created a WebCache Categories Xcode group - contains all the categories that we actually expose, making it easier to work with them --- SDWebImage.xcodeproj/project.pbxproj | 37 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 66d9fb31..dfbeb8fd 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -892,8 +892,8 @@ 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage watchOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 431BB7031D06D2C1006A3455 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+WebCache.h"; sourceTree = ""; }; - 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+WebCache.m"; sourceTree = ""; }; + 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; + 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheConfig.h; sourceTree = ""; }; 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCacheConfig.m; sourceTree = ""; }; 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; @@ -999,8 +999,8 @@ A18A6CC6172DC28500419892 /* UIImage+GIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+GIF.m"; sourceTree = ""; }; AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+WebCacheOperation.h"; sourceTree = ""; }; AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+WebCacheOperation.m"; sourceTree = ""; }; - ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; DA577CA81998E60B007367ED /* bit_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bit_reader.c; sourceTree = ""; }; DA577CA91998E60B007367ED /* bit_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_reader.h; sourceTree = ""; }; DA577CAA1998E60B007367ED /* bit_reader_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bit_reader_inl.h; sourceTree = ""; }; @@ -1103,6 +1103,24 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4369C2851D9811BB007E863A /* WebCache Categories */ = { + isa = PBXGroup; + children = ( + 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */, + 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */, + 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */, + 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */, + 53922D93148C56230056699D /* UIButton+WebCache.h */, + 53922D94148C56230056699D /* UIButton+WebCache.m */, + ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */, + ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */, + 53922D95148C56230056699D /* UIImageView+WebCache.h */, + 53922D96148C56230056699D /* UIImageView+WebCache.m */, + ); + name = "WebCache Categories"; + path = ..; + sourceTree = ""; + }; 43CE75451CFE9427006C64D0 /* FLAnimatedImage */ = { isa = PBXGroup; children = ( @@ -1195,6 +1213,7 @@ 53922DAA148C56470056699D /* Cache */, 53922DAC148C56DD0056699D /* Utils */, 53922DA9148C562D0056699D /* Categories */, + 4369C2851D9811BB007E863A /* WebCache Categories */, 43CE75CD1CFE98B3006C64D0 /* FLAnimatedImage */, ); path = SDWebImage; @@ -1203,26 +1222,16 @@ 53922DA9148C562D0056699D /* Categories */ = { isa = PBXGroup; children = ( - 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */, - 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */, 5D5B9140188EE8DD006D06BD /* NSData+ImageContentType.h */, 5D5B9141188EE8DD006D06BD /* NSData+ImageContentType.m */, - 53922D93148C56230056699D /* UIButton+WebCache.h */, - 53922D94148C56230056699D /* UIButton+WebCache.m */, A18A6CC5172DC28500419892 /* UIImage+GIF.h */, A18A6CC6172DC28500419892 /* UIImage+GIF.m */, 53EDFB8817623F7C00698166 /* UIImage+MultiFormat.h */, 53EDFB8917623F7C00698166 /* UIImage+MultiFormat.m */, 53EDFB911762547C00698166 /* UIImage+WebP.h */, 53EDFB921762547C00698166 /* UIImage+WebP.m */, - ABBE71A518C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h */, - ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */, - 53922D95148C56230056699D /* UIImageView+WebCache.h */, - 53922D96148C56230056699D /* UIImageView+WebCache.m */, AB615301192DA24600A2D8E9 /* UIView+WebCacheOperation.h */, AB615302192DA24600A2D8E9 /* UIView+WebCacheOperation.m */, - 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */, - 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */, ); name = Categories; sourceTree = ""; From e1840c3262eab8bdeb18572a303aaaf364c629e5 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 19:44:52 +0300 Subject: [PATCH 134/207] Refactored all the duplicate code from our WebCache categories into a UIView+WebCache category. All the other categories will make calls to this one. Customization of setting the image is done via the setImageBlock and the operationKey --- .../SDWebImage Demo/MasterViewController.m | 1 + SDWebImage.xcodeproj/project.pbxproj | 28 +++ .../FLAnimatedImageView+WebCache.h | 17 +- .../FLAnimatedImageView+WebCache.m | 87 ++------ SDWebImage/MKAnnotationView+WebCache.h | 13 -- SDWebImage/MKAnnotationView+WebCache.m | 67 +----- SDWebImage/UIButton+WebCache.h | 6 + SDWebImage/UIButton+WebCache.m | 99 +++------ SDWebImage/UIImageView+HighlightedWebCache.h | 5 - SDWebImage/UIImageView+HighlightedWebCache.m | 48 +---- SDWebImage/UIImageView+WebCache.h | 33 +-- SDWebImage/UIImageView+WebCache.m | 157 +------------- SDWebImage/UIView+WebCache.h | 81 ++++++++ SDWebImage/UIView+WebCache.m | 191 ++++++++++++++++++ 14 files changed, 396 insertions(+), 437 deletions(-) create mode 100644 SDWebImage/UIView+WebCache.h create mode 100644 SDWebImage/UIView+WebCache.m diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 1448a1da..8fb61779 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -11,6 +11,7 @@ #import "DetailViewController.h" #import #import +#import @interface MyCustomTableViewCell : UITableViewCell diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index dfbeb8fd..4832a5f5 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -297,6 +297,18 @@ 431BB6F91D06D2C1006A3455 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A6CC5172DC28500419892 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D8B148C56230056699D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 431BB6FC1D06D2C1006A3455 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53922D89148C56230056699D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C2771D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C2781D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C2791D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C27A1D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C27B1D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C27C1D9807EC007E863A /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4369C2751D9807EC007E863A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4369C27E1D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; + 4369C27F1D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; + 4369C2801D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; + 4369C2811D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; + 4369C2821D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; + 4369C2831D9807EC007E863A /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2761D9807EC007E863A /* UIView+WebCache.m */; }; 438096721CDFC08200DC626B /* MKAnnotationView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 535699B415113E7300A4C397 /* MKAnnotationView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 438096731CDFC08F00DC626B /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 535699B515113E7300A4C397 /* MKAnnotationView+WebCache.m */; }; 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */ = {isa = PBXBuildFile; fileRef = 53EDFB911762547C00698166 /* UIImage+WebP.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -891,6 +903,8 @@ 00733A4C1BC487C000A5A117 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage watchOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 431BB7031D06D2C1006A3455 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4369C2751D9807EC007E863A /* UIView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; + 4369C2761D9807EC007E863A /* UIView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; 4397D2F21D0DDD8C00BB2784 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4397D2F41D0DE2DF00BB2784 /* NSImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; @@ -1116,6 +1130,8 @@ ABBE71A618C43B4D00B75E91 /* UIImageView+HighlightedWebCache.m */, 53922D95148C56230056699D /* UIImageView+WebCache.h */, 53922D96148C56230056699D /* UIImageView+WebCache.m */, + 4369C2751D9807EC007E863A /* UIView+WebCache.h */, + 4369C2761D9807EC007E863A /* UIView+WebCache.m */, ); name = "WebCache Categories"; path = ..; @@ -1438,6 +1454,7 @@ 431739561CDFC8B70008FEB9 /* demux.h in Headers */, 4317394D1CDFC8B20008FEB9 /* utils.h in Headers */, 4397D2F81D0DF44200BB2784 /* MKAnnotationView+WebCache.h in Headers */, + 4369C27A1D9807EC007E863A /* UIView+WebCache.h in Headers */, 431739451CDFC8B20008FEB9 /* quant_levels_dec.h in Headers */, 431739361CDFC8B20008FEB9 /* bit_reader_inl.h in Headers */, 4317393A1CDFC8B20008FEB9 /* color_cache.h in Headers */, @@ -1524,6 +1541,7 @@ 4314D17B1D0E0E3B004B36C9 /* huffman_encode.h in Headers */, 43DA7CD91D10865E0028BE58 /* dsp.h in Headers */, 4314D17C1D0E0E3B004B36C9 /* UIImage+WebP.h in Headers */, + 4369C2781D9807EC007E863A /* UIView+WebCache.h in Headers */, 4314D17D1D0E0E3B004B36C9 /* SDWebImagePrefetcher.h in Headers */, 4314D17E1D0E0E3B004B36C9 /* bit_writer.h in Headers */, 43DA7CF01D10865E0028BE58 /* neon.h in Headers */, @@ -1585,6 +1603,7 @@ 43DA7D931D1086600028BE58 /* lossless.h in Headers */, 431BB6EE1D06D2C1006A3455 /* NSData+ImageContentType.h in Headers */, 431BB6EF1D06D2C1006A3455 /* SDWebImagePrefetcher.h in Headers */, + 4369C27B1D9807EC007E863A /* UIView+WebCache.h in Headers */, 431BB6F01D06D2C1006A3455 /* SDWebImageOperation.h in Headers */, 43A62A201D0E0A800089D7DD /* mux_types.h in Headers */, 43A62A2F1D0E0A860089D7DD /* huffman_encode.h in Headers */, @@ -1621,6 +1640,7 @@ 4397D2C31D0DDD8C00BB2784 /* SDWebImageManager.h in Headers */, 4397D2C41D0DDD8C00BB2784 /* SDImageCache.h in Headers */, 4397D2C51D0DDD8C00BB2784 /* UIImageView+WebCache.h in Headers */, + 4369C27C1D9807EC007E863A /* UIView+WebCache.h in Headers */, 4397D2C61D0DDD8C00BB2784 /* random.h in Headers */, 4397D2C71D0DDD8C00BB2784 /* rescaler.h in Headers */, 43DA7DE11D10867D0028BE58 /* extras.h in Headers */, @@ -1675,6 +1695,7 @@ 431739211CDFC8B20008FEB9 /* endian_inl.h in Headers */, 43CE757D1CFE9427006C64D0 /* FLAnimatedImageView.h in Headers */, 431739541CDFC8B70008FEB9 /* types.h in Headers */, + 4369C2791D9807EC007E863A /* UIView+WebCache.h in Headers */, 431738C51CDFC8A30008FEB9 /* alphai.h in Headers */, 4A2CAE041AB4BB5400B6BC39 /* SDWebImage.h in Headers */, 431739511CDFC8B70008FEB9 /* format_constants.h in Headers */, @@ -1758,6 +1779,7 @@ 431738BD1CDFC2660008FEB9 /* decode.h in Headers */, 53761319155AD0D5005750A4 /* SDWebImageDecoder.h in Headers */, 5376131A155AD0D5005750A4 /* SDWebImageDownloader.h in Headers */, + 4369C2771D9807EC007E863A /* UIView+WebCache.h in Headers */, 5376131C155AD0D5005750A4 /* SDWebImageManager.h in Headers */, 431738B01CDFC2630008FEB9 /* huffman_encode.h in Headers */, 438096741CDFC09C00DC626B /* UIImage+WebP.h in Headers */, @@ -2092,6 +2114,7 @@ 43DA7D681D1086600028BE58 /* yuv_mips_dsp_r2.c in Sources */, 43DA7D651D1086600028BE58 /* upsampling_neon.c in Sources */, 43DA7D371D1086600028BE58 /* alpha_processing.c in Sources */, + 4369C2811D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7D691D1086600028BE58 /* yuv_mips32.c in Sources */, 43DA7D5F1D1086600028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 00733A5E1BC4880000A5A117 /* UIImage+MultiFormat.m in Sources */, @@ -2123,6 +2146,7 @@ 43DA7CDB1D10865E0028BE58 /* enc_mips_dsp_r2.c in Sources */, 4314D12F1D0E0E3B004B36C9 /* thread.c in Sources */, 4314D1311D0E0E3B004B36C9 /* SDWebImageDownloader.m in Sources */, + 4369C27F1D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7CC91D10865E0028BE58 /* alpha_processing.c in Sources */, 4314D1321D0E0E3B004B36C9 /* filters.c in Sources */, 4314D1341D0E0E3B004B36C9 /* UIImage+WebP.m in Sources */, @@ -2220,6 +2244,7 @@ 43DA7D801D1086600028BE58 /* enc_mips_dsp_r2.c in Sources */, 43A62A631D0E0A8F0089D7DD /* vp8l.c in Sources */, 431BB6A31D06D2C1006A3455 /* UIImageView+WebCache.m in Sources */, + 4369C2821D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7D6E1D1086600028BE58 /* alpha_processing.c in Sources */, 43A62A5E1D0E0A8F0089D7DD /* io.c in Sources */, 43A62A321D0E0A860089D7DD /* quant_levels_dec.c in Sources */, @@ -2375,6 +2400,7 @@ 43DA7DB01D1086610028BE58 /* dec_mips32.c in Sources */, 43DA7DAA1D1086610028BE58 /* cost_mips32.c in Sources */, 43DA7DAB1D1086610028BE58 /* cost_sse2.c in Sources */, + 4369C2831D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7DB71D1086610028BE58 /* enc_mips_dsp_r2.c in Sources */, 43DA7DC11D1086610028BE58 /* lossless_enc_mips32.c in Sources */, 43DA7DBC1D1086610028BE58 /* enc.c in Sources */, @@ -2486,6 +2512,7 @@ 43DA7D311D10865F0028BE58 /* yuv_mips_dsp_r2.c in Sources */, 43DA7D2E1D10865F0028BE58 /* upsampling_neon.c in Sources */, 43DA7D001D10865F0028BE58 /* alpha_processing.c in Sources */, + 4369C2801D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7D321D10865F0028BE58 /* yuv_mips32.c in Sources */, 43DA7D281D10865F0028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 431738C81CDFC8A30008FEB9 /* frame.c in Sources */, @@ -2587,6 +2614,7 @@ 43DA7CC31D1086570028BE58 /* yuv_mips_dsp_r2.c in Sources */, 43DA7CC01D1086570028BE58 /* upsampling_neon.c in Sources */, 43DA7C921D1086570028BE58 /* alpha_processing.c in Sources */, + 4369C27E1D9807EC007E863A /* UIView+WebCache.m in Sources */, 43DA7CC41D1086570028BE58 /* yuv_mips32.c in Sources */, 43DA7CBA1D1086570028BE58 /* rescaler_mips_dsp_r2.c in Sources */, 4317387C1CDFC2580008FEB9 /* frame.c in Sources */, diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index ea1e5966..3bb55c47 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -11,9 +11,9 @@ #if SD_UIKIT #if COCOAPODS - @import FLAnimatedImage; +@import FLAnimatedImage; #else - #import "FLAnimatedImageView.h" +#import "FLAnimatedImageView.h" #endif #import "SDWebImageManager.h" @@ -25,14 +25,6 @@ */ @interface FLAnimatedImageView (WebCache) -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use setImage: directly. - */ -- (nullable NSURL *)sd_imageURL; - /** * Load the image at the given url (either from cache or download) and load it in this imageView. It works with both static and dynamic images * The download is asynchronous and cached. @@ -136,11 +128,6 @@ progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock; -/** - * Cancel the image load - */ -- (void)sd_cancelCurrentImageLoad; - @end #endif diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index 4e33b7dd..827abfd5 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -11,19 +11,13 @@ #import "FLAnimatedImageView+WebCache.h" #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" #import "NSData+ImageContentType.h" #import "FLAnimatedImage.h" #import "UIImageView+WebCache.h" -static char imageURLKey; - - @implementation FLAnimatedImageView (WebCache) -- (nullable NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - - (void)sd_setImageWithURL:(nullable NSURL *)url { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; } @@ -53,70 +47,25 @@ static char imageURLKey; options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_cancelCurrentImageLoad]; - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - if (!(options & SDWebImageDelayPlaceholder)) { - dispatch_main_async_safe(^{ - self.image = placeholder; - }); - } - - if (url) { - // check if activityView is enabled or not - if ([self showActivityIndicatorView]) { - [self addActivityIndicator]; - } - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - [wself removeActivityIndicator]; - - if (!wself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { - completedBlock(image, error, cacheType, url); - return; - } else if (image) { - SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; - if (imageFormat == SDImageFormatGIF) { - wself.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data]; - wself.image = nil; - } else { - wself.image = image; - wself.animatedImage = nil; - } - [wself setNeedsLayout]; - } else { - if ((options & SDWebImageDelayPlaceholder)) { - wself.image = placeholder; - [wself setNeedsLayout]; - } - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; - } else { - dispatch_main_async_safe(^{ - [self removeActivityIndicator]; - - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:nil + setImageBlock:^(UIImage *image, NSData *imageData) { + SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; + if (imageFormat == SDImageFormatGIF) { + weakSelf.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data]; + weakSelf.image = nil; + } else { + weakSelf.image = image; + weakSelf.animatedImage = nil; + } + } + progress:progressBlock + completed:completedBlock]; } -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; -} - - @end #endif diff --git a/SDWebImage/MKAnnotationView+WebCache.h b/SDWebImage/MKAnnotationView+WebCache.h index f056218f..0ce6b399 100644 --- a/SDWebImage/MKAnnotationView+WebCache.h +++ b/SDWebImage/MKAnnotationView+WebCache.h @@ -18,14 +18,6 @@ */ @interface MKAnnotationView (WebCache) -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use setImage: directly. - */ -- (nullable NSURL *)sd_imageURL; - /** * Set the imageView `image` with an `url`. * @@ -112,11 +104,6 @@ options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock; -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentImageLoad; - @end #endif diff --git a/SDWebImage/MKAnnotationView+WebCache.m b/SDWebImage/MKAnnotationView+WebCache.m index b5d82059..7ea2f557 100644 --- a/SDWebImage/MKAnnotationView+WebCache.m +++ b/SDWebImage/MKAnnotationView+WebCache.m @@ -12,15 +12,10 @@ #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" - -static char imageURLKey; +#import "UIView+WebCache.h" @implementation MKAnnotationView (WebCache) -- (nullable NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - - (void)sd_setImageWithURL:(nullable NSURL *)url { [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:nil]; } @@ -45,56 +40,16 @@ static char imageURLKey; placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_cancelCurrentImageLoad]; - - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - self.image = placeholder; - - if (url) { - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong MKAnnotationView *sself = wself; - if (!sself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { - completedBlock(image, error, cacheType, url); - return; - } else if (image) { - wself.image = image; -#if SD_UIKIT - [wself setNeedsLayout]; -#elif SD_MAC - [wself setNeedsLayout:YES]; -#endif - } else { - if ((options & SDWebImageDelayPlaceholder)) { - wself.image = placeholder; -#if SD_UIKIT - [wself setNeedsLayout]; -#elif SD_MAC - [wself setNeedsDisplay:YES]; -#endif - } - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:@"MKAnnotationViewImage"]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"MKAnnotationViewImage"]; + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:nil + setImageBlock:^(UIImage *image, NSData *imageData) { + weakSelf.image = image; + } + progress:nil + completed:completedBlock]; } @end diff --git a/SDWebImage/UIButton+WebCache.h b/SDWebImage/UIButton+WebCache.h index fccc0584..c43b7491 100644 --- a/SDWebImage/UIButton+WebCache.h +++ b/SDWebImage/UIButton+WebCache.h @@ -22,6 +22,8 @@ */ - (nullable NSURL *)sd_currentImageURL; +#pragma mark - Image + /** * Get the image URL for a control state. * @@ -126,6 +128,8 @@ options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock; +#pragma mark - Background image + /** * Set the backgroundImageView `image` with an `url`. * @@ -222,6 +226,8 @@ options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock; +#pragma mark - Cancel + /** * Cancel the current image download */ diff --git a/SDWebImage/UIButton+WebCache.m b/SDWebImage/UIButton+WebCache.m index 4efda1f0..63f75e40 100644 --- a/SDWebImage/UIButton+WebCache.m +++ b/SDWebImage/UIButton+WebCache.m @@ -12,6 +12,7 @@ #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" static char imageURLStorageKey; @@ -33,6 +34,8 @@ typedef NSMutableDictionary SDStateImageURLDictionary; return self.imageURLStorage[@(state)]; } +#pragma mark - Image + - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } @@ -58,46 +61,27 @@ typedef NSMutableDictionary SDStateImageURLDictionary; placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self setImage:placeholder forState:state]; - [self sd_cancelImageLoadForState:state]; - if (!url) { [self.imageURLStorage removeObjectForKey:@(state)]; - - dispatch_main_async_safe(^{ - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - return; } self.imageURLStorage[@(state)] = url; - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong UIButton *sself = wself; - if (!sself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - [sself setImage:image forState:state]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forState:state]; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)] + setImageBlock:^(UIImage *image, NSData *imageData) { + [weakSelf setImage:image forState:state]; + } + progress:nil + completed:completedBlock]; } +#pragma mark - Background image + - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } @@ -123,39 +107,23 @@ typedef NSMutableDictionary SDStateImageURLDictionary; placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_cancelBackgroundImageLoadForState:state]; - - [self setBackgroundImage:placeholder forState:state]; - - if (url) { - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong UIButton *sself = wself; - if (!sself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - [sself setBackgroundImage:image forState:state]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setBackgroundImageLoadOperation:operation forState:state]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); + if (!url) { + [self.imageURLStorage removeObjectForKey:@(state)]; + return; } + + self.imageURLStorage[@(state)] = url; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)] + setImageBlock:^(UIImage *image, NSData *imageData) { + [weakSelf setBackgroundImage:image forState:state]; + } + progress:nil + completed:completedBlock]; } - (void)sd_setImageLoadOperation:(id)operation forState:(UIControlState)state { @@ -176,8 +144,7 @@ typedef NSMutableDictionary SDStateImageURLDictionary; - (SDStateImageURLDictionary *)imageURLStorage { SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); - if (!storage) - { + if (!storage) { storage = [NSMutableDictionary dictionary]; objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index c0775c45..c76f4932 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -88,11 +88,6 @@ progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock; -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentHighlightedImageLoad; - @end #endif diff --git a/SDWebImage/UIImageView+HighlightedWebCache.m b/SDWebImage/UIImageView+HighlightedWebCache.m index f853697d..fb13bd8b 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/SDWebImage/UIImageView+HighlightedWebCache.m @@ -11,8 +11,7 @@ #if SD_UIKIT #import "UIView+WebCacheOperation.h" - -#define UIImageViewHighlightedWebCacheOperationKey @"highlightedImage" +#import "UIView+WebCache.h" @implementation UIImageView (HighlightedWebCache) @@ -36,41 +35,16 @@ options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_cancelCurrentHighlightedImageLoad]; - - if (url) { - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe (^{ - if (!wself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - wself.highlightedImage = image; - [wself setNeedsLayout]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:UIImageViewHighlightedWebCacheOperationKey]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentHighlightedImageLoad { - [self sd_cancelImageLoadOperationWithKey:UIImageViewHighlightedWebCacheOperationKey]; + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:nil + options:options + operationKey:@"UIImageViewImageOperationHighlighted" + setImageBlock:^(UIImage *image, NSData *imageData) { + weakSelf.highlightedImage = image; + } + progress:progressBlock + completed:completedBlock]; } @end diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 8e998f4d..867a9375 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -47,14 +47,6 @@ */ @interface UIImageView (WebCache) -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use setImage: directly. - */ -- (nullable NSURL *)sd_imageURL; - /** * Set the imageView `image` with an `url`. * @@ -183,37 +175,18 @@ completed:(nullable SDExternalCompletionBlock)completedBlock; #if SD_UIKIT + +#pragma mark - Animation of multiple images + /** * Download an array of images and starts them in an animation loop * * @param arrayOfURLs An array of NSURL */ - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs; -#endif -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentImageLoad; - -#if SD_UIKIT - (void)sd_cancelCurrentAnimationImagesLoad; -/** - * Show activity UIActivityIndicatorView - */ -- (void)setShowActivityIndicatorView:(BOOL)show; - -/** - * set desired UIActivityIndicatorViewStyle - * - * @param style The style of the UIActivityIndicatorView - */ -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; - -- (BOOL)showActivityIndicatorView; -- (void)addActivityIndicator; -- (void)removeActivityIndicator; #endif @end diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index 14848fba..dbb160f9 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -12,13 +12,7 @@ #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" - -static char imageURLKey; -#if SD_UIKIT -static char TAG_ACTIVITY_INDICATOR; -static char TAG_ACTIVITY_STYLE; -#endif -static char TAG_ACTIVITY_SHOW; +#import "UIView+WebCache.h" @implementation UIImageView (WebCache) @@ -51,65 +45,13 @@ static char TAG_ACTIVITY_SHOW; options:(SDWebImageOptions)options progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_cancelCurrentImageLoad]; - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - if (!(options & SDWebImageDelayPlaceholder)) { - dispatch_main_async_safe(^{ - self.image = placeholder; - }); - } - - if (url) { - - // check if activityView is enabled or not - if ([self showActivityIndicatorView]) { - [self addActivityIndicator]; - } - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - [wself removeActivityIndicator]; - if (!wself) return; - dispatch_main_sync_safe(^{ - if (!wself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - wself.image = image; -#if SD_UIKIT - [wself setNeedsLayout]; -#elif SD_MAC - [wself setNeedsLayout:YES]; -#endif - } else { - if ((options & SDWebImageDelayPlaceholder)) { - wself.image = placeholder; -#if SD_UIKIT - [wself setNeedsLayout]; -#elif SD_MAC - [wself setNeedsLayout:YES]; -#endif - } - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; - } else { - dispatch_main_async_safe(^{ - [self removeActivityIndicator]; - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:nil + setImageBlock:nil + progress:progressBlock + completed:completedBlock]; } - (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url @@ -123,11 +65,10 @@ static char TAG_ACTIVITY_SHOW; [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; } -- (nullable NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - #if SD_UIKIT + +#pragma mark - Animation of multiple images + - (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; __weak __typeof(self)wself = self; @@ -158,88 +99,12 @@ static char TAG_ACTIVITY_SHOW; [self sd_setImageLoadOperation:[operationsArray copy] forKey:@"UIImageViewAnimationImages"]; } -#endif -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; -} - -#if SD_UIKIT - (void)sd_cancelCurrentAnimationImagesLoad { [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimationImages"]; } #endif -#pragma mark - -#if SD_UIKIT -- (UIActivityIndicatorView *)activityIndicator { - return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); -} - -- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { - objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); -} -#endif - -- (void)setShowActivityIndicatorView:(BOOL)show { - objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); -} - -- (BOOL)showActivityIndicatorView { - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; -} - -#if SD_UIKIT -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); -} - -- (int)getIndicatorStyle{ - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; -} -#endif - -- (void)addActivityIndicator { -#if SD_UIKIT - if (!self.activityIndicator) { - self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self getIndicatorStyle]]; - self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; - - dispatch_main_async_safe(^{ - [self addSubview:self.activityIndicator]; - - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterX - multiplier:1.0 - constant:0.0]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterY - multiplier:1.0 - constant:0.0]]; - }); - } - - dispatch_main_async_safe(^{ - [self.activityIndicator startAnimating]; - }); -#endif -} - -- (void)removeActivityIndicator { -#if SD_UIKIT - if (self.activityIndicator) { - [self.activityIndicator removeFromSuperview]; - self.activityIndicator = nil; - } -#endif -} - @end #endif diff --git a/SDWebImage/UIView+WebCache.h b/SDWebImage/UIView+WebCache.h new file mode 100644 index 00000000..bab19f1e --- /dev/null +++ b/SDWebImage/UIView+WebCache.h @@ -0,0 +1,81 @@ +/* + * 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 "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC + +#import "SDWebImageManager.h" + +typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData); + +@interface UIView (WebCache) + +/** + * Get the current image URL. + * + * Note that because of the limitations of categories this property can get out of sync + * if you use setImage: directly. + */ +- (nullable NSURL *)sd_imageURL; + +/** + * Set the imageView `image` with an `url` and optionally a placeholder image. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param operationKey A string to be used as the operation key. If nil, will use the class name + * @param setImageBlock Block used for custom set image code + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Cancel the current download + */ +- (void)sd_cancelCurrentImageLoad; + +#if SD_UIKIT + +#pragma mark - Activity indicator + +/** + * Show activity UIActivityIndicatorView + */ +- (void)setShowActivityIndicatorView:(BOOL)show; + +/** + * set desired UIActivityIndicatorViewStyle + * + * @param style The style of the UIActivityIndicatorView + */ +- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; + +- (BOOL)showActivityIndicatorView; +- (void)addActivityIndicator; +- (void)removeActivityIndicator; + +#endif + +@end + +#endif diff --git a/SDWebImage/UIView+WebCache.m b/SDWebImage/UIView+WebCache.m new file mode 100644 index 00000000..f6d5a4aa --- /dev/null +++ b/SDWebImage/UIView+WebCache.m @@ -0,0 +1,191 @@ +/* + * 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 "UIView+WebCache.h" + +#if SD_UIKIT || SD_MAC + +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" + +static char imageURLKey; + +#if SD_UIKIT +static char TAG_ACTIVITY_INDICATOR; +static char TAG_ACTIVITY_STYLE; +#endif +static char TAG_ACTIVITY_SHOW; + +@implementation UIView (WebCache) + +- (nullable NSURL *)sd_imageURL { + return objc_getAssociatedObject(self, &imageURLKey); +} + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + NSString *validOperationKey = operationKey ?: NSStringFromClass([self class]); + [self sd_cancelImageLoadOperationWithKey:validOperationKey]; + objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + if (!(options & SDWebImageDelayPlaceholder)) { + dispatch_main_async_safe(^{ + [self sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + }); + } + + if (url) { + // check if activityView is enabled or not + if ([self showActivityIndicatorView]) { + [self addActivityIndicator]; + } + + __weak __typeof(self)wself = self; + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + __strong __typeof (wself) sself = wself; + [sself removeActivityIndicator]; + if (!sself) { + return; + } + dispatch_main_sync_safe(^{ + if (!sself) { + return; + } + if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { + completedBlock(image, error, cacheType, url); + return; + } else if (image) { + [sself sd_setImage:image imageData:data basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + [sself sd_setNeedsLayout]; + } else { + if ((options & SDWebImageDelayPlaceholder)) { + [sself sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + [sself sd_setNeedsLayout]; + } + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:validOperationKey]; + } else { + dispatch_main_async_safe(^{ + [self removeActivityIndicator]; + if (completedBlock) { + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])]; +} + +- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock { + if (setImageBlock) { + setImageBlock(image, imageData); + } else if ([self isKindOfClass:[UIImageView class]]) { + UIImageView *imageView = (UIImageView *)self; + imageView.image = image; + } else if ([self isKindOfClass:[UIButton class]]) { + UIButton *button = (UIButton *)self; + [button setImage:image forState:UIControlStateNormal]; + } +} + +- (void)sd_setNeedsLayout { +#if SD_UIKIT + [self setNeedsLayout]; +#elif SD_MAC + [self setNeedsLayout:YES]; +#endif +} + +#pragma mark - Activity indicator + +#pragma mark - +#if SD_UIKIT +- (UIActivityIndicatorView *)activityIndicator { + return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); +} + +- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { + objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); +} +#endif + +- (void)setShowActivityIndicatorView:(BOOL)show { + objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); +} + +- (BOOL)showActivityIndicatorView { + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; +} + +#if SD_UIKIT +- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ + objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); +} + +- (int)getIndicatorStyle{ + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; +} +#endif + +- (void)addActivityIndicator { +#if SD_UIKIT + if (!self.activityIndicator) { + self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self getIndicatorStyle]]; + self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; + + dispatch_main_async_safe(^{ + [self addSubview:self.activityIndicator]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterX + multiplier:1.0 + constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0 + constant:0.0]]; + }); + } + + dispatch_main_async_safe(^{ + [self.activityIndicator startAnimating]; + }); +#endif +} + +- (void)removeActivityIndicator { +#if SD_UIKIT + if (self.activityIndicator) { + [self.activityIndicator removeFromSuperview]; + self.activityIndicator = nil; + } +#endif +} + +@end + +#endif From 460c2e01a151abaeaefb2aa94eef0eff0a1677d1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 19:46:46 +0300 Subject: [PATCH 135/207] Tests project: CocoaPods 1.1.0, dynamic frameworks, include all the code from SDWebImage (MapKit and GIF), updated imports so they work fine --- Tests/Podfile | 7 ++-- .../project.pbxproj | 32 +++++++++---------- Tests/Tests/SDImageCacheTests.m | 4 +-- Tests/Tests/SDWebImageDecoderTests.m | 5 ++- Tests/Tests/SDWebImageDownloaderTests.m | 6 ++-- Tests/Tests/SDWebImageManagerTests.m | 4 +-- Tests/Tests/SDWebImagePrefetcherTests.m | 4 +-- Tests/Tests/UIImageMultiFormatTests.m | 4 +-- 8 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Tests/Podfile b/Tests/Podfile index c85b5732..02553ebb 100644 --- a/Tests/Podfile +++ b/Tests/Podfile @@ -1,12 +1,15 @@ source 'https://github.com/CocoaPods/Specs.git' +use_frameworks! + xcodeproj 'SDWebImage Tests' workspace '../SDWebImage' target 'Tests' do - platform :ios, '7.0' + platform :ios, '8.0' pod 'Expecta' - pod 'OCMockito' pod 'SDWebImage/WebP', :path => '../' + pod 'SDWebImage/MapKit', :path => '../' + pod 'SDWebImage/GIF', :path => '../' end diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index dca395ad..e65738d8 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -7,13 +7,13 @@ objects = { /* Begin PBXBuildFile section */ - 0D87E1F83BD319CEC7622E9F /* libPods-Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0462A7F023A057322E59B3C5 /* libPods-Tests.a */; }; 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */; }; 433BBBB51D7EF5C00086B6E9 /* SDWebImageDecoderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */; }; 433BBBB71D7EF8200086B6E9 /* TestImage.gif in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB61D7EF8200086B6E9 /* TestImage.gif */; }; 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB81D7EF8260086B6E9 /* TestImage.png */; }; 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */; }; 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */; }; + 53F0240D24D359127872F512 /* Pods_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DAAA77E3CA7387F702040D9 /* Pods_Tests.framework */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D58195472AA00390AB0 /* Foundation.framework */; }; @@ -25,7 +25,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 0462A7F023A057322E59B3C5 /* libPods-Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DAAA77E3CA7387F702040D9 /* Pods_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderTests.m; sourceTree = ""; }; 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoderTests.m; sourceTree = ""; }; 433BBBB61D7EF8200086B6E9 /* TestImage.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = TestImage.gif; sourceTree = ""; }; @@ -55,7 +55,7 @@ DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */, DA248D5B195472AA00390AB0 /* UIKit.framework in Frameworks */, DA248D59195472AA00390AB0 /* Foundation.framework in Frameworks */, - 0D87E1F83BD319CEC7622E9F /* libPods-Tests.a in Frameworks */, + 53F0240D24D359127872F512 /* Pods_Tests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,7 +95,7 @@ DA248D56195472AA00390AB0 /* XCTest.framework */, DA248D58195472AA00390AB0 /* Foundation.framework */, DA248D5A195472AA00390AB0 /* UIKit.framework */, - 0462A7F023A057322E59B3C5 /* libPods-Tests.a */, + 1DAAA77E3CA7387F702040D9 /* Pods_Tests.framework */, ); name = Frameworks; sourceTree = ""; @@ -135,12 +135,12 @@ isa = PBXNativeTarget; buildConfigurationList = DA248D67195472AA00390AB0 /* Build configuration list for PBXNativeTarget "Tests" */; buildPhases = ( - 09522B7196293172D6408744 /* 📦 Check Pods Manifest.lock */, + 09522B7196293172D6408744 /* [CP] Check Pods Manifest.lock */, DA248D4F195472AA00390AB0 /* Sources */, DA248D50195472AA00390AB0 /* Frameworks */, DA248D51195472AA00390AB0 /* Resources */, - C86216497B5A0BA9501E2C07 /* 📦 Embed Pods Frameworks */, - 85E5D3885A03BFC23B050908 /* 📦 Copy Pods Resources */, + C86216497B5A0BA9501E2C07 /* [CP] Embed Pods Frameworks */, + 85E5D3885A03BFC23B050908 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -192,29 +192,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 09522B7196293172D6408744 /* 📦 Check Pods Manifest.lock */ = { + 09522B7196293172D6408744 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "📦 Check Pods Manifest.lock"; + name = "[CP] Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - 85E5D3885A03BFC23B050908 /* 📦 Copy Pods Resources */ = { + 85E5D3885A03BFC23B050908 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "📦 Copy Pods Resources"; + name = "[CP] Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -222,14 +222,14 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Tests/Pods-Tests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - C86216497B5A0BA9501E2C07 /* 📦 Embed Pods Frameworks */ = { + C86216497B5A0BA9501E2C07 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "📦 Embed Pods Frameworks"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -271,7 +271,7 @@ isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; }; name = Debug; @@ -279,7 +279,7 @@ DA248D4B1954721A00390AB0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; }; name = Release; }; diff --git a/Tests/Tests/SDImageCacheTests.m b/Tests/Tests/SDImageCacheTests.m index da82904b..be42cd17 100644 --- a/Tests/Tests/SDImageCacheTests.m +++ b/Tests/Tests/SDImageCacheTests.m @@ -10,9 +10,9 @@ #import -#import +#import -#import "SDImageCache.h" +#import NSString *kImageTestKey = @"TestImageKey.jpg"; diff --git a/Tests/Tests/SDWebImageDecoderTests.m b/Tests/Tests/SDWebImageDecoderTests.m index 56bcaf91..b9d24667 100644 --- a/Tests/Tests/SDWebImageDecoderTests.m +++ b/Tests/Tests/SDWebImageDecoderTests.m @@ -11,9 +11,8 @@ #import -#import - -#import "SDWebImageDecoder.h" +#import +#import @interface SDWebImageDecoderTests : XCTestCase diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index d42bee18..dec10686 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -11,10 +11,10 @@ #import -#import +#import -#import "SDWebImageDownloader.h" -#import "SDWebImageDownloaderOperation.h" +#import +#import /** * Category for SDWebImageDownloader so we can access the operationClass diff --git a/Tests/Tests/SDWebImageManagerTests.m b/Tests/Tests/SDWebImageManagerTests.m index 31a22b7f..fd057e9a 100644 --- a/Tests/Tests/SDWebImageManagerTests.m +++ b/Tests/Tests/SDWebImageManagerTests.m @@ -10,9 +10,9 @@ #import -#import +#import -#import "SDWebImageManager.h" +#import NSString *workingImageURL = @"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"; diff --git a/Tests/Tests/SDWebImagePrefetcherTests.m b/Tests/Tests/SDWebImagePrefetcherTests.m index 9c97317b..95cbd3b9 100644 --- a/Tests/Tests/SDWebImagePrefetcherTests.m +++ b/Tests/Tests/SDWebImagePrefetcherTests.m @@ -11,9 +11,9 @@ #import -#import +#import -#import "SDWebImagePrefetcher.h" +#import @interface SDWebImagePrefetcherTests : XCTestCase diff --git a/Tests/Tests/UIImageMultiFormatTests.m b/Tests/Tests/UIImageMultiFormatTests.m index d4cbf296..447796f5 100644 --- a/Tests/Tests/UIImageMultiFormatTests.m +++ b/Tests/Tests/UIImageMultiFormatTests.m @@ -10,9 +10,9 @@ #import -#import +#import -#import "UIImage+MultiFormat.h" +#import @interface UIImageMultiFormatTests : XCTestCase From 1cbe54d600e6971d266b26273d938c5727ea0934 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 19:53:53 +0300 Subject: [PATCH 136/207] Tests for the WebCache categories --- .../project.pbxproj | 4 + Tests/Tests/SDCategoriesTests.m | 146 ++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 Tests/Tests/SDCategoriesTests.m diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index e65738d8..dfb35fc0 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBB81D7EF8260086B6E9 /* TestImage.png */; }; 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */; }; 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */; }; + 4369C2741D9804B1007E863A /* SDCategoriesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2731D9804B1007E863A /* SDCategoriesTests.m */; }; 53F0240D24D359127872F512 /* Pods_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DAAA77E3CA7387F702040D9 /* Pods_Tests.framework */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; @@ -32,6 +33,7 @@ 433BBBB81D7EF8260086B6E9 /* TestImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TestImage.png; sourceTree = ""; }; 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = MonochromeTestImage.jpg; sourceTree = ""; }; 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcherTests.m; sourceTree = ""; }; + 4369C2731D9804B1007E863A /* SDCategoriesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDCategoriesTests.m; sourceTree = ""; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; @@ -114,6 +116,7 @@ 1E3C51E819B46E370092B5E6 /* SDWebImageDownloaderTests.m */, 433BBBB41D7EF5C00086B6E9 /* SDWebImageDecoderTests.m */, 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */, + 4369C2731D9804B1007E863A /* SDCategoriesTests.m */, ); path = Tests; sourceTree = ""; @@ -245,6 +248,7 @@ buildActionMask = 2147483647; files = ( 1E3C51E919B46E370092B5E6 /* SDWebImageDownloaderTests.m in Sources */, + 4369C2741D9804B1007E863A /* SDCategoriesTests.m in Sources */, 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */, DA248D69195475D800390AB0 /* SDImageCacheTests.m in Sources */, DA248D6B195476AC00390AB0 /* SDWebImageManagerTests.m in Sources */, diff --git a/Tests/Tests/SDCategoriesTests.m b/Tests/Tests/SDCategoriesTests.m new file mode 100644 index 00000000..a75df041 --- /dev/null +++ b/Tests/Tests/SDCategoriesTests.m @@ -0,0 +1,146 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Matt Galloway + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#define EXP_SHORTHAND // required by Expecta + +#import +#import + +#import +#import +#import +#import +#import + +@import FLAnimatedImage; + +@interface SDCategoriesTests : XCTestCase + +@end + +@implementation SDCategoriesTests + +- (void)testUIImageViewSetImageWithURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"UIImageView setImageWithURL"]; + + UIImageView *imageView = [[UIImageView alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage050.jpg"]; + [imageView sd_setImageWithURL:originalImageURL + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect(imageView.image).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testUIImageViewSetHighlightedImageWithURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"UIImageView setHighlightedImageWithURL"]; + + UIImageView *imageView = [[UIImageView alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage051.jpg"]; + [imageView sd_setHighlightedImageWithURL:originalImageURL + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect(imageView.highlightedImage).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testMKAnnotationViewSetImageWithURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"MKAnnotationView setImageWithURL"]; + + MKAnnotationView *annotationView = [[MKAnnotationView alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage052.jpg"]; + [annotationView sd_setImageWithURL:originalImageURL + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect(annotationView.image).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testUIButtonSetImageWithURLNormalState { + XCTestExpectation *expectation = [self expectationWithDescription:@"UIButton setImageWithURL normalState"]; + + UIButton *button = [[UIButton alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage053.jpg"]; + [button sd_setImageWithURL:originalImageURL + forState:UIControlStateNormal + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect([button imageForState:UIControlStateNormal]).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testUIButtonSetImageWithURLHighlightedState { + XCTestExpectation *expectation = [self expectationWithDescription:@"UIButton setImageWithURL highlightedState"]; + + UIButton *button = [[UIButton alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage054.jpg"]; + [button sd_setImageWithURL:originalImageURL + forState:UIControlStateHighlighted + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect([button imageForState:UIControlStateHighlighted]).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testUIButtonSetBackgroundImageWithURLNormalState { + XCTestExpectation *expectation = [self expectationWithDescription:@"UIButton setBackgroundImageWithURL normalState"]; + + UIButton *button = [[UIButton alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage055.jpg"]; + [button sd_setBackgroundImageWithURL:originalImageURL + forState:UIControlStateNormal + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + expect([button backgroundImageForState:UIControlStateNormal]).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +- (void)testFLAnimatedImageViewSetImageWithURL { + XCTestExpectation *expectation = [self expectationWithDescription:@"FLAnimatedImageView setImageWithURL"]; + + FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init]; + NSURL *originalImageURL = [NSURL URLWithString:@"https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif"]; + + [imageView sd_setImageWithURL:originalImageURL + completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + expect(image).toNot.beNil(); + expect(error).to.beNil(); + expect(originalImageURL).to.equal(imageURL); + + expect(imageView.image).to.equal(image); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; +} + +@end From e642024688952d6303c9e13ac2c5f60263ec5a00 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 25 Sep 2016 20:07:12 +0300 Subject: [PATCH 137/207] Fix the build: UIButton and UIImageView are not defined on Mac OS or WatchOS --- SDWebImage/UIView+WebCache.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SDWebImage/UIView+WebCache.m b/SDWebImage/UIView+WebCache.m index f6d5a4aa..c941a41f 100644 --- a/SDWebImage/UIView+WebCache.m +++ b/SDWebImage/UIView+WebCache.m @@ -97,13 +97,17 @@ static char TAG_ACTIVITY_SHOW; - (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock { if (setImageBlock) { setImageBlock(image, imageData); - } else if ([self isKindOfClass:[UIImageView class]]) { + return; + } +#if SD_UIKIT + if ([self isKindOfClass:[UIImageView class]]) { UIImageView *imageView = (UIImageView *)self; imageView.image = image; } else if ([self isKindOfClass:[UIButton class]]) { UIButton *button = (UIButton *)self; [button setImage:image forState:UIControlStateNormal]; } +#endif } - (void)sd_setNeedsLayout { From a1bbe8f2195562560ae8e549ee1e3f297ac51148 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 26 Sep 2016 12:06:11 +0300 Subject: [PATCH 138/207] Trying to integrate with Codecov.io --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7a317312..67b67789 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,3 +46,6 @@ script: - pod install --project-directory=Tests - xcodebuild clean -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c + +after_success: + - bash <(curl -s https://codecov.io/bash) From b44f4b8a593d694208bca64da21ba75c529fad27 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 26 Sep 2016 12:10:14 +0300 Subject: [PATCH 139/207] Removed empty line --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 67b67789..4c7b9813 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,4 +48,4 @@ script: - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c after_success: - - bash <(curl -s https://codecov.io/bash) + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From 0ba5241aa5b90f5bd3f3e0319771ff9897dd4840 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Mon, 26 Sep 2016 12:52:51 +0300 Subject: [PATCH 140/207] Added CodeCov icon to the readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 042e061c..59397c3c 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/3.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/3.3) [![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) +[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/testing/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) This library provides an async image downloader with cache support. For convenience, we added categories for some `UIControl` elements like `UIImageView`. From 30b29f4a1045126106ce1a289271df3792e9acb2 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 29 Sep 2016 16:06:51 +0300 Subject: [PATCH 141/207] Updated CHANGELOG with the latest changes (unit testing branch merged) --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 353210a2..6b3dba40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - `SDWebImage TV Demo` - `SDWebImage Watch Demo` - bumped `libwep` version to `0.5.0` +- improved unit testing code coverage (*35%* -> **77%**) and integrated [CodeCov](https://codecov.io/gh/rs/SDWebImage) #### Backwards incompatible changes @@ -43,6 +44,22 @@ - breaks compatibility at least for Swift users of the framework - **watchOS** and **OS X** support #1595 required - renamed `SDWebImage` iOS static lib target to `SDWebImage iOS static` for clarity +- improving the unit tests code coverage #1681 required + - Refactored `NSData` `ImageContentType` category, instead of returning the contentType as a string, the new added method `sd_imageFormatForImageData` will return a `SDImageFormat` enum value + - `SDImageCache` configuration properties moved into `SDImageCacheConfiguration` (which is now available via `config` property): + - `shouldDecompressImages` + - `shouldDisableiCloud` + - `shouldCacheImagesInMemory` + - `maxCacheAge` + - `maxCacheSize` + - The `storeImage:` methods from `SDImageCache` were async already, but declared as sync. Properly marked them as async + added completion. Got rid of the recalculate param. If the `NSData` is provided, use it. Otherwise, recalculate from the `UIImage` + - Removed the synchronous methods `diskImageExistsForURL:` and `cachedImageExistsForURL:` from `SDWebImageManager` + - Removed the synchronous method `diskImageExistsWithKey:` from `SDImageCache` + - Get rid of the confusion caused by `cleanDisk` and `clearDisk` on `SDImageCache`. Renamed `cleanDisk` to `deleteOldFiles`. No longer expose the sync `clearDisk` and `deleteOldFiles`, just the async ones. + - Renamed `SDImageCache` `queryDiskCacheForKey:done:` to `queryCacheOperationForKey:done:` + - Another `SDImageCache` clarification: `imageFromDiskCacheForKey:` used to also check the memory cache which I think is misleading. Now `imageFromDiskCacheForKey` only checks the disk cache and the new method `imageFromCacheForKey` checks both caches + - Got rid of `removeImageForKey:` and `removeImageForKey:fromDisk:` from `SDImageCache` that looked sync but were async. Left only the 2 async ones + - Removed `UIImageView` `sd_cancelCurrentHighlightedImageLoad` #### Features: @@ -54,11 +71,17 @@ - Xcode 7 Objective-C updates (Lightweight Generics and Nullability) #1581 - via #1595 Clarified and simplified the usage of `TARGET_OS_*` macros. Added `SD_MAC`, `SD_UIKIT`, `SD_IOS`, `SD_TV`, `SD_WATCH`. The biggest issue here was `TARGET_OS_MAC` was 1 for all platforms and we couldn't rely on it. - Replaces #1398 Allow to customise cache and image downloader instances used with `SDWebImageManager` - added a new initializer (`initWithCache:downloader:`) 9112170 +- `UIImage` responds to `sd_imageData` and `sd_imageDataAsFormat:` via the `MultiFormat` category. Those methods transform a `UIImage` to the `NSData` representation 82d1f2e +- Created `SDWebImageDownloaderOperationInterface` to describe the behavior of a downloader operation. Any custom operation must conform to this protocol df3b6a5 +- Refactored all the duplicate code from our `WebCache` categories into a `UIView` `WebCache` category. All the other categories will make calls to this one. Customization of setting the image is done via the `setImageBlock` and the `operationKey` e1840c3 +- Due to the change above, the activity indicator can now be added to `UIButton`, `MKAnnotationView`, `UIImageView` #### Fixes: - Fix multiple requests for same image and then canceling one #883 + 8a78586 - Fixed #1444 and the master build thanks to [@kenmaz](https://github.com/kenmaz/SDWebImage/commit/5034c334be50765dfe4e97c48bcb74ef64175188) +- Fixed an issue with the `SDWebImageDownloaderOperation` : `cancelInternal` was not called because of the old mechanism rellying on the `thread` property - probably because that thread did not have a runloop. Removed that and now cancelInternal is called as expected f4bdae6 + ## [3.8.2 Patch release for 3.8.0 on Sep 5th, 2016](https://github.com/rs/SDWebImage/releases/tag/3.8.2) From 836c15bccff60e0eebc182b159b102b36051b39f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 29 Sep 2016 18:23:42 +0300 Subject: [PATCH 142/207] Bumped libwebp to 0.5.1 --- SDWebImage.xcodeproj/project.pbxproj | 42 ++++++++++++++++++++++++++++ Vendors/libwebp | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 4832a5f5..292f0543 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -459,6 +459,24 @@ 43A9186E1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; 43A9186F1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; 43A918701D8308FE00B3925F /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */; }; + 43C892851D9D62B60022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C892861D9D62B60022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C892871D9D62B60022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; + 43C892881D9D62C50022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C892891D9D62C60022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C8928A1D9D62C60022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C8928B1D9D62C70022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C8928C1D9D62C70022038D /* common_sse2.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892821D9D62B60022038D /* common_sse2.h */; }; + 43C8928D1D9D62CF0022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C8928E1D9D62D00022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C8928F1D9D62D00022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C892901D9D62D10022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C892911D9D62D10022038D /* dec_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 43C892831D9D62B60022038D /* dec_msa.c */; }; + 43C892921D9D62D30022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; + 43C892931D9D62D40022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; + 43C892941D9D62D40022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; + 43C892951D9D62D40022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; + 43C892961D9D62D40022038D /* msa_macro.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C892841D9D62B60022038D /* msa_macro.h */; }; 43CE75761CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75771CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 43CE75781CFE9427006C64D0 /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -910,6 +928,9 @@ 4397D2F51D0DE2DF00BB2784 /* NSImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; 43A918621D8308FE00B3925F /* SDImageCacheConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheConfig.h; sourceTree = ""; }; 43A918631D8308FE00B3925F /* SDImageCacheConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCacheConfig.m; sourceTree = ""; }; + 43C892821D9D62B60022038D /* common_sse2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_sse2.h; sourceTree = ""; }; + 43C892831D9D62B60022038D /* dec_msa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dec_msa.c; sourceTree = ""; }; + 43C892841D9D62B60022038D /* msa_macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msa_macro.h; sourceTree = ""; }; 43CE75491CFE9427006C64D0 /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; 43CE754A1CFE9427006C64D0 /* FLAnimatedImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLAnimatedImage.m; sourceTree = ""; }; 43CE754B1CFE9427006C64D0 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImageView.h; sourceTree = ""; }; @@ -1317,6 +1338,7 @@ 43DA7C5C1D1086570028BE58 /* argb_mips_dsp_r2.c */, 43DA7C5D1D1086570028BE58 /* argb_sse2.c */, 43DA7C5E1D1086570028BE58 /* argb.c */, + 43C892821D9D62B60022038D /* common_sse2.h */, 43DA7C5F1D1086570028BE58 /* cost_mips_dsp_r2.c */, 43DA7C601D1086570028BE58 /* cost_mips32.c */, 43DA7C611D1086570028BE58 /* cost_sse2.c */, @@ -1325,6 +1347,7 @@ 43DA7C641D1086570028BE58 /* dec_clip_tables.c */, 43DA7C651D1086570028BE58 /* dec_mips_dsp_r2.c */, 43DA7C661D1086570028BE58 /* dec_mips32.c */, + 43C892831D9D62B60022038D /* dec_msa.c */, 43DA7C671D1086570028BE58 /* dec_neon.c */, 43DA7C681D1086570028BE58 /* dec_sse2.c */, 43DA7C691D1086570028BE58 /* dec_sse41.c */, @@ -1352,6 +1375,7 @@ 43DA7C7F1D1086570028BE58 /* lossless.c */, 43DA7C801D1086570028BE58 /* lossless.h */, 43DA7C811D1086570028BE58 /* mips_macro.h */, + 43C892841D9D62B60022038D /* msa_macro.h */, 43DA7C821D1086570028BE58 /* neon.h */, 43DA7C831D1086570028BE58 /* rescaler_mips_dsp_r2.c */, 43DA7C841D1086570028BE58 /* rescaler_mips32.c */, @@ -1470,11 +1494,13 @@ 431739591CDFC8B70008FEB9 /* mux.h in Headers */, 4317393F1CDFC8B20008FEB9 /* huffman.h in Headers */, 00733A6C1BC4880E00A5A117 /* UIButton+WebCache.h in Headers */, + 43C892941D9D62D40022038D /* msa_macro.h in Headers */, 431738DF1CDFC8A40008FEB9 /* vp8li.h in Headers */, 4317395B1CDFC8B70008FEB9 /* types.h in Headers */, 43CE75D21CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, 431739551CDFC8B70008FEB9 /* decode.h in Headers */, 00733A731BC4880E00A5A117 /* SDWebImage.h in Headers */, + 43C8928A1D9D62C60022038D /* common_sse2.h in Headers */, 00733A701BC4880E00A5A117 /* UIImageView+HighlightedWebCache.h in Headers */, 00733A671BC4880E00A5A117 /* SDImageCache.h in Headers */, 431739411CDFC8B20008FEB9 /* huffman_encode.h in Headers */, @@ -1559,7 +1585,9 @@ 4314D18E1D0E0E3B004B36C9 /* vp8i.h in Headers */, 4314D18F1D0E0E3B004B36C9 /* UIView+WebCacheOperation.h in Headers */, 4314D1901D0E0E3B004B36C9 /* UIImage+GIF.h in Headers */, + 43C892921D9D62D30022038D /* msa_macro.h in Headers */, 4314D1911D0E0E3B004B36C9 /* filters.h in Headers */, + 43C892881D9D62C50022038D /* common_sse2.h in Headers */, 4314D1921D0E0E3B004B36C9 /* UIImage+MultiFormat.h in Headers */, 4314D1931D0E0E3B004B36C9 /* decode_vp8.h in Headers */, 4314D1941D0E0E3B004B36C9 /* random.h in Headers */, @@ -1587,6 +1615,7 @@ 43DA7D7E1D1086600028BE58 /* dsp.h in Headers */, 43A62A3B1D0E0A860089D7DD /* utils.h in Headers */, 43A62A231D0E0A860089D7DD /* bit_reader.h in Headers */, + 43C8928B1D9D62C70022038D /* common_sse2.h in Headers */, 43A62A2D1D0E0A860089D7DD /* huffman.h in Headers */, 43A62A1C1D0E0A800089D7DD /* demux.h in Headers */, 43A62A331D0E0A860089D7DD /* quant_levels_dec.h in Headers */, @@ -1622,6 +1651,7 @@ 431BB6FA1D06D2C1006A3455 /* SDWebImageDownloader.h in Headers */, 431BB6FC1D06D2C1006A3455 /* SDWebImageDecoder.h in Headers */, 43A918681D8308FE00B3925F /* SDImageCacheConfig.h in Headers */, + 43C892951D9D62D40022038D /* msa_macro.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1648,6 +1678,7 @@ 4397D2C91D0DDD8C00BB2784 /* bit_reader.h in Headers */, 4397D2CB1D0DDD8C00BB2784 /* UIImageView+HighlightedWebCache.h in Headers */, 4397D2CC1D0DDD8C00BB2784 /* mux.h in Headers */, + 43C892961D9D62D40022038D /* msa_macro.h in Headers */, 4397D2CE1D0DDD8C00BB2784 /* huffman_encode.h in Headers */, 4397D2D01D0DDD8C00BB2784 /* SDWebImageDownloaderOperation.h in Headers */, 43DA7C1B1D1086130028BE58 /* common.h in Headers */, @@ -1683,6 +1714,7 @@ 4397D2EB1D0DDD8C00BB2784 /* NSData+ImageContentType.h in Headers */, 4397D2EC1D0DDD8C00BB2784 /* decode_vp8.h in Headers */, 4397D2ED1D0DDD8C00BB2784 /* mux_types.h in Headers */, + 43C8928C1D9D62C70022038D /* common_sse2.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1711,11 +1743,13 @@ 4A2CAE181AB4BB6400B6BC39 /* SDWebImageCompat.h in Headers */, 4317391B1CDFC8B20008FEB9 /* bit_reader.h in Headers */, 43CE75D11CFE98E0006C64D0 /* FLAnimatedImageView+WebCache.h in Headers */, + 43C892931D9D62D40022038D /* msa_macro.h in Headers */, 4A2CAE331AB4BB7500B6BC39 /* UIImageView+HighlightedWebCache.h in Headers */, 431739521CDFC8B70008FEB9 /* mux.h in Headers */, 431739271CDFC8B20008FEB9 /* huffman_encode.h in Headers */, 4A2CAE1D1AB4BB6800B6BC39 /* SDWebImageDownloaderOperation.h in Headers */, 4317394E1CDFC8B70008FEB9 /* decode.h in Headers */, + 43C892891D9D62C60022038D /* common_sse2.h in Headers */, 431738D21CDFC8A30008FEB9 /* webpi.h in Headers */, 431739311CDFC8B20008FEB9 /* thread.h in Headers */, 431739291CDFC8B20008FEB9 /* quant_levels.h in Headers */, @@ -1753,6 +1787,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 43C892851D9D62B60022038D /* common_sse2.h in Headers */, 431738C21CDFC2660008FEB9 /* mux_types.h in Headers */, 431738BE1CDFC2660008FEB9 /* demux.h in Headers */, 431738BC1CDFC2630008FEB9 /* utils.h in Headers */, @@ -1790,6 +1825,7 @@ 53761320155AD0D5005750A4 /* UIImageView+WebCache.h in Headers */, 431738AA1CDFC2630008FEB9 /* endian_inl.h in Headers */, 530E49E816464C25002868E7 /* SDWebImageOperation.h in Headers */, + 43C892871D9D62B60022038D /* msa_macro.h in Headers */, 530E49EA16464C7C002868E7 /* SDWebImageDownloaderOperation.h in Headers */, ABBE71A718C43B4D00B75E91 /* UIImageView+HighlightedWebCache.h in Headers */, 431738791CDFC2580008FEB9 /* alphai.h in Headers */, @@ -2098,6 +2134,7 @@ 431739441CDFC8B20008FEB9 /* quant_levels_dec.c in Sources */, 43DA7D4F1D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */, 00733A5C1BC4880000A5A117 /* UIButton+WebCache.m in Sources */, + 43C8928F1D9D62D00022038D /* dec_msa.c in Sources */, 4317394C1CDFC8B20008FEB9 /* utils.c in Sources */, 43DA7D381D1086600028BE58 /* argb_mips_dsp_r2.c in Sources */, 43DA7D3C1D1086600028BE58 /* cost_mips32.c in Sources */, @@ -2164,6 +2201,7 @@ 43DA7CE11D10865E0028BE58 /* filters_mips_dsp_r2.c in Sources */, 43DA7CCB1D10865E0028BE58 /* argb_sse2.c in Sources */, 43DA7CE41D10865E0028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43C8928D1D9D62CF0022038D /* dec_msa.c in Sources */, 4314D1391D0E0E3B004B36C9 /* color_cache.c in Sources */, 4314D13B1D0E0E3B004B36C9 /* UIButton+WebCache.m in Sources */, 43DA7DE61D109B980028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, @@ -2262,6 +2300,7 @@ 43DA7D861D1086600028BE58 /* filters_mips_dsp_r2.c in Sources */, 43DA7D701D1086600028BE58 /* argb_sse2.c in Sources */, 43DA7D891D1086600028BE58 /* lossless_enc_mips_dsp_r2.c in Sources */, + 43C892901D9D62D10022038D /* dec_msa.c in Sources */, 43A62A341D0E0A860089D7DD /* random.c in Sources */, 431BB6B11D06D2C1006A3455 /* UIView+WebCacheOperation.m in Sources */, 43DA7DEC1D109B9B0028BE58 /* alpha_processing_mips_dsp_r2.c in Sources */, @@ -2374,6 +2413,7 @@ 4397D2991D0DDD8C00BB2784 /* vp8l.c in Sources */, 4397D29B1D0DDD8C00BB2784 /* SDWebImageDownloader.m in Sources */, 43DA7DEF1D109B9B0028BE58 /* alpha_processing_sse2.c in Sources */, + 43C892911D9D62D10022038D /* dec_msa.c in Sources */, 43DA7DBD1D1086610028BE58 /* filters_mips_dsp_r2.c in Sources */, 43DA7DC61D1086610028BE58 /* lossless_mips_dsp_r2.c in Sources */, 4397D29C1D0DDD8C00BB2784 /* NSData+ImageContentType.m in Sources */, @@ -2496,6 +2536,7 @@ 431739261CDFC8B20008FEB9 /* huffman_encode.c in Sources */, 43DA7D181D10865F0028BE58 /* filters_mips_dsp_r2.c in Sources */, 4A2CAE2C1AB4BB7500B6BC39 /* UIButton+WebCache.m in Sources */, + 43C8928E1D9D62D00022038D /* dec_msa.c in Sources */, 431738CA1CDFC8A30008FEB9 /* io.c in Sources */, 43DA7D011D10865F0028BE58 /* argb_mips_dsp_r2.c in Sources */, 43DA7D051D10865F0028BE58 /* cost_mips32.c in Sources */, @@ -2598,6 +2639,7 @@ 431738AF1CDFC2630008FEB9 /* huffman_encode.c in Sources */, 43DA7CAA1D1086570028BE58 /* filters_mips_dsp_r2.c in Sources */, A18A6CC9172DC28500419892 /* UIImage+GIF.m in Sources */, + 43C892861D9D62B60022038D /* dec_msa.c in Sources */, 4317387E1CDFC2580008FEB9 /* io.c in Sources */, 43DA7C931D1086570028BE58 /* argb_mips_dsp_r2.c in Sources */, 43DA7C971D1086570028BE58 /* cost_mips32.c in Sources */, diff --git a/Vendors/libwebp b/Vendors/libwebp index 37f04949..3d97bb75 160000 --- a/Vendors/libwebp +++ b/Vendors/libwebp @@ -1 +1 @@ -Subproject commit 37f049490d573f8c153e1b2c74c3a5bcca3a3d8b +Subproject commit 3d97bb75144147e47db278ec76e5e70c6b2243db From 5fac787866f3ba73de304d27afa8a220c39af9e3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 29 Sep 2016 18:32:02 +0300 Subject: [PATCH 143/207] Really enabled WebP for all the targets --- SDWebImage.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SDWebImage.xcodeproj/project.pbxproj b/SDWebImage.xcodeproj/project.pbxproj index 292f0543..8b0c6fd4 100644 --- a/SDWebImage.xcodeproj/project.pbxproj +++ b/SDWebImage.xcodeproj/project.pbxproj @@ -2955,6 +2955,7 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", + "SD_WEBP=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; @@ -3007,7 +3008,10 @@ ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "SD_WEBP=1", + "$(inherited)", + ); GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; From 3c4aa45f327d2304c2ef3f1662152de382c381c9 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 09:32:34 +0300 Subject: [PATCH 144/207] Fixed build due to latest animated WebP support that was not properly adapted for OSX. For OSX, this will not work because the `animatedImageWithImages:duration:` API does not have an equivalent there. --- Examples/SDWebImage OSX Demo/ViewController.m | 2 +- SDWebImage/NSImage+WebCache.h | 1 + SDWebImage/NSImage+WebCache.m | 6 ++++++ SDWebImage/UIImage+WebP.m | 17 +++++++++++++++-- SDWebImage/UIView+WebCache.m | 9 +++++++-- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Examples/SDWebImage OSX Demo/ViewController.m b/Examples/SDWebImage OSX Demo/ViewController.m index 45dce71d..c3fe1d60 100644 --- a/Examples/SDWebImage OSX Demo/ViewController.m +++ b/Examples/SDWebImage OSX Demo/ViewController.m @@ -29,7 +29,7 @@ // Do any additional setup after loading the view. [self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"http://assets.sbnation.com/assets/2512203/dogflops.gif"]]; [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]]; - [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"]]; + [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://littlesvr.ca/apng/images/SteamEngine.webp"]]; [self.imageView4 sd_setImageWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage001.jpg"]]; } diff --git a/SDWebImage/NSImage+WebCache.h b/SDWebImage/NSImage+WebCache.h index d68bdf03..7515d407 100644 --- a/SDWebImage/NSImage+WebCache.h +++ b/SDWebImage/NSImage+WebCache.h @@ -14,6 +14,7 @@ @interface NSImage (WebCache) +- (CGImageRef)CGImage; - (NSArray *)images; - (BOOL)isGIF; diff --git a/SDWebImage/NSImage+WebCache.m b/SDWebImage/NSImage+WebCache.m index de8e0049..518b498c 100644 --- a/SDWebImage/NSImage+WebCache.m +++ b/SDWebImage/NSImage+WebCache.m @@ -12,6 +12,12 @@ @implementation NSImage (WebCache) +- (CGImageRef)CGImage { + NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height); + CGImageRef cgImage = [self CGImageForProposedRect:&imageRect context:NULL hints:nil]; + return cgImage; +} + - (NSArray *)images { return nil; } diff --git a/SDWebImage/UIImage+WebP.m b/SDWebImage/UIImage+WebP.m index 33cc4db2..bd6b9e1b 100644 --- a/SDWebImage/UIImage+WebP.m +++ b/SDWebImage/UIImage+WebP.m @@ -12,6 +12,7 @@ #import "webp/decode.h" #import "webp/mux_types.h" #import "webp/demux.h" +#import "NSImage+WebCache.h" // Callback for CGDataProviderRelease static void FreeImageData(void *info, const void *data, size_t size) { @@ -71,8 +72,16 @@ static void FreeImageData(void *info, const void *data, size_t size) { WebPDemuxReleaseIterator(&iter); WebPDemuxDelete(demuxer); - UIImage *animateImage = [UIImage animatedImageWithImages:images duration:duration]; - return animateImage; + + UIImage *finalImage = nil; +#if SD_UIKIT || SD_WATCH + finalImage = [UIImage animatedImageWithImages:images duration:duration]; +#elif SD_MAC + if ([images count] > 0) { + finalImage = images[0]; + } +#endif + return finalImage; } @@ -98,7 +107,11 @@ static void FreeImageData(void *info, const void *data, size_t size) { CGContextDrawImage(blendCanvas, imageRect, image.CGImage); CGImageRef newImageRef = CGBitmapContextCreateImage(blendCanvas); +#if SD_UIKIT || SD_WATCH image = [UIImage imageWithCGImage:newImageRef]; +#elif SD_MAC + image = [[UIImage alloc] initWithCGImage:newImageRef size:NSZeroSize]; +#endif CGImageRelease(newImageRef); CGContextRelease(blendCanvas); diff --git a/SDWebImage/UIView+WebCache.m b/SDWebImage/UIView+WebCache.m index c941a41f..b1eb489f 100644 --- a/SDWebImage/UIView+WebCache.m +++ b/SDWebImage/UIView+WebCache.m @@ -99,11 +99,16 @@ static char TAG_ACTIVITY_SHOW; setImageBlock(image, imageData); return; } -#if SD_UIKIT + +#if SD_UIKIT || SD_MAC if ([self isKindOfClass:[UIImageView class]]) { UIImageView *imageView = (UIImageView *)self; imageView.image = image; - } else if ([self isKindOfClass:[UIButton class]]) { + } +#endif + +#if SD_UIKIT + if ([self isKindOfClass:[UIButton class]]) { UIButton *button = (UIButton *)self; [button setImage:image forState:UIControlStateNormal]; } From f1a19df72168e964e0649e4036df870b95fb2b49 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 09:33:06 +0300 Subject: [PATCH 145/207] Added SDImageCacheConfig.h and UIView+WebCache.h to the umbrella header --- WebImage/SDWebImage.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WebImage/SDWebImage.h b/WebImage/SDWebImage.h index 9772a34b..e6dc3af0 100644 --- a/WebImage/SDWebImage.h +++ b/WebImage/SDWebImage.h @@ -22,7 +22,9 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import +#import #import +#import #import #import #import From 55e1e8c723719c799beb8c005da5cebad766ffa8 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 10:12:45 +0300 Subject: [PATCH 146/207] The watchOS demo uses the watch dynamic framework --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index 83a6441f..d7c0dee3 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 3E75A9861742DBE700DA412D /* CustomPathImages in Resources */ = {isa = PBXBuildFile; fileRef = 3E75A9851742DBE700DA412D /* CustomPathImages */; }; - 4314D1A11D0E0EE2004B36C9 /* libSDWebImage watchOS static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4314D19E1D0E0EB6004B36C9 /* libSDWebImage watchOS static.a */; }; 4314D1AA1D0E1181004B36C9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1A91D0E1181004B36C9 /* main.m */; }; 4314D1AD1D0E1181004B36C9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1AC1D0E1181004B36C9 /* AppDelegate.m */; }; 4314D1B01D0E1182004B36C9 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4314D1AF1D0E1182004B36C9 /* ViewController.m */; }; @@ -30,6 +29,7 @@ 43A62A091D0E07600089D7DD /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A62A081D0E07600089D7DD /* NotificationController.m */; }; 43A62A0B1D0E07600089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A62A0A1D0E07600089D7DD /* Assets.xcassets */; }; 43A62A0F1D0E07600089D7DD /* SDWebImage Watch Demo.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */; }; + 43F04B3F1D9E468D003F9640 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */; }; 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E6155ABA44005750A4 /* ImageIO.framework */; }; 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53761299155AB74D005750A4 /* UIKit.framework */; }; 5376129C155AB74D005750A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5376129B155AB74D005750A4 /* Foundation.framework */; }; @@ -54,13 +54,6 @@ remoteGlobalIDString = 4314D1991D0E0E3B004B36C9; remoteInfo = "SDWebImage watchOS static"; }; - 4314D19F1D0E0EBD004B36C9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 4314D11B1D0E0E3B004B36C9; - remoteInfo = "SDWebImage watchOS static"; - }; 4314D1BA1D0E11A0004B36C9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -124,6 +117,13 @@ remoteGlobalIDString = 43A629ED1D0E07600089D7DD; remoteInfo = "SDWebImage Watch Demo"; }; + 43F04B3D1D9E467E003F9640 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 431BB6891D06D2C1006A3455; + remoteInfo = "SDWebImage watchOS"; + }; DA248D731954841D00390AB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -236,7 +236,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4314D1A11D0E0EE2004B36C9 /* libSDWebImage watchOS static.a in Frameworks */, + 43F04B3F1D9E468D003F9640 /* SDWebImage.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -484,7 +484,7 @@ buildRules = ( ); dependencies = ( - 4314D1A01D0E0EBD004B36C9 /* PBXTargetDependency */, + 43F04B3E1D9E467E003F9640 /* PBXTargetDependency */, ); name = "SDWebImage Watch Demo Extension"; productName = "SDWebImage Watch Demo Extension"; @@ -703,11 +703,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4314D1A01D0E0EBD004B36C9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "SDWebImage watchOS static"; - targetProxy = 4314D19F1D0E0EBD004B36C9 /* PBXContainerItemProxy */; - }; 4314D1BB1D0E11A0004B36C9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "SDWebImage tvOS"; @@ -733,6 +728,11 @@ target = 43A629ED1D0E07600089D7DD /* SDWebImage Watch Demo */; targetProxy = 43A62A0D1D0E07600089D7DD /* PBXContainerItemProxy */; }; + 43F04B3E1D9E467E003F9640 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage watchOS"; + targetProxy = 43F04B3D1D9E467E003F9640 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ From 2b721a6e30510afd09c7d863801cd81abcc55ba3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 10:12:58 +0300 Subject: [PATCH 147/207] Updated the image used by the watchOS demo --- Examples/SDWebImage Watch Demo Extension/InterfaceController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/SDWebImage Watch Demo Extension/InterfaceController.m b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m index a71ef5be..d36cec8d 100644 --- a/Examples/SDWebImage Watch Demo Extension/InterfaceController.m +++ b/Examples/SDWebImage Watch Demo Extension/InterfaceController.m @@ -29,7 +29,7 @@ // This method is called when watch view controller is about to be visible to user [super willActivate]; - NSString *urlString = @"http://s3.amazonaws.com/fast-image-cache/demo-images/FICDDemoImage000.jpg"; + NSString *urlString = @"https://nr-platform.s3.amazonaws.com/uploads/platform/published_extension/branding_icon/275/AmazonS3.png"; [[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:urlString] options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { self.imageInterface.image = image; }]; From 062e50aa10499251f07264ea73ce7627910de0ce Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 13:17:57 +0300 Subject: [PATCH 148/207] Replacing #781 - based on http://blog.benjamin-encz.de/post/main-queue-vs-main-thread/, background queue can execute code on the main thread, so we need to check for the main queue to assure safety --- SDWebImage/SDWebImageCompat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index a11f3916..ae6aed87 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -107,7 +107,7 @@ extern NSString *const SDWebImageErrorDomain; } #define dispatch_main_async_safe(block)\ - if ([NSThread isMainThread]) {\ + if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\ block();\ } else {\ dispatch_async(dispatch_get_main_queue(), block);\ From f7e82460142fb51f9e9251f82bf34b3a9ed833e8 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 13:22:56 +0300 Subject: [PATCH 149/207] Replacing #781 - replaced all the remaining `dispatch_main_sync_safe` with `dispatch_main_async_safe`, so we no longer `dispatch_sync` on the main queue that can create issues. --- SDWebImage/SDWebImageCompat.h | 7 ------- SDWebImage/SDWebImageDownloaderOperation.m | 2 +- SDWebImage/SDWebImageManager.m | 14 +++++++------- SDWebImage/UIImageView+WebCache.m | 2 +- SDWebImage/UIView+WebCache.m | 2 +- 5 files changed, 10 insertions(+), 17 deletions(-) diff --git a/SDWebImage/SDWebImageCompat.h b/SDWebImage/SDWebImageCompat.h index ae6aed87..c1cff93b 100644 --- a/SDWebImage/SDWebImageCompat.h +++ b/SDWebImage/SDWebImageCompat.h @@ -99,13 +99,6 @@ typedef void(^SDWebImageNoParamsBlock)(); extern NSString *const SDWebImageErrorDomain; -#define dispatch_main_sync_safe(block)\ - if ([NSThread isMainThread]) {\ - block();\ - } else {\ - dispatch_sync(dispatch_get_main_queue(), block);\ - } - #define dispatch_main_async_safe(block)\ if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\ block();\ diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index 615cc062..ae47146b 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -372,7 +372,7 @@ didReceiveResponse:(NSURLResponse *)response image = scaledImage; } CGImageRelease(partialImageRef); - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { completedBlock(image, nil, nil, NO); } diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 751f9210..68aca56d 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -131,7 +131,7 @@ } if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; completedBlock(nil, nil, error, SDImageCacheTypeNone, YES, url); }); @@ -154,7 +154,7 @@ if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { if (cachedImage && options & SDWebImageRefreshCached) { - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); @@ -183,7 +183,7 @@ // See #699 for more details // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data } else if (error) { - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ if (strongOperation && !strongOperation.isCancelled) { completedBlock(nil, nil, error, SDImageCacheTypeNone, finished, url); } @@ -222,7 +222,7 @@ [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; } - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ if (strongOperation && !strongOperation.isCancelled) { completedBlock(transformedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); } @@ -233,7 +233,7 @@ [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; } - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ if (strongOperation && !strongOperation.isCancelled) { completedBlock(downloadedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); } @@ -260,7 +260,7 @@ } }; } else if (cachedImage) { - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation && !strongOperation.isCancelled) { completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); @@ -271,7 +271,7 @@ } } else { // Image not in cache and download disallowed by delegate - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; if (strongOperation && !weakOperation.isCancelled) { completedBlock(nil, nil, nil, SDImageCacheTypeNone, YES, url); diff --git a/SDWebImage/UIImageView+WebCache.m b/SDWebImage/UIImageView+WebCache.m index dbb160f9..81f687ef 100644 --- a/SDWebImage/UIImageView+WebCache.m +++ b/SDWebImage/UIImageView+WebCache.m @@ -78,7 +78,7 @@ for (NSURL *logoImageURL in arrayOfURLs) { id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ __strong UIImageView *sself = wself; [sself stopAnimating]; if (sself && image) { diff --git a/SDWebImage/UIView+WebCache.m b/SDWebImage/UIView+WebCache.m index b1eb489f..32a76ed8 100644 --- a/SDWebImage/UIView+WebCache.m +++ b/SDWebImage/UIView+WebCache.m @@ -57,7 +57,7 @@ static char TAG_ACTIVITY_SHOW; if (!sself) { return; } - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ if (!sself) { return; } From c77adf449a9b7aa276cfb9ae980795dd835dc855 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 14:43:38 +0300 Subject: [PATCH 150/207] Replacing #781 - made sure all the completionBlocks called from `SDWebImageDownloaderOperation` are called on the main queue. Created 2 methods to simplify the code for calling the completions --- SDWebImage/SDWebImageDownloaderOperation.m | 58 +++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/SDWebImage/SDWebImageDownloaderOperation.m b/SDWebImage/SDWebImageDownloaderOperation.m index ae47146b..1bd82948 100644 --- a/SDWebImage/SDWebImageDownloaderOperation.m +++ b/SDWebImage/SDWebImageDownloaderOperation.m @@ -102,7 +102,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; [callbacks removeObjectIdenticalTo:[NSNull null]]; }); - return callbacks; + return [callbacks copy]; // strip mutability here } - (BOOL)cancel:(nullable id)token { @@ -175,9 +175,7 @@ typedef NSMutableDictionary SDCallbacksDictionary; [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; }); } else { - for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { - completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); - } + [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}]]; } #if SD_UIKIT @@ -286,10 +284,9 @@ didReceiveResponse:(NSURLResponse *)response dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; }); + + [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:((NSHTTPURLResponse *)response).statusCode userInfo:nil]]; - for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { - completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:((NSHTTPURLResponse *)response).statusCode userInfo:nil], YES); - } [self done]; } @@ -372,11 +369,8 @@ didReceiveResponse:(NSURLResponse *)response image = scaledImage; } CGImageRelease(partialImageRef); - dispatch_main_async_safe(^{ - for (SDWebImageDownloaderCompletedBlock completedBlock in [self callbacksForKey:kCompletedCallbackKey]) { - completedBlock(image, nil, nil, NO); - } - }); + + [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; } } @@ -408,7 +402,6 @@ didReceiveResponse:(NSURLResponse *)response #pragma mark NSURLSessionTaskDelegate - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { - NSArray *completionBlocks = [[self callbacksForKey:kCompletedCallbackKey] copy]; @synchronized(self) { self.dataTask = nil; dispatch_async(dispatch_get_main_queue(), ^{ @@ -420,11 +413,9 @@ didReceiveResponse:(NSURLResponse *)response } if (error) { - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { - completionBlock(nil, nil, error, YES); - } + [self callCompletionBlocksWithError:error]; } else { - if (completionBlocks.count > 0) { + if ([self callbacksForKey:kCompletedCallbackKey].count > 0) { /** * See #1608 and #1623 - apparently, there is a race condition on `NSURLCache` that causes a crash * Limited the calls to `cachedResponseForRequest:` only for cases where we should ignore the cached response @@ -432,9 +423,8 @@ didReceiveResponse:(NSURLResponse *)response * Note: responseFromCached is set to NO inside `willCacheResponse:`. This method doesn't get called for large images or images behind authentication */ if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached && [[NSURLCache sharedURLCache] cachedResponseForRequest:self.request]) { - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { - completionBlock(nil, nil, nil, YES); - } + // hack + [self callCompletionBlocksWithImage:nil imageData:nil error:nil finished:YES]; } else if (self.imageData) { UIImage *image = [UIImage sd_imageWithData:self.imageData]; NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; @@ -447,18 +437,12 @@ didReceiveResponse:(NSURLResponse *)response } } if (CGSizeEqualToSize(image.size, CGSizeZero)) { - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); - } + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]]; } else { - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { - completionBlock(image, self.imageData, nil, YES); - } + [self callCompletionBlocksWithImage:image imageData:self.imageData error:nil finished:YES]; } } else { - for (SDWebImageDownloaderCompletedBlock completionBlock in completionBlocks) { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); - } + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]]; } } } @@ -530,4 +514,20 @@ didReceiveResponse:(NSURLResponse *)response return self.options & SDWebImageDownloaderContinueInBackground; } +- (void)callCompletionBlocksWithError:(nullable NSError *)error { + [self callCompletionBlocksWithImage:nil imageData:nil error:error finished:YES]; +} + +- (void)callCompletionBlocksWithImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + error:(nullable NSError *)error + finished:(BOOL)finished { + NSArray *completionBlocks = [self callbacksForKey:kCompletedCallbackKey]; + dispatch_main_async_safe(^{ + for (SDWebImageDownloaderCompletedBlock completedBlock in completionBlocks) { + completedBlock(image, imageData, error, finished); + } + }); +} + @end From fdb8b2c1c66e406a56866373f4de492ac4aaafed Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 14:45:44 +0300 Subject: [PATCH 151/207] Small fix, this needs to be `strongOperation` --- SDWebImage/SDWebImageManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 68aca56d..e43867aa 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -273,7 +273,7 @@ // Image not in cache and download disallowed by delegate dispatch_main_async_safe(^{ __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation && !weakOperation.isCancelled) { + if (strongOperation && !strongOperation.isCancelled) { completedBlock(nil, nil, nil, SDImageCacheTypeNone, YES, url); } }); From 265ace4a24f6804a09c052bfbb1c09ea89ad34a3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 14:53:52 +0300 Subject: [PATCH 152/207] Improved readability in `SDWebImageManager` by creating `safelyRemoveOperationFromRunning:` method --- SDWebImage/SDWebImageManager.m | 38 ++++++++++++++-------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index e43867aa..b0810c61 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -145,10 +145,7 @@ operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { if (operation.isCancelled) { - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } - + [self safelyRemoveOperationFromRunning:operation]; return; } @@ -242,22 +239,13 @@ } if (finished) { - @synchronized (self.runningOperations) { - if (strongOperation) { - [self.runningOperations removeObject:strongOperation]; - } - } + [self safelyRemoveOperationFromRunning:strongOperation]; } }]; operation.cancelBlock = ^{ [self.imageDownloader cancel:subOperation]; - - @synchronized (self.runningOperations) { - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation) { - [self.runningOperations removeObject:strongOperation]; - } - } + __strong __typeof(weakOperation) strongOperation = weakOperation; + [self safelyRemoveOperationFromRunning:strongOperation]; }; } else if (cachedImage) { dispatch_main_async_safe(^{ @@ -266,9 +254,7 @@ completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); } }); - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } + [self safelyRemoveOperationFromRunning:operation]; } else { // Image not in cache and download disallowed by delegate dispatch_main_async_safe(^{ @@ -277,9 +263,7 @@ completedBlock(nil, nil, nil, SDImageCacheTypeNone, YES, url); } }); - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } + [self safelyRemoveOperationFromRunning:operation]; } }]; @@ -303,12 +287,20 @@ - (BOOL)isRunning { BOOL isRunning = NO; - @synchronized(self.runningOperations) { + @synchronized (self.runningOperations) { isRunning = (self.runningOperations.count > 0); } return isRunning; } +- (void)safelyRemoveOperationFromRunning:(nullable SDWebImageCombinedOperation*)operation { + @synchronized (self.runningOperations) { + if (operation) { + [self.runningOperations removeObject:operation]; + } + } +} + @end From 0c47bc3023b005cdc054cf1d23f10522d0fa9149 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 15:19:17 +0300 Subject: [PATCH 153/207] Replacing #781 - made sure completionBlock called from `SDWebImageManager` is called on the main queue. Created 2 methods to simplify the code for calling the completions --- SDWebImage/SDWebImageManager.m | 72 ++++++++++++++++------------------ 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index b0810c61..6603ea51 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -131,10 +131,7 @@ } if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; - completedBlock(nil, nil, error, SDImageCacheTypeNone, YES, url); - }); + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil] url:url]; return operation; } @@ -151,11 +148,9 @@ if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { if (cachedImage && options & SDWebImageRefreshCached) { - dispatch_main_async_safe(^{ - // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image - // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); - }); + // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image + // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. + [self callCompletionBlockForOperation:weakOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; } // download if no image or requested to refresh anyway, and download allowed by delegate @@ -180,11 +175,7 @@ // See #699 for more details // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data } else if (error) { - dispatch_main_async_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(nil, nil, error, SDImageCacheTypeNone, finished, url); - } - }); + [self callCompletionBlockForOperation:strongOperation completion:completedBlock error:error url:url]; if ( error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled @@ -218,23 +209,14 @@ // pass nil if the image was transformed, so we can recalculate the data from the image [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; } - - dispatch_main_async_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(transformedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); - } - }); + + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; }); } else { if (downloadedImage && finished) { [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; } - - dispatch_main_async_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(downloadedImage, downloadedData, nil, SDImageCacheTypeNone, finished, url); - } - }); + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; } } @@ -248,21 +230,13 @@ [self safelyRemoveOperationFromRunning:strongOperation]; }; } else if (cachedImage) { - dispatch_main_async_safe(^{ - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(cachedImage, cachedData, nil, cacheType, YES, url); - } - }); + __strong __typeof(weakOperation) strongOperation = weakOperation; + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; [self safelyRemoveOperationFromRunning:operation]; } else { // Image not in cache and download disallowed by delegate - dispatch_main_async_safe(^{ - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(nil, nil, nil, SDImageCacheTypeNone, YES, url); - } - }); + __strong __typeof(weakOperation) strongOperation = weakOperation; + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:nil data:nil error:nil cacheType:SDImageCacheTypeNone finished:YES url:url]; [self safelyRemoveOperationFromRunning:operation]; } }]; @@ -301,6 +275,28 @@ } } +- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation + completion:(nullable SDInternalCompletionBlock)completionBlock + error:(nullable NSError *)error + url:(nullable NSURL *)url { + [self callCompletionBlockForOperation:operation completion:completionBlock image:nil data:nil error:error cacheType:SDImageCacheTypeNone finished:YES url:url]; +} + +- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation + completion:(nullable SDInternalCompletionBlock)completionBlock + image:(nullable UIImage *)image + data:(nullable NSData *)data + error:(nullable NSError *)error + cacheType:(SDImageCacheType)cacheType + finished:(BOOL)finished + url:(nullable NSURL *)url { + dispatch_main_async_safe(^{ + if (operation && !operation.isCancelled && completionBlock) { + completionBlock(image, data, error, cacheType, finished, url); + } + }); +} + @end From a8ad2a5c4abbeec6f6b4690897c412304d0b0cf7 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 15:27:31 +0300 Subject: [PATCH 154/207] Made sure we don't crash here if the operation is nil at some point --- SDWebImage/UIView+WebCacheOperation.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SDWebImage/UIView+WebCacheOperation.m b/SDWebImage/UIView+WebCacheOperation.m index 7742473c..a515a74f 100644 --- a/SDWebImage/UIView+WebCacheOperation.m +++ b/SDWebImage/UIView+WebCacheOperation.m @@ -31,8 +31,10 @@ typedef NSMutableDictionary SDOperationsDictionary; - (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { if (key) { [self sd_cancelImageLoadOperationWithKey:key]; - SDOperationsDictionary *operationDictionary = [self operationDictionary]; - operationDictionary[key] = operation; + if (operation) { + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + operationDictionary[key] = operation; + } } } From 6d4e45bad7b41b70a48eb1b00b890db38abbaff7 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 21:01:31 +0300 Subject: [PATCH 155/207] Small update to the readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59397c3c..8aad68d4 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ This library provides an async image downloader with cache support. For convenie #### Backwards compatibility -- For iOS < 7.0, please use the last [3.x version - currently 3.8.1](https://github.com/rs/SDWebImage/tree/3.8.1) +- For iOS < 7.0, please use the last [3.x version - currently 3.8.2](https://github.com/rs/SDWebImage/tree/3.8.2) - For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). ## Getting Started From 67e071975544548923f26aea5cc551baca3a08a8 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 21:06:05 +0300 Subject: [PATCH 156/207] Update according to Xcode 8 recommended settings. Set the deployment target to iOS 8.0. No code signing. Enabled some warnings --- .../xcschemes/SDWebImage OSX Demo.xcscheme | 2 +- .../xcschemes/SDWebImage TV Demo.xcscheme | 2 +- .../xcschemes/SDWebImage Watch Demo.xcscheme | 2 +- SDWebImage.xcodeproj/project.pbxproj | 18 ++++++++++--- .../xcschemes/SDWebImage OSX.xcscheme | 2 +- .../xcschemes/SDWebImage iOS static.xcscheme | 2 +- .../xcschemes/SDWebImage iOS.xcscheme | 2 +- .../xcschemes/SDWebImage tvOS.xcscheme | 2 +- .../SDWebImage watchOS static.xcscheme | 2 +- .../xcschemes/SDWebImage watchOS.xcscheme | 2 +- .../xcschemes/SDWebImage iOS Demo.xcscheme | 2 +- .../xcshareddata/xcschemes/Tests.xcscheme | 27 ++++++++++++++++++- 12 files changed, 51 insertions(+), 14 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme index ec237513..50483312 100644 --- a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + From 13ffb2327c9a99d58b5d9ed48e86a48156ce7afb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 21:07:44 +0300 Subject: [PATCH 157/207] Stopped the simulators from being too verbose --- .../xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme | 7 +++++++ .../xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme | 7 +++++++ .../xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme | 7 +++++++ .../xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme | 7 +++++++ .../xcshareddata/xcschemes/Tests.xcscheme | 7 +++++++ 5 files changed, 35 insertions(+) diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme index 50483312..731d6d6b 100644 --- a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage OSX Demo.xcscheme @@ -61,6 +61,13 @@ ReferencedContainer = "container:SDWebImage Demo.xcodeproj"> + + + + diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme index 006de1c5..f1f2c53a 100644 --- a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage TV Demo.xcscheme @@ -61,6 +61,13 @@ ReferencedContainer = "container:SDWebImage Demo.xcodeproj"> + + + + diff --git a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme index dbd791e2..3c338b0b 100644 --- a/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme +++ b/Examples/SDWebImage Demo.xcodeproj/xcshareddata/xcschemes/SDWebImage Watch Demo.xcscheme @@ -101,6 +101,13 @@ ReferencedContainer = "container:SDWebImage Demo.xcodeproj"> + + + + diff --git a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme index 78aac33e..0ff9ab43 100644 --- a/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme +++ b/SDWebImage.xcworkspace/xcshareddata/xcschemes/SDWebImage iOS Demo.xcscheme @@ -61,6 +61,13 @@ ReferencedContainer = "container:Examples/SDWebImage Demo.xcodeproj"> + + + + diff --git a/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme index c9627064..24b43361 100644 --- a/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme +++ b/Tests/SDWebImage Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -62,6 +62,13 @@ ReferencedContainer = "container:SDWebImage Tests.xcodeproj"> + + + + From 2ec9dd7608547684b42a75a50785cb989c4937ef Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 21:16:48 +0300 Subject: [PATCH 158/207] The iOS demo uses the dynamic framework instead of the static one --- .../SDWebImage Demo.xcodeproj/project.pbxproj | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj index d7c0dee3..75cdb9ba 100644 --- a/Examples/SDWebImage Demo.xcodeproj/project.pbxproj +++ b/Examples/SDWebImage Demo.xcodeproj/project.pbxproj @@ -14,7 +14,6 @@ 4314D1B31D0E1182004B36C9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B11D0E1182004B36C9 /* Main.storyboard */; }; 4314D1B51D0E1182004B36C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4314D1B41D0E1182004B36C9 /* Assets.xcassets */; }; 4314D1BC1D0E11A8004B36C9 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 431739601CDFCC370008FEB9 /* SDWebImage.framework */; }; - 4317396A1CDFCCE20008FEB9 /* libSDWebImage iOS static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D741954841D00390AB0 /* libSDWebImage iOS static.a */; }; 43A629D31D0DFD000089D7DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D21D0DFD000089D7DD /* AppDelegate.m */; }; 43A629D61D0DFD000089D7DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D51D0DFD000089D7DD /* main.m */; }; 43A629D91D0DFD000089D7DD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A629D81D0DFD000089D7DD /* ViewController.m */; }; @@ -30,6 +29,7 @@ 43A62A0B1D0E07600089D7DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43A62A0A1D0E07600089D7DD /* Assets.xcassets */; }; 43A62A0F1D0E07600089D7DD /* SDWebImage Watch Demo.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 43A629EE1D0E07600089D7DD /* SDWebImage Watch Demo.app */; }; 43F04B3F1D9E468D003F9640 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4397D2751D0DDBE100BB2784 /* SDWebImage.framework */; }; + 43F100181D9EE18300F6E0CE /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A0FAAF1BDD16AC00B7582B /* SDWebImage.framework */; }; 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 537612E6155ABA44005750A4 /* ImageIO.framework */; }; 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53761299155AB74D005750A4 /* UIKit.framework */; }; 5376129C155AB74D005750A4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5376129B155AB74D005750A4 /* Foundation.framework */; }; @@ -68,13 +68,6 @@ remoteGlobalIDString = 00733A4C1BC487C000A5A117; remoteInfo = "WebImage tvOS"; }; - 431739681CDFCCDE0008FEB9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 53761307155AD0D5005750A4; - remoteInfo = SDWebImage; - }; 4397D2741D0DDBE100BB2784 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -124,6 +117,13 @@ remoteGlobalIDString = 431BB6891D06D2C1006A3455; remoteInfo = "SDWebImage watchOS"; }; + 43F100161D9EE17C00F6E0CE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 4A2CADFE1AB4BB5300B6BC39; + remoteInfo = "SDWebImage iOS"; + }; DA248D731954841D00390AB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DA248D6C1954841D00390AB0 /* SDWebImage.xcodeproj */; @@ -244,7 +244,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4317396A1CDFCCE20008FEB9 /* libSDWebImage iOS static.a in Frameworks */, + 43F100181D9EE18300F6E0CE /* SDWebImage.framework in Frameworks */, DA248D44195470FD00390AB0 /* MapKit.framework in Frameworks */, 531041C1157EAC8F00BBABC3 /* ImageIO.framework in Frameworks */, 5376129A155AB74D005750A4 /* UIKit.framework in Frameworks */, @@ -503,7 +503,7 @@ buildRules = ( ); dependencies = ( - 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */, + 43F100171D9EE17C00F6E0CE /* PBXTargetDependency */, 43A62A0E1D0E07600089D7DD /* PBXTargetDependency */, ); name = "SDWebImage iOS Demo"; @@ -708,11 +708,6 @@ name = "SDWebImage tvOS"; targetProxy = 4314D1BA1D0E11A0004B36C9 /* PBXContainerItemProxy */; }; - 431739691CDFCCDE0008FEB9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - targetProxy = 431739681CDFCCDE0008FEB9 /* PBXContainerItemProxy */; - }; 43A629EA1D0DFDCA0089D7DD /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "SDWebImage OSX"; @@ -733,6 +728,11 @@ name = "SDWebImage watchOS"; targetProxy = 43F04B3D1D9E467E003F9640 /* PBXContainerItemProxy */; }; + 43F100171D9EE17C00F6E0CE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage iOS"; + targetProxy = 43F100161D9EE17C00F6E0CE /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1145,7 +1145,7 @@ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", ); INFOPLIST_FILE = "SDWebImage Demo/SDWebImage Demo-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = ""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; @@ -1170,7 +1170,7 @@ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"", ); INFOPLIST_FILE = "SDWebImage Demo/SDWebImage Demo-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = "com.dailymotion.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; From 17ae79195312128ae77fce7798e82a6be22dba9b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 30 Sep 2016 21:36:34 +0300 Subject: [PATCH 159/207] Replaced #1640 - Added `sd_` prefix to the activity indicator related methods (`setShowActivityIndicatorView:`, `setIndicatorStyle:`, `showActivityIndicatorView`, `addActivityIndicator`, `removeActivityIndicator`) --- CHANGELOG.md | 1 + .../SDWebImage Demo/MasterViewController.m | 4 ++-- SDWebImage/UIView+WebCache.h | 10 ++++----- SDWebImage/UIView+WebCache.m | 22 +++++++++---------- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b3dba40..0de3d1be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ - Another `SDImageCache` clarification: `imageFromDiskCacheForKey:` used to also check the memory cache which I think is misleading. Now `imageFromDiskCacheForKey` only checks the disk cache and the new method `imageFromCacheForKey` checks both caches - Got rid of `removeImageForKey:` and `removeImageForKey:fromDisk:` from `SDImageCache` that looked sync but were async. Left only the 2 async ones - Removed `UIImageView` `sd_cancelCurrentHighlightedImageLoad` +- Added `sd_` prefix to the activity indicator related methods (`setShowActivityIndicatorView:`, `setIndicatorStyle:`, `showActivityIndicatorView`, `addActivityIndicator`, `removeActivityIndicator`) #1640 #### Features: diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index 33cc82ba..70fcc1e4 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -124,8 +124,8 @@ cell = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } - [cell.customImageView setShowActivityIndicatorView:YES]; - [cell.customImageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; + [cell.customImageView sd_setShowActivityIndicatorView:YES]; + [cell.customImageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray]; cell.customTextLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; [cell.customImageView sd_setImageWithURL:[NSURL URLWithString:_objects[indexPath.row]] diff --git a/SDWebImage/UIView+WebCache.h b/SDWebImage/UIView+WebCache.h index bab19f1e..d6a71068 100644 --- a/SDWebImage/UIView+WebCache.h +++ b/SDWebImage/UIView+WebCache.h @@ -61,18 +61,18 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima /** * Show activity UIActivityIndicatorView */ -- (void)setShowActivityIndicatorView:(BOOL)show; +- (void)sd_setShowActivityIndicatorView:(BOOL)show; /** * set desired UIActivityIndicatorViewStyle * * @param style The style of the UIActivityIndicatorView */ -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style; -- (BOOL)showActivityIndicatorView; -- (void)addActivityIndicator; -- (void)removeActivityIndicator; +- (BOOL)sd_showActivityIndicatorView; +- (void)sd_addActivityIndicator; +- (void)sd_removeActivityIndicator; #endif diff --git a/SDWebImage/UIView+WebCache.m b/SDWebImage/UIView+WebCache.m index 32a76ed8..ad2b54c4 100644 --- a/SDWebImage/UIView+WebCache.m +++ b/SDWebImage/UIView+WebCache.m @@ -46,14 +46,14 @@ static char TAG_ACTIVITY_SHOW; if (url) { // check if activityView is enabled or not - if ([self showActivityIndicatorView]) { - [self addActivityIndicator]; + if ([self sd_showActivityIndicatorView]) { + [self sd_addActivityIndicator]; } __weak __typeof(self)wself = self; id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { __strong __typeof (wself) sself = wself; - [sself removeActivityIndicator]; + [sself sd_removeActivityIndicator]; if (!sself) { return; } @@ -81,7 +81,7 @@ static char TAG_ACTIVITY_SHOW; [self sd_setImageLoadOperation:operation forKey:validOperationKey]; } else { dispatch_main_async_safe(^{ - [self removeActivityIndicator]; + [self sd_removeActivityIndicator]; if (completedBlock) { NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; completedBlock(nil, error, SDImageCacheTypeNone, url); @@ -136,28 +136,28 @@ static char TAG_ACTIVITY_SHOW; } #endif -- (void)setShowActivityIndicatorView:(BOOL)show { +- (void)sd_setShowActivityIndicatorView:(BOOL)show { objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); } -- (BOOL)showActivityIndicatorView { +- (BOOL)sd_showActivityIndicatorView { return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; } #if SD_UIKIT -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); } -- (int)getIndicatorStyle{ +- (int)sd_getIndicatorStyle{ return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; } #endif -- (void)addActivityIndicator { +- (void)sd_addActivityIndicator { #if SD_UIKIT if (!self.activityIndicator) { - self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self getIndicatorStyle]]; + self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]]; self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; dispatch_main_async_safe(^{ @@ -186,7 +186,7 @@ static char TAG_ACTIVITY_SHOW; #endif } -- (void)removeActivityIndicator { +- (void)sd_removeActivityIndicator { #if SD_UIKIT if (self.activityIndicator) { [self.activityIndicator removeFromSuperview]; From b7325c094b095e7ce7521274a94e571b42b365eb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 09:03:41 +0300 Subject: [PATCH 160/207] Updated the README --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8aad68d4..aa0b5c6a 100644 --- a/README.md +++ b/README.md @@ -180,10 +180,12 @@ In the source files where you need to use the library, import the header file: At this point your workspace should build without error. If you are having problem, post to the Issue and the community can help you solve it. -Future Enhancements -------------------- +## Author +- [Olivier Poitrey](https://github.com/rs) -- LRU memory cache cleanup instead of reset on memory warning +## Collaborators +- [Konstantinos K.](https://github.com/mythodeia) +- [Bogdan Poplauschi](https://github.com/bpoplauschi) ## Licenses @@ -198,4 +200,3 @@ All source code is licensed under the [MIT License](https://raw.github.com/rs/SD

- From 9cd6779b4bf040ee29609c1e0a8553ec153581a1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 09:19:32 +0300 Subject: [PATCH 161/207] Replaced #1537 - fixed a potential retain cycle in `SDWebImageManager`. --- SDWebImage/SDWebImageManager.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 6603ea51..abbeeaae 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -168,7 +168,7 @@ // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } - id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { + SDWebImageDownloadToken *subOperationToken = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (!strongOperation || strongOperation.isCancelled) { // Do nothing if the operation was cancelled @@ -224,8 +224,9 @@ [self safelyRemoveOperationFromRunning:strongOperation]; } }]; + __weak typeof(subOperationToken)weakSubOperationToken = subOperationToken; operation.cancelBlock = ^{ - [self.imageDownloader cancel:subOperation]; + [self.imageDownloader cancel:weakSubOperationToken]; __strong __typeof(weakOperation) strongOperation = weakOperation; [self safelyRemoveOperationFromRunning:strongOperation]; }; From c57cf7e6c94dc28b0eb4edec7cfc3c439ef3bbf1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 09:28:21 +0300 Subject: [PATCH 162/207] The shared objects (not really singletons) should allow subclassing, therefore the return type should be instancetype and not a fixed type. --- SDWebImage/SDImageCache.h | 2 +- SDWebImage/SDImageCache.m | 2 +- SDWebImage/SDWebImageDownloader.h | 2 +- SDWebImage/SDWebImageDownloader.m | 2 +- SDWebImage/SDWebImageManager.h | 2 +- SDWebImage/SDWebImageManager.m | 2 +- SDWebImage/SDWebImagePrefetcher.h | 2 +- SDWebImage/SDWebImagePrefetcher.m | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 2f710839..6f2cecff 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -63,7 +63,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return SDImageCache global instance */ -+ (nonnull SDImageCache *)sharedImageCache; ++ (nonnull instancetype)sharedImageCache; /** * Init a new cache store with a specific namespace diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index d037eb35..65315a0b 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -65,7 +65,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { #pragma mark - Singleton, init, dealloc -+ (nonnull SDImageCache *)sharedImageCache { ++ (nonnull instancetype)sharedImageCache { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index 8f49514b..6268ba01 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -124,7 +124,7 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB * * @return global shared instance of downloader class */ -+ (nonnull SDWebImageDownloader *)sharedDownloader; ++ (nonnull instancetype)sharedDownloader; /** * Set the default URL credential to be set for request operations. diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index 11bec99d..104d105a 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -54,7 +54,7 @@ } } -+ (nonnull SDWebImageDownloader *)sharedDownloader { ++ (nonnull instancetype)sharedDownloader { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index ce54bec7..eea87461 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -179,7 +179,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @return SDWebImageManager shared instance */ -+ (nonnull SDWebImageManager *)sharedManager; ++ (nonnull instancetype)sharedManager; /** * Allows to specify instance of cache and image downloader used with image manager. diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index abbeeaae..84658fe5 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -29,7 +29,7 @@ @implementation SDWebImageManager -+ (nonnull SDWebImageManager*)sharedManager { ++ (nonnull instancetype)sharedManager { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ diff --git a/SDWebImage/SDWebImagePrefetcher.h b/SDWebImage/SDWebImagePrefetcher.h index 0d656362..48eb2084 100644 --- a/SDWebImage/SDWebImagePrefetcher.h +++ b/SDWebImage/SDWebImagePrefetcher.h @@ -68,7 +68,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Return the global image prefetcher instance. */ -+ (nonnull SDWebImagePrefetcher *)sharedImagePrefetcher; ++ (nonnull instancetype)sharedImagePrefetcher; /** * Allows you to instantiate a prefetcher with any arbitrary image manager. diff --git a/SDWebImage/SDWebImagePrefetcher.m b/SDWebImage/SDWebImagePrefetcher.m index c9cb06ef..b66357f1 100644 --- a/SDWebImage/SDWebImagePrefetcher.m +++ b/SDWebImage/SDWebImagePrefetcher.m @@ -23,7 +23,7 @@ @implementation SDWebImagePrefetcher -+ (nonnull SDWebImagePrefetcher *)sharedImagePrefetcher { ++ (nonnull instancetype)sharedImagePrefetcher { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ From 7940577b123a1a5f76140cb28599a0c997d034f1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 12:13:31 +0300 Subject: [PATCH 163/207] Fix #1619 iOS10 Crash issue --- SDWebImage/SDImageCache.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 65315a0b..acd5ee6a 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -508,7 +508,7 @@ FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; // Skip directories and errors. - if (error || [resourceValues[NSURLIsDirectoryKey] boolValue]) { + if (error || !resourceValues || [resourceValues[NSURLIsDirectoryKey] boolValue]) { continue; } From 62180db82881972509e154d5bc70f6bd21227dd3 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 12:29:12 +0300 Subject: [PATCH 164/207] #1089 properly stated on all API docs that the progressBlock is called on a background queue --- SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h | 1 + SDWebImage/SDWebImageDownloader.h | 1 + SDWebImage/SDWebImageManager.h | 1 + SDWebImage/UIImageView+HighlightedWebCache.h | 1 + SDWebImage/UIImageView+WebCache.h | 2 ++ SDWebImage/UIView+WebCache.h | 1 + 6 files changed, 7 insertions(+) diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index 3bb55c47..d5f08c34 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -116,6 +116,7 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index 960b5bc2..bcd248d6 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -191,6 +191,7 @@ typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterB * @param url The URL to the image to download * @param options The options to be used for this download * @param progressBlock A block called repeatedly while the image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called once the download is completed. * If the download succeeded, the image parameter is set, in case of error, * error parameter is set with the error. The last parameter is always YES diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index eea87461..8c2cd248 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -193,6 +193,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * @param url The URL to the image * @param options A mask to specify options to use for this request * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. * * This parameter is required. diff --git a/SDWebImage/UIImageView+HighlightedWebCache.h b/SDWebImage/UIImageView+HighlightedWebCache.h index c76f4932..ceb71c2a 100644 --- a/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/SDWebImage/UIImageView+HighlightedWebCache.h @@ -77,6 +77,7 @@ * @param url The url for the image. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean diff --git a/SDWebImage/UIImageView+WebCache.h b/SDWebImage/UIImageView+WebCache.h index 867a9375..b1d954f9 100644 --- a/SDWebImage/UIImageView+WebCache.h +++ b/SDWebImage/UIImageView+WebCache.h @@ -141,6 +141,7 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean @@ -162,6 +163,7 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean diff --git a/SDWebImage/UIView+WebCache.h b/SDWebImage/UIView+WebCache.h index d6a71068..4c575194 100644 --- a/SDWebImage/UIView+WebCache.h +++ b/SDWebImage/UIView+WebCache.h @@ -35,6 +35,7 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima * @param operationKey A string to be used as the operation key. If nil, will use the class name * @param setImageBlock Block used for custom set image code * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean From ed5f018c2be8c3939d56e22ef9558a0acd1b10ef Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 12:40:50 +0300 Subject: [PATCH 165/207] Fixed the tests - were failing because of the #984 changes --- Tests/Tests/SDWebImageDownloaderTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDWebImageDownloaderTests.m b/Tests/Tests/SDWebImageDownloaderTests.m index dec10686..81d96e07 100644 --- a/Tests/Tests/SDWebImageDownloaderTests.m +++ b/Tests/Tests/SDWebImageDownloaderTests.m @@ -211,7 +211,7 @@ SDWebImageDownloaderOperation *operation = [[SDWebImageDownloaderOperation alloc] initWithRequest:request inSession:nil options:0]; - [operation addHandlersForProgress:^(NSInteger receivedSize, NSInteger expectedSize) { + [operation addHandlersForProgress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL *imageURL) { } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) { if (image && data && !error && finished) { From d6fa29c88a9d4febc2c9d8fa49ce23c68334d0aa Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 13:08:14 +0300 Subject: [PATCH 166/207] The Carthage build phase takes too long (5 minutes). Removing it. --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ee50b173..8b0271b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,7 +48,5 @@ script: - xcodebuild clean -workspace SDWebImage.xcworkspace -scheme 'SDWebImage iOS static' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c - xcodebuild test -workspace SDWebImage.xcworkspace -scheme 'Tests' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' -configuration Debug | xcpretty -c - - carthage build --no-skip-current - after_success: - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From 357e424166c6e2c6c0920e6c27d3e4ee5dcb3fb1 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 15:25:08 +0300 Subject: [PATCH 167/207] Updated the README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aa0b5c6a..0120da2f 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,12 @@ [![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/3.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/3.3) +[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage) [![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) -[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/testing/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) +[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/master/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) -This library provides an async image downloader with cache support. For convenience, we added categories for some `UIControl` elements like `UIImageView`. +This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like `UIImageView`, `UIButton`, `MKAnnotationView`. ## Features @@ -29,7 +29,7 @@ This library provides an async image downloader with cache support. For convenie ## Supported Image Formats - Image formats supported by UIImage (JPEG, PNG, ...), including GIF -- WebP format (use the `WebP` subspec) +- WebP format, including animated WebP (use the `WebP` subspec) ## Requirements From a347abad8908bc23728803696c93e89555f2eb70 Mon Sep 17 00:00:00 2001 From: Alexander Belyavskiy Date: Mon, 3 Oct 2016 09:29:24 +0300 Subject: [PATCH 168/207] Fix FLAnimatedImageView+WebCache.m not got compiled Because of missing SD_UIKIT definition. --- SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m index 827abfd5..04a1c858 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.m @@ -6,9 +6,9 @@ * file that was distributed with this source code. */ -#if SD_UIKIT - #import "FLAnimatedImageView+WebCache.h" + +#if SD_UIKIT #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" #import "UIView+WebCache.h" @@ -53,9 +53,9 @@ options:options operationKey:nil setImageBlock:^(UIImage *image, NSData *imageData) { - SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; + SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:imageData]; if (imageFormat == SDImageFormatGIF) { - weakSelf.animatedImage = [FLAnimatedImage animatedImageWithGIFData:data]; + weakSelf.animatedImage = [FLAnimatedImage animatedImageWithGIFData:imageData]; weakSelf.image = nil; } else { weakSelf.image = image; From 945f8691ff10099e04d444f54e6487c7e0879e3c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 1 Oct 2016 16:58:37 +0300 Subject: [PATCH 169/207] Fixed documentation warning, param name is `completionBlock` --- SDWebImage/SDImageCache.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/SDWebImage/SDImageCache.h b/SDWebImage/SDImageCache.h index 6f2cecff..9ae2eb44 100644 --- a/SDWebImage/SDImageCache.h +++ b/SDWebImage/SDImageCache.h @@ -98,9 +98,9 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param completion A block executed after the operation is finished + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param completionBlock A block executed after the operation is finished */ - (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key @@ -109,10 +109,10 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES - * @param completion A block executed after the operation is finished + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completionBlock A block executed after the operation is finished */ - (void)storeImage:(nullable UIImage *)image forKey:(nullable NSString *)key @@ -122,13 +122,13 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param imageData The image data as returned by the server, this representation will be used for disk storage - * instead of converting the given image object into a storable/compressed image format in order - * to save quality and CPU - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES - * @param completion A block executed after the operation is finished + * @param image The image to store + * @param imageData The image data as returned by the server, this representation will be used for disk storage + * instead of converting the given image object into a storable/compressed image format in order + * to save quality and CPU + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completionBlock A block executed after the operation is finished */ - (void)storeImage:(nullable UIImage *)image imageData:(nullable NSData *)imageData From 7e0964f8d90dcd80d535c52dd9f6d5fa7432052b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 4 Oct 2016 16:13:08 +0300 Subject: [PATCH 170/207] Made sure SDWebImageCompat.h is imported in all the headers --- SDWebImage/NSData+ImageContentType.h | 1 + SDWebImage/SDImageCacheConfig.h | 1 + 2 files changed, 2 insertions(+) diff --git a/SDWebImage/NSData+ImageContentType.h b/SDWebImage/NSData+ImageContentType.h index f446f869..b23b0bd4 100644 --- a/SDWebImage/NSData+ImageContentType.h +++ b/SDWebImage/NSData+ImageContentType.h @@ -8,6 +8,7 @@ */ #import +#import "SDWebImageCompat.h" typedef NS_ENUM(NSInteger, SDImageFormat) { SDImageFormatUndefined = -1, diff --git a/SDWebImage/SDImageCacheConfig.h b/SDWebImage/SDImageCacheConfig.h index a8883ecb..fd83527d 100644 --- a/SDWebImage/SDImageCacheConfig.h +++ b/SDWebImage/SDImageCacheConfig.h @@ -7,6 +7,7 @@ // #import +#import "SDWebImageCompat.h" @interface SDImageCacheConfig : NSObject From 9c0c31f5247727b1c232ffe6997566c36fbd910d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Tue, 4 Oct 2016 16:48:12 +0300 Subject: [PATCH 171/207] Updated the test for FLAnimatedImage --- Tests/Tests/SDCategoriesTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Tests/SDCategoriesTests.m b/Tests/Tests/SDCategoriesTests.m index a75df041..b0648836 100644 --- a/Tests/Tests/SDCategoriesTests.m +++ b/Tests/Tests/SDCategoriesTests.m @@ -137,7 +137,7 @@ expect(error).to.beNil(); expect(originalImageURL).to.equal(imageURL); - expect(imageView.image).to.equal(image); + expect(imageView.animatedImage).toNot.beNil(); [expectation fulfill]; }]; [self waitForExpectationsWithTimeout:kAsyncTestTimeout handler:nil]; From cf7a5db3c670549ed412b1d3e822a87e50c11d9f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 5 Oct 2016 11:41:14 +0300 Subject: [PATCH 172/207] Added the Docs folder to the Xcode workspace --- SDWebImage.xcworkspace/contents.xcworkspacedata | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SDWebImage.xcworkspace/contents.xcworkspacedata b/SDWebImage.xcworkspace/contents.xcworkspacedata index 1fbc3a04..b2e04319 100644 --- a/SDWebImage.xcworkspace/contents.xcworkspacedata +++ b/SDWebImage.xcworkspace/contents.xcworkspacedata @@ -19,6 +19,9 @@ + + From 9ede7034cb64370da7c2c775e02bbfce3e5692bb Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 5 Oct 2016 11:50:23 +0300 Subject: [PATCH 173/207] Added a draft for the Migration Guide document. --- Docs/SDWebImage-4.0-Migration-guide.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Docs/SDWebImage-4.0-Migration-guide.md diff --git a/Docs/SDWebImage-4.0-Migration-guide.md b/Docs/SDWebImage-4.0-Migration-guide.md new file mode 100644 index 00000000..10f51458 --- /dev/null +++ b/Docs/SDWebImage-4.0-Migration-guide.md @@ -0,0 +1,25 @@ +## SDWebImage 4.0 Migration Guide + +- To be created based on [CHANGELOG.md - 4.0.0 Backwards incompatible changes](https://github.com/rs/SDWebImage/blob/master/CHANGELOG.md#backwards-incompatible-changes) +- See [Migration guide #1590](https://github.com/rs/SDWebImage/issues/1590) + +### New requirements: Xcode 8, iOS 7, Mac OS X 10.8, watchOS 2, tvOS 9 +- ... + +### Classes removed +### Classes modified +### Classes added + +##Migration + +### Simple case + +SDWebImage 3.x +``` +[imageView sd_setImageWithURL:url]; +``` + +SDWebImage 4.x +``` +[imageView sd_setImageWithURL:url]; +``` From 7edd26548ccc68dbc88f28cc168dc8dd44a9e4bf Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 5 Oct 2016 11:50:49 +0300 Subject: [PATCH 174/207] Updated the README backwards compatibility section and linked the 4.0 Migration Guide --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0120da2f..8ba76190 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ This library provides an async image downloader with cache support. For convenie #### Backwards compatibility -- For iOS < 7.0, please use the last [3.x version - currently 3.8.2](https://github.com/rs/SDWebImage/tree/3.8.2) +- For iOS 5 and 6, use [any 3.x version up to 3.7.6](https://github.com/rs/SDWebImage/tree/3.7.6) - For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). ## Getting Started @@ -52,6 +52,7 @@ This library provides an async image downloader with cache support. For convenie - Read [How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) - Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` - Get to the [installation steps](https://github.com/rs/SDWebImage#installation) +- Read the [SDWebImage 4.0 Migration Guide](https://raw.github.com/rs/SDWebImage/master/Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x ## Who Uses It - Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. From 7361725111d1f09075a0530d0d4db086d80ef12d Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Wed, 5 Oct 2016 12:24:48 +0300 Subject: [PATCH 175/207] Changelog update --- CHANGELOG.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0de3d1be..4784164e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ -## [4.0.0 - In progress](https://github.com/rs/SDWebImage/tree/4.x) +## [4.0.0 beta - New platforms (Mac OS X and watchOS) + refactoring, on Oct 5th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta) + +See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) #### Infrastructure: @@ -15,7 +17,7 @@ - `SDWebImage iOS Demo` - `SDWebImage TV Demo` - `SDWebImage Watch Demo` -- bumped `libwep` version to `0.5.0` +- bumped `libwep` version to `0.5.1` - improved unit testing code coverage (*35%* -> **77%**) and integrated [CodeCov](https://codecov.io/gh/rs/SDWebImage) #### Backwards incompatible changes @@ -61,6 +63,9 @@ - Got rid of `removeImageForKey:` and `removeImageForKey:fromDisk:` from `SDImageCache` that looked sync but were async. Left only the 2 async ones - Removed `UIImageView` `sd_cancelCurrentHighlightedImageLoad` - Added `sd_` prefix to the activity indicator related methods (`setShowActivityIndicatorView:`, `setIndicatorStyle:`, `showActivityIndicatorView`, `addActivityIndicator`, `removeActivityIndicator`) #1640 +- Use `dispatch_main_async_safe` for all the completion blocks on the main queue (used to be `dispatch_sync`) - avoiding locks. +- Removed `dispatch_main_sync_safe` as it can be mistakenly used +- Add `url` as param to progress block `SDWebImageDownloaderProgressBlock` - #984 #### Features: @@ -76,13 +81,24 @@ - Created `SDWebImageDownloaderOperationInterface` to describe the behavior of a downloader operation. Any custom operation must conform to this protocol df3b6a5 - Refactored all the duplicate code from our `WebCache` categories into a `UIView` `WebCache` category. All the other categories will make calls to this one. Customization of setting the image is done via the `setImageBlock` and the `operationKey` e1840c3 - Due to the change above, the activity indicator can now be added to `UIButton`, `MKAnnotationView`, `UIImageView` +- Animated WebP support #1438 +- The shared objects (not really singletons) should allow subclassing, therefore the return type of the shared resource method should be `instancetype` and not a fixed type - c57cf7e +- Allow to specify `NSURLSessionConfiguration` for `SDWebImageDownloader` #1654 +- Add `url` as param to progress block `SDWebImageDownloaderProgressBlock` - #984 #### Fixes: - Fix multiple requests for same image and then canceling one #883 + 8a78586 - Fixed #1444 and the master build thanks to [@kenmaz](https://github.com/kenmaz/SDWebImage/commit/5034c334be50765dfe4e97c48bcb74ef64175188) - Fixed an issue with the `SDWebImageDownloaderOperation` : `cancelInternal` was not called because of the old mechanism rellying on the `thread` property - probably because that thread did not have a runloop. Removed that and now cancelInternal is called as expected f4bdae6 - +- Replaced #781 on replacing dispatch_sync with dispatch_async for the main queue 062e50a f7e8246 c77adf4 fdb8b2c 265ace4 0c47bc3. Check for main queue instead of main thread. +- Fixed #1619 iOS 10 crash (`setObjectForKey: object cannot be nil`) - #1676 7940577 +- Fixed #1326 #1424 (`Carthage bitcode issue`) - #1593 +- Fixed #1639 via #1657 (`Add support for downloading images behind redirect`) +- Replaced #1537 via 9cd6779 - fixed a potential retain cycle +- Updated `dispatch_main_async_safe` macro in order to avoid redefinition when included as Pod +- Fixed #1089 by updating the docs on the calling queue for the `progressBlock` (background queue) +- Fixed a compilation issue on `FLAnimatedImageView+WebCache` - #1687 ## [3.8.2 Patch release for 3.8.0 on Sep 5th, 2016](https://github.com/rs/SDWebImage/releases/tag/3.8.2) From 00bf467eb79bb97024eba7393169030a17b98018 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 15:08:53 +0300 Subject: [PATCH 176/207] Update for #787 Add an option to scale down large images on iOS - code cleanup --- SDWebImage/SDWebImageDecoder.m | 200 ++++++++++++++++----------------- 1 file changed, 96 insertions(+), 104 deletions(-) diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index fef1cbe0..86ef032f 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -9,56 +9,28 @@ #import "SDWebImageDecoder.h" +@implementation UIImage (ForceDecode) + #if SD_UIKIT || SD_WATCH static const size_t kBytesPerPixel = 4; static const size_t kBitsPerComponent = 8; -#endif - - -@implementation UIImage (ForceDecode) + (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { - if (image == nil) { return nil; } // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error + if (![UIImage shouldDecodeImage:image]) { + return image; + } -#if SD_MAC - return image; -#elif SD_UIKIT || SD_WATCH - - // while downloading huge amount of images - // autorelease the bitmap context - // and all vars to help system to free memory - // when there are memory warning. - // on iOS7, do not forget to call - // [[SDImageCache sharedImageCache] clearMemory]; + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; @autoreleasepool{ - if (image.images != nil) { return image; } // do not decode animated images CGImageRef imageRef = image.CGImage; - - CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); - BOOL anyAlpha = (alpha == kCGImageAlphaFirst || - alpha == kCGImageAlphaLast || - alpha == kCGImageAlphaPremultipliedFirst || - alpha == kCGImageAlphaPremultipliedLast); - if (anyAlpha) { return image; } // do not decode images with alpha - - // current - CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); - CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); - - BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || - imageColorSpaceModel == kCGColorSpaceModelMonochrome || - imageColorSpaceModel == kCGColorSpaceModelCMYK || - imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) { - colorspaceRef = CGColorSpaceCreateDeviceRGB(); - } + CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:imageRef]; size_t width = CGImageGetWidth(imageRef); size_t height = CGImageGetHeight(imageRef); size_t bytesPerRow = kBytesPerPixel * width; - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast // to create bitmap graphics contexts without alpha info. @@ -77,16 +49,11 @@ static const size_t kBitsPerComponent = 8; scale:image.scale orientation:image.imageOrientation]; - if (unsupportedColorSpace) { - CGColorSpaceRelease(colorspaceRef); - } - CGContextRelease(context); CGImageRelease(imageRefWithoutAlpha); return imageWithoutAlpha; } -#endif } /* @@ -95,7 +62,7 @@ static const size_t kBitsPerComponent = 8; * Suggested value for iPad2 and iPhone 4: 120. * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. */ -#define kDestImageSizeMB 60.0f +static const CGFloat kDestImageSizeMB = 60.0f; /* * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set @@ -103,47 +70,29 @@ static const size_t kBitsPerComponent = 8; * Suggested value for iPad2 and iPhone 4: 40. * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. */ -#define kSourceImageTileSizeMB 20.0f +static const CGFloat kSourceImageTileSizeMB = 20.0f; -#define bytesPerMB 1048576.0f -#define pixelsPerMB ( bytesPerMB / kBytesPerPixel ) -#define destTotalPixels kDestImageSizeMB * pixelsPerMB -#define tileTotalPixels kSourceImageTileSizeMB * pixelsPerMB -#define destSeemOverlap 2.0f // the numbers of pixels to overlap the seems where tiles meet. +static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; +static const CGFloat kPixelsPerMB = kBytesPerMB * kBytesPerPixel; +static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; +static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; + +static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet. + (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { - if (image == nil) { return nil; } // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error + if (![UIImage shouldDecodeImage:image]) { + return image; + } -#if SD_MAC - return image; -#elif SD_UIKIT || SD_WATCH - - BOOL shouldDownSize = ({ - BOOL shouldDoIt = YES; - - CGImageRef sourceImageRef = image.CGImage; - CGSize sourceResolution = CGSizeZero; - sourceResolution.width = CGImageGetWidth(sourceImageRef); - sourceResolution.height = CGImageGetHeight(sourceImageRef); - float sourceTotalPixels = sourceResolution.width * sourceResolution.height; - float imageScale = destTotalPixels / sourceTotalPixels; - if (imageScale < 1) { - shouldDoIt = YES; - } else { - shouldDoIt = NO; - } - shouldDoIt; - }); - - if (!shouldDownSize) { + if (![UIImage shouldScaleDownImage:image]) { return [UIImage decodedImageWithImage:image]; } CGContextRef destContext; + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; @autoreleasepool { - if (image.images != nil) { return image; } // do not decode animated images - CGImageRef sourceImageRef = image.CGImage; CGSize sourceResolution = CGSizeZero; @@ -153,42 +102,22 @@ static const size_t kBitsPerComponent = 8; // Determine the scale ratio to apply to the input image // that results in an output image of the defined size. // see kDestImageSizeMB, and how it relates to destTotalPixels. - float imageScale = destTotalPixels / sourceTotalPixels; + float imageScale = kDestTotalPixels / sourceTotalPixels; CGSize destResolution = CGSizeZero; destResolution.width = (int)(sourceResolution.width*imageScale); destResolution.height = (int)(sourceResolution.height*imageScale); - CGImageAlphaInfo alpha = CGImageGetAlphaInfo(sourceImageRef); - BOOL anyAlpha = (alpha == kCGImageAlphaFirst || - alpha == kCGImageAlphaLast || - alpha == kCGImageAlphaPremultipliedFirst || - alpha == kCGImageAlphaPremultipliedLast); - if (anyAlpha) { return image; } // do not decode images with alpha - // current color space - CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(sourceImageRef)); - CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(sourceImageRef); - - BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || - imageColorSpaceModel == kCGColorSpaceModelMonochrome || - imageColorSpaceModel == kCGColorSpaceModelCMYK || - imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) { - colorspaceRef = CGColorSpaceCreateDeviceRGB(); - } + CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:sourceImageRef]; size_t bytesPerRow = kBytesPerPixel * destResolution.width; // Allocate enough pixel data to hold the output image. void* destBitmapData = malloc( bytesPerRow * destResolution.height ); if (destBitmapData == NULL) { - if (unsupportedColorSpace) { - CGColorSpaceRelease(colorspaceRef); - } return image; } - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast // to create bitmap graphics contexts without alpha info. @@ -200,10 +129,6 @@ static const size_t kBitsPerComponent = 8; colorspaceRef, kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - if (unsupportedColorSpace) { - CGColorSpaceRelease(colorspaceRef); - } - if (destContext == NULL) { free( destBitmapData ); return image; @@ -224,7 +149,7 @@ static const size_t kBitsPerComponent = 8; // The source tile height is dynamic. Since we specified the size // of the source tile in MB, see how many rows of pixels high it // can be given the input image width. - sourceTile.size.height = (int)( tileTotalPixels / sourceTile.size.width ); + sourceTile.size.height = (int)(kTileTotalPixels / sourceTile.size.width ); sourceTile.origin.x = 0.0f; // The output tile is the same proportions as the input tile, but // scaled to image scale. @@ -234,7 +159,7 @@ static const size_t kBitsPerComponent = 8; destTile.origin.x = 0.0f; // The source seem overlap is proportionate to the destination seem overlap. // this is the amount of pixels to overlap each tile as we assemble the ouput image. - float sourceSeemOverlap = (int)((destSeemOverlap/destResolution.height)*sourceResolution.height); + float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height); CGImageRef sourceTileImageRef; // calculate the number of read/write operations required to assemble the // output image. @@ -248,11 +173,11 @@ static const size_t kBitsPerComponent = 8; // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. float sourceTileHeightMinusOverlap = sourceTile.size.height; sourceTile.size.height += sourceSeemOverlap; - destTile.size.height += destSeemOverlap; + destTile.size.height += kDestSeemOverlap; for( int y = 0; y < iterations; ++y ) { @autoreleasepool { sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; - destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + destSeemOverlap); + destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap); sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); if( y == iterations - 1 && remainder ) { float dify = destTile.size.height; @@ -277,8 +202,75 @@ static const size_t kBitsPerComponent = 8; } return destImage; } -#endif } ++ (BOOL)shouldDecodeImage:(nullable UIImage *)image { + // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error + if (image == nil) { + return NO; + } + + // do not decode animated images + if (image.images != nil) { + return NO; + } + + CGImageRef imageRef = image.CGImage; + + CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); + BOOL anyAlpha = (alpha == kCGImageAlphaFirst || + alpha == kCGImageAlphaLast || + alpha == kCGImageAlphaPremultipliedFirst || + alpha == kCGImageAlphaPremultipliedLast); + // do not decode images with alpha + if (anyAlpha) { + return NO; + } + + return YES; +} + ++ (BOOL)shouldScaleDownImage:(nonnull UIImage *)image { + BOOL shouldScaleDown = YES; + + CGImageRef sourceImageRef = image.CGImage; + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + float imageScale = kDestTotalPixels / sourceTotalPixels; + if (imageScale < 1) { + shouldScaleDown = YES; + } else { + shouldScaleDown = NO; + } + + return shouldScaleDown; +} + ++ (CGColorSpaceRef)colorSpaceForImageRef:(CGImageRef)imageRef { + // current + CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); + CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); + + BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || + imageColorSpaceModel == kCGColorSpaceModelMonochrome || + imageColorSpaceModel == kCGColorSpaceModelCMYK || + imageColorSpaceModel == kCGColorSpaceModelIndexed); + if (unsupportedColorSpace) { + colorspaceRef = CGColorSpaceCreateDeviceRGB(); + CFAutorelease(colorspaceRef); + } + return colorspaceRef; +} +#elif SD_MAC ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { + return image; +} + ++ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { + return image; +} +#endif @end From af3468319156da0f7bf4de2136bdb8de2901039a Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 15:16:44 +0300 Subject: [PATCH 177/207] No more carthage, d6fa29c removed it, now also remove installing it via brew --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8b0271b8..4c7b9813 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,6 @@ before_install: - xcpretty --version - xcodebuild -version - xcodebuild -showsdks - - brew install carthage script: - set -o pipefail From efad1e5cd4d6956e2db9e560a436456be9a8b909 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 15:59:37 +0300 Subject: [PATCH 178/207] Fixed a bug introduced by 00bf467 --- SDWebImage/SDWebImageDecoder.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 86ef032f..7a435352 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -73,7 +73,7 @@ static const CGFloat kDestImageSizeMB = 60.0f; static const CGFloat kSourceImageTileSizeMB = 20.0f; static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; -static const CGFloat kPixelsPerMB = kBytesPerMB * kBytesPerPixel; +static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel; static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; From 9879ddf0dcc1338a6a93d18e032f78100f638f7e Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 16:00:02 +0300 Subject: [PATCH 179/207] Test xcodeproj updated to Xcode 8 --- .../project.pbxproj | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index dfb35fc0..bd3afdb9 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -160,7 +160,7 @@ DA248D461954721A00390AB0 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0800; }; buildConfigurationList = DA248D491954721A00390AB0 /* Build configuration list for PBXProject "SDWebImage Tests" */; compatibilityVersion = "Xcode 3.2"; @@ -274,7 +274,24 @@ DA248D4A1954721A00390AB0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; }; @@ -283,6 +300,23 @@ DA248D4B1954721A00390AB0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; }; name = Release; From 8d1a0ae0917c7d7c40c2f5309c56fe5ffe2687cf Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 16:00:43 +0300 Subject: [PATCH 180/207] Added tests for the scale down decoding + test image and updated a bit the other decoder tests --- .../project.pbxproj | 4 +++ Tests/Tests/SDWebImageDecoderTests.m | 25 ++++++++++++++++++ Tests/Tests/TestImageLarge.jpg | Bin 0 -> 447945 bytes 3 files changed, 29 insertions(+) create mode 100644 Tests/Tests/TestImageLarge.jpg diff --git a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj index bd3afdb9..1dfc166d 100644 --- a/Tests/SDWebImage Tests.xcodeproj/project.pbxproj +++ b/Tests/SDWebImage Tests.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 433BBBBB1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */; }; 4369C1D11D97F80F007E863A /* SDWebImagePrefetcherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */; }; 4369C2741D9804B1007E863A /* SDCategoriesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4369C2731D9804B1007E863A /* SDCategoriesTests.m */; }; + 43828A451DA67F9900000E62 /* TestImageLarge.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 43828A441DA67F9900000E62 /* TestImageLarge.jpg */; }; 53F0240D24D359127872F512 /* Pods_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DAAA77E3CA7387F702040D9 /* Pods_Tests.framework */; }; 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */; }; DA248D57195472AA00390AB0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA248D56195472AA00390AB0 /* XCTest.framework */; }; @@ -34,6 +35,7 @@ 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = MonochromeTestImage.jpg; sourceTree = ""; }; 4369C1D01D97F80F007E863A /* SDWebImagePrefetcherTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcherTests.m; sourceTree = ""; }; 4369C2731D9804B1007E863A /* SDCategoriesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDCategoriesTests.m; sourceTree = ""; }; + 43828A441DA67F9900000E62 /* TestImageLarge.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImageLarge.jpg; sourceTree = ""; }; 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = TestImage.jpg; sourceTree = ""; }; 700B00151041D7EE118B1ABD /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; A0085854E7D88C98F2F6C9FC /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.release.xcconfig"; sourceTree = ""; }; @@ -108,6 +110,7 @@ 433BBBBA1D7EFA8B0086B6E9 /* MonochromeTestImage.jpg */, 433BBBB61D7EF8200086B6E9 /* TestImage.gif */, 5F7F38AC1AE2A77A00B0E330 /* TestImage.jpg */, + 43828A441DA67F9900000E62 /* TestImageLarge.jpg */, 433BBBB81D7EF8260086B6E9 /* TestImage.png */, DA248D5D195472AA00390AB0 /* Supporting Files */, DA248D68195475D800390AB0 /* SDImageCacheTests.m */, @@ -185,6 +188,7 @@ buildActionMask = 2147483647; files = ( 5F7F38AD1AE2A77A00B0E330 /* TestImage.jpg in Resources */, + 43828A451DA67F9900000E62 /* TestImageLarge.jpg in Resources */, 433BBBB71D7EF8200086B6E9 /* TestImage.gif in Resources */, DA248D61195472AA00390AB0 /* InfoPlist.strings in Resources */, 433BBBB91D7EF8260086B6E9 /* TestImage.png in Resources */, diff --git a/Tests/Tests/SDWebImageDecoderTests.m b/Tests/Tests/SDWebImageDecoderTests.m index b9d24667..384be6ff 100644 --- a/Tests/Tests/SDWebImageDecoderTests.m +++ b/Tests/Tests/SDWebImageDecoderTests.m @@ -30,6 +30,8 @@ UIImage *decodedImage = [UIImage decodedImageWithImage:image]; expect(decodedImage).toNot.beNil(); expect(decodedImage).toNot.equal(image); + expect(decodedImage.size.width).to.equal(image.size.width); + expect(decodedImage.size.height).to.equal(image.size.height); } - (void)test03ThatDecodedImageWithImageDoesNotDecodeAnimatedImages { @@ -55,6 +57,29 @@ UIImage *decodedImage = [UIImage decodedImageWithImage:image]; expect(decodedImage).toNot.beNil(); expect(decodedImage).toNot.equal(image); + expect(decodedImage.size.width).to.equal(image.size.width); + expect(decodedImage.size.height).to.equal(image.size.height); +} + +- (void)test06ThatDecodeAndScaleDownImageWorks { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImageLarge" ofType:@"jpg"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *decodedImage = [UIImage decodedAndScaledDownImageWithImage:image]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).toNot.equal(image); + expect(decodedImage.size.width).toNot.equal(image.size.width); + expect(decodedImage.size.height).toNot.equal(image.size.height); + expect(decodedImage.size.width * decodedImage.size.height).to.beLessThanOrEqualTo(60 * 1024 * 1024 / 4); // how many pixels in 60 megs +} + +- (void)test07ThatDecodeAndScaleDownImageDoesNotScaleSmallerImage { + NSString * testImagePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestImage" ofType:@"jpg"]; + UIImage *image = [UIImage imageWithContentsOfFile:testImagePath]; + UIImage *decodedImage = [UIImage decodedAndScaledDownImageWithImage:image]; + expect(decodedImage).toNot.beNil(); + expect(decodedImage).toNot.equal(image); + expect(decodedImage.size.width).to.equal(image.size.width); + expect(decodedImage.size.height).to.equal(image.size.height); } @end diff --git a/Tests/Tests/TestImageLarge.jpg b/Tests/Tests/TestImageLarge.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b636ee7c5704a023f4f493b38233733f7e5effb GIT binary patch literal 447945 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žU${EV<Zx4sbDUKZf1D7y%vR>3knr`fQ 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

BwqQnCQAh03+r?F4p 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

qp^hjEns6MVYyIQ>-Z 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'#|PukKxyGo$8410o* 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 M!5cRbAHL80KjwyDAOHXW literal 0 HcmV?d00001 From 5e90081b691718efa07085f7effb2b25338ee7c7 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 16:02:15 +0300 Subject: [PATCH 181/207] Updated CHANGELOG --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4784164e..3388ffe0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [4.0.0 beta 2 - New platforms (Mac OS X and watchOS) + refactoring, on Oct ??th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta2) + +See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) + +#### Features + +- Add an option to scale down large images #787 00bf467 efad1e5 8d1a0ae. Fixed #538 and #880. This one is a more robust solution than #884 or #894. Can be activated via `SDWebImageScaleDownLargeImages` or `SDWebImageDownloaderScaleDownLargeImages` + ## [4.0.0 beta - New platforms (Mac OS X and watchOS) + refactoring, on Oct 5th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta) See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) From b366d84f931e34c875a56c1efe20a8fdaaad55c7 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 16:54:17 +0300 Subject: [PATCH 182/207] Fixed #1668 CGContextDrawImage: invalid context 0x0 --- SDWebImage/SDWebImageDecoder.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageDecoder.m b/SDWebImage/SDWebImageDecoder.m index 7a435352..cf5e6760 100644 --- a/SDWebImage/SDWebImageDecoder.m +++ b/SDWebImage/SDWebImageDecoder.m @@ -41,6 +41,9 @@ static const size_t kBitsPerComponent = 8; bytesPerRow, colorspaceRef, kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); + if (context == NULL) { + return image; + } // Draw the image into the context and retrieve the new bitmap image without alpha CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); @@ -130,7 +133,7 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); if (destContext == NULL) { - free( destBitmapData ); + free(destBitmapData); return image; } CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); From aa3cd28401af44afcad01ebc27f3f29fa4bcc64f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 16:55:37 +0300 Subject: [PATCH 183/207] Updated CHANGELOG --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3388ffe0..7fbe8207 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,11 @@ See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/ #### Features -- Add an option to scale down large images #787 00bf467 efad1e5 8d1a0ae. Fixed #538 and #880. This one is a more robust solution than #884 or #894. Can be activated via `SDWebImageScaleDownLargeImages` or `SDWebImageDownloaderScaleDownLargeImages` +- Add an option to scale down large images #787 00bf467 efad1e5 8d1a0ae. Fixed #538, #880 and #586. This one is a more robust solution than #884 or #894. Can be activated via `SDWebImageScaleDownLargeImages` or `SDWebImageDownloaderScaleDownLargeImages` + +#### Fixes + +- Fixed #1668 CGContextDrawImage: invalid context 0x0 - b366d84 ## [4.0.0 beta - New platforms (Mac OS X and watchOS) + refactoring, on Oct 5th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta) @@ -396,4 +400,4 @@ For consistency, added async methods in `SDWebImageManager` `cachedImageExistsFo ## [1.0.0 on Dec 31st, 2009](https://github.com/rs/SDWebImage/releases/tag/1.0.0) -## [1.0 on Dec 31st, 2009](https://github.com/rs/SDWebImage/releases/tag/1.0) \ No newline at end of file +## [1.0 on Dec 31st, 2009](https://github.com/rs/SDWebImage/releases/tag/1.0) From 5cccc2177bb9e334891a216fb9f885a5cadf600a Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 17:22:51 +0300 Subject: [PATCH 184/207] Bumped version to 4.0.0-beta2 --- SDWebImage.podspec | 2 +- WebImage/Info.plist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index 61d216c7..e0a95b3a 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SDWebImage' - s.version = '4.0.0-beta' + s.version = '4.0.0-beta2' s.osx.deployment_target = '10.8' s.ios.deployment_target = '7.0' diff --git a/WebImage/Info.plist b/WebImage/Info.plist index 233da96f..3640921a 100644 --- a/WebImage/Info.plist +++ b/WebImage/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0-beta + 4.0.0-beta2 CFBundleSignature ???? CFBundleVersion From 41eb02715c188e8487fb07bc1251c44e6e64aa61 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 17:23:31 +0300 Subject: [PATCH 185/207] Updated CHANGELOG (date) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fbe8207..cb32b717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## [4.0.0 beta 2 - New platforms (Mac OS X and watchOS) + refactoring, on Oct ??th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta2) +## [4.0.0 beta 2 - New platforms (Mac OS X and watchOS) + refactoring, on Oct 6th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta2) See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) From d2f041b777caeb85a3856ff36f35d09cb78bc38c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Thu, 6 Oct 2016 20:37:51 +0300 Subject: [PATCH 186/207] Updated diagrams according to current 4.0.0 status --- Docs/SDWebImage.mdj | 8053 +++++++++++++++++++--------- Docs/SDWebImageClassDiagram.png | Bin 228949 -> 752619 bytes Docs/SDWebImageSequenceDiagram.png | Bin 37837 -> 131867 bytes 3 files changed, 5547 insertions(+), 2506 deletions(-) diff --git a/Docs/SDWebImage.mdj b/Docs/SDWebImage.mdj index 8108293c..982c485f 100644 --- a/Docs/SDWebImage.mdj +++ b/Docs/SDWebImage.mdj @@ -2137,8 +2137,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 341, + "left": 285, + "top": 445, "width": 213.06787109375, "height": 13, "autoResize": false, @@ -2162,8 +2162,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 356, + "left": 285, + "top": 460, "width": 213.06787109375, "height": 13, "autoResize": false, @@ -2187,8 +2187,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 371, + "left": 285, + "top": 475, "width": 213.06787109375, "height": 13, "autoResize": false, @@ -2212,8 +2212,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -762, - "top": 22, + "left": -362, + "top": 230, "width": 0, "height": 13, "autoResize": false, @@ -2231,8 +2231,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 336, + "left": 280, + "top": 440, "width": 223.06787109375, "height": 53, "autoResize": false, @@ -2267,8 +2267,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 381, + "left": 280, + "top": 485, "width": 233, "height": 10, "autoResize": false @@ -2301,8 +2301,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 394, + "left": 285, + "top": 498, "width": 237.06787109375, "height": 13, "autoResize": false, @@ -2329,8 +2329,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 85, - "top": 409, + "left": 285, + "top": 513, "width": 237.06787109375, "height": 13, "autoResize": false, @@ -2349,8 +2349,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 80, - "top": 389, + "left": 280, + "top": 493, "width": 247.06787109375, "height": 38, "autoResize": false @@ -2373,8 +2373,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -381, - "top": 3, + "left": -181, + "top": 107, "width": 10, "height": 10, "autoResize": false @@ -2397,8 +2397,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -381, - "top": 3, + "left": -181, + "top": 107, "width": 10, "height": 10, "autoResize": false @@ -2413,8 +2413,8 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 80, - "top": 336, + "left": 280, + "top": 440, "width": 247.06787109375, "height": 91, "autoResize": false, @@ -2473,13 +2473,13 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 488, - "top": 320, + "left": 461, + "top": 391, "width": 57, "height": 13, "autoResize": false, - "alpha": 0.3058788210270264, - "distance": 59.77457653551382, + "alpha": -0.15602482575330162, + "distance": 90.09439494219383, "hostEdge": { "$ref": "AAAAAAFUmNGSidAM2EA=" }, @@ -2507,8 +2507,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 459, - "top": 308, + "left": 400, + "top": 348, "width": 0, "height": 13, "autoResize": false, @@ -2540,8 +2540,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 459, - "top": 353, + "left": 400, + "top": 393, "width": 0, "height": 13, "autoResize": false, @@ -2573,8 +2573,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 351, - "top": 323, + "left": 385, + "top": 408, "width": 0, "height": 13, "autoResize": false, @@ -2606,8 +2606,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 354, - "top": 309, + "left": 371, + "top": 405, "width": 0, "height": 13, "autoResize": false, @@ -2639,8 +2639,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 347, - "top": 350, + "left": 412, + "top": 412, "width": 0, "height": 13, "autoResize": false, @@ -2673,7 +2673,7 @@ "containerChangeable": false, "containerExtending": false, "left": 566, - "top": 323, + "top": 363, "width": 0, "height": 13, "autoResize": false, @@ -2706,7 +2706,7 @@ "containerChangeable": false, "containerExtending": false, "left": 563, - "top": 309, + "top": 349, "width": 0, "height": 13, "autoResize": false, @@ -2739,7 +2739,7 @@ "containerChangeable": false, "containerExtending": false, "left": 570, - "top": 350, + "top": 390, "width": 0, "height": 13, "autoResize": false, @@ -2818,7 +2818,7 @@ "$ref": "AAAAAAFUmNDrqc6u4Jg=" }, "lineStyle": 0, - "points": "326:344;592:344", + "points": "400:440;400:384;592:384", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -3357,90 +3357,6 @@ "horizontalAlignment": 0, "verticalAlignment": 5 }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFUmPBKbRgtQUU=", - "_parent": { - "$ref": "AAAAAAFUmNdXmdnvJXE=" - }, - "model": { - "$ref": "AAAAAAFUmPBKVhghKWk=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 620, - "width": 235.23779296875, - "height": 13, - "autoResize": false, - "underline": false, - "text": "+shouldDecompressImages", - "horizontalAlignment": 0, - "verticalAlignment": 5 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFUmPBxxxjoOxU=", - "_parent": { - "$ref": "AAAAAAFUmNdXmdnvJXE=" - }, - "model": { - "$ref": "AAAAAAFUmPBxrhjcaQc=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 635, - "width": 235.23779296875, - "height": 13, - "autoResize": false, - "underline": false, - "text": "+shouldDisableiCloud", - "horizontalAlignment": 0, - "verticalAlignment": 5 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFUmPCLqxmjkOk=", - "_parent": { - "$ref": "AAAAAAFUmNdXmdnvJXE=" - }, - "model": { - "$ref": "AAAAAAFUmPCLlRmXEPs=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 650, - "width": 235.23779296875, - "height": 13, - "autoResize": false, - "underline": false, - "text": "+shouldCacheImagesInMemory", - "horizontalAlignment": 0, - "verticalAlignment": 5 - }, { "_type": "UMLAttributeView", "_id": "AAAAAAFUmPDDBhpeNqc=", @@ -3460,7 +3376,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 665, + "top": 620, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3488,7 +3404,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 680, + "top": 635, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3496,62 +3412,6 @@ "text": "+maxMemoryCountLimit", "horizontalAlignment": 0, "verticalAlignment": 5 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFUmPD+uBvUo+E=", - "_parent": { - "$ref": "AAAAAAFUmNdXmdnvJXE=" - }, - "model": { - "$ref": "AAAAAAFUmPD+pRvI9sU=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 695, - "width": 235.23779296875, - "height": 13, - "autoResize": false, - "underline": false, - "text": "+maxCacheAge", - "horizontalAlignment": 0, - "verticalAlignment": 5 - }, - { - "_type": "UMLAttributeView", - "_id": "AAAAAAFUmPEdXByPumw=", - "_parent": { - "$ref": "AAAAAAFUmNdXmdnvJXE=" - }, - "model": { - "$ref": "AAAAAAFUmPEdRRyDmKo=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 437, - "top": 710, - "width": 235.23779296875, - "height": 13, - "autoResize": false, - "underline": false, - "text": "+maxCacheSize", - "horizontalAlignment": 0, - "verticalAlignment": 5 } ], "visible": true, @@ -3566,7 +3426,7 @@ "left": 432, "top": 600, "width": 245.23779296875, - "height": 128, + "height": 53, "autoResize": false }, { @@ -3598,7 +3458,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 733, + "top": 658, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3626,7 +3486,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 748, + "top": 673, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3654,7 +3514,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 763, + "top": 688, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3682,7 +3542,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 778, + "top": 703, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3710,7 +3570,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 793, + "top": 718, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3738,7 +3598,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 808, + "top": 733, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3766,7 +3626,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 823, + "top": 748, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3794,7 +3654,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 838, + "top": 763, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3822,7 +3682,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 853, + "top": 778, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3850,7 +3710,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 868, + "top": 793, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3878,7 +3738,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 883, + "top": 808, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3906,7 +3766,7 @@ "containerChangeable": false, "containerExtending": false, "left": 437, - "top": 898, + "top": 823, "width": 235.23779296875, "height": 13, "autoResize": false, @@ -3926,7 +3786,7 @@ "containerChangeable": false, "containerExtending": false, "left": 432, - "top": 728, + "top": 653, "width": 245.23779296875, "height": 188, "autoResize": false @@ -3992,7 +3852,7 @@ "left": 432, "top": 560, "width": 245.23779296875, - "height": 356, + "height": 281, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -4082,7 +3942,7 @@ "containerExtending": false, "left": 701, "top": 567, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4107,7 +3967,7 @@ "containerExtending": false, "left": 701, "top": 582, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4151,7 +4011,7 @@ "containerExtending": false, "left": 696, "top": 560, - "width": 328.779296875, + "width": 521.9130859375, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -4197,7 +4057,7 @@ "containerExtending": false, "left": 701, "top": 605, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": true, @@ -4225,7 +4085,7 @@ "containerExtending": false, "left": 701, "top": 620, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4253,7 +4113,7 @@ "containerExtending": false, "left": 701, "top": 635, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4281,7 +4141,7 @@ "containerExtending": false, "left": 701, "top": 650, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4309,7 +4169,7 @@ "containerExtending": false, "left": 701, "top": 665, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4337,7 +4197,7 @@ "containerExtending": false, "left": 701, "top": 680, - "width": 318.779296875, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4357,7 +4217,7 @@ "containerExtending": false, "left": 696, "top": 600, - "width": 328.779296875, + "width": 521.9130859375, "height": 98, "autoResize": false }, @@ -4371,6 +4231,34 @@ "$ref": "AAAAAAFUkh8UMI38gtY=" }, "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmuCd5HfZ18A=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFXmuCdynfN50Y=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 701, + "top": 703, + "width": 511.9130859375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+init(sessionConfiguration)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, { "_type": "UMLOperationView", "_id": "AAAAAAFUmOOiz+21uaI=", @@ -4390,12 +4278,40 @@ "containerChangeable": false, "containerExtending": false, "left": 701, - "top": 703, - "width": 318.779296875, + "top": 718, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, - "text": "+downloadImageWithURL(): SDWebImageOperation", + "text": "+downloadImage(url, options, progress, completed): SDWebImageDownloadToken", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmuQAyIALQYI=", + "_parent": { + "$ref": "AAAAAAFUmNdyjto+23Y=" + }, + "model": { + "$ref": "AAAAAAFXmuQArX//uuI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 701, + "top": 733, + "width": 511.9130859375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancel(token)", "horizontalAlignment": 0, "verticalAlignment": 5 }, @@ -4418,8 +4334,8 @@ "containerChangeable": false, "containerExtending": false, "left": 701, - "top": 718, - "width": 318.779296875, + "top": 748, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4446,8 +4362,8 @@ "containerChangeable": false, "containerExtending": false, "left": 701, - "top": 733, - "width": 318.779296875, + "top": 763, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4474,8 +4390,8 @@ "containerChangeable": false, "containerExtending": false, "left": 701, - "top": 748, - "width": 318.779296875, + "top": 778, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4502,8 +4418,8 @@ "containerChangeable": false, "containerExtending": false, "left": 701, - "top": 763, - "width": 318.779296875, + "top": 793, + "width": 511.9130859375, "height": 13, "autoResize": false, "underline": false, @@ -4523,8 +4439,8 @@ "containerExtending": false, "left": 696, "top": 698, - "width": 328.779296875, - "height": 83, + "width": 521.9130859375, + "height": 113, "autoResize": false }, { @@ -4587,8 +4503,8 @@ "containerExtending": false, "left": 696, "top": 560, - "width": 328.779296875, - "height": 221, + "width": 521.9130859375, + "height": 251, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -6190,6 +6106,34 @@ "text": "+options: SDWebImageDownloaderOptions", "horizontalAlignment": 0, "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmt1lbG05VVw=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4+IBw=" + }, + "model": { + "$ref": "AAAAAAFXmt1lVW0nz6U=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1205, + "top": 487, + "width": 337.6572265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+dataTask", + "horizontalAlignment": 0, + "verticalAlignment": 5 } ], "visible": true, @@ -6204,7 +6148,7 @@ "left": 1200, "top": 392, "width": 347.6572265625, - "height": 98, + "height": 113, "autoResize": false }, { @@ -6236,12 +6180,68 @@ "containerChangeable": false, "containerExtending": false, "left": 1205, - "top": 495, + "top": 510, "width": 337.6572265625, "height": 13, "autoResize": false, "underline": false, - "text": "+init(request, options, progress, completed, cancelled)", + "text": "+init(request, session, options)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmt5iZG+Ukk0=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4/KXY=" + }, + "model": { + "$ref": "AAAAAAFXmt5iT2+ClWI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1205, + "top": 525, + "width": 337.6572265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+addHandlers(progressBlock, completedBlock)", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmt9bl3FXC5s=", + "_parent": { + "$ref": "AAAAAAFUmOQ29e4/KXY=" + }, + "model": { + "$ref": "AAAAAAFXmt9bf3FF/EU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1205, + "top": 540, + "width": 337.6572265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+cancel()", "horizontalAlignment": 0, "verticalAlignment": 5 } @@ -6256,9 +6256,9 @@ "containerChangeable": false, "containerExtending": false, "left": 1200, - "top": 490, + "top": 505, "width": 347.6572265625, - "height": 23, + "height": 53, "autoResize": false }, { @@ -6322,7 +6322,7 @@ "left": 1200, "top": 352, "width": 347.6572265625, - "height": 161, + "height": 206, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -6379,7 +6379,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1319, + "left": 1207, "top": 246, "width": 0, "height": 13, @@ -6412,7 +6412,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1319, + "left": 1207, "top": 261, "width": 0, "height": 13, @@ -6445,7 +6445,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1320, + "left": 1208, "top": 216, "width": 0, "height": 13, @@ -6477,7 +6477,7 @@ "$ref": "AAAAAAFUmOQ29O44VzA=" }, "lineStyle": 0, - "points": "1320:352;1320:237;1140:237", + "points": "1208:352;1208:237;1140:237", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -6526,8 +6526,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -772, - "top": 958, + "left": -788, + "top": 798, "width": 0, "height": 13, "autoResize": false, @@ -6550,9 +6550,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 629, - "top": 1007, - "width": 177.708984375, + "left": 621, + "top": 927, + "width": 278.75732421875, "height": 13, "autoResize": false, "underline": false, @@ -6575,9 +6575,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 629, - "top": 1022, - "width": 177.708984375, + "left": 621, + "top": 942, + "width": 278.75732421875, "height": 13, "autoResize": false, "underline": false, @@ -6600,8 +6600,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -772, - "top": 958, + "left": -788, + "top": 798, "width": 0, "height": 13, "autoResize": false, @@ -6619,9 +6619,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 624, - "top": 1000, - "width": 187.708984375, + "left": 616, + "top": 920, + "width": 288.75732421875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -6655,9 +6655,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 624, - "top": 1040, - "width": 187.708984375, + "left": 616, + "top": 960, + "width": 288.75732421875, "height": 10, "autoResize": false }, @@ -6689,15 +6689,43 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 629, - "top": 1055, - "width": 177.708984375, + "left": 621, + "top": 975, + "width": 278.75732421875, "height": 13, "autoResize": false, "underline": false, "text": "+decodedImageWithImage:()", "horizontalAlignment": 0, "verticalAlignment": 5 + }, + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmtvoSGmA4Es=", + "_parent": { + "$ref": "AAAAAAFUmOnlEv8wGVU=" + }, + "model": { + "$ref": "AAAAAAFXmtvoKmluEIw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 621, + "top": 990, + "width": 278.75732421875, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+decodedAndScaledDownImageWithImage:()", + "horizontalAlignment": 0, + "verticalAlignment": 5 } ], "visible": true, @@ -6709,10 +6737,10 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 624, - "top": 1050, - "width": 187.708984375, - "height": 23, + "left": 616, + "top": 970, + "width": 288.75732421875, + "height": 38, "autoResize": false }, { @@ -6733,8 +6761,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -386, - "top": 479, + "left": -394, + "top": 399, "width": 10, "height": 10, "autoResize": false @@ -6757,8 +6785,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -386, - "top": 479, + "left": -394, + "top": 399, "width": 10, "height": 10, "autoResize": false @@ -6773,10 +6801,10 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 624, - "top": 1000, - "width": 187.708984375, - "height": 73, + "left": 616, + "top": 920, + "width": 288.75732421875, + "height": 88, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -6834,7 +6862,7 @@ "containerChangeable": false, "containerExtending": false, "left": 662, - "top": 950, + "top": 873, "width": 0, "height": 13, "autoResize": false, @@ -6867,7 +6895,7 @@ "containerChangeable": false, "containerExtending": false, "left": 677, - "top": 950, + "top": 873, "width": 0, "height": 13, "autoResize": false, @@ -6900,7 +6928,7 @@ "containerChangeable": false, "containerExtending": false, "left": 633, - "top": 951, + "top": 874, "width": 0, "height": 13, "autoResize": false, @@ -6931,7 +6959,7 @@ "$ref": "AAAAAAFUmNdXmNnpp1I=" }, "lineStyle": 0, - "points": "648:915;648:1000", + "points": "648:840;648:920", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -6973,8 +7001,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 791, - "top": 883, + "left": 790, + "top": 858, "width": 0, "height": 13, "autoResize": false, @@ -7006,8 +7034,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 806, - "top": 883, + "left": 805, + "top": 858, "width": 0, "height": 13, "autoResize": false, @@ -7040,7 +7068,7 @@ "containerChangeable": false, "containerExtending": false, "left": 761, - "top": 884, + "top": 859, "width": 0, "height": 13, "autoResize": false, @@ -7071,7 +7099,7 @@ "$ref": "AAAAAAFUmNdyjto3Jy4=" }, "lineStyle": 0, - "points": "776:780;776:1000", + "points": "776:810;776:920", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -7120,7 +7148,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1090, + "left": 818, "top": 326, "width": 0, "height": 13, @@ -7144,7 +7172,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1365, + "left": 1229, "top": 247, "width": 113.2548828125, "height": 13, @@ -7169,7 +7197,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1365, + "left": 1229, "top": 262, "width": 113.2548828125, "height": 13, @@ -7194,7 +7222,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1090, + "left": 818, "top": 326, "width": 0, "height": 13, @@ -7213,7 +7241,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1360, + "left": 1224, "top": 240, "width": 123.2548828125, "height": 40, @@ -7249,7 +7277,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1360, + "left": 1224, "top": 280, "width": 123.2548828125, "height": 10, @@ -7273,7 +7301,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1360, + "left": 1224, "top": 290, "width": 123.2548828125, "height": 10, @@ -7297,7 +7325,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 545, + "left": 409, "top": 163, "width": 10, "height": 10, @@ -7321,7 +7349,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 545, + "left": 409, "top": 163, "width": 10, "height": 10, @@ -7337,7 +7365,7 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 1360, + "left": 1224, "top": 240, "width": 123.2548828125, "height": 60, @@ -7397,7 +7425,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1401, + "left": 1273, "top": 318, "width": 0, "height": 13, @@ -7430,7 +7458,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1386, + "left": 1258, "top": 318, "width": 0, "height": 13, @@ -7463,7 +7491,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1430, + "left": 1302, "top": 319, "width": 0, "height": 13, @@ -7495,7 +7523,7 @@ "$ref": "AAAAAAFUmOQ29O44VzA=" }, "lineStyle": 0, - "points": "1416:352;1416:299", + "points": "1288:352;1288:299", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -7544,8 +7572,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1046, - "top": -1874, + "left": -1444, + "top": -1682, "width": 0, "height": 13, "autoResize": false, @@ -7568,8 +7596,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 221, - "top": 23, + "left": 22, + "top": 119, "width": 210.23828125, "height": 13, "autoResize": false, @@ -7593,8 +7621,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 221, - "top": 38, + "left": 22, + "top": 134, "width": 210.23828125, "height": 13, "autoResize": false, @@ -7618,8 +7646,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1046, - "top": -1874, + "left": -1444, + "top": -1682, "width": 0, "height": 13, "autoResize": false, @@ -7637,8 +7665,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 216, - "top": 16, + "left": 17, + "top": 112, "width": 220.23828125, "height": 40, "autoResize": false, @@ -7673,8 +7701,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 216, - "top": 56, + "left": 17, + "top": 152, "width": 220.23828125, "height": 10, "autoResize": false @@ -7707,8 +7735,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 221, - "top": 71, + "left": 22, + "top": 167, "width": 210.23828125, "height": 13, "autoResize": false, @@ -7727,8 +7755,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 216, - "top": 66, + "left": 17, + "top": 162, "width": 220.23828125, "height": 23, "autoResize": false @@ -7751,8 +7779,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -523, - "top": -937, + "left": -722, + "top": -841, "width": 10, "height": 10, "autoResize": false @@ -7775,8 +7803,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -523, - "top": -937, + "left": -722, + "top": -841, "width": 10, "height": 10, "autoResize": false @@ -7791,8 +7819,8 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 216, - "top": 16, + "left": 17, + "top": 112, "width": 220.23828125, "height": 73, "autoResize": false, @@ -7858,8 +7886,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1236, - "top": -1920, + "left": -2082, + "top": -1904, "width": 0, "height": 13, "autoResize": false, @@ -7882,8 +7910,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 445, - "top": 23, + "left": 22, + "top": 31, "width": 146.2119140625, "height": 13, "autoResize": false, @@ -7907,8 +7935,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 445, - "top": 38, + "left": 22, + "top": 46, "width": 146.2119140625, "height": 13, "autoResize": false, @@ -7932,8 +7960,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1236, - "top": -1920, + "left": -2082, + "top": -1904, "width": 0, "height": 13, "autoResize": false, @@ -7951,8 +7979,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 440, - "top": 16, + "left": 17, + "top": 24, "width": 156.2119140625, "height": 40, "autoResize": false, @@ -7987,8 +8015,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 440, - "top": 56, + "left": 17, + "top": 64, "width": 156.2119140625, "height": 10, "autoResize": false @@ -8021,8 +8049,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 445, - "top": 71, + "left": 22, + "top": 79, "width": 146.2119140625, "height": 13, "autoResize": false, @@ -8041,8 +8069,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 440, - "top": 66, + "left": 17, + "top": 74, "width": 156.2119140625, "height": 23, "autoResize": false @@ -8065,8 +8093,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -618, - "top": -960, + "left": -1041, + "top": -952, "width": 10, "height": 10, "autoResize": false @@ -8089,8 +8117,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -618, - "top": -960, + "left": -1041, + "top": -952, "width": 10, "height": 10, "autoResize": false @@ -8105,8 +8133,8 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 440, - "top": 16, + "left": 17, + "top": 24, "width": 156.2119140625, "height": 73, "autoResize": false, @@ -8172,8 +8200,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1102, - "top": -1918, + "left": -1132, + "top": -1550, "width": 0, "height": 13, "autoResize": false, @@ -8196,8 +8224,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 37, - "top": 23, + "left": 22, + "top": 207, "width": 169.64501953125, "height": 13, "autoResize": false, @@ -8221,8 +8249,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 37, - "top": 38, + "left": 22, + "top": 222, "width": 169.64501953125, "height": 13, "autoResize": false, @@ -8246,8 +8274,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1102, - "top": -1918, + "left": -1132, + "top": -1550, "width": 0, "height": 13, "autoResize": false, @@ -8265,8 +8293,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 32, - "top": 16, + "left": 17, + "top": 200, "width": 179.64501953125, "height": 40, "autoResize": false, @@ -8301,8 +8329,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 32, - "top": 56, + "left": 17, + "top": 240, "width": 179.64501953125, "height": 10, "autoResize": false @@ -8335,8 +8363,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 37, - "top": 71, + "left": 22, + "top": 255, "width": 169.64501953125, "height": 13, "autoResize": false, @@ -8355,8 +8383,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 32, - "top": 66, + "left": 17, + "top": 250, "width": 179.64501953125, "height": 23, "autoResize": false @@ -8379,8 +8407,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -551, - "top": -967, + "left": -566, + "top": -783, "width": 10, "height": 10, "autoResize": false @@ -8403,8 +8431,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -551, - "top": -967, + "left": -566, + "top": -783, "width": 10, "height": 10, "autoResize": false @@ -8419,8 +8447,8 @@ "showShadow": true, "containerChangeable": true, "containerExtending": false, - "left": 32, - "top": 16, + "left": 17, + "top": 200, "width": 179.64501953125, "height": 73, "autoResize": false, @@ -8451,1245 +8479,6 @@ "$ref": "AAAAAAFUmPubGC7t9Sw=" } }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAFUv1AAByZWi/E=", - "_parent": { - "$ref": "AAAAAAFF+qBtyKM79qY=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZX7g4=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 106, - "top": 281, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZYPFI=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "visible": null, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 91, - "top": 281, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZZ23I=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 136, - "top": 282, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZa1QM=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZTkZo=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 127, - "top": 263, - "width": 36, - "height": 13, - "autoResize": false, - "alpha": -0.04024671267454227, - "distance": 447.362269307549, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 2, - "underline": false, - "text": "+uses", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZbyFI=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZTkZo=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 563, - "top": 310, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZc4HY=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZTkZo=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 570, - "top": 269, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZd/pA=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZUFhE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 106, - "top": 107, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AAByZeoyU=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZUFhE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 92, - "top": 110, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1AACCZfWv8=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZUFhE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 133, - "top": 103, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1AACCZgYRw=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZTkZo=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 24, - "width": 10, - "height": 10, - "autoResize": false - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1AACCZhqPs=", - "_parent": { - "$ref": "AAAAAAFUv1AAByZWi/E=" - }, - "model": { - "$ref": "AAAAAAFUv1AABiZUFhE=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 24, - "width": 10, - "height": 10, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUmPubFi7kzSY=" - }, - "tail": { - "$ref": "AAAAAAFUmMuDNcmaKIo=" - }, - "lineStyle": 0, - "points": "592:288;121:288;121:88", - "stereotypeDisplay": "label", - "showVisibility": true, - "showProperty": true, - "nameLabel": { - "$ref": "AAAAAAFUv1AAByZX7g4=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv1AAByZYPFI=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv1AAByZZ23I=" - }, - "showMultiplicity": true, - "showType": true, - "tailRoleNameLabel": { - "$ref": "AAAAAAFUv1AAByZa1QM=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAFUv1AAByZbyFI=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAFUv1AAByZc4HY=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAFUv1AAByZd/pA=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAFUv1AAByZeoyU=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAFUv1AACCZfWv8=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAFUv1AACCZgYRw=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAFUv1AACCZhqPs=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAFUv1BssClPDbY=", - "_parent": { - "$ref": "AAAAAAFF+qBtyKM79qY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssClQ3AU=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 319, - "top": 240, - "width": 36, - "height": 13, - "autoResize": false, - "alpha": -1.07144967568509, - "distance": 37.589892258425, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 1, - "underline": false, - "text": "+uses", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlRxLc=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "visible": null, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 274, - "top": 257, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlSh68=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 319, - "top": 258, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlTKSg=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlMh4M=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 566, - "top": 272, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlU1f0=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlMh4M=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 563, - "top": 286, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlVS1Y=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlMh4M=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 570, - "top": 245, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlWoUA=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlN0xQ=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 289, - "top": 107, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlX7kE=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlN0xQ=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 275, - "top": 110, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1BssSlYepY=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlN0xQ=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 316, - "top": 103, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1BssilZT0Q=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlMh4M=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 24, - "width": 10, - "height": 10, - "autoResize": false - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1BssilaBvI=", - "_parent": { - "$ref": "AAAAAAFUv1BssClPDbY=" - }, - "model": { - "$ref": "AAAAAAFUv1BsrSlN0xQ=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 24, - "width": 10, - "height": 10, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUmPnxoSwmlwM=" - }, - "tail": { - "$ref": "AAAAAAFUmMuDNcmaKIo=" - }, - "lineStyle": 0, - "points": "592:264;304:264;304:88", - "stereotypeDisplay": "label", - "showVisibility": true, - "showProperty": true, - "nameLabel": { - "$ref": "AAAAAAFUv1BssClQ3AU=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv1BssSlRxLc=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv1BssSlSh68=" - }, - "showMultiplicity": true, - "showType": true, - "tailRoleNameLabel": { - "$ref": "AAAAAAFUv1BssSlTKSg=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAFUv1BssSlU1f0=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAFUv1BssSlVS1Y=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAFUv1BssSlWoUA=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAFUv1BssSlX7kE=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAFUv1BssSlYepY=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAFUv1BssilZT0Q=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAFUv1BssilaBvI=" - } - }, - { - "_type": "UMLAssociationView", - "_id": "AAAAAAFUv1FUOzKDIjM=", - "_parent": { - "$ref": "AAAAAAFF+qBtyKM79qY=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUOzKEHCo=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 527, - "top": 219, - "width": 36, - "height": 13, - "autoResize": false, - "alpha": 0.4918090273266982, - "distance": 31.76476034853718, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 1, - "underline": false, - "text": "+uses", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKFW3M=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "visible": null, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 517, - "top": 204, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKGk20=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 517, - "top": 249, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 15, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKHMMw=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKAXw0=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 532, - "top": 107, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKIOmc=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKAXw0=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 545, - "top": 110, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKJv6I=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKAXw0=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 504, - "top": 103, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 2, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKKmqo=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKBt7k=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 566, - "top": 219, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.5235987755982988, - "distance": 30, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPDKL9dg=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKBt7k=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 563, - "top": 205, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -0.7853981633974483, - "distance": 40, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv1FUPTKMOfc=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKBt7k=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 570, - "top": 246, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 0.5235987755982988, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "edgePosition": 0, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1FUPTKNvCM=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKAXw0=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 0, - "width": 10, - "height": 10, - "autoResize": false - }, - { - "_type": "UMLQualifierCompartmentView", - "_id": "AAAAAAFUv1FUPTKODmw=", - "_parent": { - "$ref": "AAAAAAFUv1FUOzKDIjM=" - }, - "model": { - "$ref": "AAAAAAFUv1FUOTKBt7k=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 0, - "top": 0, - "width": 10, - "height": 10, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUmMuDNcmaKIo=" - }, - "tail": { - "$ref": "AAAAAAFUmPsPJi0J5Fw=" - }, - "lineStyle": 0, - "points": "517:88;517:240;592:240", - "stereotypeDisplay": "label", - "showVisibility": true, - "showProperty": true, - "nameLabel": { - "$ref": "AAAAAAFUv1FUOzKEHCo=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv1FUPDKFW3M=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv1FUPDKGk20=" - }, - "showMultiplicity": true, - "showType": true, - "tailRoleNameLabel": { - "$ref": "AAAAAAFUv1FUPDKHMMw=" - }, - "tailPropertyLabel": { - "$ref": "AAAAAAFUv1FUPDKIOmc=" - }, - "tailMultiplicityLabel": { - "$ref": "AAAAAAFUv1FUPDKJv6I=" - }, - "headRoleNameLabel": { - "$ref": "AAAAAAFUv1FUPDKKmqo=" - }, - "headPropertyLabel": { - "$ref": "AAAAAAFUv1FUPDKL9dg=" - }, - "headMultiplicityLabel": { - "$ref": "AAAAAAFUv1FUPTKMOfc=" - }, - "tailQualifiersCompartment": { - "$ref": "AAAAAAFUv1FUPTKNvCM=" - }, - "headQualifiersCompartment": { - "$ref": "AAAAAAFUv1FUPTKODmw=" - } - }, { "_type": "UMLDependencyView", "_id": "AAAAAAFUv153Vizx38c=", @@ -9956,7 +8745,7 @@ "$ref": "AAAAAAFUmNdyjto3Jy4=" }, "lineStyle": 0, - "points": "1024:656;1352:656;1352:512", + "points": "1217:656;1352:656;1352:557", "stereotypeDisplay": "label", "showVisibility": true, "showProperty": true, @@ -9969,6 +8758,3534 @@ "propertyLabel": { "$ref": "AAAAAAFUv164Jiz4K3E=" } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFXmnF8zuoPb30=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmnF8zuoQ/TA=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmnF8zuoRXkU=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoQ/TA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -98, + "top": 304, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmnF8zuoSIb0=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoQ/TA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 22, + "top": 303, + "width": 248.197265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "UIImageView (HighlightedWebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmnF8zuoTTeY=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoQ/TA=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 22, + "top": 318, + "width": 248.197265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmnF8zuoUV44=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoQ/TA=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -98, + "top": 304, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 17, + "top": 296, + "width": 258.197265625, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmnF8zuoRXkU=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmnF8zuoSIb0=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmnF8zuoTTeY=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmnF8zuoUV44=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmnF8zuoVpIY=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 17, + "top": 336, + "width": 258.197265625, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmnF8zuoWmS8=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmnF86+pwxsM=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoWmS8=" + }, + "model": { + "$ref": "AAAAAAFXmnErIideM/I=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 22, + "top": 351, + "width": 248.197265625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_setHighlightedImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 17, + "top": 346, + "width": 258.197265625, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmnF8zuoXQa4=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -49, + "top": 152, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmnF8z+oYT6Q=", + "_parent": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "model": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -49, + "top": 152, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 17, + "top": 296, + "width": 258.197265625, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmnF8zuoQ/TA=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmnF8zuoVpIY=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmnF8zuoWmS8=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmnF8zuoXQa4=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmnF8z+oYT6Q=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFXmsqnFRq0kTA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmsqnFhq1c88=", + "_parent": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmsqnFhq2cuo=", + "_parent": { + "$ref": "AAAAAAFXmsqnFhq1c88=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": -76, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmsqnFhq3kPQ=", + "_parent": { + "$ref": "AAAAAAFXmsqnFhq1c88=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 317, + "top": 287, + "width": 194.84130859375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "UIView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmsqnFhq4uH4=", + "_parent": { + "$ref": "AAAAAAFXmsqnFhq1c88=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 317, + "top": 302, + "width": 194.84130859375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmsqnFxq5Aig=", + "_parent": { + "$ref": "AAAAAAFXmsqnFhq1c88=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 432, + "top": -76, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 312, + "top": 280, + "width": 204.84130859375, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmsqnFhq2cuo=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmsqnFhq3kPQ=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmsqnFhq4uH4=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmsqnFxq5Aig=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmsqnFxq6HJk=", + "_parent": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 312, + "top": 320, + "width": 204.84130859375, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmsqnFxq7RZM=", + "_parent": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmsqnLRr1d7w=", + "_parent": { + "$ref": "AAAAAAFXmsqnFxq7RZM=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3idvzv0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 317, + "top": 335, + "width": 194.84130859375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_internalSetImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 312, + "top": 330, + "width": 204.84130859375, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmsqnGBq8Kaw=", + "_parent": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 216, + "top": -38, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmsqnGBq9kZI=", + "_parent": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "model": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 216, + "top": -38, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 312, + "top": 280, + "width": 204.84130859375, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmsqnFhq1c88=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmsqnFxq6HJk=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmsqnFxq7RZM=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmsqnGBq8Kaw=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmsqnGBq9kZI=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFXmtWfp0ZgXww=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmtWfp0ZhXAI=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmtWfqEZihUI=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZhXAI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -52, + "top": -190, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmtWfqEZj5ak=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZhXAI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 21, + "top": 391, + "width": 234.87353515625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "FLAnimatedImageView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmtWfqEZkCTA=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZhXAI=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 21, + "top": 406, + "width": 234.87353515625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmtWfqEZlCzk=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZhXAI=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -52, + "top": -190, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 16, + "top": 384, + "width": 244.87353515625, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtWfqEZihUI=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmtWfqEZj5ak=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmtWfqEZkCTA=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtWfqEZlCzk=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmtWfqUZmEik=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 16, + "top": 424, + "width": 244.87353515625, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmtWfqUZnQ6o=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "subViews": [ + { + "_type": "UMLOperationView", + "_id": "AAAAAAFXmtWfxUakuKU=", + "_parent": { + "$ref": "AAAAAAFXmtWfqUZnQ6o=" + }, + "model": { + "$ref": "AAAAAAFXmtV2eCeAZR4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 21, + "top": 439, + "width": 234.87353515625, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+sd_setImageWithURL()", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 16, + "top": 434, + "width": 244.87353515625, + "height": 23, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmtWfqkZozno=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -26, + "top": -95, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmtWfqkZpJRc=", + "_parent": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "model": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -26, + "top": -95, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 16, + "top": 384, + "width": 244.87353515625, + "height": 73, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmtWfp0ZhXAI=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmtWfqUZmEik=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmtWfqUZnQ6o=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmtWfqkZozno=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmtWfqkZpJRc=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmtleXFrVp5w=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtleXFrW70A=", + "_parent": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 471, + "top": 49, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtleXFrXlfs=", + "_parent": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 486, + "top": 49, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtleXVrYs9A=", + "_parent": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 441, + "top": 50, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtleXFrVp5w=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "tail": { + "$ref": "AAAAAAFUmPsPJi0J5Fw=" + }, + "lineStyle": 0, + "points": "172:56;456:56;456:280", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmtleXFrW70A=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtleXFrXlfs=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtleXVrYs9A=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmtmmSieBlmE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtmmSieCDAU=", + "_parent": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 447, + "top": 145, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtmmSieDGtM=", + "_parent": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 462, + "top": 145, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtmmSieEsk0=", + "_parent": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 417, + "top": 146, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtmmSieBlmE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "tail": { + "$ref": "AAAAAAFUmPnxoSwmlwM=" + }, + "lineStyle": 0, + "points": "236:152;432:152;432:280", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmtmmSieCDAU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtmmSieDGtM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtmmSieEsk0=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmtnQ3yeFAlk=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnQ3yeG0FI=", + "_parent": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 423, + "top": 229, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnQ3yeHrbk=", + "_parent": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 438, + "top": 229, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnQ3yeIXC4=", + "_parent": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 394, + "top": 230, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtnQ3yeFAlk=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "tail": { + "$ref": "AAAAAAFUmPubFi7kzSY=" + }, + "lineStyle": 0, + "points": "196:236;409:236;409:280", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmtnQ3yeG0FI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtnQ3yeHrbk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtnQ3yeIXC4=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmtnqOCeJ870=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnqOCeKBpk=", + "_parent": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 291, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnqOCeLMu8=", + "_parent": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 276, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtnqOCeMl2Y=", + "_parent": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 293, + "top": 321, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtnqOCeJ870=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "tail": { + "$ref": "AAAAAAFXmnF8zuoPb30=" + }, + "lineStyle": 0, + "points": "274:312;312:312", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmtnqOCeKBpk=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtnqOCeLMu8=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtnqOCeMl2Y=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmtoalieNwU0=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtoalieOsrc=", + "_parent": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 265, + "top": 375, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtoaliePrjw=", + "_parent": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 250, + "top": 375, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmtoalyeQ2pA=", + "_parent": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "model": { + "$ref": "AAAAAAFXmtleW1rTTNk=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 294, + "top": 376, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmtoalieNwU0=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "tail": { + "$ref": "AAAAAAFXmtWfp0ZgXww=" + }, + "lineStyle": 0, + "points": "260:420;280:420;280:344;312:344", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmtoalieOsrc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmtoaliePrjw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmtoalyeQ2pA=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFXmuWYrYcCa9s=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmuWYrocDzj4=", + "_parent": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmuWYrocEdZA=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocDzj4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -102, + "top": -120, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmuWYrocFtRE=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocDzj4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1309, + "top": 679, + "width": 212.2021484375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageDownloadToken", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmuWYrocGczg=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocDzj4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1309, + "top": 694, + "width": 212.2021484375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmuWYrocHYrQ=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocDzj4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -102, + "top": -120, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1304, + "top": 672, + "width": 222.2021484375, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmuWYrocEdZA=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmuWYrocFtRE=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmuWYrocGczg=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmuWYrocHYrQ=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmuWYrocIclQ=", + "_parent": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmuY464jBWIE=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocIclQ=" + }, + "model": { + "$ref": "AAAAAAFXmuY4yIivPbY=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1309, + "top": 717, + "width": 212.2021484375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+url", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmuZProl8gys=", + "_parent": { + "$ref": "AAAAAAFXmuWYrocIclQ=" + }, + "model": { + "$ref": "AAAAAAFXmuZPjolqbRg=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1309, + "top": 732, + "width": 212.2021484375, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+downloadOperationCancelToken", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1304, + "top": 712, + "width": 222.2021484375, + "height": 38, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmuWYr4cJuVk=", + "_parent": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1304, + "top": 750, + "width": 222.2021484375, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmuWYr4cKCZk=", + "_parent": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -51, + "top": -60, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmuWYr4cLRac=", + "_parent": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "model": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -51, + "top": -60, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 1304, + "top": 672, + "width": 222.2021484375, + "height": 88, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmuWYrocDzj4=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmuWYrocIclQ=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmuWYr4cJuVk=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmuWYr4cKCZk=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmuWYr4cLRac=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmuZ1b4oYynI=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmuZ1booW7c8=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuZ1b4oZevc=", + "_parent": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "model": { + "$ref": "AAAAAAFXmuZ1booW7c8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1260, + "top": 691, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuZ1b4oaUQk=", + "_parent": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "model": { + "$ref": "AAAAAAFXmuZ1booW7c8=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1260, + "top": 676, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuZ1b4obVbI=", + "_parent": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "model": { + "$ref": "AAAAAAFXmuZ1booW7c8=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1260, + "top": 721, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmuZ1b4oYynI=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmuWYrYcCa9s=" + }, + "tail": { + "$ref": "AAAAAAFUmNdyjto3Jy4=" + }, + "lineStyle": 0, + "points": "1217:712;1304:712", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmuZ1b4oZevc=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmuZ1b4oaUQk=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmuZ1b4obVbI=" + } + }, + { + "_type": "UMLDependencyView", + "_id": "AAAAAAFXmuaszoyBSik=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmuaszox/B8Y=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuasz4yCfKU=", + "_parent": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "model": { + "$ref": "AAAAAAFXmuaszox/B8Y=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 554, + "top": 291, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuasz4yDEjI=", + "_parent": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "model": { + "$ref": "AAAAAAFXmuaszox/B8Y=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 554, + "top": 276, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmuasz4yE5bM=", + "_parent": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "model": { + "$ref": "AAAAAAFXmuaszox/B8Y=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 554, + "top": 321, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmuaszoyBSik=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmMuDNcmaKIo=" + }, + "tail": { + "$ref": "AAAAAAFXmsqnFRq0kTA=" + }, + "lineStyle": 0, + "points": "516:312;592:312", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmuasz4yCfKU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmuasz4yDEjI=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmuasz4yE5bM=" + } + }, + { + "_type": "UMLClassView", + "_id": "AAAAAAFXmwHlQZfcwhE=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmwHlQpfdaR4=", + "_parent": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmwHlQpfeXHo=", + "_parent": { + "$ref": "AAAAAAFXmwHlQpfdaR4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -142, + "top": -92, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwHlQpff/Yk=", + "_parent": { + "$ref": "AAAAAAFXmwHlQpfdaR4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 615, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDImageCacheConfig", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwHlQpfgKbE=", + "_parent": { + "$ref": "AAAAAAFXmwHlQpfdaR4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 630, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwHlQ5fhKcI=", + "_parent": { + "$ref": "AAAAAAFXmwHlQpfdaR4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -142, + "top": -92, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 160, + "top": 608, + "width": 205.48876953125, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmwHlQpfeXHo=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmwHlQpff/Yk=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmwHlQpfgKbE=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmwHlQ5fhKcI=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmwHlQ5firCI=", + "_parent": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "subViews": [ + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmwKSlp0N8TY=", + "_parent": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "model": { + "$ref": "AAAAAAFUmPBKVhghKWk=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 653, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDecompressImages", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmwK3GZ1cp9k=", + "_parent": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "model": { + "$ref": "AAAAAAFUmPBxrhjcaQc=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 668, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldDisableiCloud", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmwLWr52r7TI=", + "_parent": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "model": { + "$ref": "AAAAAAFUmPCLlRmXEPs=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 683, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+shouldCacheImagesInMemory", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmwL16Z364rc=", + "_parent": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "model": { + "$ref": "AAAAAAFUmPD+pRvI9sU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 698, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxCacheAge", + "horizontalAlignment": 0, + "verticalAlignment": 5 + }, + { + "_type": "UMLAttributeView", + "_id": "AAAAAAFXmwMPqZ5JH+8=", + "_parent": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "model": { + "$ref": "AAAAAAFUmPEdRRyDmKo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 165, + "top": 713, + "width": 195.48876953125, + "height": 13, + "autoResize": false, + "underline": false, + "text": "+maxCacheSize", + "horizontalAlignment": 0, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 160, + "top": 648, + "width": 205.48876953125, + "height": 83, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmwHlQ5fjsoY=", + "_parent": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 160, + "top": 731, + "width": 205.48876953125, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmwHlQ5fk/sQ=", + "_parent": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -71, + "top": -46, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmwHlRJflFgo=", + "_parent": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "model": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -71, + "top": -46, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 160, + "top": 608, + "width": 205.48876953125, + "height": 133, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmwHlQpfdaR4=" + }, + "wordWrap": false, + "suppressAttributes": false, + "suppressOperations": false, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmwHlQ5firCI=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmwHlQ5fjsoY=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmwHlQ5fk/sQ=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmwHlRJflFgo=" + } + }, + { + "_type": "UMLAssociationView", + "_id": "AAAAAAFXmwYAOLO7iOA=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAOLO8LcI=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 398, + "top": 651, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAOLO9Sqw=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 398, + "top": 636, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAOLO+C+4=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 398, + "top": 681, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAOLO/nAA=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO4X9g=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 389, + "top": 651, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAOLPAH1M=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO4X9g=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 392, + "top": 637, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAObPBDvI=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO4X9g=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 385, + "top": 678, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 2, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAObPC0G4=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO5TNo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 385, + "top": 651, + "width": 43, + "height": 13, + "autoResize": false, + "alpha": -0.5235987755982988, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 0, + "underline": false, + "text": "+config", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAObPDf9g=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO5TNo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 403, + "top": 637, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -0.7853981633974483, + "distance": 40, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwYAObPEkvU=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO5TNo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 410, + "top": 678, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 0.5235987755982988, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "edgePosition": 0, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFXmwYAObPFxXo=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO4X9g=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLQualifierCompartmentView", + "_id": "AAAAAAFXmwYAObPG0jM=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO7iOA=" + }, + "model": { + "$ref": "AAAAAAFXmwYAOLO5TNo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 0, + "top": 0, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUmNdXmNnpp1I=" + }, + "tail": { + "$ref": "AAAAAAFXmwHlQZfcwhE=" + }, + "lineStyle": 0, + "points": "364:672;432:672", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmwYAOLO8LcI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmwYAOLO9Sqw=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmwYAOLO+C+4=" + }, + "showMultiplicity": true, + "showType": true, + "tailRoleNameLabel": { + "$ref": "AAAAAAFXmwYAOLO/nAA=" + }, + "tailPropertyLabel": { + "$ref": "AAAAAAFXmwYAOLPAH1M=" + }, + "tailMultiplicityLabel": { + "$ref": "AAAAAAFXmwYAObPBDvI=" + }, + "headRoleNameLabel": { + "$ref": "AAAAAAFXmwYAObPC0G4=" + }, + "headPropertyLabel": { + "$ref": "AAAAAAFXmwYAObPDf9g=" + }, + "headMultiplicityLabel": { + "$ref": "AAAAAAFXmwYAObPEkvU=" + }, + "tailQualifiersCompartment": { + "$ref": "AAAAAAFXmwYAObPFxXo=" + }, + "headQualifiersCompartment": { + "$ref": "AAAAAAFXmwYAObPG0jM=" + } + }, + { + "_type": "UMLInterfaceView", + "_id": "AAAAAAFXmweIrMVi0w8=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmweIrcVjTI0=", + "_parent": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmweIrcVkV0Y=", + "_parent": { + "$ref": "AAAAAAFXmweIrcVjTI0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1357, + "top": 245, + "width": 303.17919921875, + "height": 13, + "autoResize": false, + "underline": false, + "text": "«interface»", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmweIrcVlkN4=", + "_parent": { + "$ref": "AAAAAAFXmweIrcVjTI0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1357, + "top": 260, + "width": 303.17919921875, + "height": 13, + "autoResize": false, + "underline": false, + "text": "SDWebImageDownloaderOperationInterface", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmweIrcVmjnM=", + "_parent": { + "$ref": "AAAAAAFXmweIrcVjTI0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1357, + "top": 275, + "width": 303.17919921875, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from SDWebImage)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmweIrcVnBvc=", + "_parent": { + "$ref": "AAAAAAFXmweIrcVjTI0=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -498, + "top": -48, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1352, + "top": 240, + "width": 313.17919921875, + "height": 53, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmweIrcVkV0Y=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmweIrcVlkN4=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmweIrcVmjnM=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmweIrcVnBvc=" + } + }, + { + "_type": "UMLAttributeCompartmentView", + "_id": "AAAAAAFXmweIrcVoTE8=", + "_parent": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -249, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLOperationCompartmentView", + "_id": "AAAAAAFXmweIrsVp1OA=", + "_parent": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -249, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLReceptionCompartmentView", + "_id": "AAAAAAFXmweIrsVq3iY=", + "_parent": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -249, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + }, + { + "_type": "UMLTemplateParameterCompartmentView", + "_id": "AAAAAAFXmweIrsVr8cA=", + "_parent": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "model": { + "$ref": "AAAAAAFXmwdRJMUYGTs=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -249, + "top": -24, + "width": 10, + "height": 10, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": true, + "containerExtending": false, + "left": 1352, + "top": 240, + "width": 337.17919921875, + "height": 64, + "autoResize": false, + "stereotypeDisplay": "decoration-label", + "showVisibility": true, + "showNamespace": true, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmweIrcVjTI0=" + }, + "wordWrap": false, + "suppressAttributes": true, + "suppressOperations": true, + "suppressReceptions": true, + "showMultiplicity": true, + "showOperationSignature": true, + "attributeCompartment": { + "$ref": "AAAAAAFXmweIrcVoTE8=" + }, + "operationCompartment": { + "$ref": "AAAAAAFXmweIrsVp1OA=" + }, + "receptionCompartment": { + "$ref": "AAAAAAFXmweIrsVq3iY=" + }, + "templateParameterCompartment": { + "$ref": "AAAAAAFXmweIrsVr8cA=" + } + }, + { + "_type": "UMLInterfaceRealizationView", + "_id": "AAAAAAFXmwgWISehNBw=", + "_parent": { + "$ref": "AAAAAAFF+qBtyKM79qY=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwgWIieiiIY=", + "_parent": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1465, + "top": 320, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwgWIiej800=", + "_parent": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": null, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1450, + "top": 320, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 30, + "hostEdge": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmwgWIieksT0=", + "_parent": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "model": { + "$ref": "AAAAAAFUmORm3fAwE60=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 1494, + "top": 321, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 15, + "hostEdge": { + "$ref": "AAAAAAFXmwgWISehNBw=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmweIrMVi0w8=" + }, + "tail": { + "$ref": "AAAAAAFUmOQ29O44VzA=" + }, + "lineStyle": 0, + "points": "1480:352;1480:303", + "stereotypeDisplay": "label", + "showVisibility": true, + "showProperty": true, + "nameLabel": { + "$ref": "AAAAAAFXmwgWIieiiIY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmwgWIiej800=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmwgWIieksT0=" + } } ] }, @@ -10033,7 +12350,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 0, + "left": -400, "top": 0, "width": 0, "height": 13, @@ -10057,9 +12374,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 221, + "left": 21, "top": 47, - "width": 86, + "width": 93.33544921875, "height": 13, "autoResize": false, "underline": false, @@ -10082,9 +12399,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 0, + "left": -400, "top": 0, - "width": 106, + "width": 116.3779296875, "height": 13, "autoResize": false, "underline": false, @@ -10107,7 +12424,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 0, + "left": -400, "top": 0, "width": 0, "height": 13, @@ -10126,9 +12443,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 216, + "left": 16, "top": 40, - "width": 96, + "width": 103.33544921875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -10162,10 +12479,10 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 264, + "left": 68, "top": 80, "width": 1, - "height": 369, + "height": 399, "autoResize": false } ], @@ -10178,10 +12495,10 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 216, + "left": 16, "top": 40, - "width": 96, - "height": 409, + "width": 103.33544921875, + "height": 439, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -10231,7 +12548,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1122, + "left": -1554, "top": 0, "width": 0, "height": 13, @@ -10255,9 +12572,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 349, + "left": 133, "top": 47, - "width": 229, + "width": 245.41064453125, "height": 13, "autoResize": false, "underline": false, @@ -10280,9 +12597,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1122, + "left": -1554, "top": 0, - "width": 106, + "width": 116.3779296875, "height": 13, "autoResize": false, "underline": false, @@ -10305,7 +12622,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": -1122, + "left": -1554, "top": 0, "width": 0, "height": 13, @@ -10324,9 +12641,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 344, + "left": 128, "top": 40, - "width": 239, + "width": 255.41064453125, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -10360,10 +12677,10 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 464, + "left": 256, "top": 80, "width": 1, - "height": 369, + "height": 399, "autoResize": false } ], @@ -10376,10 +12693,10 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 344, + "left": 128, "top": 40, - "width": 239, - "height": 409, + "width": 255.41064453125, + "height": 439, "autoResize": false, "stereotypeDisplay": "label", "showVisibility": true, @@ -10455,11 +12772,11 @@ "containerExtending": false, "left": 605, "top": 47, - "width": 207, + "width": 219.958984375, "height": 13, "autoResize": false, "underline": false, - "text": "Lifeline2: SDWebImageManager", + "text": "Lifeline3: SDWebImageManager", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -10480,7 +12797,7 @@ "containerExtending": false, "left": -1216, "top": 0, - "width": 106, + "width": 116.3779296875, "height": 13, "autoResize": false, "underline": false, @@ -10524,7 +12841,7 @@ "containerExtending": false, "left": 600, "top": 40, - "width": 217, + "width": 229.958984375, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -10558,7 +12875,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 709, + "left": 715, "top": 80, "width": 1, "height": 369, @@ -10576,7 +12893,7 @@ "containerExtending": false, "left": 600, "top": 40, - "width": 217, + "width": 229.958984375, "height": 409, "autoResize": false, "stereotypeDisplay": "label", @@ -10620,7 +12937,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 284, + "left": 82, "top": 104, "width": 153, "height": 13, @@ -10654,7 +12971,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 360, + "left": 158, "top": 89, "width": 0, "height": 13, @@ -10687,7 +13004,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 360, + "left": 158, "top": 124, "width": 0, "height": 13, @@ -10720,7 +13037,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 457, + "left": 249, "top": 120, "width": 14, "height": 29, @@ -10743,7 +13060,7 @@ "$ref": "AAAAAAFUv2aETcyhhXc=" }, "lineStyle": 0, - "points": "264:120;457:120", + "points": "68:120;249:120", "nameLabel": { "$ref": "AAAAAAFUv2qLSM2+Rpk=" }, @@ -10759,173 +13076,6 @@ "showProperty": true, "showType": true }, - { - "_type": "UMLSeqMessageView", - "_id": "AAAAAAFUv2rvmM3T5cQ=", - "_parent": { - "$ref": "AAAAAAFUkhaWOozTHHk=" - }, - "model": { - "$ref": "AAAAAAFUv2rvmM3S8xg=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2rvmc3Urws=", - "_parent": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "model": { - "$ref": "AAAAAAFUv2rvmM3S8xg=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 515, - "top": 128, - "width": 142, - "height": 13, - "autoResize": false, - "alpha": 1.5707953267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "edgePosition": 1, - "underline": false, - "text": "2 : loadImageWithURL:()", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2rvmc3VoDs=", - "_parent": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "model": { - "$ref": "AAAAAAFUv2rvmM3S8xg=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 586, - "top": 113, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2rvmc3WRCk=", - "_parent": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "model": { - "$ref": "AAAAAAFUv2rvmM3S8xg=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 586, - "top": 148, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLActivationView", - "_id": "AAAAAAFUv2rvmc3XXzY=", - "_parent": { - "$ref": "AAAAAAFUv2rvmM3T5cQ=" - }, - "model": { - "$ref": "AAAAAAFUv2rvmM3S8xg=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 702, - "top": 144, - "width": 14, - "height": 29, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUv2n3Rs1mvsI=" - }, - "tail": { - "$ref": "AAAAAAFUv2nXbM1HcJ0=" - }, - "lineStyle": 0, - "points": "470:144;702:144", - "nameLabel": { - "$ref": "AAAAAAFUv2rvmc3Urws=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv2rvmc3VoDs=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv2rvmc3WRCk=" - }, - "activation": { - "$ref": "AAAAAAFUv2rvmc3XXzY=" - }, - "showProperty": true, - "showType": true - }, { "_type": "UMLSeqLifelineView", "_id": "AAAAAAFUv2ti0c3qqN0=", @@ -10987,11 +13137,11 @@ "containerExtending": false, "left": 845, "top": 47, - "width": 165, + "width": 174.23046875, "height": 13, "autoResize": false, "underline": false, - "text": "Lifeline3: SDImageCache", + "text": "Lifeline4: SDImageCache", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -11012,7 +13162,7 @@ "containerExtending": false, "left": -192, "top": 0, - "width": 106, + "width": 116.3779296875, "height": 13, "autoResize": false, "underline": false, @@ -11056,7 +13206,7 @@ "containerExtending": false, "left": 840, "top": 40, - "width": 175, + "width": 184.23046875, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -11090,7 +13240,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 928, + "left": 932, "top": 80, "width": 1, "height": 361, @@ -11108,7 +13258,7 @@ "containerExtending": false, "left": 840, "top": 40, - "width": 175, + "width": 184.23046875, "height": 401, "autoResize": false, "stereotypeDisplay": "label", @@ -11124,340 +13274,6 @@ "$ref": "AAAAAAFUv2ti0s3wcIg=" } }, - { - "_type": "UMLSeqMessageView", - "_id": "AAAAAAFUv2v1XM4K3QQ=", - "_parent": { - "$ref": "AAAAAAFUkhaWOozTHHk=" - }, - "model": { - "$ref": "AAAAAAFUv2v1XM4JR/4=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2v1XM4L7pY=", - "_parent": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "model": { - "$ref": "AAAAAAFUv2v1XM4JR/4=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 736, - "top": 152, - "width": 164, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "edgePosition": 1, - "underline": false, - "text": "3 : queryDiskCacheForKey()", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2v1Xc4MPnU=", - "_parent": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "model": { - "$ref": "AAAAAAFUv2v1XM4JR/4=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 818, - "top": 137, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2v1Xc4NX9s=", - "_parent": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "model": { - "$ref": "AAAAAAFUv2v1XM4JR/4=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 818, - "top": 172, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLActivationView", - "_id": "AAAAAAFUv2v1Xc4OIGU=", - "_parent": { - "$ref": "AAAAAAFUv2v1XM4K3QQ=" - }, - "model": { - "$ref": "AAAAAAFUv2v1XM4JR/4=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 921, - "top": 168, - "width": 14, - "height": 29, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUv2ti0s3wcIg=" - }, - "tail": { - "$ref": "AAAAAAFUv2n3Rs1mvsI=" - }, - "lineStyle": 0, - "points": "715:168;921:168", - "nameLabel": { - "$ref": "AAAAAAFUv2v1XM4L7pY=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv2v1Xc4MPnU=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv2v1Xc4NX9s=" - }, - "activation": { - "$ref": "AAAAAAFUv2v1Xc4OIGU=" - }, - "showProperty": true, - "showType": true - }, - { - "_type": "UMLSeqMessageView", - "_id": "AAAAAAFUv2z30M4lNWE=", - "_parent": { - "$ref": "AAAAAAFUkhaWOozTHHk=" - }, - "model": { - "$ref": "AAAAAAFUv2z3z84kqYU=" - }, - "subViews": [ - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2z30M4mUAU=", - "_parent": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "model": { - "$ref": "AAAAAAFUv2z3z84kqYU=" - }, - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 778, - "top": 212, - "width": 79, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "edgePosition": 1, - "underline": false, - "text": "4 : disk result", - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2z30M4nw8c=", - "_parent": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "model": { - "$ref": "AAAAAAFUv2z3z84kqYU=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 817, - "top": 227, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 25, - "hostEdge": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "EdgeLabelView", - "_id": "AAAAAAFUv2z30M4odbY=", - "_parent": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "model": { - "$ref": "AAAAAAFUv2z3z84kqYU=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 818, - "top": 192, - "width": 0, - "height": 13, - "autoResize": false, - "alpha": -1.5707963267948966, - "distance": 10, - "hostEdge": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "edgePosition": 1, - "underline": false, - "horizontalAlignment": 2, - "verticalAlignment": 5 - }, - { - "_type": "UMLActivationView", - "_id": "AAAAAAFUv2z30c4pSow=", - "_parent": { - "$ref": "AAAAAAFUv2z30M4lNWE=" - }, - "model": { - "$ref": "AAAAAAFUv2z3z84kqYU=" - }, - "visible": false, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "left": 709, - "top": 208, - "width": 14, - "height": 25, - "autoResize": false - } - ], - "visible": true, - "enabled": true, - "lineColor": "#000000", - "fillColor": "#ffffff", - "fontColor": "#000000", - "font": "Arial;13;0", - "showShadow": true, - "containerChangeable": false, - "containerExtending": false, - "head": { - "$ref": "AAAAAAFUv2n3Rs1mvsI=" - }, - "tail": { - "$ref": "AAAAAAFUv2ti0s3wcIg=" - }, - "lineStyle": 0, - "points": "928:208;709:208", - "nameLabel": { - "$ref": "AAAAAAFUv2z30M4mUAU=" - }, - "stereotypeLabel": { - "$ref": "AAAAAAFUv2z30M4nw8c=" - }, - "propertyLabel": { - "$ref": "AAAAAAFUv2z30M4odbY=" - }, - "activation": { - "$ref": "AAAAAAFUv2z30c4pSow=" - }, - "showProperty": true, - "showType": true - }, { "_type": "UMLSeqLifelineView", "_id": "AAAAAAFUv22omM5CQm8=", @@ -11519,11 +13335,11 @@ "containerExtending": false, "left": 1045, "top": 47, - "width": 228, + "width": 242.912109375, "height": 13, "autoResize": false, "underline": false, - "text": "Lifeline4: SDWebImageDownloader", + "text": "Lifeline5: SDWebImageDownloader", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -11544,7 +13360,7 @@ "containerExtending": false, "left": -144, "top": 0, - "width": 106, + "width": 116.3779296875, "height": 13, "autoResize": false, "underline": false, @@ -11588,7 +13404,7 @@ "containerExtending": false, "left": 1040, "top": 40, - "width": 238, + "width": 252.912109375, "height": 40, "autoResize": false, "stereotypeLabel": { @@ -11622,7 +13438,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1159, + "left": 1166, "top": 80, "width": 1, "height": 271, @@ -11640,7 +13456,7 @@ "containerExtending": false, "left": 1040, "top": 40, - "width": 238, + "width": 252.912109375, "height": 311, "autoResize": false, "stereotypeDisplay": "label", @@ -11656,6 +13472,674 @@ "$ref": "AAAAAAFUv22omc5ImFY=" } }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFXmw7K85hmo5Q=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFXmw7K8phl/ns=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw7K85hnTgg=", + "_parent": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "model": { + "$ref": "AAAAAAFXmw7K8phl/ns=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 276, + "top": 120, + "width": 197, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "edgePosition": 1, + "underline": false, + "text": "2 : sd_internalSetImageWithURL()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw7K85ho9qQ=", + "_parent": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "model": { + "$ref": "AAAAAAFXmw7K8phl/ns=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 374, + "top": 105, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw7K85hpBeU=", + "_parent": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "model": { + "$ref": "AAAAAAFXmw7K8phl/ns=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 374, + "top": 140, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFXmw7K85hqA4o=", + "_parent": { + "$ref": "AAAAAAFXmw7K85hmo5Q=" + }, + "model": { + "$ref": "AAAAAAFXmw7K8phl/ns=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 486, + "top": 136, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFXmwx1Rpf0Po8=" + }, + "tail": { + "$ref": "AAAAAAFUv2nXbM1HcJ0=" + }, + "lineStyle": 0, + "points": "262:136;486:136", + "nameLabel": { + "$ref": "AAAAAAFXmw7K85hnTgg=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmw7K85ho9qQ=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmw7K85hpBeU=" + }, + "activation": { + "$ref": "AAAAAAFXmw7K85hqA4o=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFXmw++VZh9CRk=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFXmw++VJh8ixo=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw++VZh+iEI=", + "_parent": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "model": { + "$ref": "AAAAAAFXmw++VJh8ixo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 532, + "top": 136, + "width": 142, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "edgePosition": 1, + "underline": false, + "text": "3 : loadImageWithURL:()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw++VZh/8Ys=", + "_parent": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "model": { + "$ref": "AAAAAAFXmw++VJh8ixo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 603, + "top": 121, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFXmw++VZiAOKg=", + "_parent": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "model": { + "$ref": "AAAAAAFXmw++VJh8ixo=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 603, + "top": 156, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFXmw++VZiBUwE=", + "_parent": { + "$ref": "AAAAAAFXmw++VZh9CRk=" + }, + "model": { + "$ref": "AAAAAAFXmw++VJh8ixo=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 708, + "top": 152, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "tail": { + "$ref": "AAAAAAFXmwx1Rpf0Po8=" + }, + "lineStyle": 0, + "points": "499:152;708:152", + "nameLabel": { + "$ref": "AAAAAAFXmw++VZh+iEI=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFXmw++VZh/8Ys=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmw++VZiAOKg=" + }, + "activation": { + "$ref": "AAAAAAFXmw++VZiBUwE=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2v1XM4K3QQ=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1XM4L7pY=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 741, + "top": 152, + "width": 164, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "text": "4 : queryDiskCacheForKey()", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1Xc4MPnU=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 823, + "top": 137, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2v1Xc4NX9s=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 823, + "top": 172, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2v1Xc4OIGU=", + "_parent": { + "$ref": "AAAAAAFUv2v1XM4K3QQ=" + }, + "model": { + "$ref": "AAAAAAFUv2v1XM4JR/4=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 925, + "top": 168, + "width": 14, + "height": 29, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + }, + "tail": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "lineStyle": 0, + "points": "721:168;925:168", + "nameLabel": { + "$ref": "AAAAAAFUv2v1XM4L7pY=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2v1Xc4MPnU=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2v1Xc4NX9s=" + }, + "activation": { + "$ref": "AAAAAAFUv2v1Xc4OIGU=" + }, + "showProperty": true, + "showType": true + }, + { + "_type": "UMLSeqMessageView", + "_id": "AAAAAAFUv2z30M4lNWE=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "subViews": [ + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4mUAU=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 783, + "top": 212, + "width": 79, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "text": "5 : disk result", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4nw8c=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 822, + "top": 227, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": 1.5707963267948966, + "distance": 25, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "EdgeLabelView", + "_id": "AAAAAAFUv2z30M4odbY=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 823, + "top": 192, + "width": 0, + "height": 13, + "autoResize": false, + "alpha": -1.5707963267948966, + "distance": 10, + "hostEdge": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "edgePosition": 1, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "UMLActivationView", + "_id": "AAAAAAFUv2z30c4pSow=", + "_parent": { + "$ref": "AAAAAAFUv2z30M4lNWE=" + }, + "model": { + "$ref": "AAAAAAFUv2z3z84kqYU=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 715, + "top": 208, + "width": 14, + "height": 25, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "head": { + "$ref": "AAAAAAFUv2n3Rs1mvsI=" + }, + "tail": { + "$ref": "AAAAAAFUv2ti0s3wcIg=" + }, + "lineStyle": 0, + "points": "932:208;715:208", + "nameLabel": { + "$ref": "AAAAAAFUv2z30M4mUAU=" + }, + "stereotypeLabel": { + "$ref": "AAAAAAFUv2z30M4nw8c=" + }, + "propertyLabel": { + "$ref": "AAAAAAFUv2z30M4odbY=" + }, + "activation": { + "$ref": "AAAAAAFUv2z30c4pSow=" + }, + "showProperty": true, + "showType": true + }, { "_type": "UMLSeqMessageView", "_id": "AAAAAAFUv235TM5iC/o=", @@ -11684,9 +14168,9 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 846, + "left": 784, "top": 256, - "width": 168, + "width": 307, "height": 13, "autoResize": false, "alpha": 1.5707963267948966, @@ -11696,7 +14180,7 @@ }, "edgePosition": 1, "underline": false, - "text": "5 : downloadImageWithURL()", + "text": "6 : downloadImage(url, options, progress, completed)", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -11718,7 +14202,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 930, + "left": 937, "top": 241, "width": 0, "height": 13, @@ -11751,7 +14235,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 930, + "left": 937, "top": 276, "width": 0, "height": 13, @@ -11784,7 +14268,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 1152, + "left": 1159, "top": 272, "width": 14, "height": 29, @@ -11807,7 +14291,7 @@ "$ref": "AAAAAAFUv2n3Rs1mvsI=" }, "lineStyle": 0, - "points": "709:272;1152:272", + "points": "715:272;1159:272", "nameLabel": { "$ref": "AAAAAAFUv235Tc5jIuU=" }, @@ -11851,19 +14335,19 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 883, - "top": 324, + "left": 967, + "top": 323, "width": 100, "height": 13, "autoResize": false, - "alpha": 1.5707963267948966, - "distance": 10, + "alpha": 3.0124453800482693, + "distance": 77.64663547121665, "hostEdge": { "$ref": "AAAAAAFUv27NWM56DH8=" }, "edgePosition": 1, "underline": false, - "text": "6 : network result", + "text": "7 : network result", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -11885,7 +14369,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 933, + "left": 939, "top": 339, "width": 0, "height": 13, @@ -11918,7 +14402,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 934, + "left": 940, "top": 304, "width": 0, "height": 13, @@ -11951,7 +14435,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 709, + "left": 715, "top": 320, "width": 14, "height": 25, @@ -11974,7 +14458,7 @@ "$ref": "AAAAAAFUv22omc5ImFY=" }, "lineStyle": 0, - "points": "1159:320;709:320", + "points": "1166:320;715:320", "nameLabel": { "$ref": "AAAAAAFUv27NWM57KC8=" }, @@ -11990,6 +14474,204 @@ "showProperty": true, "showType": true }, + { + "_type": "UMLSeqLifelineView", + "_id": "AAAAAAFXmwx1RpfuYEQ=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozTHHk=" + }, + "model": { + "$ref": "AAAAAAFXmwx1Rpft3W0=" + }, + "subViews": [ + { + "_type": "UMLNameCompartmentView", + "_id": "AAAAAAFXmwx1Rpfvk4E=", + "_parent": { + "$ref": "AAAAAAFXmwx1RpfuYEQ=" + }, + "model": { + "$ref": "AAAAAAFXmwx1Rpft3W0=" + }, + "subViews": [ + { + "_type": "LabelView", + "_id": "AAAAAAFXmwx1Rpfwxbg=", + "_parent": { + "$ref": "AAAAAAFXmwx1Rpfvk4E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -132, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwx1RpfxG9g=", + "_parent": { + "$ref": "AAAAAAFXmwx1Rpfvk4E=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;1", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 397, + "top": 47, + "width": 191, + "height": 13, + "autoResize": false, + "underline": false, + "text": "Lifeline2: UIView (WebCache)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwx1Rpfyq/k=", + "_parent": { + "$ref": "AAAAAAFXmwx1Rpfvk4E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -132, + "top": 0, + "width": 106, + "height": 13, + "autoResize": false, + "underline": false, + "text": "(from Interaction1)", + "horizontalAlignment": 2, + "verticalAlignment": 5 + }, + { + "_type": "LabelView", + "_id": "AAAAAAFXmwx1RpfzQBw=", + "_parent": { + "$ref": "AAAAAAFXmwx1Rpfvk4E=" + }, + "visible": false, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": -132, + "top": 0, + "width": 0, + "height": 13, + "autoResize": false, + "underline": false, + "horizontalAlignment": 1, + "verticalAlignment": 5 + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 392, + "top": 40, + "width": 201, + "height": 40, + "autoResize": false, + "stereotypeLabel": { + "$ref": "AAAAAAFXmwx1Rpfwxbg=" + }, + "nameLabel": { + "$ref": "AAAAAAFXmwx1RpfxG9g=" + }, + "namespaceLabel": { + "$ref": "AAAAAAFXmwx1Rpfyq/k=" + }, + "propertyLabel": { + "$ref": "AAAAAAFXmwx1RpfzQBw=" + } + }, + { + "_type": "UMLLinePartView", + "_id": "AAAAAAFXmwx1Rpf0Po8=", + "_parent": { + "$ref": "AAAAAAFXmwx1RpfuYEQ=" + }, + "model": { + "$ref": "AAAAAAFXmwx1Rpft3W0=" + }, + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 493, + "top": 80, + "width": 1, + "height": 375, + "autoResize": false + } + ], + "visible": true, + "enabled": true, + "lineColor": "#000000", + "fillColor": "#ffffff", + "fontColor": "#000000", + "font": "Arial;13;0", + "showShadow": true, + "containerChangeable": false, + "containerExtending": false, + "left": 392, + "top": 40, + "width": 201, + "height": 415, + "autoResize": false, + "stereotypeDisplay": "label", + "showVisibility": true, + "showNamespace": false, + "showProperty": true, + "showType": true, + "nameCompartment": { + "$ref": "AAAAAAFXmwx1Rpfvk4E=" + }, + "wordWrap": false, + "linePart": { + "$ref": "AAAAAAFXmwx1Rpf0Po8=" + } + }, { "_type": "UMLSeqMessageView", "_id": "AAAAAAFUv3C4p87cxD0=", @@ -12018,7 +14700,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 769, + "left": 774, "top": 353, "width": 92, "height": 13, @@ -12030,7 +14712,7 @@ }, "edgePosition": 1, "underline": false, - "text": "7 : storeImage()", + "text": "8 : storeImage()", "horizontalAlignment": 2, "verticalAlignment": 5 }, @@ -12052,7 +14734,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 815, + "left": 820, "top": 338, "width": 0, "height": 13, @@ -12085,7 +14767,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 815, + "left": 820, "top": 373, "width": 0, "height": 13, @@ -12118,7 +14800,7 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 921, + "left": 925, "top": 369, "width": 14, "height": 29, @@ -12141,7 +14823,7 @@ "$ref": "AAAAAAFUv2n3Rs1mvsI=" }, "lineStyle": 0, - "points": "709:369;921:369", + "points": "715:369;925:369", "nameLabel": { "$ref": "AAAAAAFUv3C4qM7dheQ=" }, @@ -12159,22 +14841,22 @@ }, { "_type": "UMLSeqMessageView", - "_id": "AAAAAAFUv3HvS870VtA=", + "_id": "AAAAAAFXmxBoRJiUpvI=", "_parent": { "$ref": "AAAAAAFUkhaWOozTHHk=" }, "model": { - "$ref": "AAAAAAFUv3HvS87z/RM=" + "$ref": "AAAAAAFXmxBoRJiTAtY=" }, "subViews": [ { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3HvTM7122A=", + "_id": "AAAAAAFXmxBoRZiVYHw=", "_parent": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "model": { - "$ref": "AAAAAAFUv3HvS87z/RM=" + "$ref": "AAAAAAFXmxBoRJiTAtY=" }, "visible": true, "enabled": true, @@ -12185,30 +14867,30 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 558, - "top": 405, + "left": 576, + "top": 404, "width": 54, "height": 13, "autoResize": false, "alpha": 1.5707963267948966, "distance": 10, "hostEdge": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "edgePosition": 1, "underline": false, - "text": "8 : image", + "text": "9 : image", "horizontalAlignment": 2, "verticalAlignment": 5 }, { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3HvTM7215Q=", + "_id": "AAAAAAFXmxBoRZiWIYg=", "_parent": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "model": { - "$ref": "AAAAAAFUv3HvS87z/RM=" + "$ref": "AAAAAAFXmxBoRJiTAtY=" }, "visible": false, "enabled": true, @@ -12219,15 +14901,15 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 585, - "top": 420, + "left": 603, + "top": 419, "width": 0, "height": 13, "autoResize": false, "alpha": 1.5707963267948966, "distance": 25, "hostEdge": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "edgePosition": 1, "underline": false, @@ -12236,12 +14918,12 @@ }, { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3HvTM73+D4=", + "_id": "AAAAAAFXmxBoRZiXh28=", "_parent": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "model": { - "$ref": "AAAAAAFUv3HvS87z/RM=" + "$ref": "AAAAAAFXmxBoRJiTAtY=" }, "visible": false, "enabled": true, @@ -12252,15 +14934,15 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 586, - "top": 385, + "left": 604, + "top": 384, "width": 0, "height": 13, "autoResize": false, "alpha": -1.5707963267948966, "distance": 10, "hostEdge": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "edgePosition": 1, "underline": false, @@ -12269,12 +14951,12 @@ }, { "_type": "UMLActivationView", - "_id": "AAAAAAFUv3HvTM74fZk=", + "_id": "AAAAAAFXmxBoRZiYI2g=", "_parent": { - "$ref": "AAAAAAFUv3HvS870VtA=" + "$ref": "AAAAAAFXmxBoRJiUpvI=" }, "model": { - "$ref": "AAAAAAFUv3HvS87z/RM=" + "$ref": "AAAAAAFXmxBoRJiTAtY=" }, "visible": false, "enabled": true, @@ -12285,8 +14967,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 464, - "top": 401, + "left": 493, + "top": 400, "width": 14, "height": 25, "autoResize": false @@ -12302,46 +14984,46 @@ "containerChangeable": false, "containerExtending": false, "head": { - "$ref": "AAAAAAFUv2nXbM1HcJ0=" + "$ref": "AAAAAAFXmwx1Rpf0Po8=" }, "tail": { "$ref": "AAAAAAFUv2n3Rs1mvsI=" }, "lineStyle": 0, - "points": "709:401;464:401", + "points": "715:400;493:400", "nameLabel": { - "$ref": "AAAAAAFUv3HvTM7122A=" + "$ref": "AAAAAAFXmxBoRZiVYHw=" }, "stereotypeLabel": { - "$ref": "AAAAAAFUv3HvTM7215Q=" + "$ref": "AAAAAAFXmxBoRZiWIYg=" }, "propertyLabel": { - "$ref": "AAAAAAFUv3HvTM73+D4=" + "$ref": "AAAAAAFXmxBoRZiXh28=" }, "activation": { - "$ref": "AAAAAAFUv3HvTM74fZk=" + "$ref": "AAAAAAFXmxBoRZiYI2g=" }, "showProperty": true, "showType": true }, { "_type": "UMLSeqMessageView", - "_id": "AAAAAAFUv3Je6M8LSBs=", + "_id": "AAAAAAFXmxC8H5jJURo=", "_parent": { "$ref": "AAAAAAFUkhaWOozTHHk=" }, "model": { - "$ref": "AAAAAAFUv3Je6M8Kzp4=" + "$ref": "AAAAAAFXmxC8H5jIbu4=" }, "subViews": [ { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3Je6M8MCNc=", + "_id": "AAAAAAFXmxC8H5jKD8g=", "_parent": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "model": { - "$ref": "AAAAAAFUv3Je6M8Kzp4=" + "$ref": "AAAAAAFXmxC8H5jIbu4=" }, "visible": true, "enabled": true, @@ -12352,30 +15034,30 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 325, - "top": 420, - "width": 76, + "left": 332, + "top": 428, + "width": 83, "height": 13, "autoResize": false, "alpha": 1.5707963267948966, "distance": 10, "hostEdge": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "edgePosition": 1, "underline": false, - "text": "9 : set image", + "text": "10 : set image", "horizontalAlignment": 2, "verticalAlignment": 5 }, { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3Je6c8NDpI=", + "_id": "AAAAAAFXmxC8H5jLiWU=", "_parent": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "model": { - "$ref": "AAAAAAFUv3Je6M8Kzp4=" + "$ref": "AAAAAAFXmxC8H5jIbu4=" }, "visible": false, "enabled": true, @@ -12386,15 +15068,15 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 363, - "top": 435, + "left": 373, + "top": 443, "width": 0, "height": 13, "autoResize": false, "alpha": 1.5707963267948966, "distance": 25, "hostEdge": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "edgePosition": 1, "underline": false, @@ -12403,12 +15085,12 @@ }, { "_type": "EdgeLabelView", - "_id": "AAAAAAFUv3Je6c8OBck=", + "_id": "AAAAAAFXmxC8H5jMFqs=", "_parent": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "model": { - "$ref": "AAAAAAFUv3Je6M8Kzp4=" + "$ref": "AAAAAAFXmxC8H5jIbu4=" }, "visible": false, "enabled": true, @@ -12419,15 +15101,15 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 364, - "top": 400, + "left": 374, + "top": 408, "width": 0, "height": 13, "autoResize": false, "alpha": -1.5707963267948966, "distance": 10, "hostEdge": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "edgePosition": 1, "underline": false, @@ -12436,12 +15118,12 @@ }, { "_type": "UMLActivationView", - "_id": "AAAAAAFUv3Je6c8P9Dk=", + "_id": "AAAAAAFXmxC8H5jNKho=", "_parent": { - "$ref": "AAAAAAFUv3Je6M8LSBs=" + "$ref": "AAAAAAFXmxC8H5jJURo=" }, "model": { - "$ref": "AAAAAAFUv3Je6M8Kzp4=" + "$ref": "AAAAAAFXmxC8H5jIbu4=" }, "visible": false, "enabled": true, @@ -12452,8 +15134,8 @@ "showShadow": true, "containerChangeable": false, "containerExtending": false, - "left": 264, - "top": 416, + "left": 256, + "top": 424, "width": 14, "height": 25, "autoResize": false @@ -12469,24 +15151,24 @@ "containerChangeable": false, "containerExtending": false, "head": { - "$ref": "AAAAAAFUv2aETcyhhXc=" - }, - "tail": { "$ref": "AAAAAAFUv2nXbM1HcJ0=" }, + "tail": { + "$ref": "AAAAAAFXmwx1Rpf0Po8=" + }, "lineStyle": 0, - "points": "464:416;264:416", + "points": "493:424;256:424", "nameLabel": { - "$ref": "AAAAAAFUv3Je6M8MCNc=" + "$ref": "AAAAAAFXmxC8H5jKD8g=" }, "stereotypeLabel": { - "$ref": "AAAAAAFUv3Je6c8NDpI=" + "$ref": "AAAAAAFXmxC8H5jLiWU=" }, "propertyLabel": { - "$ref": "AAAAAAFUv3Je6c8OBck=" + "$ref": "AAAAAAFXmxC8H5jMFqs=" }, "activation": { - "$ref": "AAAAAAFUv3Je6c8P9Dk=" + "$ref": "AAAAAAFXmxC8H5jNKho=" }, "showProperty": true, "showType": true @@ -12522,7 +15204,7 @@ }, { "_type": "UMLMessage", - "_id": "AAAAAAFUv2rvmM3S8xg=", + "_id": "AAAAAAFXmw7K8phl/ns=", "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, @@ -12530,6 +15212,26 @@ "source": { "$ref": "AAAAAAFUv2nXaM1AL0k=" }, + "target": { + "$ref": "AAAAAAFXmwx1Rpft3W0=" + }, + "visibility": "public", + "messageSort": "asynchCall", + "signature": { + "$ref": "AAAAAAFXmsqK3idvzv0=" + }, + "isConcurrentIteration": false + }, + { + "_type": "UMLMessage", + "_id": "AAAAAAFXmw++VJh8ixo=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Message6", + "source": { + "$ref": "AAAAAAFXmwx1Rpft3W0=" + }, "target": { "$ref": "AAAAAAFUv2n3Rc1fbGI=" }, @@ -12636,7 +15338,7 @@ }, { "_type": "UMLMessage", - "_id": "AAAAAAFUv3HvS87z/RM=", + "_id": "AAAAAAFXmxBoRJiTAtY=", "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, @@ -12645,7 +15347,7 @@ "$ref": "AAAAAAFUv2n3Rc1fbGI=" }, "target": { - "$ref": "AAAAAAFUv2nXaM1AL0k=" + "$ref": "AAAAAAFXmwx1Rpft3W0=" }, "visibility": "public", "messageSort": "reply", @@ -12653,16 +15355,16 @@ }, { "_type": "UMLMessage", - "_id": "AAAAAAFUv3Je6M8Kzp4=", + "_id": "AAAAAAFXmxC8H5jIbu4=", "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, "name": "set image", "source": { - "$ref": "AAAAAAFUv2nXaM1AL0k=" + "$ref": "AAAAAAFXmwx1Rpft3W0=" }, "target": { - "$ref": "AAAAAAFUv2aES8yaBvg=" + "$ref": "AAAAAAFUv2nXaM1AL0k=" }, "visibility": "public", "messageSort": "reply", @@ -12702,7 +15404,7 @@ "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, - "name": "Lifeline2", + "name": "Lifeline3", "visibility": "public", "represent": { "$ref": "AAAAAAFUv2n3Rc1e9QI=" @@ -12715,7 +15417,7 @@ "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, - "name": "Lifeline3", + "name": "Lifeline4", "visibility": "public", "represent": { "$ref": "AAAAAAFUv2ti0c3ocQo=" @@ -12728,12 +15430,25 @@ "_parent": { "$ref": "AAAAAAFUkhaWOozSZjs=" }, - "name": "Lifeline4", + "name": "Lifeline5", "visibility": "public", "represent": { "$ref": "AAAAAAFUv22ol85ADFk=" }, "isMultiInstance": false + }, + { + "_type": "UMLLifeline", + "_id": "AAAAAAFXmwx1Rpft3W0=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozSZjs=" + }, + "name": "Lifeline2", + "visibility": "public", + "represent": { + "$ref": "AAAAAAFXmwx1Rpfs4dU=" + }, + "isMultiInstance": false } ] } @@ -12786,6 +15501,7 @@ "visibility": "public", "isStatic": false, "isLeaf": false, + "type": "", "isReadOnly": false, "isOrdered": false, "isUnique": false, @@ -12803,6 +15519,7 @@ "visibility": "public", "isStatic": false, "isLeaf": false, + "type": "", "isReadOnly": false, "isOrdered": false, "isUnique": false, @@ -12889,6 +15606,26 @@ "isDerived": false, "aggregation": "none", "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFXmwx1Rpfs4dU=", + "_parent": { + "$ref": "AAAAAAFUkhaWOozRCy8=" + }, + "name": "Role9", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false } ], "isAbstract": false, @@ -13081,6 +15818,18 @@ "isLeaf": false, "isActive": false }, + { + "_type": "UMLInterface", + "_id": "AAAAAAFXmwdRJMUYGTs=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageDownloaderOperationInterface", + "visibility": "public", + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false + }, { "_type": "UMLInterface", "_id": "AAAAAAFUkhg5/4zs5zU=", @@ -13191,7 +15940,7 @@ "$ref": "AAAAAAFUmNgnHdueiaU=" }, "reference": { - "$ref": "AAAAAAFUkh79WI34fB0=" + "$ref": "AAAAAAFXmwGn6ZeqpYw=" }, "visibility": "public", "navigable": true, @@ -13209,7 +15958,7 @@ "$ref": "AAAAAAFUmNgnHdueiaU=" }, "reference": { - "$ref": "AAAAAAFUkhwuq42z3w4=" + "$ref": "AAAAAAFUkh79WI34fB0=" }, "visibility": "public", "navigable": true, @@ -13684,60 +16433,6 @@ "aggregation": "none", "isID": false }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAFUmPBKVhghKWk=", - "_parent": { - "$ref": "AAAAAAFUkh79WI34fB0=" - }, - "name": "shouldDecompressImages", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "aggregation": "none", - "isID": false - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAFUmPBxrhjcaQc=", - "_parent": { - "$ref": "AAAAAAFUkh79WI34fB0=" - }, - "name": "shouldDisableiCloud", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "aggregation": "none", - "isID": false - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAFUmPCLlRmXEPs=", - "_parent": { - "$ref": "AAAAAAFUkh79WI34fB0=" - }, - "name": "shouldCacheImagesInMemory", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "aggregation": "none", - "isID": false - }, { "_type": "UMLAttribute", "_id": "AAAAAAFUmPDC7hpSvPQ=", @@ -13773,42 +16468,6 @@ "isDerived": false, "aggregation": "none", "isID": false - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAFUmPD+pRvI9sU=", - "_parent": { - "$ref": "AAAAAAFUkh79WI34fB0=" - }, - "name": "maxCacheAge", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "aggregation": "none", - "isID": false - }, - { - "_type": "UMLAttribute", - "_id": "AAAAAAFUmPEdRRyDmKo=", - "_parent": { - "$ref": "AAAAAAFUkh79WI34fB0=" - }, - "name": "maxCacheSize", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "aggregation": "none", - "isID": false } ], "operations": [ @@ -14038,6 +16697,159 @@ "isLeaf": false, "isActive": false }, + { + "_type": "UMLClass", + "_id": "AAAAAAFXmwGn6ZeqpYw=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDImageCacheConfig", + "ownedElements": [ + { + "_type": "UMLAssociation", + "_id": "AAAAAAFXmwYAOLO3R8M=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "end1": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFXmwYAOLO4X9g=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "reference": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "none", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "end2": { + "_type": "UMLAssociationEnd", + "_id": "AAAAAAFXmwYAOLO5TNo=", + "_parent": { + "$ref": "AAAAAAFXmwYAOLO3R8M=" + }, + "name": "config", + "reference": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "visibility": "public", + "navigable": true, + "aggregation": "shared", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "isID": false + }, + "visibility": "public", + "isDerived": false + } + ], + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPBKVhghKWk=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "name": "shouldDecompressImages", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPBxrhjcaQc=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "name": "shouldDisableiCloud", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPCLlRmXEPs=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "name": "shouldCacheImagesInMemory", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPD+pRvI9sU=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "name": "maxCacheAge", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFUmPEdRRyDmKo=", + "_parent": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "name": "maxCacheSize", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, { "_type": "UMLClass", "_id": "AAAAAAFUkh8UMI38gtY=", @@ -14219,13 +17031,45 @@ } ], "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmuCdynfN50Y=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "init", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuEYDHj2f9E=", + "_parent": { + "$ref": "AAAAAAFXmuCdynfN50Y=" + }, + "name": "sessionConfiguration", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, { "_type": "UMLOperation", "_id": "AAAAAAFUmOOite2pkfo=", "_parent": { "$ref": "AAAAAAFUkh8UMI38gtY=" }, - "name": "downloadImageWithURL", + "name": "downloadImage", "visibility": "public", "isStatic": false, "isLeaf": false, @@ -14236,17 +17080,112 @@ "_parent": { "$ref": "AAAAAAFUmOOite2pkfo=" }, - "name": "Parameter1", "visibility": "public", "isStatic": false, "isLeaf": false, "type": { - "$ref": "AAAAAAFUmNVIhta461s=" + "$ref": "AAAAAAFXmuJtT3q/PXo=" }, "isReadOnly": false, "isOrdered": false, "isUnique": false, "direction": "return" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuK8y3sdotY=", + "_parent": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "name": "url", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuLgMHuZcI8=", + "_parent": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "name": "options", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuMLQXwVkMM=", + "_parent": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "name": "progress", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuM7iXyR7gc=", + "_parent": { + "$ref": "AAAAAAFUmOOite2pkfo=" + }, + "name": "completed", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmuQArX//uuI=", + "_parent": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "name": "cancel", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmuQ4uoEJf7Q=", + "_parent": { + "$ref": "AAAAAAFXmuQArX//uuI=" + }, + "name": "token", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" } ], "concurrency": "sequential", @@ -14356,6 +17295,73 @@ } ] }, + { + "_type": "UMLClass", + "_id": "AAAAAAFXmuJtT3q/PXo=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "SDWebImageDownloadToken", + "ownedElements": [ + { + "_type": "UMLDependency", + "_id": "AAAAAAFXmuZ1booW7c8=", + "_parent": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "source": { + "$ref": "AAAAAAFUkh8UMI38gtY=" + }, + "target": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "visibility": "public" + } + ], + "visibility": "public", + "attributes": [ + { + "_type": "UMLAttribute", + "_id": "AAAAAAFXmuY4yIivPbY=", + "_parent": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "name": "url", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFXmuZPjolqbRg=", + "_parent": { + "$ref": "AAAAAAFXmuJtT3q/PXo=" + }, + "name": "downloadOperationCancelToken", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, { "_type": "UMLClass", "_id": "AAAAAAFUkiR/Go5pUW0=", @@ -14374,7 +17380,7 @@ "$ref": "AAAAAAFUkiR/Go5pUW0=" }, "target": { - "$ref": "AAAAAAFUmNVIhta461s=" + "$ref": "AAAAAAFXmwdRJMUYGTs=" }, "visibility": "public" }, @@ -14504,6 +17510,24 @@ "isDerived": false, "aggregation": "none", "isID": false + }, + { + "_type": "UMLAttribute", + "_id": "AAAAAAFXmt1lVW0nz6U=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "dataTask", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "isDerived": false, + "aggregation": "none", + "isID": false } ], "operations": [ @@ -14534,6 +17558,22 @@ "isUnique": false, "direction": "in" }, + { + "_type": "UMLParameter", + "_id": "AAAAAAFXmt4TNm7JJVo=", + "_parent": { + "$ref": "AAAAAAFUmO55eBHmK5M=" + }, + "name": "session", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "type": "", + "isReadOnly": false, + "isOrdered": false, + "isUnique": false, + "direction": "in" + }, { "_type": "UMLParameter", "_id": "AAAAAAFUmO731xMtljo=", @@ -14549,14 +17589,30 @@ "isOrdered": false, "isUnique": false, "direction": "in" - }, + } + ], + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmt5iT2+ClWI=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "addHandlers", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "parameters": [ { "_type": "UMLParameter", - "_id": "AAAAAAFUmO8cHxOp5oU=", + "_id": "AAAAAAFXmt6z23BNV0g=", "_parent": { - "$ref": "AAAAAAFUmO55eBHmK5M=" + "$ref": "AAAAAAFXmt5iT2+ClWI=" }, - "name": "progress", + "name": "progressBlock", "visibility": "public", "isStatic": false, "isLeaf": false, @@ -14568,27 +17624,11 @@ }, { "_type": "UMLParameter", - "_id": "AAAAAAFUmO8jyBQGoLQ=", + "_id": "AAAAAAFXmt7YlXDJ9ls=", "_parent": { - "$ref": "AAAAAAFUmO55eBHmK5M=" + "$ref": "AAAAAAFXmt5iT2+ClWI=" }, - "name": "completed", - "visibility": "public", - "isStatic": false, - "isLeaf": false, - "type": "", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "direction": "in" - }, - { - "_type": "UMLParameter", - "_id": "AAAAAAFUmO8xhxRjvng=", - "_parent": { - "$ref": "AAAAAAFUmO55eBHmK5M=" - }, - "name": "cancelled", + "name": "completedBlock", "visibility": "public", "isStatic": false, "isLeaf": false, @@ -14602,6 +17642,20 @@ "concurrency": "sequential", "isQuery": false, "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmt9bf3FF/EU=", + "_parent": { + "$ref": "AAAAAAFUkiR/Go5pUW0=" + }, + "name": "cancel", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false } ], "isAbstract": false, @@ -14790,6 +17844,20 @@ "concurrency": "sequential", "isQuery": false, "isAbstract": false + }, + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmtvoKmluEIw=", + "_parent": { + "$ref": "AAAAAAFUmOmq1v73mh4=" + }, + "name": "decodedAndScaledDownImageWithImage:", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false } ], "isAbstract": false, @@ -14804,54 +17872,6 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "MKAnnotationView (WebCache)", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAFUv1BsrSlLhko=", - "_parent": { - "$ref": "AAAAAAFUmPjp9CtnN2Y=" - }, - "name": "uses", - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1BsrSlMh4M=", - "_parent": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "reference": { - "$ref": "AAAAAAFUkhwuq42z3w4=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1BsrSlN0xQ=", - "_parent": { - "$ref": "AAAAAAFUv1BsrSlLhko=" - }, - "reference": { - "$ref": "AAAAAAFUmPjp9CtnN2Y=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "visibility": "public", - "isDerived": false - } - ], "visibility": "public", "operations": [ { @@ -14881,54 +17901,6 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "UIButton (WebCache)", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAFUv1FUOTJ/WPA=", - "_parent": { - "$ref": "AAAAAAFUmPoFSiy4ZTk=" - }, - "name": "uses", - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1FUOTKAXw0=", - "_parent": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "reference": { - "$ref": "AAAAAAFUmN6ZSOUCaRM=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1FUOTKBt7k=", - "_parent": { - "$ref": "AAAAAAFUv1FUOTJ/WPA=" - }, - "reference": { - "$ref": "AAAAAAFUkhwuq42z3w4=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "visibility": "public", - "isDerived": false - } - ], "visibility": "public", "operations": [ { @@ -14958,54 +17930,6 @@ "$ref": "AAAAAAFUkhbx4ozg49g=" }, "name": "UIImageView (WebCache)", - "ownedElements": [ - { - "_type": "UMLAssociation", - "_id": "AAAAAAFUv1AABiZSvRE=", - "_parent": { - "$ref": "AAAAAAFUmPtmMC6BqlU=" - }, - "end1": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1AABiZTkZo=", - "_parent": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "name": "uses", - "reference": { - "$ref": "AAAAAAFUkhwuq42z3w4=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "end2": { - "_type": "UMLAssociationEnd", - "_id": "AAAAAAFUv1AABiZUFhE=", - "_parent": { - "$ref": "AAAAAAFUv1AABiZSvRE=" - }, - "reference": { - "$ref": "AAAAAAFUmPtmMC6BqlU=" - }, - "visibility": "public", - "navigable": true, - "aggregation": "none", - "isReadOnly": false, - "isOrdered": false, - "isUnique": false, - "isDerived": false, - "isID": false - }, - "visibility": "public", - "isDerived": false - } - ], "visibility": "public", "operations": [ { @@ -15027,6 +17951,123 @@ "isFinalSpecialization": false, "isLeaf": false, "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFXmnErIidawX8=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "UIImageView (HighlightedWebCache)", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmnErIideM/I=", + "_parent": { + "$ref": "AAAAAAFXmnErIidawX8=" + }, + "name": "sd_setHighlightedImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFXmsqK3SdrXmw=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "UIView (WebCache)", + "ownedElements": [ + { + "_type": "UMLDependency", + "_id": "AAAAAAFXmtleW1rTTNk=", + "_parent": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "source": { + "$ref": "AAAAAAFUkh79WI34fB0=" + }, + "target": { + "$ref": "AAAAAAFXmwGn6ZeqpYw=" + }, + "visibility": "public" + }, + { + "_type": "UMLDependency", + "_id": "AAAAAAFXmuaszox/B8Y=", + "_parent": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "source": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "target": { + "$ref": "AAAAAAFUkhwuq42z3w4=" + }, + "visibility": "public" + } + ], + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmsqK3idvzv0=", + "_parent": { + "$ref": "AAAAAAFXmsqK3SdrXmw=" + }, + "name": "sd_internalSetImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false + }, + { + "_type": "UMLClass", + "_id": "AAAAAAFXmtV2dyd8ar4=", + "_parent": { + "$ref": "AAAAAAFUkhbx4ozg49g=" + }, + "name": "FLAnimatedImageView (WebCache)", + "visibility": "public", + "operations": [ + { + "_type": "UMLOperation", + "_id": "AAAAAAFXmtV2eCeAZR4=", + "_parent": { + "$ref": "AAAAAAFXmtV2dyd8ar4=" + }, + "name": "sd_setImageWithURL", + "visibility": "public", + "isStatic": false, + "isLeaf": false, + "concurrency": "sequential", + "isQuery": false, + "isAbstract": false + } + ], + "isAbstract": false, + "isFinalSpecialization": false, + "isLeaf": false, + "isActive": false } ], "visibility": "public" diff --git a/Docs/SDWebImageClassDiagram.png b/Docs/SDWebImageClassDiagram.png index a20e214b51c82f446ea139ecfb554930facfc1f6..f0aca616c1b18409817e308c361cbf9405cc2716 100644 GIT binary patch literal 752619 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

OC9o^KrzsG9BsM&*ws-Bv6Rr2GdLY> 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∋9Sui<#j~AixI@+ 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®qMxv4|}?a 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

kRdo=0 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

-He$`t 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 Min?-)qOteC0WH8#RsaA1 literal 37837 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 From beb1717a4f201d18c2b838819a78748dd2a9336c Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 7 Oct 2016 12:54:20 +0300 Subject: [PATCH 187/207] Marked the `SDWebImageManager` `initWithCache:downloader:` as designated initializer. --- SDWebImage/SDWebImageManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.h b/SDWebImage/SDWebImageManager.h index d8be2c34..ba8b7555 100644 --- a/SDWebImage/SDWebImageManager.h +++ b/SDWebImage/SDWebImageManager.h @@ -192,7 +192,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * Allows to specify instance of cache and image downloader used with image manager. * @return new instance of `SDWebImageManager` with specified cache and downloader. */ -- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader; +- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader NS_DESIGNATED_INITIALIZER; /** * Downloads the image at the given URL if not present in cache or return the cached version otherwise. From bd14ef3ac7a06e05ae74f6051f7b2a2034b26417 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 7 Oct 2016 12:55:16 +0300 Subject: [PATCH 188/207] 1st draft for the 4.0 Migration Guide. Described the changes per component. Now we need to add examples for the most common cases. --- Docs/SDWebImage-4.0-Migration-guide.md | 179 +++++++++++++++++++++++-- 1 file changed, 170 insertions(+), 9 deletions(-) diff --git a/Docs/SDWebImage-4.0-Migration-guide.md b/Docs/SDWebImage-4.0-Migration-guide.md index 10f51458..8d388760 100644 --- a/Docs/SDWebImage-4.0-Migration-guide.md +++ b/Docs/SDWebImage-4.0-Migration-guide.md @@ -1,18 +1,33 @@ ## SDWebImage 4.0 Migration Guide -- To be created based on [CHANGELOG.md - 4.0.0 Backwards incompatible changes](https://github.com/rs/SDWebImage/blob/master/CHANGELOG.md#backwards-incompatible-changes) -- See [Migration guide #1590](https://github.com/rs/SDWebImage/issues/1590) +SDWebImage 4.0 is the latest major release of SDWebImage, a top library for downloading and caching images. +As a major release, following [Semantic Versioning](http://semver.org/) conventions, 4.0 introduces several API-breaking changes with its new architecture. -### New requirements: Xcode 8, iOS 7, Mac OS X 10.8, watchOS 2, tvOS 9 -- ... +We've expanded the list of supported platforms and added to the existing **iOS** and **tvOS**, the long waited **watchOS** and **Mac OS X**. -### Classes removed -### Classes modified -### Classes added +Our support for animated images (especially GIFs) was not that great, so we decided to delegate this responsibility to [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage), a library created by Flipboard which has great results in working with animated images. -##Migration +This guide is provided in order to ease the transition of existing applications using SDWebImage 3.X to the latest APIs, as well as explain the design and structure of new and changed functionality. -### Simple case +### Requirements: iOS 7, Mac OS X 10.8, watchOS 2, tvOS 9, Xcode 7.3 + +SDWebImage 4.0 officially supports iOS 7 and later, Mac OS X 10.8 and later, watchOS 2 and later and tvOS 9 and later. +It needs Xcode 7.3 or later to be able to build everything properly. + +For targeting previous versions of the SDKs, check [README - Backwards compatibility](https://github.com/rs/SDWebImage#backwards-compatibility) +. + +### Migration + +#### Swift + +Because the 4.0 version included #1581 - Lightweight Generics and Nullability, the Swift interface for all users has changed. +For 3.x versions which did not have the Nullability specifiers, all params and vars where bridged as Implicitly Unwrapped Optionals. +With 4.0, the ones marked as `nullable` will be regular optionals, as the `nonnull` ones are non-optionals. + +For details, read [Nullability and Objective-C](https://developer.apple.com/swift/blog/?id=25). + +#### Simple case SDWebImage 3.x ``` @@ -23,3 +38,149 @@ SDWebImage 4.x ``` [imageView sd_setImageWithURL:url]; ``` + +### Entities + +#### Added +- `SDImageCacheConfig` class for `SDImageCache` config (`shouldDecompressImages`, `shouldDisableiCloud`, `shouldCacheImagesInMemory`, `maxCacheAge`, `maxCacheSize`) +- `SDWebImageDownloadToken` class for the ability to cancel specific downloads (`url`, `downloadOperationCancelToken`) +- `UIView (WebCache)` category because of DRY, with methods + - `sd_imageURL` + - `sd_internalSetImageWithURL:placeholderImage:options:operationKey:setImageBlock:progress:completed:` + - `sd_cancelCurrentImageLoad` + - `sd_showActivityIndicatorView` + - `sd_addActivityIndicator` + - `sd_removeActivityIndicator` +- `SDWebImageDownloaderOperationInterface` protocol to describe the downloader operation behavior (in case one wants to customize) +- `SDImageFormat` enum containing the formats supported by the library (jpeg, png, gif, tiff, webp) +- `FLAnimatedImageView (WebCache)` category for `FLAnimatedImageView` from [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) + +#### UIImageView (WebCache) +- moved to `UIView (WebCache)`,`UIImageView` objects still respond to those methods: + - `sd_imageURL` + - `sd_cancelCurrentImageLoad` + - `setShowActivityIndicatorView:` renamed to `sd_setShowActivityIndicatorView:` + - `setIndicatorStyle:` renamed to `sd_setIndicatorStyle:` +- removed deprecated methods: + - `imageURL` + - `setImageWithURL:` + - `setImageWithURL:placeholderImage:` + - `setImageWithURL:placeholderImage:options:` + - `setImageWithURL:completed:` + - `setImageWithURL:placeholderImage:completed:` + - `setImageWithURL:placeholderImage:options:completed:` + - `setImageWithURL:placeholderImage:options:progress:completed:` + - `sd_setImageWithPreviousCachedImageWithURL:andPlaceholderImage:options:progress:completed:` + - `setAnimationImagesWithURLs:` + - `cancelCurrentArrayLoad` + - `cancelCurrentImageLoad` + +#### UIButton (WebCache) +- removed deprecated methods: + - `currentImageURL` + - `imageURLForState:` + - `setImageWithURL:forState:` + - `setImageWithURL:forState:placeholderImage:` + - `setImageWithURL:forState:placeholderImage:options:` + - `setImageWithURL:forState:completed:` + - `setImageWithURL:forState:placeholderImage:completed:` + - `setImageWithURL:forState:placeholderImage:options:completed:` + - `setBackgroundImageWithURL:forState:` + - `setBackgroundImageWithURL:forState:placeholderImage:` + - `setBackgroundImageWithURL:forState:placeholderImage:options:` + - `setBackgroundImageWithURL:forState:completed:` + - `setBackgroundImageWithURL:forState:placeholderImage:completed:` + - `setBackgroundImageWithURL:forState:placeholderImage:options:completed:` + - `cancelCurrentImageLoad` + - `cancelBackgroundImageLoadForState:` + +#### MKAnnotationView (WebCache) +- removed deprecated methods: + - `imageURL` + - `setImageWithURL:` + - `setImageWithURL:placeholderImage:` + - `setImageWithURL:placeholderImage:options:` + - `setImageWithURL:completed:` + - `setImageWithURL:placeholderImage:completed:` + - `setImageWithURL:placeholderImage:options:completed:` + - `cancelCurrentImageLoad` + +#### UIImageView (HighlightedWebCache) +- removed methods: + - `sd_cancelCurrentHighlightedImageLoad` +- removed deprecated methods: + - `setHighlightedImageWithURL:` + - `setHighlightedImageWithURL:options:` + - `setHighlightedImageWithURL:completed:` + - `setHighlightedImageWithURL:options:completed:` + - `setHighlightedImageWithURL:options:progress:completed:` + - `cancelCurrentHighlightedImageLoad` + +#### SDWebImageManager +- `initWithCache:downloader:` is now the designated initializer +- added `SDWebImageScaleDownLargeImages` option for scaling large images +- renamed `downloadImageWithURL:options:progress:completed` to `loadImageWithURL:options:progress:completed` just to make it clear what the method does +- renamed `SDWebImageCompletionBlock` to `SDExternalCompletionBlock` +- renamed `SDWebImageCompletionWithFinishedBlock` to `SDInternalCompletionBlock` and added extra `NSData` param +- removed synchronous methods: + - `cachedImageExistsForURL:` + - `diskImageExistsForURL:` +- removed deprecated methods: + - `downloadWithURL:options:progress:completed:` +- removed deprecated types: + - `SDWebImageCompletedBlock` + - `SDWebImageCompletedWithFinishedBlock` + +#### SDWebImagePrefetcher +- `initWithImageManager:` is now the designated initializer + +#### SDWebImageDownloader +- added `initWithSessionConfiguration:` which is now the designated initializer +- added `SDWebImageDownloaderScaleDownLargeImages` option for scaling large images +- added a `NSURL` param to `SDWebImageDownloaderProgressBlock` +- `downloadImageWithURL:options:progress:completed:` now returns a `SDWebImageDownloadToken` +- added method `cancel:` which takes a `SDWebImageDownloadToken` + +#### SDWebImageDownloaderOperation +- `initWithRequest:inSession:options:progress:completed:cancelled:` replaced by two methods: `initWithRequest:inSession:options:` and `addHandlersForProgress:completed:` +- `initWithRequest:inSession:options:` is now the designated initializer +- added `cancel:` method +- removed deprecated methods: + - `initWithRequest:options:progress:completed:cancelled:` + +#### SDImageCache +- moved the following properties to `SDImageCacheConfig`: + - `shouldDecompressImages` + - `shouldDisableiCloud` + - `shouldCacheImagesInMemory` + - `maxCacheAge` + - `maxCacheSize` +- added a `config` property (`SDImageCacheConfig`) +- renamed `SDWebImageQueryCompletedBlock` to `SDCacheQueryCompletedBlock` and added `NSData` param +- `initWithNamespace:diskCacheDirectory:` is now the designated initializer +- the `storeImage:forKey:`, `storeImage:forKey:toDisk:`, `storeImage:recalculateFromImage:imageData:forKey:toDisk:` methods were async already, but declared as sync. Properly marked them as async + added `completion` param. Got rid of the `recalculate` param. If the `NSData` is provided, use it. Otherwise, recalculate it from the `UIImage` + - `storeImage:forKey:` -> `storeImage:forKey:completion:` + - `storeImage:forKey:toDisk:` -> `storeImage:forKey:toDisk:completion:` + - `storeImage:recalculateFromImage:imageData:forKey:toDisk:` -> `storeImage:imageData:forKey:toDisk:completion:` +- removed the synchronous method `diskImageExistsWithKey:` +- got rid of the confusion caused by having `cleanDisk` and `clearDisk`. Renamed `cleanDiskWithCompletion:` to `deleteOldFilesWithCompletion:`. +- removed the synchronous `clearDisk` and `deleteOldFiles` +- renamed `queryDiskCacheForKey:done:` to `queryCacheOperationForKey:done:` +- another clarification: `imageFromDiskCacheForKey:` used to also check the memory cache which I think is misleading. Now `imageFromDiskCacheForKey:` only checks the disk cache and the new method `imageFromCacheForKey:` checks both caches +- removed `removeImageForKey:` and `removeImageForKey:fromDisk:` because they caused confusion (were calling the async ones with `nil` as `completion`) + +#### NSData (ImageContentType) +- renamed `sd_contentTypeForImageData:` to `sd_imageFormatForImageData:` and returns `SDImageFormat` +- removed the deprecated method `contentTypeForImageData:` + +#### SDWebImageCompat +- removed `dispatch_main_sync_safe` as it could be mistakenly used +- updated `dispatch_main_async_safe` so it checks for the main queue instead of the main thread + +#### SDWebImageDecoder +- added `decodedAndScaledDownImageWithImage:` that decodes the image and scales it down if it's too big (over 60MB in memory) + +#### UIImage +- removed `sd_animatedGIFNamed:` or `sd_animatedImageByScalingAndCroppingToSize:` +- added `isGIF` +- added `sd_imageData` and `sd_imageDataAsFormat:`. Those methods transform a `UIImage` to the `NSData` representation \ No newline at end of file From bb640f1ca4c0d617cadca73bc1e1f6dbd42fef44 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 7 Oct 2016 13:02:07 +0300 Subject: [PATCH 189/207] Updated links for documentation --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8ba76190..3f6c07ba 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ This library provides an async image downloader with cache support. For convenie - Read [How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) - Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` - Get to the [installation steps](https://github.com/rs/SDWebImage#installation) -- Read the [SDWebImage 4.0 Migration Guide](https://raw.github.com/rs/SDWebImage/master/Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x +- Read the [SDWebImage 4.0 Migration Guide](Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x ## Who Uses It - Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. @@ -84,7 +84,7 @@ Swift: imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage:UIImage(imageNamed:"placeholder.png")) ``` -- For details about how to use the library and clear examples, see [The detailed How to use](https://raw.github.com/rs/SDWebImage/master/Docs/HowToUse.md) +- For details about how to use the library and clear examples, see [The detailed How to use](Docs/HowToUse.md) ## Animated Images (GIF) support @@ -166,7 +166,7 @@ github "rs/SDWebImage" ``` ### Installation by cloning the repository -- see [Manual install](https://raw.github.com/rs/SDWebImage/master/Docs/ManualInstallation.md) +- see [Manual install](ManualInstallation.md) ### Import headers in your source files From 032ab1dd6d633ed30b8850eddc27f7073191f317 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sun, 9 Oct 2016 13:08:32 +0300 Subject: [PATCH 190/207] Fixed #1693 Same URLs didn't cancel download --- SDWebImage/SDWebImageManager.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index 82273223..b0529c47 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -227,9 +227,8 @@ [self safelyRemoveOperationFromRunning:strongOperation]; } }]; - __weak typeof(subOperationToken)weakSubOperationToken = subOperationToken; operation.cancelBlock = ^{ - [self.imageDownloader cancel:weakSubOperationToken]; + [self.imageDownloader cancel:subOperationToken]; __strong __typeof(weakOperation) strongOperation = weakOperation; [self safelyRemoveOperationFromRunning:strongOperation]; }; From 7dbf15bb0d18d604122dc0773d4b94d48b1aab51 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Tue, 11 Oct 2016 20:53:16 +0800 Subject: [PATCH 191/207] Fix FLAnimatedImage import when using CocoaPods --- SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index d5f08c34..e109b5a9 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -10,7 +10,7 @@ #if SD_UIKIT -#if COCOAPODS +#if !COCOAPODS @import FLAnimatedImage; #else #import "FLAnimatedImageView.h" From 8c3c06c342cee23be7b16a1851bd4abf70931532 Mon Sep 17 00:00:00 2001 From: Chester Liu Date: Thu, 13 Oct 2016 21:25:47 +0800 Subject: [PATCH 192/207] Utilize __has_include to fix framework import --- SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h index e109b5a9..f77c0edd 100644 --- a/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h +++ b/SDWebImage/FLAnimatedImage/FLAnimatedImageView+WebCache.h @@ -10,8 +10,8 @@ #if SD_UIKIT -#if !COCOAPODS -@import FLAnimatedImage; +#if __has_include() +#import #else #import "FLAnimatedImageView.h" #endif From 73847d1818511be4e1372bfdd8430aa0d911270e Mon Sep 17 00:00:00 2001 From: Tim Broder Date: Tue, 1 Nov 2016 13:29:36 -0400 Subject: [PATCH 193/207] Update readme for 1st party progress indicator support From [this merge](https://github.com/rs/SDWebImage/pull/1217/files#diff-2cc725cd4b29e8acd64b4b01e5f82f36R382 "this merge") --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f6c07ba..ea76eda7 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,17 @@ If you don't control the image server you're using, you may not be able to chang ### Add a progress indicator -See this category: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage +Add these before you call ```sd_setImageWithURL``` + +``` objective-c +[imageView setShowActivityIndicatorView:YES]; +[imageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; +``` + +``` swift +imageView.setShowActivityIndicatorView(true) +imageView.setIndicatorStyle(.Gray) +``` Installation ------------ From 154144a8347a9be03c65e0992729a014e05b86af Mon Sep 17 00:00:00 2001 From: Tim Broder Date: Tue, 1 Nov 2016 13:33:43 -0400 Subject: [PATCH 194/207] fix typo in PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 857367b6..aba68f86 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,7 +6,7 @@ * [ ] I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase) * [ ] I have added the required tests to prove the fix/feature I am adding -* [ ] I have updated the documentation (if necesarry) +* [ ] I have updated the documentation (if necessary) * [ ] I have run the tests and they pass * [ ] I have run the lint and it passes (`pod lib lint`) From 45c0387f9815f9d3c386eed881b6d38d8efe4982 Mon Sep 17 00:00:00 2001 From: cdunkel Date: Wed, 2 Nov 2016 11:51:52 -0500 Subject: [PATCH 195/207] Update Prefetch Docs Updated prefetchUrls: and prefetchUrls:progress:completed: documentation to mention that any already running prefetch operations are canceled if the operation is called. --- SDWebImage/SDWebImagePrefetcher.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SDWebImage/SDWebImagePrefetcher.h b/SDWebImage/SDWebImagePrefetcher.h index 48eb2084..d0a91ed7 100644 --- a/SDWebImage/SDWebImagePrefetcher.h +++ b/SDWebImage/SDWebImagePrefetcher.h @@ -78,7 +78,8 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list + * and skips images for failed downloads and proceed to the next image in the list. + * Any previously-running prefetch operations are canceled. * * @param urls list of URLs to prefetch */ @@ -87,7 +88,8 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list + * and skips images for failed downloads and proceed to the next image in the list. + * Any previously-running prefetch operations are canceled. * * @param urls list of URLs to prefetch * @param progressBlock block to be called when progress updates; From 113cccc25d92e3333028db45115e28d600bd9156 Mon Sep 17 00:00:00 2001 From: Tiago Martinho Date: Wed, 30 Nov 2016 15:40:28 +0100 Subject: [PATCH 196/207] Update README.md updates swift example to Swift 3.0 syntax --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f6c07ba..8b517368 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ Objective-C: ```swift Swift: -imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage:UIImage(imageNamed:"placeholder.png")) +imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png")) ``` - For details about how to use the library and clear examples, see [The detailed How to use](Docs/HowToUse.md) From 3b8f70af8d816e61f2416ca93616e68ca81da48e Mon Sep 17 00:00:00 2001 From: Isaac Rosenberg Date: Thu, 1 Dec 2016 21:51:28 -0800 Subject: [PATCH 197/207] Word corrections --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3f6c07ba..a975a56d 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,8 @@ imageView.sd_setImageWithURL(NSURL(string: "http://www.domain.com/path/to/image. ## Animated Images (GIF) support -- Starting with the 4.0 version, we relly on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. -- To use it, simply make sure you us `FLAnimatedImageView` instead of `UIImageView`. +- Starting with the 4.0 version, we rely on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. +- To use it, simply make sure you use `FLAnimatedImageView` instead of `UIImageView`. - **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. - **Important**: FLAnimatedImage only works on the iOS platform, so for all the other platforms (OS X, tvOS, watchOS) we will fallback to the backwards compatibility feature described above From dedbf3088b9fba3051dcaa1b49dc25a793a2b96e Mon Sep 17 00:00:00 2001 From: Coder_Bai Date: Tue, 6 Dec 2016 13:06:18 +0800 Subject: [PATCH 198/207] Word corrections --- SDWebImage/SDWebImageManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index b0529c47..d7d6865d 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -109,7 +109,7 @@ // Invoking this method without a completedBlock is pointless NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); - // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, XCode won't + // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, Xcode won't // throw any warning for this type mismatch. Here we failsafe this error by allowing URLs to be passed as NSString. if ([url isKindOfClass:NSString.class]) { url = [NSURL URLWithString:(NSString *)url]; From 57502a9d1d3044a2c2f7969e5241619a697625fb Mon Sep 17 00:00:00 2001 From: xichun Date: Fri, 6 Jan 2017 11:40:28 +0800 Subject: [PATCH 199/207] add a network error situation --- SDWebImage/SDWebImageManager.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SDWebImage/SDWebImageManager.m b/SDWebImage/SDWebImageManager.m index b0529c47..b057c944 100644 --- a/SDWebImage/SDWebImageManager.m +++ b/SDWebImage/SDWebImageManager.m @@ -186,7 +186,8 @@ && error.code != NSURLErrorInternationalRoamingOff && error.code != NSURLErrorDataNotAllowed && error.code != NSURLErrorCannotFindHost - && error.code != NSURLErrorCannotConnectToHost) { + && error.code != NSURLErrorCannotConnectToHost + && error.code != NSURLErrorNetworkConnectionLost) { @synchronized (self.failedURLs) { [self.failedURLs addObject:url]; } From 79683baa3a53aeb0d25e30aa806ceaaabdd815c8 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 27 Jan 2017 20:32:26 +0200 Subject: [PATCH 200/207] Fixed broken doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a975a56d..0b2806ff 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ github "rs/SDWebImage" ``` ### Installation by cloning the repository -- see [Manual install](ManualInstallation.md) +- see [Manual install](Docs/ManualInstallation.md) ### Import headers in your source files From 93d259cbdef3ab7730a9caabbe99143eacc9dc70 Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Fri, 27 Jan 2017 21:32:08 +0200 Subject: [PATCH 201/207] Updated Swift example --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 39e8b600..e6214543 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,8 @@ Objective-C: ```swift Swift: +@import SDWebImage + imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png")) ``` From de63b0730d14f2e6489f84cf24ec9b6d3f6c181f Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 Jan 2017 20:08:22 +0200 Subject: [PATCH 202/207] Updated the migration guide --- Docs/SDWebImage-4.0-Migration-guide.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Docs/SDWebImage-4.0-Migration-guide.md b/Docs/SDWebImage-4.0-Migration-guide.md index 8d388760..486eb56c 100644 --- a/Docs/SDWebImage-4.0-Migration-guide.md +++ b/Docs/SDWebImage-4.0-Migration-guide.md @@ -27,16 +27,28 @@ With 4.0, the ones marked as `nullable` will be regular optionals, as the `nonnu For details, read [Nullability and Objective-C](https://developer.apple.com/swift/blog/?id=25). -#### Simple case +#### Using the UI*View categories brings no change SDWebImage 3.x ``` -[imageView sd_setImageWithURL:url]; +[imageView sd_setImageWithURL:url placeholderImage:placeholderImage]; ``` SDWebImage 4.x ``` -[imageView sd_setImageWithURL:url]; +[imageView sd_setImageWithURL:url placeholderImage:placeholderImage]; +``` + +#### Using directly SDWebImageManager + +SDWebImage 3.x +``` +[manager downloadImageWithURL:url options:options: progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { ... } ]; +``` + +SDWebImage 4.x +``` +[manager loadImageWithURL:url options:options: progress:nil completed:^(UIImage *image, NSData *imageData, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { ... } ]; ``` ### Entities @@ -183,4 +195,4 @@ SDWebImage 4.x #### UIImage - removed `sd_animatedGIFNamed:` or `sd_animatedImageByScalingAndCroppingToSize:` - added `isGIF` -- added `sd_imageData` and `sd_imageDataAsFormat:`. Those methods transform a `UIImage` to the `NSData` representation \ No newline at end of file +- added `sd_imageData` and `sd_imageDataAsFormat:`. Those methods transform a `UIImage` to the `NSData` representation From 1777032d03de73a87f10e17ed7939a06af05a48b Mon Sep 17 00:00:00 2001 From: Bogdan Poplauschi Date: Sat, 28 Jan 2017 20:17:57 +0200 Subject: [PATCH 203/207] Set version to 4.0.0 and updated CHANGELOG --- CHANGELOG.md | 5 +++++ SDWebImage.podspec | 2 +- WebImage/Info.plist | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb32b717..6ffb1665 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [4.0.0 - New platforms (Mac OS X and watchOS) + refactoring, on Jan 28th, 2017](https://github.com/rs/SDWebImage/releases/tag/4.0.0) + +See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) +Versions 4.0.0-beta and 4.0.0-beta 2 list all the changes. + ## [4.0.0 beta 2 - New platforms (Mac OS X and watchOS) + refactoring, on Oct 6th, 2016](https://github.com/rs/SDWebImage/releases/tag/4.0.0-beta2) See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/milestone/3) diff --git a/SDWebImage.podspec b/SDWebImage.podspec index e0a95b3a..a7fb9181 100644 --- a/SDWebImage.podspec +++ b/SDWebImage.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SDWebImage' - s.version = '4.0.0-beta2' + s.version = '4.0.0' s.osx.deployment_target = '10.8' s.ios.deployment_target = '7.0' diff --git a/WebImage/Info.plist b/WebImage/Info.plist index 3640921a..1bcfa6d1 100644 --- a/WebImage/Info.plist +++ b/WebImage/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0-beta2 + 4.0.0 CFBundleSignature ???? CFBundleVersion From 7751b35eecdcfe928feabb9b1f1d8feed43d6ce9 Mon Sep 17 00:00:00 2001 From: Wenzhi Date: Wed, 1 Feb 2017 16:52:59 -0500 Subject: [PATCH 204/207] Small README Update For 4.0.0 Update the method name in the README to match the method name in 4.0.0. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e6214543..d7aee378 100644 --- a/README.md +++ b/README.md @@ -124,13 +124,13 @@ If you don't control the image server you're using, you may not be able to chang Add these before you call ```sd_setImageWithURL``` ``` objective-c -[imageView setShowActivityIndicatorView:YES]; -[imageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; +[imageView sd_setShowActivityIndicatorView:YES]; +[imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray]; ``` ``` swift -imageView.setShowActivityIndicatorView(true) -imageView.setIndicatorStyle(.Gray) +imageView.sd_setShowActivityIndicatorView(true) +imageView.sd_setIndicatorStyle(.Gray) ``` Installation From a00fd76711bfcceed71533e91385fa8cf438c0b5 Mon Sep 17 00:00:00 2001 From: Vyacheslav Khlichkin Date: Thu, 2 Feb 2017 10:21:07 +0700 Subject: [PATCH 205/207] - Fixed SDImageCacheConfig class name in Changelog.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ffb1665..bde1f3c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,7 +65,7 @@ See [all tickets marked for the 4.0.0 release](https://github.com/rs/SDWebImage/ - renamed `SDWebImage` iOS static lib target to `SDWebImage iOS static` for clarity - improving the unit tests code coverage #1681 required - Refactored `NSData` `ImageContentType` category, instead of returning the contentType as a string, the new added method `sd_imageFormatForImageData` will return a `SDImageFormat` enum value - - `SDImageCache` configuration properties moved into `SDImageCacheConfiguration` (which is now available via `config` property): + - `SDImageCache` configuration properties moved into `SDImageCacheConfig` (which is now available via `config` property): - `shouldDecompressImages` - `shouldDisableiCloud` - `shouldCacheImagesInMemory` From 7d0779e840aa699ac4e7a4b7026890fd24a23ecb Mon Sep 17 00:00:00 2001 From: Vincent Peng Date: Tue, 7 Feb 2017 18:49:50 +1100 Subject: [PATCH 206/207] Correct available subspecs in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7aee378..fc4791b1 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,7 @@ use_frameworks! #### Subspecs -There are 3 subspecs available now: `Core`, `MapKit` and `WebP` (this means you can install only some of the SDWebImage modules. By default, you get just `Core`, so if you need `WebP`, you need to specify it). +There are 4 subspecs available now: `Core`, `MapKit`, `GIF` and `WebP` (this means you can install only some of the SDWebImage modules. By default, you get just `Core`, so if you need `WebP`, you need to specify it). Podfile example: ``` From c4c85a550cf7130f0e83b9f3c98dcd7eb2d8c53b Mon Sep 17 00:00:00 2001 From: JohnC Date: Sun, 12 Feb 2017 16:04:11 +0200 Subject: [PATCH 207/207] For those who using cocoapods and gifs. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fc4791b1..0b7a4dfb 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg ## Animated Images (GIF) support - Starting with the 4.0 version, we rely on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. +- If you use cocoapods, add `pod 'SDWebImage/GIF'` to your podfile. - To use it, simply make sure you use `FLAnimatedImageView` instead of `UIImageView`. - **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. - **Important**: FLAnimatedImage only works on the iOS platform, so for all the other platforms (OS X, tvOS, watchOS) we will fallback to the backwards compatibility feature described above