Files
SwiftUI-LifeGame/Shared/View/Part/BoardRenderImage.swift
T

82 lines
2.4 KiB
Swift

//
// BoardRenderImage.swift
// LifeGameApp (iOS)
//
// Created by Yusuke Hosonuma on 2020/08/14.
//
import SwiftUI
import LifeGame
#if os(macOS)
private typealias XImage = NSImage
#else
private typealias XImage = UIImage
#endif
struct BoardRenderImage: View {
let board: Board<Cell>
let cellRenderSize: Int
let cellColor: Color
var body: some View {
Image(image: renderImage())
.resizable()
}
private var fillColor: CGColor {
cellColor.cgColor
}
private var gridColor: CGColor {
Color.gray.opacity(0.5).cgColor
}
private func renderImage() -> XImage {
let scale = cellRenderSize
let size = CGSize(width: board.size * scale + 1, height: board.size * scale + 1)
return GraphicsImageRenderer(size: size)
.image(actions: { context in
context.setFillColor(fillColor)
// Draw cells
for (index, cell) in board.cells.enumerated() {
let x = (index % board.size) * scale
let y = (index / board.size) * scale
if cell == .alive {
context.fill(CGRect(origin: CGPoint(x: x + 1, y: y + 1), size: CGSize(width: scale - 1, height: scale - 1)))
}
}
// Draw grids
context.setFillColor(gridColor)
for index in 0...board.size + 1 {
let length = board.size * scale + 1
context.fill(CGRect(x: scale * index, y: 0, width: 1, height: length)) // vertical lines
context.fill(CGRect(x: 0, y: scale * index, width: length, height: 1)) // horizontal lines
}
})
}
}
struct BoardRender_Previews: PreviewProvider {
static var previews: some View {
view(preset: .nebura, colorScheme: .dark)
view(preset: .nebura, colorScheme: .light)
view(preset: .spaceShip, colorScheme: .dark)
}
static func view(preset: BoardPreset, colorScheme: ColorScheme) -> some View {
BoardRenderImage(
board: preset.board.board,
cellRenderSize: 10,
cellColor: colorScheme == .dark ? .white : .black
)
.previewLayout(.fixed(width: 200.0, height: 200.0))
.colorScheme(colorScheme)
.preferredColorScheme(colorScheme)
.padding()
}
}