diff --git a/decoder/src/main/kotlin/app/redwarp/gif/decoder/Parser.kt b/decoder/src/main/kotlin/app/redwarp/gif/decoder/Parser.kt index 40df007..f0ee419 100644 --- a/decoder/src/main/kotlin/app/redwarp/gif/decoder/Parser.kt +++ b/decoder/src/main/kotlin/app/redwarp/gif/decoder/Parser.kt @@ -66,7 +66,7 @@ object Parser { /** * Parse gif content from a [ReplayInputStream], keeping the whole content in memory. */ - fun parse( + private fun parse( inputStream: ReplayInputStream, pixelPacking: PixelPacking = PixelPacking.ARGB ): Result { diff --git a/decoder/src/main/kotlin/app/redwarp/gif/decoder/streams/BufferedReplayInputStream.kt b/decoder/src/main/kotlin/app/redwarp/gif/decoder/streams/BufferedReplayInputStream.kt index 62ed316..8a4a21a 100644 --- a/decoder/src/main/kotlin/app/redwarp/gif/decoder/streams/BufferedReplayInputStream.kt +++ b/decoder/src/main/kotlin/app/redwarp/gif/decoder/streams/BufferedReplayInputStream.kt @@ -33,7 +33,7 @@ internal class BufferedReplayInputStream private constructor( private var reader: Reader? = inputStream?.let { Reader(it) } override fun seek(position: Int) { - setReplayIfNeeded() + close() this.state.position = position } @@ -91,12 +91,21 @@ internal class BufferedReplayInputStream private constructor( } } + @Synchronized override fun close() { - reader?.close() + if (loadedData != null) return + + reader?.let { reader -> + reader.readAll() + loadedData = reader.toByteArray().also { + reader.close() + this.reader = null + } + } } override fun shallowClone(): ReplayInputStream { - setReplayIfNeeded() + close() return BufferedReplayInputStream(requireNotNull(loadedData), state.copy()) } @@ -106,19 +115,6 @@ internal class BufferedReplayInputStream private constructor( } ?: 0 } - @Synchronized - private fun setReplayIfNeeded() { - if (loadedData != null) return - - reader?.let { reader -> - reader.readAll() - loadedData = reader.toByteArray().also { - reader.close() - this.reader = null - } - } - } - private data class State(var position: Int = 0) private class Reader(inputStream: InputStream) : AutoCloseable { diff --git a/decoder/src/test/kotlin/app/redwarp/gif/decoder/GifTest.kt b/decoder/src/test/kotlin/app/redwarp/gif/decoder/GifTest.kt index 42bce0c..27123b8 100644 --- a/decoder/src/test/kotlin/app/redwarp/gif/decoder/GifTest.kt +++ b/decoder/src/test/kotlin/app/redwarp/gif/decoder/GifTest.kt @@ -273,7 +273,7 @@ class GifTest { @Test fun gif_shallowCloned_noIssuesWithConcurrency() = runBlocking { - val gifDescriptor = Parser.parse(File("../assets/domo-no-dispose.gif")).getOrThrow() + val gifDescriptor = Parser.parse(File("../assets/domo-no-dispose.gif").inputStream()).getOrThrow() val originalGif = Gif(gifDescriptor) repeat(1000) { id ->