0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-23 06:58:58 -05:00
penpot/render-wasm/src/shapes.rs

131 lines
2.4 KiB
Rust
Raw Normal View History

2024-11-13 12:12:14 +01:00
use skia_safe as skia;
2024-11-12 11:09:50 +01:00
use uuid::Uuid;
#[derive(Debug, Clone, Copy)]
2024-11-12 11:09:50 +01:00
pub enum Kind {
None,
Text,
Path,
SVGRaw,
Image,
Circle,
Rect,
Bool,
Group,
Frame,
}
pub struct Point {
pub x: f32,
pub y: f32,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct Rect {
pub x1: f32,
pub y1: f32,
pub x2: f32,
pub y2: f32,
}
2024-11-13 12:12:14 +01:00
type Color = skia::Color;
2024-11-12 11:09:50 +01:00
#[derive(Debug, Clone, Copy)]
pub struct Matrix {
pub a: f32,
pub b: f32,
pub c: f32,
pub d: f32,
pub e: f32,
pub f: f32,
}
2024-11-12 11:09:50 +01:00
impl Matrix {
pub fn identity() -> Self {
Self {
a: 1.,
b: 0.,
c: 0.,
d: 1.,
e: 0.,
f: 0.,
}
}
}
2024-11-13 12:12:14 +01:00
#[derive(Debug, Clone, PartialEq)]
pub enum Fill {
Solid(Color), // TODO: add more fills here
}
impl From<Color> for Fill {
fn from(value: Color) -> Self {
Self::Solid(value)
}
}
impl Fill {
pub fn to_paint(&self) -> skia::Paint {
match self {
Self::Solid(color) => {
let mut p = skia::Paint::default();
p.set_color(*color);
p.set_style(skia::PaintStyle::Fill);
p.set_anti_alias(true);
// TODO: get proper blend mode. See https://tree.taiga.io/project/penpot/task/9275
p.set_blend_mode(skia::BlendMode::SrcOver);
2024-11-13 12:12:14 +01:00
p
}
}
}
}
#[derive(Debug, Clone)]
2024-11-12 11:09:50 +01:00
pub struct Shape {
pub id: Uuid,
pub children: Vec::<Uuid>,
2024-11-12 11:09:50 +01:00
pub kind: Kind,
pub selrect: Rect,
pub transform: Matrix,
pub rotation: f32,
2024-11-13 12:12:14 +01:00
fills: Vec<Fill>,
2024-11-12 11:09:50 +01:00
}
impl Shape {
pub fn new(id: Uuid) -> Self {
Self {
id,
children: Vec::<Uuid>::new(),
2024-11-12 11:09:50 +01:00
kind: Kind::Rect,
selrect: Rect::default(),
transform: Matrix::identity(),
rotation: 0.,
2024-11-13 12:12:14 +01:00
fills: vec![],
2024-11-12 11:09:50 +01:00
}
}
pub fn translation(&self) -> (f32, f32) {
(self.transform.e, self.transform.f)
}
2024-11-12 11:09:50 +01:00
pub fn scale(&self) -> (f32, f32) {
(self.transform.a, self.transform.d)
}
2024-11-12 11:09:50 +01:00
pub fn skew(&self) -> (f32, f32) {
(self.transform.c, self.transform.b)
}
2024-11-13 12:12:14 +01:00
pub fn fills(&self) -> std::slice::Iter<Fill> {
self.fills.iter()
}
pub fn add_fill(&mut self, f: Fill) {
self.fills.push(f)
}
pub fn clear_fills(&mut self) {
self.fills.clear();
}
}