@react-native-ohos/react-native-svg 15.12.1-rc.1 → 15.12.1-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -21
  2. package/README.OpenSource +10 -10
  3. package/README.md +13 -13
  4. package/css/package.json +5 -5
  5. package/harmony/svg/BuildProfile.ets +16 -16
  6. package/harmony/svg/build-profile.json5 +9 -9
  7. package/harmony/svg/hvigorfile.ts +1 -1
  8. package/harmony/svg/index.ets +6 -6
  9. package/harmony/svg/oh-package.json5 +13 -13
  10. package/harmony/svg/src/main/cpp/SvgFilter.cpp +505 -505
  11. package/harmony/svg/src/main/cpp/SvgFilter.h +112 -112
  12. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeBlendComponentInstance.cpp +40 -40
  13. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeBlendComponentInstance.h +48 -48
  14. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeColorMatrixComponentInstance.cpp +33 -33
  15. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeColorMatrixComponentInstance.h +48 -48
  16. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeCompositeComponentInstance.cpp +39 -39
  17. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeCompositeComponentInstance.h +55 -55
  18. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeFloodComponentInstance.cpp +33 -33
  19. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeFloodComponentInstance.h +49 -49
  20. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeGaussianBlurComponentInstance.cpp +34 -34
  21. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeGaussianBlurComponentInstance.h +48 -48
  22. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeOffsetComponentInstance.cpp +35 -35
  23. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFeOffsetComponentInstance.h +45 -45
  24. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFilterComponentInstance.cpp +198 -198
  25. package/harmony/svg/src/main/cpp/componentInstances/RNSVGFilterComponentInstance.h +48 -48
  26. package/harmony/svg/src/main/cpp/componentInstances/RNSVGImageComponentInstance.cpp +4 -1
  27. package/harmony/svg/src/main/cpp/downloadUtils/ImageSourceResolver.cpp +36 -15
  28. package/harmony/svg/src/main/cpp/downloadUtils/ImageSourceResolver.h +6 -10
  29. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeBlendJSIBinder.h +26 -26
  30. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeColorMatrixJSIBinder.h +26 -26
  31. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeCompositeJSIBinder.h +30 -30
  32. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeFloodJSIBinder.h +26 -26
  33. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeGaussianBlurJSIBinder.h +26 -26
  34. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFeOffsetJSIBinder.h +26 -26
  35. package/harmony/svg/src/main/cpp/generated/RNOH/generated/components/RNSVGFilterJSIBinder.h +44 -44
  36. package/harmony/svg/src/main/cpp/generated/react/renderer/components/react_native_svg/Props.cpp +977 -977
  37. package/harmony/svg/src/main/cpp/generated/react/renderer/components/react_native_svg/Props.h +1280 -1280
  38. package/harmony/svg/src/main/cpp/utils/DynamicUtils.h +55 -55
  39. package/harmony/svg/src/main/cpp/utils/FilterManager.h +190 -190
  40. package/harmony/svg/src/main/ets/RNSVGImageModule.ts +21 -21
  41. package/harmony/svg/src/main/ets/RNSVGRenderableModule.ts +16 -16
  42. package/harmony/svg/src/main/ets/RNSVGSvgViewModule.ts +18 -18
  43. package/harmony/svg/src/main/ets/SvgPackage.ts +57 -57
  44. package/harmony/svg/src/main/module.json5 +7 -7
  45. package/harmony/svg/src/main/resources/base/element/string.json +8 -8
  46. package/harmony/svg/src/main/resources/en_US/element/string.json +8 -8
  47. package/harmony/svg/src/main/resources/zh_CN/element/string.json +8 -8
  48. package/harmony/svg/ts.ts +7 -7
  49. package/harmony/svg.har +0 -0
  50. package/lib/commonjs/css/index.js +54 -54
  51. package/lib/commonjs/index.js +25 -25
  52. package/lib/module/css/index.js +3 -3
  53. package/lib/module/index.js +2 -2
  54. package/package.json +52 -54
  55. package/src/css/index.tsx +19 -19
  56. package/src/index.tsx +2 -2
  57. package/tsconfig.json +11 -11
  58. package/lib/typescript/babel.config.d.ts +0 -8
  59. package/lib/typescript/babel.config.d.ts.map +0 -1
  60. package/lib/typescript/example/babel.config.d.ts +0 -3
  61. package/lib/typescript/example/babel.config.d.ts.map +0 -1
  62. package/lib/typescript/example/contexts.d.ts +0 -3
  63. package/lib/typescript/example/contexts.d.ts.map +0 -1
  64. package/lib/typescript/example/harmony/entry/hvigorfile.d.ts +0 -2
  65. package/lib/typescript/example/harmony/entry/hvigorfile.d.ts.map +0 -1
  66. package/lib/typescript/example/harmony/hvigorfile.d.ts +0 -2
  67. package/lib/typescript/example/harmony/hvigorfile.d.ts.map +0 -1
  68. package/lib/typescript/example/index.d.ts +0 -2
  69. package/lib/typescript/example/index.d.ts.map +0 -1
  70. package/lib/typescript/example/jest.config.d.ts +0 -3
  71. package/lib/typescript/example/jest.config.d.ts.map +0 -1
  72. package/lib/typescript/example/metro.config.d.ts +0 -3
  73. package/lib/typescript/example/metro.config.d.ts.map +0 -1
  74. package/lib/typescript/example/react-native.config.d.ts +0 -3
  75. package/lib/typescript/example/react-native.config.d.ts.map +0 -1
  76. package/lib/typescript/example/scripts/create-build-profile.d.ts +0 -2
  77. package/lib/typescript/example/scripts/create-build-profile.d.ts.map +0 -1
  78. package/lib/typescript/example/src/index.d.ts +0 -3
  79. package/lib/typescript/example/src/index.d.ts.map +0 -1
  80. package/lib/typescript/src/css/index.d.ts +0 -4
  81. package/lib/typescript/src/css/index.d.ts.map +0 -1
  82. package/lib/typescript/src/index.d.ts +0 -3
  83. package/lib/typescript/src/index.d.ts.map +0 -1
@@ -1,199 +1,199 @@
1
- /*
2
- * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved
3
- * Use of this source code is governed by a MIT license that can be
4
- * found in the LICENSE file.
5
- */
6
-
7
- #include "RNSVGFilterComponentInstance.h"
8
- #include "RNSVGFeColorMatrixComponentInstance.h"
9
- #include "RNSVGFeBlendComponentInstance.h"
10
- #include "RNSVGFeCompositeComponentInstance.h"
11
- #include "RNSVGFeFloodComponentInstance.h"
12
- #include "RNSVGFeOffsetComponentInstance.h"
13
- #include "RNSVGFeGaussianBlurComponentInstance.h"
14
- #include "utils/FilterManager.h"
15
- #include <sstream>
16
- #include <utility>
17
- #include <folly/dynamic.h>
18
- #include <cmath>
19
- #include <iomanip>
20
- #include <string>
21
- namespace rnoh {
22
- namespace svg {
23
-
24
- RNSVGFilterComponentInstance::RNSVGFilterComponentInstance(Context context)
25
- : RNSVGBaseComponentInstance(std::move(context)) {
26
- SetSvgNode(m_svgFilter);
27
- }
28
-
29
- void RNSVGFilterComponentInstance::onPropsChanged(SharedConcreteProps const &props) {}
30
-
31
- void RNSVGFilterComponentInstance::UpdateElementProps() {
32
- m_svgFilter->UpdateCommonProps(m_props);
33
- // Set the name as the ID for the SvgNode using the UpdateHrefRenderProps method
34
- m_svgFilter->UpdateHrefRenderProps(m_props);
35
- parseFilterId();
36
- collectFilterEffectsInOrder();
37
- }
38
-
39
- void RNSVGFilterComponentInstance::parseFilterId() {
40
- if (m_props) {
41
- filterId_ = m_props->name;
42
- }
43
- }
44
-
45
- void RNSVGFilterComponentInstance::collectFilterEffectsInOrder()
46
- {
47
- if (m_svgFilter) {
48
- m_svgFilter->ClearFilterEffects();
49
- }
50
-
51
- auto children = getChildren();
52
- if (collectFeDropShadowInfo()) {
53
- return;
54
- }
55
-
56
- for (const auto& child : children) {
57
- if (auto childInstance = std::dynamic_pointer_cast<ComponentInstance>(child)) {
58
- std::string childComponentName = childInstance->getComponentName();
59
- if (childComponentName.find("FeColorMatrix") != std::string::npos) {
60
- collectSingleFeColorMatrix(childInstance);
61
- } else if (childComponentName.find("FeFlood") != std::string::npos) {
62
- collectSingleFeFlood(childInstance);
63
- } else if (childComponentName.find("FeOffset") != std::string::npos) {
64
- collectSingleFeOffset(childInstance);
65
- } else if (childComponentName.find("FeComposite") != std::string::npos) {
66
- collectSingleFeComposite(childInstance);
67
- } else if (childComponentName.find("FeGaussianBlur") != std::string::npos) {
68
- collectSingleFeGaussianBlur(childInstance);
69
- } else if (childComponentName.find("FeBlend") != std::string::npos) {
70
- collectSingleFeBlend(childInstance);
71
- }
72
- }
73
- }
74
- }
75
-
76
- bool RNSVGFilterComponentInstance::collectFeDropShadowInfo()
77
- {
78
- auto children = getChildren();
79
-
80
- std::shared_ptr<RNSVGFeGaussianBlurComponentInstance> blurInstance = nullptr;
81
- std::shared_ptr<RNSVGFeOffsetComponentInstance> offsetInstance = nullptr;
82
- std::shared_ptr<RNSVGFeFloodComponentInstance> floodInstance = nullptr;
83
- std::shared_ptr<RNSVGFeCompositeComponentInstance> compositeInstance = nullptr;
84
-
85
- for (const auto& child : children) {
86
- if (auto childInstance = std::dynamic_pointer_cast<ComponentInstance>(child)) {
87
- std::string childComponentName = childInstance->getComponentName();
88
- if (childComponentName.find("FeGaussianBlur") != std::string::npos) {
89
- blurInstance = std::dynamic_pointer_cast<RNSVGFeGaussianBlurComponentInstance>(childInstance);
90
- } else if (childComponentName.find("FeOffset") != std::string::npos) {
91
- offsetInstance = std::dynamic_pointer_cast<RNSVGFeOffsetComponentInstance>(childInstance);
92
- } else if (childComponentName.find("FeFlood") != std::string::npos) {
93
- floodInstance = std::dynamic_pointer_cast<RNSVGFeFloodComponentInstance>(childInstance);
94
- }
95
- }
96
- }
97
-
98
- if (blurInstance && offsetInstance && floodInstance) {
99
- std::string in = blurInstance->getIn();
100
- float dx = offsetInstance->getDx();
101
- float dy = offsetInstance->getDy();
102
- float stdDeviation = blurInstance->getStdDeviationX();
103
- std::string floodColorStr = floodInstance->getFloodColor();
104
- if (floodColorStr.empty()) {
105
- floodColorStr = "black";
106
- }
107
- float floodOpacity = floodInstance->getFloodOpacity();
108
- FilterEffect dropShadowEffect(FilterType::DROP_SHADOW, in, dx, dy, stdDeviation, floodColorStr, floodOpacity);
109
- m_svgFilter->AddFilterEffect(dropShadowEffect);
110
- return true;
111
- }
112
- return false;
113
- }
114
-
115
- void RNSVGFilterComponentInstance::collectSingleFeColorMatrix(std::shared_ptr<ComponentInstance> childInstance)
116
- {
117
- if (auto feColorMatrixInstance = std::dynamic_pointer_cast<RNSVGFeColorMatrixComponentInstance>(childInstance)) {
118
- std::string in = feColorMatrixInstance->getIn();
119
- std::string type = feColorMatrixInstance->getType();
120
- std::vector<float> values = feColorMatrixInstance->getValues();
121
- std::string result = feColorMatrixInstance->getResult();
122
- FilterEffect colorMatrixEffect(FilterType::COLOR_MATRIX, values, in, type, result);
123
- m_svgFilter->AddFilterEffect(colorMatrixEffect);
124
- }
125
- }
126
-
127
- void RNSVGFilterComponentInstance::collectSingleFeFlood(std::shared_ptr<ComponentInstance> childInstance)
128
- {
129
- auto feFloodInstance = std::dynamic_pointer_cast<RNSVGFeFloodComponentInstance>(childInstance);
130
- if (feFloodInstance) {
131
- std::string in = feFloodInstance->getIn();
132
- std::string floodColorStr = feFloodInstance->getFloodColor();
133
- if (floodColorStr.empty()) {
134
- floodColorStr = "black";
135
- }
136
- float floodOpacity = feFloodInstance->getFloodOpacity();
137
- std::string result = feFloodInstance->getResult();
138
- FilterEffect floodEffect(FilterType::FEFLOOD, in, floodColorStr, floodOpacity, result);
139
- m_svgFilter->AddFilterEffect(floodEffect);
140
- }
141
- }
142
-
143
- void RNSVGFilterComponentInstance::collectSingleFeOffset(std::shared_ptr<ComponentInstance> childInstance)
144
- {
145
- if (auto feOffsetInstance = std::dynamic_pointer_cast<RNSVGFeOffsetComponentInstance>(childInstance)) {
146
- std::string in = feOffsetInstance->getIn();
147
- std::string result = feOffsetInstance->getResult();
148
- float dx = feOffsetInstance->getDx();
149
- float dy = feOffsetInstance->getDy();
150
- FilterEffect offsetEffect(FilterType::FEOFFSET, in, dx, dy, result);
151
- m_svgFilter->AddFilterEffect(offsetEffect);
152
- }
153
- }
154
-
155
- void RNSVGFilterComponentInstance::collectSingleFeComposite(std::shared_ptr<ComponentInstance> childInstance)
156
- {
157
- if (auto feCompositeInstance = std::dynamic_pointer_cast<RNSVGFeCompositeComponentInstance>(childInstance)) {
158
- std::string in = feCompositeInstance->getIn();
159
- std::string in2 = feCompositeInstance->getIn2();
160
- std::string operatorType = feCompositeInstance->getOperator();
161
- std::string k1 = "0", k2 = "0", k3 = "0", k4 = "0";
162
- if (operatorType == "arithmetic") {
163
- k1 = feCompositeInstance->getK1();
164
- k2 = feCompositeInstance->getK2();
165
- k3 = feCompositeInstance->getK3();
166
- k4 = feCompositeInstance->getK4();
167
- }
168
- std::string result = feCompositeInstance->getResult();
169
- FilterEffect compositeEffect(FilterType::COMPOSITE, in, in2, operatorType, k1, k2, k3, k4, result);
170
- m_svgFilter->AddFilterEffect(compositeEffect);
171
- }
172
- }
173
-
174
- void RNSVGFilterComponentInstance::collectSingleFeGaussianBlur(std::shared_ptr<ComponentInstance> childInstance)
175
- {
176
- if (auto feGaussianBlurInstance = std::dynamic_pointer_cast<RNSVGFeGaussianBlurComponentInstance>(childInstance)) {
177
- std::string in = feGaussianBlurInstance->getIn();
178
- float stdDeviationX = feGaussianBlurInstance->getStdDeviationX();
179
- float stdDeviationY = feGaussianBlurInstance->getStdDeviationY();
180
- std::string edgeMode = feGaussianBlurInstance->getEdgeMode();
181
- std::string result = feGaussianBlurInstance->getResult();
182
- FilterEffect gaussianBlurEffect(FilterType::GAUSSIAN_BLUR, in, stdDeviationX, stdDeviationY, edgeMode, result);
183
- m_svgFilter->AddFilterEffect(gaussianBlurEffect);
184
- }
185
- }
186
-
187
- void RNSVGFilterComponentInstance::collectSingleFeBlend(std::shared_ptr<ComponentInstance> childInstance)
188
- {
189
- if (auto feBlendInstance = std::dynamic_pointer_cast<RNSVGFeBlendComponentInstance>(childInstance)) {
190
- std::string in = feBlendInstance->getIn();
191
- std::string in2 = feBlendInstance->getIn2();
192
- std::string mode = feBlendInstance->getMode();
193
- std::string result = feBlendInstance->getResult();
194
- FilterEffect blendEffect(FilterType::BLEND, in, in2, mode, result);
195
- m_svgFilter->AddFilterEffect(blendEffect);
196
- }
197
- }
198
- }
1
+ /*
2
+ * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved
3
+ * Use of this source code is governed by a MIT license that can be
4
+ * found in the LICENSE file.
5
+ */
6
+
7
+ #include "RNSVGFilterComponentInstance.h"
8
+ #include "RNSVGFeColorMatrixComponentInstance.h"
9
+ #include "RNSVGFeBlendComponentInstance.h"
10
+ #include "RNSVGFeCompositeComponentInstance.h"
11
+ #include "RNSVGFeFloodComponentInstance.h"
12
+ #include "RNSVGFeOffsetComponentInstance.h"
13
+ #include "RNSVGFeGaussianBlurComponentInstance.h"
14
+ #include "utils/FilterManager.h"
15
+ #include <sstream>
16
+ #include <utility>
17
+ #include <folly/dynamic.h>
18
+ #include <cmath>
19
+ #include <iomanip>
20
+ #include <string>
21
+ namespace rnoh {
22
+ namespace svg {
23
+
24
+ RNSVGFilterComponentInstance::RNSVGFilterComponentInstance(Context context)
25
+ : RNSVGBaseComponentInstance(std::move(context)) {
26
+ SetSvgNode(m_svgFilter);
27
+ }
28
+
29
+ void RNSVGFilterComponentInstance::onPropsChanged(SharedConcreteProps const &props) {}
30
+
31
+ void RNSVGFilterComponentInstance::UpdateElementProps() {
32
+ m_svgFilter->UpdateCommonProps(m_props);
33
+ // Set the name as the ID for the SvgNode using the UpdateHrefRenderProps method
34
+ m_svgFilter->UpdateHrefRenderProps(m_props);
35
+ parseFilterId();
36
+ collectFilterEffectsInOrder();
37
+ }
38
+
39
+ void RNSVGFilterComponentInstance::parseFilterId() {
40
+ if (m_props) {
41
+ filterId_ = m_props->name;
42
+ }
43
+ }
44
+
45
+ void RNSVGFilterComponentInstance::collectFilterEffectsInOrder()
46
+ {
47
+ if (m_svgFilter) {
48
+ m_svgFilter->ClearFilterEffects();
49
+ }
50
+
51
+ auto children = getChildren();
52
+ if (collectFeDropShadowInfo()) {
53
+ return;
54
+ }
55
+
56
+ for (const auto& child : children) {
57
+ if (auto childInstance = std::dynamic_pointer_cast<ComponentInstance>(child)) {
58
+ std::string childComponentName = childInstance->getComponentName();
59
+ if (childComponentName.find("FeColorMatrix") != std::string::npos) {
60
+ collectSingleFeColorMatrix(childInstance);
61
+ } else if (childComponentName.find("FeFlood") != std::string::npos) {
62
+ collectSingleFeFlood(childInstance);
63
+ } else if (childComponentName.find("FeOffset") != std::string::npos) {
64
+ collectSingleFeOffset(childInstance);
65
+ } else if (childComponentName.find("FeComposite") != std::string::npos) {
66
+ collectSingleFeComposite(childInstance);
67
+ } else if (childComponentName.find("FeGaussianBlur") != std::string::npos) {
68
+ collectSingleFeGaussianBlur(childInstance);
69
+ } else if (childComponentName.find("FeBlend") != std::string::npos) {
70
+ collectSingleFeBlend(childInstance);
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ bool RNSVGFilterComponentInstance::collectFeDropShadowInfo()
77
+ {
78
+ auto children = getChildren();
79
+
80
+ std::shared_ptr<RNSVGFeGaussianBlurComponentInstance> blurInstance = nullptr;
81
+ std::shared_ptr<RNSVGFeOffsetComponentInstance> offsetInstance = nullptr;
82
+ std::shared_ptr<RNSVGFeFloodComponentInstance> floodInstance = nullptr;
83
+ std::shared_ptr<RNSVGFeCompositeComponentInstance> compositeInstance = nullptr;
84
+
85
+ for (const auto& child : children) {
86
+ if (auto childInstance = std::dynamic_pointer_cast<ComponentInstance>(child)) {
87
+ std::string childComponentName = childInstance->getComponentName();
88
+ if (childComponentName.find("FeGaussianBlur") != std::string::npos) {
89
+ blurInstance = std::dynamic_pointer_cast<RNSVGFeGaussianBlurComponentInstance>(childInstance);
90
+ } else if (childComponentName.find("FeOffset") != std::string::npos) {
91
+ offsetInstance = std::dynamic_pointer_cast<RNSVGFeOffsetComponentInstance>(childInstance);
92
+ } else if (childComponentName.find("FeFlood") != std::string::npos) {
93
+ floodInstance = std::dynamic_pointer_cast<RNSVGFeFloodComponentInstance>(childInstance);
94
+ }
95
+ }
96
+ }
97
+
98
+ if (blurInstance && offsetInstance && floodInstance) {
99
+ std::string in = blurInstance->getIn();
100
+ float dx = offsetInstance->getDx();
101
+ float dy = offsetInstance->getDy();
102
+ float stdDeviation = blurInstance->getStdDeviationX();
103
+ std::string floodColorStr = floodInstance->getFloodColor();
104
+ if (floodColorStr.empty()) {
105
+ floodColorStr = "black";
106
+ }
107
+ float floodOpacity = floodInstance->getFloodOpacity();
108
+ FilterEffect dropShadowEffect(FilterType::DROP_SHADOW, in, dx, dy, stdDeviation, floodColorStr, floodOpacity);
109
+ m_svgFilter->AddFilterEffect(dropShadowEffect);
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+
115
+ void RNSVGFilterComponentInstance::collectSingleFeColorMatrix(std::shared_ptr<ComponentInstance> childInstance)
116
+ {
117
+ if (auto feColorMatrixInstance = std::dynamic_pointer_cast<RNSVGFeColorMatrixComponentInstance>(childInstance)) {
118
+ std::string in = feColorMatrixInstance->getIn();
119
+ std::string type = feColorMatrixInstance->getType();
120
+ std::vector<float> values = feColorMatrixInstance->getValues();
121
+ std::string result = feColorMatrixInstance->getResult();
122
+ FilterEffect colorMatrixEffect(FilterType::COLOR_MATRIX, values, in, type, result);
123
+ m_svgFilter->AddFilterEffect(colorMatrixEffect);
124
+ }
125
+ }
126
+
127
+ void RNSVGFilterComponentInstance::collectSingleFeFlood(std::shared_ptr<ComponentInstance> childInstance)
128
+ {
129
+ auto feFloodInstance = std::dynamic_pointer_cast<RNSVGFeFloodComponentInstance>(childInstance);
130
+ if (feFloodInstance) {
131
+ std::string in = feFloodInstance->getIn();
132
+ std::string floodColorStr = feFloodInstance->getFloodColor();
133
+ if (floodColorStr.empty()) {
134
+ floodColorStr = "black";
135
+ }
136
+ float floodOpacity = feFloodInstance->getFloodOpacity();
137
+ std::string result = feFloodInstance->getResult();
138
+ FilterEffect floodEffect(FilterType::FEFLOOD, in, floodColorStr, floodOpacity, result);
139
+ m_svgFilter->AddFilterEffect(floodEffect);
140
+ }
141
+ }
142
+
143
+ void RNSVGFilterComponentInstance::collectSingleFeOffset(std::shared_ptr<ComponentInstance> childInstance)
144
+ {
145
+ if (auto feOffsetInstance = std::dynamic_pointer_cast<RNSVGFeOffsetComponentInstance>(childInstance)) {
146
+ std::string in = feOffsetInstance->getIn();
147
+ std::string result = feOffsetInstance->getResult();
148
+ float dx = feOffsetInstance->getDx();
149
+ float dy = feOffsetInstance->getDy();
150
+ FilterEffect offsetEffect(FilterType::FEOFFSET, in, dx, dy, result);
151
+ m_svgFilter->AddFilterEffect(offsetEffect);
152
+ }
153
+ }
154
+
155
+ void RNSVGFilterComponentInstance::collectSingleFeComposite(std::shared_ptr<ComponentInstance> childInstance)
156
+ {
157
+ if (auto feCompositeInstance = std::dynamic_pointer_cast<RNSVGFeCompositeComponentInstance>(childInstance)) {
158
+ std::string in = feCompositeInstance->getIn();
159
+ std::string in2 = feCompositeInstance->getIn2();
160
+ std::string operatorType = feCompositeInstance->getOperator();
161
+ std::string k1 = "0", k2 = "0", k3 = "0", k4 = "0";
162
+ if (operatorType == "arithmetic") {
163
+ k1 = feCompositeInstance->getK1();
164
+ k2 = feCompositeInstance->getK2();
165
+ k3 = feCompositeInstance->getK3();
166
+ k4 = feCompositeInstance->getK4();
167
+ }
168
+ std::string result = feCompositeInstance->getResult();
169
+ FilterEffect compositeEffect(FilterType::COMPOSITE, in, in2, operatorType, k1, k2, k3, k4, result);
170
+ m_svgFilter->AddFilterEffect(compositeEffect);
171
+ }
172
+ }
173
+
174
+ void RNSVGFilterComponentInstance::collectSingleFeGaussianBlur(std::shared_ptr<ComponentInstance> childInstance)
175
+ {
176
+ if (auto feGaussianBlurInstance = std::dynamic_pointer_cast<RNSVGFeGaussianBlurComponentInstance>(childInstance)) {
177
+ std::string in = feGaussianBlurInstance->getIn();
178
+ float stdDeviationX = feGaussianBlurInstance->getStdDeviationX();
179
+ float stdDeviationY = feGaussianBlurInstance->getStdDeviationY();
180
+ std::string edgeMode = feGaussianBlurInstance->getEdgeMode();
181
+ std::string result = feGaussianBlurInstance->getResult();
182
+ FilterEffect gaussianBlurEffect(FilterType::GAUSSIAN_BLUR, in, stdDeviationX, stdDeviationY, edgeMode, result);
183
+ m_svgFilter->AddFilterEffect(gaussianBlurEffect);
184
+ }
185
+ }
186
+
187
+ void RNSVGFilterComponentInstance::collectSingleFeBlend(std::shared_ptr<ComponentInstance> childInstance)
188
+ {
189
+ if (auto feBlendInstance = std::dynamic_pointer_cast<RNSVGFeBlendComponentInstance>(childInstance)) {
190
+ std::string in = feBlendInstance->getIn();
191
+ std::string in2 = feBlendInstance->getIn2();
192
+ std::string mode = feBlendInstance->getMode();
193
+ std::string result = feBlendInstance->getResult();
194
+ FilterEffect blendEffect(FilterType::BLEND, in, in2, mode, result);
195
+ m_svgFilter->AddFilterEffect(blendEffect);
196
+ }
197
+ }
198
+ }
199
199
  }
@@ -1,48 +1,48 @@
1
- /*
2
- * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved
3
- * Use of this source code is governed by a MIT license that can be
4
- * found in the LICENSE file.
5
- */
6
-
7
- #pragma once
8
-
9
- #include "RNSVGBaseComponentInstance.h"
10
- #include "SvgFilter.h"
11
- #include "utils/FilterManager.h"
12
- #include <react/renderer/components/react_native_svg/ShadowNodes.h>
13
-
14
- namespace rnoh {
15
- namespace svg {
16
-
17
-
18
- class RNSVGFilterComponentInstance : public RNSVGBaseComponentInstance<facebook::react::RNSVGFilterShadowNode> {
19
- public:
20
- RNSVGFilterComponentInstance(Context context);
21
-
22
- void onPropsChanged(SharedConcreteProps const &props) override;
23
- void UpdateElementProps() override;
24
-
25
- private:
26
- std::shared_ptr<SvgFilter> m_svgFilter = std::make_shared<SvgFilter>();
27
- std::string filterId_;
28
-
29
- void parseFilterId();
30
- void collectFilterEffectsInOrder();
31
- bool collectFeDropShadowInfo();
32
- void collectSingleFeColorMatrix(std::shared_ptr<ComponentInstance> childInstance);
33
- void collectSingleFeFlood(std::shared_ptr<ComponentInstance> childInstance);
34
- void collectSingleFeOffset(std::shared_ptr<ComponentInstance> childInstance);
35
- void collectSingleFeComposite(std::shared_ptr<ComponentInstance> childInstance);
36
- void collectSingleFeGaussianBlur(std::shared_ptr<ComponentInstance> childInstance);
37
- void collectSingleFeBlend(std::shared_ptr<ComponentInstance> childInstance);
38
- std::vector<float> generateColorMatrix(const std::string& type, const std::vector<float>& values);
39
- std::vector<float> convertBlendModeToValues(const std::string& mode);
40
- std::vector<float> convertCompositeOperatorToValues(const std::string& operatorType,
41
- const std::string& k1,
42
- const std::string& k2,
43
- const std::string& k3,
44
- const std::string& k4);
45
- };
46
-
47
- } // namespace svg
48
- } // namespace rnoh
1
+ /*
2
+ * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved
3
+ * Use of this source code is governed by a MIT license that can be
4
+ * found in the LICENSE file.
5
+ */
6
+
7
+ #pragma once
8
+
9
+ #include "RNSVGBaseComponentInstance.h"
10
+ #include "SvgFilter.h"
11
+ #include "utils/FilterManager.h"
12
+ #include <react/renderer/components/react_native_svg/ShadowNodes.h>
13
+
14
+ namespace rnoh {
15
+ namespace svg {
16
+
17
+
18
+ class RNSVGFilterComponentInstance : public RNSVGBaseComponentInstance<facebook::react::RNSVGFilterShadowNode> {
19
+ public:
20
+ RNSVGFilterComponentInstance(Context context);
21
+
22
+ void onPropsChanged(SharedConcreteProps const &props) override;
23
+ void UpdateElementProps() override;
24
+
25
+ private:
26
+ std::shared_ptr<SvgFilter> m_svgFilter = std::make_shared<SvgFilter>();
27
+ std::string filterId_;
28
+
29
+ void parseFilterId();
30
+ void collectFilterEffectsInOrder();
31
+ bool collectFeDropShadowInfo();
32
+ void collectSingleFeColorMatrix(std::shared_ptr<ComponentInstance> childInstance);
33
+ void collectSingleFeFlood(std::shared_ptr<ComponentInstance> childInstance);
34
+ void collectSingleFeOffset(std::shared_ptr<ComponentInstance> childInstance);
35
+ void collectSingleFeComposite(std::shared_ptr<ComponentInstance> childInstance);
36
+ void collectSingleFeGaussianBlur(std::shared_ptr<ComponentInstance> childInstance);
37
+ void collectSingleFeBlend(std::shared_ptr<ComponentInstance> childInstance);
38
+ std::vector<float> generateColorMatrix(const std::string& type, const std::vector<float>& values);
39
+ std::vector<float> convertBlendModeToValues(const std::string& mode);
40
+ std::vector<float> convertCompositeOperatorToValues(const std::string& operatorType,
41
+ const std::string& k1,
42
+ const std::string& k2,
43
+ const std::string& k3,
44
+ const std::string& k4);
45
+ };
46
+
47
+ } // namespace svg
48
+ } // namespace rnoh
@@ -77,7 +77,10 @@ std::string RNSVGImageComponentInstance::FindLocalCacheByUri(std::string const &
77
77
  }
78
78
 
79
79
  // 查找缓存目录
80
- auto cacheDir = arkTsTurboModule->getImageSourceResolver()->resolveImageSources(*this, uri);
80
+ auto basePtr = shared_from_this();
81
+ auto thisPtr = std::static_pointer_cast<RNSVGImageComponentInstance>(basePtr);
82
+ auto cacheDir = arkTsTurboModule->getImageSourceResolver()->resolveImageSources(thisPtr, uri);
83
+
81
84
  if (!cacheDir.empty()) {
82
85
  return cacheDir; // 如果找到缓存文件,返回缓存路径
83
86
  }
@@ -10,11 +10,11 @@
10
10
  namespace rnoh {
11
11
  namespace svg {
12
12
 
13
- std::string ImageSourceResolver::resolveImageSources(ImageSourceUpdateListener &listener, std::string uri) {
13
+ std::string ImageSourceResolver::resolveImageSources(std::shared_ptr<ImageSourceUpdateListener> listener, std::string uri) {
14
14
  // 判断是否还在下载中
15
15
  if (m_pendingSet.find(uri) != m_pendingSet.end()) {
16
- removeListener(&listener);
17
- addListenerForURI(uri, &listener);
16
+ removeListener(listener);
17
+ addListenerForURI(uri, listener);
18
18
  return "";
19
19
  }
20
20
  // 生成图像的哈希缓存文件名
@@ -25,31 +25,45 @@ std::string ImageSourceResolver::resolveImageSources(ImageSourceUpdateListener &
25
25
  auto cacheUri = "file://" + fileCacheDir_ + hashedFileName;
26
26
  return cacheUri;
27
27
  }
28
- removeListener(&listener);
29
- addListenerForURI(uri, &listener);
28
+ removeListener(listener);
29
+ addListenerForURI(uri, listener);
30
30
  return "";
31
31
  }
32
32
 
33
- void ImageSourceResolver::addListenerForURI(const std::string &uri, ImageSourceUpdateListener *listener) {
33
+ void ImageSourceResolver::addListenerForURI(const std::string &uri, std::shared_ptr<ImageSourceUpdateListener> listener) {
34
34
  listener->observedUri = uri;
35
35
  auto it = m_uriListenersMap.find(uri);
36
36
  if (it == m_uriListenersMap.end()) {
37
- m_uriListenersMap.emplace(uri, std::initializer_list<ImageSourceUpdateListener *>{listener});
37
+ m_uriListenersMap.emplace(uri, std::vector<std::weak_ptr<ImageSourceUpdateListener>>{listener});
38
38
  return;
39
39
  }
40
- if (std::find(it->second.begin(), it->second.end(), listener) != it->second.end()) {
40
+
41
+ auto alreadyThere = std::find_if(it->second.begin(), it->second.end(),[&listener]
42
+ (const std::weak_ptr<ImageSourceUpdateListener> &wk )
43
+ {
44
+ auto sp = wk.lock();
45
+ return sp == listener;
46
+
47
+ });
48
+ if (alreadyThere != it->second.end())
49
+ {
41
50
  return;
42
51
  }
43
52
  it->second.push_back(listener);
44
53
  }
45
54
 
46
- void ImageSourceResolver::removeListenerForURI(const std::string &uri, ImageSourceUpdateListener *listener) {
55
+ void ImageSourceResolver::removeListenerForURI(const std::string &uri, std::shared_ptr<ImageSourceUpdateListener> listener) {
47
56
  auto it = m_uriListenersMap.find(uri);
48
57
  if (it == m_uriListenersMap.end()) {
49
58
  return;
50
59
  }
51
60
  auto &listeners = it->second;
52
- auto listenerPos = std::find(listeners.begin(), listeners.end(), listener);
61
+ auto listenerPos = std::find_if(listeners.begin(), listeners.end(), [&listener](const std::weak_ptr<ImageSourceUpdateListener> &wk)
62
+ {
63
+ auto sp = wk.lock();
64
+ return sp == listener;
65
+
66
+ });
53
67
  if (listenerPos != listeners.end()) {
54
68
  listeners.erase(listenerPos);
55
69
  if (listeners.empty()) {
@@ -58,7 +72,7 @@ void ImageSourceResolver::removeListenerForURI(const std::string &uri, ImageSour
58
72
  }
59
73
  }
60
74
 
61
- void ImageSourceResolver::removeListener(ImageSourceUpdateListener *listener) {
75
+ void ImageSourceResolver::removeListener(std::shared_ptr<ImageSourceUpdateListener> listener) {
62
76
  if (!listener->observedUri.empty()) {
63
77
  removeListenerForURI(listener->observedUri, listener);
64
78
  }
@@ -80,8 +94,13 @@ void ImageSourceResolver::imageDownloadComplete(std::string uri, std::string fil
80
94
 
81
95
  auto &listeners = it->second;
82
96
  for (auto listener : listeners) {
83
- listener->onImageSourceCacheUpdate(fileUri);
84
- removeListenerForURI(uri, listener);
97
+
98
+ if (auto weaklistener = listener.lock())
99
+ {
100
+ weaklistener->onImageSourceCacheUpdate(fileUri);
101
+ removeListenerForURI(uri, weaklistener);
102
+ }
103
+
85
104
  }
86
105
  }
87
106
 
@@ -97,8 +116,10 @@ void ImageSourceResolver::imageDownloadFail(std::string uri) {
97
116
  }
98
117
  auto &listeners = it->second;
99
118
  for (auto listener : listeners) {
100
- listener->onImageSourceCacheDownloadFileFail();
101
- removeListenerForURI(uri, listener);
119
+
120
+ auto weaklistener = listener.lock();
121
+ weaklistener->onImageSourceCacheDownloadFileFail();
122
+ removeListenerForURI(uri, weaklistener);
102
123
  }
103
124
  }
104
125
 
@@ -45,11 +45,7 @@ public:
45
45
  : m_imageSourceResolver(ImageSourceResolver) {}
46
46
 
47
47
  // 注销监听器
48
- ~ImageSourceUpdateListener() {
49
- if (!m_imageSourceResolver) {
50
- m_imageSourceResolver->removeListener(this);
51
- }
52
- }
48
+ ~ImageSourceUpdateListener() = default;
53
49
 
54
50
  // 监听图像缓存更新
55
51
  virtual void onImageSourceCacheUpdate(std::string imageUri) = 0;
@@ -62,16 +58,16 @@ public:
62
58
  };
63
59
 
64
60
  // 解析图像源的缓存路径
65
- std::string resolveImageSources(ImageSourceUpdateListener &listener, std::string uri);
61
+ std::string resolveImageSources(std::shared_ptr<ImageSourceUpdateListener> listener, std::string uri);
66
62
 
67
63
  // 为URI添加监听器
68
- void addListenerForURI(const std::string &uri, ImageSourceUpdateListener *listener);
64
+ void addListenerForURI(const std::string &uri, std::shared_ptr<ImageSourceUpdateListener> listener);
69
65
 
70
66
  // 从URI移除监听器
71
- void removeListenerForURI(const std::string &uri, ImageSourceUpdateListener *listener);
67
+ void removeListenerForURI(const std::string &uri, std::shared_ptr<ImageSourceUpdateListener> listener);
72
68
 
73
69
  // 从解析器中移除监听器
74
- void removeListener(ImageSourceUpdateListener *listener);
70
+ void removeListener(std::shared_ptr<ImageSourceUpdateListener> listener);
75
71
 
76
72
  // 下载完成后更新图像缓存
77
73
  void imageDownloadComplete(std::string uri, std::string fileUri);
@@ -87,7 +83,7 @@ public:
87
83
 
88
84
  private:
89
85
  // 存储URI与对应的监听器(支持多个监听器)
90
- std::unordered_map<std::string, std::vector<ImageSourceUpdateListener *>> m_uriListenersMap;
86
+ std::unordered_map<std::string, std::vector<std::weak_ptr<ImageSourceUpdateListener>>> m_uriListenersMap;
91
87
 
92
88
  // 存储正在下载的图像URI集合
93
89
  std::unordered_set<std::string> m_pendingSet;