@@ -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
0 commit comments