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(
private var isRendering = false
private fun checkShowing() {
val wasShowing = isShowingCached
isShowingCached = super.isShowing()
if (wasShowing != isShowing) {
redrawer?.setVisible(isShowing)
}
if (isShowing) {
redrawer?.syncSize()
repaint()
......
......@@ -136,6 +136,10 @@ internal class MetalRedrawer(
)
}
override fun setVisible(isVisible: Boolean) {
setLayerVisible(device, isVisible)
}
fun makeContext() = DirectContext(
makeMetalContext(device)
)
......@@ -153,6 +157,7 @@ internal class MetalRedrawer(
private external fun disposeDevice(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 setLayerVisible(device: Long, isVisible: Boolean)
private external fun setContentScale(device: Long, contentScale: Float)
private external fun setVSyncEnabled(device: Long, enabled: Boolean)
private external fun isOccluded(window: Long): Boolean
......
......@@ -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)
{
@autoreleasepool {
......
......@@ -534,6 +534,35 @@ class SkiaLayerTest {
} finally {
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 {
fun needRedraw()
fun redrawImmediately()
fun syncSize() = Unit
fun setVisible(isVisible: Boolean) = Unit
val renderInfo: String
}
\ No newline at end of file
......@@ -132,6 +132,12 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay
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)
{
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