mirror of
https://git.mihon.tech/mihonapp/mihon
synced 2024-11-21 12:45:44 +03:00
Switch to hardware bitmap in reader only if device can handle it
Closes #1460
This commit is contained in:
parent
1909126921
commit
e6d96bd348
4 changed files with 39 additions and 32 deletions
|
@ -10,7 +10,6 @@ import coil3.decode.ImageSource
|
||||||
import coil3.fetch.SourceFetchResult
|
import coil3.fetch.SourceFetchResult
|
||||||
import coil3.request.Options
|
import coil3.request.Options
|
||||||
import coil3.request.bitmapConfig
|
import coil3.request.bitmapConfig
|
||||||
import eu.kanade.tachiyomi.util.system.GLUtil
|
|
||||||
import okio.BufferedSource
|
import okio.BufferedSource
|
||||||
import tachiyomi.core.common.util.system.ImageUtil
|
import tachiyomi.core.common.util.system.ImageUtil
|
||||||
import tachiyomi.decoder.ImageDecoder
|
import tachiyomi.decoder.ImageDecoder
|
||||||
|
@ -46,10 +45,7 @@ class TachiyomiImageDecoder(private val resources: ImageSource, private val opti
|
||||||
|
|
||||||
check(bitmap != null) { "Failed to decode image" }
|
check(bitmap != null) { "Failed to decode image" }
|
||||||
|
|
||||||
if (
|
if (options.bitmapConfig == Bitmap.Config.HARDWARE && ImageUtil.canUseHardwareBitmap(bitmap)) {
|
||||||
options.bitmapConfig == Bitmap.Config.HARDWARE &&
|
|
||||||
maxOf(bitmap.width, bitmap.height) <= GLUtil.maxTextureSize
|
|
||||||
) {
|
|
||||||
val hwBitmap = bitmap.copy(Bitmap.Config.HARDWARE, false)
|
val hwBitmap = bitmap.copy(Bitmap.Config.HARDWARE, false)
|
||||||
if (hwBitmap != null) {
|
if (hwBitmap != null) {
|
||||||
bitmap.recycle()
|
bitmap.recycle()
|
||||||
|
|
|
@ -295,32 +295,34 @@ open class ReaderPageImageView @JvmOverloads constructor(
|
||||||
isVisible = true
|
isVisible = true
|
||||||
}
|
}
|
||||||
is BufferedSource -> {
|
is BufferedSource -> {
|
||||||
if (!isWebtoon || !ImageUtil.canUseCoilToDecode(data)) {
|
if (!isWebtoon) {
|
||||||
|
setHardwareConfig(ImageUtil.canUseHardwareBitmap(data))
|
||||||
setImage(ImageSource.inputStream(data.inputStream()))
|
setImage(ImageSource.inputStream(data.inputStream()))
|
||||||
isVisible = true
|
isVisible = true
|
||||||
} else {
|
return@apply
|
||||||
val request = ImageRequest.Builder(context)
|
|
||||||
.data(data)
|
|
||||||
.memoryCachePolicy(CachePolicy.DISABLED)
|
|
||||||
.diskCachePolicy(CachePolicy.DISABLED)
|
|
||||||
.target(
|
|
||||||
onSuccess = { result ->
|
|
||||||
val image = result as BitmapImage
|
|
||||||
setImage(ImageSource.bitmap(image.bitmap))
|
|
||||||
isVisible = true
|
|
||||||
},
|
|
||||||
onError = {
|
|
||||||
this@ReaderPageImageView.onImageLoadError()
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.size(ViewSizeResolver(this@ReaderPageImageView))
|
|
||||||
.precision(Precision.INEXACT)
|
|
||||||
.cropBorders(config.cropBorders)
|
|
||||||
.customDecoder(true)
|
|
||||||
.crossfade(false)
|
|
||||||
.build()
|
|
||||||
context.imageLoader.enqueue(request)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImageRequest.Builder(context)
|
||||||
|
.data(data)
|
||||||
|
.memoryCachePolicy(CachePolicy.DISABLED)
|
||||||
|
.diskCachePolicy(CachePolicy.DISABLED)
|
||||||
|
.target(
|
||||||
|
onSuccess = { result ->
|
||||||
|
val image = result as BitmapImage
|
||||||
|
setImage(ImageSource.bitmap(image.bitmap))
|
||||||
|
isVisible = true
|
||||||
|
},
|
||||||
|
onError = {
|
||||||
|
onImageLoadError()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.size(ViewSizeResolver(this@ReaderPageImageView))
|
||||||
|
.precision(Precision.INEXACT)
|
||||||
|
.cropBorders(config.cropBorders)
|
||||||
|
.customDecoder(true)
|
||||||
|
.crossfade(false)
|
||||||
|
.build()
|
||||||
|
.let(context.imageLoader::enqueue)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
throw IllegalArgumentException("Not implemented for class ${data::class.simpleName}")
|
throw IllegalArgumentException("Not implemented for class ${data::class.simpleName}")
|
||||||
|
|
|
@ -310,9 +310,18 @@ object ImageUtil {
|
||||||
val bottomOffset = topOffset + splitHeight
|
val bottomOffset = topOffset + splitHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
fun canUseCoilToDecode(imageSource: BufferedSource): Boolean {
|
fun canUseHardwareBitmap(bitmap: Bitmap): Boolean {
|
||||||
val options = extractImageOptions(imageSource)
|
return canUseHardwareBitmap(bitmap.width, bitmap.height)
|
||||||
return maxOf(options.outWidth, options.outHeight) <= GLUtil.maxTextureSize
|
}
|
||||||
|
|
||||||
|
fun canUseHardwareBitmap(imageSource: BufferedSource): Boolean {
|
||||||
|
return with(extractImageOptions(imageSource)) {
|
||||||
|
canUseHardwareBitmap(outWidth, outHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun canUseHardwareBitmap(width: Int, height: Int): Boolean {
|
||||||
|
return maxOf(width, height) <= GLUtil.maxTextureSize
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,7 +48,7 @@ coil-gif = { module = "io.coil-kt.coil3:coil-gif" }
|
||||||
coil-compose = { module = "io.coil-kt.coil3:coil-compose" }
|
coil-compose = { module = "io.coil-kt.coil3:coil-compose" }
|
||||||
coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp" }
|
coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp" }
|
||||||
|
|
||||||
subsamplingscaleimageview = "com.github.tachiyomiorg:subsampling-scale-image-view:b8e1b0ed2b"
|
subsamplingscaleimageview = "com.github.tachiyomiorg:subsampling-scale-image-view:66e0db195d"
|
||||||
image-decoder = "com.github.tachiyomiorg:image-decoder:41c059e540"
|
image-decoder = "com.github.tachiyomiorg:image-decoder:41c059e540"
|
||||||
|
|
||||||
natural-comparator = "com.github.gpanther:java-nat-sort:natural-comparator-1.1"
|
natural-comparator = "com.github.gpanther:java-nat-sort:natural-comparator-1.1"
|
||||||
|
|
Loading…
Reference in a new issue