| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -762,20 +762,21 @@ - (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef | |||
| 762 | 762 | if (!dataProvider) { | |
| 763 | 763 | return nil; | |
| 764 | 764 | } | |
| 765 | - CFDataRef dataRef = CGDataProviderCopyData(dataProvider); | ||
| 766 | - if (!dataRef) { | ||
| 767 | - return nil; | ||
| 768 | - } | ||
| 769 | 765 | // Check colorSpace is RGB/RGBA | |
| 770 | 766 | CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); | |
| 771 | 767 | BOOL isRGB = CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelRGB; | |
| 772 | 768 | ||
| 769 | + CFDataRef dataRef; | ||
| 773 | 770 | uint8_t *rgba = NULL; // RGBA Buffer managed by CFData, don't call `free` on it, instead call `CFRelease` on `dataRef` | |
| 774 | 771 | // We could not assume that input CGImage's color mode is always RGB888/RGBA8888. Convert all other cases to target color mode using vImage | |
| 775 | 772 | BOOL isRGB888 = isRGB && byteOrderNormal && alphaInfo == kCGImageAlphaNone && components == 3; | |
| 776 | 773 | BOOL isRGBA8888 = isRGB && byteOrderNormal && alphaInfo == kCGImageAlphaLast && components == 4; | |
| 777 | 774 | if (isRGB888 || isRGBA8888) { | |
| 778 | 775 | // If the input CGImage is already RGB888/RGBA8888 | |
| 776 | + dataRef = CGDataProviderCopyData(dataProvider); | ||
| 777 | + if (!dataRef) { | ||
| 778 | + return nil; | ||
| 779 | + } | ||
| 779 | 780 | rgba = (uint8_t *)CFDataGetBytePtr(dataRef); | |
| 780 | 781 | } else { | |
| 781 | 782 | // Convert all other cases to target color mode using vImage | |
@@ -798,37 +799,37 @@ - (nullable NSData *)sd_encodedWebpDataWithImage:(nullable CGImageRef)imageRef | |||
| 798 | 799 | ||
| 799 | 800 | convertor = vImageConverter_CreateWithCGImageFormat(&srcFormat, &destFormat, NULL, kvImageNoFlags, &error); | |
| 800 | 801 | if (error != kvImageNoError) { | |
| 801 | - CFRelease(dataRef); | ||
| 802 | 802 | return nil; | |
| 803 | 803 | } | |
| 804 | 804 | ||
| 805 | 805 | vImage_Buffer src; | |
| 806 | 806 | error = vImageBuffer_InitWithCGImage(&src, &srcFormat, nil, imageRef, kvImageNoFlags); | |
| 807 | 807 | if (error != kvImageNoError) { | |
| 808 | 808 | vImageConverter_Release(convertor); | |
| 809 | - CFRelease(dataRef); | ||
| 810 | 809 | return nil; | |
| 811 | 810 | } | |
| 812 | 811 | ||
| 813 | 812 | vImage_Buffer dest; | |
| 814 | 813 | error = vImageBuffer_Init(&dest, height, width, destFormat.bitsPerPixel, kvImageNoFlags); | |
| 815 | 814 | if (error != kvImageNoError) { | |
| 816 | 815 | vImageConverter_Release(convertor); | |
| 817 | - CFRelease(dataRef); | ||
| 816 | + free(src.data); | ||
| 818 | 817 | return nil; | |
| 819 | 818 | } | |
| 820 | 819 | ||
| 821 | 820 | // Convert input color mode to RGB888/RGBA8888 | |
| 822 | 821 | error = vImageConvert_AnyToAny(convertor, &src, &dest, NULL, kvImageNoFlags); | |
| 822 | + | ||
| 823 | + // Free the buffer | ||
| 824 | + free(src.data); | ||
| 823 | 825 | vImageConverter_Release(convertor); | |
| 824 | 826 | if (error != kvImageNoError) { | |
| 825 | - CFRelease(dataRef); | ||
| 827 | + free(dest.data); | ||
| 826 | 828 | return nil; | |
| 827 | 829 | } | |
| 828 | 830 | ||
| 829 | 831 | rgba = dest.data; // Converted buffer | |
| 830 | 832 | bytesPerRow = dest.rowBytes; // Converted bytePerRow | |
| 831 | - CFRelease(dataRef); // Use CFData to manage bytes for free, the same code path for error handling | ||
| 832 | 833 | dataRef = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, rgba, bytesPerRow * height, kCFAllocatorDefault); | |
| 833 | 834 | } | |
| 834 | 835 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments