From d7df60c7d65ec5545d64e795085923bf5516f6f6 Mon Sep 17 00:00:00 2001 From: Nikolay Rykunov Date: Thu, 29 Jun 2023 12:48:32 +0200 Subject: [PATCH] Add test for z ordering with SkiaSwingLayer --- .../jetbrains/skiko/swing/SkiaSwingLayer.kt | 10 +- .../org/jetbrains/skiko/SkiaLayerTest.kt | 2 +- .../org/jetbrains/skiko/SkiaSwingLayerTest.kt | 87 ++++++++++++++++++ ...ko_SkiaSwingLayerTest_overlapped_popup.png | Bin 0 -> 1957 bytes 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaSwingLayerTest.kt create mode 100644 skiko/src/jvmTest/screenshots/org_jetbrains_skiko_SkiaSwingLayerTest_overlapped_popup.png diff --git a/skiko/src/awtMain/kotlin/org/jetbrains/skiko/swing/SkiaSwingLayer.kt b/skiko/src/awtMain/kotlin/org/jetbrains/skiko/swing/SkiaSwingLayer.kt index 8124d1059..ad3e5c28c 100644 --- a/skiko/src/awtMain/kotlin/org/jetbrains/skiko/swing/SkiaSwingLayer.kt +++ b/skiko/src/awtMain/kotlin/org/jetbrains/skiko/swing/SkiaSwingLayer.kt @@ -21,8 +21,9 @@ import javax.swing.SwingUtilities.isEventDispatchThread */ @Suppress("unused") // used in Compose Multiplatform @ExperimentalSkikoApi -open class SkiaSwingLayer( +open class SkiaSwingLayer internal constructor( skikoView: SkikoView, + private val properties: SkiaLayerProperties, analytics: SkiaLayerAnalytics = SkiaLayerAnalytics.Empty, ) : JComponent() { internal companion object { @@ -31,8 +32,6 @@ open class SkiaSwingLayer( } } - private val properties = SkiaLayerProperties() - private var isInitialized = false @Volatile @@ -73,6 +72,11 @@ open class SkiaSwingLayer( val renderApi: GraphicsApi get() = redrawerManager.renderApi + constructor( + skikoView: SkikoView, + analytics: SkiaLayerAnalytics = SkiaLayerAnalytics.Empty, + ) : this(skikoView, SkiaLayerProperties(), analytics) + init { isOpaque = false layout = null diff --git a/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt b/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt index 8070c06a0..c74ffc35a 100644 --- a/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt +++ b/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaLayerTest.kt @@ -835,4 +835,4 @@ class SkiaLayerTest { } } -private fun JFrame.close() = dispatchEvent(WindowEvent(this, WindowEvent.WINDOW_CLOSING)) +internal fun JFrame.close() = dispatchEvent(WindowEvent(this, WindowEvent.WINDOW_CLOSING)) diff --git a/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaSwingLayerTest.kt b/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaSwingLayerTest.kt new file mode 100644 index 000000000..8afea4d9b --- /dev/null +++ b/skiko/src/awtTest/kotlin/org/jetbrains/skiko/SkiaSwingLayerTest.kt @@ -0,0 +1,87 @@ +package org.jetbrains.skiko + +import kotlinx.coroutines.delay +import org.jetbrains.skia.Canvas +import org.jetbrains.skia.Paint +import org.jetbrains.skia.Rect +import org.jetbrains.skiko.swing.SkiaSwingLayer +import org.jetbrains.skiko.util.ScreenshotTestRule +import org.jetbrains.skiko.util.uiTest +import org.junit.Rule +import java.awt.Color +import java.awt.Dimension +import java.awt.Graphics +import java.awt.Graphics2D +import java.awt.RenderingHints +import javax.swing.JComponent +import javax.swing.JFrame +import javax.swing.JLayeredPane +import javax.swing.WindowConstants +import kotlin.test.Test + +@OptIn(ExperimentalSkikoApi::class) +class SkiaSwingLayerTest { + + @get:Rule + val screenshots = ScreenshotTestRule() + + @Test + fun `overlapped popup`() = uiTest { + val skikoView = fillSkikoView() + val skiaLayer = SkiaSwingLayer(skikoView, SkiaLayerProperties().copy(renderApi = renderApi)).apply { + setBounds(0, 0, 200, 200) + } + + val window = object : JFrame() { + override fun dispose() { + skiaLayer.dispose() + super.dispose() + } + } + try { + val popup = object : JComponent() { + init { + isOpaque = false + setBounds(50, 50, 50, 50) + } + + override fun paintComponent(g: Graphics?) { + val scratchGraphics = g?.create() as? Graphics2D ?: return + try { + scratchGraphics.setRenderingHint( + RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON + ); + scratchGraphics.color = Color.GREEN + scratchGraphics.fillRoundRect(5, 5, 40, 40, 16, 16) + } finally { + scratchGraphics.dispose() + } + } + } + + val layeredPane = JLayeredPane() + layeredPane.add(popup, Integer.valueOf(1)) + layeredPane.add(skiaLayer, Integer.valueOf(2)) + + window.isUndecorated = true + window.size = Dimension(400, 400) + window.defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE + window.contentPane.add(layeredPane) + window.isVisible = true + + delay(1000) + screenshots.assert(window.bounds) + } finally { + window.close() + } + } + + private fun fillSkikoView(color: Color = Color.RED): SkikoView = object : SkikoView { + override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { + canvas.drawRect(Rect(0f, 0f, width.toFloat(), height.toFloat()), Paint().apply { + this.color = color.rgb + }) + } + } +} \ No newline at end of file diff --git a/skiko/src/jvmTest/screenshots/org_jetbrains_skiko_SkiaSwingLayerTest_overlapped_popup.png b/skiko/src/jvmTest/screenshots/org_jetbrains_skiko_SkiaSwingLayerTest_overlapped_popup.png new file mode 100644 index 0000000000000000000000000000000000000000..64396b95f274f31b34c18a1caea8914e86186fa9 GIT binary patch literal 1957 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prwfgF}%C(jTL zAgJL;>0n@B_xE&h45^s&_U6W{xvUb$ADSQaynFks?u2h#OUf1AidwWZl?cqKlD?}Y z>mta$e!)>|jlE537kt%st8^EhDYW2gvQ_(g^TXUZcKj*-{-yt{+Y|pS%y>29y;onJ zq`c(Zur*J|mZ9Obrvrlr3rmB`(4*{DG|0R^Z&PJc{5m7;eNI|_>CyW1*Xg!Zd+N*% z=-rGyyJnhP;ngtX&ks(X@sB@Wbkb(NWsTM6$L7Y>+`bR)&Yd?$$Ch#1wR7w#rpD#- z&+gf?{mZ1S=jWf_vqN9$dTYahH0%GIuMbXs+j;y<)#+w+@AV8n{+In?vb;5aXR*!g z=_fzW3}-jq9RpumkBY5Na*>~Bl;&wLBi&beDw zfMH!v1H%Lk4u(#uP$%=)pX9t`{GT{`J7dftKlUfj^1bzM=xe;~yTUPD*y#4bmYj%C< zs<*Duk~{Eq`(^PHXMP>OTWj|D)4faH*X-);K0o?*=H4ae9U|f!IorU}u780-54Rf^ z?|U%e^H;Wy3}r{p#Vh3(vzc}-oyd|#j!Sk*Fky85}Sb4q9e0PM-8M*si- literal 0 HcmV?d00001