From 020dfba5c377db738315dba4251bd9e0affc0ac9 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Thu, 23 May 2024 16:09:25 +0700 Subject: [PATCH] fix: Handle InputStream --- .../tachiyomi/data/image/coil/CoilSetup.kt | 1 + .../data/image/coil/InputStreamFetcher.kt | 33 +++++++++++++++++++ .../data/image/coil/TachiyomiImageDecoder.kt | 24 ++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/image/coil/InputStreamFetcher.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/CoilSetup.kt b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/CoilSetup.kt index 774e520e9a..a8e44cd3f9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/CoilSetup.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/CoilSetup.kt @@ -30,6 +30,7 @@ class CoilSetup(context: Context) { add(TachiyomiImageDecoder.Factory()) add(MangaCoverFetcher.Factory(lazy(callFactoryInit), lazy(diskCacheInit))) add(MangaCoverKeyer()) + add(InputStreamFetcher.Factory()) } callFactory(callFactoryInit) diskCache(diskCacheInit) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/InputStreamFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/InputStreamFetcher.kt new file mode 100644 index 0000000000..5c7755b1de --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/InputStreamFetcher.kt @@ -0,0 +1,33 @@ +package eu.kanade.tachiyomi.data.image.coil + +import coil.ImageLoader +import coil.decode.DataSource +import coil.decode.ImageSource +import coil.fetch.FetchResult +import coil.fetch.Fetcher +import coil.fetch.SourceResult +import coil.request.Options +import okio.Buffer +import java.io.InputStream + +class InputStreamFetcher( + private val stream: InputStream, + private val options: Options, +) : Fetcher { + override suspend fun fetch(): FetchResult { + return SourceResult( + source = ImageSource( + source = stream.use { Buffer().readFrom(it) }, + context = options.context, + ), + mimeType = null, + dataSource = DataSource.MEMORY, + ) + } + + class Factory : Fetcher.Factory { + override fun create(data: InputStream, options: Options, imageLoader: ImageLoader): Fetcher { + return InputStreamFetcher(data, options) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/TachiyomiImageDecoder.kt b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/TachiyomiImageDecoder.kt index 832dc045d5..2558350437 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/TachiyomiImageDecoder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/image/coil/TachiyomiImageDecoder.kt @@ -55,6 +55,26 @@ class TachiyomiImageDecoder(private val resources: ImageSource, private val opti } } + if (maxOf(bitmap.width, bitmap.height) > GLUtil.maxTextureSize) { + val widthRatio = bitmap.width / GLUtil.maxTextureSize.toFloat() + val heightRatio = bitmap.height / GLUtil.maxTextureSize.toFloat() + + val targetWidth: Float + val targetHeight: Float + + if (widthRatio >= heightRatio) { + targetWidth = GLUtil.maxTextureSize.toFloat() + targetHeight = (targetWidth / bitmap.width) * bitmap.height + } else { + targetHeight = GLUtil.maxTextureSize.toFloat() + targetWidth = (targetHeight / bitmap.height) * bitmap.width + } + + val scaledBitmap = Bitmap.createScaledBitmap(bitmap, targetWidth.toInt(), targetHeight.toInt(), false) + bitmap.recycle() + bitmap = scaledBitmap + } + return DecodeResult( drawable = bitmap.toDrawable(options.context.resources), isSampled = sampleSize > 1, @@ -64,8 +84,8 @@ class TachiyomiImageDecoder(private val resources: ImageSource, private val opti class Factory : Decoder.Factory { override fun create(result: SourceResult, options: Options, imageLoader: ImageLoader): Decoder? { - if (!isApplicable(result.source.source()) || !options.customDecoder) return null - return TachiyomiImageDecoder(result.source, options) + if (isApplicable(result.source.source()) || options.customDecoder) return TachiyomiImageDecoder(result.source, options) + return null } private fun isApplicable(source: BufferedSource): Boolean {