if (0 == currIndex) {
dstPaint.xfermode = clearMode
if (this::dstCanvas.isInitialized) {
dstCanvas.drawPaint(dstPaint)
}
srcPaint.xfermode = clearMode
if (this::srcCanvas.isInitialized) {
srcCanvas.drawPaint(srcPaint)
}
if (this::finalCanvas.isInitialized) {
finalCanvas.drawPaint(dstPaint)
}
}
val xTmp = measuredWidth / SVG_STROKE_WIDTH
val yTmp = measuredHeight / SVG_STROKE_HEIGHT
val restore = canvas.save()
canvas.scale(1F, -1F)
canvas.translate(0F, -SVG_STROKE_HEIGHT * 7 / 8)
canvas.scale(xTmp, yTmp, 0F, SVG_STROKE_HEIGHT * 7 / 8)
for (stroke in strokePaths) {
canvas.drawPath(stroke, strokePaint)
}
canvas.restoreToCount(restore)
val w = measuredWidth
val h = measuredHeight
val layer = canvas.saveLayer(0F, 0F, w.toFloat(), h.toFloat(), null)
if (dstBmp == null) {
dstBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444)
dstCanvas = Canvas(dstBmp)
}
dstPaint.xfermode = srcMode
val c1 = dstCanvas.save()
dstCanvas.scale(1F, -1F)
dstCanvas.translate(0F, -SVG_STROKE_HEIGHT * 7 / 8)
dstCanvas.scale(xTmp, yTmp, 0F, SVG_STROKE_HEIGHT * 7 / 8)
for (i in strokePaths.size - 1 downTo 0) {
if (i <= currIndex && currIndex < strokePaths.size) {
dstCanvas.drawPath(strokePaths[i], dstPaint)
}
}
dstCanvas.restoreToCount(c1)
dstPaint.xfermode = null
if (dstBmp?.isRecycled == true) {
return
}
canvas.drawBitmap(dstBmp, 0F, 0F, medianPaint)
medianPaint.xfermode = porterDuffXfermode
if (srcBmp == null) {
srcBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444)
srcCanvas = Canvas(srcBmp)
}
srcPaint.xfermode = srcMode
val c2 = srcCanvas.save()
srcCanvas.scale(1F, -1F)
srcCanvas.translate(0F, -SVG_STROKE_HEIGHT * 7 / 8)
srcCanvas.scale(xTmp, yTmp, 0F, SVG_STROKE_HEIGHT * 7 / 8)
if (medianMeasures.isNotEmpty()) {
if (startAnima) {
drawBackbonePointCircle(currIndex * 2, 20F)
if (progress > 0.99) {
drawBackbonePointCircle(currIndex * 2 + 1, 30F)
}
}
tempPath.reset()
val m = medianMeasures[currIndex]
m.getSegment(0F, m.length * progress, tempPath, true)
srcCanvas.drawPath(tempPath, srcPaint)
}
srcCanvas.restoreToCount(c2)
srcPaint.xfermode = null
if (finalBmp == null) {
finalBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444)
finalCanvas = Canvas(finalBmp)
}
val c3 = finalCanvas.save()
finalCanvas.scale(1F, -1F)
finalCanvas.translate(0F, -SVG_STROKE_HEIGHT * 7 / 8)
finalCanvas.scale(xTmp, yTmp, 0F, SVG_STROKE_HEIGHT * 7 / 8)
for (i in strokePaths.size - 1 downTo 0) {
if (i <= currIndex && currIndex < strokePaths.size) {
finalCanvas.drawPath(strokePaths[i], dstPaint)
}
}
finalCanvas.restoreToCount(c3)
srcCanvas.drawBitmap(finalBmp, 0F, 0F, medianPaint)
canvas.drawBitmap(srcBmp, 0F, 0F, medianPaint)
medianPaint.xfermode = null
canvas.restoreToCount(layer)
```
```