From eabec82b9765326a761819a41c7c2e60692a977a Mon Sep 17 00:00:00 2001 From: Horcrux Date: Wed, 24 Aug 2016 17:36:27 +0800 Subject: [PATCH] fix #111 reset ownedPropList everytime mergeProperties method is called. --- .../com/horcrux/svg/RNSVGGroupShadowNode.java | 2 +- .../com/horcrux/svg/RNSVGImageShadowNode.java | 1 - .../com/horcrux/svg/RNSVGPathShadowNode.java | 16 ++++++++-------- .../main/java/com/horcrux/svg/RNSVGSvgView.java | 2 -- .../java/com/horcrux/svg/RNSVGUseShadowNode.java | 2 +- ios/Elements/RNSVGGroup.m | 4 ++-- ios/Elements/RNSVGUse.m | 2 +- ios/RNSVGRenderable.h | 1 + ios/RNSVGRenderable.m | 16 ++++++++-------- 9 files changed, 22 insertions(+), 24 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/RNSVGGroupShadowNode.java b/android/src/main/java/com/horcrux/svg/RNSVGGroupShadowNode.java index 9f0b67a2..b367e462 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGGroupShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGGroupShadowNode.java @@ -42,7 +42,7 @@ public class RNSVGGroupShadowNode extends RNSVGPathShadowNode { RNSVGVirtualNode child = (RNSVGVirtualNode) getChildAt(i); child.setupDimensions(canvas); - child.mergeProperties(this, mPropList, true); + child.mergeProperties(this, mOwnedPropList, true); child.draw(canvas, paint, opacity * mOpacity); if (child.isResponsible()) { diff --git a/android/src/main/java/com/horcrux/svg/RNSVGImageShadowNode.java b/android/src/main/java/com/horcrux/svg/RNSVGImageShadowNode.java index 6be371e7..f7c1c267 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGImageShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGImageShadowNode.java @@ -20,7 +20,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.net.Uri; -import android.util.Log; import com.facebook.common.executors.UiThreadImmediateExecutorService; import com.facebook.common.logging.FLog; diff --git a/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java b/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java index 5e7d2b6d..a9cd18c3 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGPathShadowNode.java @@ -72,6 +72,7 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { private ArrayList mChangedList; private ArrayList mOriginProperties; protected ReadableArray mPropList = new JavaOnlyArray(); + protected WritableArray mOwnedPropList = new JavaOnlyArray(); @ReactProp(name = "d") public void setPath(@Nullable ReadableArray shapePath) { @@ -196,8 +197,11 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { if (propList != null) { for (int i = 0; i < propList.size(); i++) { - copy.pushString(propertyNameToFieldName(propList.getString(i))); + String fieldName = propertyNameToFieldName(propList.getString(i)); + copy.pushString(fieldName); + mOwnedPropList.pushString(fieldName); } + } mPropList = copy; @@ -404,6 +408,7 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { for (int i = 0; i < mPropList.size(); i++) { propList.pushString(mPropList.getString(i)); } + mOwnedPropList = propList; for (int i = 0, size = mergeList.size(); i < size; i++) { try { @@ -425,11 +430,6 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { throw new IllegalStateException(e); } } - - if (inherited) { - mPropList = propList; - } - } @Override @@ -467,8 +467,8 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode { } private boolean hasOwnProperty(String propName) { - for (int i = mPropList.size() - 1; i >= 0; i--) { - if (mPropList.getString(i).equals(propName)) { + for (int i = mOwnedPropList.size() - 1; i >= 0; i--) { + if (mOwnedPropList.getString(i).equals(propName)) { return true; } } diff --git a/android/src/main/java/com/horcrux/svg/RNSVGSvgView.java b/android/src/main/java/com/horcrux/svg/RNSVGSvgView.java index d79d3f8c..ba3f2ba0 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGSvgView.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGSvgView.java @@ -20,13 +20,11 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import com.facebook.infer.annotation.Assertions; import com.facebook.react.ReactRootView; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.SystemClock; -import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.RCTEventEmitter; import com.facebook.react.uimanager.events.TouchEvent; diff --git a/android/src/main/java/com/horcrux/svg/RNSVGUseShadowNode.java b/android/src/main/java/com/horcrux/svg/RNSVGUseShadowNode.java index 5e15c2e1..21e61eaf 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGUseShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGUseShadowNode.java @@ -59,7 +59,7 @@ public class RNSVGUseShadowNode extends RNSVGPathShadowNode { int count = saveAndSetupCanvas(canvas); clip(canvas, paint); - template.mergeProperties(this, mPropList); + template.mergeProperties(this, mOwnedPropList); template.draw(canvas, paint, opacity * mOpacity); template.resetProperties(); diff --git a/ios/Elements/RNSVGGroup.m b/ios/Elements/RNSVGGroup.m index e9ae04dd..4352eb22 100644 --- a/ios/Elements/RNSVGGroup.m +++ b/ios/Elements/RNSVGGroup.m @@ -22,9 +22,9 @@ } return YES; }]; - + [self traverseSubviews:^(RNSVGNode *node) { - [node mergeProperties:self mergeList:self.propList inherited:YES]; + [node mergeProperties:self mergeList:self.ownedPropList inherited:YES]; [node renderTo:context]; return YES; }]; diff --git a/ios/Elements/RNSVGUse.m b/ios/Elements/RNSVGUse.m index df38956a..e7237b87 100644 --- a/ios/Elements/RNSVGUse.m +++ b/ios/Elements/RNSVGUse.m @@ -27,7 +27,7 @@ if (template) { [self beginTransparencyLayer:context]; [self clip:context]; - [template mergeProperties:self mergeList:self.propList]; + [template mergeProperties:self mergeList:self.ownedPropList]; [template renderTo:context]; [template resetProperties]; [self endTransparencyLayer:context]; diff --git a/ios/RNSVGRenderable.h b/ios/RNSVGRenderable.h index 23da89e8..6866e511 100644 --- a/ios/RNSVGRenderable.h +++ b/ios/RNSVGRenderable.h @@ -28,6 +28,7 @@ @property (nonatomic, assign) CGFloat strokeDashoffset; @property (nonatomic, assign) CGPathRef hitArea; @property (nonatomic, copy) NSArray *propList; +@property (nonatomic, strong) NSMutableArray *ownedPropList; - (void)setBoundingBox:(CGRect)boundingBox; - (CGFloat)getWidthRelatedValue:(NSString *)string; diff --git a/ios/RNSVGRenderable.m b/ios/RNSVGRenderable.m index aeeb0851..8e6ecbd7 100644 --- a/ios/RNSVGRenderable.m +++ b/ios/RNSVGRenderable.m @@ -149,6 +149,7 @@ return; } _propList = propList; + self.ownedPropList = [propList mutableCopy]; [self invalidate]; } @@ -253,12 +254,14 @@ if (mergeList.count == 0) { return; } - + + self.ownedPropList = [self.propList mutableCopy]; + if (!inherited) { _originProperties = [[NSMutableDictionary alloc] init]; _changedList = mergeList; } - + for (NSString *key in mergeList) { if (inherited) { [self inheritProperty:target propName:key]; @@ -281,12 +284,9 @@ - (void)inheritProperty:(__kindof RNSVGNode *)parent propName:(NSString *)propName { - if (![self.propList containsObject:propName]) { - // add prop to propList - NSMutableArray *copy = [self.propList mutableCopy]; - [copy addObject:propName]; - self.propList = [copy copy]; - + if (![self.ownedPropList containsObject:propName]) { + // add prop to props + [self.ownedPropList addObject:propName]; [self setValue:[parent valueForKey:propName] forKey:propName]; } }