clay_layout/
render_commands.rs1use crate::{
2 bindings::*,
3 elements::{
4 containers::border::BorderContainer, custom::Custom, image::Image, rectangle::Rectangle,
5 text::Text,
6 },
7 math::BoundingBox,
8};
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[repr(u8)]
12pub enum RenderCommandType {
13 None = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_NONE,
14 Rectangle = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_RECTANGLE,
15 Border = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_BORDER,
16 Text = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_TEXT,
17 Image = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_IMAGE,
18 ScissorStart = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_SCISSOR_START,
19 ScissorEnd = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_SCISSOR_END,
20 Custom = Clay_RenderCommandType_CLAY_RENDER_COMMAND_TYPE_CUSTOM,
21}
22
23#[derive(Debug, Clone)]
24pub enum RenderCommandConfig<'a> {
25 None(),
26 Rectangle(Rectangle),
27 Border(BorderContainer),
28 Text(&'a str, Text),
29 Image(Image),
30 ScissorStart(),
31 ScissorEnd(),
32 Custom(Custom),
33}
34
35impl From<&Clay_RenderCommand> for RenderCommandConfig<'_> {
36 fn from(value: &Clay_RenderCommand) -> Self {
37 match unsafe { core::mem::transmute::<u8, RenderCommandType>(value.commandType) } {
38 RenderCommandType::None => Self::None(),
39 RenderCommandType::Rectangle => Self::Rectangle(Rectangle::from(*unsafe {
40 &mut *(value.config.rectangleElementConfig)
41 })),
42 RenderCommandType::Border => Self::Border(BorderContainer::from(*unsafe {
43 &mut *(value.config.borderElementConfig)
44 })),
45 RenderCommandType::Text => Self::Text(
46 <Clay_String as Into<&str>>::into(value.text),
47 Text::from(*unsafe { &mut *(value.config.textElementConfig) }),
48 ),
49 RenderCommandType::Image => Self::Image(Image::from(*unsafe {
50 &mut *(value.config.imageElementConfig)
51 })),
52 RenderCommandType::ScissorStart => Self::ScissorStart(),
53 RenderCommandType::ScissorEnd => Self::ScissorEnd(),
54 RenderCommandType::Custom => Self::Custom(Custom::from(*unsafe {
55 &mut *(value.config.customElementConfig)
56 })),
57 }
58 }
59}
60
61#[derive(Debug, Clone)]
62pub struct RenderCommand<'a> {
63 pub id: u32,
64 pub bounding_box: BoundingBox,
65 pub config: RenderCommandConfig<'a>,
66}
67
68impl From<Clay_RenderCommand> for RenderCommand<'_> {
69 fn from(value: Clay_RenderCommand) -> Self {
70 Self {
71 id: value.id,
72 bounding_box: value.boundingBox.into(),
73 config: (&value).into(),
74 }
75 }
76}