SubwayTooter-Android-App/apng/src/main/java/jp/juggler/apng/ApngBitmap.kt

65 lines
1.9 KiB
Kotlin

@file:Suppress("MemberVisibilityCanBePrivate", "unused")
package jp.juggler.apng
class ApngBitmap(var width: Int, var height: Int) {
// each int value contains 0xAARRGGBB
val colors = IntArray(width * height)
// widthとheightを再指定する。ビットマップはそのまま再利用する
fun reset(width: Int, height: Int) {
val newSize = width * height
if (newSize > colors.size)
throw ApngParseError("can't resize to $width x $height , it's greater than initial size")
this.width = width
this.height = height
// 透明な黒で初期化する
colors.fill(0, fromIndex = 0, toIndex = newSize)
}
// ビットマップ中の位置を保持して、ピクセルへの書き込みと位置の更新を行う
inner class Pointer {
private var pos: Int = 0
var step: Int = 1
fun setPixel(argb: Int) = apply { colors[pos] = argb }
fun setPixel(a: Int, r: Int, g: Int, b: Int) = setPixel(
((a and 255) shl 24) or
((r and 255) shl 16) or
((g and 255) shl 8) or
(b and 255)
)
fun setOffset(pos: Int = 0, step: Int = 1) = apply {
this.pos = pos
this.step = step
}
fun setXY(x: Int, y: Int, step: Int = 1) = setOffset(x + y * width, step)
fun plus(x: Int) = apply { pos += x }
fun next() = plus(step)
val color: Int
get() = colors[pos]
val alpha: Int
get() = (colors[pos] shr 24) and 255
val red: Int
get() = (colors[pos] shr 16) and 255
val green: Int
get() = (colors[pos] shr 8) and 255
val blue: Int
get() = (colors[pos]) and 255
}
fun pointer() = Pointer()
}