diff --git a/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java b/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java index 2ae9890b..b97f5e45 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java @@ -57,25 +57,31 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { private int mStrokeLinecap = CAP_ROUND; private int mStrokeLinejoin = JOIN_ROUND; private int mFillRule = FILL_RULE_NONZERO; - + private boolean mFillRuleSet; + private boolean mPathSet; + private float[] mShapePath; private Point mPaint; @ReactProp(name = "d") public void setPath(@Nullable ReadableArray shapePath) { - float[] pathData = PropHelper.toFloatArray(shapePath); - Path path = new Path(); - switch (mFillRule) { - case FILL_RULE_EVENODD: - path.setFillType(Path.FillType.EVEN_ODD); - break; - case FILL_RULE_NONZERO: - break; - default: - throw new JSApplicationIllegalArgumentException( - "fillRule " + mFillRule + " unrecognized"); - } + mShapePath = PropHelper.toFloatArray(shapePath); + mPathSet = true; + setupPath(); + markUpdated(); + } - mPath = super.createPath(pathData, path); + @ReactProp(name = "fill") + public void setFill(@Nullable ReadableArray fillColors) { + mFillColor = PropHelper.toFloatArray(fillColors); + markUpdated(); + } + + + @ReactProp(name = "fillRule", defaultInt = FILL_RULE_NONZERO) + public void setFillRule(int fillRule) { + mFillRule = fillRule; + mFillRuleSet = true; + setupPath(); markUpdated(); } @@ -103,20 +109,6 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { markUpdated(); } - - @ReactProp(name = "fill") - public void setFill(@Nullable ReadableArray fillColors) { - mFillColor = PropHelper.toFloatArray(fillColors); - markUpdated(); - } - - - @ReactProp(name = "fillRule", defaultInt = FILL_RULE_NONZERO) - public void setFillRule(int fillRule) { - mFillRule = fillRule; - markUpdated(); - } - @ReactProp(name = "strokeWidth", defaultFloat = 1f) public void setStrokeWidth(float strokeWidth) { mStrokeWidth = strokeWidth; @@ -159,6 +151,26 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { markUpdateSeen(); } + private void setupPath() { + // init path after both fillRule and path have been set + if (mFillRuleSet && mPathSet) { + Path path = new Path(); + + switch (mFillRule) { + case FILL_RULE_EVENODD: + path.setFillType(Path.FillType.EVEN_ODD); + break; + case FILL_RULE_NONZERO: + break; + default: + throw new JSApplicationIllegalArgumentException( + "fillRule " + mFillRule + " unrecognized"); + } + + mPath = super.createPath(mShapePath, path); + } + } + /* * sorting stops and stopsColors from array */