Improve code

This commit is contained in:
T8RIN 2025-12-14 02:30:22 +03:00
parent 04010a5413
commit 41d20feea9
11 changed files with 157 additions and 122 deletions

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class CirclePixelationFilter(
@ -38,16 +38,7 @@ internal class CirclePixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 3f)
.setOffset(value / 2)
.build()
)
layers = PixelationCommands.circle(value)
)
}
}

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class DiamondPixelationFilter(
@ -38,20 +38,7 @@ internal class DiamondPixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setSize(value + 1)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.setAlpha(0.6f)
.build()
)
layers = PixelationCommands.diamond(value)
)
}
}

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class EnhancedCirclePixelationFilter(
@ -38,30 +38,7 @@ internal class EnhancedCirclePixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setOffset(value / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 1.2f)
.setOffset(value / 2.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 1.8f)
.setOffset(value / 3)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 2.7f)
.setOffset(value / 4)
.build()
)
layers = PixelationCommands.enhancedCircle(value)
)
}
}

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class EnhancedDiamondPixelationFilter(
@ -39,26 +39,7 @@ internal class EnhancedDiamondPixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value / 4)
.setAlpha(0.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value)
.setAlpha(0.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value / 3)
.setSize(value / 6)
.setOffset(value / 12)
.build()
)
layers = PixelationCommands.enhancedDiamond(value)
)
}
}

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class EnhancedPixelationFilter(
@ -38,20 +38,7 @@ internal class EnhancedPixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value / 4)
.setSize(value / 6)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value / 4)
.setSize(value / 6)
.setOffset(value / 8)
.build()
)
layers = PixelationCommands.enhancedSquare(value)
)
}
}

View File

@ -23,7 +23,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
@FilterInject
internal class PixelationFilter(
@ -38,12 +38,7 @@ internal class PixelationFilter(
): Bitmap {
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value - 4f)
.setSize(value)
.build()
)
layers = PixelationCommands.square(value)
)
}
}

View File

@ -26,7 +26,7 @@ import com.t8rin.imagetoolbox.core.domain.transformation.Transformation
import com.t8rin.imagetoolbox.core.filters.domain.model.Filter
import com.t8rin.imagetoolbox.core.ksp.annotations.FilterInject
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.Pixelate
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationLayer
import com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation.PixelationCommands
import com.t8rin.trickle.Trickle
@FilterInject
@ -40,31 +40,9 @@ internal class StrokePixelationFilter(
input: Bitmap,
size: IntegerSize
): Bitmap {
val pixelSize = value.first
return Pixelate.fromBitmap(
input = input,
layers = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(pixelSize)
.setSize(pixelSize / 5)
.setOffset(pixelSize / 4)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(pixelSize)
.setSize(pixelSize / 4)
.setOffset(pixelSize / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(pixelSize)
.setSize(pixelSize / 3)
.setOffset(pixelSize / 1.3f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(pixelSize)
.setSize(pixelSize / 4)
.setOffset(0f)
.build()
)
layers = PixelationCommands.stroke(value.first)
).let {
Trickle.drawColorBehind(
input = it,

View File

@ -19,7 +19,7 @@ package com.t8rin.imagetoolbox.feature.filters.data.utils.convolution
import kotlin.math.abs
object ExtendedConvolutionKernels {
internal object ExtendedConvolutionKernels {
/**
* Diamond blur

View File

@ -31,8 +31,7 @@ import androidx.core.graphics.withClip
import androidx.core.graphics.withSave
import kotlin.math.sqrt
object Pixelate {
internal object Pixelate {
private val SQRT2 = sqrt(2.0).toFloat()
fun fromBitmap(

View File

@ -0,0 +1,140 @@
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation
internal object PixelationCommands {
fun enhancedDiamond(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value / 4)
.setAlpha(0.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value)
.setAlpha(0.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value / 3)
.setSize(value / 6)
.setOffset(value / 12)
.build()
)
fun circle(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 3f)
.setOffset(value / 2)
.build()
)
fun diamond(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setSize(value + 1)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value)
.setOffset(value / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.setAlpha(0.6f)
.build()
)
fun enhancedCircle(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setOffset(value / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 1.2f)
.setOffset(value / 2.5f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 1.8f)
.setOffset(value / 3)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 2.7f)
.setOffset(value / 4)
.build()
)
fun enhancedSquare(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value / 4)
.setSize(value / 6)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Diamond)
.setResolution(value / 4)
.setSize(value / 6)
.setOffset(value / 8)
.build()
)
fun square(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Square)
.setResolution(value - 4f)
.setSize(value)
.build()
)
fun stroke(value: Float): Array<PixelationLayer> = arrayOf(
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 5)
.setOffset(value / 4)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 4)
.setOffset(value / 2)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 3)
.setOffset(value / 1.3f)
.build(),
PixelationLayer.Builder(PixelationLayer.Shape.Circle)
.setResolution(value)
.setSize(value / 4)
.setOffset(0f)
.build()
)
}

View File

@ -20,7 +20,7 @@
package com.t8rin.imagetoolbox.feature.filters.data.utils.pixelation
class PixelationLayer private constructor(val shape: Shape) {
internal class PixelationLayer private constructor(val shape: Shape) {
var enableDominantColor = false
var resolution = 16f
var size: Float? = null