PagerPageHolder: Move chooseBackground call to IO thread (#5737)

* ImageUtil.chooseBackground: Use built-in decoder

* PagerPageHolder: Move chooseBackground call to IO thread

Also move stuffs and reuse image stream as bytes

(cherry picked from commit 11a8046c5fa00a6abbaf387ab5c75a9a294a01b8)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt
This commit is contained in:
Ivan Iskandar 2021-08-19 20:15:45 +07:00 committed by Jobobby04
parent acbc4c48fa
commit add234ce0b
2 changed files with 28 additions and 21 deletions

View File

@ -43,6 +43,7 @@ import rx.Subscription
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import timber.log.Timber
import java.io.ByteArrayInputStream
import java.io.InputStream
import java.nio.ByteBuffer
import java.util.concurrent.TimeUnit
@ -349,38 +350,47 @@ class PagerPageHolder(
val streamFn = page.stream ?: return
val streamFn2 = extraPage?.stream
var openStream: InputStream? = null
readImageHeaderSubscription = Observable
.fromCallable {
val stream = streamFn().buffered(16)
// SY -->
val stream2 = if (extraPage != null) streamFn2?.invoke()?.buffered(16) else null
openStream = if (viewer.config.dualPageSplit) {
val itemStream = if (viewer.config.dualPageSplit) {
process(item.first, stream)
} else {
mergePages(stream, stream2)
}
// SY <--
ImageUtil.isAnimatedAndSupported(stream)
try {
val streamBytes = itemStream.readBytes()
val isAnimated = ImageUtil.isAnimatedAndSupported(stream)
val background = if (!isAnimated && viewer.config.automaticBackground) {
ByteArrayInputStream(streamBytes).use { bais ->
ImageUtil.chooseBackground(context, bais)
}
} else {
null
}
Triple(streamBytes, isAnimated, background)
} finally {
stream.close()
itemStream.close()
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext { isAnimated ->
if (!isAnimated) {
initSubsamplingImageView().apply {
if (viewer.config.automaticBackground) {
background = ImageUtil.chooseBackground(context, openStream!!)
.doOnNext { (streamBytes, isAnimated, background) ->
ByteArrayInputStream(streamBytes).use { bais ->
if (!isAnimated) {
this.background = background
initSubsamplingImageView().apply {
setImage(ImageSource.inputStream(bais))
}
setImage(ImageSource.inputStream(openStream!!))
} else {
initImageView().setImage(bais)
}
} else {
initImageView().setImage(openStream!!)
}
}
// Keep the Rx stream alive to close the input stream only when unsubscribed
.flatMap { Observable.never<Unit>() }
.doOnUnsubscribe { openStream?.close() }
.subscribe({}, {})
}

View File

@ -19,7 +19,6 @@ import androidx.core.graphics.green
import androidx.core.graphics.red
import tachiyomi.decoder.Format
import tachiyomi.decoder.ImageDecoder
import tachiyomi.decoder.ImageType
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.InputStream
@ -183,11 +182,9 @@ object ImageUtil {
* Algorithm for determining what background to accompany a comic/manga page
*/
fun chooseBackground(context: Context, imageStream: InputStream): Drawable {
imageStream.mark(imageStream.available() + 1)
val image = BitmapFactory.decodeStream(imageStream)
imageStream.reset()
val decoder = ImageDecoder.newInstance(imageStream)
val image = decoder?.decode()
decoder?.recycle()
val whiteColor = Color.WHITE
if (image == null) return ColorDrawable(whiteColor)