diff --git a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockDiversityRenderer.kt b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockDiversityRenderer.kt index 4783cc5..f7086cd 100644 --- a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockDiversityRenderer.kt +++ b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockDiversityRenderer.kt @@ -10,19 +10,19 @@ class BlockDiversityRenderer(val expanse: BlockExpanse, quadPixelSize: Int = def BlockGridRenderer(quadPixelSize) { private val randomColorKey = RandomColorKey() - override fun render(map: BlockMap): BufferedImage = buildPixelQuadImage(expanse) { x, z -> + override fun render(map: BlockMap): BufferedImage = buildPixelQuadImage(expanse) { graphics, x, z -> val maybeYBlocks = map.blocks[x]?.get(z) if (maybeYBlocks == null) { - setPixelQuad(x, z, Color.white.rgb) + setPixelQuad(graphics, x, z, Color.white.rgb) return@buildPixelQuadImage } val maxBlockState = maybeYBlocks.maxByOrNull { it.key }?.value if (maxBlockState == null) { - setPixelQuad(x, z, Color.white.rgb) + setPixelQuad(graphics, x, z, Color.white.rgb) return@buildPixelQuadImage } val color = randomColorKey.map(maxBlockState.type) - setPixelQuad(x, z, color.rgb) + setPixelQuad(graphics, x, z, color.rgb) } } diff --git a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockGridRenderer.kt b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockGridRenderer.kt index d6cf3ec..4e9d276 100644 --- a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockGridRenderer.kt +++ b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockGridRenderer.kt @@ -2,24 +2,23 @@ package cloud.kubelet.foundation.gjallarhorn.render import cloud.kubelet.foundation.gjallarhorn.state.BlockExpanse import java.awt.Color +import java.awt.Graphics2D import java.awt.Rectangle import java.awt.image.BufferedImage abstract class BlockGridRenderer(val quadPixelSize: Int = defaultQuadPixelSize) : BlockImageRenderer { - protected fun BufferedImage.setPixelQuad(x: Long, z: Long, rgb: Int) { - drawSquare(x * quadPixelSize, z * quadPixelSize, quadPixelSize.toLong(), rgb) + protected fun setPixelQuad(graphics: Graphics2D, x: Long, z: Long, rgb: Int) { + drawSquare(graphics, x * quadPixelSize, z * quadPixelSize, quadPixelSize.toLong(), rgb) } - protected fun BufferedImage.drawSquare(x: Long, y: Long, side: Long, rgb: Int) { - val graphics = createGraphics() + protected fun drawSquare(graphics: Graphics2D, x: Long, y: Long, side: Long, rgb: Int) { graphics.color = Color(rgb) graphics.fill(Rectangle(x.toInt(), y.toInt(), side.toInt(), side.toInt())) - graphics.dispose() } protected fun buildPixelQuadImage( expanse: BlockExpanse, - callback: BufferedImage.(Long, Long) -> Unit + callback: BufferedImage.(Graphics2D, Long, Long) -> Unit ): BufferedImage { val widthInBlocks = expanse.size.x val heightInBlocks = expanse.size.z @@ -28,11 +27,13 @@ abstract class BlockGridRenderer(val quadPixelSize: Int = defaultQuadPixelSize) val bufferedImage = BufferedImage(widthInPixels, heightInPixels, BufferedImage.TYPE_4BYTE_ABGR) + val graphics = bufferedImage.createGraphics() for (x in 0 until widthInBlocks) { for (z in 0 until heightInBlocks) { - callback(bufferedImage, x, z) + callback(bufferedImage, graphics, x, z) } } + graphics.dispose() return bufferedImage } diff --git a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockHeatMapRenderer.kt b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockHeatMapRenderer.kt index 0c62012..31958b5 100644 --- a/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockHeatMapRenderer.kt +++ b/tool-gjallarhorn/src/main/kotlin/cloud/kubelet/foundation/gjallarhorn/render/BlockHeatMapRenderer.kt @@ -12,7 +12,7 @@ abstract class BlockHeatMapRenderer(quadPixelSize: Int = defaultQuadPixelSize) : clamp: FloatClamp, calculate: (Long, Long) -> Long? ): BufferedImage = - buildPixelQuadImage(expanse) { x, z -> + buildPixelQuadImage(expanse) { graphics, x, z -> val value = calculate(x, z) val color = if (value != null) { val floatValue = clamp.convert(value) @@ -21,6 +21,6 @@ abstract class BlockHeatMapRenderer(quadPixelSize: Int = defaultQuadPixelSize) : Color.white } - setPixelQuad(x, z, color.rgb) + setPixelQuad(graphics, x, z, color.rgb) } }