summaryrefslogtreecommitdiff
path: root/rust/wasm/src/masks.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/wasm/src/masks.rs')
-rw-r--r--rust/wasm/src/masks.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/rust/wasm/src/masks.rs b/rust/wasm/src/masks.rs
new file mode 100644
index 00000000..e4f30e21
--- /dev/null
+++ b/rust/wasm/src/masks.rs
@@ -0,0 +1,60 @@
+#![cfg(target_arch = "wasm32")]
+
+use gpu::wgpu;
+use js_sys::Object;
+use wasm_bindgen::{JsCast, JsValue, prelude::wasm_bindgen};
+
+use crate::gpu::{
+ import_canvas_texture, read_f32_property, read_offscreen_canvas_property, read_u32_property,
+ render_texture_to_canvas, with_gpu_runtime,
+};
+
+struct ApplyMaskFeatherOptions {
+ mask: wgpu::web_sys::OffscreenCanvas,
+ width: u32,
+ height: u32,
+ feather: f32,
+}
+
+#[wasm_bindgen(js_name = applyMaskFeather)]
+pub fn apply_mask_feather(options: JsValue) -> Result<wgpu::web_sys::OffscreenCanvas, JsValue> {
+ let ApplyMaskFeatherOptions {
+ mask,
+ width,
+ height,
+ feather,
+ } = parse_apply_mask_feather_options(options)?;
+
+ with_gpu_runtime(|runtime| {
+ let mask_texture = import_canvas_texture(
+ &runtime.context,
+ &mask,
+ width,
+ height,
+ "masks-input-texture",
+ );
+ let result_texture = runtime.masks.apply_mask_feather(
+ &runtime.context,
+ masks::ApplyMaskFeatherOptions {
+ mask: &mask_texture,
+ width,
+ height,
+ feather,
+ },
+ );
+ render_texture_to_canvas(&runtime.context, &result_texture, width, height)
+ })
+}
+
+fn parse_apply_mask_feather_options(value: JsValue) -> Result<ApplyMaskFeatherOptions, JsValue> {
+ let object: Object = value
+ .dyn_into()
+ .map_err(|_| JsValue::from_str("applyMaskFeather expects an options object"))?;
+
+ Ok(ApplyMaskFeatherOptions {
+ mask: read_offscreen_canvas_property(&object, "mask")?,
+ width: read_u32_property(&object, "width")?,
+ height: read_u32_property(&object, "height")?,
+ feather: read_f32_property(&object, "feather")?,
+ })
+}