Signal-Android/image-editor/lib/src/main/java/org/signal/imageeditor/core/renderers/SelectedElementGuideRendere...

102 wiersze
2.8 KiB
Kotlin

package org.signal.imageeditor.core.renderers
import android.graphics.Color
import android.graphics.DashPathEffect
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import org.signal.core.util.DimensionUnit
import org.signal.imageeditor.core.Bounds
import org.signal.imageeditor.core.RendererContext
class SelectedElementGuideRenderer {
companion object {
private const val PADDING: Int = 10
}
private val allPointsOnScreen = FloatArray(8)
private val allPointsInLocalCords = floatArrayOf(
Bounds.LEFT, Bounds.TOP,
Bounds.RIGHT, Bounds.TOP,
Bounds.RIGHT, Bounds.BOTTOM,
Bounds.LEFT, Bounds.BOTTOM
)
private val circleRadius = DimensionUnit.DP.toPixels(5f)
private val guidePaint = Paint().apply {
isAntiAlias = true
strokeWidth = DimensionUnit.DP.toPixels(1.5f)
color = Color.WHITE
style = Paint.Style.STROKE
pathEffect = DashPathEffect(floatArrayOf(15f, 15f), 0f)
}
private val circlePaint = Paint().apply {
isAntiAlias = true
color = Color.WHITE
style = Paint.Style.FILL
}
private val path = Path()
/**
* Draw self to the context.
*
* @param rendererContext The context to draw to.
*/
fun render(rendererContext: RendererContext) {
rendererContext.canvasMatrix.mapPoints(allPointsOnScreen, allPointsInLocalCords)
performRender(rendererContext)
}
fun render(rendererContext: RendererContext, contentBounds: RectF) {
rendererContext.canvasMatrix.mapPoints(
allPointsOnScreen,
floatArrayOf(
contentBounds.left - PADDING,
contentBounds.top - PADDING,
contentBounds.right + PADDING,
contentBounds.top - PADDING,
contentBounds.right + PADDING,
contentBounds.bottom + PADDING,
contentBounds.left - PADDING,
contentBounds.bottom + PADDING
)
)
performRender(rendererContext)
}
private fun performRender(rendererContext: RendererContext) {
rendererContext.save()
rendererContext.canvasMatrix.setToIdentity()
path.reset()
path.moveTo(allPointsOnScreen[0], allPointsOnScreen[1])
path.lineTo(allPointsOnScreen[2], allPointsOnScreen[3])
path.lineTo(allPointsOnScreen[4], allPointsOnScreen[5])
path.lineTo(allPointsOnScreen[6], allPointsOnScreen[7])
path.close()
rendererContext.canvas.drawPath(path, guidePaint)
// TODO: Implement scaling
// rendererContext.canvas.drawCircle(
// (allPointsOnScreen[6] + allPointsOnScreen[0]) / 2f,
// (allPointsOnScreen[7] + allPointsOnScreen[1]) / 2f,
// circleRadius,
// circlePaint
// )
// rendererContext.canvas.drawCircle(
// (allPointsOnScreen[4] + allPointsOnScreen[2]) / 2f,
// (allPointsOnScreen[5] + allPointsOnScreen[3]) / 2f,
// circleRadius,
// circlePaint
// )
rendererContext.restore()
}
}