Files
luma/Luma/InstrumentIconRasterizer.swift

49 lines
1.8 KiB
Swift

import Foundation
#if os(macOS)
import AppKit
#else
import UIKit
#endif
enum InstrumentIconRasterizer {
static let maxDimension: CGFloat = 128
static func normalize(_ raw: Data) -> Data? {
#if os(macOS)
guard let image = NSImage(data: raw) else { return nil }
let target = scaledSize(for: image.size)
let bitmap = NSBitmapImageRep(
bitmapDataPlanes: nil,
pixelsWide: Int(target.width),
pixelsHigh: Int(target.height),
bitsPerSample: 8,
samplesPerPixel: 4,
hasAlpha: true,
isPlanar: false,
colorSpaceName: .deviceRGB,
bytesPerRow: 0,
bitsPerPixel: 0
)
guard let bitmap else { return nil }
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current = NSGraphicsContext(bitmapImageRep: bitmap)
image.draw(in: NSRect(origin: .zero, size: target))
NSGraphicsContext.restoreGraphicsState()
return bitmap.representation(using: .png, properties: [:])
#else
guard let image = UIImage(data: raw) else { return nil }
let target = scaledSize(for: image.size)
let renderer = UIGraphicsImageRenderer(size: target)
let scaled = renderer.image { _ in image.draw(in: CGRect(origin: .zero, size: target)) }
return scaled.pngData()
#endif
}
private static func scaledSize(for source: CGSize) -> CGSize {
let longest = max(source.width, source.height)
guard longest > maxDimension else { return source }
let scale = maxDimension / longest
return CGSize(width: floor(source.width * scale), height: floor(source.height * scale))
}
}