Skip to content

Commit

Permalink
Use getPixels and setPixels for Bitmap.replacePixelsByColor => …
Browse files Browse the repository at this point in the history
…massive performance increase (fix #166).
  • Loading branch information
therealbluepandabear committed Jul 12, 2022
1 parent b305dd1 commit f5dcdcd
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.therealbluepandabear.pixapencil.activities.canvas.canvascommands

import com.therealbluepandabear.pixapencil.activities.canvas.CanvasActivity
import com.therealbluepandabear.pixapencil.extensions.getPixel
import com.therealbluepandabear.pixapencil.extensions.iterate
import com.therealbluepandabear.pixapencil.extensions.replacePixelsByColor
import com.therealbluepandabear.pixapencil.fragments.canvas.pixelGridViewInstance
import com.therealbluepandabear.pixapencil.models.BitmapAction

Expand All @@ -11,10 +10,8 @@ fun CanvasActivity.CanvasCommandsHelper.replacePixelsByColor(colorToFind: Int, c

baseReference.viewModel.currentBitmapAction = BitmapAction(mutableListOf())

pixelGridViewInstance.pixelGridViewBitmap.iterate {
if (pixelGridViewInstance.pixelGridViewBitmap.getPixel(it) == colorToFind) {
overrideSetPixel(it, colorToReplace, true, ignoreSymmetry = true, ignoreDither = true, ignoreShadingMap = true)
}
pixelGridViewInstance.pixelGridViewBitmap.replacePixelsByColor(colorToFind, colorToReplace) {
overrideSetPixel(it, colorToReplace, true, ignoreSymmetry = true, ignoreDither = true, ignoreShadingMap = true)
}

baseReference.viewModel.bitmapActionData.add(baseReference.viewModel.currentBitmapAction!!)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.util.Log
import com.therealbluepandabear.pixapencil.enums.OverlayType
import com.therealbluepandabear.pixapencil.fragments.canvas.pixelGridViewInstance
import com.therealbluepandabear.pixapencil.models.Coordinates
import com.therealbluepandabear.pixapencil.models.MatrixInfo
import kotlin.math.ceil
import kotlin.system.measureTimeMillis

fun Bitmap.iterate(func: (Coordinates) -> Unit) {
for (i_1 in 0 until width) {
Expand All @@ -17,12 +19,30 @@ fun Bitmap.iterate(func: (Coordinates) -> Unit) {
}
}

fun Bitmap.replacePixelsByColor(colorToFind: Int, colorToReplace: Int) {
iterate {
if (getPixel(it) == colorToFind) {
setPixel(it, colorToReplace)
fun Bitmap.size(): Int {
return width * height
}

/** Thank you to to confucius on StackOverflow for this solution.
*
* - [Link to confucius' profile](https://stackoverflow.com/users/671676/confucius)
* - [Original StackOverFlow post](https://stackoverflow.com/questions/7237915/replace-black-color-in-bitmap-with-red)
* **/

fun Bitmap.replacePixelsByColor(colorToFind: Int, colorToReplace: Int, func: ((Coordinates) -> Unit)? = null) {
val array = IntArray(size())

getPixels(array, 0, width, 0, 0, width, height)

for (i in array.indices) {
if (array[i] == colorToFind) {
array[i] = colorToReplace

func?.invoke(Coordinates.fromIndex(i, width))
}
}

setPixels(array, 0, width, 0, 0, width, height)
}

fun Bitmap.getNumberOfUniqueColors(excludeTransparentPixels: Boolean = true): Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import android.graphics.Bitmap
import android.os.Bundle
import android.view.*
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.core.view.children
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.LinearLayoutManager
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.therealbluepandabear.pixapencil.models

import kotlin.math.floor

data class Coordinates(val x: Int, val y: Int) {
private fun swap(): Coordinates {
return Coordinates(y, x)
Expand Down Expand Up @@ -65,5 +67,13 @@ data class Coordinates(val x: Int, val y: Int) {
fun staticSet(x: Int, y: Int): Coordinates {
return Coordinates(x, y)
}

// thanks to PapaBread for this solution ;)
fun fromIndex(index: Int, bitmapWidth: Int): Coordinates {
return Coordinates(
x = (index.toDouble() % bitmapWidth.toDouble()).toInt(),
y = floor(index.toDouble() / bitmapWidth).toInt()
)
}
}
}

0 comments on commit f5dcdcd

Please sign in to comment.