Skip to main content

ferroui_base/rendering/composition/drawing/
render_data_payloads.rs

1use super::RenderDataOpcode;
2use crate::media::{RenderOptions, TextOptions};
3use crate::media::imaging::BitmapBlendingMode;
4use crate::rendering::composition::transport::{BatchValue, BatchValueReader};
5use crate::{Matrix, Point, Rect, RoundedRect};
6
7/// The fixed-size part of an operation of a render data stream, written
8/// after its opcode.
9pub trait IRenderDataPayload: BatchValue + Copy {
10    /// The opcode written before the payload.
11    const OPCODE: RenderDataOpcode;
12}
13
14/// Implements a payload: its opcode, and its encoding (the fields in
15/// declaration order, as upstream blits the struct).
16macro_rules! render_data_payload {
17    ($name:ident => $opcode:ident { $($field:ident : $fty:ty),* $(,)? }) => {
18        impl IRenderDataPayload for $name {
19            const OPCODE: RenderDataOpcode = RenderDataOpcode::$opcode;
20        }
21
22        impl BatchValue for $name {
23            #[inline]
24            fn write_to(&self, out: &mut Vec<u8>) {
25                $(self.$field.write_to(out);)*
26            }
27
28            #[inline]
29            fn read_from(input: &mut BatchValueReader<'_>) -> Self {
30                $(let $field = <$fty>::read_from(input);)*
31                Self { $($field,)* }
32            }
33        }
34    };
35}
36
37#[derive(Clone, Copy, Debug, Default, PartialEq)]
38pub struct DrawLinePayload {
39    pub server_pen: i32,
40    pub client_pen: i32,
41    pub p1: Point,
42    pub p2: Point,
43}
44
45render_data_payload!(DrawLinePayload => DrawLine { server_pen: i32, client_pen: i32, p1: Point, p2: Point });
46
47/// Followed by `box_shadow_count` box shadows.
48#[derive(Clone, Copy, Debug, Default, PartialEq)]
49pub struct DrawRectanglePayload {
50    pub server_brush: i32,
51    pub server_pen: i32,
52    pub client_pen: i32,
53    pub rect: RoundedRect,
54    pub box_shadow_count: i32,
55}
56
57render_data_payload!(DrawRectanglePayload => DrawRectangle {
58    server_brush: i32,
59    server_pen: i32,
60    client_pen: i32,
61    rect: RoundedRect,
62    box_shadow_count: i32,
63});
64
65#[derive(Clone, Copy, Debug, Default, PartialEq)]
66pub struct DrawEllipsePayload {
67    pub server_brush: i32,
68    pub server_pen: i32,
69    pub client_pen: i32,
70    pub rect: Rect,
71}
72
73render_data_payload!(DrawEllipsePayload => DrawEllipse {
74    server_brush: i32,
75    server_pen: i32,
76    client_pen: i32,
77    rect: Rect,
78});
79
80#[derive(Clone, Copy, Debug, Default, PartialEq)]
81pub struct DrawGeometryPayload {
82    pub server_brush: i32,
83    pub server_pen: i32,
84    pub client_pen: i32,
85    pub geometry: i32,
86}
87
88render_data_payload!(DrawGeometryPayload => DrawGeometry {
89    server_brush: i32,
90    server_pen: i32,
91    client_pen: i32,
92    geometry: i32,
93});
94
95#[derive(Clone, Copy, Debug, Default, PartialEq)]
96pub struct DrawGlyphRunPayload {
97    pub server_brush: i32,
98    pub glyph_run: i32,
99}
100
101render_data_payload!(DrawGlyphRunPayload => DrawGlyphRun { server_brush: i32, glyph_run: i32 });
102
103#[derive(Clone, Copy, Debug, Default, PartialEq)]
104pub struct DrawBitmapPayload {
105    pub bitmap: i32,
106    pub opacity: f64,
107    pub source_rect: Rect,
108    pub dest_rect: Rect,
109}
110
111render_data_payload!(DrawBitmapPayload => DrawBitmap { bitmap: i32, opacity: f64, source_rect: Rect, dest_rect: Rect });
112
113#[derive(Clone, Copy, Debug, Default, PartialEq)]
114pub struct DrawCustomPayload {
115    pub operation: i32,
116}
117
118render_data_payload!(DrawCustomPayload => DrawCustom { operation: i32 });
119
120#[derive(Clone, Copy, Debug, Default, PartialEq)]
121pub struct PushClipPayload {
122    pub clip: RoundedRect,
123}
124
125render_data_payload!(PushClipPayload => PushClip { clip: RoundedRect });
126
127#[derive(Clone, Copy, Debug, Default, PartialEq)]
128pub struct PushGeometryClipPayload {
129    pub geometry: i32,
130}
131
132render_data_payload!(PushGeometryClipPayload => PushGeometryClip { geometry: i32 });
133
134#[derive(Clone, Copy, Debug, Default, PartialEq)]
135pub struct PushOpacityPayload {
136    pub opacity: f64,
137}
138
139render_data_payload!(PushOpacityPayload => PushOpacity { opacity: f64 });
140
141#[derive(Clone, Copy, Debug, Default, PartialEq)]
142pub struct PushOpacityMaskPayload {
143    pub brush: i32,
144    pub bounds: Rect,
145}
146
147render_data_payload!(PushOpacityMaskPayload => PushOpacityMask { brush: i32, bounds: Rect });
148
149#[derive(Clone, Copy, Debug, Default, PartialEq)]
150pub struct PushTransformPayload {
151    pub matrix: Matrix,
152}
153
154render_data_payload!(PushTransformPayload => PushTransform { matrix: Matrix });
155
156#[derive(Clone, Copy, Debug, Default, PartialEq)]
157pub struct PushRenderOptionsPayload {
158    pub options: RenderOptions,
159}
160
161render_data_payload!(PushRenderOptionsPayload => PushRenderOptions { options: RenderOptions });
162
163#[derive(Clone, Copy, Debug, Default, PartialEq)]
164pub struct PushTextOptionsPayload {
165    pub options: TextOptions,
166}
167
168render_data_payload!(PushTextOptionsPayload => PushTextOptions { options: TextOptions });
169
170#[derive(Clone, Copy, Debug, Default, PartialEq)]
171pub struct PushEffectPayload {
172    pub effect: i32,
173    pub bounds: Rect,
174}
175
176render_data_payload!(PushEffectPayload => PushEffect { effect: i32, bounds: Rect });
177
178#[derive(Clone, Copy, Debug, Default, PartialEq)]
179pub struct PushCompositingLayerPayload {
180    pub blend: BitmapBlendingMode,
181    pub opacity: f64,
182    pub bounds: Rect,
183}
184
185render_data_payload!(PushCompositingLayerPayload => PushCompositingLayer {
186    blend: BitmapBlendingMode, opacity: f64, bounds: Rect,
187});