@shopify/react-native-skia 0.1.194 → 0.1.196
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/CMakeLists.txt +1 -0
- package/android/build.gradle +6 -11
- package/android/cpp/rnskia-android/RNSkAndroidView.h +4 -0
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +3 -2
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -1
- package/android/cpp/rnskia-android/SkiaOpenGLRenderer.cpp +35 -69
- package/android/cpp/rnskia-android/SkiaOpenGLRenderer.h +1 -12
- package/cpp/api/JsiSkDataFactory.h +4 -6
- package/cpp/api/JsiSkImageFactory.h +5 -4
- package/cpp/jsi/JsiPromises.cpp +39 -0
- package/cpp/jsi/JsiPromises.h +50 -0
- package/cpp/rnskia/RNSkDomView.cpp +3 -2
- package/cpp/rnskia/RNSkPictureView.h +8 -15
- package/cpp/rnskia/RNSkView.h +13 -2
- package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +1 -1
- package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +7 -5
- package/ios/RNSkia-iOS/SkiaUIView.mm +10 -0
- package/package.json +1 -1
- package/cpp/skia/include/core/SkEncodedImageFormat.h +0 -9
- package/cpp/skia/include/core/SkICC.h +0 -9
    
        package/android/CMakeLists.txt
    CHANGED
    
    | @@ -51,6 +51,7 @@ add_library( | |
| 51 51 | 
             
                    "${PROJECT_SOURCE_DIR}/cpp/jsi/JsiValue.cpp"
         | 
| 52 52 | 
             
                    "${PROJECT_SOURCE_DIR}/cpp/jsi/RuntimeLifecycleMonitor.cpp"
         | 
| 53 53 | 
             
                    "${PROJECT_SOURCE_DIR}/cpp/jsi/RuntimeAwareCache.cpp"        
         | 
| 54 | 
            +
                    "${PROJECT_SOURCE_DIR}/cpp/jsi/JsiPromises.cpp"
         | 
| 54 55 |  | 
| 55 56 | 
             
                    "${PROJECT_SOURCE_DIR}/cpp/rnskia/RNSkManager.cpp"
         | 
| 56 57 | 
             
                    "${PROJECT_SOURCE_DIR}/cpp/rnskia/RNSkJsView.cpp"
         | 
    
        package/android/build.gradle
    CHANGED
    
    | @@ -137,6 +137,12 @@ android { | |
| 137 137 | 
             
                    abortOnError false
         | 
| 138 138 | 
             
                }
         | 
| 139 139 |  | 
| 140 | 
            +
                publishing {
         | 
| 141 | 
            +
                    singleVariant("release") {
         | 
| 142 | 
            +
                        withSourcesJar()
         | 
| 143 | 
            +
                    }
         | 
| 144 | 
            +
                }
         | 
| 145 | 
            +
             | 
| 140 146 | 
             
                externalNativeBuild {
         | 
| 141 147 | 
             
                    cmake {
         | 
| 142 148 | 
             
                        path file('CMakeLists.txt')
         | 
| @@ -223,12 +229,6 @@ dependencies { | |
| 223 229 | 
             
            }
         | 
| 224 230 |  | 
| 225 231 | 
             
            afterEvaluate { project ->
         | 
| 226 | 
            -
                task androidSourcesJar(type: Jar) {
         | 
| 227 | 
            -
                    classifier = 'sources'
         | 
| 228 | 
            -
                    from android.sourceSets.main.java.srcDirs
         | 
| 229 | 
            -
                    include '**/*.java'
         | 
| 230 | 
            -
                }
         | 
| 231 | 
            -
             | 
| 232 232 | 
             
                android.libraryVariants.all { variant ->
         | 
| 233 233 | 
             
                    def name = variant.name.capitalize()
         | 
| 234 234 | 
             
                    def javaCompileTask = variant.javaCompileProvider.get()
         | 
| @@ -237,10 +237,6 @@ afterEvaluate { project -> | |
| 237 237 | 
             
                        from javaCompileTask.destinationDir
         | 
| 238 238 | 
             
                    }
         | 
| 239 239 | 
             
                }
         | 
| 240 | 
            -
             | 
| 241 | 
            -
                artifacts {
         | 
| 242 | 
            -
                    archives androidSourcesJar
         | 
| 243 | 
            -
                }
         | 
| 244 240 | 
             
            }
         | 
| 245 241 |  | 
| 246 242 | 
             
            task extractAARHeaders {
         | 
| @@ -278,7 +274,6 @@ if (ENABLE_PREFAB) { | |
| 278 274 | 
             
                    into "${project.buildDir}/headers/rnskia/"
         | 
| 279 275 | 
             
                    includeEmptyDirs = false
         | 
| 280 276 | 
             
                    include "**/*.h"
         | 
| 281 | 
            -
                    duplicatesStrategy = 'include'
         | 
| 282 277 | 
             
                    eachFile {
         | 
| 283 278 | 
             
                        String path = it.path
         | 
| 284 279 |  | 
| @@ -42,6 +42,10 @@ public: | |
| 42 42 | 
             
              void surfaceAvailable(jobject surface, int width, int height) override {
         | 
| 43 43 | 
             
                std::static_pointer_cast<RNSkOpenGLCanvasProvider>(T::getCanvasProvider())
         | 
| 44 44 | 
             
                    ->surfaceAvailable(surface, width, height);
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                // Try to render directly when the surface has been set so that
         | 
| 47 | 
            +
                // we don't have to wait until the draw loop returns.
         | 
| 48 | 
            +
                RNSkView::renderImmediate();
         | 
| 45 49 | 
             
              }
         | 
| 46 50 |  | 
| 47 51 | 
             
              void surfaceDestroyed() override {
         | 
| @@ -23,11 +23,12 @@ float RNSkOpenGLCanvasProvider::getScaledWidth() { return _width; } | |
| 23 23 |  | 
| 24 24 | 
             
            float RNSkOpenGLCanvasProvider::getScaledHeight() { return _height; }
         | 
| 25 25 |  | 
| 26 | 
            -
             | 
| 26 | 
            +
            bool RNSkOpenGLCanvasProvider::renderToCanvas(
         | 
| 27 27 | 
             
                const std::function<void(SkCanvas *)> &cb) {
         | 
| 28 28 | 
             
              if (_renderer != nullptr) {
         | 
| 29 | 
            -
                _renderer->run(cb, _width, _height);
         | 
| 29 | 
            +
                return _renderer->run(cb, _width, _height);
         | 
| 30 30 | 
             
              }
         | 
| 31 | 
            +
              return false;
         | 
| 31 32 | 
             
            }
         | 
| 32 33 |  | 
| 33 34 | 
             
            void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject surface, int width,
         | 
| @@ -25,7 +25,7 @@ public: | |
| 25 25 |  | 
| 26 26 | 
             
              float getScaledHeight() override;
         | 
| 27 27 |  | 
| 28 | 
            -
               | 
| 28 | 
            +
              bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override;
         | 
| 29 29 |  | 
| 30 30 | 
             
              void surfaceAvailable(jobject surface, int width, int height);
         | 
| 31 31 |  | 
| @@ -4,6 +4,8 @@ | |
| 4 4 | 
             
            #include <android/native_window.h>
         | 
| 5 5 | 
             
            #include <android/native_window_jni.h>
         | 
| 6 6 |  | 
| 7 | 
            +
            #define STENCIL_BUFFER_SIZE 8
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            namespace RNSkia {
         | 
| 8 10 | 
             
            /** Static members */
         | 
| 9 11 | 
             
            sk_sp<SkSurface> MakeOffscreenGLSurface(int width, int height) {
         | 
| @@ -137,7 +139,7 @@ SkiaOpenGLRenderer::~SkiaOpenGLRenderer() { | |
| 137 139 | 
             
              _nativeWindow = nullptr;
         | 
| 138 140 | 
             
            }
         | 
| 139 141 |  | 
| 140 | 
            -
             | 
| 142 | 
            +
            bool SkiaOpenGLRenderer::run(const std::function<void(SkCanvas *)> &cb,
         | 
| 141 143 | 
             
                                         int width, int height) {
         | 
| 142 144 | 
             
              switch (_renderState) {
         | 
| 143 145 | 
             
              case RenderState::Initializing: {
         | 
| @@ -148,31 +150,48 @@ void SkiaOpenGLRenderer::run(const std::function<void(SkCanvas *)> &cb, | |
| 148 150 | 
             
              case RenderState::Rendering: {
         | 
| 149 151 | 
             
                // Make sure to initialize the rendering pipeline
         | 
| 150 152 | 
             
                if (!ensureInitialised()) {
         | 
| 151 | 
            -
                   | 
| 152 | 
            -
                }
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                // Ensure we have the Skia surface to draw on. We need to
         | 
| 155 | 
            -
                // pass width and height since the surface will be recreated
         | 
| 156 | 
            -
                // when the view is resized.
         | 
| 157 | 
            -
                if (!ensureSkiaSurface(width, height)) {
         | 
| 158 | 
            -
                  return;
         | 
| 153 | 
            +
                  return false;
         | 
| 159 154 | 
             
                }
         | 
| 160 155 |  | 
| 161 156 | 
             
                if (cb != nullptr) {
         | 
| 162 | 
            -
                  //  | 
| 163 | 
            -
             | 
| 157 | 
            +
                  // RNSkLogger::logToConsole("SKIARENDER - Render begin");
         | 
| 158 | 
            +
             | 
| 164 159 | 
             
                  getThreadDrawingContext()->skContext->resetContext();
         | 
| 165 160 |  | 
| 161 | 
            +
                  SkColorType colorType;
         | 
| 162 | 
            +
                  // setup surface for fbo0
         | 
| 163 | 
            +
                  GrGLFramebufferInfo fboInfo;
         | 
| 164 | 
            +
                  fboInfo.fFBOID = 0;
         | 
| 165 | 
            +
                  fboInfo.fFormat = 0x8058;
         | 
| 166 | 
            +
                  colorType = kN32_SkColorType;
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  GrBackendRenderTarget backendRT(width, height, 0, STENCIL_BUFFER_SIZE,
         | 
| 169 | 
            +
                                                  fboInfo);
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                  sk_sp<SkSurface> renderTarget(SkSurface::MakeFromBackendRenderTarget(
         | 
| 174 | 
            +
                      getThreadDrawingContext()->skContext.get(), backendRT,
         | 
| 175 | 
            +
                      kBottomLeft_GrSurfaceOrigin, colorType, nullptr, &props));
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                  auto canvas = renderTarget->getCanvas();
         | 
| 178 | 
            +
             | 
| 166 179 | 
             
                  // Draw picture into surface
         | 
| 167 | 
            -
                  cb( | 
| 180 | 
            +
                  cb(canvas);
         | 
| 181 | 
            +
             | 
| 168 182 | 
             
                  // Flush
         | 
| 169 | 
            -
                   | 
| 183 | 
            +
                  canvas->flush();
         | 
| 170 184 |  | 
| 171 185 | 
             
                  if (!eglSwapBuffers(getThreadDrawingContext()->glDisplay, _glSurface)) {
         | 
| 172 186 | 
             
                    RNSkLogger::logToConsole("eglSwapBuffers failed: %d\n", eglGetError());
         | 
| 187 | 
            +
                    return false;
         | 
| 173 188 | 
             
                  }
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                  // RNSkLogger::logToConsole("SKIARENDER - render done");
         | 
| 191 | 
            +
                  return true;
         | 
| 174 192 | 
             
                }
         | 
| 175 | 
            -
             | 
| 193 | 
            +
             | 
| 194 | 
            +
                return false;
         | 
| 176 195 | 
             
              }
         | 
| 177 196 | 
             
              case RenderState::Finishing: {
         | 
| 178 197 | 
             
                _renderState = RenderState::Done;
         | 
| @@ -184,14 +203,11 @@ void SkiaOpenGLRenderer::run(const std::function<void(SkCanvas *)> &cb, | |
| 184 203 | 
             
                  _glSurface = EGL_NO_SURFACE;
         | 
| 185 204 | 
             
                }
         | 
| 186 205 |  | 
| 187 | 
            -
                 | 
| 188 | 
            -
                _skSurface = nullptr;
         | 
| 189 | 
            -
             | 
| 190 | 
            -
                break;
         | 
| 206 | 
            +
                return true;
         | 
| 191 207 | 
             
              }
         | 
| 192 208 | 
             
              case RenderState::Done: {
         | 
| 193 209 | 
             
                // Do nothing. We're done.
         | 
| 194 | 
            -
                 | 
| 210 | 
            +
                return true;
         | 
| 195 211 | 
             
              }
         | 
| 196 212 | 
             
              }
         | 
| 197 213 | 
             
            }
         | 
| @@ -326,54 +342,4 @@ bool SkiaOpenGLRenderer::initGLSurface() { | |
| 326 342 |  | 
| 327 343 | 
             
              return true;
         | 
| 328 344 | 
             
            }
         | 
| 329 | 
            -
             | 
| 330 | 
            -
            bool SkiaOpenGLRenderer::ensureSkiaSurface(int width, int height) {
         | 
| 331 | 
            -
              if (getThreadDrawingContext()->skContext == nullptr) {
         | 
| 332 | 
            -
                return false;
         | 
| 333 | 
            -
              }
         | 
| 334 | 
            -
             | 
| 335 | 
            -
              if (_skSurface == nullptr || !_skRenderTarget.isValid() ||
         | 
| 336 | 
            -
                  _prevWidth != width || _prevHeight != height) {
         | 
| 337 | 
            -
                glViewport(0, 0, width, height);
         | 
| 338 | 
            -
             | 
| 339 | 
            -
                _prevWidth = width;
         | 
| 340 | 
            -
                _prevHeight = height;
         | 
| 341 | 
            -
             | 
| 342 | 
            -
                GLint buffer;
         | 
| 343 | 
            -
                glGetIntegerv(GL_FRAMEBUFFER_BINDING, &buffer);
         | 
| 344 | 
            -
             | 
| 345 | 
            -
                GLint stencil;
         | 
| 346 | 
            -
                glGetIntegerv(GL_STENCIL_BITS, &stencil);
         | 
| 347 | 
            -
             | 
| 348 | 
            -
                GLint samples;
         | 
| 349 | 
            -
                glGetIntegerv(GL_SAMPLES, &samples);
         | 
| 350 | 
            -
             | 
| 351 | 
            -
                auto maxSamples =
         | 
| 352 | 
            -
                    getThreadDrawingContext()->skContext->maxSurfaceSampleCountForColorType(
         | 
| 353 | 
            -
                        kRGBA_8888_SkColorType);
         | 
| 354 | 
            -
             | 
| 355 | 
            -
                if (samples > maxSamples)
         | 
| 356 | 
            -
                  samples = maxSamples;
         | 
| 357 | 
            -
             | 
| 358 | 
            -
                GrGLFramebufferInfo fbInfo;
         | 
| 359 | 
            -
                fbInfo.fFBOID = buffer;
         | 
| 360 | 
            -
                fbInfo.fFormat = 0x8058;
         | 
| 361 | 
            -
             | 
| 362 | 
            -
                _skRenderTarget =
         | 
| 363 | 
            -
                    GrBackendRenderTarget(width, height, samples, stencil, fbInfo);
         | 
| 364 | 
            -
             | 
| 365 | 
            -
                _skSurface = SkSurface::MakeFromBackendRenderTarget(
         | 
| 366 | 
            -
                    getThreadDrawingContext()->skContext.get(), _skRenderTarget,
         | 
| 367 | 
            -
                    kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, nullptr, nullptr);
         | 
| 368 | 
            -
             | 
| 369 | 
            -
                if (!_skSurface) {
         | 
| 370 | 
            -
                  RNSkLogger::logToConsole(
         | 
| 371 | 
            -
                      "JniSkiaDrawView::setupSurface - skSurface could not be created!");
         | 
| 372 | 
            -
                  return false;
         | 
| 373 | 
            -
                }
         | 
| 374 | 
            -
             | 
| 375 | 
            -
                return true;
         | 
| 376 | 
            -
              }
         | 
| 377 | 
            -
              return true;
         | 
| 378 | 
            -
            }
         | 
| 379 345 | 
             
            } // namespace RNSkia
         | 
| @@ -60,7 +60,7 @@ public: | |
| 60 60 | 
             
               * @param width Width of surface to render if there is a picture
         | 
| 61 61 | 
             
               * @param height Height of surface to render if there is a picture
         | 
| 62 62 | 
             
               */
         | 
| 63 | 
            -
               | 
| 63 | 
            +
              bool run(const std::function<void(SkCanvas *)> &cb, int width, int height);
         | 
| 64 64 |  | 
| 65 65 | 
             
              /**
         | 
| 66 66 | 
             
               * Sets the state to finishing. Next time the renderer will be called it
         | 
| @@ -102,15 +102,6 @@ private: | |
| 102 102 | 
             
               */
         | 
| 103 103 | 
             
              bool initGLSurface();
         | 
| 104 104 |  | 
| 105 | 
            -
              /**
         | 
| 106 | 
            -
               * Ensures that we have a valid Skia surface to draw to. The surface will
         | 
| 107 | 
            -
               * be recreated if the width/height change.
         | 
| 108 | 
            -
               * @param width Width of the underlying view
         | 
| 109 | 
            -
               * @param height Height of the underlying view
         | 
| 110 | 
            -
               * @return True if initialization went well
         | 
| 111 | 
            -
               */
         | 
| 112 | 
            -
              bool ensureSkiaSurface(int width, int height);
         | 
| 113 | 
            -
             | 
| 114 105 | 
             
              /**
         | 
| 115 106 | 
             
               * To be able to use static contexts (and avoid reloading the skia context for
         | 
| 116 107 | 
             
               * each new view, we track the OpenGL and Skia drawing context per thread.
         | 
| @@ -121,8 +112,6 @@ private: | |
| 121 112 | 
             
              EGLSurface _glSurface = EGL_NO_SURFACE;
         | 
| 122 113 |  | 
| 123 114 | 
             
              ANativeWindow *_nativeWindow = nullptr;
         | 
| 124 | 
            -
              GrBackendRenderTarget _skRenderTarget;
         | 
| 125 | 
            -
              sk_sp<SkSurface> _skSurface;
         | 
| 126 115 |  | 
| 127 116 | 
             
              int _prevWidth = 0;
         | 
| 128 117 | 
             
              int _prevHeight = 0;
         | 
| @@ -3,17 +3,15 @@ | |
| 3 3 | 
             
            #include <memory>
         | 
| 4 4 | 
             
            #include <utility>
         | 
| 5 5 |  | 
| 6 | 
            -
            #include <ReactCommon/TurboModuleUtils.h>
         | 
| 7 6 | 
             
            #include <jsi/jsi.h>
         | 
| 8 7 |  | 
| 9 | 
            -
            #include " | 
| 10 | 
            -
             | 
| 8 | 
            +
            #include "JsiPromises.h"
         | 
| 11 9 | 
             
            #include "JsiSkData.h"
         | 
| 10 | 
            +
            #include "SkBase64.h"
         | 
| 12 11 |  | 
| 13 12 | 
             
            namespace RNSkia {
         | 
| 14 13 |  | 
| 15 14 | 
             
            namespace jsi = facebook::jsi;
         | 
| 16 | 
            -
            namespace react = facebook::react;
         | 
| 17 15 |  | 
| 18 16 | 
             
            class JsiSkDataFactory : public JsiSkHostObject {
         | 
| 19 17 | 
             
            public:
         | 
| @@ -21,11 +19,11 @@ public: | |
| 21 19 | 
             
                auto jsiLocalUri = arguments[0].asString(runtime);
         | 
| 22 20 | 
             
                auto localUri = jsiLocalUri.utf8(runtime);
         | 
| 23 21 | 
             
                auto context = getContext();
         | 
| 24 | 
            -
                return  | 
| 22 | 
            +
                return RNJsi::JsiPromises::createPromiseAsJSIValue(
         | 
| 25 23 | 
             
                    runtime,
         | 
| 26 24 | 
             
                    [context = std::move(context), localUri = std::move(localUri)](
         | 
| 27 25 | 
             
                        jsi::Runtime &runtime,
         | 
| 28 | 
            -
                        std::shared_ptr< | 
| 26 | 
            +
                        std::shared_ptr<RNJsi::JsiPromises::Promise> promise) -> void {
         | 
| 29 27 | 
             
                      // Create a stream operation - this will be run in a
         | 
| 30 28 | 
             
                      // separate thread
         | 
| 31 29 | 
             
                      context->performStreamOperation(
         | 
| @@ -5,6 +5,7 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            #include <jsi/jsi.h>
         | 
| 7 7 |  | 
| 8 | 
            +
            #include "JsiPromises.h"
         | 
| 8 9 | 
             
            #include "JsiSkData.h"
         | 
| 9 10 | 
             
            #include "JsiSkHostObjects.h"
         | 
| 10 11 | 
             
            #include "JsiSkImage.h"
         | 
| @@ -41,11 +42,11 @@ public: | |
| 41 42 | 
             
              JSI_HOST_FUNCTION(MakeImageFromViewTag) {
         | 
| 42 43 | 
             
                auto viewTag = arguments[0].asNumber();
         | 
| 43 44 | 
             
                auto context = getContext();
         | 
| 44 | 
            -
                return  | 
| 45 | 
            +
                return RNJsi::JsiPromises::createPromiseAsJSIValue(
         | 
| 45 46 | 
             
                    runtime,
         | 
| 46 | 
            -
                    [context = std::move(context),
         | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 47 | 
            +
                    [context = std::move(context), viewTag](
         | 
| 48 | 
            +
                        jsi::Runtime &runtime,
         | 
| 49 | 
            +
                        std::shared_ptr<RNJsi::JsiPromises::Promise> promise) -> void {
         | 
| 49 50 | 
             
                      // Create a stream operation - this will be run on the main thread
         | 
| 50 51 | 
             
                      context->makeViewScreenshot(
         | 
| 51 52 | 
             
                          viewTag, [&runtime, context = std::move(context),
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            #include "JsiPromises.h"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            namespace RNJsi {
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            JsiPromises::Promise::Promise(jsi::Runtime &rt, jsi::Function resolve,
         | 
| 6 | 
            +
                                          jsi::Function reject)
         | 
| 7 | 
            +
                : runtime_(rt), resolve_(std::move(resolve)), reject_(std::move(reject)) {}
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            void JsiPromises::Promise::resolve(const jsi::Value &result) {
         | 
| 10 | 
            +
              resolve_.call(runtime_, result);
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            void JsiPromises::Promise::reject(const std::string &message) {
         | 
| 14 | 
            +
              jsi::Object error(runtime_);
         | 
| 15 | 
            +
              error.setProperty(runtime_, "message",
         | 
| 16 | 
            +
                                jsi::String::createFromUtf8(runtime_, message));
         | 
| 17 | 
            +
              reject_.call(runtime_, error);
         | 
| 18 | 
            +
            }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            jsi::Value
         | 
| 21 | 
            +
            JsiPromises::createPromiseAsJSIValue(jsi::Runtime &rt,
         | 
| 22 | 
            +
                                                 PromiseSetupFunctionType &&func) {
         | 
| 23 | 
            +
              jsi::Function JSPromise = rt.global().getPropertyAsFunction(rt, "Promise");
         | 
| 24 | 
            +
              jsi::Function fn = jsi::Function::createFromHostFunction(
         | 
| 25 | 
            +
                  rt, jsi::PropNameID::forAscii(rt, "fn"), 2,
         | 
| 26 | 
            +
                  [func = std::move(func)](jsi::Runtime &rt2, const jsi::Value &thisVal,
         | 
| 27 | 
            +
                                           const jsi::Value *args, size_t count) {
         | 
| 28 | 
            +
                    jsi::Function resolve = args[0].getObject(rt2).getFunction(rt2);
         | 
| 29 | 
            +
                    jsi::Function reject = args[1].getObject(rt2).getFunction(rt2);
         | 
| 30 | 
            +
                    auto wrapper = std::make_shared<Promise>(rt2, std::move(resolve),
         | 
| 31 | 
            +
                                                             std::move(reject));
         | 
| 32 | 
            +
                    func(rt2, wrapper);
         | 
| 33 | 
            +
                    return jsi::Value::undefined();
         | 
| 34 | 
            +
                  });
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              return JSPromise.callAsConstructor(rt, fn);
         | 
| 37 | 
            +
            }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            } // namespace RNJsi
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            #pragma once
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            #include <memory>
         | 
| 4 | 
            +
            #include <string>
         | 
| 5 | 
            +
            #include <utility>
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #include <jsi/jsi.h>
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            #include "SkBase64.h"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            namespace RNJsi {
         | 
| 12 | 
            +
            namespace jsi = facebook::jsi;
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            /**
         | 
| 15 | 
            +
             These classes are taken from ReactCommon TurboModuleUtils. It is no longer (RN
         | 
| 16 | 
            +
             0.72) possible to include and uses TurboModulesUtils without a lot of trouble
         | 
| 17 | 
            +
             when use_frameworks are true in POD file. Instead we're now just including the
         | 
| 18 | 
            +
             implementations ourselves.
         | 
| 19 | 
            +
             */
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            class LongLivedObject {
         | 
| 22 | 
            +
            public:
         | 
| 23 | 
            +
              void allowRelease();
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            protected:
         | 
| 26 | 
            +
              LongLivedObject() = default;
         | 
| 27 | 
            +
              virtual ~LongLivedObject() = default;
         | 
| 28 | 
            +
            };
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            class JsiPromises {
         | 
| 31 | 
            +
            public:
         | 
| 32 | 
            +
              struct Promise : public LongLivedObject {
         | 
| 33 | 
            +
                Promise(jsi::Runtime &rt, jsi::Function resolve, jsi::Function reject);
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                void resolve(const jsi::Value &result);
         | 
| 36 | 
            +
                void reject(const std::string &error);
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                jsi::Runtime &runtime_;
         | 
| 39 | 
            +
                jsi::Function resolve_;
         | 
| 40 | 
            +
                jsi::Function reject_;
         | 
| 41 | 
            +
              };
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              using PromiseSetupFunctionType =
         | 
| 44 | 
            +
                  std::function<void(jsi::Runtime &rt, std::shared_ptr<Promise>)>;
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              static jsi::Value createPromiseAsJSIValue(jsi::Runtime &rt,
         | 
| 47 | 
            +
                                                        PromiseSetupFunctionType &&func);
         | 
| 48 | 
            +
            };
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            } // namespace RNJsi
         | 
| @@ -36,15 +36,16 @@ bool RNSkDomRenderer::tryRender( | |
| 36 36 |  | 
| 37 37 | 
             
              // We render on the main thread
         | 
| 38 38 | 
             
              if (_renderLock->try_lock()) {
         | 
| 39 | 
            +
                bool result = false;
         | 
| 39 40 | 
             
                // If we have a Dom Node we can render directly on the main thread
         | 
| 40 41 | 
             
                if (_root != nullptr) {
         | 
| 41 | 
            -
                  canvasProvider->renderToCanvas(std::bind(
         | 
| 42 | 
            +
                  result = canvasProvider->renderToCanvas(std::bind(
         | 
| 42 43 | 
             
                      &RNSkDomRenderer::renderCanvas, this, std::placeholders::_1,
         | 
| 43 44 | 
             
                      canvasProvider->getScaledWidth(), canvasProvider->getScaledHeight()));
         | 
| 44 45 | 
             
                }
         | 
| 45 46 |  | 
| 46 47 | 
             
                _renderLock->unlock();
         | 
| 47 | 
            -
                return  | 
| 48 | 
            +
                return result;
         | 
| 48 49 | 
             
              } else {
         | 
| 49 50 | 
             
                return false;
         | 
| 50 51 | 
             
              }
         | 
| @@ -44,8 +44,7 @@ public: | |
| 44 44 | 
             
                  : RNSkRenderer(requestRedraw), _platformContext(context) {}
         | 
| 45 45 |  | 
| 46 46 | 
             
              bool tryRender(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override {
         | 
| 47 | 
            -
                performDraw(canvasProvider);
         | 
| 48 | 
            -
                return true;
         | 
| 47 | 
            +
                return performDraw(canvasProvider);
         | 
| 49 48 | 
             
              }
         | 
| 50 49 |  | 
| 51 50 | 
             
              void
         | 
| @@ -56,19 +55,14 @@ public: | |
| 56 55 | 
             
              void setPicture(std::shared_ptr<jsi::HostObject> picture) {
         | 
| 57 56 | 
             
                if (picture == nullptr) {
         | 
| 58 57 | 
             
                  _picture = nullptr;
         | 
| 59 | 
            -
             | 
| 58 | 
            +
                } else {
         | 
| 59 | 
            +
                  _picture = std::dynamic_pointer_cast<JsiSkPicture>(picture);
         | 
| 60 60 | 
             
                }
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                _picture = std::dynamic_pointer_cast<JsiSkPicture>(picture);
         | 
| 63 61 | 
             
                _requestRedraw();
         | 
| 64 62 | 
             
              }
         | 
| 65 63 |  | 
| 66 64 | 
             
            private:
         | 
| 67 | 
            -
               | 
| 68 | 
            -
                if (_picture == nullptr) {
         | 
| 69 | 
            -
                  return;
         | 
| 70 | 
            -
                }
         | 
| 71 | 
            -
             | 
| 65 | 
            +
              bool performDraw(std::shared_ptr<RNSkCanvasProvider> canvasProvider) {
         | 
| 72 66 | 
             
                canvasProvider->renderToCanvas([=](SkCanvas *canvas) {
         | 
| 73 67 | 
             
                  // Make sure to scale correctly
         | 
| 74 68 | 
             
                  auto pd = _platformContext->getPixelDensity();
         | 
| @@ -76,10 +70,13 @@ private: | |
| 76 70 | 
             
                  canvas->save();
         | 
| 77 71 | 
             
                  canvas->scale(pd, pd);
         | 
| 78 72 |  | 
| 79 | 
            -
                   | 
| 73 | 
            +
                  if (_picture != nullptr) {
         | 
| 74 | 
            +
                    canvas->drawPicture(_picture->getObject());
         | 
| 75 | 
            +
                  }
         | 
| 80 76 |  | 
| 81 77 | 
             
                  canvas->restore();
         | 
| 82 78 | 
             
                });
         | 
| 79 | 
            +
                return true;
         | 
| 83 80 | 
             
              }
         | 
| 84 81 |  | 
| 85 82 | 
             
              std::shared_ptr<RNSkPlatformContext> _platformContext;
         | 
| @@ -109,7 +106,6 @@ public: | |
| 109 106 | 
             
                      // Clear picture
         | 
| 110 107 | 
             
                      std::static_pointer_cast<RNSkPictureRenderer>(getRenderer())
         | 
| 111 108 | 
             
                          ->setPicture(nullptr);
         | 
| 112 | 
            -
                      requestRedraw();
         | 
| 113 109 | 
             
                      continue;
         | 
| 114 110 | 
             
                    } else if (prop.second.getType() !=
         | 
| 115 111 | 
             
                               RNJsi::JsiWrapperValueType::HostObject) {
         | 
| @@ -121,9 +117,6 @@ public: | |
| 121 117 | 
             
                    // Save picture
         | 
| 122 118 | 
             
                    std::static_pointer_cast<RNSkPictureRenderer>(getRenderer())
         | 
| 123 119 | 
             
                        ->setPicture(prop.second.getAsHostObject());
         | 
| 124 | 
            -
             | 
| 125 | 
            -
                    // Request redraw
         | 
| 126 | 
            -
                    requestRedraw();
         | 
| 127 120 | 
             
                  }
         | 
| 128 121 | 
             
                }
         | 
| 129 122 | 
             
              }
         | 
    
        package/cpp/rnskia/RNSkView.h
    CHANGED
    
    | @@ -44,7 +44,7 @@ public: | |
| 44 44 | 
             
              /**
         | 
| 45 45 | 
             
               Render to a canvas
         | 
| 46 46 | 
             
               */
         | 
| 47 | 
            -
              virtual  | 
| 47 | 
            +
              virtual bool renderToCanvas(const std::function<void(SkCanvas *)> &) = 0;
         | 
| 48 48 |  | 
| 49 49 | 
             
            protected:
         | 
| 50 50 | 
             
              std::function<void()> _requestRedraw;
         | 
| @@ -123,8 +123,9 @@ public: | |
| 123 123 | 
             
              /**
         | 
| 124 124 | 
             
               Render to a canvas
         | 
| 125 125 | 
             
               */
         | 
| 126 | 
            -
               | 
| 126 | 
            +
              bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override {
         | 
| 127 127 | 
             
                cb(_surface->getCanvas());
         | 
| 128 | 
            +
                return true;
         | 
| 128 129 | 
             
              };
         | 
| 129 130 |  | 
| 130 131 | 
             
            private:
         | 
| @@ -224,6 +225,15 @@ public: | |
| 224 225 | 
             
               */
         | 
| 225 226 | 
             
              void requestRedraw() { _redrawRequestCounter++; }
         | 
| 226 227 |  | 
| 228 | 
            +
              /**
         | 
| 229 | 
            +
               Renders immediate. Be carefull to not call this method from another thread
         | 
| 230 | 
            +
               than the UI thread
         | 
| 231 | 
            +
               */
         | 
| 232 | 
            +
              void renderImmediate() {
         | 
| 233 | 
            +
                _renderer->renderImmediate(_canvasProvider);
         | 
| 234 | 
            +
                _redrawRequestCounter = 0;
         | 
| 235 | 
            +
              }
         | 
| 236 | 
            +
             | 
| 227 237 | 
             
              /**
         | 
| 228 238 | 
             
               Sets the native id of the view
         | 
| 229 239 | 
             
               */
         | 
| @@ -409,6 +419,7 @@ private: | |
| 409 419 |  | 
| 410 420 | 
             
              size_t _drawingLoopId = 0;
         | 
| 411 421 | 
             
              std::atomic<int> _redrawRequestCounter = {1};
         | 
| 422 | 
            +
              bool _initialDrawingDone = false;
         | 
| 412 423 | 
             
            };
         | 
| 413 424 |  | 
| 414 425 | 
             
            } // namespace RNSkia
         | 
| @@ -24,7 +24,7 @@ public: | |
| 24 24 | 
             
              float getScaledWidth() override;
         | 
| 25 25 | 
             
              float getScaledHeight() override;
         | 
| 26 26 |  | 
| 27 | 
            -
               | 
| 27 | 
            +
              bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override;
         | 
| 28 28 |  | 
| 29 29 | 
             
              void setSize(int width, int height);
         | 
| 30 30 |  | 
| @@ -63,10 +63,10 @@ float RNSkMetalCanvasProvider::getScaledHeight() { | |
| 63 63 | 
             
            /**
         | 
| 64 64 | 
             
             Render to a canvas
         | 
| 65 65 | 
             
             */
         | 
| 66 | 
            -
             | 
| 66 | 
            +
            bool RNSkMetalCanvasProvider::renderToCanvas(
         | 
| 67 67 | 
             
                const std::function<void(SkCanvas *)> &cb) {
         | 
| 68 68 | 
             
              if (_width <= 0 || _height <= 0) {
         | 
| 69 | 
            -
                return;
         | 
| 69 | 
            +
                return false;
         | 
| 70 70 | 
             
              }
         | 
| 71 71 |  | 
| 72 72 | 
             
              // Make sure to NOT render or try any render operations while we're in the
         | 
| @@ -82,7 +82,7 @@ void RNSkMetalCanvasProvider::renderToCanvas( | |
| 82 82 | 
             
                  _requestRedraw();
         | 
| 83 83 | 
             
                  // and don't draw now since it might cause errors in the metal renderer if
         | 
| 84 84 | 
             
                  // we try to render while in the background. (see above issue)
         | 
| 85 | 
            -
                  return;
         | 
| 85 | 
            +
                  return false;
         | 
| 86 86 | 
             
                }
         | 
| 87 87 | 
             
              }
         | 
| 88 88 |  | 
| @@ -113,7 +113,7 @@ void RNSkMetalCanvasProvider::renderToCanvas( | |
| 113 113 | 
             
                 */
         | 
| 114 114 | 
             
                id<CAMetalDrawable> currentDrawable = [_layer nextDrawable];
         | 
| 115 115 | 
             
                if (currentDrawable == nullptr) {
         | 
| 116 | 
            -
                  return;
         | 
| 116 | 
            +
                  return false;
         | 
| 117 117 | 
             
                }
         | 
| 118 118 |  | 
| 119 119 | 
             
                GrMtlTextureInfo fbInfo;
         | 
| @@ -129,7 +129,7 @@ void RNSkMetalCanvasProvider::renderToCanvas( | |
| 129 129 | 
             
                if (skSurface == nullptr || skSurface->getCanvas() == nullptr) {
         | 
| 130 130 | 
             
                  RNSkia::RNSkLogger::logToConsole(
         | 
| 131 131 | 
             
                      "Skia surface could not be created from parameters.");
         | 
| 132 | 
            -
                  return;
         | 
| 132 | 
            +
                  return false;
         | 
| 133 133 | 
             
                }
         | 
| 134 134 |  | 
| 135 135 | 
             
                SkCanvas *canvas = skSurface->getCanvas();
         | 
| @@ -142,6 +142,8 @@ void RNSkMetalCanvasProvider::renderToCanvas( | |
| 142 142 | 
             
                [commandBuffer presentDrawable:currentDrawable];
         | 
| 143 143 | 
             
                [commandBuffer commit];
         | 
| 144 144 | 
             
              }
         | 
| 145 | 
            +
             | 
| 146 | 
            +
              return true;
         | 
| 145 147 | 
             
            };
         | 
| 146 148 |  | 
| 147 149 | 
             
            void RNSkMetalCanvasProvider::setSize(int width, int height) {
         | 
| @@ -93,6 +93,16 @@ | |
| 93 93 | 
             
              assert(_impl == nullptr);
         | 
| 94 94 | 
             
            }
         | 
| 95 95 |  | 
| 96 | 
            +
            #pragma Render
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            - (void)drawRect:(CGRect)rect {
         | 
| 99 | 
            +
              // We override drawRect to ensure we to direct rendering when the
         | 
| 100 | 
            +
              // underlying OS view needs to render:
         | 
| 101 | 
            +
              if (_impl != nullptr) {
         | 
| 102 | 
            +
                _impl->getDrawView()->renderImmediate();
         | 
| 103 | 
            +
              }
         | 
| 104 | 
            +
            }
         | 
| 105 | 
            +
             | 
| 96 106 | 
             
            #pragma mark Layout
         | 
| 97 107 |  | 
| 98 108 | 
             
            - (void)layoutSubviews {
         | 
    
        package/package.json
    CHANGED
    
    
| @@ -1,9 +0,0 @@ | |
| 1 | 
            -
            /*
         | 
| 2 | 
            -
             * Copyright 2023 Google LLC
         | 
| 3 | 
            -
             *
         | 
| 4 | 
            -
             * Use of this source code is governed by a BSD-style license that can be
         | 
| 5 | 
            -
             * found in the LICENSE file.
         | 
| 6 | 
            -
             */
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            // TODO(kjlubick) remove this shim after clients have been moved to the new location
         | 
| 9 | 
            -
            #include "include/codec/SkEncodedImageFormat.h" // IWYU pragma: export
         | 
| @@ -1,9 +0,0 @@ | |
| 1 | 
            -
            /*
         | 
| 2 | 
            -
             * Copyright 2023 Google LLC
         | 
| 3 | 
            -
             *
         | 
| 4 | 
            -
             * Use of this source code is governed by a BSD-style license that can be
         | 
| 5 | 
            -
             * found in the LICENSE file.
         | 
| 6 | 
            -
             */
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            // TODO(kjlubick) remove this shim after clients have been moved to the new location
         | 
| 9 | 
            -
            #include "include/encode/SkICC.h" // IWYU pragma: export
         |