Unverified Commit 41ad22b9 authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Window state notifications. (#104)

parent 5b9b69e2
......@@ -59,6 +59,10 @@ fun createWindow(title: String) = SwingUtilities.invokeLater {
val state = State()
state.text = title
window.layer.onStateChanged(SkiaLayer.PropertyKind.Renderer) { layer ->
println("Changed renderer for $layer: new value is ${layer.renderApi}")
}
window.layer.renderer = Renderer(window.layer) {
renderer, w, h, nanoTime -> displayScene(renderer, w, h, nanoTime, mouseX, mouseY, state)
}
......
......@@ -24,6 +24,11 @@ open class SkiaLayer(
private val properties: SkiaLayerProperties = SkiaLayerProperties()
) : JPanel() {
enum class PropertyKind {
Renderer,
ContentScale,
}
internal val backedLayer : HardwareLayer
init {
......@@ -74,8 +79,6 @@ open class SkiaLayer(
get() = backedLayer.fullscreen
set(value) { backedLayer.fullscreen = value }
protected open fun contentScaleChanged() = Unit
var renderer: SkiaRenderer? = null
val clipComponents = mutableListOf<ClipRectangle>()
......@@ -84,15 +87,19 @@ open class SkiaLayer(
internal var redrawer: Redrawer? = null
private var contextHandler: ContextHandler? = null
private val fallbackRenderApiQueue = SkikoProperties.fallbackRenderApiQueue.toMutableList()
var renderApi: GraphicsApi = fallbackRenderApiQueue[0]
private set
private var renderApi_ = fallbackRenderApiQueue[0]
var renderApi: GraphicsApi
get() = renderApi_
private set(value) {
this.renderApi_ = value
notifyChange(PropertyKind.Renderer)
}
@Volatile
private var picture: PictureHolder? = null
private val pictureRecorder = PictureRecorder()
private val pictureLock = Any()
open fun init() {
backedLayer.init()
renderApi = fallbackRenderApiQueue.removeAt(0)
......@@ -101,6 +108,19 @@ open class SkiaLayer(
isInited = true
}
private val stateHandlers =
mutableMapOf<PropertyKind, MutableList<(SkiaLayer) -> Unit>>()
fun onStateChanged(kind: PropertyKind, handler: (SkiaLayer) -> Unit) {
stateHandlers.getOrPut( kind, { mutableListOf() }) += handler
}
private fun notifyChange(kind: PropertyKind) {
stateHandlers.get(kind)?.let { handlers ->
handlers.forEach { it(this) }
}
}
open fun dispose() {
check(!isDisposed)
check(isEventDispatchThread())
......@@ -129,7 +149,7 @@ open class SkiaLayer(
override fun paint(g: Graphics) {
super.paint(g)
if (backedLayer.checkContentScale()) {
contentScaleChanged()
notifyChange(PropertyKind.ContentScale)
}
redrawer?.syncSize()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment