@@ -80,6 +80,11 @@ extension Snapshotting where Value == UIImage, Format == UIImage {
80
80
}
81
81
}
82
82
83
+ // remap snapshot & reference to same colorspace
84
+ let imageContextColorSpace = CGColorSpace ( name: CGColorSpace . sRGB)
85
+ let imageContextBitsPerComponent = 8
86
+ let imageContextBytesPerPixel = 4
87
+
83
88
private func compare( _ old: UIImage , _ new: UIImage , precision: Float ) -> Bool {
84
89
guard let oldCgImage = old. cgImage else { return false }
85
90
guard let newCgImage = new. cgImage else { return false }
@@ -89,23 +94,18 @@ private func compare(_ old: UIImage, _ new: UIImage, precision: Float) -> Bool {
89
94
guard oldCgImage. height != 0 else { return false }
90
95
guard newCgImage. height != 0 else { return false }
91
96
guard oldCgImage. height == newCgImage. height else { return false }
92
- // Values between images may differ due to padding to multiple of 64 bytes per row,
93
- // because of that a freshly taken view snapshot may differ from one stored as PNG.
94
- // At this point we're sure that size of both images is the same, so we can go with minimal `bytesPerRow` value
95
- // and use it to create contexts.
96
- let minBytesPerRow = min ( oldCgImage. bytesPerRow, newCgImage. bytesPerRow)
97
- let byteCount = minBytesPerRow * oldCgImage. height
98
97
98
+ let byteCount = imageContextBytesPerPixel * oldCgImage. width * oldCgImage. height
99
99
var oldBytes = [ UInt8] ( repeating: 0 , count: byteCount)
100
- guard let oldContext = context ( for: oldCgImage, bytesPerRow : minBytesPerRow , data: & oldBytes) else { return false }
100
+ guard let oldContext = context ( for: oldCgImage, data: & oldBytes) else { return false }
101
101
guard let oldData = oldContext. data else { return false }
102
- if let newContext = context ( for: newCgImage, bytesPerRow : minBytesPerRow ) , let newData = newContext. data {
102
+ if let newContext = context ( for: newCgImage) , let newData = newContext. data {
103
103
if memcmp ( oldData, newData, byteCount) == 0 { return true }
104
104
}
105
105
let newer = UIImage ( data: new. pngData ( ) !) !
106
106
guard let newerCgImage = newer. cgImage else { return false }
107
107
var newerBytes = [ UInt8] ( repeating: 0 , count: byteCount)
108
- guard let newerContext = context ( for: newerCgImage, bytesPerRow : minBytesPerRow , data: & newerBytes) else { return false }
108
+ guard let newerContext = context ( for: newerCgImage, data: & newerBytes) else { return false }
109
109
guard let newerData = newerContext. data else { return false }
110
110
if memcmp ( oldData, newerData, byteCount) == 0 { return true }
111
111
if precision >= 1 { return false }
@@ -118,16 +118,17 @@ private func compare(_ old: UIImage, _ new: UIImage, precision: Float) -> Bool {
118
118
return true
119
119
}
120
120
121
- private func context( for cgImage: CGImage , bytesPerRow: Int , data: UnsafeMutableRawPointer ? = nil ) -> CGContext ? {
121
+ private func context( for cgImage: CGImage , data: UnsafeMutableRawPointer ? = nil ) -> CGContext ? {
122
+ let bytesPerRow = cgImage. width * imageContextBytesPerPixel
122
123
guard
123
- let space = cgImage . colorSpace ,
124
+ let colorSpace = imageContextColorSpace ,
124
125
let context = CGContext (
125
126
data: data,
126
127
width: cgImage. width,
127
128
height: cgImage. height,
128
- bitsPerComponent: cgImage . bitsPerComponent ,
129
+ bitsPerComponent: imageContextBitsPerComponent ,
129
130
bytesPerRow: bytesPerRow,
130
- space: space ,
131
+ space: colorSpace ,
131
132
bitmapInfo: CGImageAlphaInfo . premultipliedLast. rawValue
132
133
)
133
134
else { return nil }
0 commit comments