Files
Jakub Grzywacz 4637dee1e4 feat: FeComposite filter (#2433)
# Summary

<img width="324" alt="image"
src="https://github.com/user-attachments/assets/0a9b4a56-d093-49f7-aacd-c198ee00f256">

## Test Plan

Examples app -> Filters -> FeComposite

## Compatibility

| OS      | Implemented |
| ------- | :---------: |
| iOS     |          |
| macOS   |    *      |
| Android |          |
| Web     |          |

_*_ macOS isn't working as:
* `CGBitmapContextCreateImage` always returns null
* FeFlood isn't aligned properly (will be fixed in the following PR)
2024-10-25 11:18:07 +02:00

93 lines
3.0 KiB
Plaintext

#import "RNSVGConvert.h"
#ifdef RCT_NEW_ARCH_ENABLED
@implementation RNSVGConvert
+ (RNSVGUnits)RNSVGUnitsFromFilterUnitsCppEquivalent:(react::RNSVGFilterFilterUnits)svgUnits
{
switch (svgUnits) {
case react::RNSVGFilterFilterUnits::UserSpaceOnUse:
return kRNSVGUnitsUserSpaceOnUse;
case react::RNSVGFilterFilterUnits::ObjectBoundingBox:
return kRNSVGUnitsObjectBoundingBox;
}
}
+ (RNSVGUnits)RNSVGUnitsFromPrimitiveUnitsCppEquivalent:(react::RNSVGFilterPrimitiveUnits)svgUnits
{
switch (svgUnits) {
case react::RNSVGFilterPrimitiveUnits::UserSpaceOnUse:
return kRNSVGUnitsUserSpaceOnUse;
case react::RNSVGFilterPrimitiveUnits::ObjectBoundingBox:
return kRNSVGUnitsObjectBoundingBox;
}
}
+ (RNSVGBlendMode)RNSVGBlendModeFromCppEquivalent:(react::RNSVGFeBlendMode)mode
{
switch (mode) {
case react::RNSVGFeBlendMode::Unknown:
return SVG_FEBLEND_MODE_UNKNOWN;
case react::RNSVGFeBlendMode::Normal:
return SVG_FEBLEND_MODE_NORMAL;
case react::RNSVGFeBlendMode::Multiply:
return SVG_FEBLEND_MODE_MULTIPLY;
case react::RNSVGFeBlendMode::Screen:
return SVG_FEBLEND_MODE_SCREEN;
case react::RNSVGFeBlendMode::Darken:
return SVG_FEBLEND_MODE_DARKEN;
case react::RNSVGFeBlendMode::Lighten:
return SVG_FEBLEND_MODE_LIGHTEN;
}
}
+ (RNSVGColorMatrixType)RNSVGColorMatrixTypeFromCppEquivalent:(react::RNSVGFeColorMatrixType)type
{
switch (type) {
case react::RNSVGFeColorMatrixType::Matrix:
return SVG_FECOLORMATRIX_TYPE_MATRIX;
case react::RNSVGFeColorMatrixType::Saturate:
return SVG_FECOLORMATRIX_TYPE_SATURATE;
case react::RNSVGFeColorMatrixType::HueRotate:
return SVG_FECOLORMATRIX_TYPE_HUEROTATE;
case react::RNSVGFeColorMatrixType::LuminanceToAlpha:
return SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA;
}
}
+ (RNSVGCompositeOperator)RNSVGRNSVGCompositeOperatorFromCppEquivalent:(react::RNSVGFeCompositeOperator1)operator1
{
switch (operator1) {
case react::RNSVGFeCompositeOperator1::Over:
return SVG_FECOMPOSITE_OPERATOR_OVER;
case react::RNSVGFeCompositeOperator1::In:
return SVG_FECOMPOSITE_OPERATOR_IN;
case react::RNSVGFeCompositeOperator1::Out:
return SVG_FECOMPOSITE_OPERATOR_OUT;
case react::RNSVGFeCompositeOperator1::Atop:
return SVG_FECOMPOSITE_OPERATOR_ATOP;
case react::RNSVGFeCompositeOperator1::Xor:
return SVG_FECOMPOSITE_OPERATOR_XOR;
case react::RNSVGFeCompositeOperator1::Arithmetic:
return SVG_FECOMPOSITE_OPERATOR_ARITHMETIC;
}
}
+ (RNSVGEdgeMode)RNSVGEdgeModeFromCppEquivalent:(react::RNSVGFeGaussianBlurEdgeMode)edgeMode
{
switch (edgeMode) {
case react::RNSVGFeGaussianBlurEdgeMode::Duplicate:
return SVG_EDGEMODE_DUPLICATE;
case react::RNSVGFeGaussianBlurEdgeMode::Wrap:
return SVG_EDGEMODE_WRAP;
case react::RNSVGFeGaussianBlurEdgeMode::None:
return SVG_EDGEMODE_NONE;
default:
return SVG_EDGEMODE_UNKNOWN;
}
}
@end
#endif // RCT_NEW_ARCH_ENABLED