use std::rc::Rc;
use cranpose_core::NodeId;
pub use cranpose_render_common::graph_scene::{ClickAction, HitRegion, Scene};
use cranpose_ui::{TextLayoutOptions, TextStyle};
use cranpose_ui_graphics::{
BlendMode, Brush, Color, ColorFilter, ImageBitmap, Point, Rect, RoundedCornerShape,
};
#[derive(Clone)]
pub(crate) struct DrawShape {
pub rect: Rect,
pub snap_anchor: Option<Point>,
pub brush: Brush,
pub shape: Option<RoundedCornerShape>,
pub z_index: usize,
pub clip: Option<Rect>,
pub blend_mode: BlendMode,
}
#[derive(Clone)]
pub(crate) struct TextDraw {
pub node_id: NodeId,
pub rect: Rect,
pub snap_anchor: Option<Point>,
pub text: Rc<cranpose_ui::text::AnnotatedString>,
pub color: Color,
pub text_style: TextStyle,
pub font_size: f32,
pub scale: f32,
pub layout_options: TextLayoutOptions,
pub z_index: usize,
pub clip: Option<Rect>,
}
#[derive(Clone)]
pub(crate) struct ImageDraw {
pub rect: Rect,
pub snap_anchor: Option<Point>,
pub image: ImageBitmap,
pub alpha: f32,
pub color_filter: Option<ColorFilter>,
pub z_index: usize,
pub clip: Option<Rect>,
pub blend_mode: BlendMode,
pub src_rect: Option<Rect>,
}
pub(crate) struct RasterScene {
pub shapes: Vec<DrawShape>,
pub images: Vec<ImageDraw>,
pub texts: Vec<TextDraw>,
pub next_z: usize,
}
impl RasterScene {
pub fn new() -> Self {
Self {
shapes: Vec::new(),
images: Vec::new(),
texts: Vec::new(),
next_z: 0,
}
}
pub fn push_shape(
&mut self,
rect: Rect,
brush: Brush,
shape: Option<RoundedCornerShape>,
clip: Option<Rect>,
blend_mode: BlendMode,
) {
let z_index = self.next_z;
self.next_z += 1;
self.shapes.push(DrawShape {
rect,
snap_anchor: None,
brush,
shape,
z_index,
clip,
blend_mode,
});
}
#[allow(clippy::too_many_arguments)]
pub fn push_shape_with_geometry(
&mut self,
rect: Rect,
_local_rect: Rect,
_quad: [[f32; 2]; 4],
brush: Brush,
shape: Option<RoundedCornerShape>,
clip: Option<Rect>,
blend_mode: BlendMode,
) {
self.push_shape(rect, brush, shape, clip, blend_mode);
}
#[allow(clippy::too_many_arguments)]
pub fn push_image_with_geometry(
&mut self,
rect: Rect,
_local_rect: Rect,
_quad: [[f32; 2]; 4],
image: ImageBitmap,
alpha: f32,
color_filter: Option<ColorFilter>,
clip: Option<Rect>,
src_rect: Option<Rect>,
blend_mode: BlendMode,
) {
let z_index = self.next_z;
self.next_z += 1;
self.images.push(ImageDraw {
rect,
snap_anchor: None,
image,
alpha: alpha.clamp(0.0, 1.0),
color_filter,
z_index,
clip,
blend_mode,
src_rect,
});
}
#[allow(clippy::too_many_arguments)]
pub fn push_text(
&mut self,
node_id: NodeId,
rect: Rect,
text: Rc<cranpose_ui::text::AnnotatedString>,
color: Color,
text_style: TextStyle,
font_size: f32,
scale: f32,
layout_options: TextLayoutOptions,
clip: Option<Rect>,
) {
let z_index = self.next_z;
self.next_z += 1;
self.texts.push(TextDraw {
node_id,
rect,
snap_anchor: None,
text,
color,
text_style,
font_size,
scale,
layout_options,
z_index,
clip,
});
}
}
impl Default for RasterScene {
fn default() -> Self {
Self::new()
}
}