feat: get currentColor from caller instead of parent (#2521)

# Summary

Fixes #2520
When an element uses `currentColor`, it should look for color in its
caller, not in its parent.
Example: 
```svg
<Svg width="100" height="100" viewBox="0 0 100 100" color="red">
  <Defs color="blue">
    <G color="green">
      <Rect id="a" x="0" y="0" width="50" height="50" fill="currentColor"/>
    </G>
  </Defs>
  <G color="pink">
    <Use href="#a"/>												<!-- #1 -->
  </G>
  <Use href="#a" transform="translate(25 25)"/>						<!-- #2 -->
  <G color="green">
    <Use href="#a" transform="translate(50 50)"/>					<!-- #3 -->
  </G>
</Svg>
```

* `#1` should be **pink**
* `#2` should be **red**
* `#3` should be **green**


![image](https://github.com/user-attachments/assets/b7ba2ec6-ea05-4bcb-9f40-0cf024e5c749)

## Test Plan

Example app -> test -> Test2520

## Compatibility

| OS      | Implemented |
| ------- | :---------: |
| iOS     |          |
| MacOS   |          |
| Android |          |
This commit is contained in:
Jakub Grzywacz
2024-10-31 16:00:36 +01:00
committed by GitHub
parent 405ff97eea
commit 2a58016ec1
14 changed files with 82 additions and 43 deletions
+6 -5
View File
@@ -47,8 +47,6 @@ using namespace facebook::react;
// This is necessary to ensure that [self setNeedsDisplay] actually triggers
// a redraw when our parent transitions between hidden and visible.
self.contentMode = UIViewContentModeRedraw;
// We don't want the dimming effect on tint as it's used as currentColor
self.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
#endif // TARGET_OS_OSX
rendered = false;
#ifdef RCT_NEW_ARCH_ENABLED
@@ -90,7 +88,7 @@ using namespace facebook::react;
self.align = RCTNSStringFromStringNilIfEmpty(newProps.align);
self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice);
if (RCTUIColorFromSharedColor(newProps.color)) {
self.tintColor = RCTUIColorFromSharedColor(newProps.color);
self.color = RCTUIColorFromSharedColor(newProps.color);
}
[super updateProps:props oldProps:oldProps];
}
@@ -184,10 +182,13 @@ using namespace facebook::react;
[self setNeedsDisplay];
}
- (void)tintColorDidChange
- (void)setColor:(RNSVGColor *)color
{
if (color == _color) {
return;
}
[self invalidate];
[self clearChildCache];
_color = color;
}
- (void)setMinX:(CGFloat)minX