13
13
#import " avif/avif.h"
14
14
#endif
15
15
16
+ static void FreeImageData (void *info, const void *data, size_t size) {
17
+ free ((void *)data);
18
+ }
19
+
16
20
static CGImageRef CreateImageFromBuffer (avifImage * avif, vImage_Buffer* result) {
17
21
BOOL monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
18
22
BOOL hasAlpha = avif->alphaPlane != NULL ;
19
23
BOOL usesU16 = avifImageUsesU16 (avif);
20
24
size_t components = (monochrome ? 1 : 3 ) + (hasAlpha ? 1 : 0 );
21
25
22
- CGDataProviderRef provider = CGDataProviderCreateWithData (NULL , result->data , result->rowBytes * result->height , NULL );
26
+ CGDataProviderRef provider = CGDataProviderCreateWithData (NULL , result->data , result->rowBytes * result->height , FreeImageData );
23
27
CGBitmapInfo bitmapInfo = usesU16 ? kCGBitmapByteOrder16Host : kCGBitmapByteOrderDefault ;
24
28
bitmapInfo |= hasAlpha ? kCGImageAlphaFirst : kCGImageAlphaNone ;
25
29
// FIXME: (ledyba-z): Set appropriate color space.
@@ -40,7 +44,6 @@ static CGImageRef CreateImageFromBuffer(avifImage * avif, vImage_Buffer* result)
40
44
41
45
CGImageRef imageRef = CGImageCreate (result->width , result->height , bitsPerComponent, bitsPerPixel, rowBytes, colorSpace, bitmapInfo, provider, NULL , NO , renderingIntent);
42
46
43
-
44
47
// clean up
45
48
CGColorSpaceRelease (colorSpace);
46
49
CGDataProviderRelease (provider);
@@ -137,7 +140,7 @@ static void SetupConversionInfo(avifImage * avif,
137
140
138
141
139
142
// Convert 8bit AVIF image into RGB888/ARGB8888/Mono/MonoA using vImage Acceralation Framework.
140
- static CGImageRef CreateImage16U (avifImage * avif) {
143
+ static CGImageRef CreateImage8 (avifImage * avif) {
141
144
vImage_Error err = kvImageNoError;
142
145
BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
143
146
BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -503,19 +506,15 @@ static CGImageRef CreateImage16U(avifImage * avif) {
503
506
NSLog (@" Failed to combine mono and alpha: %ld " , err);
504
507
return NULL ;
505
508
}
506
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
507
- free (outPixels);
508
- return img;
509
+ return CreateImageFromBuffer (avif, &outBuffer);
509
510
} else {
510
511
err = vImageOverwriteChannels_ARGB8888 (&alphaBuffer, &argbBuffer, &argbBuffer, 0x8 , kvImageNoFlags);
511
512
if (err != kvImageNoError) {
512
513
free (outPixels);
513
514
NSLog (@" Failed to overwrite alpha: %ld " , err);
514
515
return NULL ;
515
516
}
516
- CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
517
- free (outPixels);
518
- return img;
517
+ return CreateImageFromBuffer (avif, &argbBuffer);
519
518
}
520
519
} else {
521
520
if (monochrome) {
@@ -544,9 +543,7 @@ static CGImageRef CreateImage16U(avifImage * avif) {
544
543
NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
545
544
return NULL ;
546
545
}
547
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
548
- free (outPixels);
549
- return img;
546
+ return CreateImageFromBuffer (avif, &outBuffer);
550
547
} else {
551
548
vImage_Buffer outBuffer = {
552
549
.data = outPixels,
@@ -561,15 +558,13 @@ static CGImageRef CreateImage16U(avifImage * avif) {
561
558
NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
562
559
return NULL ;
563
560
}
564
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
565
- free (outPixels);
566
- return img;
561
+ return CreateImageFromBuffer (avif, &outBuffer);
567
562
}
568
563
}
569
564
}
570
565
571
566
// Convert 10/12bit AVIF image into RGB16U/ARGB16U/Mono16U/MonoA16U
572
- static CGImageRef CreateImage8 (avifImage * avif) {
567
+ static CGImageRef CreateImage16U (avifImage * avif) {
573
568
vImage_Error err = kvImageNoError;
574
569
BOOL const monochrome = avif->yuvPlanes [1 ] == NULL || avif->yuvPlanes [2 ] == NULL ;
575
570
BOOL const hasAlpha = avif->alphaPlane != NULL ;
@@ -1037,13 +1032,9 @@ static CGImageRef CreateImage8(avifImage * avif) {
1037
1032
NSLog (@" Failed to convert ARGB to MonoA: %ld " , err);
1038
1033
return NULL ;
1039
1034
}
1040
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1041
- free (outPixels);
1042
- return img;
1035
+ return CreateImageFromBuffer (avif, &outBuffer);
1043
1036
}else {
1044
- CGImageRef img = CreateImageFromBuffer (avif, &argbBuffer);
1045
- free (outPixels);
1046
- return img;
1037
+ return CreateImageFromBuffer (avif, &argbBuffer);
1047
1038
}
1048
1039
} else {
1049
1040
vImage_Buffer outBuffer = {
@@ -1072,9 +1063,7 @@ static CGImageRef CreateImage8(avifImage * avif) {
1072
1063
NSLog (@" Failed to convert ARGB to Mono: %ld " , err);
1073
1064
return NULL ;
1074
1065
}
1075
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1076
- free (outPixels);
1077
- return img;
1066
+ return CreateImageFromBuffer (avif, &outBuffer);
1078
1067
} else {
1079
1068
err = vImageConvert_ARGB16UtoRGB16U (&argbBuffer, &outBuffer, kvImageNoFlags);
1080
1069
free (argbPixels);
@@ -1083,9 +1072,7 @@ static CGImageRef CreateImage8(avifImage * avif) {
1083
1072
NSLog (@" Failed to convert ARGB to RGB: %ld " , err);
1084
1073
return NULL ;
1085
1074
}
1086
- CGImageRef img = CreateImageFromBuffer (avif, &outBuffer);
1087
- free (outPixels);
1088
- return img;
1075
+ return CreateImageFromBuffer (avif, &outBuffer);
1089
1076
}
1090
1077
}
1091
1078
}
@@ -1181,9 +1168,9 @@ - (nullable CGImageRef)sd_createAVIFImageWithData:(nonnull NSData *)data CF_RETU
1181
1168
CGImageRef image = NULL ;
1182
1169
// convert planar to ARGB/RGB
1183
1170
if (avifImageUsesU16 (avif)) { // 10bit or 12bit
1184
- image = CreateImage8 (avif);
1185
- } else { // 8bit
1186
1171
image = CreateImage16U (avif);
1172
+ } else { // 8bit
1173
+ image = CreateImage8 (avif);
1187
1174
}
1188
1175
avifDecoderDestroy (decoder);
1189
1176
return image;
0 commit comments