tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
1// Copyright 2024 the Velato Authors
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4use super::{Composition, RenderSink, Renderer, model::fixed};
5
6use kurbo::{Affine, Shape};
7use peniko::{BlendMode, Fill};
8
9impl RenderSink for vello::Scene {
10 fn push_layer(
11 &mut self,
12 blend: impl Into<BlendMode>,
13 alpha: f32,
14 transform: Affine,
15 shape: &impl Shape,
16 ) {
17 self.push_layer(Fill::NonZero, blend, alpha, transform, shape);
18 }
19
20 fn push_clip_layer(&mut self, transform: Affine, shape: &impl Shape) {
21 self.push_clip_layer(Fill::NonZero, transform, shape);
22 }
23
24 fn pop_layer(&mut self) {
25 self.pop_layer();
26 }
27
28 fn draw(
29 &mut self,
30 stroke: Option<&fixed::Stroke>,
31 transform: Affine,
32 brush: &fixed::Brush,
33 shape: &impl Shape,
34 ) {
35 if let Some(stroke) = stroke {
36 self.stroke(stroke, transform, brush, None, shape);
37 } else {
38 self.fill(Fill::NonZero, transform, brush, None, shape);
39 }
40 }
41}
42
43impl Renderer {
44 /// Renders the animation at a given frame to a new scene.
45 pub fn render_to_vello_scene(
46 &mut self,
47 animation: &Composition,
48 frame: f64,
49 transform: Affine,
50 alpha: f64,
51 ) -> vello::Scene {
52 let mut scene = vello::Scene::new();
53 self.append(animation, frame, transform, alpha, &mut scene);
54 scene
55 }
56}