@@ -41,8 +41,8 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
41
41
}
42
42
}
43
43
@objc dynamic private var directory = true
44
- private var image : NSImage ?
45
- private var images : [ NSImage ] ?
44
+ private var image : NSImageRep ?
45
+ private var images : [ NSImageRep ] ?
46
46
47
47
override init ( ) {
48
48
gridX = Self . GRID_X
@@ -51,8 +51,8 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
51
51
}
52
52
53
53
func beginSheetModal( for window: NSWindow ,
54
- sheetCallback: @escaping ( NSImage , Int , Int , Bool ) -> Void ,
55
- framesCallback: @escaping ( [ NSImage ] , Bool ) -> Void ) {
54
+ sheetCallback: @escaping ( NSImageRep , Int , Int , Bool ) -> Void ,
55
+ framesCallback: @escaping ( [ NSImageRep ] , Bool ) -> Void ) {
56
56
self . reset ( )
57
57
let panel = NSOpenPanel ( )
58
58
panel. allowedFileTypes = [ " public.image " ]
@@ -74,8 +74,8 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
74
74
}
75
75
76
76
func beginSheetModal( for window: NSWindow ,
77
- with image: NSImage ,
78
- sheetCallback: @escaping ( NSImage , Int , Int , Bool ) -> Void ) {
77
+ with image: NSImageRep ,
78
+ sheetCallback: @escaping ( NSImageRep , Int , Int , Bool ) -> Void ) {
79
79
self . setImage ( image)
80
80
self . updateGrid ( )
81
81
// The width of the options view will change when used in the open panel - reset it to an appropriate value
@@ -85,7 +85,9 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
85
85
alert. accessoryView = optionsView
86
86
if #available( macOS 11 , * ) {
87
87
// We don't really want an icon but the alert necessarily has one - on macOS 11 we can use the given image
88
- alert. icon = image
88
+ let icon = NSImage ( size: image. size)
89
+ icon. addRepresentation ( image)
90
+ alert. icon = icon
89
91
alert. messageText = " "
90
92
} else {
91
93
// On older systems the default app icon works better but we do need a title
@@ -107,13 +109,8 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
107
109
func panel( _ sender: Any , validate url: URL ) throws {
108
110
if directory {
109
111
var items = try FileManager . default. contentsOfDirectory ( at: url, includingPropertiesForKeys: nil , options: . skipsHiddenFiles)
110
- items. sort ( by: { $0. path. localizedStandardCompare ( $1. path) == . orderedAscending } )
111
- var images : [ NSImage ] = [ ]
112
- for item in items {
113
- if let image = NSImage ( contentsOf: item) , image. isValid {
114
- images. append ( image)
115
- }
116
- }
112
+ items. sort { $0. path. localizedStandardCompare ( $1. path) == . orderedAscending }
113
+ let images = items. compactMap ( NSImageRep . init)
117
114
guard !images. isEmpty else {
118
115
throw SpriteImporterError . noImages
119
116
}
@@ -122,10 +119,10 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
122
119
guard let image else {
123
120
throw SpriteImporterError . unsupportedFile
124
121
}
125
- guard gridX > 0 , image. representations [ 0 ] . pixelsWide % gridX == 0 else {
122
+ guard image. pixelsWide. isMultiple ( of : gridX) else {
126
123
throw SpriteImporterError . invalidX ( gridX)
127
124
}
128
- guard gridY > 0 , image. representations [ 0 ] . pixelsHigh % gridY == 0 else {
125
+ guard image. pixelsHigh. isMultiple ( of : gridY) else {
129
126
throw SpriteImporterError . invalidY ( gridY)
130
127
}
131
128
}
@@ -138,7 +135,7 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
138
135
if ( try ? url. resourceValues ( forKeys: [ . isDirectoryKey] ) . isDirectory) == true {
139
136
panel. prompt = NSLocalizedString ( " Import Folder " , comment: " " )
140
137
} else {
141
- self . setImage ( NSImage ( contentsOf: url) )
138
+ self . setImage ( NSImageRep ( contentsOf: url) )
142
139
panel. prompt = NSLocalizedString ( " Import Image " , comment: " " )
143
140
}
144
141
}
@@ -151,19 +148,19 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
151
148
preview. image = nil
152
149
return
153
150
}
154
- let width = image. representations [ 0 ] . pixelsWide
155
- let height = image. representations [ 0 ] . pixelsHigh
156
- guard gridX > 0 , width % gridX == 0 , gridY > 0 , height % gridY == 0 else {
151
+ let width = image. pixelsWide
152
+ let height = image. pixelsHigh
153
+ guard width. isMultiple ( of : gridX) , height. isMultiple ( of : gridY) else {
157
154
frameSize. stringValue = " grid mismatch "
158
155
preview. image = nil
159
156
return
160
157
}
161
158
frameSize. stringValue = " \( width/ gridX) x \( height/ gridY) "
162
- let size = NSSize ( width: image . size . width/ CGFloat ( gridX) , height: image . size . height/ CGFloat ( gridY) )
163
- preview. image = NSImage ( size: size)
164
- preview . image? . lockFocus ( )
165
- image. draw ( at : . zero , from: NSRect ( x : 0 , y : image . size . height - size . height , width : size . width , height : size . height ) , operation : . copy , fraction : 1 )
166
- preview . image ? . unlockFocus ( )
159
+ let size = NSSize ( width: width/ gridX, height: height/ gridY)
160
+ preview. image = NSImage ( size: size, flipped : false ) { rect in
161
+ let srcRect = NSRect ( x : 0 , y : image. size . height - size . height , width : size . width , height : size . height )
162
+ return image. draw ( in : rect , from: srcRect , operation : . copy , fraction : 1 , respectFlipped : true , hints : nil )
163
+ }
167
164
}
168
165
169
166
private func reset( ) {
@@ -175,16 +172,16 @@ class SpriteImporter: NSObject, NSOpenSavePanelDelegate {
175
172
preview. image = nil
176
173
}
177
174
178
- private func setImage( _ image: NSImage ? ) {
175
+ private func setImage( _ image: NSImageRep ? ) {
179
176
directory = false
180
177
guard let image,
181
- let rep = image. representations. first,
182
- rep. pixelsWide > 0 && rep. pixelsHigh > 0
178
+ image. pixelsWide > 0 && image. pixelsHigh > 0
183
179
else {
184
180
imageSize. stringValue = " unsupported "
185
181
return
186
182
}
183
+ image. size = NSSize ( width: image. pixelsWide, height: image. pixelsHigh)
187
184
self . image = image
188
- imageSize. stringValue = " \( rep . pixelsWide) x \( rep . pixelsHigh) "
185
+ imageSize. stringValue = " \( image . pixelsWide) x \( image . pixelsHigh) "
189
186
}
190
187
}
0 commit comments