From 6929139c06bf346020b55a71964a0bae04c43ff1 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Tue, 4 Jun 2024 18:52:25 +0200 Subject: [PATCH] Do not measure clipped graphics --- .../compose/ui/platform/RenderNodeLayer.skiko.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.skiko.kt index 428567b1f8a21..992cfaa9ac926 100644 --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.skiko.kt +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.skiko.kt @@ -19,6 +19,7 @@ package androidx.compose.ui.platform import org.jetbrains.skia.Rect as SkRect import androidx.compose.ui.geometry.MutableRect import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.RoundRect import androidx.compose.ui.geometry.toRect import androidx.compose.ui.graphics.Canvas @@ -42,6 +43,7 @@ import androidx.compose.ui.graphics.asSkiaPath import androidx.compose.ui.graphics.nativeCanvas import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toSkiaRRect +import androidx.compose.ui.graphics.toSkiaRect import androidx.compose.ui.node.OwnedLayer import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.IntOffset @@ -237,11 +239,13 @@ internal class RenderNodeLayer( override fun drawLayer(canvas: Canvas) { if (picture == null) { + val measureDrawBounds = !clip || shadowElevation > 0 + val bounds = size.toSize().toRect() val pictureCanvas = pictureRecorder.beginRecording( - bounds = PICTURE_BOUNDS, - bbh = bbhFactory + bounds = if (measureDrawBounds) PICTURE_BOUNDS else bounds.toSkiaRect(), + bbh = if (measureDrawBounds) bbhFactory else null ) - performDrawLayer(pictureCanvas.asComposeCanvas()) + performDrawLayer(pictureCanvas.asComposeCanvas(), bounds) picture = pictureRecorder.finishRecordingAsPicture() } @@ -260,7 +264,7 @@ internal class RenderNodeLayer( matrix.timesAssign(inverseMatrix) } - private fun performDrawLayer(canvas: Canvas) { + private fun performDrawLayer(canvas: Canvas, bounds: Rect) { if (alpha > 0) { if (shadowElevation > 0) { drawShadow(canvas) @@ -281,7 +285,6 @@ internal class RenderNodeLayer( currentRenderEffect != null || compositingStrategy == CompositingStrategy.Offscreen if (requiresLayer) { - val bounds = size.toSize().toRect() canvas.saveLayer( bounds, Paint().apply {