in iOS/WAStickersThirdParty/YYImageCoder.m [695:742]
static BOOL YYCGImageDecodeToBitmapBufferWithAnyFormat(CGImageRef srcImage, vImage_Buffer *dest, vImage_CGImageFormat *destFormat) {
if (!srcImage || (((long)vImageConvert_AnyToAny) + 1 == 1) || !destFormat || !dest) return NO;
size_t width = CGImageGetWidth(srcImage);
size_t height = CGImageGetHeight(srcImage);
if (width == 0 || height == 0) return NO;
dest->data = NULL;
vImage_Error error = kvImageNoError;
CFDataRef srcData = NULL;
vImageConverterRef convertor = NULL;
vImage_CGImageFormat srcFormat = {0};
srcFormat.bitsPerComponent = (uint32_t)CGImageGetBitsPerComponent(srcImage);
srcFormat.bitsPerPixel = (uint32_t)CGImageGetBitsPerPixel(srcImage);
srcFormat.colorSpace = CGImageGetColorSpace(srcImage);
srcFormat.bitmapInfo = CGImageGetBitmapInfo(srcImage) | CGImageGetAlphaInfo(srcImage);
convertor = vImageConverter_CreateWithCGImageFormat(&srcFormat, destFormat, NULL, kvImageNoFlags, NULL);
if (!convertor) goto fail;
CGDataProviderRef srcProvider = CGImageGetDataProvider(srcImage);
srcData = srcProvider ? CGDataProviderCopyData(srcProvider) : NULL; // decode
size_t srcLength = srcData ? CFDataGetLength(srcData) : 0;
const void *srcBytes = srcData ? CFDataGetBytePtr(srcData) : NULL;
if (srcLength == 0 || !srcBytes) goto fail;
vImage_Buffer src = {0};
src.data = (void *)srcBytes;
src.width = width;
src.height = height;
src.rowBytes = CGImageGetBytesPerRow(srcImage);
error = vImageBuffer_Init(dest, height, width, 32, kvImageNoFlags);
if (error != kvImageNoError) goto fail;
error = vImageConvert_AnyToAny(convertor, &src, dest, NULL, kvImageNoFlags); // convert
if (error != kvImageNoError) goto fail;
CFRelease(convertor);
CFRelease(srcData);
return YES;
fail:
if (convertor) CFRelease(convertor);
if (srcData) CFRelease(srcData);
if (dest->data) free(dest->data);
dest->data = NULL;
return NO;
}