Merge branch 'devel' into feature/nextgen
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
package org.koitharu.kotatsu.utils.image
|
||||
|
||||
import android.view.View
|
||||
import android.view.View.OnLayoutChangeListener
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import coil.size.Dimension
|
||||
import coil.size.Size
|
||||
import coil.size.SizeResolver
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.math.roundToInt
|
||||
import kotlinx.coroutines.CancellableContinuation
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
|
||||
private const val ASPECT_RATIO_HEIGHT = 18f
|
||||
private const val ASPECT_RATIO_WIDTH = 13f
|
||||
|
||||
class CoverSizeResolver(
|
||||
private val imageView: ImageView,
|
||||
) : SizeResolver {
|
||||
|
||||
override suspend fun size(): Size {
|
||||
getSize()?.let { return it }
|
||||
return suspendCancellableCoroutine { cont ->
|
||||
val layoutListener = LayoutListener(cont)
|
||||
imageView.addOnLayoutChangeListener(layoutListener)
|
||||
cont.invokeOnCancellation {
|
||||
imageView.removeOnLayoutChangeListener(layoutListener)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getSize(): Size? {
|
||||
val lp = imageView.layoutParams
|
||||
var width = getDimension(lp.width, imageView.width, imageView.paddingLeft + imageView.paddingRight)
|
||||
var height = getDimension(lp.height, imageView.height, imageView.paddingTop + imageView.paddingBottom)
|
||||
if (width == null && height == null) {
|
||||
return null
|
||||
}
|
||||
if (height == null && width != null) {
|
||||
height = Dimension((width.px * ASPECT_RATIO_HEIGHT / ASPECT_RATIO_WIDTH).roundToInt())
|
||||
} else if (width == null && height != null) {
|
||||
width = Dimension((height.px * ASPECT_RATIO_WIDTH / ASPECT_RATIO_HEIGHT).roundToInt())
|
||||
}
|
||||
return Size(checkNotNull(width), checkNotNull(height))
|
||||
}
|
||||
|
||||
private fun getDimension(paramSize: Int, viewSize: Int, paddingSize: Int): Dimension.Pixels? {
|
||||
if (paramSize == ViewGroup.LayoutParams.WRAP_CONTENT) {
|
||||
return null
|
||||
}
|
||||
val insetParamSize = paramSize - paddingSize
|
||||
if (insetParamSize > 0) {
|
||||
return Dimension(insetParamSize)
|
||||
}
|
||||
val insetViewSize = viewSize - paddingSize
|
||||
if (insetViewSize > 0) {
|
||||
return Dimension(insetViewSize)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private inner class LayoutListener(
|
||||
private val continuation: CancellableContinuation<Size>,
|
||||
) : OnLayoutChangeListener {
|
||||
|
||||
override fun onLayoutChange(
|
||||
v: View,
|
||||
left: Int,
|
||||
top: Int,
|
||||
right: Int,
|
||||
bottom: Int,
|
||||
oldLeft: Int,
|
||||
oldTop: Int,
|
||||
oldRight: Int,
|
||||
oldBottom: Int,
|
||||
) {
|
||||
val size = getSize() ?: return
|
||||
v.removeOnLayoutChangeListener(this)
|
||||
continuation.resume(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,15 @@
|
||||
package org.koitharu.kotatsu.utils.image
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import androidx.core.graphics.get
|
||||
import androidx.annotation.ColorInt
|
||||
import androidx.core.graphics.*
|
||||
import coil.size.Size
|
||||
import coil.transform.Transformation
|
||||
import kotlin.math.abs
|
||||
|
||||
class TrimTransformation : Transformation {
|
||||
class TrimTransformation(
|
||||
private val tolerance: Int = 20,
|
||||
) : Transformation {
|
||||
|
||||
override val cacheKey: String = javaClass.name
|
||||
|
||||
@@ -20,7 +24,7 @@ class TrimTransformation : Transformation {
|
||||
var isColBlank = true
|
||||
val prevColor = input[x, 0]
|
||||
for (y in 1 until input.height) {
|
||||
if (input[x, y] != prevColor) {
|
||||
if (!isColorTheSame(input[x, y], prevColor)) {
|
||||
isColBlank = false
|
||||
break
|
||||
}
|
||||
@@ -39,7 +43,7 @@ class TrimTransformation : Transformation {
|
||||
var isColBlank = true
|
||||
val prevColor = input[x, 0]
|
||||
for (y in 1 until input.height) {
|
||||
if (input[x, y] != prevColor) {
|
||||
if (!isColorTheSame(input[x, y], prevColor)) {
|
||||
isColBlank = false
|
||||
break
|
||||
}
|
||||
@@ -55,7 +59,7 @@ class TrimTransformation : Transformation {
|
||||
var isRowBlank = true
|
||||
val prevColor = input[0, y]
|
||||
for (x in 1 until input.width) {
|
||||
if (input[x, y] != prevColor) {
|
||||
if (!isColorTheSame(input[x, y], prevColor)) {
|
||||
isRowBlank = false
|
||||
break
|
||||
}
|
||||
@@ -71,7 +75,7 @@ class TrimTransformation : Transformation {
|
||||
var isRowBlank = true
|
||||
val prevColor = input[0, y]
|
||||
for (x in 1 until input.width) {
|
||||
if (input[x, y] != prevColor) {
|
||||
if (!isColorTheSame(input[x, y], prevColor)) {
|
||||
isRowBlank = false
|
||||
break
|
||||
}
|
||||
@@ -93,4 +97,11 @@ class TrimTransformation : Transformation {
|
||||
override fun equals(other: Any?) = other is TrimTransformation
|
||||
|
||||
override fun hashCode() = javaClass.hashCode()
|
||||
|
||||
private fun isColorTheSame(@ColorInt a: Int, @ColorInt b: Int): Boolean {
|
||||
return abs(a.red - b.red) <= tolerance &&
|
||||
abs(a.green - b.green) <= tolerance &&
|
||||
abs(a.blue - b.blue) <= tolerance &&
|
||||
abs(a.alpha - b.alpha) <= tolerance
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user