From 07e7d1156eccc2576941e84b0f35b944263b5f96 Mon Sep 17 00:00:00 2001 From: errnull Date: Wed, 16 Oct 2019 17:27:25 +0800 Subject: [PATCH] feat: Update matte draw logic. --- app/src/main/assets/Rocket.svga | Bin 0 -> 32405 bytes .../AnimationFromAssetsActivity.java | 4 +- .../svgaplayer/drawer/SVGACanvasDrawer.kt | 150 +++++++++++++----- 3 files changed, 112 insertions(+), 42 deletions(-) create mode 100644 app/src/main/assets/Rocket.svga diff --git a/app/src/main/assets/Rocket.svga b/app/src/main/assets/Rocket.svga new file mode 100644 index 0000000000000000000000000000000000000000..9d2e5350cb624802bc4f5866ddaf734b65475ae6 GIT binary patch literal 32405 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 = hashMapOf() private val pathCache = PathCache() + private var beginIndexList: Array? = null + private var endIndexList: Array? = null + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) override fun drawFrame(canvas: Canvas, frameIndex: Int, scaleType: ImageView.ScaleType) { super.drawFrame(canvas,frameIndex, scaleType) this.pathCache.onSizeChanged(canvas) val sprites = requestFrameSprites(frameIndex) val matteSprites = mutableMapOf() - - var isMatteing = false - + var saveID = 0 + beginIndexList = null + endIndexList = null + + // Filte no matte layer + var hasMatteLayer = false + sprites.get(0).imageKey?.let { + if (it.endsWith(".matte")) { + hasMatteLayer = true + } + } sprites.forEachIndexed { index, svgaDrawerSprite -> + val iimageKey = svgaDrawerSprite.imageKey + val mmatteKey = svgaDrawerSprite.matteKey + // save matte sprite svgaDrawerSprite.imageKey?.let { - - // no matte - sprites.get(0).imageKey?.let { - if (!it.endsWith(".matte")) { - drawSprite(svgaDrawerSprite, canvas, frameIndex) - // continue - return@forEachIndexed - } + /// No matte layer included + if (!hasMatteLayer) { + // Normal sprite + drawSprite(svgaDrawerSprite, canvas, frameIndex) + // Continue + return@forEachIndexed } - + /// Cache matte sprite if (it.endsWith(".matte")) { matteSprites.put(it, svgaDrawerSprite) - // continue + // Continue return@forEachIndexed } } - - sprites.get(index - 1)?.let { lastSprite -> - if (isMatteing && (svgaDrawerSprite.matteKey == null || svgaDrawerSprite.matteKey != lastSprite.matteKey)) { - isMatteing = false - - matteSprites.get(svgaDrawerSprite.matteKey)?.let { - drawSprite(it, this.sharedValues.shareMatteCanvas(canvas.width, canvas.height), frameIndex) - - canvas.drawBitmap(this.sharedValues.sharedMatteBitmap(), 0f, 0f, this.sharedValues.shareMattePaint()) - canvas.restore() - } - } - if (svgaDrawerSprite.matteKey != null && (lastSprite.matteKey == null || lastSprite.matteKey != svgaDrawerSprite.matteKey)) { - isMatteing = true - canvas.save() - } + /// Is matte begin + if (isMatteBegin(index, sprites)) { + saveID = canvas.saveLayer(0f, 0f, canvas.width.toFloat(), canvas.height.toFloat(), null) } + /// Normal matte drawSprite(svgaDrawerSprite, canvas, frameIndex) - // if current sprite is the last one and isMatteing - if (isMatteing && index == sprites.count() - 1) { + /// Is matte end + if (isMatteEnd(index, sprites)) { matteSprites.get(svgaDrawerSprite.matteKey)?.let { drawSprite(it, this.sharedValues.shareMatteCanvas(canvas.width, canvas.height), frameIndex) - canvas.drawBitmap(this.sharedValues.sharedMatteBitmap(), 0f, 0f, this.sharedValues.shareMattePaint()) - canvas.restore() + canvas.restoreToCount(saveID) + // Continue + return@forEachIndexed } } - } playAudio(frameIndex) } + private fun isMatteBegin(spriteIndex: Int, sprites: List): Boolean { + if (beginIndexList == null) { + val boolArray = Array(sprites.count()){false} + sprites.forEachIndexed { index, svgaDrawerSprite -> + svgaDrawerSprite.imageKey?.let { + /// Filter matte sprite + if (it.endsWith(".matte")) { + // Continue + return@forEachIndexed + } + } + svgaDrawerSprite.matteKey?.let { + if (it.length > 0) { + sprites.get(index - 1)?.let { lastSprite -> + if (lastSprite.matteKey == null || lastSprite.matteKey.length == 0) { + boolArray[index] = true + } else { + if (lastSprite.matteKey != svgaDrawerSprite.matteKey) { + boolArray[index] = true + } + } + } + } + } + } + beginIndexList = boolArray + } + return beginIndexList?.get(spriteIndex) ?: false + } + + private fun isMatteEnd(spriteIndex: Int, sprites: List): Boolean { + if (endIndexList == null) { + val boolArray = Array(sprites.count()){false} + sprites.forEachIndexed { index, svgaDrawerSprite -> + svgaDrawerSprite.imageKey?.let { + /// Filter matte sprite + if (it.endsWith(".matte")) { + // Continue + return@forEachIndexed + } + } + svgaDrawerSprite.matteKey?.let { + if (it.length > 0) { + // Last one + if (index == sprites.count() - 1) { + boolArray[index] = true + } else { + sprites.get(index + 1)?.let { nextSprite -> + if (nextSprite.matteKey == null || nextSprite.matteKey.length == 0) { + boolArray[index] = true + } else { + if (nextSprite.matteKey != svgaDrawerSprite.matteKey) { + boolArray[index] = true + } + } + } + } + } + } + } + endIndexList = boolArray + } + return endIndexList?.get(spriteIndex) ?: false + } + private fun playAudio(frameIndex: Int) { this.videoItem.audios.forEach { audio -> if (audio.startFrame == frameIndex) { @@ -371,7 +440,7 @@ internal class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVG private val shareMattePaint = Paint() private var shareMatteCanvas: Canvas? = null - private var sharedMatteBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8) + private var sharedMatteBitmap: Bitmap? = null fun sharedPaint(): Paint { sharedPaint.reset() @@ -404,17 +473,18 @@ internal class SVGACanvasDrawer(videoItem: SVGAVideoEntity, val dynamicItem: SVG } fun sharedMatteBitmap(): Bitmap { - return sharedMatteBitmap + return sharedMatteBitmap as Bitmap } fun shareMatteCanvas(width: Int, height: Int): Canvas { if (shareMatteCanvas == null) { sharedMatteBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8) - shareMatteCanvas = Canvas(sharedMatteBitmap) +// shareMatteCanvas = Canvas(sharedMatteBitmap) } - val matteCanvas = shareMatteCanvas as Canvas - matteCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); - return matteCanvas +// val matteCanvas = shareMatteCanvas as Canvas +// matteCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) +// return matteCanvas + return Canvas(sharedMatteBitmap) } }