375e894038
* Make Frame Processors an extra subspec * Update VisionCamera.podspec * Make optional * Make VisionCamera compile without Skia * Fix * Add skia again * Update VisionCamera.podspec * Make VisionCamera build without Frame Processors * Rename error to `system/frame-processors-unavailable` * Fix Frame Processor returning early * Remove `preset`, FP partial rewrite * Only warn on frame drop * Fix wrong queue * fix: Run on CameraQueue again * Update CameraView.swift * fix: Activate audio session asynchronously on audio queue * Update CameraView+RecordVideo.swift * Update PreviewView.h * Cleanups * Cleanup * fix cast * feat: Add LiDAR Depth Camera support * Upgrade Ruby * Add vector icons type * Update Gemfile.lock * fix: Stop queues on deinit * Also load `builtInTrueDepthCamera` * Update CameraViewManager.swift * Update SkImageHelpers.mm * Extract FrameProcessorCallback to FrameProcessor Holds more context now :) * Rename to .m * fix: Add `RCTLog` import * Create SkiaFrameProcessor * Update CameraBridge.h * Call Frame Processor * Fix defines * fix: Allow deleting callback funcs * fix Skia build * batch * Just call `setSkiaFrameProcessor` * Rewrite in Swift * Pass `SkiaRenderer` * Fix Import * Move `PreviewView` to Swift * Fix Layer * Set Skia Canvas to Frame Host Object * Make `DrawableFrameHostObject` subclass * Fix TS types * Use same MTLDevice and apply scale * Make getter * Extract `setTorch` and `Preview` * fix: Fix nil metal device * Don't wait for session stop in deinit * Use main pixel ratio * Use unique_ptr for Render Contexts * fix: Fix SkiaPreviewDisplayLink broken after deinit * inline `getTextureCache` * Update CameraPage.tsx * chore: Format iOS * perf: Allow MTLLayer to be optimized for only frame buffers * Add RN Video types * fix: Fix Frame Processors if guard * Find nodeModules recursively * Create `Frame.isDrawable` * Add `cocoapods-check` dependency
84 lines
2.6 KiB
Plaintext
84 lines
2.6 KiB
Plaintext
//
|
|
// DrawableFrameHostObject.mm
|
|
// VisionCamera
|
|
//
|
|
// Created by Marc Rousavy on 20.07.23.
|
|
// Copyright © 2023 mrousavy. All rights reserved.
|
|
//
|
|
|
|
#import "DrawableFrameHostObject.h"
|
|
#import "SkCanvas.h"
|
|
#import "SkImageHelpers.h"
|
|
|
|
std::vector<jsi::PropNameID> DrawableFrameHostObject::getPropertyNames(jsi::Runtime& rt) {
|
|
auto result = FrameHostObject::getPropertyNames(rt);
|
|
|
|
// Skia - Render Frame
|
|
result.push_back(jsi::PropNameID::forUtf8(rt, std::string("render")));
|
|
|
|
if (_canvas != nullptr) {
|
|
auto canvasPropNames = _canvas->getPropertyNames(rt);
|
|
for (auto& prop : canvasPropNames) {
|
|
result.push_back(std::move(prop));
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
SkRect inscribe(SkSize size, SkRect rect) {
|
|
auto halfWidthDelta = (rect.width() - size.width()) / 2.0;
|
|
auto halfHeightDelta = (rect.height() - size.height()) / 2.0;
|
|
return SkRect::MakeXYWH(rect.x() + halfWidthDelta,
|
|
rect.y() + halfHeightDelta, size.width(),
|
|
size.height());
|
|
}
|
|
|
|
jsi::Value DrawableFrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& propName) {
|
|
auto name = propName.utf8(runtime);
|
|
|
|
if (name == "render") {
|
|
auto render = JSI_HOST_FUNCTION_LAMBDA {
|
|
if (_canvas == nullptr) {
|
|
throw jsi::JSError(runtime, "Trying to render a Frame without a Skia Canvas! Did you install Skia?");
|
|
}
|
|
|
|
// convert CMSampleBuffer to SkImage
|
|
auto context = _canvas->getCanvas()->recordingContext();
|
|
auto image = SkImageHelpers::convertCMSampleBufferToSkImage(context, frame.buffer);
|
|
|
|
// draw SkImage
|
|
if (count > 0) {
|
|
// ..with paint/shader
|
|
auto paintHostObject = arguments[0].asObject(runtime).asHostObject<RNSkia::JsiSkPaint>(runtime);
|
|
auto paint = paintHostObject->getObject();
|
|
_canvas->getCanvas()->drawImage(image, 0, 0, SkSamplingOptions(), paint.get());
|
|
} else {
|
|
// ..without paint/shader
|
|
_canvas->getCanvas()->drawImage(image, 0, 0);
|
|
}
|
|
|
|
return jsi::Value::undefined();
|
|
};
|
|
return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "render"), 1, render);
|
|
}
|
|
if (name == "isDrawable") {
|
|
return jsi::Value(_canvas != nullptr);
|
|
}
|
|
|
|
if (_canvas != nullptr) {
|
|
// If we have a Canvas, try to access the property on there.
|
|
auto result = _canvas->get(runtime, propName);
|
|
if (!result.isUndefined()) {
|
|
return result;
|
|
}
|
|
}
|
|
|
|
// fallback to base implementation
|
|
return FrameHostObject::get(runtime, propName);
|
|
}
|
|
|
|
void DrawableFrameHostObject::invalidateCanvas() {
|
|
_canvas = nullptr;
|
|
}
|