Improve matte rendering performance for simple layer
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Tue, 25 May 2021 07:17:18 +0000 (16:17 +0900)
committerHermet Park <chuneon.park@samsung.com>
Tue, 25 May 2021 10:47:20 +0000 (19:47 +0900)
Change-Id: I58902f2c7a30056e605cc2884d834451edc947e8

src/lottie/lottieitem.cpp
src/vector/vpainter.cpp

index 7a746b8..690e2c7 100644 (file)
@@ -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);
index 4ebbc5c..38a58e0 100644 (file)
@@ -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)