[Compose] Ensure LottieClipSpec is always respected (#1848)

diff --git a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimatable.kt b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimatable.kt
index db1a8bc..051aa21 100644
--- a/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimatable.kt
+++ b/lottie-compose/src/main/java/com/airbnb/lottie/compose/LottieAnimatable.kt
@@ -261,7 +261,7 @@
             else -> progress + dProgress - maxProgress
         }
         if (progressPastEndOfIteration < 0f) {
-            progress += dProgress
+            progress = progress.coerceIn(minProgress, maxProgress) + dProgress
         } else {
             val durationProgress = maxProgress - minProgress
             val dIterations = (progressPastEndOfIteration / durationProgress).toInt() + 1
diff --git a/lottie-compose/src/test/java/com/airbnb/lottie/compose/LottieAnimatableImplTest.kt b/lottie-compose/src/test/java/com/airbnb/lottie/compose/LottieAnimatableImplTest.kt
index e207733..7ef172e 100644
--- a/lottie-compose/src/test/java/com/airbnb/lottie/compose/LottieAnimatableImplTest.kt
+++ b/lottie-compose/src/test/java/com/airbnb/lottie/compose/LottieAnimatableImplTest.kt
@@ -1,8 +1,10 @@
 package com.airbnb.lottie.compose
 
+import androidx.compose.animation.core.AnimationConstants
 import com.airbnb.lottie.LottieComposition
 import com.airbnb.lottie.LottieCompositionFactory
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.cancelAndJoin
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.runBlockingTest
 import kotlinx.coroutines.withContext
@@ -298,6 +300,23 @@
         assertFrame(599, progress = 1f, isAtEnd = false, isPlaying = false, iterations = 3)
     }
 
+    @Test
+    fun testCompositionCreated() = runTest {
+        val clipSpec = LottieClipSpec.Frame(20, 25)
+        val job1 = launch {
+            anim.animate(null, clipSpec = clipSpec)
+        }
+        assertFrame(0, progress = 0f, clipSpec = clipSpec, isAtEnd = true, isPlaying = false, lastFrameNanos = AnimationConstants.UnspecifiedTime)
+
+        job1.cancelAndJoin()
+        val job2 = launch {
+            anim.animate(composition, clipSpec = clipSpec, initialProgress = anim.progress)
+        }
+
+        assertFrame(0, progress = 0.556f, clipSpec = clipSpec)
+        job2.cancelAndJoin()
+    }
+
     private suspend fun assertFrame(
         frameTimeMs: Long,
         progress: Float,