@shopify/react-native-skia 0.1.164 → 0.1.166
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.
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +16 -5
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseViewManager.java +34 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomViewManager.java +2 -47
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDrawViewManager.java +2 -44
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureViewManager.java +2 -47
- package/cpp/api/JsiSkRuntimeEffect.h +7 -2
- package/cpp/rnskia/RNSkDomView.cpp +1 -1
- package/cpp/rnskia/RNSkPlatformContext.h +2 -6
- package/cpp/rnskia/dom/base/DerivedNodeProp.h +4 -4
- package/cpp/rnskia/dom/base/DrawingContext.cpp +5 -38
- package/cpp/rnskia/dom/base/DrawingContext.h +3 -17
- package/cpp/rnskia/dom/nodes/JsiBoxNode.h +4 -4
- package/cpp/rnskia/dom/nodes/JsiCircleNode.h +0 -2
- package/cpp/rnskia/dom/nodes/JsiCustomDrawingNode.h +1 -3
- package/cpp/rnskia/dom/nodes/JsiImageFilterNodes.h +2 -2
- package/cpp/rnskia/dom/nodes/JsiPathNode.h +12 -5
- package/cpp/rnskia/dom/nodes/JsiShaderNodes.h +17 -7
- package/cpp/rnskia/dom/props/CircleProp.h +2 -0
- package/cpp/rnskia/dom/props/ClipProp.h +6 -6
- package/cpp/rnskia/dom/props/ColorProp.h +9 -4
- package/cpp/rnskia/dom/props/ImageProps.h +6 -3
- package/cpp/rnskia/dom/props/PaintProps.h +15 -22
- package/cpp/rnskia/dom/props/RectProp.h +11 -4
- package/cpp/rnskia/dom/props/UniformsProp.h +86 -123
- package/cpp/rnskia/dom/props/VerticesProps.h +2 -2
- package/cpp/rnskia/values/RNSkReadonlyValue.h +2 -6
- package/lib/commonjs/dom/nodes/datatypes/Circle.js +6 -1
- package/lib/commonjs/dom/nodes/datatypes/Circle.js.map +1 -1
- package/lib/commonjs/dom/nodes/datatypes/Rect.js +3 -3
- package/lib/commonjs/dom/nodes/datatypes/Rect.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/Box.js +1 -1
- package/lib/commonjs/dom/nodes/drawings/Box.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js +2 -2
- package/lib/commonjs/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/commonjs/dom/nodes/paint/ImageFilters.js +1 -1
- package/lib/commonjs/dom/nodes/paint/ImageFilters.js.map +1 -1
- package/lib/commonjs/dom/nodes/paint/Shaders.js +5 -2
- package/lib/commonjs/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/commonjs/dom/types/Common.js.map +1 -1
- package/lib/commonjs/dom/types/Drawings.js.map +1 -1
- package/lib/commonjs/renderer/components/Mask.js +2 -6
- package/lib/commonjs/renderer/components/Mask.js.map +1 -1
- package/lib/commonjs/renderer/components/image/Image.js +0 -5
- package/lib/commonjs/renderer/components/image/Image.js.map +1 -1
- package/lib/commonjs/renderer/components/image/ImageShader.js +20 -10
- package/lib/commonjs/renderer/components/image/ImageShader.js.map +1 -1
- package/lib/commonjs/renderer/components/imageFilters/Blur.js +10 -5
- package/lib/commonjs/renderer/components/imageFilters/Blur.js.map +1 -1
- package/lib/commonjs/renderer/components/imageFilters/Morphology.js +10 -5
- package/lib/commonjs/renderer/components/imageFilters/Morphology.js.map +1 -1
- package/lib/commonjs/renderer/components/imageFilters/Offset.js +12 -6
- package/lib/commonjs/renderer/components/imageFilters/Offset.js.map +1 -1
- package/lib/commonjs/renderer/components/maskFilters/Blur.js +12 -6
- package/lib/commonjs/renderer/components/maskFilters/Blur.js.map +1 -1
- package/lib/commonjs/renderer/components/pathEffects/Discrete.js +10 -5
- package/lib/commonjs/renderer/components/pathEffects/Discrete.js.map +1 -1
- package/lib/commonjs/renderer/components/shaders/FractalNoise.js +14 -7
- package/lib/commonjs/renderer/components/shaders/FractalNoise.js.map +1 -1
- package/lib/commonjs/renderer/components/shaders/Shader.js +10 -5
- package/lib/commonjs/renderer/components/shaders/Shader.js.map +1 -1
- package/lib/commonjs/renderer/components/shaders/Turbulence.js +14 -7
- package/lib/commonjs/renderer/components/shaders/Turbulence.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Circle.js +0 -6
- package/lib/commonjs/renderer/components/shapes/Circle.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/FitBox.js +1 -4
- package/lib/commonjs/renderer/components/shapes/FitBox.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Oval.js +0 -4
- package/lib/commonjs/renderer/components/shapes/Oval.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Path.js +12 -6
- package/lib/commonjs/renderer/components/shapes/Path.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Points.js +10 -5
- package/lib/commonjs/renderer/components/shapes/Points.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/RoundedRect.js +0 -3
- package/lib/commonjs/renderer/components/shapes/RoundedRect.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Vertices.js +10 -5
- package/lib/commonjs/renderer/components/shapes/Vertices.js.map +1 -1
- package/lib/commonjs/renderer/components/text/Glyphs.js +12 -6
- package/lib/commonjs/renderer/components/text/Glyphs.js.map +1 -1
- package/lib/commonjs/renderer/components/text/Text.js +12 -6
- package/lib/commonjs/renderer/components/text/Text.js.map +1 -1
- package/lib/commonjs/renderer/components/text/TextBlob.js +12 -6
- package/lib/commonjs/renderer/components/text/TextBlob.js.map +1 -1
- package/lib/commonjs/renderer/components/text/TextPath.js +10 -5
- package/lib/commonjs/renderer/components/text/TextPath.js.map +1 -1
- package/lib/commonjs/renderer/processors/Animations/Animations.js.map +1 -1
- package/lib/commonjs/skia/types/RuntimeEffect/RuntimeEffect.js.map +1 -1
- package/lib/commonjs/skia/types/Shader/Shader.js +25 -25
- package/lib/commonjs/skia/types/Shader/Shader.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkRuntimeEffect.js +6 -1
- package/lib/commonjs/skia/web/JsiSkRuntimeEffect.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkRuntimeEffectFactory.js +1 -1
- package/lib/commonjs/skia/web/JsiSkRuntimeEffectFactory.js.map +1 -1
- package/lib/module/dom/nodes/datatypes/Circle.js +8 -1
- package/lib/module/dom/nodes/datatypes/Circle.js.map +1 -1
- package/lib/module/dom/nodes/datatypes/Rect.js +7 -3
- package/lib/module/dom/nodes/datatypes/Rect.js.map +1 -1
- package/lib/module/dom/nodes/drawings/Box.js +1 -1
- package/lib/module/dom/nodes/drawings/Box.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ImageNode.js +4 -2
- package/lib/module/dom/nodes/drawings/ImageNode.js.map +1 -1
- package/lib/module/dom/nodes/paint/ImageFilters.js +1 -1
- package/lib/module/dom/nodes/paint/ImageFilters.js.map +1 -1
- package/lib/module/dom/nodes/paint/Shaders.js +5 -4
- package/lib/module/dom/nodes/paint/Shaders.js.map +1 -1
- package/lib/module/dom/types/Common.js.map +1 -1
- package/lib/module/dom/types/Drawings.js.map +1 -1
- package/lib/module/renderer/components/Mask.js +2 -6
- package/lib/module/renderer/components/Mask.js.map +1 -1
- package/lib/module/renderer/components/image/Image.js +0 -5
- package/lib/module/renderer/components/image/Image.js.map +1 -1
- package/lib/module/renderer/components/image/ImageShader.js +20 -10
- package/lib/module/renderer/components/image/ImageShader.js.map +1 -1
- package/lib/module/renderer/components/imageFilters/Blur.js +10 -5
- package/lib/module/renderer/components/imageFilters/Blur.js.map +1 -1
- package/lib/module/renderer/components/imageFilters/Morphology.js +10 -5
- package/lib/module/renderer/components/imageFilters/Morphology.js.map +1 -1
- package/lib/module/renderer/components/imageFilters/Offset.js +12 -6
- package/lib/module/renderer/components/imageFilters/Offset.js.map +1 -1
- package/lib/module/renderer/components/maskFilters/Blur.js +12 -6
- package/lib/module/renderer/components/maskFilters/Blur.js.map +1 -1
- package/lib/module/renderer/components/pathEffects/Discrete.js +10 -5
- package/lib/module/renderer/components/pathEffects/Discrete.js.map +1 -1
- package/lib/module/renderer/components/shaders/FractalNoise.js +14 -7
- package/lib/module/renderer/components/shaders/FractalNoise.js.map +1 -1
- package/lib/module/renderer/components/shaders/Shader.js +10 -5
- package/lib/module/renderer/components/shaders/Shader.js.map +1 -1
- package/lib/module/renderer/components/shaders/Turbulence.js +14 -7
- package/lib/module/renderer/components/shaders/Turbulence.js.map +1 -1
- package/lib/module/renderer/components/shapes/Circle.js +0 -6
- package/lib/module/renderer/components/shapes/Circle.js.map +1 -1
- package/lib/module/renderer/components/shapes/FitBox.js +1 -4
- package/lib/module/renderer/components/shapes/FitBox.js.map +1 -1
- package/lib/module/renderer/components/shapes/Oval.js +0 -4
- package/lib/module/renderer/components/shapes/Oval.js.map +1 -1
- package/lib/module/renderer/components/shapes/Path.js +12 -6
- package/lib/module/renderer/components/shapes/Path.js.map +1 -1
- package/lib/module/renderer/components/shapes/Points.js +10 -5
- package/lib/module/renderer/components/shapes/Points.js.map +1 -1
- package/lib/module/renderer/components/shapes/RoundedRect.js +0 -3
- package/lib/module/renderer/components/shapes/RoundedRect.js.map +1 -1
- package/lib/module/renderer/components/shapes/Vertices.js +10 -5
- package/lib/module/renderer/components/shapes/Vertices.js.map +1 -1
- package/lib/module/renderer/components/text/Glyphs.js +12 -6
- package/lib/module/renderer/components/text/Glyphs.js.map +1 -1
- package/lib/module/renderer/components/text/Text.js +12 -6
- package/lib/module/renderer/components/text/Text.js.map +1 -1
- package/lib/module/renderer/components/text/TextBlob.js +12 -6
- package/lib/module/renderer/components/text/TextBlob.js.map +1 -1
- package/lib/module/renderer/components/text/TextPath.js +10 -5
- package/lib/module/renderer/components/text/TextPath.js.map +1 -1
- package/lib/module/renderer/processors/Animations/Animations.js.map +1 -1
- package/lib/module/skia/types/RuntimeEffect/RuntimeEffect.js.map +1 -1
- package/lib/module/skia/types/Shader/Shader.js +25 -25
- package/lib/module/skia/types/Shader/Shader.js.map +1 -1
- package/lib/module/skia/web/JsiSkRuntimeEffect.js +6 -1
- package/lib/module/skia/web/JsiSkRuntimeEffect.js.map +1 -1
- package/lib/module/skia/web/JsiSkRuntimeEffectFactory.js +1 -1
- package/lib/module/skia/web/JsiSkRuntimeEffectFactory.js.map +1 -1
- package/lib/typescript/src/dom/nodes/datatypes/Circle.d.ts +4 -1
- package/lib/typescript/src/dom/types/Common.d.ts +4 -4
- package/lib/typescript/src/dom/types/Drawings.d.ts +1 -1
- package/lib/typescript/src/renderer/components/Mask.d.ts +3 -9
- package/lib/typescript/src/renderer/components/image/Image.d.ts +1 -8
- package/lib/typescript/src/renderer/components/image/ImageShader.d.ts +2 -12
- package/lib/typescript/src/renderer/components/imageFilters/Blur.d.ts +2 -7
- package/lib/typescript/src/renderer/components/imageFilters/Morphology.d.ts +2 -7
- package/lib/typescript/src/renderer/components/imageFilters/Offset.d.ts +2 -8
- package/lib/typescript/src/renderer/components/maskFilters/Blur.d.ts +2 -8
- package/lib/typescript/src/renderer/components/pathEffects/Discrete.d.ts +2 -7
- package/lib/typescript/src/renderer/components/shaders/FractalNoise.d.ts +2 -9
- package/lib/typescript/src/renderer/components/shaders/Shader.d.ts +2 -7
- package/lib/typescript/src/renderer/components/shaders/Turbulence.d.ts +2 -9
- package/lib/typescript/src/renderer/components/shapes/Circle.d.ts +1 -9
- package/lib/typescript/src/renderer/components/shapes/FitBox.d.ts +2 -7
- package/lib/typescript/src/renderer/components/shapes/Oval.d.ts +1 -7
- package/lib/typescript/src/renderer/components/shapes/Path.d.ts +2 -8
- package/lib/typescript/src/renderer/components/shapes/Points.d.ts +2 -7
- package/lib/typescript/src/renderer/components/shapes/RoundedRect.d.ts +1 -6
- package/lib/typescript/src/renderer/components/shapes/Vertices.d.ts +2 -7
- package/lib/typescript/src/renderer/components/text/Glyphs.d.ts +2 -8
- package/lib/typescript/src/renderer/components/text/Text.d.ts +2 -8
- package/lib/typescript/src/renderer/components/text/TextBlob.d.ts +2 -8
- package/lib/typescript/src/renderer/components/text/TextPath.d.ts +2 -7
- package/lib/typescript/src/renderer/processors/Animations/Animations.d.ts +5 -0
- package/lib/typescript/src/skia/types/RuntimeEffect/RuntimeEffect.d.ts +4 -0
- package/lib/typescript/src/skia/types/Shader/Shader.d.ts +1 -2
- package/lib/typescript/src/skia/web/JsiSkRuntimeEffect.d.ts +3 -1
- package/package.json +1 -1
- package/src/dom/nodes/datatypes/Circle.ts +1 -1
- package/src/dom/nodes/datatypes/Rect.ts +3 -3
- package/src/dom/nodes/drawings/Box.ts +1 -1
- package/src/dom/nodes/drawings/ImageNode.ts +2 -1
- package/src/dom/nodes/paint/ImageFilters.ts +1 -1
- package/src/dom/nodes/paint/Shaders.ts +5 -5
- package/src/dom/types/Common.ts +4 -4
- package/src/dom/types/Drawings.ts +1 -1
- package/src/renderer/components/Mask.tsx +8 -8
- package/src/renderer/components/image/Image.tsx +0 -6
- package/src/renderer/components/image/ImageShader.tsx +24 -12
- package/src/renderer/components/imageFilters/Blur.tsx +6 -7
- package/src/renderer/components/imageFilters/Morphology.tsx +6 -7
- package/src/renderer/components/imageFilters/Offset.tsx +7 -8
- package/src/renderer/components/maskFilters/Blur.tsx +7 -8
- package/src/renderer/components/pathEffects/Discrete.tsx +6 -9
- package/src/renderer/components/shaders/FractalNoise.tsx +18 -9
- package/src/renderer/components/shaders/Shader.tsx +6 -7
- package/src/renderer/components/shaders/Turbulence.tsx +15 -9
- package/src/renderer/components/shapes/Circle.tsx +0 -4
- package/src/renderer/components/shapes/FitBox.tsx +2 -6
- package/src/renderer/components/shapes/Oval.tsx +0 -5
- package/src/renderer/components/shapes/Path.tsx +7 -8
- package/src/renderer/components/shapes/Points.tsx +6 -7
- package/src/renderer/components/shapes/RoundedRect.tsx +0 -4
- package/src/renderer/components/shapes/Vertices.tsx +6 -7
- package/src/renderer/components/text/Glyphs.tsx +7 -8
- package/src/renderer/components/text/Text.tsx +7 -8
- package/src/renderer/components/text/TextBlob.tsx +7 -8
- package/src/renderer/components/text/TextPath.tsx +6 -7
- package/src/renderer/processors/Animations/Animations.ts +9 -3
- package/src/skia/types/RuntimeEffect/RuntimeEffect.ts +5 -0
- package/src/skia/types/Shader/Shader.ts +30 -36
- package/src/skia/web/JsiSkRuntimeEffect.ts +5 -1
- package/src/skia/web/JsiSkRuntimeEffectFactory.ts +1 -1
|
@@ -45,18 +45,18 @@ public:
|
|
|
45
45
|
return _pathProp->isSet() || _rectProp->isSet() || _rrectProp->isSet();
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
SkPath *getPath() { return _path.get(); }
|
|
49
|
-
SkRect *getRect() { return _rect.get(); }
|
|
50
|
-
SkRRect *getRRect() { return _rrect.get(); }
|
|
48
|
+
const SkPath *getPath() { return _path.get(); }
|
|
49
|
+
const SkRect *getRect() { return _rect.get(); }
|
|
50
|
+
const SkRRect *getRRect() { return _rrect.get(); }
|
|
51
51
|
|
|
52
52
|
private:
|
|
53
53
|
PathProp *_pathProp;
|
|
54
54
|
RectProp *_rectProp;
|
|
55
55
|
RRectProp *_rrectProp;
|
|
56
56
|
|
|
57
|
-
std::shared_ptr<SkPath> _path;
|
|
58
|
-
std::shared_ptr<SkRect> _rect;
|
|
59
|
-
std::shared_ptr<SkRRect> _rrect;
|
|
57
|
+
std::shared_ptr<const SkPath> _path;
|
|
58
|
+
std::shared_ptr<const SkRect> _rect;
|
|
59
|
+
std::shared_ptr<const SkRRect> _rrect;
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
} // namespace RNSkia
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
|
|
10
10
|
namespace RNSkia {
|
|
11
11
|
|
|
12
|
+
static PropId PropName0 = JsiPropId::get("0");
|
|
13
|
+
static PropId PropName1 = JsiPropId::get("1");
|
|
14
|
+
static PropId PropName2 = JsiPropId::get("2");
|
|
15
|
+
static PropId PropName3 = JsiPropId::get("3");
|
|
16
|
+
|
|
12
17
|
class ColorProp : public DerivedProp<SkColor> {
|
|
13
18
|
public:
|
|
14
19
|
explicit ColorProp(PropId name) : DerivedProp<SkColor>() {
|
|
@@ -28,10 +33,10 @@ public:
|
|
|
28
33
|
static SkColor parseColorValue(const JsiValue &color) {
|
|
29
34
|
if (color.getType() == PropType::Object) {
|
|
30
35
|
// Float array
|
|
31
|
-
auto r = color.getValue(
|
|
32
|
-
auto g = color.getValue(
|
|
33
|
-
auto b = color.getValue(
|
|
34
|
-
auto a = color.getValue(
|
|
36
|
+
auto r = color.getValue(PropName0);
|
|
37
|
+
auto g = color.getValue(PropName1);
|
|
38
|
+
auto b = color.getValue(PropName2);
|
|
39
|
+
auto a = color.getValue(PropName3);
|
|
35
40
|
return SkColorSetARGB(a.getAsNumber() * 255.0f, r.getAsNumber() * 255.0f,
|
|
36
41
|
g.getAsNumber() * 255.0f, b.getAsNumber() * 255.0f);
|
|
37
42
|
|
|
@@ -30,7 +30,8 @@ public:
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
void updateDerivedValue() override {
|
|
33
|
-
if (_imageProp->
|
|
33
|
+
if (!_imageProp->isSet() ||
|
|
34
|
+
_imageProp->value().getType() != PropType::HostObject) {
|
|
34
35
|
throw std::runtime_error("Expected SkImage object for the " +
|
|
35
36
|
std::string(getName()) + " property.");
|
|
36
37
|
}
|
|
@@ -67,13 +68,15 @@ public:
|
|
|
67
68
|
|
|
68
69
|
auto rect = _rectProp->getDerivedValue() ? *_rectProp->getDerivedValue()
|
|
69
70
|
: imageRect;
|
|
70
|
-
auto fit = _fitProp->isSet() ? _fitProp->value().getAsString() : "
|
|
71
|
+
auto fit = _fitProp->isSet() ? _fitProp->value().getAsString() : "contain";
|
|
71
72
|
|
|
72
73
|
setDerivedValue(fitRects(fit, imageRect, rect));
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
sk_sp<SkImage> getImage() { return _imageProp->getDerivedValue(); }
|
|
76
|
-
std::shared_ptr<SkRect> getRect() {
|
|
77
|
+
std::shared_ptr<const SkRect> getRect() {
|
|
78
|
+
return _rectProp->getDerivedValue();
|
|
79
|
+
}
|
|
77
80
|
|
|
78
81
|
SkRect rect2rect(SkRect src, SkRect dst) {
|
|
79
82
|
auto scaleX = dst.width() / src.width();
|
|
@@ -19,8 +19,6 @@
|
|
|
19
19
|
|
|
20
20
|
namespace RNSkia {
|
|
21
21
|
|
|
22
|
-
static PropId PropNameCurrent = JsiPropId::get("current");
|
|
23
|
-
|
|
24
22
|
class PaintProp : public DerivedProp<SkPaint> {
|
|
25
23
|
public:
|
|
26
24
|
explicit PaintProp(PropId name) : DerivedProp<SkPaint>() {
|
|
@@ -40,20 +38,6 @@ public:
|
|
|
40
38
|
throw std::runtime_error("Expected SkPaint object, got unknown "
|
|
41
39
|
"object when reading paint property.");
|
|
42
40
|
}
|
|
43
|
-
} else if (_paintProp->value().getType() == PropType::Object) {
|
|
44
|
-
// We have a JS object - is it a ref?
|
|
45
|
-
auto ref = _paintProp->value().getValue(PropNameCurrent);
|
|
46
|
-
if (ref.getType() == PropType::HostObject) {
|
|
47
|
-
auto ptr = ref.getAs<JsiSkPaint>();
|
|
48
|
-
if (ptr != nullptr) {
|
|
49
|
-
// Update the local paint for the current context
|
|
50
|
-
setDerivedValue(ptr->getObject());
|
|
51
|
-
} else {
|
|
52
|
-
throw std::runtime_error(
|
|
53
|
-
"Expected reference to a SkPaint object, got unknown object "
|
|
54
|
-
"when reading paint property.");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
41
|
} else {
|
|
58
42
|
setDerivedValue(nullptr);
|
|
59
43
|
}
|
|
@@ -92,22 +76,31 @@ public:
|
|
|
92
76
|
|
|
93
77
|
// Opacity
|
|
94
78
|
if (_opacity->isChanged() || context->isChanged()) {
|
|
79
|
+
auto parent = context->getParent();
|
|
80
|
+
auto paint = context->getMutablePaint();
|
|
95
81
|
if (_opacity->isSet()) {
|
|
96
|
-
|
|
82
|
+
auto currentOpacity = _opacity->value().getAsNumber();
|
|
83
|
+
auto parent = context->getParent();
|
|
84
|
+
if (parent != nullptr) {
|
|
85
|
+
currentOpacity *= parent->getPaint()->getAlphaf();
|
|
86
|
+
}
|
|
87
|
+
paint->setAlphaf(currentOpacity);
|
|
97
88
|
} else {
|
|
98
|
-
|
|
89
|
+
if (parent != nullptr) {
|
|
90
|
+
paint->setAlphaf(parent->getPaint()->getAlphaf());
|
|
91
|
+
} else {
|
|
92
|
+
paint->setAlphaf(1.0);
|
|
93
|
+
}
|
|
99
94
|
}
|
|
100
95
|
}
|
|
101
96
|
|
|
102
97
|
// COLOR
|
|
103
98
|
if (_color->isSet() && (_color->isChanged() || context->isChanged())) {
|
|
104
99
|
auto paint = context->getMutablePaint();
|
|
100
|
+
auto opacity = paint->getAlphaf();
|
|
105
101
|
paint->setShader(nullptr);
|
|
106
102
|
paint->setColor(*_color->getDerivedValue());
|
|
107
|
-
paint->setAlphaf(
|
|
108
|
-
} else if (context->isChanged()) {
|
|
109
|
-
auto paint = context->getMutablePaint();
|
|
110
|
-
paint->setAlphaf(context->getOpacity());
|
|
103
|
+
paint->setAlphaf(opacity * paint->getColor4f().fA);
|
|
111
104
|
}
|
|
112
105
|
|
|
113
106
|
// Style
|
|
@@ -76,10 +76,17 @@ public:
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
void updateDerivedValue() override {
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
if (_width->isSet() && _height->isSet()) {
|
|
80
|
+
auto x = 0.0;
|
|
81
|
+
auto y = 0.0;
|
|
82
|
+
if (_x->isSet()) {
|
|
83
|
+
x = _x->value().getAsNumber();
|
|
84
|
+
}
|
|
85
|
+
if (_y->isSet()) {
|
|
86
|
+
y = _y->value().getAsNumber();
|
|
87
|
+
}
|
|
88
|
+
setDerivedValue(SkRect::MakeXYWH(x, y, _width->value().getAsNumber(),
|
|
89
|
+
_height->value().getAsNumber()));
|
|
83
90
|
}
|
|
84
91
|
}
|
|
85
92
|
|
|
@@ -16,6 +16,68 @@
|
|
|
16
16
|
|
|
17
17
|
namespace RNSkia {
|
|
18
18
|
|
|
19
|
+
bool isJSPoint(const JsiValue &value) {
|
|
20
|
+
return value.getType() == PropType::Object && value.hasValue(PropNameX) &&
|
|
21
|
+
value.hasValue(PropNameY);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
bool isSkPoint(const JsiValue &value) {
|
|
25
|
+
return value.getType() == PropType::HostObject &&
|
|
26
|
+
std::dynamic_pointer_cast<JsiSkPoint>(value.getAsHostObject()) !=
|
|
27
|
+
nullptr;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
bool isIndexable(const JsiValue &value) {
|
|
31
|
+
return value.getType() == PropType::Object && value.hasValue(PropName0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void processValue(std::vector<SkScalar> &values, const JsiValue &value) {
|
|
35
|
+
if (value.getType() == PropType::Number) {
|
|
36
|
+
auto n = value.getAsNumber();
|
|
37
|
+
values.push_back(n);
|
|
38
|
+
} else if (value.getType() == PropType::Array) {
|
|
39
|
+
auto arrayValue = value.getAsArray();
|
|
40
|
+
for (size_t i = 0; i < arrayValue.size(); ++i) {
|
|
41
|
+
auto a = arrayValue[i];
|
|
42
|
+
processValue(values, a);
|
|
43
|
+
}
|
|
44
|
+
} else if (isJSPoint(value) || isSkPoint(value)) {
|
|
45
|
+
auto pointValue = PointProp::processValue(value);
|
|
46
|
+
values.push_back(pointValue.x());
|
|
47
|
+
values.push_back(pointValue.y());
|
|
48
|
+
} else if (isIndexable(value)) {
|
|
49
|
+
auto length = value.getKeys().size();
|
|
50
|
+
for (size_t i = 0; i < length; ++i) {
|
|
51
|
+
values.push_back(
|
|
52
|
+
value.getValue(JsiPropId::get(std::to_string(i))).getAsNumber());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
void processUniform(std::vector<SkScalar> &values, SkRuntimeEffect *source,
|
|
58
|
+
const JsiValue &uniforms, SkRuntimeShaderBuilder *rtb) {
|
|
59
|
+
auto uniformsCount = source->uniforms().size();
|
|
60
|
+
for (size_t i = 0; i < uniformsCount; ++i) {
|
|
61
|
+
auto it = source->uniforms().begin() + i;
|
|
62
|
+
auto name = JsiPropId::get(std::string(it->name));
|
|
63
|
+
if (!uniforms.hasValue(name)) {
|
|
64
|
+
throw std::runtime_error("The runtime effect has the uniform value \"" +
|
|
65
|
+
std::string(name) +
|
|
66
|
+
"\" declared, but it is missing from the "
|
|
67
|
+
"uniforms property of the Runtime effect.");
|
|
68
|
+
}
|
|
69
|
+
auto value = uniforms.getValue(name);
|
|
70
|
+
if (rtb == nullptr) {
|
|
71
|
+
processValue(values, value);
|
|
72
|
+
} else {
|
|
73
|
+
std::vector<SkScalar> uniformValue;
|
|
74
|
+
processValue(uniformValue, value);
|
|
75
|
+
rtb->uniform(name).set(uniformValue.data(),
|
|
76
|
+
static_cast<int>(uniformValue.size()));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
19
81
|
class UniformsProp : public DerivedSkProp<SkData> {
|
|
20
82
|
public:
|
|
21
83
|
UniformsProp(PropId name, NodeProp *sourceProp) : DerivedSkProp<SkData>() {
|
|
@@ -32,7 +94,9 @@ public:
|
|
|
32
94
|
auto source = _sourceProp->value().getAs<JsiSkRuntimeEffect>()->getObject();
|
|
33
95
|
|
|
34
96
|
// Flatten uniforms from property
|
|
35
|
-
|
|
97
|
+
std::vector<SkScalar> uniformValues;
|
|
98
|
+
processUniform(uniformValues, source.get(), _uniformsProp->value(),
|
|
99
|
+
nullptr);
|
|
36
100
|
|
|
37
101
|
// Cast uniforms according to the declaration in the shader
|
|
38
102
|
auto uniformsData = castUniforms(source.get(), uniformValues);
|
|
@@ -41,11 +105,30 @@ public:
|
|
|
41
105
|
setDerivedValue(uniformsData);
|
|
42
106
|
}
|
|
43
107
|
|
|
108
|
+
void processUniforms(SkRuntimeShaderBuilder &rtb) {
|
|
109
|
+
if (!_uniformsProp->isSet()) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Get the effect
|
|
114
|
+
auto source = _sourceProp->value().getAs<JsiSkRuntimeEffect>()->getObject();
|
|
115
|
+
// Flatten uniforms from property
|
|
116
|
+
std::vector<SkScalar> uniformValues;
|
|
117
|
+
processUniform(uniformValues, source.get(), _uniformsProp->value(), &rtb);
|
|
118
|
+
}
|
|
119
|
+
|
|
44
120
|
private:
|
|
45
121
|
sk_sp<SkData> castUniforms(SkRuntimeEffect *source,
|
|
46
122
|
const std::vector<SkScalar> &values) {
|
|
47
123
|
// Create memory for uniforms
|
|
48
|
-
auto
|
|
124
|
+
auto uniformSize = source->uniformSize();
|
|
125
|
+
if (values.size() * sizeof(float) != uniformSize) {
|
|
126
|
+
throw std::runtime_error(
|
|
127
|
+
"Uniforms size differs from effect's uniform size. Received " +
|
|
128
|
+
std::to_string(values.size()) + " expected " +
|
|
129
|
+
std::to_string(uniformSize / sizeof(float)));
|
|
130
|
+
}
|
|
131
|
+
auto uniformsData = SkData::MakeUninitialized(uniformSize);
|
|
49
132
|
|
|
50
133
|
// Loop through all uniforms in the effect and load data from the flattened
|
|
51
134
|
// array of values
|
|
@@ -57,7 +140,7 @@ private:
|
|
|
57
140
|
const std::size_t offset = reu.slot + j;
|
|
58
141
|
float fValue = values.at(offset);
|
|
59
142
|
int iValue = static_cast<int>(fValue);
|
|
60
|
-
auto value = reu.isInteger ? iValue : fValue;
|
|
143
|
+
auto value = reu.isInteger ? SkBits2Float(iValue) : fValue;
|
|
61
144
|
memcpy(SkTAddOffset<void>(uniformsData->writable_data(),
|
|
62
145
|
offset * sizeof(value)),
|
|
63
146
|
&value, sizeof(value));
|
|
@@ -67,126 +150,6 @@ private:
|
|
|
67
150
|
return uniformsData;
|
|
68
151
|
}
|
|
69
152
|
|
|
70
|
-
std::vector<SkScalar> flattenUniforms(SkRuntimeEffect *source,
|
|
71
|
-
const JsiValue &propObject) {
|
|
72
|
-
auto uniformsCount = source->uniforms().size();
|
|
73
|
-
std::vector<SkScalar> uniformValues;
|
|
74
|
-
|
|
75
|
-
for (size_t i = 0; i < uniformsCount; ++i) {
|
|
76
|
-
auto it = source->uniforms().begin() + i;
|
|
77
|
-
auto name = JsiPropId::get(std::string(it->name));
|
|
78
|
-
|
|
79
|
-
if (!propObject.hasValue(name)) {
|
|
80
|
-
throw std::runtime_error("The runtime effect has the uniform value \"" +
|
|
81
|
-
std::string(name) +
|
|
82
|
-
"\" declared, but it is missing from the "
|
|
83
|
-
"uniforms property of the Runtime effect.");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
auto value = propObject.getValue(name);
|
|
87
|
-
|
|
88
|
-
// A uniform value can be a single number, a vector or an array of numbers
|
|
89
|
-
// Or an array of the above
|
|
90
|
-
if (value.getType() == PropType::Number) {
|
|
91
|
-
// Set numeric uniform
|
|
92
|
-
uniformValues.push_back(value.getAsNumber());
|
|
93
|
-
} else if (value.getType() == PropType::Array) {
|
|
94
|
-
// Array
|
|
95
|
-
auto arrayValue = value.getAsArray();
|
|
96
|
-
for (size_t n = 0; n < arrayValue.size(); ++n) {
|
|
97
|
-
auto a = arrayValue[n];
|
|
98
|
-
if (a.getType() == PropType::Number) {
|
|
99
|
-
uniformValues.push_back(a.getAsNumber());
|
|
100
|
-
} else {
|
|
101
|
-
for (size_t j = 0; j < a.getAsArray().size(); ++j) {
|
|
102
|
-
uniformValues.push_back(a.getAsArray()[j].getAsNumber());
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
} else if (value.getType() == PropType::HostObject ||
|
|
107
|
-
value.getType() == PropType::Object) {
|
|
108
|
-
// Vector (JsiSkPoint / JsiSkRect)
|
|
109
|
-
auto pointValue = PointProp::processValue(value);
|
|
110
|
-
uniformValues.push_back(pointValue.x());
|
|
111
|
-
uniformValues.push_back(pointValue.y());
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return uniformValues;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
NodeProp *_uniformsProp;
|
|
118
|
-
NodeProp *_sourceProp;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
class SimpleUniformsProp : public BaseDerivedProp {
|
|
122
|
-
public:
|
|
123
|
-
SimpleUniformsProp(PropId name, NodeProp *sourceProp) : BaseDerivedProp() {
|
|
124
|
-
_uniformsProp = addProperty(std::make_shared<NodeProp>(name));
|
|
125
|
-
_sourceProp = sourceProp;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
void processUniforms(SkRuntimeShaderBuilder &rtb) {
|
|
129
|
-
if (!_uniformsProp->isSet()) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
auto propObject = _uniformsProp->value();
|
|
134
|
-
auto source = _sourceProp->value().getAs<JsiSkRuntimeEffect>()->getObject();
|
|
135
|
-
|
|
136
|
-
auto uniformsCount = source->uniforms().size();
|
|
137
|
-
|
|
138
|
-
for (size_t i = 0; i < uniformsCount; ++i) {
|
|
139
|
-
auto it = source->uniforms().begin() + i;
|
|
140
|
-
auto name = JsiPropId::get(std::string(it->name));
|
|
141
|
-
|
|
142
|
-
if (!propObject.hasValue(name)) {
|
|
143
|
-
throw std::runtime_error("The runtime effect has the uniform value \"" +
|
|
144
|
-
std::string(name) +
|
|
145
|
-
"\" declared, but it is missing from the "
|
|
146
|
-
"uniforms property of the Runtime effect.");
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
auto value = propObject.getValue(name);
|
|
150
|
-
|
|
151
|
-
// A uniform value can be a single number, a vector or an array of numbers
|
|
152
|
-
// Or an array of the above
|
|
153
|
-
if (value.getType() == PropType::Number) {
|
|
154
|
-
// Set numeric uniform
|
|
155
|
-
rtb.uniform(name) = value.getAsNumber();
|
|
156
|
-
} else if (value.getType() == PropType::Array) {
|
|
157
|
-
// Array
|
|
158
|
-
auto arrayValue = value.getAsArray();
|
|
159
|
-
std::vector<SkScalar> set;
|
|
160
|
-
for (size_t n = 0; n < arrayValue.size(); ++n) {
|
|
161
|
-
auto a = arrayValue[n];
|
|
162
|
-
if (a.getType() == PropType::Number) {
|
|
163
|
-
set.push_back(a.getAsNumber());
|
|
164
|
-
} else {
|
|
165
|
-
for (size_t j = 0; j < a.getAsArray().size(); ++j) {
|
|
166
|
-
set.push_back(a.getAsArray()[j].getAsNumber());
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
rtb.uniform(name).set(set.data(), static_cast<int>(set.size()));
|
|
171
|
-
|
|
172
|
-
} else if (value.getType() == PropType::HostObject ||
|
|
173
|
-
value.getType() == PropType::Object) {
|
|
174
|
-
// Vector (JsiSkPoint / JsiSkRect)
|
|
175
|
-
auto pointValue = PointProp::processValue(value);
|
|
176
|
-
std::vector<SkScalar> set = {pointValue.x(), pointValue.y()};
|
|
177
|
-
|
|
178
|
-
rtb.uniform(name).set(set.data(), static_cast<int>(set.size()));
|
|
179
|
-
} else {
|
|
180
|
-
throw std::runtime_error("Unexpected type for uniform prop \"" +
|
|
181
|
-
std::string(name) + "\". Got " +
|
|
182
|
-
value.getTypeAsString(value.getType()));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
void updateDerivedValue() override {}
|
|
188
|
-
|
|
189
|
-
private:
|
|
190
153
|
NodeProp *_uniformsProp;
|
|
191
154
|
NodeProp *_sourceProp;
|
|
192
155
|
};
|
|
@@ -40,9 +40,9 @@ public:
|
|
|
40
40
|
bool hasColors() { return _colorsProp->isSet(); }
|
|
41
41
|
|
|
42
42
|
void updateDerivedValue() override {
|
|
43
|
-
SkVertices::VertexMode *vertextMode =
|
|
43
|
+
const SkVertices::VertexMode *vertextMode =
|
|
44
44
|
_vertexModeProp->getDerivedValue().get();
|
|
45
|
-
std::vector<SkColor> *colors = _colorsProp->getDerivedValue().get();
|
|
45
|
+
const std::vector<SkColor> *colors = _colorsProp->getDerivedValue().get();
|
|
46
46
|
auto vertices = _verticesProp->getDerivedValue();
|
|
47
47
|
auto textures = _texturesProp->getDerivedValue();
|
|
48
48
|
auto indices = _indicesProp->getDerivedValue();
|
|
@@ -142,12 +142,8 @@ protected:
|
|
|
142
142
|
@param runtime Current JS Runtime
|
|
143
143
|
*/
|
|
144
144
|
void notifyListeners(jsi::Runtime &runtime) {
|
|
145
|
-
std::
|
|
146
|
-
{
|
|
147
|
-
std::lock_guard<std::mutex> lock(_mutex);
|
|
148
|
-
tmp.insert(_listeners.cbegin(), _listeners.cend());
|
|
149
|
-
}
|
|
150
|
-
for (const auto &listener : tmp) {
|
|
145
|
+
std::lock_guard<std::mutex> lock(_mutex);
|
|
146
|
+
for (const auto &listener : _listeners) {
|
|
151
147
|
listener.second(runtime);
|
|
152
148
|
}
|
|
153
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isCircleScalarDef","def","cx","undefined","processCircle","Skia","c","Point","cy","r"],"sources":["Circle.ts"],"sourcesContent":["import type { Skia } from \"../../../skia/types\";\nimport type { CircleDef, ScalarCircleDef } from \"../../types\";\n\nexport const isCircleScalarDef = (def: CircleDef): def is ScalarCircleDef =>\n // We have an issue to check property existence on JSI backed instances\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (def as any).cx !== undefined;\n\nexport const processCircle = (Skia: Skia, def: CircleDef) => {\n if (isCircleScalarDef(def)) {\n return { c: Skia.Point(def.cx, def.cy), r: def.r };\n }\n return def;\n};\n"],"mappings":";;;;;;;AAGO,MAAMA,iBAAiB,GAAIC,GAAD,IAC/B;AACA;AACCA,GAAD,CAAaC,EAAb,KAAoBC,SAHf;;;;AAKA,MAAMC,aAAa,GAAG,CAACC,IAAD,EAAaJ,GAAb,KAAgC;EAC3D,IAAID,iBAAiB,CAACC,GAAD,CAArB,EAA4B;IAC1B,OAAO;MAAEK,CAAC,EAAED,IAAI,CAACE,KAAL,CAAWN,GAAG,CAACC,EAAf,EAAmBD,GAAG,CAACO,EAAvB,CAAL;MAAiCC,CAAC,EAAER,GAAG,CAACQ;IAAxC,CAAP;EACD;;EACD,
|
|
1
|
+
{"version":3,"names":["isCircleScalarDef","def","cx","undefined","processCircle","Skia","c","Point","cy","r","x","y"],"sources":["Circle.ts"],"sourcesContent":["import type { Skia } from \"../../../skia/types\";\nimport type { CircleDef, ScalarCircleDef } from \"../../types\";\n\nexport const isCircleScalarDef = (def: CircleDef): def is ScalarCircleDef =>\n // We have an issue to check property existence on JSI backed instances\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (def as any).cx !== undefined;\n\nexport const processCircle = (Skia: Skia, def: CircleDef) => {\n if (isCircleScalarDef(def)) {\n return { c: Skia.Point(def.cx, def.cy), r: def.r };\n }\n return { ...def, c: def.c ?? { x: 0, y: 0 } };\n};\n"],"mappings":";;;;;;;AAGO,MAAMA,iBAAiB,GAAIC,GAAD,IAC/B;AACA;AACCA,GAAD,CAAaC,EAAb,KAAoBC,SAHf;;;;AAKA,MAAMC,aAAa,GAAG,CAACC,IAAD,EAAaJ,GAAb,KAAgC;EAC3D,IAAID,iBAAiB,CAACC,GAAD,CAArB,EAA4B;IAC1B,OAAO;MAAEK,CAAC,EAAED,IAAI,CAACE,KAAL,CAAWN,GAAG,CAACC,EAAf,EAAmBD,GAAG,CAACO,EAAvB,CAAL;MAAiCC,CAAC,EAAER,GAAG,CAACQ;IAAxC,CAAP;EACD;;EACD,OAAO,EAAE,GAAGR,GAAL;IAAUK,CAAC,EAAEL,GAAG,CAACK,CAAJ,IAAS;MAAEI,CAAC,EAAE,CAAL;MAAQC,CAAC,EAAE;IAAX;EAAtB,CAAP;AACD,CALM"}
|
|
@@ -20,7 +20,7 @@ const isRectCtor = def => def.rect === undefined;
|
|
|
20
20
|
|
|
21
21
|
const processRect = (Skia, def) => {
|
|
22
22
|
if (isRectCtor(def)) {
|
|
23
|
-
return Skia.XYWHRect(def.x, def.y, def.width, def.height);
|
|
23
|
+
return Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height);
|
|
24
24
|
} else {
|
|
25
25
|
return def.rect;
|
|
26
26
|
}
|
|
@@ -30,8 +30,8 @@ exports.processRect = processRect;
|
|
|
30
30
|
|
|
31
31
|
const processRRect = (Skia, def) => {
|
|
32
32
|
if (isRRectCtor(def)) {
|
|
33
|
-
const r = (0, _Radius.processRadius)(Skia, def.r);
|
|
34
|
-
return Skia.RRectXY(Skia.XYWHRect(def.x, def.y, def.width, def.height), r.x, r.y);
|
|
33
|
+
const r = (0, _Radius.processRadius)(Skia, def.r ?? 0);
|
|
34
|
+
return Skia.RRectXY(Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height), r.x, r.y);
|
|
35
35
|
} else {
|
|
36
36
|
return def.rect;
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isEdge","pos","b","x","y","width","height","isRRectCtor","def","rect","undefined","isRectCtor","processRect","Skia","XYWHRect","processRRect","r","processRadius","RRectXY"],"sources":["Rect.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Skia, SkRect, Vector } from \"../../../skia/types\";\nimport type { RectCtor, RectDef, RRectCtor, RRectDef } from \"../../types\";\n\nimport { processRadius } from \"./Radius\";\n\nexport const isEdge = (pos: Vector, b: SkRect) =>\n pos.x === b.x || pos.y === b.y || pos.x === b.width || pos.y === b.height;\n\n// We have an issue to check property existence on JSI backed instances\nconst isRRectCtor = (def: RRectDef): def is RRectCtor =>\n (def as any).rect === undefined;\n// We have an issue to check property existence on JSI backed instances\nconst isRectCtor = (def: RectDef): def is RectCtor =>\n (def as any).rect === undefined;\n\nexport const processRect = (Skia: Skia, def: RectDef) => {\n if (isRectCtor(def)) {\n return Skia.XYWHRect(def.x, def.y, def.width, def.height);\n } else {\n return def.rect;\n }\n};\n\nexport const processRRect = (Skia: Skia, def: RRectDef) => {\n if (isRRectCtor(def)) {\n const r = processRadius(Skia, def.r);\n return Skia.RRectXY(\n Skia.XYWHRect(def.x, def.y, def.width, def.height),\n r.x,\n r.y\n );\n } else {\n return def.rect;\n }\n};\n"],"mappings":";;;;;;;AAIA;;AAJA;AAMO,MAAMA,MAAM,GAAG,CAACC,GAAD,EAAcC,CAAd,KACpBD,GAAG,CAACE,CAAJ,KAAUD,CAAC,CAACC,CAAZ,IAAiBF,GAAG,CAACG,CAAJ,KAAUF,CAAC,CAACE,CAA7B,IAAkCH,GAAG,CAACE,CAAJ,KAAUD,CAAC,CAACG,KAA9C,IAAuDJ,GAAG,CAACG,CAAJ,KAAUF,CAAC,CAACI,MAD9D,C,CAGP;;;;;AACA,MAAMC,WAAW,GAAIC,GAAD,IACjBA,GAAD,CAAaC,IAAb,KAAsBC,SADxB,C,CAEA;;;AACA,MAAMC,UAAU,GAAIH,GAAD,IAChBA,GAAD,CAAaC,IAAb,KAAsBC,SADxB;;AAGO,MAAME,WAAW,GAAG,CAACC,IAAD,EAAaL,GAAb,KAA8B;EACvD,IAAIG,UAAU,CAACH,GAAD,CAAd,EAAqB;IACnB,OAAOK,IAAI,CAACC,QAAL,CAAcN,GAAG,CAACL,
|
|
1
|
+
{"version":3,"names":["isEdge","pos","b","x","y","width","height","isRRectCtor","def","rect","undefined","isRectCtor","processRect","Skia","XYWHRect","processRRect","r","processRadius","RRectXY"],"sources":["Rect.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Skia, SkRect, Vector } from \"../../../skia/types\";\nimport type { RectCtor, RectDef, RRectCtor, RRectDef } from \"../../types\";\n\nimport { processRadius } from \"./Radius\";\n\nexport const isEdge = (pos: Vector, b: SkRect) =>\n pos.x === b.x || pos.y === b.y || pos.x === b.width || pos.y === b.height;\n\n// We have an issue to check property existence on JSI backed instances\nconst isRRectCtor = (def: RRectDef): def is RRectCtor =>\n (def as any).rect === undefined;\n// We have an issue to check property existence on JSI backed instances\nconst isRectCtor = (def: RectDef): def is RectCtor =>\n (def as any).rect === undefined;\n\nexport const processRect = (Skia: Skia, def: RectDef) => {\n if (isRectCtor(def)) {\n return Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height);\n } else {\n return def.rect;\n }\n};\n\nexport const processRRect = (Skia: Skia, def: RRectDef) => {\n if (isRRectCtor(def)) {\n const r = processRadius(Skia, def.r ?? 0);\n return Skia.RRectXY(\n Skia.XYWHRect(def.x ?? 0, def.y ?? 0, def.width, def.height),\n r.x,\n r.y\n );\n } else {\n return def.rect;\n }\n};\n"],"mappings":";;;;;;;AAIA;;AAJA;AAMO,MAAMA,MAAM,GAAG,CAACC,GAAD,EAAcC,CAAd,KACpBD,GAAG,CAACE,CAAJ,KAAUD,CAAC,CAACC,CAAZ,IAAiBF,GAAG,CAACG,CAAJ,KAAUF,CAAC,CAACE,CAA7B,IAAkCH,GAAG,CAACE,CAAJ,KAAUD,CAAC,CAACG,KAA9C,IAAuDJ,GAAG,CAACG,CAAJ,KAAUF,CAAC,CAACI,MAD9D,C,CAGP;;;;;AACA,MAAMC,WAAW,GAAIC,GAAD,IACjBA,GAAD,CAAaC,IAAb,KAAsBC,SADxB,C,CAEA;;;AACA,MAAMC,UAAU,GAAIH,GAAD,IAChBA,GAAD,CAAaC,IAAb,KAAsBC,SADxB;;AAGO,MAAME,WAAW,GAAG,CAACC,IAAD,EAAaL,GAAb,KAA8B;EACvD,IAAIG,UAAU,CAACH,GAAD,CAAd,EAAqB;IACnB,OAAOK,IAAI,CAACC,QAAL,CAAcN,GAAG,CAACL,CAAJ,IAAS,CAAvB,EAA0BK,GAAG,CAACJ,CAAJ,IAAS,CAAnC,EAAsCI,GAAG,CAACH,KAA1C,EAAiDG,GAAG,CAACF,MAArD,CAAP;EACD,CAFD,MAEO;IACL,OAAOE,GAAG,CAACC,IAAX;EACD;AACF,CANM;;;;AAQA,MAAMM,YAAY,GAAG,CAACF,IAAD,EAAaL,GAAb,KAA+B;EACzD,IAAID,WAAW,CAACC,GAAD,CAAf,EAAsB;IACpB,MAAMQ,CAAC,GAAG,IAAAC,qBAAA,EAAcJ,IAAd,EAAoBL,GAAG,CAACQ,CAAJ,IAAS,CAA7B,CAAV;IACA,OAAOH,IAAI,CAACK,OAAL,CACLL,IAAI,CAACC,QAAL,CAAcN,GAAG,CAACL,CAAJ,IAAS,CAAvB,EAA0BK,GAAG,CAACJ,CAAJ,IAAS,CAAnC,EAAsCI,GAAG,CAACH,KAA1C,EAAiDG,GAAG,CAACF,MAArD,CADK,EAELU,CAAC,CAACb,CAFG,EAGLa,CAAC,CAACZ,CAHG,CAAP;EAKD,CAPD,MAOO;IACL,OAAOI,GAAG,CAACC,IAAX;EACD;AACF,CAXM"}
|
|
@@ -27,7 +27,7 @@ const deflate = function (Skia, box, dx, dy) {
|
|
|
27
27
|
|
|
28
28
|
class BoxShadowNode extends _Node.JsiDeclarationNode {
|
|
29
29
|
constructor(ctx, props) {
|
|
30
|
-
super(ctx, _types2.DeclarationType.Unknown, _types2.NodeType.
|
|
30
|
+
super(ctx, _types2.DeclarationType.Unknown, _types2.NodeType.BoxShadow, props);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
materialize() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["inflate","Skia","box","dx","dy","tx","ty","RRectXY","XYWHRect","rect","x","y","width","height","rx","ry","deflate","BoxShadowNode","JsiDeclarationNode","constructor","ctx","props","DeclarationType","Unknown","NodeType","
|
|
1
|
+
{"version":3,"names":["inflate","Skia","box","dx","dy","tx","ty","RRectXY","XYWHRect","rect","x","y","width","height","rx","ry","deflate","BoxShadowNode","JsiDeclarationNode","constructor","ctx","props","DeclarationType","Unknown","NodeType","BoxShadow","materialize","BoxNode","JsiRenderNode","Box","renderNode","canvas","paint","defaultBox","opacity","getAlphaf","isRRect","shadows","_children","map","node","filter","n","shadow","inner","color","blur","spread","lPaint","Paint","setColor","Color","setAlphaf","setMaskFilter","MaskFilter","MakeBlur","BlurStyle","Normal","drawRRect","delta","Point","Math","abs","save","clipRRect","ClipOp","Intersect","outer","drawDRRect","restore"],"sources":["Box.ts"],"sourcesContent":["import type { SkRRect, Skia } from \"../../../skia/types\";\nimport { BlurStyle, ClipOp, isRRect } from \"../../../skia/types\";\nimport type { DrawingContext } from \"../../types\";\nimport { DeclarationType, NodeType } from \"../../types\";\nimport type { BoxShadowProps, BoxProps } from \"../../types/Drawings\";\nimport type { NodeContext } from \"../Node\";\nimport { JsiDeclarationNode } from \"../Node\";\nimport { JsiRenderNode } from \"../RenderNode\";\n\nconst inflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) =>\n Skia.RRectXY(\n Skia.XYWHRect(\n box.rect.x - dx + tx,\n box.rect.y - dy + ty,\n box.rect.width + 2 * dx,\n box.rect.height + 2 * dy\n ),\n box.rx + dx,\n box.ry + dy\n );\n\nconst deflate = (\n Skia: Skia,\n box: SkRRect,\n dx: number,\n dy: number,\n tx = 0,\n ty = 0\n) => inflate(Skia, box, -dx, -dy, tx, ty);\n\nexport class BoxShadowNode extends JsiDeclarationNode<\n BoxShadowProps,\n BoxShadowProps\n> {\n constructor(ctx: NodeContext, props: BoxShadowProps) {\n super(ctx, DeclarationType.Unknown, NodeType.BoxShadow, props);\n }\n\n materialize() {\n return this.props;\n }\n}\n\nexport class BoxNode extends JsiRenderNode<BoxProps> {\n constructor(ctx: NodeContext, props: BoxProps) {\n super(ctx, NodeType.Box, props);\n }\n\n renderNode({ canvas, paint }: DrawingContext) {\n const { box: defaultBox } = this.props;\n const opacity = paint.getAlphaf();\n const box = isRRect(defaultBox)\n ? defaultBox\n : this.Skia.RRectXY(defaultBox, 0, 0);\n const shadows = this._children\n .map((node) => {\n if (node instanceof BoxShadowNode) {\n return node.materialize();\n }\n return null;\n })\n .filter((n): n is BoxShadowProps => n !== null);\n shadows\n .filter((shadow) => !shadow.inner)\n .map((shadow) => {\n const { color = \"black\", blur, spread = 0, dx = 0, dy = 0 } = shadow;\n const lPaint = this.Skia.Paint();\n lPaint.setColor(this.Skia.Color(color));\n lPaint.setAlphaf(paint.getAlphaf() * opacity);\n lPaint.setMaskFilter(\n this.Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)\n );\n canvas.drawRRect(\n inflate(this.Skia, box, spread, spread, dx, dy),\n lPaint\n );\n });\n\n canvas.drawRRect(box, paint);\n\n shadows\n .filter((shadow) => shadow.inner)\n .map((shadow) => {\n const { color = \"black\", blur, spread = 0, dx = 0, dy = 0 } = shadow;\n const delta = this.Skia.Point(10 + Math.abs(dx), 10 + Math.abs(dy));\n canvas.save();\n canvas.clipRRect(box, ClipOp.Intersect, false);\n const lPaint = this.Skia.Paint();\n lPaint.setColor(this.Skia.Color(color));\n lPaint.setAlphaf(paint.getAlphaf() * opacity);\n\n lPaint.setMaskFilter(\n this.Skia.MaskFilter.MakeBlur(BlurStyle.Normal, blur, true)\n );\n const inner = deflate(this.Skia, box, spread, spread, dx, dy);\n const outer = inflate(this.Skia, box, delta.x, delta.y);\n canvas.drawDRRect(outer, inner, lPaint);\n canvas.restore();\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -18,9 +18,9 @@ class ImageNode extends _DrawingNode.JsiDrawingNode {
|
|
|
18
18
|
|
|
19
19
|
deriveProps() {
|
|
20
20
|
const {
|
|
21
|
-
image
|
|
22
|
-
fit
|
|
21
|
+
image
|
|
23
22
|
} = this.props;
|
|
23
|
+
const fit = this.props.fit ?? "contain";
|
|
24
24
|
const rect = (0, _datatypes.processRect)(this.Skia, this.props);
|
|
25
25
|
const {
|
|
26
26
|
src,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ImageNode","JsiDrawingNode","constructor","ctx","props","NodeType","Image","deriveProps","image","fit","rect","processRect","Skia","src","dst","fitRects","x","y","width","height","draw","canvas","paint","derived","Error","drawImageRect"],"sources":["ImageNode.ts"],"sourcesContent":["import type { SkRect } from \"../../../skia/types\";\nimport type { DrawingContext, ImageProps } from \"../../types\";\nimport { NodeType } from \"../../types\";\nimport { fitRects, processRect } from \"../datatypes\";\nimport { JsiDrawingNode } from \"../DrawingNode\";\nimport type { NodeContext } from \"../Node\";\n\nexport class ImageNode extends JsiDrawingNode<\n ImageProps,\n { src: SkRect; dst: SkRect }\n> {\n constructor(ctx: NodeContext, props: ImageProps) {\n super(ctx, NodeType.Image, props);\n }\n\n deriveProps() {\n const { image
|
|
1
|
+
{"version":3,"names":["ImageNode","JsiDrawingNode","constructor","ctx","props","NodeType","Image","deriveProps","image","fit","rect","processRect","Skia","src","dst","fitRects","x","y","width","height","draw","canvas","paint","derived","Error","drawImageRect"],"sources":["ImageNode.ts"],"sourcesContent":["import type { SkRect } from \"../../../skia/types\";\nimport type { DrawingContext, ImageProps } from \"../../types\";\nimport { NodeType } from \"../../types\";\nimport { fitRects, processRect } from \"../datatypes\";\nimport { JsiDrawingNode } from \"../DrawingNode\";\nimport type { NodeContext } from \"../Node\";\n\nexport class ImageNode extends JsiDrawingNode<\n ImageProps,\n { src: SkRect; dst: SkRect }\n> {\n constructor(ctx: NodeContext, props: ImageProps) {\n super(ctx, NodeType.Image, props);\n }\n\n deriveProps() {\n const { image } = this.props;\n const fit = this.props.fit ?? \"contain\";\n const rect = processRect(this.Skia, this.props);\n const { src, dst } = fitRects(\n fit,\n {\n x: 0,\n y: 0,\n width: image.width(),\n height: image.height(),\n },\n rect\n );\n return { src, dst };\n }\n\n draw({ canvas, paint }: DrawingContext) {\n const { image } = this.props;\n if (!this.derived) {\n throw new Error(\"ImageNode: src and dst are undefined\");\n }\n const { src, dst } = this.derived;\n canvas.drawImageRect(image, src, dst, paint);\n }\n}\n"],"mappings":";;;;;;;AAEA;;AACA;;AACA;;AAGO,MAAMA,SAAN,SAAwBC,2BAAxB,CAGL;EACAC,WAAW,CAACC,GAAD,EAAmBC,KAAnB,EAAsC;IAC/C,MAAMD,GAAN,EAAWE,eAAA,CAASC,KAApB,EAA2BF,KAA3B;EACD;;EAEDG,WAAW,GAAG;IACZ,MAAM;MAAEC;IAAF,IAAY,KAAKJ,KAAvB;IACA,MAAMK,GAAG,GAAG,KAAKL,KAAL,CAAWK,GAAX,IAAkB,SAA9B;IACA,MAAMC,IAAI,GAAG,IAAAC,sBAAA,EAAY,KAAKC,IAAjB,EAAuB,KAAKR,KAA5B,CAAb;IACA,MAAM;MAAES,GAAF;MAAOC;IAAP,IAAe,IAAAC,mBAAA,EACnBN,GADmB,EAEnB;MACEO,CAAC,EAAE,CADL;MAEEC,CAAC,EAAE,CAFL;MAGEC,KAAK,EAAEV,KAAK,CAACU,KAAN,EAHT;MAIEC,MAAM,EAAEX,KAAK,CAACW,MAAN;IAJV,CAFmB,EAQnBT,IARmB,CAArB;IAUA,OAAO;MAAEG,GAAF;MAAOC;IAAP,CAAP;EACD;;EAEDM,IAAI,OAAoC;IAAA,IAAnC;MAAEC,MAAF;MAAUC;IAAV,CAAmC;IACtC,MAAM;MAAEd;IAAF,IAAY,KAAKJ,KAAvB;;IACA,IAAI,CAAC,KAAKmB,OAAV,EAAmB;MACjB,MAAM,IAAIC,KAAJ,CAAU,sCAAV,CAAN;IACD;;IACD,MAAM;MAAEX,GAAF;MAAOC;IAAP,IAAe,KAAKS,OAA1B;IACAF,MAAM,CAACI,aAAP,CAAqBjB,KAArB,EAA4BK,GAA5B,EAAiCC,GAAjC,EAAsCQ,KAAtC;EACD;;AA7BD"}
|
|
@@ -122,7 +122,7 @@ exports.BlurImageFilterNode = BlurImageFilterNode;
|
|
|
122
122
|
|
|
123
123
|
class DropShadowImageFilterNode extends ImageFilterDeclaration {
|
|
124
124
|
constructor(ctx, props) {
|
|
125
|
-
super(ctx, _types2.NodeType.
|
|
125
|
+
super(ctx, _types2.NodeType.DropShadowImageFilter, props);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
materialize() {
|