From adc2db9bb29e7f316c46b6de679db1522ffc9cc8 Mon Sep 17 00:00:00 2001 From: 杨锴 <841720330@qq.com> Date: 星期五, 23 八月 2024 11:39:37 +0800 Subject: [PATCH] fix --- Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m b/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m index 0808685..422e0f9 100644 --- a/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +++ b/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m @@ -381,6 +381,45 @@ return hasAlpha; } ++ (BOOL)CGImageIsLazy:(CGImageRef)cgImage { + if (!cgImage) { + return NO; + } + // CoreGraphics use CGImage's C struct filed (offset 0xd8 on iOS 17.0) + // But since the description of `CGImageRef` always contains the `[DP]` (DataProvider) and `[IP]` (ImageProvider), we can use this as a hint + NSString *description = (__bridge_transfer NSString *)CFCopyDescription(cgImage); + if (description) { + // Solution 1: Parse the description to get provider + // <CGImage 0x10740ffe0> (IP) -> YES + // <CGImage 0x10740ffe0> (DP) -> NO + NSArray<NSString *> *lines = [description componentsSeparatedByString:@"\n"]; + if (lines.count > 0) { + NSString *firstLine = lines[0]; + NSRange startRange = [firstLine rangeOfString:@"("]; + NSRange endRange = [firstLine rangeOfString:@")"]; + if (startRange.location != NSNotFound && endRange.location != NSNotFound) { + NSRange resultRange = NSMakeRange(startRange.location + 1, endRange.location - startRange.location - 1); + NSString *providerString = [firstLine substringWithRange:resultRange]; + if ([providerString isEqualToString:@"IP"]) { + return YES; + } else if ([providerString isEqualToString:@"DP"]) { + return NO; + } else { + // New cases ? fallback + } + } + } + } + // Solution 2: Use UTI metadata + CFStringRef uttype = CGImageGetUTType(cgImage); + if (uttype) { + // Only ImageIO can set `com.apple.ImageIO.imageSourceTypeIdentifier` metadata for lazy decoded CGImage + return YES; + } else { + return NO; + } +} + + (CGImageRef)CGImageCreateDecoded:(CGImageRef)cgImage { return [self CGImageCreateDecoded:cgImage orientation:kCGImagePropertyOrientationUp]; } @@ -930,12 +969,13 @@ // Check policy (automatic) CGImageRef cgImage = image.CGImage; if (cgImage) { - CFStringRef uttype = CGImageGetUTType(cgImage); - if (uttype) { - // Only ImageIO can set `com.apple.ImageIO.imageSourceTypeIdentifier` + // Check if it's lazy CGImage wrapper or not + BOOL isLazy = [SDImageCoderHelper CGImageIsLazy:cgImage]; + if (isLazy) { + // Lazy CGImage should trigger force decode before rendering return YES; } else { - // Now, let's check if the CGImage is hardware supported (not byte-aligned will cause extra copy) + // Now, let's check if this non-lazy CGImage is hardware supported (not byte-aligned will cause extra copy) BOOL isSupported = [SDImageCoderHelper CGImageIsHardwareSupported:cgImage]; return !isSupported; } -- Gitblit v1.7.1