From c273d56ffb5cb643204b926abcd09b35fdc7588e Mon Sep 17 00:00:00 2001 From: Subhransu Mohanty Date: Tue, 25 May 2021 16:17:18 +0900 Subject: [PATCH] Improve matte rendering performance for simple layer Change-Id: I58902f2c7a30056e605cc2884d834451edc947e8 --- src/lottie/lottieitem.cpp | 14 ++++++++++++-- src/vector/vpainter.cpp | 8 ++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 7a746b8..690e2c7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -597,11 +597,21 @@ void renderer::CompLayer::renderMatteLayer(VPainter *painter, const VRle &mask, srcBitmap.updateLuma(); } + auto clip = layerPainter.clipBoundingRect(); + + // if the layer has only one renderer then use it as the clip rect + // when blending 2 buffer and copy back to final buffer to avoid + // unnecessary pixel processing. + if (layer->renderList().size() == 1) + { + clip = layer->renderList()[0]->rle().boundingRect(); + } + // 2.3 draw src buffer as mask - layerPainter.drawBitmap(VPoint(), srcBitmap); + layerPainter.drawBitmap(clip, srcBitmap, clip); layerPainter.end(); // 3. draw the result buffer into painter - painter->drawBitmap(VPoint(), layerBitmap); + painter->drawBitmap(clip, layerBitmap, clip); cache.release_surface(srcBitmap); cache.release_surface(layerBitmap); diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 4ebbc5c..38a58e0 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -84,12 +84,12 @@ void VPainter::drawBitmapUntransform(const VRect & target, { mSpanData.initTexture(&bitmap, const_alpha, source); if (!mSpanData.mUnclippedBlendFunc) return; - mSpanData.dx = float(-target.x()); - mSpanData.dy = float(-target.y()); - VRect rr = source.translated(target.x(), target.y()); + // update translation matrix for source texture. + mSpanData.dx = float(target.x() - source.x()); + mSpanData.dy = float(target.y() - source.y()); - fillRect(rr, &mSpanData); + fillRect(target, &mSpanData); } VPainter::VPainter(VBitmap *buffer) -- 2.7.4