From ee8b700a7c7f96e9d1266d419b9fd1ddca6a91ce Mon Sep 17 00:00:00 2001 From: T8RIN Date: Fri, 26 Dec 2025 18:46:05 +0300 Subject: [PATCH] Added border frame filter by #2380 --- .../core/filters/domain/model/Filter.kt | 1 + .../presentation/model/UiBorderFrameFilter.kt | 43 ++++++++++++++ .../filters/presentation/model/UiFilter.kt | 3 +- .../resources/src/main/res/values/strings.xml | 1 + .../filters/data/model/BorderFrameFilter.kt | 59 +++++++++++++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiBorderFrameFilter.kt create mode 100644 feature/filters/src/main/java/com/t8rin/imagetoolbox/feature/filters/data/model/BorderFrameFilter.kt diff --git a/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/domain/model/Filter.kt b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/domain/model/Filter.kt index 12b0789a1..ed6e55288 100644 --- a/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/domain/model/Filter.kt +++ b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/domain/model/Filter.kt @@ -361,6 +361,7 @@ interface Filter : VisibilityOwner { interface PulseGridPixelation : FloatFilter interface NucleusPixelation : FloatFilter interface RadialWeavePixelation : FloatFilter + interface BorderFrame : FloatColorModelFilter } interface SimpleFilter : Filter diff --git a/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiBorderFrameFilter.kt b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiBorderFrameFilter.kt new file mode 100644 index 000000000..6f357dc9b --- /dev/null +++ b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiBorderFrameFilter.kt @@ -0,0 +1,43 @@ +/* + * 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 . + */ + +package com.t8rin.imagetoolbox.core.filters.presentation.model + +import androidx.compose.ui.graphics.Color +import com.t8rin.imagetoolbox.core.domain.model.ColorModel +import com.t8rin.imagetoolbox.core.filters.domain.model.Filter +import com.t8rin.imagetoolbox.core.filters.domain.model.FilterParam +import com.t8rin.imagetoolbox.core.resources.R +import com.t8rin.imagetoolbox.core.ui.utils.helper.toModel + +class UiBorderFrameFilter( + override val value: Pair = 20f to Color.White.toModel() +) : UiFilter>( + title = R.string.border_frame, + value = value, + paramsInfo = listOf( + FilterParam( + title = R.string.border_thickness, + valueRange = 0f..500f, + roundTo = 0 + ), + FilterParam( + title = R.string.border_color, + valueRange = 0f..0f + ) + ) +), Filter.BorderFrame \ No newline at end of file diff --git a/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiFilter.kt b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiFilter.kt index 9f087e901..38493b11b 100644 --- a/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiFilter.kt +++ b/core/filters/src/main/java/com/t8rin/imagetoolbox/core/filters/presentation/model/UiFilter.kt @@ -274,7 +274,8 @@ sealed class UiFilter( UiThresholdFilter(), UiDoGFilter(), UiErrorLevelAnalysisFilter(), - UiCopyMoveDetectionFilter() + UiCopyMoveDetectionFilter(), + UiBorderFrameFilter() ), //Blur listOf( diff --git a/core/resources/src/main/res/values/strings.xml b/core/resources/src/main/res/values/strings.xml index aa9e27a4e..9cd5be52b 100644 --- a/core/resources/src/main/res/values/strings.xml +++ b/core/resources/src/main/res/values/strings.xml @@ -1894,4 +1894,5 @@ Cannot open uri \"%s\" Snowfall Mode Enabled + Border Frame diff --git a/feature/filters/src/main/java/com/t8rin/imagetoolbox/feature/filters/data/model/BorderFrameFilter.kt b/feature/filters/src/main/java/com/t8rin/imagetoolbox/feature/filters/data/model/BorderFrameFilter.kt new file mode 100644 index 000000000..7a7f54043 --- /dev/null +++ b/feature/filters/src/main/java/com/t8rin/imagetoolbox/feature/filters/data/model/BorderFrameFilter.kt @@ -0,0 +1,59 @@ +/* + * 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 . + */ + +package com.t8rin.imagetoolbox.feature.filters.data.model + +import android.graphics.Bitmap +import androidx.compose.ui.graphics.Color +import androidx.core.graphics.applyCanvas +import androidx.core.graphics.createBitmap +import com.t8rin.imagetoolbox.core.data.image.utils.ColorUtils.toModel +import com.t8rin.imagetoolbox.core.data.image.utils.drawBitmap +import com.t8rin.imagetoolbox.core.domain.model.ColorModel +import com.t8rin.imagetoolbox.core.domain.model.IntegerSize +import com.t8rin.imagetoolbox.core.domain.model.Position +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 kotlin.math.roundToInt + +@FilterInject +internal class BorderFrameFilter( + override val value: Pair = 20f to Color.White.toModel() +) : Transformation, Filter.BorderFrame { + override val cacheKey: String + get() = value.hashCode().toString() + + override suspend fun transform( + input: Bitmap, + size: IntegerSize + ): Bitmap { + val size = value.first.roundToInt() + + return createBitmap( + width = input.width + size * 2, + height = input.height + size * 2 + ).applyCanvas { + drawColor(value.second.colorInt) + + drawBitmap( + bitmap = input, + position = Position.Center + ) + } + } +} \ No newline at end of file