6502Android/app/src/main/kotlin/android/emu6502/Display.kt

84 lines
2.1 KiB
Kotlin

package android.emu6502
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Point
import android.util.AttributeSet
import android.util.Log
import android.view.View
import java.util
import java.util.*
open class Display : View {
private val numX = 32
private val numY = 32
private val matrix = Array(32, { IntArray(32) })
private val palette = arrayOf(
"#000000", "#ffffff", "#880000", "#aaffee",
"#cc44cc", "#00cc55", "#0000aa", "#eeee77",
"#dd8855", "#664400", "#ff7777", "#333333",
"#777777", "#aaff66", "#0088ff", "#bbbbbb")
private val paint: Paint
private val bgPaint: Paint
private val TAG = "Display"
private var listener: Callbacks? = null
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
paint = Paint()
bgPaint = Paint()
bgPaint.setColor(Color.BLACK);
}
fun setOnDisplayCallback(callback: Callbacks) {
listener = callback;
}
open fun updatePixel(addr: Int, value: Int) {
val offsetAddr = addr - 0x200
val x = offsetAddr % 32
val y = Math.floor((offsetAddr / 32).toDouble()).toInt()
val color = palette[value]
matrix[x][y] = Color.parseColor(color)
postInvalidate()
listener?.onUpdate()
}
override fun onDraw(canvas: Canvas) {
val pixelSize = getWidth() / numX
matrix.forEachIndexed { i, _ ->
matrix[i].forEachIndexed { j, _ ->
val color = matrix[i][j]
val right = (i * pixelSize).toFloat()
val top = (j * pixelSize).toFloat()
if (color != 0) {
paint.setColor(color)
canvas.drawRect(right, top, right + pixelSize, right + pixelSize, paint)
} else {
canvas.drawRect(right, top, right + pixelSize, right + pixelSize, bgPaint)
}
}
}
listener?.onDraw()
}
interface Callbacks {
fun onUpdate()
fun onDraw()
}
fun reset() {
matrix.forEachIndexed { i, _ ->
matrix[i].forEachIndexed { j, _ ->
matrix[i][j] = 0
}
}
postInvalidate()
}
}