73 lines
1.8 KiB
Kotlin
73 lines
1.8 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 ParseError("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) : Pointer {
|
|
// if( pos == width) println("setPixel 0x%x".format(argb))
|
|
colors[pos] = argb
|
|
return this
|
|
}
|
|
|
|
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) : Pointer {
|
|
this.pos = pos
|
|
this.step = step
|
|
return this
|
|
}
|
|
|
|
fun setXY(x : Int, y : Int, step : Int = 1) = setOffset(x + y * width, step)
|
|
|
|
fun plus(x : Int) : Pointer {
|
|
pos += x
|
|
return this
|
|
}
|
|
|
|
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()
|
|
}
|