From 42c626dbfb0f57eb2adee44e9996e82896dde4f4 Mon Sep 17 00:00:00 2001 From: Horcrux Date: Sun, 22 Jan 2017 23:10:23 +0800 Subject: [PATCH] Fix G renderable props --- .../com/horcrux/svg/ClipPathShadowNode.java | 6 +--- .../com/horcrux/svg/DefinitionShadowNode.java | 9 ----- .../java/com/horcrux/svg/GroupShadowNode.java | 16 +++++++-- .../com/horcrux/svg/RenderableShadowNode.java | 36 ++++++++----------- .../java/com/horcrux/svg/UseShadowNode.java | 9 +++-- .../java/com/horcrux/svg/VirtualNode.java | 10 ------ ios/Elements/RNSVGGroup.m | 20 +++++++++-- ios/Elements/RNSVGUse.m | 9 ++++- ios/RNSVGNode.h | 2 -- ios/RNSVGNode.m | 5 --- ios/RNSVGRenderable.h | 5 +++ ios/RNSVGRenderable.m | 8 ++--- 12 files changed, 69 insertions(+), 66 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/ClipPathShadowNode.java b/android/src/main/java/com/horcrux/svg/ClipPathShadowNode.java index b713b06b..bc847864 100644 --- a/android/src/main/java/com/horcrux/svg/ClipPathShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/ClipPathShadowNode.java @@ -15,7 +15,6 @@ import android.graphics.Paint; import android.graphics.Point; import com.facebook.common.logging.FLog; -import com.facebook.react.bridge.ReadableArray; import com.facebook.react.common.ReactConstants; /** @@ -44,10 +43,7 @@ public class ClipPathShadowNode extends GroupShadowNode { } @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList, boolean inherited) {} - - @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList) {} + public void mergeProperties(RenderableShadowNode target) {} @Override public void resetProperties() {} diff --git a/android/src/main/java/com/horcrux/svg/DefinitionShadowNode.java b/android/src/main/java/com/horcrux/svg/DefinitionShadowNode.java index 42227170..197aebe7 100644 --- a/android/src/main/java/com/horcrux/svg/DefinitionShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/DefinitionShadowNode.java @@ -38,13 +38,4 @@ public class DefinitionShadowNode extends VirtualNode { public int hitTest(Point point, Matrix matrix) { return -1; } - - @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList, boolean inherited) {} - - @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList) {} - - @Override - public void resetProperties() {} } diff --git a/android/src/main/java/com/horcrux/svg/GroupShadowNode.java b/android/src/main/java/com/horcrux/svg/GroupShadowNode.java index 5d4b50fe..c4ece197 100644 --- a/android/src/main/java/com/horcrux/svg/GroupShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/GroupShadowNode.java @@ -34,13 +34,21 @@ public class GroupShadowNode extends RenderableShadowNode { protected void drawGroup(final Canvas canvas, final Paint paint, final float opacity) { final SvgViewShadowNode svg = getSvgShadowNode(); - final VirtualNode self = this; + final GroupShadowNode self = this; traverseChildren(new NodeRunnable() { public boolean run(VirtualNode node) { - node.mergeProperties(self, mAttributeList, true); + if (node instanceof RenderableShadowNode) { + ((RenderableShadowNode)node).mergeProperties(self); + } + int count = node.saveAndSetupCanvas(canvas); node.draw(canvas, paint, opacity * mOpacity); node.restoreCanvas(canvas, count); + + if (node instanceof RenderableShadowNode) { + ((RenderableShadowNode)node).resetProperties(); + } + node.markUpdateSeen(); if (node.isResponsible()) { @@ -122,7 +130,9 @@ public class GroupShadowNode extends RenderableShadowNode { public void resetProperties() { traverseChildren(new NodeRunnable() { public boolean run(VirtualNode node) { - node.resetProperties(); + if (node instanceof RenderableShadowNode) { + ((RenderableShadowNode)node).resetProperties(); + } return true; } }); diff --git a/android/src/main/java/com/horcrux/svg/RenderableShadowNode.java b/android/src/main/java/com/horcrux/svg/RenderableShadowNode.java index 99242f51..79d19ec7 100644 --- a/android/src/main/java/com/horcrux/svg/RenderableShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/RenderableShadowNode.java @@ -191,9 +191,8 @@ abstract public class RenderableShadowNode extends VirtualNode { for (int i = 0; i < propList.size(); i++) { String fieldName = propertyNameToFieldName(propList.getString(i)); copy.pushString(fieldName); - mAttributeList.pushString(fieldName); } - mPropList = copy; + mPropList = mAttributeList = copy; } markUpdated(); @@ -323,44 +322,39 @@ abstract public class RenderableShadowNode extends VirtualNode { return region.contains(point.x, point.y); } - @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList, boolean inherited) { - mLastMergedList = mergeList; + public WritableArray getAttributeList() { + return mAttributeList; + } - if (mergeList.size() == 0) { + public void mergeProperties(RenderableShadowNode target) { + WritableArray targetAttributeList = target.getAttributeList(); + + if (targetAttributeList.size() == 0) { return; } mOriginProperties = new ArrayList<>(); resetAttributeList(); - for (int i = 0, size = mergeList.size(); i < size; i++) { + for (int i = 0, size = targetAttributeList.size(); i < size; i++) { try { - String fieldName = mergeList.getString(i); + String fieldName = targetAttributeList.getString(i); Field field = getClass().getField(fieldName); Object value = field.get(target); mOriginProperties.add(field.get(this)); - if (inherited) { - if (!hasOwnProperty(fieldName)) { - mAttributeList.pushString(fieldName); - field.set(this, value); - } - } else { + if (!hasOwnProperty(fieldName)) { + mAttributeList.pushString(fieldName); field.set(this, value); } } catch (Exception e) { throw new IllegalStateException(e); } } + + mLastMergedList = targetAttributeList; } - @Override - public void mergeProperties(VirtualNode target, ReadableArray mergeList) { - mergeProperties(target, mergeList, false); - } - - @Override public void resetProperties() { if (mLastMergedList != null) { try { @@ -374,8 +368,8 @@ abstract public class RenderableShadowNode extends VirtualNode { mLastMergedList = null; mOriginProperties = null; + resetAttributeList(); } - resetAttributeList(); } private void resetAttributeList() { diff --git a/android/src/main/java/com/horcrux/svg/UseShadowNode.java b/android/src/main/java/com/horcrux/svg/UseShadowNode.java index cec8e88f..cb29bd71 100644 --- a/android/src/main/java/com/horcrux/svg/UseShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/UseShadowNode.java @@ -57,7 +57,10 @@ public class UseShadowNode extends RenderableShadowNode { VirtualNode template = getSvgShadowNode().getDefinedTemplate(mHref); if (template != null) { - template.mergeProperties(this, mAttributeList, true); + if (template instanceof RenderableShadowNode) { + ((RenderableShadowNode)template).mergeProperties(this); + } + int count = template.saveAndSetupCanvas(canvas); clip(canvas, paint); @@ -69,7 +72,9 @@ public class UseShadowNode extends RenderableShadowNode { } template.restoreCanvas(canvas, count); - template.resetProperties(); + if (template instanceof RenderableShadowNode) { + ((RenderableShadowNode)template).resetProperties(); + } } else { FLog.w(ReactConstants.TAG, "`Use` element expected a pre-defined svg template as `href` prop, " + "template named: " + mHref + " is not defined."); diff --git a/android/src/main/java/com/horcrux/svg/VirtualNode.java b/android/src/main/java/com/horcrux/svg/VirtualNode.java index e478db3f..a2635e8c 100644 --- a/android/src/main/java/com/horcrux/svg/VirtualNode.java +++ b/android/src/main/java/com/horcrux/svg/VirtualNode.java @@ -178,10 +178,6 @@ public abstract class VirtualNode extends LayoutShadowNode { abstract public int hitTest(Point point, @Nullable Matrix matrix); - public int hitTest(Point point) { - return hitTest(point, null); - } - public boolean isResponsible() { return mResponsible; } @@ -236,12 +232,6 @@ public abstract class VirtualNode extends LayoutShadowNode { } } - abstract public void mergeProperties(VirtualNode target, ReadableArray mergeList, boolean inherited); - - abstract public void mergeProperties(VirtualNode target, ReadableArray mergeList); - - abstract public void resetProperties(); - protected interface NodeRunnable { boolean run(VirtualNode node); } diff --git a/ios/Elements/RNSVGGroup.m b/ios/Elements/RNSVGGroup.m index b4406df0..cc3d737e 100644 --- a/ios/Elements/RNSVGGroup.m +++ b/ios/Elements/RNSVGGroup.m @@ -24,9 +24,16 @@ svg.responsible = YES; } - [node mergeProperties:self]; + if ([node isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)node mergeProperties:self]; + } + [node renderTo:context]; + if ([node isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)node resetProperties]; + } + return YES; }]; } @@ -97,11 +104,20 @@ [svg defineTemplate:self templateName:self.name]; } - [self traverseSubviews:^(RNSVGNode *node) { + [self traverseSubviews:^(__kindof RNSVGNode *node) { [node saveDefinition]; return YES; }]; +} +- (void)resetProperties +{ + [self traverseSubviews:^(__kindof RNSVGNode *node) { + if ([node isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)node resetProperties]; + } + return YES; + }]; } @end diff --git a/ios/Elements/RNSVGUse.m b/ios/Elements/RNSVGUse.m index 8a38847c..075b4158 100644 --- a/ios/Elements/RNSVGUse.m +++ b/ios/Elements/RNSVGUse.m @@ -28,8 +28,11 @@ if (template) { [self beginTransparencyLayer:context]; [self clip:context]; - [template mergeProperties:self]; + if ([template isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)template mergeProperties:self]; + } + if ([template class] == [RNSVGSymbol class]) { RNSVGSymbol *symbol = (RNSVGSymbol*)template; [symbol renderSymbolTo:context width:[self relativeOnWidth:self.width] height:[self relativeOnWidth:self.height]]; @@ -37,6 +40,10 @@ [template renderTo:context]; } + if ([template isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)template resetProperties]; + } + [self endTransparencyLayer:context]; } else if (self.href) { // TODO: calling yellow box here diff --git a/ios/RNSVGNode.h b/ios/RNSVGNode.h index d55a1398..2c115ed0 100644 --- a/ios/RNSVGNode.h +++ b/ios/RNSVGNode.h @@ -83,8 +83,6 @@ */ - (void)saveDefinition; -- (void)mergeProperties:(__kindof RNSVGNode *)target; - - (void)beginTransparencyLayer:(CGContextRef)context; - (void)endTransparencyLayer:(CGContextRef)context; diff --git a/ios/RNSVGNode.m b/ios/RNSVGNode.m index 854d5044..fd3f5fbf 100644 --- a/ios/RNSVGNode.m +++ b/ios/RNSVGNode.m @@ -222,11 +222,6 @@ } } -- (void)mergeProperties:(__kindof RNSVGNode *)target -{ - // abstract -} - - (void)traverseSubviews:(BOOL (^)(__kindof RNSVGNode *node))block { for (RNSVGNode *node in self.subviews) { diff --git a/ios/RNSVGRenderable.h b/ios/RNSVGRenderable.h index 1d7a8657..8a17190b 100644 --- a/ios/RNSVGRenderable.h +++ b/ios/RNSVGRenderable.h @@ -30,6 +30,11 @@ @property (nonatomic, copy) NSArray *propList; - (void)setHitArea:(CGPathRef)path; + - (NSArray *)getAttributeList; +- (void)mergeProperties:(__kindof RNSVGRenderable *)target; + +- (void)resetProperties; + @end diff --git a/ios/RNSVGRenderable.m b/ios/RNSVGRenderable.m index 5b24b256..c07bce3a 100644 --- a/ios/RNSVGRenderable.m +++ b/ios/RNSVGRenderable.m @@ -312,12 +312,8 @@ return _attributeList; } -- (void)mergeProperties:(__kindof RNSVGNode *)target +- (void)mergeProperties:(__kindof RNSVGRenderable *)target { - if (_lastMergedList) { - [self resetProperties]; - } - NSArray *targetAttributeList = [target getAttributeList]; if (targetAttributeList.count == 0) { @@ -328,9 +324,9 @@ _originProperties = [[NSMutableDictionary alloc] init]; for (NSString *key in targetAttributeList) { + [_originProperties setValue:[self valueForKey:key] forKey:key]; if (![attributeList containsObject:key]) { [attributeList addObject:key]; - [_originProperties setValue:[self valueForKey:key] forKey:key]; [self setValue:[target valueForKey:key] forKey:key]; } }