Skip to content

Commit d91987f

Browse files
authored
Support to detect the RGB16 bitmap info, fix the iOS 11- decode issues (#87)
Support to detect the RGB 16 bits bitmap info Also, fallback when the libwebp don't support the target bitmap info, should not just return nil
1 parent b442faf commit d91987f

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

SDWebImageWebPCoder/Classes/SDImageWebPCoder.m

+18-7
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,21 @@ static inline CGContextRef _Nullable CreateWebPCanvas(BOOL hasAlpha, CGSize canv
9191
WEBP_CSP_MODE ConvertCSPMode(CGBitmapInfo bitmapInfo) {
9292
// Get alpha info, byteOrder info
9393
CGImageAlphaInfo alphaInfo = bitmapInfo & kCGBitmapAlphaInfoMask;
94-
CGBitmapInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask;
94+
CGImageByteOrderInfo byteOrderInfo = bitmapInfo & kCGBitmapByteOrderMask;
95+
size_t bitsPerPixel = 8;
96+
if (bitmapInfo & kCGBitmapFloatComponents) {
97+
bitsPerPixel = 16; // 16-Bits, which don't support currently!
98+
}
9599
BOOL byteOrderNormal = NO;
96100
switch (byteOrderInfo) {
97-
case kCGBitmapByteOrderDefault: {
101+
case kCGImageByteOrderDefault: {
98102
byteOrderNormal = YES;
99103
} break;
100-
case kCGBitmapByteOrder32Little: {
104+
case kCGImageByteOrder32Little:
105+
case kCGImageByteOrder16Little: {
101106
} break;
102-
case kCGBitmapByteOrder32Big: {
107+
case kCGImageByteOrder32Big:
108+
case kCGImageByteOrder16Big: {
103109
byteOrderNormal = YES;
104110
} break;
105111
default: break;
@@ -161,7 +167,7 @@ WEBP_CSP_MODE ConvertCSPMode(CGBitmapInfo bitmapInfo) {
161167
break;
162168
case kCGImageAlphaOnly: {
163169
// A
164-
// Unsupported
170+
// Unsupported!
165171
return MODE_LAST;
166172
}
167173
break;
@@ -621,8 +627,13 @@ - (nullable CGImageRef)sd_createWebpImageWithData:(WebPData)webpData colorSpace:
621627
CGBitmapInfo bitmapInfo = pixelFormat.bitmapInfo;
622628
WEBP_CSP_MODE mode = ConvertCSPMode(bitmapInfo);
623629
if (mode == MODE_LAST) {
624-
NSAssert(NO, @"Unsupported libwebp preferred CGBitmapInfo: %d", bitmapInfo);
625-
return nil;
630+
#if DEBUG
631+
NSLog(@"Unsupported libwebp preferred CGBitmapInfo: %d", bitmapInfo);
632+
#endif
633+
// Fallback to RGBA8888/RGB888 instead
634+
mode = MODE_rgbA;
635+
bitmapInfo = kCGBitmapByteOrderDefault;
636+
bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedLast : kCGImageAlphaNoneSkipLast;
626637
}
627638
config.output.colorspace = mode;
628639
config.options.use_threads = 1;

0 commit comments

Comments
 (0)