h1: remove unused render module
This commit is contained in:
parent
e92c48db78
commit
ea70c264fe
1 changed files with 0 additions and 173 deletions
|
@ -1,173 +0,0 @@
|
|||
use alloc::vec::Vec;
|
||||
use tiny_skia::{
|
||||
BlendMode, Color, FillRule, LineCap, Paint, Path, PathBuilder, Pixmap, Shader,
|
||||
Stroke as SStroke, Transform,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
value::{Fill, Ref, Rgba, Scribble, Shape, Stroke, Value},
|
||||
vm::{Exception, Vm},
|
||||
};
|
||||
|
||||
pub use tiny_skia;
|
||||
|
||||
pub struct RendererLimits {
|
||||
pub pixmap_stack_capacity: usize,
|
||||
pub transform_stack_capacity: usize,
|
||||
}
|
||||
|
||||
pub enum RenderTarget<'a> {
|
||||
Borrowed(&'a mut Pixmap),
|
||||
Owned(Pixmap),
|
||||
}
|
||||
|
||||
pub struct Renderer<'a> {
|
||||
pixmap_stack: Vec<RenderTarget<'a>>,
|
||||
transform_stack: Vec<Transform>,
|
||||
}
|
||||
|
||||
impl<'a> Renderer<'a> {
|
||||
pub fn new(pixmap: &'a mut Pixmap, limits: &RendererLimits) -> Self {
|
||||
assert!(limits.pixmap_stack_capacity > 0);
|
||||
assert!(limits.transform_stack_capacity > 0);
|
||||
|
||||
let mut blend_stack = Vec::with_capacity(limits.pixmap_stack_capacity);
|
||||
blend_stack.push(RenderTarget::Borrowed(pixmap));
|
||||
|
||||
let mut transform_stack = Vec::with_capacity(limits.transform_stack_capacity);
|
||||
transform_stack.push(Transform::identity());
|
||||
|
||||
Self {
|
||||
pixmap_stack: blend_stack,
|
||||
transform_stack,
|
||||
}
|
||||
}
|
||||
|
||||
fn create_exception(vm: &Vm, _at: Value, message: &'static str) -> Exception {
|
||||
vm.create_exception(message)
|
||||
}
|
||||
|
||||
fn transform(&self) -> Transform {
|
||||
self.transform_stack.last().copied().unwrap()
|
||||
}
|
||||
|
||||
fn transform_mut(&mut self) -> &mut Transform {
|
||||
self.transform_stack.last_mut().unwrap()
|
||||
}
|
||||
|
||||
pub fn translate(&mut self, x: f32, y: f32) {
|
||||
let translated = self.transform().post_translate(x, y);
|
||||
*self.transform_mut() = translated;
|
||||
}
|
||||
|
||||
fn pixmap_mut(&mut self) -> &mut Pixmap {
|
||||
match self.pixmap_stack.last_mut().unwrap() {
|
||||
RenderTarget::Borrowed(pixmap) => pixmap,
|
||||
RenderTarget::Owned(pixmap) => pixmap,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render(&mut self, vm: &Vm, value: Value) -> Result<(), Exception> {
|
||||
static NOT_A_SCRIBBLE: &str = "cannot draw something that is not a scribble";
|
||||
let (_id, scribble) = vm
|
||||
.get_ref_value(value)
|
||||
.ok_or_else(|| Self::create_exception(vm, value, NOT_A_SCRIBBLE))?;
|
||||
|
||||
match &scribble {
|
||||
Ref::List(list) => {
|
||||
for element in &list.elements {
|
||||
self.render(vm, *element)?;
|
||||
}
|
||||
}
|
||||
Ref::Scribble(scribble) => match scribble {
|
||||
Scribble::Stroke(stroke) => self.render_stroke(vm, value, stroke)?,
|
||||
Scribble::Fill(fill) => self.render_fill(vm, value, fill)?,
|
||||
},
|
||||
_ => return Err(Self::create_exception(vm, value, NOT_A_SCRIBBLE))?,
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn shape_to_path(shape: &Shape) -> Option<Path> {
|
||||
let mut pb = PathBuilder::new();
|
||||
match shape {
|
||||
Shape::Point(vec) => {
|
||||
pb.move_to(vec.x, vec.y);
|
||||
pb.line_to(vec.x, vec.y);
|
||||
}
|
||||
Shape::Line(start, end) => {
|
||||
pb.move_to(start.x, start.y);
|
||||
pb.line_to(end.x, end.y);
|
||||
}
|
||||
Shape::Rect(position, size) => {
|
||||
if let Some(rect) =
|
||||
tiny_skia::Rect::from_xywh(position.x, position.y, size.x, size.y)
|
||||
{
|
||||
pb.push_rect(rect);
|
||||
}
|
||||
}
|
||||
Shape::Circle(position, radius) => {
|
||||
pb.push_circle(position.x, position.y, *radius);
|
||||
}
|
||||
}
|
||||
pb.finish()
|
||||
}
|
||||
|
||||
fn render_stroke(&mut self, _vm: &Vm, _value: Value, stroke: &Stroke) -> Result<(), Exception> {
|
||||
let paint = Paint {
|
||||
shader: Shader::SolidColor(tiny_skia_color(stroke.color)),
|
||||
..default_paint()
|
||||
};
|
||||
let transform = self.transform();
|
||||
if let Some(path) = Self::shape_to_path(&stroke.shape) {
|
||||
self.pixmap_mut().stroke_path(
|
||||
&path,
|
||||
&paint,
|
||||
&SStroke {
|
||||
width: stroke.thickness,
|
||||
line_cap: LineCap::Round,
|
||||
..Default::default()
|
||||
},
|
||||
transform,
|
||||
None,
|
||||
);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn render_fill(&mut self, _vm: &Vm, _value: Value, fill: &Fill) -> Result<(), Exception> {
|
||||
let paint = Paint {
|
||||
shader: Shader::SolidColor(tiny_skia_color(fill.color)),
|
||||
..default_paint()
|
||||
};
|
||||
|
||||
let transform = self.transform();
|
||||
if let Some(path) = Self::shape_to_path(&fill.shape) {
|
||||
self.pixmap_mut()
|
||||
.fill_path(&path, &paint, FillRule::EvenOdd, transform, None);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn default_paint() -> Paint<'static> {
|
||||
Paint {
|
||||
shader: Shader::SolidColor(Color::BLACK),
|
||||
blend_mode: BlendMode::SourceOver,
|
||||
anti_alias: false,
|
||||
force_hq_pipeline: false,
|
||||
}
|
||||
}
|
||||
|
||||
fn tiny_skia_color(color: Rgba) -> Color {
|
||||
Color::from_rgba(
|
||||
color.r.clamp(0.0, 1.0),
|
||||
color.g.clamp(0.0, 1.0),
|
||||
color.b.clamp(0.0, 1.0),
|
||||
color.a.clamp(0.0, 1.0),
|
||||
)
|
||||
.unwrap()
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue