Skip to content

Commit 8fa920a

Browse files
committed
[feat]: image comparison
1 parent af1e911 commit 8fa920a

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// DataExtension.swift
3+
// ScriptToolkit
4+
//
5+
// Created by Daniel Cech on 20/07/2020.
6+
//
7+
8+
import Foundation
9+
10+
extension Data {
11+
func indexOf(data: Data) -> Data.Index? {
12+
var selfIndex = self.startIndex
13+
var dataIndex = data.startIndex
14+
15+
while selfIndex <= self.endIndex && dataIndex <= data.endIndex {
16+
if dataIndex == data.endIndex {
17+
return selfIndex - data.count
18+
}
19+
20+
if self[selfIndex] == data[dataIndex] {
21+
dataIndex += 1
22+
}
23+
else {
24+
dataIndex = data.startIndex
25+
}
26+
selfIndex += 1
27+
}
28+
29+
return nil
30+
}
31+
}

Sources/ScriptToolkit/NSImageExtension.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,26 @@ public extension NSImage {
5858
// Return nil in case something went wrong.
5959
throw ScriptError.generalError(message: "Unable to resize image")
6060
}
61+
62+
func areImagesSame(firstPNGData: Data, secondPNGData: Data) -> Bool {
63+
let sequence = Data([0x6C, 0x65, 0x58, 0x49, 0x66])
64+
65+
let firstOffset = firstPNGData.indexOf(data: sequence)!
66+
let firstSubdata = firstPNGData.subdata(in: firstOffset ..< firstPNGData.endIndex)
67+
68+
let secondOffset = secondPNGData.indexOf(data: sequence)!
69+
let secondSubdata = secondPNGData.subdata(in: secondOffset ..< secondPNGData.endIndex)
70+
71+
return firstSubdata == secondSubdata
72+
}
6173

6274
/// Saves the PNG representation of the current image to the HD.
6375
///
6476
/// - parameter url: The location url to which to write the png file.
6577
func savePNGRepresentationToURL(url: URL, onlyChange: Bool = true) throws {
6678
if let pngData = self.PNGRepresentation {
6779
if let originalData = try? Data(contentsOf: url) {
68-
69-
// The beginning of PNG contains some data that may differ - a header
70-
let originalSubdata = originalData.subdata(in: 175 ..< originalData.endIndex)
71-
let pngSubdata = pngData.subdata(in: 175 ..< pngData.endIndex)
72-
73-
74-
if onlyChange && (pngSubdata == originalSubdata) {
80+
if onlyChange && areImagesSame(firstPNGData: pngData, secondPNGData: originalData) {
7581
return
7682
}
7783
}

0 commit comments

Comments
 (0)