Commit 27681468 authored by Igor Demin's avatar Igor Demin Committed by Igor Demin

Fix "open windows stress test"

There were NullPointerException.

Also rename dispose to disposeCanvas.

And add method "dispose" for full dispose
parent 4c99e1d3
package org.jetbrains.skiko package org.jetbrains.skiko
import org.jetbrains.skija.* import org.jetbrains.skija.Canvas
import org.jetbrains.skija.ClipMode
import org.jetbrains.skija.Picture
import org.jetbrains.skija.PictureRecorder
import org.jetbrains.skija.Rect
import org.jetbrains.skiko.context.ContextHandler import org.jetbrains.skiko.context.ContextHandler
import org.jetbrains.skiko.context.createContextHandler import org.jetbrains.skiko.context.createContextHandler
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
import java.awt.Graphics import java.awt.Graphics
import java.awt.event.* import java.awt.event.HierarchyEvent
import java.awt.event.InputMethodListener
import java.awt.event.KeyListener
import java.awt.event.MouseListener
import java.awt.event.MouseMotionListener
import java.awt.event.MouseWheelListener
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.SwingUtilities.isEventDispatchThread import javax.swing.SwingUtilities.isEventDispatchThread
...@@ -99,7 +108,6 @@ open class SkiaLayer( ...@@ -99,7 +108,6 @@ open class SkiaLayer(
if (isInited) { if (isInited) {
redrawer?.dispose() // we should dispose redrawer first (to cancel `draw` in rendering thread) redrawer?.dispose() // we should dispose redrawer first (to cancel `draw` in rendering thread)
contextHandler?.dispose() contextHandler?.dispose()
contextHandler?.destroyContext()
picture?.instance?.close() picture?.instance?.close()
pictureRecorder.close() pictureRecorder.close()
backedLayer.dispose() backedLayer.dispose()
......
...@@ -6,11 +6,9 @@ import org.jetbrains.skija.DirectContext ...@@ -6,11 +6,9 @@ import org.jetbrains.skija.DirectContext
import org.jetbrains.skija.Picture import org.jetbrains.skija.Picture
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skiko.GraphicsApi import org.jetbrains.skiko.GraphicsApi
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.OS import org.jetbrains.skiko.OS
import org.jetbrains.skiko.SkikoProperties import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.hostOs import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.redrawer.Redrawer
internal fun createContextHandler(layer: SkiaLayer, renderApi: GraphicsApi): ContextHandler { internal fun createContextHandler(layer: SkiaLayer, renderApi: GraphicsApi): ContextHandler {
return when (renderApi) { return when (renderApi) {
...@@ -45,9 +43,14 @@ internal abstract class ContextHandler(val layer: SkiaLayer) { ...@@ -45,9 +43,14 @@ internal abstract class ContextHandler(val layer: SkiaLayer) {
} }
fun dispose() { fun dispose() {
disposeCanvas()
destroyContext()
}
fun disposeCanvas() {
surface?.close() surface?.close()
renderTarget?.close() renderTarget?.close()
} }
open fun destroyContext() = Unit protected open fun destroyContext() = Unit
} }
package org.jetbrains.skiko.context package org.jetbrains.skiko.context
import java.lang.ref.Reference
import org.jetbrains.skija.ColorSpace import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.FramebufferFormat
import org.jetbrains.skija.Picture
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skija.impl.Native import org.jetbrains.skija.impl.Native
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.Direct3DRedrawer
import org.jetbrains.skiko.redrawer.Redrawer
import org.jetbrains.skiko.destroyContext import org.jetbrains.skiko.destroyContext
import org.jetbrains.skiko.redrawer.Direct3DRedrawer
import java.lang.ref.Reference
internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) { internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
val directXRedrawer: Direct3DRedrawer val directXRedrawer: Direct3DRedrawer
...@@ -35,7 +32,7 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) ...@@ -35,7 +32,7 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer)
} }
override fun initCanvas() { override fun initCanvas() {
dispose() disposeCanvas()
val scale = layer.contentScale val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0) val w = (layer.width * scale).toInt().coerceAtLeast(0)
...@@ -69,6 +66,8 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) ...@@ -69,6 +66,8 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer)
} }
override fun destroyContext() { override fun destroyContext() {
destroyContext(Native.getPtr(context!!)) if (context != null) {
destroyContext(Native.getPtr(context!!))
}
} }
} }
...@@ -4,10 +4,10 @@ import org.jetbrains.skija.ColorSpace ...@@ -4,10 +4,10 @@ import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.MetalRedrawer
import org.jetbrains.skija.impl.Native import org.jetbrains.skija.impl.Native
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.destroyContext import org.jetbrains.skiko.destroyContext
import org.jetbrains.skiko.redrawer.MetalRedrawer
internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) { internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
val metalRedrawer: MetalRedrawer val metalRedrawer: MetalRedrawer
...@@ -26,7 +26,7 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) { ...@@ -26,7 +26,7 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
} }
override fun initCanvas() { override fun initCanvas() {
dispose() disposeCanvas()
val scale = layer.contentScale val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0) val w = (layer.width * scale).toInt().coerceAtLeast(0)
...@@ -52,6 +52,8 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) { ...@@ -52,6 +52,8 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
} }
override fun destroyContext() { override fun destroyContext() {
destroyContext(Native.getPtr(context!!)) if (context != null) {
destroyContext(Native.getPtr(context!!))
}
} }
} }
...@@ -2,15 +2,13 @@ package org.jetbrains.skiko.context ...@@ -2,15 +2,13 @@ package org.jetbrains.skiko.context
import org.jetbrains.skija.ColorSpace import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.FramebufferFormat import org.jetbrains.skija.FramebufferFormat
import org.jetbrains.skija.Picture
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.makeGLContext import org.jetbrains.skiko.makeGLContext
import org.jetbrains.skiko.makeGLRenderTarget import org.jetbrains.skiko.makeGLRenderTarget
import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.redrawer.Redrawer
internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) { internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override fun initContext(): Boolean { override fun initContext(): Boolean {
...@@ -26,7 +24,7 @@ internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) { ...@@ -26,7 +24,7 @@ internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
} }
override fun initCanvas() { override fun initCanvas() {
dispose() disposeCanvas()
val scale = layer.contentScale val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0) val w = (layer.width * scale).toInt().coerceAtLeast(0)
......
package org.jetbrains.skiko.context package org.jetbrains.skiko.context
import java.awt.AlphaComposite import org.jetbrains.skija.Bitmap
import java.awt.color.ColorSpace import org.jetbrains.skija.Canvas
import java.awt.Color import org.jetbrains.skija.ColorAlphaType
import java.awt.Graphics2D import org.jetbrains.skija.ImageInfo
import org.jetbrains.skija.Picture
import org.jetbrains.skiko.SkiaLayer
import java.awt.Transparency import java.awt.Transparency
import java.awt.image.ComponentColorModel import java.awt.color.ColorSpace
import java.awt.image.BufferedImage import java.awt.image.BufferedImage
import java.awt.image.ComponentColorModel
import java.awt.image.DataBuffer import java.awt.image.DataBuffer
import java.awt.image.DataBufferByte import java.awt.image.DataBufferByte
import java.awt.image.WritableRaster
import java.awt.image.Raster import java.awt.image.Raster
import org.jetbrains.skija.Bitmap import java.awt.image.WritableRaster
import org.jetbrains.skija.ColorAlphaType
import org.jetbrains.skija.Canvas
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skija.ImageInfo
import org.jetbrains.skija.Picture
import org.jetbrains.skiko.redrawer.Redrawer
internal class SoftwareContextHandler(layer: SkiaLayer) : ContextHandler(layer) { internal class SoftwareContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override val bleachConstant = -1 // it looks like java.awt.Canvas doesn't support transparency override val bleachConstant = -1 // it looks like java.awt.Canvas doesn't support transparency
...@@ -40,7 +36,7 @@ internal class SoftwareContextHandler(layer: SkiaLayer) : ContextHandler(layer) ...@@ -40,7 +36,7 @@ internal class SoftwareContextHandler(layer: SkiaLayer) : ContextHandler(layer)
} }
override fun initCanvas() { override fun initCanvas() {
dispose() disposeCanvas()
val scale = layer.contentScale val scale = layer.contentScale
val w = (layer.width * scale).toInt().coerceAtLeast(0) val w = (layer.width * scale).toInt().coerceAtLeast(0)
......
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