Skip to content

Commit e5803cb

Browse files
committed
feat: Performance improvements
1 parent 87ef772 commit e5803cb

1 file changed

Lines changed: 16 additions & 39 deletions

File tree

FITScope/Image/ImageRenderer.swift

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -257,59 +257,36 @@ public class ImageRenderer
257257
throw RuntimeError( message: "Data size does not match expected size: \( data.count ) != \( size )" )
258258
}
259259

260-
return switch bitsPerPixel
260+
return data.withUnsafeBytes
261261
{
262-
case .uint8: data.prefix( count ).map
262+
buffer in
263+
264+
switch bitsPerPixel
263265
{
264-
Double( $0 )
265-
}
266-
267-
case .int16: ( 0 ..< count ).map
268-
{
269-
let size = 2
270-
let offset = $0 * size
271-
let value = data.subdata( in: offset ..< offset + size ).withUnsafeBytes
266+
case .uint8: return ( 0 ..< count ).map
272267
{
273-
Int16( bigEndian: $0.load( as: Int16.self ) )
268+
Double( buffer[ $0 ] )
274269
}
275270

276-
return Double( value )
277-
}
278-
279-
case .int32: ( 0 ..< count ).map
280-
{
281-
let size = 4
282-
let offset = $0 * size
283-
let value = data.subdata( in: offset ..< offset + size ).withUnsafeBytes
271+
case .int16: return ( 0 ..< count ).map
284272
{
285-
Int32( bigEndian: $0.load( as: Int32.self ) )
273+
Double( Int16( bigEndian: buffer.load( fromByteOffset: $0 * 2, as: Int16.self ) ) )
286274
}
287275

288-
return Double( value )
289-
}
290-
291-
case .float32: ( 0 ..< count ).map
292-
{
293-
let size = 4
294-
let offset = $0 * size
295-
let value = data.subdata( in: offset ..< offset + size ).withUnsafeBytes
276+
case .int32: return ( 0 ..< count).map
296277
{
297-
Float32( bitPattern: UInt32( bigEndian: $0.load( as: UInt32.self ) ) )
278+
Double( Int32( bigEndian: buffer.load( fromByteOffset: $0 * 4, as: Int32.self ) ) )
298279
}
299280

300-
return Double( value )
301-
}
302-
303-
case .float64: ( 0 ..< count ).map
304-
{
305-
let size = 8
306-
let offset = $0 * size
307-
let value = data.subdata( in: offset ..< offset + size ).withUnsafeBytes
281+
case .float32: return ( 0 ..< count ).map
308282
{
309-
Float64( bitPattern: UInt64( bigEndian: $0.load( as: UInt64.self ) ) )
283+
Double( Float32( bitPattern: UInt32( bigEndian: buffer.load( fromByteOffset: $0 * 4, as: UInt32.self ) ) ) )
310284
}
311285

312-
return value
286+
case .float64: return ( 0 ..< count ).map
287+
{
288+
Double( bitPattern: UInt64( bigEndian: buffer.load( fromByteOffset: $0 * 8, as: UInt64.self ) ) )
289+
}
313290
}
314291
}
315292
}

0 commit comments

Comments
 (0)