@@ -30,24 +30,21 @@ private extension Data {
3030
3131 let resultSizeInBytes = 4 * cgImage. height * cgImage. width
3232
33- if CFDataGetLength ( data) == resultSizeInBytes {
34- switch cgImage . alphaInfo {
35- case . premultipliedLast :
36- // Fast path, use existing image data .
37- // Handles for most PNG images.
38- self . init ( referencing : data )
39- case . noneSkipLast :
40- // RGBX, handles most JPEG images.
41- self . init ( convertingImageData : data , alphaFirst : false )
42- case . noneSkipFirst :
43- // XRGB
44- self . init ( convertingImageData : data , alphaFirst : true )
45- default : break
46- }
33+ switch ( cgImage . alphaInfo , CFDataGetLength ( data) == resultSizeInBytes) {
34+ case ( . premultipliedLast , true ) :
35+ // Fast path, use existing image data.
36+ // Handles for most PNG images .
37+ self . init ( referencing : data )
38+ case ( . noneSkipLast , true ) :
39+ // RGBX, handles most JPEG images.
40+ self . init ( convertingImageData : data , alphaFirst : false )
41+ case ( . noneSkipFirst , true ) :
42+ // XRGB
43+ self . init ( convertingImageData : data , alphaFirst : true )
44+ default :
45+ // Handles all other cases, such as code-generated images, monochrome images.
46+ self . init ( drawing : cgImage )
4747 }
48-
49- // Handles all other cases, such as code-generated images, monochrome images.
50- self . init ( drawing: cgImage)
5148 }
5249
5350 init ? ( convertingImageData: NSData , alphaFirst: Bool ) {
@@ -64,16 +61,18 @@ private extension Data {
6461
6562 // TODO: measure performance, use Accelerate
6663 if alphaFirst {
64+ // Convert XRGB to RGBA: [X, R, G, B] → [R, G, B, 255]
6765 for i in stride ( from: 0 , to: length, by: 4 ) {
68- ptr [ i] = ptr [ i + 1 ]
69- ptr [ i + 1 ] = ptr [ i + 2 ]
70- ptr [ i + 2 ] = ptr [ i + 3 ]
66+ ptr [ i] = ptr [ i + 1 ] // R
67+ ptr [ i + 1 ] = ptr [ i + 2 ] // G
68+ ptr [ i + 2 ] = ptr [ i + 3 ] // B
69+ ptr [ i + 3 ] = 255 // A (opaque)
7170 }
7271 } else {
72+ // Convert RGBX to RGBA: [R, G, B, X] → [R, G, B, 255]
7373 for i in stride ( from: 0 , to: length, by: 4 ) {
7474 ptr [ i + 3 ] = 255
7575 }
76-
7776 }
7877 self . init ( referencing: mutableData)
7978 }
0 commit comments