mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-02 08:18:12 +08:00
Co-authored-by: Thomas Cheng <35661641+Androxium@users.noreply.github.com> Co-authored-by: Robert Nadal <Robnadal44@gmail.com> Co-authored-by: ll2zheng <ll2zheng@uwaterloo.ca>
75 lines
1.8 KiB
Rust
75 lines
1.8 KiB
Rust
use bezier_rs::Bezier;
|
|
use glam::DVec2;
|
|
use serde::{Deserialize, Serialize};
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
struct Point {
|
|
x: f64,
|
|
y: f64,
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
pub struct WasmBezier {
|
|
internal: Bezier,
|
|
}
|
|
|
|
pub fn vec_to_point(p: &DVec2) -> JsValue {
|
|
JsValue::from_serde(&serde_json::to_string(&Point { x: p[0], y: p[1] }).unwrap()).unwrap()
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
impl WasmBezier {
|
|
/// Expect js_points to be a list of 3 pairs
|
|
pub fn new_quad(js_points: &JsValue) -> WasmBezier {
|
|
let points: [DVec2; 3] = js_points.into_serde().unwrap();
|
|
WasmBezier {
|
|
internal: Bezier::from_quadratic_dvec2(points[0], points[1], points[2]),
|
|
}
|
|
}
|
|
|
|
/// Expect js_points to be a list of 4 pairs
|
|
pub fn new_cubic(js_points: &JsValue) -> WasmBezier {
|
|
let points: [DVec2; 4] = js_points.into_serde().unwrap();
|
|
WasmBezier {
|
|
internal: Bezier::from_cubic_dvec2(points[0], points[1], points[2], points[3]),
|
|
}
|
|
}
|
|
|
|
pub fn set_start(&mut self, x: f64, y: f64) {
|
|
self.internal.set_start(DVec2::from((x, y)));
|
|
}
|
|
|
|
pub fn set_end(&mut self, x: f64, y: f64) {
|
|
self.internal.set_end(DVec2::from((x, y)));
|
|
}
|
|
|
|
pub fn set_handle1(&mut self, x: f64, y: f64) {
|
|
self.internal.set_handle1(DVec2::from((x, y)));
|
|
}
|
|
|
|
pub fn set_handle2(&mut self, x: f64, y: f64) {
|
|
self.internal.set_handle2(DVec2::from((x, y)));
|
|
}
|
|
|
|
pub fn get_points(&self) -> Vec<JsValue> {
|
|
self.internal.get_points().iter().flatten().map(vec_to_point).collect()
|
|
}
|
|
|
|
pub fn to_svg(&self) -> String {
|
|
self.internal.to_svg()
|
|
}
|
|
|
|
pub fn length(&self) -> f64 {
|
|
self.internal.length()
|
|
}
|
|
|
|
pub fn compute(&self, t: f64) -> JsValue {
|
|
vec_to_point(&self.internal.compute(t))
|
|
}
|
|
|
|
pub fn compute_lookup_table(&self, steps: i32) -> Vec<JsValue> {
|
|
self.internal.compute_lookup_table(Some(steps)).iter().map(vec_to_point).collect()
|
|
}
|
|
}
|