@@ -4,21 +4,22 @@ import android.annotation.SuppressLint
44import android.util.Base64
55import androidx.compose.foundation.Image
66import androidx.compose.foundation.layout.BoxWithConstraints
7+ import androidx.compose.foundation.layout.BoxWithConstraintsScope
78import androidx.compose.foundation.layout.size
89import androidx.compose.runtime.Composable
9- import androidx.compose.runtime.derivedStateOf
10+ import androidx.compose.runtime.collectAsState
1011import androidx.compose.runtime.getValue
11- import androidx.compose.runtime.remember
1212import androidx.compose.ui.Alignment
1313import androidx.compose.ui.Modifier
1414import androidx.compose.ui.geometry.isSpecified
1515import androidx.compose.ui.layout.ContentScale
1616import androidx.compose.ui.platform.LocalContext
1717import androidx.compose.ui.platform.LocalDensity
1818import androidx.compose.ui.unit.dp
19- import coil.compose.rememberAsyncImagePainter
20- import coil.request.ImageRequest
21- import coil.size.Size
19+ import coil3.compose.rememberAsyncImagePainter
20+ import coil3.request.ImageRequest
21+ import coil3.request.crossfade
22+ import coil3.size.Size
2223
2324private val DEFAULT_IMAGE_SIZE = 64 .dp
2425
@@ -46,39 +47,10 @@ internal actual fun MarkdownImage(
4647 .build()
4748 )
4849
49- val density = LocalDensity .current
50-
5150 @SuppressLint(" UnusedBoxWithConstraintsScope" )
5251 BoxWithConstraints (modifier, contentAlignment = Alignment .Center ) {
53- val sizeModifier by remember(density, painter) {
54- derivedStateOf {
55- val painterIntrinsicSize = painter.state.painter?.intrinsicSize
56- if (painterIntrinsicSize != null &&
57- painterIntrinsicSize.isSpecified &&
58- painterIntrinsicSize.width != Float .POSITIVE_INFINITY &&
59- painterIntrinsicSize.height != Float .POSITIVE_INFINITY
60- ) {
61- val width = painterIntrinsicSize.width
62- val height = painterIntrinsicSize.height
63- val scale = if (width > constraints.maxWidth) {
64- constraints.maxWidth.toFloat() / width
65- } else {
66- 1f
67- }
68-
69- with (density) {
70- Modifier .size(
71- (width * scale).toDp(),
72- (height * scale).toDp()
73- )
74- }
75- } else {
76- // if size is not defined at all, Coil fails to render the image
77- // here, we give a default size for images until they are loaded.
78- Modifier .size(DEFAULT_IMAGE_SIZE )
79- }
80- }
81- }
52+ val painterState by painter.state.collectAsState()
53+ val sizeModifier = renderInSize(painterState.painter?.intrinsicSize)
8254
8355 Image (
8456 painter = painter,
@@ -88,3 +60,37 @@ internal actual fun MarkdownImage(
8860 )
8961 }
9062}
63+
64+ @Composable
65+ public fun BoxWithConstraintsScope.renderInSize (
66+ painterIntrinsicSize : androidx.compose.ui.geometry.Size ? ,
67+ ): Modifier {
68+ val density = LocalDensity .current
69+
70+ val sizeModifier = if (painterIntrinsicSize != null &&
71+ painterIntrinsicSize.isSpecified &&
72+ painterIntrinsicSize.width != Float .POSITIVE_INFINITY &&
73+ painterIntrinsicSize.height != Float .POSITIVE_INFINITY
74+ ) {
75+ val width = painterIntrinsicSize.width
76+ val height = painterIntrinsicSize.height
77+ val scale = if (width > constraints.maxWidth) {
78+ constraints.maxWidth.toFloat() / width
79+ } else {
80+ 1f
81+ }
82+
83+ with (density) {
84+ Modifier .size(
85+ (width * scale).toDp(),
86+ (height * scale).toDp()
87+ )
88+ }
89+ } else {
90+ // if size is not defined at all, Coil fails to render the image
91+ // here, we give a default size for images until they are loaded.
92+ Modifier .size(DEFAULT_IMAGE_SIZE )
93+ }
94+
95+ return sizeModifier
96+ }
0 commit comments