Commit 132f77ae authored by Igor Demin's avatar Igor Demin

Make SkiaRenderer non-suspend

Suspend was added because compose's onRender was suspend.
Now it is non-suspend.

If we make this method non-suspend, we can synchronously redraw window after it is resized or started (to avoid lags at resize and start)
parent 6ad0a4e6
......@@ -89,7 +89,7 @@ class Renderer(
var canvas: Canvas? = null
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
this.canvas = canvas
val contentScale = layer.contentScale
canvas.scale(contentScale, contentScale)
......
......@@ -73,7 +73,7 @@ native crash in SkiaWindowTest "render single window"
setSize(width, height)
defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
if (canCollect && frameTimes.size < frameCount) {
frameTimes.add(System.nanoTime()) // we check the real time, not the time provided by the argument
}
......@@ -183,7 +183,7 @@ j org.jetbrains.skiko.redrawer.MacOsRedrawer$drawLayer$1.draw()V+7
var t1 = Long.MAX_VALUE
val refreshRate = window.graphicsConfiguration.device.displayMode.refreshRate
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
val t2 = System.nanoTime()
val frameTime = (t2 - t1).coerceAtLeast(0)
t1 = t2
......
......@@ -138,7 +138,7 @@ class SkiaWindowTest {
window.setSize(40, 20)
window.defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
window.layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
renderCount++
}
}
......@@ -231,7 +231,7 @@ class SkiaWindowTest {
val paragraph by lazy { paragraph(window.layer.contentScale * 40, "=-+Нп") }
window.layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
paragraph.layout(Float.POSITIVE_INFINITY)
paragraph.paint(canvas, 0f, 0f)
}
......@@ -259,7 +259,7 @@ class SkiaWindowTest {
var rectHeight: Int,
private val rectColor: Color
) : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
val dpi = layer.contentScale
canvas.drawRect(Rect(0f, 0f, width.toFloat(), height.toFloat()), Paint().apply {
color = Color.WHITE.rgb
......@@ -278,7 +278,7 @@ class SkiaWindowTest {
private var oldNanoTime = Long.MAX_VALUE
private var x = 0.0
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
canvas.clear(Color.WHITE.rgb)
val dt = (nanoTime - oldNanoTime).coerceAtLeast(0) / 1E9
......
......@@ -62,7 +62,7 @@ abstract class HardwareLayer : Canvas() {
}
// Should be called in Swing thread
internal abstract suspend fun update(nanoTime: Long)
internal abstract fun update(nanoTime: Long)
// Should be called in the OpenGL thread, and only once after update
internal abstract fun draw()
......
......@@ -9,7 +9,7 @@ import java.awt.Graphics
import javax.swing.SwingUtilities.isEventDispatchThread
interface SkiaRenderer {
suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long)
fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long)
}
private class PictureHolder(val instance: Picture, val width: Int, val height: Int)
......@@ -69,7 +69,7 @@ open class SkiaLayer : HardwareLayer() {
probability = SkikoProperties.fpsProbability
)
override suspend fun update(nanoTime: Long) {
override fun update(nanoTime: Long) {
check(!isDisposed)
check(isEventDispatchThread())
......
......@@ -2,9 +2,7 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext
import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.OpenGLApi
......@@ -20,7 +18,6 @@ internal class LinuxRedrawer(
context
}
private var isDisposed = false
private val job = Job()
override fun dispose() {
check(!isDisposed)
......@@ -28,7 +25,6 @@ internal class LinuxRedrawer(
it.destroyContext(context)
}
isDisposed = true
job.cancel()
}
override fun needRedraw() {
......@@ -37,10 +33,8 @@ internal class LinuxRedrawer(
frameDispatcher.scheduleFrame()
}
private suspend fun update(nanoTime: Long) {
withContext(job) {
layer.update(nanoTime)
}
private fun update(nanoTime: Long) {
layer.update(nanoTime)
}
private fun draw() {
......
......@@ -2,7 +2,6 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext
import org.jetbrains.skiko.FrameDispatcher
......@@ -16,7 +15,6 @@ internal class WindowsRedrawer(
private val device = getDevice(layer)
private val context = createContext(device)
private var isDisposed = false
private val job = Job()
init {
makeCurrent()
......@@ -31,7 +29,6 @@ internal class WindowsRedrawer(
check(!isDisposed)
deleteContext(context)
isDisposed = true
job.cancel()
}
override fun needRedraw() {
......@@ -40,10 +37,8 @@ internal class WindowsRedrawer(
frameDispatcher.scheduleFrame()
}
private suspend fun update(nanoTime: Long) {
withContext(job) {
layer.update(nanoTime)
}
private fun update(nanoTime: Long) {
layer.update(nanoTime)
}
private fun draw() {
......
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