Unverified Commit 20cd0281 authored by Alexander Maryanovsky's avatar Alexander Maryanovsky Committed by GitHub

Hide the Metal layer when the SkiaLayer becomes hidden. (#677)

parent befd7f0b
...@@ -163,7 +163,11 @@ actual open class SkiaLayer internal constructor( ...@@ -163,7 +163,11 @@ actual open class SkiaLayer internal constructor(
private var isRendering = false private var isRendering = false
private fun checkShowing() { private fun checkShowing() {
val wasShowing = isShowingCached
isShowingCached = super.isShowing() isShowingCached = super.isShowing()
if (wasShowing != isShowing) {
redrawer?.setVisible(isShowing)
}
if (isShowing) { if (isShowing) {
redrawer?.syncSize() redrawer?.syncSize()
repaint() repaint()
......
...@@ -136,6 +136,10 @@ internal class MetalRedrawer( ...@@ -136,6 +136,10 @@ internal class MetalRedrawer(
) )
} }
override fun setVisible(isVisible: Boolean) {
setLayerVisible(device, isVisible)
}
fun makeContext() = DirectContext( fun makeContext() = DirectContext(
makeMetalContext(device) makeMetalContext(device)
) )
...@@ -153,6 +157,7 @@ internal class MetalRedrawer( ...@@ -153,6 +157,7 @@ internal class MetalRedrawer(
private external fun disposeDevice(device: Long) private external fun disposeDevice(device: Long)
private external fun finishFrame(device: Long) private external fun finishFrame(device: Long)
private external fun resizeLayers(device: Long, x: Int, y: Int, width: Int, height: Int) private external fun resizeLayers(device: Long, x: Int, y: Int, width: Int, height: Int)
private external fun setLayerVisible(device: Long, isVisible: Boolean)
private external fun setContentScale(device: Long, contentScale: Float) private external fun setContentScale(device: Long, contentScale: Float)
private external fun setVSyncEnabled(device: Long, enabled: Boolean) private external fun setVSyncEnabled(device: Long, enabled: Boolean)
private external fun isOccluded(window: Long): Boolean private external fun isOccluded(window: Long): Boolean
......
...@@ -251,6 +251,23 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay ...@@ -251,6 +251,23 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay
} }
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setLayerVisible(
JNIEnv *env, jobject redrawer, jlong devicePtr, jboolean isVisible)
{
@autoreleasepool {
MetalDevice *device = (__bridge MetalDevice *) (void *) devicePtr;
BOOL hidden = !isVisible;
if (!device || !device.layer || device.layer.hidden == hidden) {
return;
}
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
device.layer.hidden = hidden;
[CATransaction commit];
[CATransaction flush];
}
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale(JNIEnv *env, jobject obj, jlong devicePtr, jfloat contentScale) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale(JNIEnv *env, jobject obj, jlong devicePtr, jfloat contentScale)
{ {
@autoreleasepool { @autoreleasepool {
......
...@@ -534,6 +534,35 @@ class SkiaLayerTest { ...@@ -534,6 +534,35 @@ class SkiaLayerTest {
} finally { } finally {
window.dispose() window.dispose()
} }
}
@Test
fun `hiding parent stops drawing layer`() = uiTest {
val window = UiTestWindow()
try {
window.setLocation(200, 200)
window.setSize(400, 200)
window.defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
val app = RectRenderer(window.layer, 200, 100, Color.RED)
window.layer.skikoView = app
window.isUndecorated = true
window.isVisible = true
// Force the layered pane to draw itself with a specific color so that the test doesn't depend on the
// default window background, which could be different on different platforms.
window.layeredPane.background = Color.BLUE
window.layeredPane.isOpaque = true
delay(1000)
screenshots.assert(window.bounds, "visible_parent")
window.contentPane.isVisible = false
delay(1000)
screenshots.assert(window.bounds, "hidden_parent")
} finally {
window.close()
}
} }
......
...@@ -5,5 +5,6 @@ internal interface Redrawer { ...@@ -5,5 +5,6 @@ internal interface Redrawer {
fun needRedraw() fun needRedraw()
fun redrawImmediately() fun redrawImmediately()
fun syncSize() = Unit fun syncSize() = Unit
fun setVisible(isVisible: Boolean) = Unit
val renderInfo: String val renderInfo: String
} }
\ No newline at end of file
...@@ -132,6 +132,12 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay ...@@ -132,6 +132,12 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay
skikoUnimplemented("Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLayers"); skikoUnimplemented("Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLayers");
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setLayerVisible(
JNIEnv *env, jobject redrawer, jlong devicePtr, jboolean isVisible)
{
skikoUnimplemented("Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setLayerVisible");
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale(JNIEnv *env, jobject obj, jlong devicePtr, jfloat contentScale) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale(JNIEnv *env, jobject obj, jlong devicePtr, jfloat contentScale)
{ {
skikoUnimplemented("Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale"); skikoUnimplemented("Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale");
......
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