Skip to content

Commit

Permalink
#63: Explicit representation of transparency (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
shubertm authored Jul 12, 2023
1 parent eac8a01 commit f9e8248
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInteropFilter
import space.taran.arkretouch.presentation.edit.EditViewModel
import space.taran.arkretouch.presentation.picker.toDp
Expand Down Expand Up @@ -63,10 +63,7 @@ fun EditCanvas(viewModel: EditViewModel) {

Box(
Modifier.background(
if (
editManager.isCropMode.value ||
editManager.isResizeMode.value
) Color.White
if (editManager.isCropMode.value) Color.Transparent
else editManager.backgroundColor.value
),
contentAlignment = Alignment.Center
Expand Down Expand Up @@ -222,16 +219,19 @@ fun EditDrawCanvas(
eventX,
eventY
)

editManager.isRotateMode.value -> onRotate(
event.action,
event.x,
event.y
)

editManager.isEyeDropperMode.value -> handleEyeDropEvent(
event.action,
event.x,
event.y
)

else -> handleDrawEvent(event.action, mappedX, mappedY)
}
editManager.invalidatorTick.value++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class EditManager {

val backgroundImage = mutableStateOf<ImageBitmap?>(null)
val _backgroundImage: State<ImageBitmap?> = backgroundImage
private val _backgroundColor = mutableStateOf(Color.White)
private val _backgroundColor = mutableStateOf(Color.Transparent)
val backgroundColor: State<Color> = _backgroundColor
private val backgroundImage2 = mutableStateOf<ImageBitmap?>(null)
private val originalBackgroundImage = mutableStateOf<ImageBitmap?>(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import space.taran.arkretouch.presentation.edit.crop.CropAspectRatiosMenu
import space.taran.arkretouch.presentation.edit.resize.Hint
import space.taran.arkretouch.presentation.edit.resize.ResizeInput
import space.taran.arkretouch.presentation.edit.resize.delayHidingHint
import space.taran.arkretouch.presentation.picker.toDp
import space.taran.arkretouch.presentation.picker.toPx
import space.taran.arkretouch.presentation.theme.Gray
import space.taran.arkretouch.presentation.utils.askWritePermissions
Expand Down Expand Up @@ -278,7 +279,10 @@ private fun DrawContainer(
modifier = Modifier
.fillMaxSize()
.padding(bottom = 32.dp)
.background(Color.Gray)
.background(
if (viewModel.editManager.isCropMode.value) Color.White
else Color.Gray
)
.pointerInteropFilter { event ->
if (event.action == MotionEvent.ACTION_DOWN)
viewModel.strokeSliderExpanded = false
Expand Down Expand Up @@ -328,6 +332,11 @@ private fun DrawContainer(
},
contentAlignment = Alignment.Center
) {
val modifier = Modifier.size(
viewModel.editManager.availableDrawAreaSize.value.width.toDp(),
viewModel.editManager.availableDrawAreaSize.value.height.toDp()
)
TransparencyChessBoardCanvas(modifier)
EditCanvas(viewModel)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package space.taran.arkretouch.presentation.edit

import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Canvas
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.graphicsLayer

private class TransparencyChessBoard {
fun create(boardSize: Size, canvas: Canvas) {
val numberOfBoxesOnHeight = (boardSize.height / SQUARE_SIZE).toInt()
val numberOfBoxesOnWidth = (boardSize.width / SQUARE_SIZE).toInt()
var color = DARK
val paint = Paint().also {
it.color = color
}

0.rangeTo(numberOfBoxesOnWidth).forEach { i ->
0.rangeTo(numberOfBoxesOnHeight).forEach { j ->
val offsetX = SQUARE_SIZE * i
val offsetY = SQUARE_SIZE * j
val offset = Offset(offsetX, offsetY)
val box = Rect(offset, Size(SQUARE_SIZE, SQUARE_SIZE))
if (j == 0) {
if (color == paint.color) {
switchPaintColor(paint)
}
color = paint.color
}
switchPaintColor(paint)
canvas.drawRect(box, paint)
}
}
}

private fun switchPaintColor(paint: Paint) {
if (paint.color == DARK)
paint.color = LIGHT
else paint.color = DARK
}

companion object {
private const val SQUARE_SIZE = 100f
private val LIGHT = Color.White
private val DARK = Color.LightGray
}
}

private fun transparencyChessBoard(canvas: Canvas, size: Size) {
TransparencyChessBoard().create(size, canvas)
}

@Composable
fun TransparencyChessBoardCanvas(modifier: Modifier) {
Canvas(
modifier
.background(Color.Transparent)
.graphicsLayer(alpha = 0.99f)
) {
drawIntoCanvas { canvas ->
transparencyChessBoard(canvas, size)
}
}
}

0 comments on commit f9e8248

Please sign in to comment.