@shopify/react-native-skia 0.1.201 → 0.1.203

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 (166) hide show
  1. package/android/CMakeLists.txt +9 -9
  2. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +11 -0
  3. package/cpp/api/JsiSkApi.h +8 -0
  4. package/cpp/api/JsiSkFontMgr.h +54 -0
  5. package/cpp/api/JsiSkFontMgrFactory.h +40 -0
  6. package/cpp/api/JsiSkFontStyle.h +61 -0
  7. package/cpp/api/JsiSkTypeFaceFontProvider.h +80 -0
  8. package/cpp/api/JsiSkTypeFaceFontProviderFactory.h +32 -0
  9. package/cpp/rnskia/RNSkPlatformContext.h +6 -0
  10. package/cpp/rnskia/RNSkView.h +5 -2
  11. package/cpp/skia/include/core/SkColorTable.h +1 -1
  12. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +5 -14
  13. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +7 -56
  14. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +1 -0
  15. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +9 -2
  16. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +31 -0
  17. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +105 -0
  18. package/lib/commonjs/skia/core/Data.d.ts +2 -0
  19. package/lib/commonjs/skia/core/Data.js +29 -1
  20. package/lib/commonjs/skia/core/Data.js.map +1 -1
  21. package/lib/commonjs/skia/core/Font.d.ts +14 -1
  22. package/lib/commonjs/skia/core/Font.js +93 -1
  23. package/lib/commonjs/skia/core/Font.js.map +1 -1
  24. package/lib/commonjs/skia/types/Font/FontMgr.d.ts +8 -0
  25. package/lib/commonjs/skia/types/Font/FontMgr.js +6 -0
  26. package/lib/commonjs/skia/types/Font/FontMgr.js.map +1 -0
  27. package/lib/commonjs/skia/types/Font/FontMgrFactory.d.ts +4 -0
  28. package/lib/commonjs/skia/types/Font/FontMgrFactory.js +6 -0
  29. package/lib/commonjs/skia/types/Font/FontMgrFactory.js.map +1 -0
  30. package/lib/commonjs/skia/types/Font/index.d.ts +2 -0
  31. package/lib/commonjs/skia/types/Font/index.js +26 -0
  32. package/lib/commonjs/skia/types/Font/index.js.map +1 -1
  33. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProvider.d.ts +10 -0
  34. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProvider.js +6 -0
  35. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProvider.js.map +1 -0
  36. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProviderFactory.d.ts +4 -0
  37. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProviderFactory.js +6 -0
  38. package/lib/commonjs/skia/types/Paragraph/TypefaceFontProviderFactory.js.map +1 -0
  39. package/lib/commonjs/skia/types/Skia.d.ts +4 -1
  40. package/lib/commonjs/skia/types/Skia.js.map +1 -1
  41. package/lib/commonjs/skia/web/Host.d.ts +1 -1
  42. package/lib/commonjs/skia/web/Host.js +0 -2
  43. package/lib/commonjs/skia/web/Host.js.map +1 -1
  44. package/lib/commonjs/skia/web/JsiSkFontMgr.d.ts +10 -0
  45. package/lib/commonjs/skia/web/JsiSkFontMgr.js +34 -0
  46. package/lib/commonjs/skia/web/JsiSkFontMgr.js.map +1 -0
  47. package/lib/commonjs/skia/web/JsiSkFontMgrFactory.d.ts +8 -0
  48. package/lib/commonjs/skia/web/JsiSkFontMgrFactory.js +32 -0
  49. package/lib/commonjs/skia/web/JsiSkFontMgrFactory.js.map +1 -0
  50. package/lib/commonjs/skia/web/JsiSkTypefaceFontProvider.d.ts +13 -0
  51. package/lib/commonjs/skia/web/JsiSkTypefaceFontProvider.js +90 -0
  52. package/lib/commonjs/skia/web/JsiSkTypefaceFontProvider.js.map +1 -0
  53. package/lib/commonjs/skia/web/JsiSkTypefaceFontProviderFactory.d.ts +7 -0
  54. package/lib/commonjs/skia/web/JsiSkTypefaceFontProviderFactory.js +25 -0
  55. package/lib/commonjs/skia/web/JsiSkTypefaceFontProviderFactory.js.map +1 -0
  56. package/lib/commonjs/skia/web/JsiSkia.js +7 -1
  57. package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
  58. package/lib/module/skia/core/Data.d.ts +2 -0
  59. package/lib/module/skia/core/Data.js +24 -1
  60. package/lib/module/skia/core/Data.js.map +1 -1
  61. package/lib/module/skia/core/Font.d.ts +14 -1
  62. package/lib/module/skia/core/Font.js +83 -1
  63. package/lib/module/skia/core/Font.js.map +1 -1
  64. package/lib/module/skia/types/Font/FontMgr.d.ts +8 -0
  65. package/lib/module/skia/types/Font/FontMgr.js +2 -0
  66. package/lib/module/skia/types/Font/FontMgr.js.map +1 -0
  67. package/lib/module/skia/types/Font/FontMgrFactory.d.ts +4 -0
  68. package/lib/module/skia/types/Font/FontMgrFactory.js +2 -0
  69. package/lib/module/skia/types/Font/FontMgrFactory.js.map +1 -0
  70. package/lib/module/skia/types/Font/index.d.ts +2 -0
  71. package/lib/module/skia/types/Font/index.js +2 -0
  72. package/lib/module/skia/types/Font/index.js.map +1 -1
  73. package/lib/module/skia/types/Paragraph/TypefaceFontProvider.d.ts +10 -0
  74. package/lib/module/skia/types/Paragraph/TypefaceFontProvider.js +2 -0
  75. package/lib/module/skia/types/Paragraph/TypefaceFontProvider.js.map +1 -0
  76. package/lib/module/skia/types/Paragraph/TypefaceFontProviderFactory.d.ts +4 -0
  77. package/lib/module/skia/types/Paragraph/TypefaceFontProviderFactory.js +2 -0
  78. package/lib/module/skia/types/Paragraph/TypefaceFontProviderFactory.js.map +1 -0
  79. package/lib/module/skia/types/Skia.d.ts +4 -1
  80. package/lib/module/skia/types/Skia.js.map +1 -1
  81. package/lib/module/skia/web/Host.d.ts +1 -1
  82. package/lib/module/skia/web/Host.js +0 -2
  83. package/lib/module/skia/web/Host.js.map +1 -1
  84. package/lib/module/skia/web/JsiSkFontMgr.d.ts +10 -0
  85. package/lib/module/skia/web/JsiSkFontMgr.js +24 -0
  86. package/lib/module/skia/web/JsiSkFontMgr.js.map +1 -0
  87. package/lib/module/skia/web/JsiSkFontMgrFactory.d.ts +8 -0
  88. package/lib/module/skia/web/JsiSkFontMgrFactory.js +21 -0
  89. package/lib/module/skia/web/JsiSkFontMgrFactory.js.map +1 -0
  90. package/lib/module/skia/web/JsiSkTypefaceFontProvider.d.ts +13 -0
  91. package/lib/module/skia/web/JsiSkTypefaceFontProvider.js +80 -0
  92. package/lib/module/skia/web/JsiSkTypefaceFontProvider.js.map +1 -0
  93. package/lib/module/skia/web/JsiSkTypefaceFontProviderFactory.d.ts +7 -0
  94. package/lib/module/skia/web/JsiSkTypefaceFontProviderFactory.js +14 -0
  95. package/lib/module/skia/web/JsiSkTypefaceFontProviderFactory.js.map +1 -0
  96. package/lib/module/skia/web/JsiSkia.js +5 -1
  97. package/lib/module/skia/web/JsiSkia.js.map +1 -1
  98. package/lib/typescript/src/skia/core/Data.d.ts +2 -0
  99. package/lib/typescript/src/skia/core/Font.d.ts +14 -1
  100. package/lib/typescript/src/skia/types/Font/FontMgr.d.ts +8 -0
  101. package/lib/typescript/src/skia/types/Font/FontMgrFactory.d.ts +4 -0
  102. package/lib/typescript/src/skia/types/Font/index.d.ts +2 -0
  103. package/lib/typescript/src/skia/types/Paragraph/TypefaceFontProvider.d.ts +10 -0
  104. package/lib/typescript/src/skia/types/Paragraph/TypefaceFontProviderFactory.d.ts +4 -0
  105. package/lib/typescript/src/skia/types/Skia.d.ts +4 -1
  106. package/lib/typescript/src/skia/web/Host.d.ts +1 -1
  107. package/lib/typescript/src/skia/web/JsiSkFontMgr.d.ts +10 -0
  108. package/lib/typescript/src/skia/web/JsiSkFontMgrFactory.d.ts +8 -0
  109. package/lib/typescript/src/skia/web/JsiSkTypefaceFontProvider.d.ts +13 -0
  110. package/lib/typescript/src/skia/web/JsiSkTypefaceFontProviderFactory.d.ts +7 -0
  111. package/libs/android/arm64-v8a/libskia.a +0 -0
  112. package/libs/android/arm64-v8a/libskottie.a +0 -0
  113. package/libs/android/arm64-v8a/libskparagraph.a +0 -0
  114. package/libs/android/arm64-v8a/libskshaper.a +0 -0
  115. package/libs/android/arm64-v8a/libskunicode.a +0 -0
  116. package/libs/android/armeabi-v7a/libskia.a +0 -0
  117. package/libs/android/armeabi-v7a/libskottie.a +0 -0
  118. package/libs/android/armeabi-v7a/libskparagraph.a +0 -0
  119. package/libs/android/armeabi-v7a/libskshaper.a +0 -0
  120. package/libs/android/armeabi-v7a/libskunicode.a +0 -0
  121. package/libs/android/x86/libskia.a +0 -0
  122. package/libs/android/x86/libskottie.a +0 -0
  123. package/libs/android/x86/libskparagraph.a +0 -0
  124. package/libs/android/x86/libskshaper.a +0 -0
  125. package/libs/android/x86/libskunicode.a +0 -0
  126. package/libs/android/x86_64/libskia.a +0 -0
  127. package/libs/android/x86_64/libskottie.a +0 -0
  128. package/libs/android/x86_64/libskparagraph.a +0 -0
  129. package/libs/android/x86_64/libskshaper.a +0 -0
  130. package/libs/android/x86_64/libskunicode.a +0 -0
  131. package/libs/ios/libskia.xcframework/Info.plist +5 -5
  132. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  133. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  134. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
  135. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
  136. package/libs/ios/libskparagraph.xcframework/Info.plist +42 -0
  137. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
  138. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
  139. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
  140. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
  141. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  142. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  143. package/libs/ios/libskunicode.xcframework/Info.plist +42 -0
  144. package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
  145. package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
  146. package/libs/ios/libsvg.xcframework/Info.plist +5 -5
  147. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  148. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  149. package/package.json +3 -1
  150. package/react-native-skia.podspec +2 -2
  151. package/src/skia/core/Data.ts +31 -1
  152. package/src/skia/core/Font.ts +109 -2
  153. package/src/skia/types/Font/FontMgr.ts +10 -0
  154. package/src/skia/types/Font/FontMgrFactory.ts +5 -0
  155. package/src/skia/types/Font/index.ts +2 -0
  156. package/src/skia/types/Paragraph/TypefaceFontProvider.ts +11 -0
  157. package/src/skia/types/Paragraph/TypefaceFontProviderFactory.ts +5 -0
  158. package/src/skia/types/Skia.ts +4 -2
  159. package/src/skia/web/Host.ts +1 -1
  160. package/src/skia/web/JsiSkFontMgr.ts +26 -0
  161. package/src/skia/web/JsiSkFontMgrFactory.ts +22 -0
  162. package/src/skia/web/JsiSkTypefaceFontProvider.ts +89 -0
  163. package/src/skia/web/JsiSkTypefaceFontProviderFactory.ts +18 -0
  164. package/src/skia/web/JsiSkia.ts +4 -0
  165. package/ios/RNSkia-iOS/SkiaMetalRenderer.h +0 -5
  166. package/ios/RNSkia-iOS/SkiaMetalRenderer.mm +0 -55
@@ -9,8 +9,8 @@ set (PACKAGE_NAME "rnskia")
9
9
  set (SKIA_LIB "skia")
10
10
  set (SKIA_SVG_LIB "svg")
11
11
  set (SKIA_SKSHAPER_LIB "skshaper")
12
- #set (SKIA_SKPARAGRAPH_LIB "skparagraph")
13
- #set (SKIA_SKUNICODE_LIB "skunicode")
12
+ set (SKIA_SKPARAGRAPH_LIB "skparagraph")
13
+ set (SKIA_SKUNICODE_LIB "skunicode")
14
14
 
15
15
  # Clear some variables
16
16
  unset(LIBRN_DIR CACHE)
@@ -84,7 +84,7 @@ target_include_directories(
84
84
  ../cpp/skia/include/utils/
85
85
  ../cpp/skia/include/pathops/
86
86
  ../cpp/skia/modules/
87
- #cpp/skia/modules/skparagraph/include/
87
+ ../cpp/skia/modules/skparagraph/include/
88
88
  ../cpp/skia/include/
89
89
  ../cpp/skia
90
90
 
@@ -113,11 +113,11 @@ set_property(TARGET svg PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libsvg.a")
113
113
  add_library(skshaper STATIC IMPORTED)
114
114
  set_property(TARGET skshaper PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskshaper.a")
115
115
 
116
- #add_library(skparagraph STATIC IMPORTED)
117
- #set_property(TARGET skparagraph PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskparagraph.a")
116
+ add_library(skparagraph STATIC IMPORTED)
117
+ set_property(TARGET skparagraph PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskparagraph.a")
118
118
 
119
- #add_library(skunicode STATIC IMPORTED)
120
- #set_property(TARGET skunicode PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskunicode.a")
119
+ add_library(skunicode STATIC IMPORTED)
120
+ set_property(TARGET skunicode PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskunicode.a")
121
121
 
122
122
 
123
123
  find_library(
@@ -202,8 +202,8 @@ target_link_libraries(
202
202
  ${TURBOMODULES_LIB}
203
203
  ${SKIA_SVG_LIB}
204
204
  ${SKIA_SKSHAPER_LIB}
205
- #${SKIA_SKPARAGRAPH_LIB}
206
- #${SKIA_SKUNICODE_LIB}
205
+ ${SKIA_SKPARAGRAPH_LIB}
206
+ ${SKIA_SKUNICODE_LIB}
207
207
  ${SKIA_LIB}
208
208
  -ljnigraphics
209
209
  -lGLESv2
@@ -9,6 +9,13 @@
9
9
  #include <RNSkPlatformContext.h>
10
10
  #include <SkiaOpenGLSurfaceFactory.h>
11
11
 
12
+ #pragma clang diagnostic push
13
+ #pragma clang diagnostic ignored "-Wdocumentation"
14
+
15
+ #include "include/ports/SkFontMgr_android.h"
16
+
17
+ #pragma clang diagnostic pop
18
+
12
19
  namespace RNSkia {
13
20
  namespace jsi = facebook::jsi;
14
21
 
@@ -41,6 +48,10 @@ public:
41
48
  return SkiaOpenGLSurfaceFactory::makeOffscreenSurface(width, height);
42
49
  }
43
50
 
51
+ sk_sp<SkFontMgr> createFontMgr() override {
52
+ return SkFontMgr_New_Android(nullptr);
53
+ }
54
+
44
55
  void runOnMainThread(std::function<void()> task) override {
45
56
  _jniPlatformContext->runTaskOnMainThread(task);
46
57
  }
@@ -12,6 +12,8 @@
12
12
  #include "JsiSkContourMeasureIter.h"
13
13
  #include "JsiSkDataFactory.h"
14
14
  #include "JsiSkFont.h"
15
+ #include "JsiSkFontMgr.h"
16
+ #include "JsiSkFontMgrFactory.h"
15
17
  #include "JsiSkImage.h"
16
18
  #include "JsiSkImageFactory.h"
17
19
  #include "JsiSkImageFilter.h"
@@ -39,6 +41,7 @@
39
41
  #include "JsiSkShaderFactory.h"
40
42
  #include "JsiSkSurfaceFactory.h"
41
43
  #include "JsiSkTextBlobFactory.h"
44
+ #include "JsiSkTypeFaceFontProviderFactory.h"
42
45
  #include "JsiSkTypeface.h"
43
46
  #include "JsiSkTypefaceFactory.h"
44
47
  #include "JsiSkVertices.h"
@@ -100,6 +103,11 @@ public:
100
103
  std::make_shared<JsiSkSurfaceFactory>(context));
101
104
  installReadonlyProperty("Picture",
102
105
  std::make_shared<JsiSkPictureFactory>(context));
106
+ installReadonlyProperty("FontMgr",
107
+ std::make_shared<JsiSkFontMgrFactory>(context));
108
+ installReadonlyProperty(
109
+ "TypefaceFontProvider",
110
+ std::make_shared<JsiSkTypefaceFontProviderFactory>(context));
103
111
  }
104
112
  };
105
113
  } // namespace RNSkia
@@ -0,0 +1,54 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <numeric>
5
+ #include <utility>
6
+ #include <vector>
7
+
8
+ #include "JsiSkFontStyle.h"
9
+ #include "JsiSkHostObjects.h"
10
+ #include "RNSkLog.h"
11
+ #include <jsi/jsi.h>
12
+
13
+ #pragma clang diagnostic push
14
+ #pragma clang diagnostic ignored "-Wdocumentation"
15
+
16
+ #include "SkFontMgr.h"
17
+
18
+ #pragma clang diagnostic pop
19
+
20
+ namespace RNSkia {
21
+
22
+ namespace jsi = facebook::jsi;
23
+
24
+ class JsiSkFontMgr : public JsiSkWrappingSkPtrHostObject<SkFontMgr> {
25
+ public:
26
+ EXPORT_JSI_API_TYPENAME(JsiSkFontMgr, "FontMgr")
27
+
28
+ JsiSkFontMgr(std::shared_ptr<RNSkPlatformContext> context,
29
+ sk_sp<SkFontMgr> fontMgr)
30
+ : JsiSkWrappingSkPtrHostObject(std::move(context), fontMgr) {}
31
+
32
+ JSI_HOST_FUNCTION(countFamilies) { return getObject()->countFamilies(); }
33
+
34
+ JSI_HOST_FUNCTION(getFamilyName) {
35
+ auto i = static_cast<int>(arguments[0].asNumber());
36
+ SkString name;
37
+ getObject()->getFamilyName(i, &name);
38
+ return jsi::String::createFromUtf8(runtime, name.c_str());
39
+ }
40
+
41
+ JSI_HOST_FUNCTION(matchFamilyStyle) {
42
+ auto name = arguments[0].asString(runtime).utf8(runtime);
43
+ auto fontStyle = JsiSkFontStyle::fromValue(runtime, arguments[1]);
44
+ auto typeface = getObject()->matchFamilyStyle(name.c_str(), *fontStyle);
45
+ return jsi::Object::createFromHostObject(
46
+ runtime, std::make_shared<JsiSkTypeface>(getContext(), typeface));
47
+ }
48
+
49
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkFontMgr, countFamilies),
50
+ JSI_EXPORT_FUNC(JsiSkFontMgr, getFamilyName),
51
+ JSI_EXPORT_FUNC(JsiSkFontMgr, matchFamilyStyle))
52
+ };
53
+
54
+ } // namespace RNSkia
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <utility>
5
+ #include <vector>
6
+
7
+ #include <jsi/jsi.h>
8
+
9
+ #include "JsiSkHostObjects.h"
10
+
11
+ #pragma clang diagnostic push
12
+ #pragma clang diagnostic ignored "-Wdocumentation"
13
+
14
+ #include "SkFontMgr.h"
15
+ #include "include/ports/SkFontMgr_data.h"
16
+
17
+ #pragma clang diagnostic pop
18
+
19
+ namespace RNSkia {
20
+
21
+ namespace jsi = facebook::jsi;
22
+
23
+ class JsiSkFontMgrFactory : public JsiSkHostObject {
24
+ public:
25
+ JSI_HOST_FUNCTION(System) {
26
+ auto context = getContext();
27
+ static SkOnce once;
28
+ static sk_sp<SkFontMgr> fontMgr;
29
+ once([&context, &runtime] { fontMgr = context->createFontMgr(); });
30
+ return jsi::Object::createFromHostObject(
31
+ runtime, std::make_shared<JsiSkFontMgr>(std::move(context), fontMgr));
32
+ }
33
+
34
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkFontMgrFactory, System))
35
+
36
+ explicit JsiSkFontMgrFactory(std::shared_ptr<RNSkPlatformContext> context)
37
+ : JsiSkHostObject(std::move(context)) {}
38
+ };
39
+
40
+ } // namespace RNSkia
@@ -0,0 +1,61 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <utility>
5
+
6
+ #include <jsi/jsi.h>
7
+
8
+ #include "JsiSkHostObjects.h"
9
+
10
+ #pragma clang diagnostic push
11
+ #pragma clang diagnostic ignored "-Wdocumentation"
12
+
13
+ #include "SkFontStyle.h"
14
+
15
+ #pragma clang diagnostic pop
16
+
17
+ namespace RNSkia {
18
+
19
+ namespace jsi = facebook::jsi;
20
+
21
+ class JsiSkFontStyle : public JsiSkWrappingSharedPtrHostObject<SkFontStyle> {
22
+ public:
23
+ JSI_API_TYPENAME("FontStyle");
24
+
25
+ JsiSkFontStyle(std::shared_ptr<RNSkPlatformContext> context,
26
+ const SkFontStyle &fontStyle)
27
+ : JsiSkWrappingSharedPtrHostObject<SkFontStyle>(
28
+ std::move(context), std::make_shared<SkFontStyle>(fontStyle)) {}
29
+
30
+ /**
31
+ Returns the underlying object from a host object of this type
32
+ */
33
+ static std::shared_ptr<SkFontStyle> fromValue(jsi::Runtime &runtime,
34
+ const jsi::Value &obj) {
35
+ const auto &object = obj.asObject(runtime);
36
+ if (object.isHostObject(runtime)) {
37
+ return object.asHostObject<JsiSkFontStyle>(runtime)->getObject();
38
+ } else {
39
+ auto weight =
40
+ static_cast<int>(object.getProperty(runtime, "weight").asNumber());
41
+ auto width =
42
+ static_cast<int>(object.getProperty(runtime, "width").asNumber());
43
+ auto slant = static_cast<SkFontStyle::Slant>(
44
+ object.getProperty(runtime, "slant").asNumber());
45
+ SkFontStyle style(weight, width, slant);
46
+ return std::make_shared<SkFontStyle>(style);
47
+ }
48
+ }
49
+
50
+ /**
51
+ Returns the jsi object from a host object of this type
52
+ */
53
+ static jsi::Value toValue(jsi::Runtime &runtime,
54
+ std::shared_ptr<RNSkPlatformContext> context,
55
+ const SkFontStyle &fontStyle) {
56
+ return jsi::Object::createFromHostObject(
57
+ runtime,
58
+ std::make_shared<JsiSkFontStyle>(std::move(context), fontStyle));
59
+ }
60
+ };
61
+ } // namespace RNSkia
@@ -0,0 +1,80 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <utility>
5
+
6
+ #include <jsi/jsi.h>
7
+
8
+ #include "JsiSkFontStyle.h"
9
+ #include "JsiSkHostObjects.h"
10
+ #include "JsiSkTypeface.h"
11
+
12
+ #include "RNSkLog.h"
13
+
14
+ #pragma clang diagnostic push
15
+ #pragma clang diagnostic ignored "-Wdocumentation"
16
+
17
+ #include "SkFont.h"
18
+ #include "skparagraph/include/TypefaceFontProvider.h"
19
+
20
+ #pragma clang diagnostic pop
21
+
22
+ namespace RNSkia {
23
+
24
+ namespace jsi = facebook::jsi;
25
+ namespace para = skia::textlayout;
26
+
27
+ class JsiSkTypefaceFontProvider
28
+ : public JsiSkWrappingSkPtrHostObject<para::TypefaceFontProvider> {
29
+ public:
30
+ EXPORT_JSI_API_TYPENAME(JsiSkTypefaceFontProvider, "FontMgr")
31
+ JSI_EXPORT_FUNCTIONS(
32
+ JSI_EXPORT_FUNC(JsiSkTypefaceFontProvider, dispose),
33
+ JSI_EXPORT_FUNC(JsiSkTypefaceFontProvider, registerFont),
34
+ JSI_EXPORT_FUNC(JsiSkTypefaceFontProvider, matchFamilyStyle),
35
+ JSI_EXPORT_FUNC(JsiSkTypefaceFontProvider, countFamilies),
36
+ JSI_EXPORT_FUNC(JsiSkTypefaceFontProvider, getFamilyName))
37
+
38
+ JSI_HOST_FUNCTION(registerFont) {
39
+ sk_sp<SkTypeface> typeface =
40
+ JsiSkTypeface::fromValue(runtime, arguments[0]);
41
+ SkString familyName(arguments[1].asString(runtime).utf8(runtime).c_str());
42
+ auto result = getObject()->registerTypeface(typeface, familyName);
43
+ return jsi::Value::undefined();
44
+ }
45
+
46
+ JSI_HOST_FUNCTION(matchFamilyStyle) {
47
+ auto name = arguments[0].asString(runtime).utf8(runtime);
48
+ auto fontStyle = JsiSkFontStyle::fromValue(runtime, arguments[1]);
49
+ auto typeface = getObject()->matchFamilyStyle(name.c_str(), *fontStyle);
50
+ return jsi::Object::createFromHostObject(
51
+ runtime, std::make_shared<JsiSkTypeface>(getContext(), typeface));
52
+ }
53
+
54
+ JSI_HOST_FUNCTION(countFamilies) { return getObject()->countFamilies(); }
55
+
56
+ JSI_HOST_FUNCTION(getFamilyName) {
57
+ auto i = static_cast<int>(arguments[0].asNumber());
58
+ SkString name;
59
+ getObject()->getFamilyName(i, &name);
60
+ return jsi::String::createFromUtf8(runtime, name.c_str());
61
+ }
62
+
63
+ JsiSkTypefaceFontProvider(std::shared_ptr<RNSkPlatformContext> context,
64
+ sk_sp<para::TypefaceFontProvider> tfProvider)
65
+ : JsiSkWrappingSkPtrHostObject(std::move(context),
66
+ std::move(tfProvider)) {}
67
+
68
+ /**
69
+ Returns the jsi object from a host object of this type
70
+ */
71
+ static jsi::Value toValue(jsi::Runtime &runtime,
72
+ std::shared_ptr<RNSkPlatformContext> context,
73
+ sk_sp<para::TypefaceFontProvider> tfProvider) {
74
+ return jsi::Object::createFromHostObject(
75
+ runtime, std::make_shared<JsiSkTypefaceFontProvider>(
76
+ std::move(context), std::move(tfProvider)));
77
+ }
78
+ };
79
+
80
+ } // namespace RNSkia
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <utility>
5
+
6
+ #include <jsi/jsi.h>
7
+
8
+ #include "JsiSkData.h"
9
+ #include "JsiSkHostObjects.h"
10
+ #include "JsiSkTypefaceFontProvider.h"
11
+
12
+ namespace RNSkia {
13
+
14
+ namespace jsi = facebook::jsi;
15
+ namespace para = skia::textlayout;
16
+
17
+ class JsiSkTypefaceFontProviderFactory : public JsiSkHostObject {
18
+ public:
19
+ JSI_HOST_FUNCTION(Make) {
20
+ return jsi::Object::createFromHostObject(
21
+ runtime, std::make_shared<JsiSkTypefaceFontProvider>(
22
+ getContext(), sk_make_sp<para::TypefaceFontProvider>()));
23
+ }
24
+
25
+ JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkTypefaceFontProviderFactory, Make))
26
+
27
+ explicit JsiSkTypefaceFontProviderFactory(
28
+ std::shared_ptr<RNSkPlatformContext> context)
29
+ : JsiSkHostObject(std::move(context)) {}
30
+ };
31
+
32
+ } // namespace RNSkia
@@ -15,6 +15,7 @@
15
15
  #pragma clang diagnostic ignored "-Wdocumentation"
16
16
 
17
17
  #include "SkData.h"
18
+ #include "SkFontMgr.h"
18
19
  #include "SkImage.h"
19
20
  #include "SkStream.h"
20
21
  #include "SkSurface.h"
@@ -132,6 +133,11 @@ public:
132
133
  */
133
134
  virtual sk_sp<SkSurface> makeOffscreenSurface(int width, int height) = 0;
134
135
 
136
+ /**
137
+ * Return the Platform specific font manager
138
+ */
139
+ virtual sk_sp<SkFontMgr> createFontMgr() = 0;
140
+
135
141
  /**
136
142
  * Creates an skImage containing the screenshot of a native view and its
137
143
  * children.
@@ -93,6 +93,7 @@ public:
93
93
  float height)
94
94
  : RNSkCanvasProvider(requestRedraw), _width(width), _height(height) {
95
95
  _surface = context->makeOffscreenSurface(_width, _height);
96
+ _pd = context->getPixelDensity();
96
97
  }
97
98
 
98
99
  /**
@@ -101,8 +102,9 @@ public:
101
102
  sk_sp<SkImage> makeSnapshot(SkRect *bounds) {
102
103
  sk_sp<SkImage> image;
103
104
  if (bounds != nullptr) {
104
- SkIRect b = SkIRect::MakeXYWH(bounds->x(), bounds->y(), bounds->width(),
105
- bounds->height());
105
+ SkIRect b =
106
+ SkIRect::MakeXYWH(bounds->x() * _pd, bounds->y() * _pd,
107
+ bounds->width() * _pd, bounds->height() * _pd);
106
108
  image = _surface->makeImageSnapshot(b);
107
109
  } else {
108
110
  image = _surface->makeImageSnapshot();
@@ -131,6 +133,7 @@ public:
131
133
  private:
132
134
  float _width;
133
135
  float _height;
136
+ float _pd = 1.0f;
134
137
  sk_sp<SkSurface> _surface;
135
138
  };
136
139
 
@@ -19,7 +19,7 @@ class SkWriteBuffer;
19
19
  * of `SkColorFilters::Table`, and provides a way to share the table data between client code and
20
20
  * the returned SkColorFilter. Once created, an SkColorTable is immutable.
21
21
  */
22
- class SkColorTable : public SkRefCnt {
22
+ class SK_API SkColorTable : public SkRefCnt {
23
23
  public:
24
24
  // Creates a new SkColorTable with 'table' used for all four channels. The table is copied into
25
25
  // the SkColorTable.
@@ -6,13 +6,12 @@
6
6
  #import <MetalKit/MetalKit.h>
7
7
  #import <QuartzCore/CAMetalLayer.h>
8
8
 
9
- using MetalRenderContext = struct {
10
- id<MTLCommandQueue> commandQueue;
11
- sk_sp<GrDirectContext> skContext;
12
- };
9
+ #pragma clang diagnostic push
10
+ #pragma clang diagnostic ignored "-Wdocumentation"
11
+
12
+ #import <include/gpu/GrDirectContext.h>
13
13
 
14
- static std::unordered_map<std::thread::id, std::shared_ptr<MetalRenderContext>>
15
- renderContexts;
14
+ #pragma clang diagnostic pop
16
15
 
17
16
  class RNSkMetalCanvasProvider : public RNSkia::RNSkCanvasProvider {
18
17
  public:
@@ -27,17 +26,9 @@ public:
27
26
  bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override;
28
27
 
29
28
  void setSize(int width, int height);
30
-
31
29
  CALayer *getLayer();
32
30
 
33
31
  private:
34
- /**
35
- * To be able to use static contexts (and avoid reloading the skia context for
36
- * each new view, we track the Skia drawing context per thread.
37
- * @return The drawing context for the current thread
38
- */
39
- static std::shared_ptr<MetalRenderContext> getMetalRenderContext();
40
-
41
32
  std::shared_ptr<RNSkia::RNSkPlatformContext> _context;
42
33
  float _width = -1;
43
34
  float _height = -1;
@@ -1,5 +1,6 @@
1
1
  #import <RNSkLog.h>
2
2
  #import <RNSkMetalCanvasProvider.h>
3
+ #import <SkiaMetalSurfaceFactory.h>
3
4
 
4
5
  #pragma clang diagnostic push
5
6
  #pragma clang diagnostic ignored "-Wdocumentation"
@@ -14,19 +15,6 @@
14
15
 
15
16
  #pragma clang diagnostic pop
16
17
 
17
- /** Static members */
18
- std::shared_ptr<MetalRenderContext>
19
- RNSkMetalCanvasProvider::getMetalRenderContext() {
20
- auto threadId = std::this_thread::get_id();
21
- if (renderContexts.count(threadId) == 0) {
22
- auto drawingContext = std::make_shared<MetalRenderContext>();
23
- drawingContext->commandQueue = nullptr;
24
- drawingContext->skContext = nullptr;
25
- renderContexts.emplace(threadId, drawingContext);
26
- }
27
- return renderContexts.at(threadId);
28
- }
29
-
30
18
  RNSkMetalCanvasProvider::RNSkMetalCanvasProvider(
31
19
  std::function<void()> requestRedraw,
32
20
  std::shared_ptr<RNSkia::RNSkPlatformContext> context)
@@ -35,11 +23,8 @@ RNSkMetalCanvasProvider::RNSkMetalCanvasProvider(
35
23
  #pragma clang diagnostic ignored "-Wunguarded-availability-new"
36
24
  _layer = [CAMetalLayer layer];
37
25
  #pragma clang diagnostic pop
38
-
39
- auto device = MTLCreateSystemDefaultDevice();
40
-
41
26
  _layer.framebufferOnly = NO;
42
- _layer.device = device;
27
+ _layer.device = MTLCreateSystemDefaultDevice();
43
28
  _layer.opaque = false;
44
29
  _layer.contentsScale = _context->getPixelDensity();
45
30
  _layer.pixelFormat = MTLPixelFormatBGRA8Unorm;
@@ -87,52 +72,18 @@ bool RNSkMetalCanvasProvider::renderToCanvas(
87
72
  return false;
88
73
  }
89
74
  }
90
-
91
- // Get render context for current thread
92
- auto renderContext = getMetalRenderContext();
93
-
94
- if (renderContext->skContext == nullptr) {
95
- auto device = MTLCreateSystemDefaultDevice();
96
- renderContext->commandQueue =
97
- id<MTLCommandQueue>(CFRetain((GrMTLHandle)[device newCommandQueue]));
98
- renderContext->skContext = GrDirectContext::MakeMetal(
99
- (__bridge void *)device, (__bridge void *)renderContext->commandQueue);
100
- }
101
-
102
75
  // Wrap in auto release pool since we want the system to clean up after
103
76
  // rendering and not wait until later - we've seen some example of memory
104
77
  // usage growing very fast in the simulator without this.
105
78
  @autoreleasepool {
106
-
107
- /* It is super important that we use the pattern of calling nextDrawable
108
- inside this autoreleasepool and not depend on Skia's
109
- SkSurface::MakeFromCAMetalLayer to encapsulate since we're seeing a lot of
110
- drawables leaking if they're not done this way.
111
-
112
- This is now reverted from:
113
- (https://github.com/Shopify/react-native-skia/commit/2e2290f8e6dfc6921f97b79f779d920fbc1acceb)
114
- back to the original implementation.
115
- */
116
79
  id<CAMetalDrawable> currentDrawable = [_layer nextDrawable];
117
80
  if (currentDrawable == nullptr) {
118
81
  return false;
119
82
  }
120
83
 
121
- GrMtlTextureInfo fbInfo;
122
- fbInfo.fTexture.retain((__bridge void *)currentDrawable.texture);
123
-
124
- GrBackendRenderTarget backendRT(_layer.drawableSize.width,
125
- _layer.drawableSize.height, 1, fbInfo);
126
-
127
- auto skSurface = SkSurfaces::WrapBackendRenderTarget(
128
- renderContext->skContext.get(), backendRT, kTopLeft_GrSurfaceOrigin,
129
- kBGRA_8888_SkColorType, nullptr, nullptr);
130
-
131
- if (skSurface == nullptr || skSurface->getCanvas() == nullptr) {
132
- RNSkia::RNSkLogger::logToConsole(
133
- "Skia surface could not be created from parameters.");
134
- return false;
135
- }
84
+ auto skSurface = SkiaMetalSurfaceFactory::makeWindowedSurface(
85
+ currentDrawable.texture, _layer.drawableSize.width,
86
+ _layer.drawableSize.height);
136
87
 
137
88
  SkCanvas *canvas = skSurface->getCanvas();
138
89
  cb(canvas);
@@ -140,11 +91,11 @@ bool RNSkMetalCanvasProvider::renderToCanvas(
140
91
  skSurface->flushAndSubmit();
141
92
 
142
93
  id<MTLCommandBuffer> commandBuffer(
143
- [renderContext->commandQueue commandBuffer]);
94
+ [ThreadContextHolder::ThreadSkiaMetalContext
95
+ .commandQueue commandBuffer]);
144
96
  [commandBuffer presentDrawable:currentDrawable];
145
97
  [commandBuffer commit];
146
98
  }
147
-
148
99
  return true;
149
100
  };
150
101
 
@@ -64,6 +64,7 @@ public:
64
64
 
65
65
  void raiseError(const std::exception &err) override;
66
66
  sk_sp<SkSurface> makeOffscreenSurface(int width, int height) override;
67
+ sk_sp<SkFontMgr> createFontMgr() override;
67
68
 
68
69
  void willInvalidateModules() {
69
70
  // We need to do some house-cleaning here!
@@ -4,13 +4,16 @@
4
4
  #include <thread>
5
5
  #include <utility>
6
6
 
7
- #include <SkiaMetalRenderer.h>
7
+ #include <SkiaMetalSurfaceFactory.h>
8
8
 
9
9
  #pragma clang diagnostic push
10
10
  #pragma clang diagnostic ignored "-Wdocumentation"
11
11
 
12
+ #include "SkFontMgr.h"
12
13
  #include "SkSurface.h"
13
14
 
15
+ #include "include/ports/SkFontMgr_mac_ct.h"
16
+
14
17
  #pragma clang diagnostic pop
15
18
 
16
19
  namespace RNSkia {
@@ -59,7 +62,11 @@ void RNSkiOSPlatformContext::raiseError(const std::exception &err) {
59
62
 
60
63
  sk_sp<SkSurface> RNSkiOSPlatformContext::makeOffscreenSurface(int width,
61
64
  int height) {
62
- return MakeOffscreenMetalSurface(width, height);
65
+ return SkiaMetalSurfaceFactory::makeOffscreenSurface(width, height);
66
+ }
67
+
68
+ sk_sp<SkFontMgr> RNSkiOSPlatformContext::createFontMgr() {
69
+ return SkFontMgr_New_CoreText(nullptr);
63
70
  }
64
71
 
65
72
  void RNSkiOSPlatformContext::runOnMainThread(std::function<void()> func) {
@@ -0,0 +1,31 @@
1
+ #import <MetalKit/MetalKit.h>
2
+
3
+ #pragma clang diagnostic push
4
+ #pragma clang diagnostic ignored "-Wdocumentation"
5
+
6
+ #import "SkCanvas.h"
7
+ #import <include/gpu/GrDirectContext.h>
8
+
9
+ #pragma clang diagnostic pop
10
+
11
+ using SkiaMetalContext = struct SkiaMetalContext {
12
+ id<MTLCommandQueue> commandQueue = nullptr;
13
+ sk_sp<GrDirectContext> skContext = nullptr;
14
+ };
15
+
16
+ class ThreadContextHolder {
17
+ public:
18
+ static thread_local SkiaMetalContext ThreadSkiaMetalContext;
19
+ };
20
+
21
+ class SkiaMetalSurfaceFactory {
22
+ public:
23
+ static sk_sp<SkSurface> makeWindowedSurface(id<MTLTexture> texture, int width,
24
+ int height);
25
+ static sk_sp<SkSurface> makeOffscreenSurface(int width, int height);
26
+
27
+ private:
28
+ static id<MTLDevice> device;
29
+ static bool
30
+ createSkiaDirectContextIfNecessary(SkiaMetalContext *threadContext);
31
+ };