Skip to content

Commit 73a9827

Browse files
committed
Add PlotPanelRaw for rendering raw specs.
1 parent d2d9d8e commit 73a9827

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

lets-plot-compose/src/androidMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanel.kt renamed to lets-plot-compose/src/androidMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanelRaw.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ package org.jetbrains.letsPlot.skia.compose
88
import androidx.compose.runtime.*
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.viewinterop.AndroidView
11-
import org.jetbrains.letsPlot.Figure
1211
import org.jetbrains.letsPlot.android.canvas.CanvasView
1312
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
14-
import org.jetbrains.letsPlot.intern.toSpec
1513
import org.jetbrains.letsPlot.raster.builder.MonolithicCanvas
1614
import org.jetbrains.letsPlot.raster.view.PlotCanvasFigure
1715
import org.jetbrains.letsPlot.skia.compose.util.NaiveLogger
@@ -20,8 +18,8 @@ private val LOG = NaiveLogger("PlotPanel")
2018

2119
@Suppress("FunctionName")
2220
@Composable
23-
actual fun PlotPanel(
24-
figure: Figure,
21+
actual fun PlotPanelRaw(
22+
rawSpec: MutableMap<String, Any>,
2523
preserveAspectRatio: Boolean,
2624
modifier: Modifier,
2725
computationMessagesHandler: (List<String>) -> Unit
@@ -41,7 +39,7 @@ actual fun PlotPanel(
4139
update = { canvasView ->
4240
MonolithicCanvas.updatePlotFigureFromRawSpec(
4341
plotCanvasFigure = plotCanvasFigure,
44-
rawSpec = figure.toSpec(),
42+
rawSpec = rawSpec,
4543
sizingPolicy = SizingPolicy.fitContainerSize(preserveAspectRatio),
4644
computationMessagesHandler = computationMessagesHandler
4745
)

lets-plot-compose/src/commonMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanel.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,26 @@
66
package org.jetbrains.letsPlot.skia.compose
77

88
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.remember
910
import androidx.compose.ui.Modifier
1011
import org.jetbrains.letsPlot.Figure
11-
12+
import org.jetbrains.letsPlot.intern.toSpec
1213

1314
@Suppress("FunctionName")
1415
@Composable
15-
expect fun PlotPanel(
16+
fun PlotPanel(
1617
figure: Figure,
1718
preserveAspectRatio: Boolean = false,
1819
modifier: Modifier,
1920
computationMessagesHandler: (List<String>) -> Unit
20-
)
21+
) {
22+
// Cache the raw spec conversion to avoid recomputing on every recomposition
23+
val rawSpec = remember(figure) { figure.toSpec() }
24+
25+
PlotPanelRaw(
26+
rawSpec = rawSpec,
27+
preserveAspectRatio = preserveAspectRatio,
28+
modifier = modifier,
29+
computationMessagesHandler = computationMessagesHandler
30+
)
31+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright (c) 2025 JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
package org.jetbrains.letsPlot.skia.compose
7+
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Modifier
10+
11+
// Core expect function - works with raw specs
12+
@Suppress("FunctionName")
13+
@Composable
14+
expect fun PlotPanelRaw(
15+
rawSpec: MutableMap<String, Any>,
16+
preserveAspectRatio: Boolean,
17+
modifier: Modifier,
18+
computationMessagesHandler: (List<String>) -> Unit
19+
)

lets-plot-compose/src/commonMain/kotlin/org/jetbrains/letsPlot/skia/compose/WithRawSpec.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

lets-plot-compose/src/desktopMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanel.kt renamed to lets-plot-compose/src/desktopMain/kotlin/org/jetbrains/letsPlot/skia/compose/PlotPanelRaw.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,12 @@ import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.graphics.Color
1616
import androidx.compose.ui.layout.onSizeChanged
1717
import androidx.compose.ui.platform.LocalDensity
18-
import org.jetbrains.letsPlot.Figure
1918
import org.jetbrains.letsPlot.commons.geometry.DoubleVector
2019
import org.jetbrains.letsPlot.core.plot.builder.interact.tools.FigureModelHelper
2120
import org.jetbrains.letsPlot.core.spec.Option.Meta.Kind.GG_TOOLBAR
2221
import org.jetbrains.letsPlot.core.spec.front.SpecOverrideUtil
2322
import org.jetbrains.letsPlot.core.util.MonolithicCommon.processRawSpecs
2423
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
25-
import org.jetbrains.letsPlot.intern.toSpec
2624
import org.jetbrains.letsPlot.skia.builderLW.MonolithicSkiaLW
2725
import org.jetbrains.letsPlot.skia.compose.desktop.PlotContainer
2826
import org.jetbrains.letsPlot.skia.compose.desktop.SvgViewPanel
@@ -32,21 +30,17 @@ private val LOG = NaiveLogger("PlotPanel")
3230

3331
@Suppress("FunctionName")
3432
@Composable
35-
actual fun PlotPanel(
36-
figure: Figure,
33+
actual fun PlotPanelRaw(
34+
rawSpec: MutableMap<String, Any>,
3735
preserveAspectRatio: Boolean,
3836
modifier: Modifier,
3937
computationMessagesHandler: (List<String>) -> Unit
4038
) {
4139
// Update density on each recomposition to handle monitor DPI changes (e.g., drag between HIDPI/regular monitor)
4240
val density = LocalDensity.current.density.toDouble()
4341

44-
// Cache plot processed spec to avoid reprocessing the same figure on every recomposition.
45-
val processedPlotSpec by remember(figure) {
46-
val rawSpec = when (figure) {
47-
is WithRawSpec -> figure.rawSpec
48-
else -> figure.toSpec()
49-
}
42+
// Cache processed plot spec to avoid reprocessing the same raw spec on every recomposition.
43+
val processedPlotSpec by remember(rawSpec) {
5044
mutableStateOf(processRawSpecs(rawSpec, frontendOnly = false))
5145
}
5246
var panelSize by remember { mutableStateOf(DoubleVector.ZERO) }

0 commit comments

Comments
 (0)