@shopify/react-native-skia 0.1.120 → 0.1.123

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. package/android/CMakeLists.txt +33 -17
  2. package/android/build.gradle +81 -34
  3. package/android/cpp/jni/JniSkiaDrawView.cpp +14 -71
  4. package/android/cpp/jni/JniSkiaManager.cpp +1 -1
  5. package/android/cpp/jni/include/JniSkiaDrawView.h +18 -22
  6. package/android/cpp/jni/include/JniSkiaManager.h +4 -4
  7. package/android/cpp/rnskia-android/RNSkDrawViewImpl.cpp +68 -0
  8. package/android/cpp/rnskia-android/RNSkDrawViewImpl.h +48 -0
  9. package/android/cpp/{jni/include/JniPlatformContextWrapper.h → rnskia-android/RNSkPlatformContextImpl.h} +4 -4
  10. package/android/cpp/{jni → rnskia-android}/SkiaOpenGLRenderer.cpp +39 -54
  11. package/android/cpp/{jni/include → rnskia-android}/SkiaOpenGLRenderer.h +2 -31
  12. package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +1 -1
  13. package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaViewManager.java +1 -1
  14. package/android/src/main/java/com/shopify/reactnative/skia/SkiaDrawView.java +21 -28
  15. package/cpp/api/JsiSkApi.h +2 -0
  16. package/cpp/api/JsiSkColor.h +49 -0
  17. package/cpp/api/JsiSkPath.h +31 -2
  18. package/cpp/api/JsiSkPathFactory.h +96 -1
  19. package/cpp/api/third_party/CSSColorParser.h +324 -0
  20. package/cpp/rnskia/RNSkAnimation.h +4 -7
  21. package/cpp/rnskia/RNSkDrawView.cpp +77 -116
  22. package/cpp/rnskia/RNSkDrawView.h +5 -35
  23. package/cpp/rnskia/RNSkJsiViewApi.h +8 -5
  24. package/cpp/rnskia/RNSkManager.cpp +2 -2
  25. package/cpp/rnskia/RNSkManager.h +2 -2
  26. package/cpp/rnskia/RNSkPlatformContext.h +1 -1
  27. package/cpp/rnskia/values/RNSkClockValue.h +19 -11
  28. package/cpp/rnskia/values/RNSkDerivedValue.h +1 -1
  29. package/cpp/rnskia/values/RNSkReadonlyValue.h +15 -15
  30. package/cpp/utils/RNSkTimingInfo.h +13 -1
  31. package/ios/RNSkia-iOS/RNSkDrawViewImpl.h +5 -7
  32. package/ios/RNSkia-iOS/RNSkDrawViewImpl.mm +25 -10
  33. package/ios/RNSkia-iOS/SkiaDrawView.mm +21 -15
  34. package/lib/commonjs/renderer/Canvas.js +3 -3
  35. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  36. package/lib/commonjs/renderer/components/Paint.js +1 -1
  37. package/lib/commonjs/renderer/components/Paint.js.map +1 -1
  38. package/lib/commonjs/renderer/components/shapes/Path.js +10 -2
  39. package/lib/commonjs/renderer/components/shapes/Path.js.map +1 -1
  40. package/lib/commonjs/renderer/nodes/Node.js +3 -3
  41. package/lib/commonjs/renderer/nodes/Node.js.map +1 -1
  42. package/lib/commonjs/renderer/processors/Paint.js +6 -1
  43. package/lib/commonjs/renderer/processors/Paint.js.map +1 -1
  44. package/lib/commonjs/skia/Color.js +3 -25
  45. package/lib/commonjs/skia/Color.js.map +1 -1
  46. package/lib/commonjs/skia/Image/Image.js.map +1 -1
  47. package/lib/commonjs/skia/ImageFilter/ImageFilterFactory.js.map +1 -1
  48. package/lib/commonjs/skia/Paint/Paint.js +13 -1
  49. package/lib/commonjs/skia/Paint/Paint.js.map +1 -1
  50. package/lib/commonjs/skia/Paint/usePaint.js +2 -4
  51. package/lib/commonjs/skia/Paint/usePaint.js.map +1 -1
  52. package/lib/commonjs/skia/Path/Path.js +13 -1
  53. package/lib/commonjs/skia/Path/Path.js.map +1 -1
  54. package/lib/commonjs/skia/Shader/Shader.js.map +1 -1
  55. package/lib/commonjs/skia/Skia.js +43 -3
  56. package/lib/commonjs/skia/Skia.js.map +1 -1
  57. package/lib/module/renderer/Canvas.js +2 -2
  58. package/lib/module/renderer/Canvas.js.map +1 -1
  59. package/lib/module/renderer/components/Paint.js +2 -2
  60. package/lib/module/renderer/components/Paint.js.map +1 -1
  61. package/lib/module/renderer/components/shapes/Path.js +10 -3
  62. package/lib/module/renderer/components/shapes/Path.js.map +1 -1
  63. package/lib/module/renderer/nodes/Node.js +3 -3
  64. package/lib/module/renderer/nodes/Node.js.map +1 -1
  65. package/lib/module/renderer/processors/Paint.js +6 -1
  66. package/lib/module/renderer/processors/Paint.js.map +1 -1
  67. package/lib/module/skia/Color.js +2 -21
  68. package/lib/module/skia/Color.js.map +1 -1
  69. package/lib/module/skia/Image/Image.js.map +1 -1
  70. package/lib/module/skia/ImageFilter/ImageFilterFactory.js.map +1 -1
  71. package/lib/module/skia/Paint/Paint.js +6 -0
  72. package/lib/module/skia/Paint/Paint.js.map +1 -1
  73. package/lib/module/skia/Paint/usePaint.js +2 -3
  74. package/lib/module/skia/Paint/usePaint.js.map +1 -1
  75. package/lib/module/skia/Path/Path.js +11 -0
  76. package/lib/module/skia/Path/Path.js.map +1 -1
  77. package/lib/module/skia/Shader/Shader.js.map +1 -1
  78. package/lib/module/skia/Skia.js +45 -2
  79. package/lib/module/skia/Skia.js.map +1 -1
  80. package/lib/typescript/src/renderer/components/shapes/Path.d.ts +3 -1
  81. package/lib/typescript/src/renderer/processors/Paint.d.ts +2 -1
  82. package/lib/typescript/src/skia/Color.d.ts +0 -1
  83. package/lib/typescript/src/skia/Image/Image.d.ts +3 -3
  84. package/lib/typescript/src/skia/ImageFilter/ImageFilterFactory.d.ts +2 -2
  85. package/lib/typescript/src/skia/Paint/Paint.d.ts +3 -2
  86. package/lib/typescript/src/skia/Path/Path.d.ts +13 -0
  87. package/lib/typescript/src/skia/Path/PathFactory.d.ts +7 -1
  88. package/lib/typescript/src/skia/Picture/Picture.d.ts +2 -2
  89. package/lib/typescript/src/skia/RuntimeEffect/RuntimeEffect.d.ts +3 -3
  90. package/lib/typescript/src/skia/Shader/Shader.d.ts +2 -2
  91. package/lib/typescript/src/skia/Shader/ShaderFactory.d.ts +9 -9
  92. package/lib/typescript/src/skia/Skia.d.ts +5 -3
  93. package/package.json +1 -1
  94. package/scripts/install-npm.js +1 -1
  95. package/src/renderer/Canvas.tsx +2 -2
  96. package/src/renderer/components/Paint.tsx +2 -2
  97. package/src/renderer/components/shapes/Path.tsx +12 -4
  98. package/src/renderer/nodes/Node.ts +3 -3
  99. package/src/renderer/processors/Paint.ts +5 -0
  100. package/src/skia/Color.ts +3 -20
  101. package/src/skia/Image/Image.ts +3 -3
  102. package/src/skia/ImageFilter/ImageFilterFactory.ts +2 -2
  103. package/src/skia/Paint/Paint.ts +9 -2
  104. package/src/skia/Paint/usePaint.ts +2 -4
  105. package/src/skia/Path/Path.ts +16 -0
  106. package/src/skia/Path/PathFactory.ts +8 -1
  107. package/src/skia/Picture/Picture.ts +2 -2
  108. package/src/skia/RuntimeEffect/RuntimeEffect.ts +4 -4
  109. package/src/skia/Shader/Shader.ts +2 -2
  110. package/src/skia/Shader/ShaderFactory.ts +9 -9
  111. package/src/skia/Skia.ts +47 -3
@@ -10,12 +10,20 @@ set (SKIA_SVG_LIB "svg")
10
10
  set (SKIA_SKSHAPER_LIB "skshaper")
11
11
 
12
12
  set(build_DIR ${CMAKE_SOURCE_DIR}/build)
13
- file (GLOB LIBRN_DIR "${build_DIR}/react-native-0*/jni/${ANDROID_ABI}")
13
+ file(GLOB LIBRN_DIR "${PREBUILT_DIR}/${ANDROID_ABI}")
14
14
  file(GLOB libfbjni_link_DIRS "${build_DIR}/fbjni*.aar/jni/${ANDROID_ABI}")
15
15
  file(GLOB libfbjni_include_DIRS "${build_DIR}/fbjni-*-headers.jar/")
16
16
 
17
17
  link_directories(../libs/android/${ANDROID_ABI}/)
18
18
 
19
+ if(${REACT_NATIVE_VERSION} LESS 66)
20
+ file(
21
+ TO_CMAKE_PATH
22
+ "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp"
23
+ INCLUDE_JSI_CPP
24
+ )
25
+ endif()
26
+
19
27
  add_library(
20
28
  ${PACKAGE_NAME}
21
29
  SHARED
@@ -23,7 +31,8 @@ add_library(
23
31
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniSkiaManager.cpp"
24
32
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniSkiaDrawView.cpp"
25
33
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniPlatformContext.cpp"
26
- "${PROJECT_SOURCE_DIR}/cpp/jni/SkiaOpenGLRenderer.cpp"
34
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkDrawViewImpl.cpp"
35
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/SkiaOpenGLRenderer.cpp"
27
36
 
28
37
  "${PROJECT_SOURCE_DIR}/cpp/jsi/JsiHostObject.cpp"
29
38
 
@@ -39,16 +48,10 @@ target_include_directories(
39
48
  PRIVATE
40
49
 
41
50
  # When installed in the development environment
42
- "../node_modules/react-native/ReactCommon/callinvoker"
43
- "../node_modules/react-native/ReactCommon/jsi"
44
- "../node_modules/react-native/ReactCommon/react/nativemodule/core"
45
- "../node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni"
46
-
47
- # When installed as a package the paths are a bit different
48
- "../../../react-native/ReactCommon/callinvoker"
49
- "../../../react-native/ReactCommon/jsi"
50
- "../../../react-native/ReactCommon/react/nativemodule/core"
51
- "../../../react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni"
51
+ "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker"
52
+ "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi"
53
+ "${NODE_MODULES_DIR}/react-native/ReactCommon/react/nativemodule/core"
54
+ "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni"
52
55
 
53
56
  cpp/skia/include/config/
54
57
  cpp/skia/include/core/
@@ -62,6 +65,7 @@ target_include_directories(
62
65
  cpp/api
63
66
  cpp/jsi
64
67
  cpp/jni/include
68
+ cpp/rnskia-android
65
69
  cpp/rnskia
66
70
  cpp/rnskia/values
67
71
  cpp/utils
@@ -87,11 +91,23 @@ find_library(
87
91
  )
88
92
 
89
93
  find_library(
90
- JSI_LIB
91
- jsi
92
- PATHS ${LIBRN_DIR}
93
- NO_CMAKE_FIND_ROOT_PATH
94
- )
94
+ JSI_LIB
95
+ jsi
96
+ PATHS ${LIBRN_DIR}
97
+ NO_CMAKE_FIND_ROOT_PATH
98
+ )
99
+ if(${REACT_NATIVE_VERSION} LESS 66)
100
+ # JSI lib didn't exist on RN 0.65 and before. Simply omit it.
101
+ set (JSI_LIB "")
102
+ else()
103
+ # RN 0.66 distributes libjsi.so, can be used instead of compiling jsi.cpp manually.
104
+ find_library(
105
+ JSI_LIB
106
+ jsi
107
+ PATHS ${LIBRN_DIR}
108
+ NO_CMAKE_FIND_ROOT_PATH
109
+ )
110
+ endif()
95
111
 
96
112
  find_library(
97
113
  REACT_LIB
@@ -1,3 +1,5 @@
1
+ import java.nio.file.Paths
2
+
1
3
  // android/build.gradle
2
4
 
3
5
  // based on:
@@ -26,6 +28,60 @@ def safeExtGet(prop, fallback) {
26
28
 
27
29
  apply plugin: 'com.android.library'
28
30
 
31
+ static def findNodeModules(baseDir) {
32
+ def basePath = baseDir.toPath().normalize()
33
+ // Node's module resolution algorithm searches up to the root directory,
34
+ // after which the base path will be null
35
+ while (basePath) {
36
+ def nodeModulesPath = Paths.get(basePath.toString(), "node_modules")
37
+ def reactNativePath = Paths.get(nodeModulesPath.toString(), "react-native")
38
+ if (nodeModulesPath.toFile().exists() && reactNativePath.toFile().exists()) {
39
+ return nodeModulesPath.toString()
40
+ }
41
+ basePath = basePath.getParent()
42
+ }
43
+ throw new GradleException("React-Native-Skia: Failed to find node_modules/ path!")
44
+ }
45
+
46
+ def nodeModules = findNodeModules(projectDir)
47
+ logger.warn("react-native-skia: node_modules/ found at: ${nodeModules}")
48
+
49
+ def sourceBuild = false
50
+ def defaultDir = null
51
+ def androidSourcesDir = null
52
+ def androidSourcesName = 'React Native sources'
53
+
54
+ if (rootProject.ext.has('reactNativeAndroidRoot')) {
55
+ defaultDir = rootProject.ext.get('reactNativeAndroidRoot')
56
+ androidSourcesDir = defaultDir.parentFile.toString()
57
+ } else if (findProject(':ReactAndroid') != null) {
58
+ sourceBuild = true
59
+ defaultDir = project(':ReactAndroid').projectDir
60
+ androidSourcesDir = defaultDir.parentFile.toString()
61
+ } else {
62
+ defaultDir = file("$nodeModules/react-native/android")
63
+ androidSourcesDir = defaultDir.parentFile.toString()
64
+ }
65
+
66
+ if (!defaultDir.exists()) {
67
+ throw new GradleException(
68
+ "${project.name}: React Native android directory (node_modules/react-native/android) does not exist! Resolved node_modules to: ${nodeModules}"
69
+ )
70
+ }
71
+
72
+ def prebuiltDir = sourceBuild
73
+ ? "$nodeModules/react-native/ReactAndroid/src/main/jni/prebuilt/lib"
74
+ : "$buildDir/react-native-0*/jni"
75
+
76
+
77
+ def reactProperties = new Properties()
78
+ file("$nodeModules/react-native/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
79
+ def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME").split("\\.")[1].toInteger()
80
+
81
+ logger.warn("react-native-skia: React Native version: ${REACT_NATIVE_VERSION}")
82
+ logger.warn("react-native-skia: Is Source build: ${sourceBuild}")
83
+ logger.warn("react-native-skia: Prebuilt dir: ${prebuiltDir}")
84
+
29
85
  buildscript {
30
86
  // The Android Gradle plugin is only required when opening the android folder stand-alone.
31
87
  // This avoids unnecessary downloads and potential conflicts when the library is included as a
@@ -56,7 +112,10 @@ android {
56
112
  cmake {
57
113
  cppFlags "-fexceptions", "-frtti", "-std=c++1y", "-DONANDROID"
58
114
  abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
59
- arguments '-DANDROID_STL=c++_shared'
115
+ arguments '-DANDROID_STL=c++_shared',
116
+ "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}",
117
+ "-DNODE_MODULES_DIR=${nodeModules}",
118
+ "-DPREBUILT_DIR=${prebuiltDir}"
60
119
  }
61
120
  }
62
121
  }
@@ -72,7 +131,13 @@ android {
72
131
  }
73
132
 
74
133
  packagingOptions {
75
- excludes = ["**/libc++_shared.so"]
134
+ excludes = [
135
+ "**/libc++_shared.so",
136
+ "**/libfbjni.so",
137
+ "**/libjsi.so",
138
+ "**/libreact_nativemodule_core.so",
139
+ "**/libturbomodulejsijni.so"
140
+ ]
76
141
  }
77
142
 
78
143
 
@@ -114,33 +179,6 @@ dependencies {
114
179
  extractJNI(files(rnAAR))
115
180
  }
116
181
 
117
- def configureReactNativePom(def pom) {
118
- def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text)
119
-
120
- pom.project {
121
- name packageJson.title
122
- artifactId packageJson.name
123
- version = packageJson.version
124
- group = "com.shopify.reactnative.skia"
125
- description packageJson.description
126
- url packageJson.repository.baseUrl
127
-
128
- licenses {
129
- license {
130
- name packageJson.license
131
- url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename
132
- distribution 'repo'
133
- }
134
- }
135
-
136
- developers {
137
- developer {
138
- name packageJson.author
139
- }
140
- }
141
- }
142
- }
143
-
144
182
  afterEvaluate { project ->
145
183
  task androidSourcesJar(type: Jar) {
146
184
  classifier = 'sources'
@@ -188,9 +226,18 @@ task extractJNIFiles {
188
226
  }
189
227
  }
190
228
 
191
- tasks.whenTaskAdded { task ->
192
- if (task.name.contains('externalNativeBuild')) {
193
- task.dependsOn(extractAARHeaders)
194
- task.dependsOn(extractJNIFiles)
195
- }
229
+ extractJNIFiles.mustRunAfter extractAARHeaders
230
+
231
+ def nativeBuildDependsOn(dependsOnTask, variant) {
232
+ def buildTasks = tasks.findAll({ task ->
233
+ !task.name.contains("Clean") && (task.name.contains("externalNative") || task.name.contains("CMake")) })
234
+ if (variant != null) {
235
+ buildTasks = buildTasks.findAll({ task -> task.name.contains(variant) })
236
+ }
237
+ buildTasks.forEach { task -> task.dependsOn(dependsOnTask) }
196
238
  }
239
+
240
+ afterEvaluate {
241
+ nativeBuildDependsOn(extractAARHeaders, null)
242
+ nativeBuildDependsOn(extractJNIFiles, null)
243
+ }
@@ -31,16 +31,13 @@ namespace RNSkia
31
31
  /**** DTOR ***/
32
32
  JniSkiaDrawView::~JniSkiaDrawView()
33
33
  {
34
- #if LOG_ALL_DRAWING
35
- RNSkLogger::logToConsole("JniSkiaDrawView::~JniSkiaDrawView %i", getNativeId());
36
- #endif
37
34
  }
38
35
 
39
36
  /**** JNI ****/
40
37
 
41
38
  TSelf JniSkiaDrawView::initHybrid(
42
- alias_ref<HybridClass::jhybridobject> jThis,
43
- JavaSkiaManager skiaManager)
39
+ alias_ref<HybridClass::jhybridobject> jThis,
40
+ JavaSkiaManager skiaManager)
44
41
  {
45
42
  return makeCxxInstance(jThis, skiaManager);
46
43
  }
@@ -60,17 +57,17 @@ namespace RNSkia
60
57
  {
61
58
  if (mode.compare("continuous") == 0)
62
59
  {
63
- setDrawingMode(RNSkDrawingMode::Continuous);
60
+ _drawView->setDrawingMode(RNSkDrawingMode::Continuous);
64
61
  }
65
62
  else
66
63
  {
67
- setDrawingMode(RNSkDrawingMode::Default);
64
+ _drawView->setDrawingMode(RNSkDrawingMode::Default);
68
65
  }
69
66
  }
70
67
 
71
68
  void JniSkiaDrawView::setDebugMode(bool show)
72
69
  {
73
- setShowDebugOverlays(show);
70
+ _drawView->setShowDebugOverlays(show);
74
71
  }
75
72
 
76
73
  void JniSkiaDrawView::updateTouchPoints(jni::JArrayDouble touches)
@@ -78,7 +75,7 @@ namespace RNSkia
78
75
  // Create touch points
79
76
  std::vector<RNSkia::RNSkTouchPoint> points;
80
77
  auto pin = touches.pin();
81
- auto scale = getPlatformContext()->getPixelDensity();
78
+ auto scale = _drawView->getPixelDensity();
82
79
  points.reserve(pin.size() / 4);
83
80
  for (size_t i = 0; i < pin.size(); i += 4)
84
81
  {
@@ -89,81 +86,27 @@ namespace RNSkia
89
86
  point.type = (RNSkia::RNSkTouchType)pin[i + 3];
90
87
  points.push_back(point);
91
88
  }
92
- updateTouchState(std::move(points));
89
+ _drawView->updateTouchState(std::move(points));
93
90
  }
94
91
 
95
92
  void JniSkiaDrawView::surfaceAvailable(jobject surface, int width, int height)
96
93
  {
97
- #if LOG_ALL_DRAWING
98
- RNSkLogger::logToConsole("JniSkiaDrawView::surfaceAvailable %i", getNativeId());
99
- #endif
100
-
101
- _width = width;
102
- _height = height;
103
-
104
- if (_renderer == nullptr)
105
- {
106
- // Create renderer!
107
- _renderer = new SkiaOpenGLRenderer(
108
- ANativeWindow_fromSurface(Environment::current(), surface), getNativeId());
109
-
110
- // Set the draw function
111
- setNativeDrawFunc(std::bind(&JniSkiaDrawView::drawFrame, this, std::placeholders::_1));
112
-
113
- // Redraw
114
- requestRedraw();
115
- }
94
+ _drawView->surfaceAvailable(ANativeWindow_fromSurface(Environment::current(), surface), width, height);
116
95
  }
117
96
 
118
97
  void JniSkiaDrawView::surfaceSizeChanged(int width, int height)
119
98
  {
120
- #if LOG_ALL_DRAWING
121
- RNSkLogger::logToConsole("JniSkiaDrawView::surfaceSizeChanged %i", getNativeId());
122
- #endif
123
-
124
- _width = width;
125
- _height = height;
126
-
127
- // Redraw after size change
128
- requestRedraw();
99
+ _drawView->surfaceSizeChanged(width, height);
129
100
  }
130
101
 
131
102
  void JniSkiaDrawView::surfaceDestroyed()
132
103
  {
133
- #if LOG_ALL_DRAWING
134
- RNSkLogger::logToConsole("JniSkiaDrawView::surfaceDestroyed %i", getNativeId());
135
- #endif
136
- if (_renderer != nullptr)
137
- {
138
- // Turn off drawing
139
- setNativeDrawFunc(nullptr);
140
-
141
- // Start teardown
142
- _renderer->teardown();
143
-
144
- // Ask for a redraw to tear down the render pipeline. This
145
- // needs to be done on the render thread since OpenGL demands
146
- // same thread access for OpenGL contexts.
147
- getPlatformContext()->runOnRenderThread([this]()
148
- {
149
- if(_renderer != nullptr) {
150
- _renderer->run(nullptr, 0, 0);
151
- } });
152
-
153
- // Wait until the above render has finished.
154
- _renderer->waitForTeardown();
155
-
156
- // Delete renderer. All resources should be released during teardown.
157
- delete _renderer;
158
- _renderer = nullptr;
159
- }
104
+ _drawView->surfaceDestroyed();
160
105
  }
161
106
 
162
- /**** Render method ****/
163
-
164
- void JniSkiaDrawView::drawFrame(const sk_sp<SkPicture> picture)
165
- {
166
- // No need to check if the renderer is nullptr since we only get here if it is not.
167
- _renderer->run(picture, _width, _height);
107
+ void JniSkiaDrawView::releaseSurface() {
108
+ jni::ThreadScope ts;
109
+ static auto method = javaPart_->getClass()->getMethod<void(void)>("releaseSurface");
110
+ method(javaPart_.get());
168
111
  }
169
112
  } // namespace RNSkia
@@ -47,7 +47,7 @@ void JniSkiaManager::initializeRuntime() {
47
47
  }
48
48
 
49
49
  void JniSkiaManager::registerSkiaView(int viewTag, JniSkiaDrawView *skiaView) {
50
- _skManager->registerSkiaDrawView(viewTag, skiaView);
50
+ _skManager->registerSkiaDrawView(viewTag, skiaView->getDrawViewImpl());
51
51
  }
52
52
 
53
53
  void JniSkiaManager::unregisterSkiaView(int viewTag) {
@@ -5,17 +5,16 @@
5
5
  #include <thread>
6
6
  #include <string>
7
7
 
8
- #include <EGL/egl.h>
9
- #include <GLES2/gl2.h>
10
8
  #include <fbjni/fbjni.h>
11
9
  #include <jni.h>
12
10
  #include <jsi/jsi.h>
13
11
  #include <thread>
14
12
 
15
13
  #include <RNSkDrawView.h>
16
- #include "JniSkiaManager.h"
17
- #include "JniSkiaDrawView.h"
18
- #include "SkiaOpenGLRenderer.h"
14
+ #include <JniSkiaManager.h>
15
+ #include <JniSkiaDrawView.h>
16
+
17
+ #include <RNSkDrawViewImpl.h>
19
18
 
20
19
  #include <SkSurface.h>
21
20
  #include <SkRefCnt.h>
@@ -31,16 +30,15 @@ namespace RNSkia
31
30
 
32
31
  using JavaSkiaManager = jni::alias_ref<JniSkiaManager::javaobject>;
33
32
 
34
- class JniSkiaDrawView : public jni::HybridClass<JniSkiaDrawView>,
35
- public RNSkDrawView
33
+ class JniSkiaDrawView : public jni::HybridClass<JniSkiaDrawView>
36
34
  {
37
35
  public:
38
36
  static auto constexpr kJavaDescriptor = "Lcom/shopify/reactnative/skia/SkiaDrawView;";
39
37
  static auto constexpr TAG = "ReactNativeSkia";
40
38
 
41
39
  static jni::local_ref<jhybriddata> initHybrid(
42
- jni::alias_ref<jhybridobject>,
43
- JavaSkiaManager);
40
+ jni::alias_ref<jhybridobject>,
41
+ JavaSkiaManager);
44
42
 
45
43
  static void registerNatives();
46
44
 
@@ -52,30 +50,28 @@ namespace RNSkia
52
50
 
53
51
  ~JniSkiaDrawView();
54
52
 
55
- protected:
56
- int getWidth() override { return _width; }
57
- int getHeight() override { return _height; }
53
+ std::shared_ptr<RNSkDrawView> getDrawViewImpl() { return _drawView; }
54
+
55
+ void releaseSurface();
58
56
 
57
+ protected:
59
58
  void setMode(std::string mode);
60
59
  void setDebugMode(bool show);
61
60
 
62
61
  private:
63
62
  friend HybridBase;
64
63
 
65
- void drawFrame(const sk_sp<SkPicture> picture);
66
-
67
- int _width = 0;
68
- int _height = 0;
69
-
70
- SkiaOpenGLRenderer* _renderer = nullptr;
64
+ std::shared_ptr<RNSkDrawViewImpl> _drawView;
71
65
 
72
66
  jni::global_ref<JniSkiaDrawView::javaobject> javaPart_;
73
67
 
74
68
  explicit JniSkiaDrawView(
75
- jni::alias_ref<JniSkiaDrawView::jhybridobject> jThis,
76
- JavaSkiaManager skiaManager)
77
- : javaPart_(jni::make_global(jThis)),
78
- RNSkDrawView(skiaManager->cthis()->getPlatformContext()) {
69
+ jni::alias_ref<JniSkiaDrawView::jhybridobject> jThis,
70
+ JavaSkiaManager skiaManager)
71
+ : javaPart_(jni::make_global(jThis)),
72
+ _drawView(std::make_shared<RNSkDrawViewImpl>(skiaManager->cthis()->getPlatformContext(), [this]() {
73
+ releaseSurface();
74
+ })) {
79
75
  }
80
76
  };
81
77
 
@@ -7,7 +7,7 @@
7
7
  #include <memory>
8
8
 
9
9
  #include <JniPlatformContext.h>
10
- #include <JniPlatformContextWrapper.h>
10
+ #include <RNSkPlatformContextImpl.h>
11
11
 
12
12
  #include <RNSkLog.h>
13
13
 
@@ -48,14 +48,14 @@ class JniSkiaManager : public jni::HybridClass<JniSkiaManager> {
48
48
  : _javaPart(jni::make_global(jThis)),
49
49
  _jsRuntime(runtime),
50
50
  _jsCallInvoker(jsCallInvoker),
51
- _context(std::make_shared<JniPlatformContextWrapper>(platformContext, runtime, jsCallInvoker)) {
51
+ _context(std::make_shared<RNSkPlatformContextImpl>(platformContext, runtime, jsCallInvoker)) {
52
52
 
53
53
  }
54
54
 
55
55
  void registerSkiaView(int viewTag, JniSkiaDrawView *skiaView);
56
56
  void unregisterSkiaView(int viewTag);
57
57
 
58
- std::shared_ptr<JniPlatformContextWrapper> getPlatformContext() { return _context; }
58
+ std::shared_ptr<RNSkPlatformContextImpl> getPlatformContext() { return _context; }
59
59
 
60
60
  void invalidate() {
61
61
  _context->stopDrawLoop();
@@ -73,7 +73,7 @@ class JniSkiaManager : public jni::HybridClass<JniSkiaManager> {
73
73
 
74
74
  jsi::Runtime *_jsRuntime;
75
75
  std::shared_ptr<facebook::react::CallInvoker> _jsCallInvoker;
76
- std::shared_ptr<JniPlatformContextWrapper> _context;
76
+ std::shared_ptr<RNSkPlatformContextImpl> _context;
77
77
 
78
78
  void initializeRuntime();
79
79
  };
@@ -0,0 +1,68 @@
1
+ #include <RNSkDrawViewImpl.h>
2
+
3
+ #pragma clang diagnostic push
4
+ #pragma clang diagnostic ignored "-Wdocumentation"
5
+
6
+ #include <SkSurface.h>
7
+ #include <SkCanvas.h>
8
+
9
+ #pragma clang diagnostic pop
10
+
11
+ #include <RNSkLog.h>
12
+
13
+ namespace RNSkia {
14
+ RNSkDrawViewImpl::RNSkDrawViewImpl(std::shared_ptr <RNSkia::RNSkPlatformContext> context, std::function<void()> releaseSurfaceCallback) :
15
+ RNSkia::RNSkDrawView(context),
16
+ _releaseSurfaceCallback(std::move(releaseSurfaceCallback)) {}
17
+
18
+ void RNSkDrawViewImpl::surfaceAvailable(ANativeWindow* surface, int width, int height) {
19
+ _width = width;
20
+ _height = height;
21
+
22
+ if (_renderer == nullptr)
23
+ {
24
+ // Create renderer!
25
+ _renderer = std::make_unique<SkiaOpenGLRenderer>(surface, getNativeId());
26
+
27
+ // Redraw
28
+ requestRedraw();
29
+ }
30
+ }
31
+
32
+ void RNSkDrawViewImpl::surfaceDestroyed() {
33
+ if (_renderer != nullptr)
34
+ {
35
+ // Start teardown
36
+ _renderer->teardown();
37
+
38
+ // Teardown renderer on the render thread since OpenGL demands
39
+ // same thread access for OpenGL contexts.
40
+ getPlatformContext()->runOnRenderThread([weakSelf = weak_from_this()]() {
41
+ auto self = weakSelf.lock();
42
+ if(self) {
43
+ auto drawViewImpl = std::dynamic_pointer_cast<RNSkDrawViewImpl>(self);
44
+ if(drawViewImpl->_renderer != nullptr) {
45
+ drawViewImpl->_renderer->run(nullptr, 0, 0);
46
+ }
47
+ // Remove renderer
48
+ drawViewImpl->_renderer = nullptr;
49
+ drawViewImpl->_releaseSurfaceCallback();
50
+ }
51
+ });
52
+ }
53
+ }
54
+
55
+ void RNSkDrawViewImpl::surfaceSizeChanged(int width, int height) {
56
+ _width = width;
57
+ _height = height;
58
+
59
+ // Redraw after size change
60
+ requestRedraw();
61
+ }
62
+
63
+ void RNSkDrawViewImpl::drawPicture(const sk_sp <SkPicture> picture) {
64
+ if(_renderer != nullptr) {
65
+ _renderer->run(picture, _width, _height);
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,48 @@
1
+ #pragma once
2
+
3
+ #include <RNSkDrawView.h>
4
+
5
+ #include <SkiaOpenGLRenderer.h>
6
+ #include <android/native_window.h>
7
+
8
+ #pragma clang diagnostic push
9
+ #pragma clang diagnostic ignored "-Wdocumentation"
10
+
11
+ #include <SkPicture.h>
12
+ #include <SkRefCnt.h>
13
+
14
+ #pragma clang diagnostic pop
15
+
16
+ namespace RNSkia {
17
+ class RNSkDrawViewImpl : public RNSkia::RNSkDrawView {
18
+ public:
19
+ RNSkDrawViewImpl(std::shared_ptr <RNSkia::RNSkPlatformContext> context,
20
+ std::function<void()> releaseSurfaceCallback);
21
+
22
+ void surfaceAvailable(ANativeWindow* surface, int, int);
23
+ void surfaceDestroyed();
24
+ void surfaceSizeChanged(int, int);
25
+
26
+ float getPixelDensity() {
27
+ return getPlatformContext()->getPixelDensity();
28
+ }
29
+
30
+ protected:
31
+ int getWidth() override { return _width * getPlatformContext()->getPixelDensity(); };
32
+
33
+ int getHeight() override { return _height * getPlatformContext()->getPixelDensity(); };
34
+
35
+ void drawPicture(const sk_sp <SkPicture> picture) override;
36
+
37
+ private:
38
+ bool createSkiaSurface();
39
+
40
+ std::unique_ptr<SkiaOpenGLRenderer> _renderer = nullptr;
41
+
42
+ int _nativeId;
43
+ int _width = -1;
44
+ int _height = -1;
45
+
46
+ std::function<void()> _releaseSurfaceCallback;
47
+ };
48
+ }
@@ -11,11 +11,11 @@
11
11
  namespace RNSkia {
12
12
  using namespace facebook;
13
13
 
14
- class JniPlatformContextWrapper: public RNSkPlatformContext {
14
+ class RNSkPlatformContextImpl: public RNSkPlatformContext {
15
15
  public:
16
- JniPlatformContextWrapper(JniPlatformContext* jniPlatformContext,
17
- jsi::Runtime *runtime,
18
- std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) :
16
+ RNSkPlatformContextImpl(JniPlatformContext* jniPlatformContext,
17
+ jsi::Runtime *runtime,
18
+ std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) :
19
19
  RNSkPlatformContext(runtime,
20
20
  jsCallInvoker,
21
21
  jniPlatformContext->getPixelDensity()),