@@ -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