All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.mikepenz.markdown.model.MarkdownImageState.kt Maven / Gradle / Ivy

package com.mikepenz.markdown.model

import androidx.compose.runtime.*
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.geometry.isUnspecified
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.toSize

internal interface MarkdownImageState {
    val imageSize: Size
    fun setContainerSize(intSize: IntSize)
    fun setImageSize(size: Size)
}

internal class MarkdownImageStateImpl(private val density: Density) : MarkdownImageState {

    private var parentSize by mutableStateOf(Size.Unspecified)

    private var intrinsicImageSize by mutableStateOf(Size.Unspecified)

    override val imageSize by derivedStateOf {
        with(density) {
            if (parentSize.isUnspecified) {
                Size(180f, 180f)
            } else if (intrinsicImageSize.isUnspecified) {
                Size(parentSize.width.toSp().value, 180f)
            } else {
                val width = minOf(intrinsicImageSize.width, parentSize.width)

                val height = if (intrinsicImageSize.width < parentSize.width) {
                    intrinsicImageSize.height
                } else {
                    (intrinsicImageSize.height * parentSize.width) / intrinsicImageSize.width
                }
                Size(width.toSp().value, height.toSp().value)
            }
        }
    }

    override fun setContainerSize(intSize: IntSize) {
        parentSize = intSize.toSize()
    }

    override fun setImageSize(size: Size) {
        intrinsicImageSize = size
    }
}

@Composable
internal fun rememberMarkdownImageState(): MarkdownImageState {
    val density = LocalDensity.current
    return remember(density) {
        MarkdownImageStateImpl(density)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy