@shopify/react-native-skia 0.1.221 → 0.1.223
Sign up to get free protection for your applications and to get access to all the features.
- package/android/cpp/rnskia-android/RNSkAndroidView.h +3 -0
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +1 -0
- package/android/cpp/rnskia-android/SkiaOpenGLHelper.h +0 -1
- package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +46 -6
- package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +3 -3
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +8 -14
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +93 -105
- package/cpp/api/JsiSkApi.h +5 -0
- package/cpp/api/JsiSkFontMgrFactory.h +9 -4
- package/cpp/api/JsiSkParagraph.h +135 -0
- package/cpp/api/JsiSkParagraphBuilder.h +159 -0
- package/cpp/api/JsiSkParagraphStyle.h +124 -0
- package/cpp/api/JsiSkStrutStyle.h +96 -0
- package/cpp/api/JsiSkTextStyle.h +185 -0
- package/cpp/jsi/JsiHostObject.h +21 -0
- package/cpp/rnskia/dom/JsiDomApi.h +4 -0
- package/cpp/rnskia/dom/nodes/JsiParagraphNode.h +62 -0
- package/cpp/rnskia/dom/props/ParagraphProp.h +45 -0
- package/cpp/skia/modules/skunicode/include/SkUnicode.h +312 -0
- package/cpp/skia/src/base/SkTInternalLList.h +304 -0
- package/cpp/skia/src/base/SkUTF.h +95 -0
- package/cpp/skia/src/core/SkLRUCache.h +130 -0
- package/cpp/utils/RNSkLog.h +3 -3
- package/lib/commonjs/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/commonjs/dom/nodes/JsiSkDOM.js +7 -0
- package/lib/commonjs/dom/nodes/JsiSkDOM.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.js +41 -0
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.js.map +1 -0
- package/lib/commonjs/dom/types/NodeType.d.ts +2 -1
- package/lib/commonjs/dom/types/NodeType.js +1 -0
- package/lib/commonjs/dom/types/NodeType.js.map +1 -1
- package/lib/commonjs/dom/types/Paragraph.d.ts +8 -0
- package/lib/commonjs/dom/types/Paragraph.js +6 -0
- package/lib/commonjs/dom/types/Paragraph.js.map +1 -0
- package/lib/commonjs/dom/types/SkDOM.d.ts +2 -0
- package/lib/commonjs/dom/types/SkDOM.js.map +1 -1
- package/lib/commonjs/dom/types/index.d.ts +1 -0
- package/lib/commonjs/dom/types/index.js +13 -0
- package/lib/commonjs/dom/types/index.js.map +1 -1
- package/lib/commonjs/renderer/HostComponents.d.ts +3 -1
- package/lib/commonjs/renderer/HostComponents.js +4 -0
- package/lib/commonjs/renderer/HostComponents.js.map +1 -1
- package/lib/commonjs/renderer/components/index.d.ts +1 -0
- package/lib/commonjs/renderer/components/index.js +13 -0
- package/lib/commonjs/renderer/components/index.js.map +1 -1
- package/lib/commonjs/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/commonjs/renderer/components/paragraph/Paragraph.js +17 -0
- package/lib/commonjs/renderer/components/paragraph/Paragraph.js.map +1 -0
- package/lib/commonjs/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/commonjs/renderer/components/paragraph/index.js +19 -0
- package/lib/commonjs/renderer/components/paragraph/index.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.js +6 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.js +18 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.js +36 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.js +35 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/commonjs/skia/types/Paragraph/index.js +84 -0
- package/lib/commonjs/skia/types/Paragraph/index.js.map +1 -0
- package/lib/commonjs/skia/types/Skia.d.ts +2 -0
- package/lib/commonjs/skia/types/Skia.js.map +1 -1
- package/lib/commonjs/skia/types/index.d.ts +1 -0
- package/lib/commonjs/skia/types/index.js +13 -0
- package/lib/commonjs/skia/types/index.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImage.js +0 -6
- package/lib/commonjs/skia/web/JsiSkImage.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/commonjs/skia/web/JsiSkParagraph.js +91 -0
- package/lib/commonjs/skia/web/JsiSkParagraph.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.js +85 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.js +34 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.js +59 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.js +54 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkia.js +4 -1
- package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
- package/lib/module/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/module/dom/nodes/JsiSkDOM.js +6 -0
- package/lib/module/dom/nodes/JsiSkDOM.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/module/dom/nodes/drawings/ParagraphNode.js +30 -0
- package/lib/module/dom/nodes/drawings/ParagraphNode.js.map +1 -0
- package/lib/module/dom/types/NodeType.d.ts +2 -1
- package/lib/module/dom/types/NodeType.js +1 -0
- package/lib/module/dom/types/NodeType.js.map +1 -1
- package/lib/module/dom/types/Paragraph.d.ts +8 -0
- package/lib/module/dom/types/Paragraph.js +2 -0
- package/lib/module/dom/types/Paragraph.js.map +1 -0
- package/lib/module/dom/types/SkDOM.d.ts +2 -0
- package/lib/module/dom/types/SkDOM.js.map +1 -1
- package/lib/module/dom/types/index.d.ts +1 -0
- package/lib/module/dom/types/index.js +1 -0
- package/lib/module/dom/types/index.js.map +1 -1
- package/lib/module/renderer/HostComponents.d.ts +3 -1
- package/lib/module/renderer/HostComponents.js +4 -0
- package/lib/module/renderer/HostComponents.js.map +1 -1
- package/lib/module/renderer/components/index.d.ts +1 -0
- package/lib/module/renderer/components/index.js +1 -0
- package/lib/module/renderer/components/index.js.map +1 -1
- package/lib/module/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/module/renderer/components/paragraph/Paragraph.js +5 -0
- package/lib/module/renderer/components/paragraph/Paragraph.js.map +1 -0
- package/lib/module/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/module/renderer/components/paragraph/index.js +2 -0
- package/lib/module/renderer/components/paragraph/index.js.map +1 -0
- package/lib/module/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/module/skia/types/Paragraph/Paragraph.js +2 -0
- package/lib/module/skia/types/Paragraph/Paragraph.js.map +1 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.js +11 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.js.map +1 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.js +27 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.js.map +1 -0
- package/lib/module/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/module/skia/types/Paragraph/TextStyle.js +26 -0
- package/lib/module/skia/types/Paragraph/TextStyle.js.map +1 -0
- package/lib/module/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/module/skia/types/Paragraph/index.js +7 -0
- package/lib/module/skia/types/Paragraph/index.js.map +1 -0
- package/lib/module/skia/types/Skia.d.ts +2 -0
- package/lib/module/skia/types/Skia.js.map +1 -1
- package/lib/module/skia/types/index.d.ts +1 -0
- package/lib/module/skia/types/index.js +1 -0
- package/lib/module/skia/types/index.js.map +1 -1
- package/lib/module/skia/web/JsiSkImage.js +0 -6
- package/lib/module/skia/web/JsiSkImage.js.map +1 -1
- package/lib/module/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/module/skia/web/JsiSkParagraph.js +81 -0
- package/lib/module/skia/web/JsiSkParagraph.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.js +73 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.js +21 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.js +49 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.js.map +1 -0
- package/lib/module/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/lib/module/skia/web/JsiSkTextStyle.js +45 -0
- package/lib/module/skia/web/JsiSkTextStyle.js.map +1 -0
- package/lib/module/skia/web/JsiSkia.js +3 -1
- package/lib/module/skia/web/JsiSkia.js.map +1 -1
- package/lib/typescript/src/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/typescript/src/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/typescript/src/dom/types/NodeType.d.ts +2 -1
- package/lib/typescript/src/dom/types/Paragraph.d.ts +8 -0
- package/lib/typescript/src/dom/types/SkDOM.d.ts +2 -0
- package/lib/typescript/src/dom/types/index.d.ts +1 -0
- package/lib/typescript/src/renderer/HostComponents.d.ts +3 -1
- package/lib/typescript/src/renderer/components/index.d.ts +1 -0
- package/lib/typescript/src/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/typescript/src/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/typescript/src/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/typescript/src/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/typescript/src/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/typescript/src/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/typescript/src/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/typescript/src/skia/types/Skia.d.ts +2 -0
- package/lib/typescript/src/skia/types/index.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/typescript/src/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
- package/libs/ios/libskottie.xcframework/Info.plist +5 -5
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
- package/libs/ios/libskparagraph.xcframework/Info.plist +5 -5
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
- package/libs/ios/libsvg.xcframework/Info.plist +5 -5
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
- package/package.json +1 -1
- package/src/dom/nodes/JsiSkDOM.ts +9 -0
- package/src/dom/nodes/drawings/ParagraphNode.ts +22 -0
- package/src/dom/types/NodeType.ts +3 -0
- package/src/dom/types/Paragraph.ts +10 -0
- package/src/dom/types/SkDOM.ts +4 -0
- package/src/dom/types/index.ts +1 -0
- package/src/renderer/HostComponents.ts +10 -0
- package/src/renderer/components/index.ts +2 -0
- package/src/renderer/components/paragraph/Paragraph.tsx +8 -0
- package/src/renderer/components/paragraph/index.ts +1 -0
- package/src/skia/types/Paragraph/Paragraph.ts +59 -0
- package/src/skia/types/Paragraph/ParagraphBuilder.ts +96 -0
- package/src/skia/types/Paragraph/ParagraphStyle.ts +45 -0
- package/src/skia/types/Paragraph/TextStyle.ts +70 -0
- package/src/skia/types/Paragraph/index.ts +6 -0
- package/src/skia/types/Skia.ts +3 -0
- package/src/skia/types/index.ts +1 -0
- package/src/skia/web/JsiSkImage.ts +0 -6
- package/src/skia/web/JsiSkParagraph.ts +69 -0
- package/src/skia/web/JsiSkParagraphBuilder.ts +99 -0
- package/src/skia/web/JsiSkParagraphBuilderFactory.ts +42 -0
- package/src/skia/web/JsiSkParagraphStyle.ts +65 -0
- package/src/skia/web/JsiSkTextStyle.ts +53 -0
- package/src/skia/web/JsiSkia.ts +2 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <memory>
|
4
|
+
#include <utility>
|
5
|
+
|
6
|
+
#include <jsi/jsi.h>
|
7
|
+
|
8
|
+
#include <JsiSkFont.h>
|
9
|
+
#include <JsiSkFontMgr.h>
|
10
|
+
#include <JsiSkHostObjects.h>
|
11
|
+
#include <JsiSkParagraph.h>
|
12
|
+
#include <JsiSkParagraphStyle.h>
|
13
|
+
#include <JsiSkTextStyle.h>
|
14
|
+
#include <JsiSkTypefaceFontProvider.h>
|
15
|
+
|
16
|
+
#pragma clang diagnostic push
|
17
|
+
#pragma clang diagnostic ignored "-Wdocumentation"
|
18
|
+
|
19
|
+
#include "ParagraphBuilder.h"
|
20
|
+
|
21
|
+
#pragma clang diagnostic pop
|
22
|
+
|
23
|
+
namespace RNSkia {
|
24
|
+
|
25
|
+
namespace jsi = facebook::jsi;
|
26
|
+
|
27
|
+
namespace para = skia::textlayout;
|
28
|
+
|
29
|
+
/**
|
30
|
+
Implementation of the ParagraphBuilder object in JSI
|
31
|
+
*/
|
32
|
+
class JsiSkParagraphBuilder : public JsiSkHostObject {
|
33
|
+
public:
|
34
|
+
JSI_API_TYPENAME("ParagraphBuilder");
|
35
|
+
|
36
|
+
JSI_HOST_FUNCTION(build) {
|
37
|
+
return jsi::Object::createFromHostObject(
|
38
|
+
runtime,
|
39
|
+
std::make_shared<JsiSkParagraph>(getContext(), _builder.get()));
|
40
|
+
}
|
41
|
+
|
42
|
+
JSI_HOST_FUNCTION(reset) {
|
43
|
+
_builder->Reset();
|
44
|
+
return jsi::Value::undefined();
|
45
|
+
}
|
46
|
+
|
47
|
+
JSI_HOST_FUNCTION(addText) {
|
48
|
+
auto text = getArgumentAsString(runtime, arguments, count, 0).utf8(runtime);
|
49
|
+
_builder->addText(text.c_str());
|
50
|
+
return thisValue.asObject(runtime);
|
51
|
+
}
|
52
|
+
|
53
|
+
JSI_HOST_FUNCTION(addPlaceholder) {
|
54
|
+
auto width =
|
55
|
+
count >= 1 ? getArgumentAsNumber(runtime, arguments, count, 0) : 0;
|
56
|
+
auto height =
|
57
|
+
count >= 2 ? getArgumentAsNumber(runtime, arguments, count, 1) : 0;
|
58
|
+
auto alignment =
|
59
|
+
count >= 3 ? static_cast<para::PlaceholderAlignment>(
|
60
|
+
getArgumentAsNumber(runtime, arguments, count, 2))
|
61
|
+
: para::PlaceholderAlignment::kBaseline;
|
62
|
+
auto baseline = count >= 4
|
63
|
+
? static_cast<para::TextBaseline>(
|
64
|
+
getArgumentAsNumber(runtime, arguments, count, 3))
|
65
|
+
: para::TextBaseline::kAlphabetic;
|
66
|
+
auto offset =
|
67
|
+
count >= 5 ? getArgumentAsNumber(runtime, arguments, count, 4) : 0;
|
68
|
+
|
69
|
+
para::PlaceholderStyle style(width, height, alignment, baseline, offset);
|
70
|
+
_builder->addPlaceholder(style);
|
71
|
+
|
72
|
+
return thisValue.asObject(runtime);
|
73
|
+
}
|
74
|
+
|
75
|
+
JSI_HOST_FUNCTION(pushStyle) {
|
76
|
+
auto textStyle = JsiSkTextStyle::fromValue(runtime, arguments[0]);
|
77
|
+
// Foreground paint
|
78
|
+
if (count >= 2) {
|
79
|
+
auto foreground =
|
80
|
+
tryGetArgumentAsHostObject<JsiSkPaint>(runtime, arguments, count, 1);
|
81
|
+
if (foreground) {
|
82
|
+
textStyle.setForegroundPaint(*foreground->getObject().get());
|
83
|
+
}
|
84
|
+
}
|
85
|
+
// Background paint
|
86
|
+
if (count >= 3) {
|
87
|
+
auto background =
|
88
|
+
tryGetArgumentAsHostObject<JsiSkPaint>(runtime, arguments, count, 2);
|
89
|
+
if (background) {
|
90
|
+
textStyle.setBackgroundPaint(*background->getObject().get());
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
_builder->pushStyle(textStyle);
|
95
|
+
|
96
|
+
return thisValue.asObject(runtime);
|
97
|
+
}
|
98
|
+
|
99
|
+
JSI_HOST_FUNCTION(pop) {
|
100
|
+
_builder->pop();
|
101
|
+
return thisValue.asObject(runtime);
|
102
|
+
}
|
103
|
+
|
104
|
+
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkParagraphBuilder, build),
|
105
|
+
JSI_EXPORT_FUNC(JsiSkParagraphBuilder, reset),
|
106
|
+
JSI_EXPORT_FUNC(JsiSkParagraphBuilder, addText),
|
107
|
+
JSI_EXPORT_FUNC(JsiSkParagraphBuilder, addPlaceholder),
|
108
|
+
JSI_EXPORT_FUNC(JsiSkParagraphBuilder, pushStyle),
|
109
|
+
JSI_EXPORT_FUNC(JsiSkParagraphBuilder, pop))
|
110
|
+
|
111
|
+
explicit JsiSkParagraphBuilder(std::shared_ptr<RNSkPlatformContext> context,
|
112
|
+
para::ParagraphStyle paragraphStyle,
|
113
|
+
sk_sp<SkFontMgr> fontManager)
|
114
|
+
: JsiSkHostObject(std::move(context)) {
|
115
|
+
_fontCollection = sk_make_sp<para::FontCollection>();
|
116
|
+
_fontCollection->setDefaultFontManager(getContext()->createFontMgr());
|
117
|
+
if (fontManager != nullptr) {
|
118
|
+
_fontCollection->setAssetFontManager(fontManager);
|
119
|
+
}
|
120
|
+
_fontCollection->enableFontFallback();
|
121
|
+
_builder = para::ParagraphBuilder::make(paragraphStyle, _fontCollection);
|
122
|
+
}
|
123
|
+
|
124
|
+
private:
|
125
|
+
std::unique_ptr<para::ParagraphBuilder> _builder;
|
126
|
+
sk_sp<para::FontCollection> _fontCollection;
|
127
|
+
};
|
128
|
+
|
129
|
+
/**
|
130
|
+
Implementation of the ParagraphBuilderFactory for making ParagraphBuilder JSI
|
131
|
+
object
|
132
|
+
*/
|
133
|
+
class JsiSkParagraphBuilderFactory : public JsiSkHostObject {
|
134
|
+
public:
|
135
|
+
JSI_HOST_FUNCTION(Make) {
|
136
|
+
// Get paragraph style from params
|
137
|
+
auto paragraphStyle =
|
138
|
+
count > 0 ? JsiSkParagraphStyle::fromValue(runtime, arguments[0])
|
139
|
+
: para::ParagraphStyle();
|
140
|
+
|
141
|
+
// get font manager
|
142
|
+
auto fontMgr =
|
143
|
+
count > 1 ? JsiSkTypefaceFontProvider::fromValue(runtime, arguments[1])
|
144
|
+
: nullptr;
|
145
|
+
|
146
|
+
// Create the paragraph builder
|
147
|
+
return jsi::Object::createFromHostObject(
|
148
|
+
runtime, std::make_shared<JsiSkParagraphBuilder>(
|
149
|
+
getContext(), paragraphStyle, fontMgr));
|
150
|
+
}
|
151
|
+
|
152
|
+
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkParagraphBuilderFactory, Make))
|
153
|
+
|
154
|
+
explicit JsiSkParagraphBuilderFactory(
|
155
|
+
std::shared_ptr<RNSkPlatformContext> context)
|
156
|
+
: JsiSkHostObject(std::move(context)) {}
|
157
|
+
};
|
158
|
+
|
159
|
+
} // namespace RNSkia
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <codecvt>
|
4
|
+
#include <locale>
|
5
|
+
#include <memory>
|
6
|
+
#include <string>
|
7
|
+
#include <utility>
|
8
|
+
#include <vector>
|
9
|
+
|
10
|
+
#include <jsi/jsi.h>
|
11
|
+
|
12
|
+
#include <JsiSkStrutStyle.h>
|
13
|
+
#include <JsiSkTextStyle.h>
|
14
|
+
|
15
|
+
#pragma clang diagnostic push
|
16
|
+
#pragma clang diagnostic ignored "-Wdocumentation"
|
17
|
+
|
18
|
+
#include "Paragraph.h"
|
19
|
+
|
20
|
+
#pragma clang diagnostic pop
|
21
|
+
|
22
|
+
namespace RNSkia {
|
23
|
+
|
24
|
+
namespace jsi = facebook::jsi;
|
25
|
+
|
26
|
+
namespace para = skia::textlayout;
|
27
|
+
/**
|
28
|
+
Implementation of the ParagraphStyle object in JSI
|
29
|
+
*/
|
30
|
+
class JsiSkParagraphStyle {
|
31
|
+
public:
|
32
|
+
/**
|
33
|
+
disableHinting?: boolean;
|
34
|
+
ellipsis?: string;
|
35
|
+
heightMultiplier?: number;
|
36
|
+
maxLines?: number;
|
37
|
+
replaceTabCharacters?: boolean;
|
38
|
+
strutStyle?: SkStrutStyle;
|
39
|
+
textAlign?: SkTextAlign;
|
40
|
+
textDirection?: SkTextDirection;
|
41
|
+
textHeightBehavior?: SkTextHeightBehavior;
|
42
|
+
textStyle?: SkTextStyle;
|
43
|
+
*/
|
44
|
+
static para::ParagraphStyle fromValue(jsi::Runtime &runtime,
|
45
|
+
const jsi::Value &value) {
|
46
|
+
para::ParagraphStyle retVal;
|
47
|
+
|
48
|
+
// Accept undefined && null
|
49
|
+
if (value.isUndefined() || value.isNull()) {
|
50
|
+
return retVal;
|
51
|
+
}
|
52
|
+
|
53
|
+
// Read values from the argument - expected to be a ParagraphStyle shaped
|
54
|
+
// object
|
55
|
+
if (!value.isObject()) {
|
56
|
+
throw jsi::JSError(runtime, "Expected SkParagrahStyle as first argument");
|
57
|
+
}
|
58
|
+
|
59
|
+
auto object = value.asObject(runtime);
|
60
|
+
|
61
|
+
if (object.hasProperty(runtime, "disableHinting")) {
|
62
|
+
auto propValue = object.getProperty(runtime, "disableHinting");
|
63
|
+
if (propValue.asBool()) {
|
64
|
+
retVal.turnHintingOff();
|
65
|
+
}
|
66
|
+
}
|
67
|
+
if (object.hasProperty(runtime, "ellipsis")) {
|
68
|
+
auto propValue = object.getProperty(runtime, "ellipsis");
|
69
|
+
auto inStr = propValue.asString(runtime).utf8(runtime);
|
70
|
+
std::u16string uStr;
|
71
|
+
fromUTF8(inStr, uStr);
|
72
|
+
retVal.setEllipsis(uStr);
|
73
|
+
}
|
74
|
+
if (object.hasProperty(runtime, "heightMultiplier")) {
|
75
|
+
auto propValue = object.getProperty(runtime, "heightMultiplier");
|
76
|
+
retVal.setHeight(propValue.asNumber());
|
77
|
+
}
|
78
|
+
if (object.hasProperty(runtime, "maxLines")) {
|
79
|
+
auto propValue = object.getProperty(runtime, "maxLines");
|
80
|
+
if (propValue.asNumber() != 0) {
|
81
|
+
retVal.setMaxLines(propValue.asNumber());
|
82
|
+
}
|
83
|
+
}
|
84
|
+
if (object.hasProperty(runtime, "replaceTabCharacters")) {
|
85
|
+
auto propValue = object.getProperty(runtime, "replaceTabCharacters");
|
86
|
+
retVal.setReplaceTabCharacters(propValue.asBool());
|
87
|
+
}
|
88
|
+
if (object.hasProperty(runtime, "textAlign")) {
|
89
|
+
auto propValue = object.getProperty(runtime, "textAlign");
|
90
|
+
retVal.setTextAlign(static_cast<para::TextAlign>(propValue.asNumber()));
|
91
|
+
}
|
92
|
+
if (object.hasProperty(runtime, "textDirection")) {
|
93
|
+
auto propValue = object.getProperty(runtime, "textDirection");
|
94
|
+
retVal.setTextDirection(
|
95
|
+
static_cast<para::TextDirection>(propValue.asNumber()));
|
96
|
+
}
|
97
|
+
if (object.hasProperty(runtime, "textHeightBehavior")) {
|
98
|
+
auto propValue = object.getProperty(runtime, "textHeightBehavior");
|
99
|
+
retVal.setTextHeightBehavior(
|
100
|
+
static_cast<para::TextHeightBehavior>(propValue.asNumber()));
|
101
|
+
}
|
102
|
+
if (object.hasProperty(runtime, "strutStyle")) {
|
103
|
+
auto propValue = object.getProperty(runtime, "strutStyle");
|
104
|
+
retVal.setStrutStyle(JsiSkStrutStyle::fromValue(runtime, propValue));
|
105
|
+
}
|
106
|
+
if (object.hasProperty(runtime, "textStyle")) {
|
107
|
+
auto propValue = object.getProperty(runtime, "textStyle");
|
108
|
+
retVal.setTextStyle(JsiSkTextStyle::fromValue(runtime, propValue));
|
109
|
+
}
|
110
|
+
|
111
|
+
return retVal;
|
112
|
+
}
|
113
|
+
|
114
|
+
private:
|
115
|
+
template <typename T>
|
116
|
+
static void fromUTF8(
|
117
|
+
const std::string &source,
|
118
|
+
std::basic_string<T, std::char_traits<T>, std::allocator<T>> &result) {
|
119
|
+
std::wstring_convert<std::codecvt_utf8_utf16<T>, T> convertor;
|
120
|
+
result = convertor.from_bytes(source);
|
121
|
+
}
|
122
|
+
};
|
123
|
+
|
124
|
+
} // namespace RNSkia
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <memory>
|
4
|
+
#include <string>
|
5
|
+
#include <utility>
|
6
|
+
#include <vector>
|
7
|
+
|
8
|
+
#include <jsi/jsi.h>
|
9
|
+
|
10
|
+
#pragma clang diagnostic push
|
11
|
+
#pragma clang diagnostic ignored "-Wdocumentation"
|
12
|
+
|
13
|
+
#include "Paragraph.h"
|
14
|
+
|
15
|
+
#pragma clang diagnostic pop
|
16
|
+
|
17
|
+
namespace RNSkia {
|
18
|
+
|
19
|
+
namespace jsi = facebook::jsi;
|
20
|
+
|
21
|
+
namespace para = skia::textlayout;
|
22
|
+
|
23
|
+
/**
|
24
|
+
Implementation of the TextStyle object in JSI for the paragraph builder
|
25
|
+
*/
|
26
|
+
class JsiSkStrutStyle {
|
27
|
+
public:
|
28
|
+
static para::StrutStyle fromValue(jsi::Runtime &runtime,
|
29
|
+
const jsi::Value &value) {
|
30
|
+
// Read values from the argument - expected to be a TextStyle shaped object
|
31
|
+
if (!value.isObject()) {
|
32
|
+
throw jsi::JSError(runtime, "Expected SkStrutStyle as first argument");
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
strutEnabled?: boolean;
|
36
|
+
fontFamilies?: string[];
|
37
|
+
fontStyle?: SkTextFontStyle;
|
38
|
+
fontSize?: number;
|
39
|
+
heightMultiplier?: number;
|
40
|
+
halfLeading?: boolean;
|
41
|
+
leading?: number;
|
42
|
+
forceStrutHeight?: boolean;
|
43
|
+
*/
|
44
|
+
auto object = value.asObject(runtime);
|
45
|
+
|
46
|
+
para::StrutStyle retVal;
|
47
|
+
|
48
|
+
if (object.hasProperty(runtime, "strutEnabled")) {
|
49
|
+
auto propValue = object.getProperty(runtime, "strutEnabled");
|
50
|
+
retVal.setStrutEnabled(propValue.asBool());
|
51
|
+
}
|
52
|
+
if (object.hasProperty(runtime, "fontFamilies")) {
|
53
|
+
auto propValue = object.getProperty(runtime, "fontFamilies")
|
54
|
+
.asObject(runtime)
|
55
|
+
.asArray(runtime);
|
56
|
+
auto size = propValue.size(runtime);
|
57
|
+
std::vector<SkString> families(size);
|
58
|
+
for (size_t i = 0; i < size; ++i) {
|
59
|
+
families[i] = propValue.getValueAtIndex(runtime, i)
|
60
|
+
.asString(runtime)
|
61
|
+
.utf8(runtime)
|
62
|
+
.c_str();
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
if (object.hasProperty(runtime, "fontStyle")) {
|
67
|
+
auto propValue = object.getProperty(runtime, "fontStyle");
|
68
|
+
retVal.setFontStyle(*JsiSkFontStyle::fromValue(runtime, propValue).get());
|
69
|
+
}
|
70
|
+
if (object.hasProperty(runtime, "fontSize")) {
|
71
|
+
auto propValue = object.getProperty(runtime, "fontSize");
|
72
|
+
retVal.setFontSize(propValue.asNumber());
|
73
|
+
}
|
74
|
+
if (object.hasProperty(runtime, "heightMultiplier")) {
|
75
|
+
auto propValue = object.getProperty(runtime, "heightMultiplier");
|
76
|
+
retVal.setHeight(propValue.asNumber());
|
77
|
+
retVal.setHeightOverride(true);
|
78
|
+
}
|
79
|
+
if (object.hasProperty(runtime, "halfLeading")) {
|
80
|
+
auto propValue = object.getProperty(runtime, "halfLeading");
|
81
|
+
retVal.setHalfLeading(propValue.asBool());
|
82
|
+
}
|
83
|
+
if (object.hasProperty(runtime, "leading")) {
|
84
|
+
auto propValue = object.getProperty(runtime, "leading");
|
85
|
+
retVal.setLeading(propValue.asNumber());
|
86
|
+
}
|
87
|
+
if (object.hasProperty(runtime, "forceStrutHeight")) {
|
88
|
+
auto propValue = object.getProperty(runtime, "forceStrutHeight");
|
89
|
+
retVal.setForceStrutHeight(propValue.asBool());
|
90
|
+
}
|
91
|
+
|
92
|
+
return retVal;
|
93
|
+
}
|
94
|
+
};
|
95
|
+
|
96
|
+
} // namespace RNSkia
|
@@ -0,0 +1,185 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <memory>
|
4
|
+
#include <string>
|
5
|
+
#include <utility>
|
6
|
+
#include <vector>
|
7
|
+
|
8
|
+
#include <jsi/jsi.h>
|
9
|
+
|
10
|
+
#pragma clang diagnostic push
|
11
|
+
#pragma clang diagnostic ignored "-Wdocumentation"
|
12
|
+
|
13
|
+
#include "Paragraph.h"
|
14
|
+
#include "ParagraphStyle.h"
|
15
|
+
|
16
|
+
#pragma clang diagnostic pop
|
17
|
+
|
18
|
+
namespace RNSkia {
|
19
|
+
|
20
|
+
namespace jsi = facebook::jsi;
|
21
|
+
|
22
|
+
namespace para = skia::textlayout;
|
23
|
+
|
24
|
+
/**
|
25
|
+
Implementation of the TextStyle object in JSI for the paragraph builder
|
26
|
+
*/
|
27
|
+
class JsiSkTextStyle {
|
28
|
+
public:
|
29
|
+
static para::TextStyle fromValue(jsi::Runtime &runtime,
|
30
|
+
const jsi::Value &value) {
|
31
|
+
|
32
|
+
para::TextStyle retVal;
|
33
|
+
|
34
|
+
// Accept undefined && null
|
35
|
+
if (value.isUndefined() || value.isNull()) {
|
36
|
+
return retVal;
|
37
|
+
}
|
38
|
+
|
39
|
+
// Read values from the argument - expected to be a TextStyle shaped object
|
40
|
+
if (!value.isObject()) {
|
41
|
+
throw jsi::JSError(runtime, "Expected SkTextStyle as first argument");
|
42
|
+
}
|
43
|
+
|
44
|
+
auto object = value.asObject(runtime);
|
45
|
+
|
46
|
+
if (object.hasProperty(runtime, "backgroundColor")) {
|
47
|
+
auto propValue = object.getProperty(runtime, "backgroundColor");
|
48
|
+
SkPaint p;
|
49
|
+
p.setColor(JsiSkColor::fromValue(runtime, propValue));
|
50
|
+
retVal.setBackgroundPaint(p);
|
51
|
+
}
|
52
|
+
if (object.hasProperty(runtime, "color")) {
|
53
|
+
auto propValue = object.getProperty(runtime, "color");
|
54
|
+
retVal.setColor(JsiSkColor::fromValue(runtime, propValue));
|
55
|
+
}
|
56
|
+
if (object.hasProperty(runtime, "decoration")) {
|
57
|
+
auto propValue = object.getProperty(runtime, "decoration");
|
58
|
+
retVal.setDecoration(
|
59
|
+
static_cast<para::TextDecoration>(propValue.asNumber()));
|
60
|
+
}
|
61
|
+
if (object.hasProperty(runtime, "decorationColor")) {
|
62
|
+
auto propValue = object.getProperty(runtime, "decorationColor");
|
63
|
+
retVal.setDecorationColor(JsiSkColor::fromValue(runtime, propValue));
|
64
|
+
}
|
65
|
+
if (object.hasProperty(runtime, "decorationThickness")) {
|
66
|
+
auto propValue = object.getProperty(runtime, "decorationThickness");
|
67
|
+
retVal.setDecorationThicknessMultiplier(propValue.asNumber());
|
68
|
+
}
|
69
|
+
if (object.hasProperty(runtime, "decorationStyle")) {
|
70
|
+
auto propValue = object.getProperty(runtime, "decorationStyle");
|
71
|
+
retVal.setDecorationStyle(
|
72
|
+
static_cast<para::TextDecorationStyle>(propValue.asNumber()));
|
73
|
+
}
|
74
|
+
if (object.hasProperty(runtime, "fontFamilies")) {
|
75
|
+
auto propValue = object.getProperty(runtime, "fontFamilies")
|
76
|
+
.asObject(runtime)
|
77
|
+
.asArray(runtime);
|
78
|
+
auto size = propValue.size(runtime);
|
79
|
+
std::vector<SkString> families(size);
|
80
|
+
for (size_t i = 0; i < size; ++i) {
|
81
|
+
families[i] = propValue.getValueAtIndex(runtime, i)
|
82
|
+
.asString(runtime)
|
83
|
+
.utf8(runtime)
|
84
|
+
.c_str();
|
85
|
+
}
|
86
|
+
retVal.setFontFamilies(families);
|
87
|
+
}
|
88
|
+
if (object.hasProperty(runtime, "fontFeatures")) {
|
89
|
+
auto propValue = object.getProperty(runtime, "fontFeatures")
|
90
|
+
.asObject(runtime)
|
91
|
+
.asArray(runtime);
|
92
|
+
auto size = propValue.size(runtime);
|
93
|
+
retVal.resetFontFeatures();
|
94
|
+
for (size_t i = 0; i < size; ++i) {
|
95
|
+
auto element = propValue.getValueAtIndex(runtime, i).asObject(runtime);
|
96
|
+
auto name = element.getProperty(runtime, "name")
|
97
|
+
.asString(runtime)
|
98
|
+
.utf8(runtime);
|
99
|
+
auto value = element.getProperty(runtime, "value").asNumber();
|
100
|
+
retVal.addFontFeature(SkString(name), value);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
if (object.hasProperty(runtime, "fontSize")) {
|
104
|
+
auto propValue = object.getProperty(runtime, "fontSize");
|
105
|
+
retVal.setFontSize(propValue.asNumber());
|
106
|
+
}
|
107
|
+
if (object.hasProperty(runtime, "fontStyle")) {
|
108
|
+
auto propValue =
|
109
|
+
object.getProperty(runtime, "fontStyle").asObject(runtime);
|
110
|
+
auto weight = static_cast<SkFontStyle::Weight>(
|
111
|
+
propValue.hasProperty(runtime, "weight")
|
112
|
+
? propValue.getProperty(runtime, "weight").asNumber()
|
113
|
+
: SkFontStyle::Weight::kNormal_Weight);
|
114
|
+
|
115
|
+
auto width = static_cast<SkFontStyle::Width>(
|
116
|
+
propValue.hasProperty(runtime, "width")
|
117
|
+
? propValue.getProperty(runtime, "width").asNumber()
|
118
|
+
: SkFontStyle::Width::kNormal_Width);
|
119
|
+
|
120
|
+
auto slant = static_cast<SkFontStyle::Slant>(
|
121
|
+
propValue.hasProperty(runtime, "slant")
|
122
|
+
? propValue.getProperty(runtime, "slant").asNumber()
|
123
|
+
: SkFontStyle::Slant::kUpright_Slant);
|
124
|
+
|
125
|
+
retVal.setFontStyle(SkFontStyle(weight, width, slant));
|
126
|
+
}
|
127
|
+
if (object.hasProperty(runtime, "foregroundColor")) {
|
128
|
+
auto propValue = object.getProperty(runtime, "foregroundColor");
|
129
|
+
SkPaint p;
|
130
|
+
p.setColor(JsiSkColor::fromValue(runtime, propValue));
|
131
|
+
retVal.setForegroundColor(p);
|
132
|
+
}
|
133
|
+
if (object.hasProperty(runtime, "heightMultiplier")) {
|
134
|
+
auto propValue = object.getProperty(runtime, "heightMultiplier");
|
135
|
+
retVal.setHeight(propValue.asNumber());
|
136
|
+
retVal.setHeightOverride(true);
|
137
|
+
}
|
138
|
+
if (object.hasProperty(runtime, "halfLeading")) {
|
139
|
+
auto propValue = object.getProperty(runtime, "halfLeading");
|
140
|
+
retVal.setHalfLeading(propValue.asNumber());
|
141
|
+
}
|
142
|
+
if (object.hasProperty(runtime, "letterSpacing")) {
|
143
|
+
auto propValue = object.getProperty(runtime, "letterSpacing");
|
144
|
+
retVal.setLetterSpacing(propValue.asNumber());
|
145
|
+
}
|
146
|
+
if (object.hasProperty(runtime, "locale")) {
|
147
|
+
auto propValue = object.getProperty(runtime, "locale");
|
148
|
+
retVal.setLocale(SkString(propValue.asString(runtime).utf8(runtime)));
|
149
|
+
}
|
150
|
+
if (object.hasProperty(runtime, "shadows")) {
|
151
|
+
auto propValue = object.getProperty(runtime, "shadows")
|
152
|
+
.asObject(runtime)
|
153
|
+
.asArray(runtime);
|
154
|
+
auto size = propValue.size(runtime);
|
155
|
+
retVal.resetShadows();
|
156
|
+
for (size_t i = 0; i < size; ++i) {
|
157
|
+
auto element = propValue.getValueAtIndex(runtime, i).asObject(runtime);
|
158
|
+
auto color = element.hasProperty(runtime, "color")
|
159
|
+
? JsiSkColor::fromValue(
|
160
|
+
runtime, element.getProperty(runtime, "color"))
|
161
|
+
: SK_ColorBLACK;
|
162
|
+
SkPoint offset =
|
163
|
+
element.hasProperty(runtime, "offset")
|
164
|
+
? *JsiSkPoint::fromValue(runtime,
|
165
|
+
element.getProperty(runtime, "offset"))
|
166
|
+
.get()
|
167
|
+
: SkPoint::Make(0, 0);
|
168
|
+
auto blurSigma =
|
169
|
+
element.hasProperty(runtime, "blurRadius")
|
170
|
+
? element.getProperty(runtime, "blurRadius").asNumber()
|
171
|
+
: 0;
|
172
|
+
retVal.addShadow(para::TextShadow(color, offset, blurSigma));
|
173
|
+
}
|
174
|
+
}
|
175
|
+
if (object.hasProperty(runtime, "textBaseline")) {
|
176
|
+
auto propValue = object.getProperty(runtime, "textBaseline");
|
177
|
+
retVal.setTextBaseline(
|
178
|
+
static_cast<para::TextBaseline>(propValue.asNumber()));
|
179
|
+
}
|
180
|
+
|
181
|
+
return retVal;
|
182
|
+
}
|
183
|
+
};
|
184
|
+
|
185
|
+
} // namespace RNSkia
|
package/cpp/jsi/JsiHostObject.h
CHANGED
@@ -331,6 +331,27 @@ protected:
|
|
331
331
|
return value.asHostObject<T>(runtime);
|
332
332
|
}
|
333
333
|
|
334
|
+
/**
|
335
|
+
Returns argument as host object or nullptr if the value is not a valid host
|
336
|
+
object of requested type
|
337
|
+
*/
|
338
|
+
template <typename T = HostObject>
|
339
|
+
static std::shared_ptr<T>
|
340
|
+
tryGetArgumentAsHostObject(jsi::Runtime &runtime, const jsi::Value *arguments,
|
341
|
+
size_t count, size_t index) {
|
342
|
+
const jsi::Value &value = getArgument(runtime, arguments, count, index);
|
343
|
+
if (!value.isObject()) {
|
344
|
+
return nullptr;
|
345
|
+
}
|
346
|
+
|
347
|
+
auto object = value.asObject(runtime);
|
348
|
+
if (!object.isHostObject(runtime)) {
|
349
|
+
return nullptr;
|
350
|
+
}
|
351
|
+
|
352
|
+
return object.asHostObject<T>(runtime);
|
353
|
+
}
|
354
|
+
|
334
355
|
/**
|
335
356
|
Returns argument as array or throws
|
336
357
|
*/
|
@@ -48,6 +48,7 @@
|
|
48
48
|
#include "nodes/JsiTextPathNode.h"
|
49
49
|
|
50
50
|
#include "nodes/JsiLayerNode.h"
|
51
|
+
#include "nodes/JsiParagraphNode.h"
|
51
52
|
|
52
53
|
namespace RNSkia {
|
53
54
|
|
@@ -162,6 +163,9 @@ public:
|
|
162
163
|
installFunction("TextBlobNode", JsiTextBlobNode::createCtor(context));
|
163
164
|
|
164
165
|
installFunction("LayerNode", JsiLayerNode::createCtor(context));
|
166
|
+
|
167
|
+
// Paragraph node
|
168
|
+
installFunction("ParagraphNode", JsiParagraphNode::createCtor(context));
|
165
169
|
}
|
166
170
|
};
|
167
171
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "JsiDomDrawingNode.h"
|
4
|
+
#include "ParagraphProp.h"
|
5
|
+
|
6
|
+
#include <memory>
|
7
|
+
|
8
|
+
namespace RNSkia {
|
9
|
+
|
10
|
+
class JsiParagraphNode : public JsiDomDrawingNode,
|
11
|
+
public JsiDomNodeCtor<JsiParagraphNode> {
|
12
|
+
public:
|
13
|
+
explicit JsiParagraphNode(std::shared_ptr<RNSkPlatformContext> context)
|
14
|
+
: JsiDomDrawingNode(context, "skParagraph") {}
|
15
|
+
|
16
|
+
protected:
|
17
|
+
void draw(DrawingContext *context) override {
|
18
|
+
auto x = _xProp->value().getAsNumber();
|
19
|
+
auto y = _yProp->value().getAsNumber();
|
20
|
+
auto width = static_cast<SkScalar>(_widthProp->value().getAsNumber());
|
21
|
+
|
22
|
+
auto p = *_paragraphProp->getDerivedValue();
|
23
|
+
if (p != nullptr) {
|
24
|
+
|
25
|
+
// Let's ensure that we don't perform unnecessary layouts on the
|
26
|
+
// paragraph. We should only layout if we have a new paragraph or if the
|
27
|
+
// layout width has changed.
|
28
|
+
if (_lastLayoutWidth != width || _lastLayoutParagraph != p) {
|
29
|
+
// perform layout!
|
30
|
+
p->layout(width);
|
31
|
+
_lastLayoutWidth = width;
|
32
|
+
_lastLayoutParagraph = p;
|
33
|
+
}
|
34
|
+
// Paint the layout to the canvas
|
35
|
+
p->paint(context->getCanvas(), x, y);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
void defineProperties(NodePropsContainer *container) override {
|
40
|
+
JsiDomDrawingNode::defineProperties(container);
|
41
|
+
_paragraphProp = container->defineProperty<ParagraphProp>("paragraph");
|
42
|
+
|
43
|
+
_xProp = container->defineProperty<NodeProp>("x");
|
44
|
+
_xProp->require();
|
45
|
+
|
46
|
+
_yProp = container->defineProperty<NodeProp>("y");
|
47
|
+
_yProp->require();
|
48
|
+
|
49
|
+
_widthProp = container->defineProperty<NodeProp>("width");
|
50
|
+
_widthProp->require();
|
51
|
+
}
|
52
|
+
|
53
|
+
private:
|
54
|
+
ParagraphProp *_paragraphProp;
|
55
|
+
NodeProp *_xProp;
|
56
|
+
NodeProp *_yProp;
|
57
|
+
NodeProp *_widthProp;
|
58
|
+
SkScalar _lastLayoutWidth;
|
59
|
+
para::Paragraph *_lastLayoutParagraph = nullptr;
|
60
|
+
};
|
61
|
+
|
62
|
+
} // namespace RNSkia
|