jvmMain.org.jetbrains.skiko.redrawer.SoftwareRedrawer.kt Maven / Gradle / Ivy
package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.*
import kotlinx.coroutines.swing.Swing
import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.FrameLimiter
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.context.MetalContextHandler
import org.jetbrains.skiko.context.SoftwareContextHandler
internal class SoftwareRedrawer(
private val layer: SkiaLayer,
private val properties: SkiaLayerProperties
) : Redrawer {
private val contextHandler = SoftwareContextHandler(layer)
override val renderInfo: String get() = contextHandler.rendererInfo()
private val frameJob = Job()
private val frameLimiter = FrameLimiter(CoroutineScope(Dispatchers.IO + frameJob), layer.backedLayer)
private val frameDispatcher = FrameDispatcher(Dispatchers.Swing) {
if (properties.isVsyncEnabled && properties.isVsyncFramelimitFallbackEnabled) {
frameLimiter.awaitNextFrame()
}
if (layer.isShowing) {
layer.update(System.nanoTime())
layer.inDrawScope(contextHandler::draw)
}
}
override fun dispose() {
frameDispatcher.cancel()
contextHandler.dispose()
runBlocking {
frameJob.cancelAndJoin()
}
}
override fun needRedraw() {
frameDispatcher.scheduleFrame()
}
override fun redrawImmediately() {
layer.update(System.nanoTime())
layer.inDrawScope(contextHandler::draw)
}
}