From 96f0d98d2707f1bcedc663cbe55eaee07431ee88 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Fri, 29 Apr 2022 12:57:15 +0200 Subject: [PATCH] Added animated image component (#2015) * Added animated image component * Simplified network request * Resource load is now done in the IO Dispatchers * Renamed constant to express better its use * Refactored animated image component to use the default Image component instead of creating our own component * Added missing keys * Created new module resources & adapted AnimatedImage to it --- .../AnimatedImage/demo/build.gradle.kts | 29 ++++++ .../compose/animatedimage/demo/Main.kt | 45 +++++++++ .../demo/src/jvmMain/resources/demo.webp | Bin 0 -> 89252 bytes .../AnimatedImage/library/build.gradle.kts | 35 +++++++ .../compose/animatedimage/AnimatedImage.kt | 14 +++ .../animatedimage/AnimatedImageLoader.kt | 24 +++++ .../animatedimage/DesktopAnimatedImage.kt | 86 ++++++++++++++++++ .../animatedimage/LocalAnimatedImageLoader.kt | 23 +++++ .../NetworkAnimatedImageLoader.kt | 21 +++++ .../ResourceAnimatedImageLoader.kt | 11 +++ components/resources/library/build.gradle.kts | 33 +++++++ .../jetbrains/compose/resources/LoadState.kt | 33 +++++++ components/settings.gradle.kts | 5 +- .../org/jetbrains/compose/ComposePlugin.kt | 3 + 14 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 components/AnimatedImage/demo/build.gradle.kts create mode 100644 components/AnimatedImage/demo/src/jvmMain/kotlin/org/jetbrains/compose/animatedimage/demo/Main.kt create mode 100644 components/AnimatedImage/demo/src/jvmMain/resources/demo.webp create mode 100644 components/AnimatedImage/library/build.gradle.kts create mode 100644 components/AnimatedImage/library/src/commonMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImage.kt create mode 100644 components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImageLoader.kt create mode 100644 components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/DesktopAnimatedImage.kt create mode 100644 components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/LocalAnimatedImageLoader.kt create mode 100644 components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/NetworkAnimatedImageLoader.kt create mode 100644 components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/ResourceAnimatedImageLoader.kt create mode 100644 components/resources/library/build.gradle.kts create mode 100644 components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/LoadState.kt diff --git a/components/AnimatedImage/demo/build.gradle.kts b/components/AnimatedImage/demo/build.gradle.kts new file mode 100644 index 0000000000..36fd16e697 --- /dev/null +++ b/components/AnimatedImage/demo/build.gradle.kts @@ -0,0 +1,29 @@ +import org.jetbrains.compose.compose +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") +} + +kotlin { + jvm {} + sourceSets { + named("jvmMain") { + dependencies { + implementation(compose.desktop.currentOs) + implementation(project(":AnimatedImage:library")) + } + } + } +} + +compose.desktop { + application { + mainClass = "org.jetbrains.compose.animatedimage.demo.MainKt" + } +} + +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" +} \ No newline at end of file diff --git a/components/AnimatedImage/demo/src/jvmMain/kotlin/org/jetbrains/compose/animatedimage/demo/Main.kt b/components/AnimatedImage/demo/src/jvmMain/kotlin/org/jetbrains/compose/animatedimage/demo/Main.kt new file mode 100644 index 0000000000..a4b1b93c8b --- /dev/null +++ b/components/AnimatedImage/demo/src/jvmMain/kotlin/org/jetbrains/compose/animatedimage/demo/Main.kt @@ -0,0 +1,45 @@ +package org.jetbrains.compose.animatedimage.demo + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.singleWindowApplication +import org.jetbrains.compose.animatedimage.Blank +import org.jetbrains.compose.animatedimage.animate +import org.jetbrains.compose.animatedimage.loadAnimatedImage +import org.jetbrains.compose.resources.LoadState +import org.jetbrains.compose.resources.load +import org.jetbrains.compose.resources.loadOrNull + +fun main() = singleWindowApplication { + val url = + "https://raw.githubusercontent.com/JetBrains/skija/ccf303ebcf926e5ef000fc42d1a6b5b7f1e0b2b5/examples/scenes/images/codecs/animated.gif" + + // Load an image async + val animatedImage = + load { loadAnimatedImage(url) } // use "load { loadResourceAnimatedImage(url) }" for resources + + Column { + when (animatedImage) { + is LoadState.Success -> Image( + bitmap = animatedImage.value.animate(), + contentDescription = null, + ) + is LoadState.Loading -> CircularProgressIndicator() + is LoadState.Error -> Text("Error!") + } + + Column { + Image( + loadOrNull { loadAnimatedImage(url) }?.animate() ?: ImageBitmap.Blank, + contentDescription = null, + Modifier.size(100.dp) + ) + } + } +} \ No newline at end of file diff --git a/components/AnimatedImage/demo/src/jvmMain/resources/demo.webp b/components/AnimatedImage/demo/src/jvmMain/resources/demo.webp new file mode 100644 index 0000000000000000000000000000000000000000..4685dfbe41ccf5f41e3bfa5d11326771fc043e4a GIT binary patch literal 89252 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 z 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

p9iW^e+U3pJTAEEkLJL6)Q&P9kM6ZG-dxV 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 literal 0 HcmV?d00001 diff --git a/components/AnimatedImage/library/build.gradle.kts b/components/AnimatedImage/library/build.gradle.kts new file mode 100644 index 0000000000..58524776df --- /dev/null +++ b/components/AnimatedImage/library/build.gradle.kts @@ -0,0 +1,35 @@ +import org.jetbrains.compose.compose +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") + id("maven-publish") +} + +kotlin { + jvm("desktop") + + sourceSets { + named("commonMain") { + dependencies { + api(compose.runtime) + api(compose.foundation) + api(project(":resources:library")) + + } + } + named("desktopMain") {} + } +} + +// TODO it seems that argument isn't applied to the common sourceSet. Figure out why +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" +} + +configureMavenPublication( + groupId = "org.jetbrains.compose.components", + artifactId = "components-animatedimage", + name = "AnimatedImage for Compose JB" +) \ No newline at end of file diff --git a/components/AnimatedImage/library/src/commonMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImage.kt b/components/AnimatedImage/library/src/commonMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImage.kt new file mode 100644 index 0000000000..920a0e2490 --- /dev/null +++ b/components/AnimatedImage/library/src/commonMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImage.kt @@ -0,0 +1,14 @@ +package org.jetbrains.compose.animatedimage + +import androidx.compose.ui.graphics.ImageBitmap + +expect class AnimatedImage + +expect suspend fun loadAnimatedImage(path: String): AnimatedImage + +expect suspend fun loadResourceAnimatedImage(path: String): AnimatedImage + +expect fun AnimatedImage.animate(): ImageBitmap + +private val BlankBitmap = ImageBitmap(1, 1) +val ImageBitmap.Companion.Blank get() = BlankBitmap \ No newline at end of file diff --git a/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImageLoader.kt b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImageLoader.kt new file mode 100644 index 0000000000..10143fc5c3 --- /dev/null +++ b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/AnimatedImageLoader.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +package org.jetbrains.compose.animatedimage + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.jetbrains.skia.Codec +import org.jetbrains.skia.Data + +internal abstract class AnimatedImageLoader { + suspend fun loadAnimatedImage(): AnimatedImage = withContext(Dispatchers.IO) { + val byteArray = generateByteArray() + + val data = Data.makeFromBytes(byteArray) + val codec = Codec.makeFromData(data) + + return@withContext AnimatedImage(codec) + } + + abstract suspend fun generateByteArray(): ByteArray +} \ No newline at end of file diff --git a/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/DesktopAnimatedImage.kt b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/DesktopAnimatedImage.kt new file mode 100644 index 0000000000..41fb76e24b --- /dev/null +++ b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/DesktopAnimatedImage.kt @@ -0,0 +1,86 @@ +package org.jetbrains.compose.animatedimage + +import androidx.compose.animation.core.* +import androidx.compose.runtime.* +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asComposeImageBitmap +import org.jetbrains.skia.AnimationFrameInfo +import org.jetbrains.skia.Bitmap +import org.jetbrains.skia.Codec +import java.net.MalformedURLException +import java.net.URL + +private const val DEFAULT_FRAME_DURATION = 50 + +actual class AnimatedImage(val codec: Codec) + +actual suspend fun loadAnimatedImage(path: String): AnimatedImage { + val loader = getAnimatedImageLoaderByPath(path) + return loader.loadAnimatedImage() +} + +actual suspend fun loadResourceAnimatedImage(path: String): AnimatedImage { + val loader = ResourceAnimatedImageLoader(path) + return loader.loadAnimatedImage() +} + +@Composable +actual fun AnimatedImage.animate(): ImageBitmap { + val transition = rememberInfiniteTransition() + val frameIndex by transition.animateValue( + initialValue = 0, + targetValue = codec.frameCount - 1, + Int.VectorConverter, + animationSpec = infiniteRepeatable( + animation = keyframes { + durationMillis = 0 + for ((index, frame) in codec.framesInfo.withIndex()) { + index at durationMillis + val frameDuration = calcFrameDuration(frame) + + durationMillis += frameDuration + } + } + ) + ) + + val bitmap = remember(codec) { Bitmap().apply { allocPixels(codec.imageInfo) } } + + remember(bitmap, frameIndex) { + codec.readPixels(bitmap, frameIndex) + } + + return bitmap.asComposeImageBitmap() +} + +private fun calcFrameDuration(frame: AnimationFrameInfo): Int { + var frameDuration = frame.duration + + // If the frame does not contain information about a duration, set a reasonable constant duration + if (frameDuration == 0) { + frameDuration = DEFAULT_FRAME_DURATION + } + + return frameDuration +} + +/** + * Depending on the [path], provide a specific implementation of [AnimatedImageLoader] + * @return [NetworkAnimatedImageLoader] if it is a network URL, [LocalAnimatedImageLoader] otherwise + */ +private fun getAnimatedImageLoaderByPath(path: String): AnimatedImageLoader { + return if (isNetworkPath(path)) { + NetworkAnimatedImageLoader(path) + } else { + LocalAnimatedImageLoader(path) + } +} + +private fun isNetworkPath(path: String): Boolean { + return try { + URL(path) + true + } catch (e: MalformedURLException) { + false + } +} \ No newline at end of file diff --git a/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/LocalAnimatedImageLoader.kt b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/LocalAnimatedImageLoader.kt new file mode 100644 index 0000000000..03b6a4764c --- /dev/null +++ b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/LocalAnimatedImageLoader.kt @@ -0,0 +1,23 @@ +package org.jetbrains.compose.animatedimage + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.FileInputStream + +internal class LocalAnimatedImageLoader(private val imageUrl: String) : AnimatedImageLoader() { + var cachedBytes: ByteArray? = null + + override suspend fun generateByteArray(): ByteArray = withContext(Dispatchers.IO) { + var bytesArray: ByteArray? = cachedBytes + + if (bytesArray == null) { + bytesArray = FileInputStream(imageUrl).use { fileInputStream -> + fileInputStream.readBytes() + } + + cachedBytes = bytesArray + } + + return@withContext bytesArray + } +} \ No newline at end of file diff --git a/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/NetworkAnimatedImageLoader.kt b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/NetworkAnimatedImageLoader.kt new file mode 100644 index 0000000000..ac98fd6c3c --- /dev/null +++ b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/NetworkAnimatedImageLoader.kt @@ -0,0 +1,21 @@ +package org.jetbrains.compose.animatedimage + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.net.URL + +internal class NetworkAnimatedImageLoader(private val imageUrl: String) : AnimatedImageLoader() { + var cachedBytes: ByteArray? = null + + override suspend fun generateByteArray(): ByteArray = withContext(Dispatchers.IO) { + var bytesArray: ByteArray? = cachedBytes + + if (bytesArray == null) { + bytesArray = URL(imageUrl).readBytes() + + cachedBytes = bytesArray + } + + return@withContext bytesArray + } +} \ No newline at end of file diff --git a/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/ResourceAnimatedImageLoader.kt b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/ResourceAnimatedImageLoader.kt new file mode 100644 index 0000000000..49339aef15 --- /dev/null +++ b/components/AnimatedImage/library/src/desktopMain/kotlin/org/jetbrains/compose/animatedimage/ResourceAnimatedImageLoader.kt @@ -0,0 +1,11 @@ +package org.jetbrains.compose.animatedimage + +import androidx.compose.ui.res.useResource +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +internal class ResourceAnimatedImageLoader(private val resourcePath: String) : AnimatedImageLoader() { + override suspend fun generateByteArray(): ByteArray = withContext(Dispatchers.IO) { + return@withContext useResource(resourcePath) { it.readAllBytes() } + } +} \ No newline at end of file diff --git a/components/resources/library/build.gradle.kts b/components/resources/library/build.gradle.kts new file mode 100644 index 0000000000..0f4368531b --- /dev/null +++ b/components/resources/library/build.gradle.kts @@ -0,0 +1,33 @@ +import org.jetbrains.compose.compose +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") + id("maven-publish") +} + +kotlin { + jvm("desktop") + + sourceSets { + named("commonMain") { + dependencies { + api(compose.runtime) + api(compose.foundation) + } + } + named("desktopMain") {} + } +} + +// TODO it seems that argument isn't applied to the common sourceSet. Figure out why +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" +} + +configureMavenPublication( + groupId = "org.jetbrains.compose.components", + artifactId = "components-resources", + name = "Resources for Compose JB" +) \ No newline at end of file diff --git a/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/LoadState.kt b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/LoadState.kt new file mode 100644 index 0000000000..616f92d13c --- /dev/null +++ b/components/resources/library/src/commonMain/kotlin/org/jetbrains/compose/resources/LoadState.kt @@ -0,0 +1,33 @@ +package org.jetbrains.compose.resources + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue + +sealed class LoadState { + class Loading : LoadState() + data class Success(val value: T) : LoadState() + data class Error(val exception: Exception) : LoadState() +} + +@Composable +fun load(load: suspend () -> T): LoadState { + var state: LoadState by remember(load) { mutableStateOf(LoadState.Loading()) } + LaunchedEffect(load) { + state = try { + LoadState.Success(load()) + } catch (e: Exception) { + LoadState.Error(e) + } + } + return state +} + +@Composable +fun loadOrNull(load: suspend () -> T): T? { + val state = load(load) + return (state as? LoadState.Success)?.value +} \ No newline at end of file diff --git a/components/settings.gradle.kts b/components/settings.gradle.kts index 4034e8aa4a..e071ccafb8 100644 --- a/components/settings.gradle.kts +++ b/components/settings.gradle.kts @@ -14,4 +14,7 @@ pluginManagement { } include(":SplitPane:library") -include(":SplitPane:demo") \ No newline at end of file +include(":SplitPane:demo") +include(":AnimatedImage:library") +include("AnimatedImage:demo") +include("resources:library") diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt index c002c1ef3f..34d9003ffc 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposePlugin.kt @@ -196,6 +196,9 @@ class ComposePlugin : Plugin { object DesktopComponentsDependencies { @ExperimentalComposeLibrary val splitPane = composeDependency("org.jetbrains.compose.components:components-splitpane") + + @ExperimentalComposeLibrary + val animatedImage = composeDependency("org.jetbrains.compose.components:components-animatedimage") } object WebDependencies {