From b7f469957c08863255765d8ac06af83dfb6bdbf1 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 4 Jul 2022 13:48:40 +0300 Subject: [PATCH] TrimTransformation for images --- .../org/koitharu/kotatsu/core/ui/uiModule.kt | 3 + .../kotatsu/utils/image/TrimTransformation.kt | 96 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt index 54529b37c..61c8425da 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt @@ -29,6 +29,9 @@ val uiModule ImageLoader.Builder(androidContext()) .okHttpClient(httpClientFactory) .interceptorDispatcher(Dispatchers.Default) + .fetcherDispatcher(Dispatchers.IO) + .decoderDispatcher(Dispatchers.Default) + .transformationDispatcher(Dispatchers.Default) .diskCache(diskCacheFactory) .components( ComponentRegistry.Builder() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt b/app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt new file mode 100644 index 000000000..2640060b7 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/image/TrimTransformation.kt @@ -0,0 +1,96 @@ +package org.koitharu.kotatsu.utils.image + +import android.graphics.Bitmap +import androidx.core.graphics.get +import coil.size.Size +import coil.transform.Transformation + +class TrimTransformation : Transformation { + + override val cacheKey: String = javaClass.name + + override suspend fun transform(input: Bitmap, size: Size): Bitmap { + var left = 0 + var top = 0 + var right = 0 + var bottom = 0 + + // Left + for (x in 0 until input.width) { + var isColBlank = true + val prevColor = input[x, 0] + for (y in 1 until input.height) { + if (input[x, y] != prevColor) { + isColBlank = false + break + } + } + if (isColBlank) { + left++ + } else { + break + } + } + if (left == input.width) { + return input + } + // Right + for (x in (left until input.width).reversed()) { + var isColBlank = true + val prevColor = input[x, 0] + for (y in 1 until input.height) { + if (input[x, y] != prevColor) { + isColBlank = false + break + } + } + if (isColBlank) { + right++ + } else { + break + } + } + // Top + for (y in 0 until input.height) { + var isRowBlank = true + val prevColor = input[0, y] + for (x in 1 until input.width) { + if (input[x, y] != prevColor) { + isRowBlank = false + break + } + } + if (isRowBlank) { + top++ + } else { + break + } + } + // Bottom + for (y in (top until input.height).reversed()) { + var isRowBlank = true + val prevColor = input[0, y] + for (x in 1 until input.width) { + if (input[x, y] != prevColor) { + isRowBlank = false + break + } + } + if (isRowBlank) { + bottom++ + } else { + break + } + } + + return if (left != 0 || right != 0 || top != 0 || bottom != 0) { + Bitmap.createBitmap(input, left, top, input.width - left - right, input.height - top - bottom) + } else { + input + } + } + + override fun equals(other: Any?) = other is TrimTransformation + + override fun hashCode() = javaClass.hashCode() +} \ No newline at end of file