fun createPlotGeomTiles()

in plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/front/PlotConfigFrontendUtil.kt [106:188]


    fun createPlotGeomTiles(
        config: PlotConfigFrontend,
        sharedContinuousDomainX: DoubleSpan? = null,
        sharedContinuousDomainY: DoubleSpan? = null,
    ): PlotGeomTiles {
        // Scale "before facets".
        val (mappersByAesNP, scaleByAesBeforeFacets) =
            createMappersAndScalesBeforeFacets(config).let { (mappers, scales) ->
                // Adjust domains of continuous scales when axis are shared between plots in a composite figure.
                val scalesAdjusted: Map<Aes<*>, Scale> = scales.mapValues { (aes, scale) ->
                    if (aes == Aes.X && sharedContinuousDomainX != null) {
                        scale.with().continuousTransform(
                            Transforms.continuousWithLimits(
                                scale.transform as ContinuousTransform,
                                sharedContinuousDomainX.toPair()
                            )
                        ).build()
                    } else if (aes == Aes.Y && sharedContinuousDomainY != null) {
                        scale.with().continuousTransform(
                            Transforms.continuousWithLimits(
                                scale.transform as ContinuousTransform,
                                sharedContinuousDomainY.toPair()
                            )
                        ).build()
                    } else {
                        scale
                    }
                }

                // Take only non-positional mappers
                Pair(
                    mappers.filterKeys { !Aes.isPositional(it) },
                    scalesAdjusted
                )
            }

        // Coord provider
        val statPreferredCoordProvider: CoordProvider? = config.layerConfigs.firstNotNullOfOrNull {
            StatProto.preferredCoordinateSystem(it.statKind)
        }
        val geomPreferredCoordProvider: CoordProvider? = config.layerConfigs.firstNotNullOfOrNull {
            it.geomProto.preferredCoordinateSystem(it)
        }

        val defaultCoordProvider =
            statPreferredCoordProvider ?: geomPreferredCoordProvider ?: CoordProviders.cartesian()

        val coordProvider = CoordConfig.createCoordProvider(
            config[Option.Plot.COORD],
            scaleByAesBeforeFacets.getValue(Aes.X).transform,
            scaleByAesBeforeFacets.getValue(Aes.Y).transform,
            defaultCoordProvider
        ).let { coordProvider ->
            @Suppress("UNCHECKED_CAST")
            config[SPEC_OVERRIDE]?.let { specOverride ->
                val accessor = over(specOverride as Map<String, Any>)
                val xlimOverride = accessor.getNumQPairDef(SpecOverride.COORD_XLIM_TRANSFORMED, Pair(null, null))
                    .let { Pair(it.first?.toDouble(), it.second?.toDouble()) }
                val ylimOverride = accessor.getNumQPairDef(SpecOverride.COORD_YLIM_TRANSFORMED, Pair(null, null))
                    .let { Pair(it.first?.toDouble(), it.second?.toDouble()) }

                coordProvider
                    .withXlimOverride(xlimOverride)
                    .withYlimOverride(ylimOverride)
            } ?: coordProvider
        }.let {
            if (it.isPolar) {
                (it as PolarCoordProvider).withHScaleContinuous(scaleByAesBeforeFacets.getValue(Aes.X).isContinuousDomain)
            } else {
                it
            }
        }

        return PlotTilesConfig.createGeomTiles(
            config.layerConfigs,
            config.facets,
            coordProvider,
            scaleByAesBeforeFacets,
            mappersByAesNP,
            config.theme,
            config.theme.fontFamilyRegistry,
        )
    }