diff --git a/android/src/main/java/com/horcrux/svg/PathView.java b/android/src/main/java/com/horcrux/svg/PathView.java index 06829bd00..4821fa7ba 100644 --- a/android/src/main/java/com/horcrux/svg/PathView.java +++ b/android/src/main/java/com/horcrux/svg/PathView.java @@ -14,9 +14,25 @@ import android.graphics.Path; import com.facebook.react.bridge.ReactContext; +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; +import java.util.Map; + +class ParsedPath { + final Path path; + final List elements; + + ParsedPath(Path path, List elements) { + this.path = path; + this.elements = elements; + } +} + @SuppressLint("ViewConstructor") class PathView extends RenderableView { private Path mPath; + private static final Map sPathCache = new HashMap<>(); public PathView(ReactContext reactContext) { super(reactContext); @@ -36,6 +52,27 @@ public void setD(String d) { invalidate(); } + void setDByParsing(String d) { + mPath = PathParser.parse(d); + elements = PathParser.elements; + for (PathElement elem : elements) { + point.y *= mScale; + } + } + } + + public void setD(String d) { + ParsedPath cached = sPathCache.get(d); + if (cached != null) { + mPath = cached.path; + elements = cached.elements; + } else { + setDByParsing(d); + sPathCache.put(d, new ParsedPath(mPath, elements)); + } + invalidate(); + } + @Override Path getPath(Canvas canvas, Paint paint) { return mPath;