From 51a4e0289a68393c6480efa75f4ecf050ebbb0b3 Mon Sep 17 00:00:00 2001 From: Jakub Grzywacz Date: Mon, 16 Sep 2024 15:21:02 +0200 Subject: [PATCH] fix: render G offscreen only when it's needed (opacity != 1) (#2450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Summary Improve #2417 by applying offscreen canvas only when opacity attribute is set ## Compatibility | OS | Implemented | | ------- | :---------: | | Android | ✅ | --- .../main/java/com/horcrux/svg/GroupView.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/GroupView.java b/android/src/main/java/com/horcrux/svg/GroupView.java index db20fd2e..9075b7c1 100644 --- a/android/src/main/java/com/horcrux/svg/GroupView.java +++ b/android/src/main/java/com/horcrux/svg/GroupView.java @@ -97,19 +97,24 @@ class GroupView extends RenderableView { final SvgView svg = getSvgView(); final GroupView self = this; final RectF groupRect = new RectF(); - if (mLayerBitmap == null) { - mLayerBitmap = - Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); - mLayerCanvas = new Canvas(mLayerBitmap); + + if (mOpacity != 1) { + if (mLayerBitmap == null) { + mLayerBitmap = + Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); + mLayerCanvas = new Canvas(mLayerBitmap); + } else { + mLayerBitmap.recycle(); + mLayerBitmap = + Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); + mLayerCanvas.setBitmap(mLayerBitmap); + } + // Copy current matrix from original canvas + mLayerCanvas.save(); + mLayerCanvas.setMatrix(canvas.getMatrix()); } else { - mLayerBitmap.recycle(); - mLayerBitmap = - Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); - mLayerCanvas.setBitmap(mLayerBitmap); + mLayerCanvas = canvas; } - // Copy current matrix from original canvas - int saveCount = mLayerCanvas.save(); - mLayerCanvas.setMatrix(canvas.getMatrix()); elements = new ArrayList<>(); for (int i = 0; i < getChildCount(); i++) { @@ -157,13 +162,15 @@ class GroupView extends RenderableView { } } - // Restore copied canvas and temporary reset original canvas matrix to draw bitmap 1:1 - mLayerCanvas.restoreToCount(saveCount); - saveCount = canvas.save(); - canvas.setMatrix(null); - mLayerPaint.setAlpha((int) (mOpacity * 255)); - canvas.drawBitmap(mLayerBitmap, 0, 0, mLayerPaint); - canvas.restoreToCount(saveCount); + if (mOpacity != 1) { + // Restore copied canvas and temporary reset original canvas matrix to draw bitmap 1:1 + mLayerCanvas.restore(); + int saveCount = canvas.save(); + canvas.setMatrix(null); + mLayerPaint.setAlpha((int) (mOpacity * 255)); + canvas.drawBitmap(mLayerBitmap, 0, 0, mLayerPaint); + canvas.restoreToCount(saveCount); + } this.setClientRect(groupRect); popGlyphContext(); }