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