From 9a32d2255e03697880709fceb0a0cd2067d17d67 Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Tue, 8 Jan 2019 04:06:48 +0200 Subject: [PATCH] [android] Implement cache invalidation early exit shortcut --- .../main/java/com/horcrux/svg/SvgView.java | 20 ++++++++-------- .../main/java/com/horcrux/svg/TextView.java | 5 +++- .../java/com/horcrux/svg/VirtualView.java | 24 ++++++++++++------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/SvgView.java b/android/src/main/java/com/horcrux/svg/SvgView.java index a5af4319..173f43d5 100644 --- a/android/src/main/java/com/horcrux/svg/SvgView.java +++ b/android/src/main/java/com/horcrux/svg/SvgView.java @@ -125,7 +125,7 @@ public class SvgView extends ReactViewGroup implements ReactCompoundView, ReactC private boolean mRendered = false; int mTintColor = 0; - private void releaseCachedPath() { + private void clearChildCache() { if (!mRendered) { return; } @@ -134,7 +134,7 @@ public class SvgView extends ReactViewGroup implements ReactCompoundView, ReactC View node = getChildAt(i); if (node instanceof VirtualView) { VirtualView n = ((VirtualView)node); - n.releaseCachedPath(); + n.clearChildCache(); } } } @@ -152,56 +152,56 @@ public class SvgView extends ReactViewGroup implements ReactCompoundView, ReactC public void setMinX(float minX) { mMinX = minX; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "minY") public void setMinY(float minY) { mMinY = minY; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "vbWidth") public void setVbWidth(float vbWidth) { mVbWidth = vbWidth; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "vbHeight") public void setVbHeight(float vbHeight) { mVbHeight = vbHeight; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "bbWidth") public void setVbWidth(String bbWidth) { mbbWidth = bbWidth; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "bbHeight") public void setVbHeight(String bbHeight) { mbbHeight = bbHeight; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "align") public void setAlign(String align) { mAlign = align; invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "meetOrSlice") public void setMeetOrSlice(int meetOrSlice) { mMeetOrSlice = meetOrSlice; invalidate(); - releaseCachedPath(); + clearChildCache(); } private Bitmap drawOutput() { diff --git a/android/src/main/java/com/horcrux/svg/TextView.java b/android/src/main/java/com/horcrux/svg/TextView.java index 4d0b6c92..7424832e 100644 --- a/android/src/main/java/com/horcrux/svg/TextView.java +++ b/android/src/main/java/com/horcrux/svg/TextView.java @@ -45,8 +45,11 @@ class TextView extends GroupView { @Override public void invalidate() { + if (mPath == null) { + return; + } super.invalidate(); - releaseCachedPath(); + clearChildCache(); } @ReactProp(name = "textLength") diff --git a/android/src/main/java/com/horcrux/svg/VirtualView.java b/android/src/main/java/com/horcrux/svg/VirtualView.java index 43dda73c..0d8f49a3 100644 --- a/android/src/main/java/com/horcrux/svg/VirtualView.java +++ b/android/src/main/java/com/horcrux/svg/VirtualView.java @@ -93,12 +93,15 @@ abstract public class VirtualView extends ReactViewGroup { @Override public void invalidate() { + if (mPath == null) { + return; + } + clearCache(); + clearParentCache(); super.invalidate(); - clearPath(); - clearPathsUpToRoot(); } - private void clearPath() { + private void clearCache() { canvasDiagonal = -1; canvasHeight = -1; canvasWidth = -1; @@ -108,25 +111,28 @@ abstract public class VirtualView extends ReactViewGroup { mPath = null; } - void releaseCachedPath() { - clearPath(); + void clearChildCache() { + clearCache(); for (int i = 0; i < getChildCount(); i++) { View node = getChildAt(i); if (node instanceof VirtualView) { - ((VirtualView)node).releaseCachedPath(); + ((VirtualView)node).clearChildCache(); } } } - private void clearPathsUpToRoot() { + private void clearParentCache() { VirtualView node = this; while (true) { ViewParent parent = node.getParent(); if (!(parent instanceof VirtualView)) { return; } - node.clearPath(); node = (VirtualView)parent; + if (node.mPath == null) { + return; + } + node.clearCache(); } } @@ -267,7 +273,7 @@ abstract public class VirtualView extends ReactViewGroup { } super.invalidate(); - clearPathsUpToRoot(); + clearParentCache(); } @ReactProp(name = "responsible")