|  | // Copyright 2023 the Vello Authors | 
|  | // SPDX-License-Identifier: Apache-2.0 OR MIT | 
|  |  | 
|  | use bytemuck::{Pod, Zeroable}; | 
|  |  | 
|  | /// Clip stack element. | 
|  | /// | 
|  | /// This is the bicyclic semigroup, a monoid useful for representing | 
|  | /// stack depth. There is considerably more detail in the draft paper | 
|  | ///  [Fast GPU bounding boxes on tree-structured scenes]. | 
|  | /// | 
|  | /// [Fast GPU bounding boxes on tree-structured scenes]: https://arxiv.org/abs/2205.11659 | 
|  | #[derive(Copy, Clone, Pod, Zeroable, Debug, Default)] | 
|  | #[repr(C)] | 
|  | pub struct ClipBic { | 
|  | /// When interpreted as a stack operation, the number of pop operations. | 
|  | pub a: u32, | 
|  | /// When interpreted as a stack operation, the number of push operations. | 
|  | pub b: u32, | 
|  | } | 
|  |  | 
|  | /// Clip element. | 
|  | #[derive(Copy, Clone, Pod, Zeroable, Debug, Default)] | 
|  | #[repr(C)] | 
|  | #[expect( | 
|  | clippy::partial_pub_fields, | 
|  | reason = "Padding is meaningless to manipulate directly" | 
|  | )] | 
|  | pub struct ClipElement { | 
|  | pub parent_ix: u32, | 
|  | _padding: [u8; 12], | 
|  | pub bbox: [f32; 4], | 
|  | } | 
|  |  | 
|  | /// Clip resolution. | 
|  | /// | 
|  | /// This is an intermediate element used to match clips to associated paths | 
|  | /// and is also used to connect begin and end clip pairs. | 
|  | #[derive(Copy, Clone, Pod, Zeroable, Debug, Default)] | 
|  | #[repr(C)] | 
|  | pub struct Clip { | 
|  | /// Index of the draw object. | 
|  | pub ix: u32, | 
|  | /// This is a packed encoding of an enum with the sign bit as the tag. If positive, | 
|  | /// this entry is a `BeginClip` and contains the associated path index. If negative, | 
|  | /// it is an `EndClip` and contains the bitwise-not of the `EndClip` draw object index. | 
|  | pub path_ix: i32, | 
|  | } | 
|  |  | 
|  | /// Clip bounding box. | 
|  | #[derive(Copy, Clone, Pod, Zeroable, Debug, Default)] | 
|  | #[repr(C)] | 
|  | pub struct ClipBbox { | 
|  | pub bbox: [f32; 4], | 
|  | } | 
|  |  | 
|  | impl ClipBic { | 
|  | pub fn new(a: u32, b: u32) -> Self { | 
|  | Self { a, b } | 
|  | } | 
|  |  | 
|  | /// The bicyclic semigroup operation. | 
|  | /// | 
|  | /// This operation is associative. When interpreted as a stack | 
|  | /// operation, it represents doing the pops of `self`, the pushes of | 
|  | /// `self`, the pops of `other`, and the pushes of `other`. The middle | 
|  | /// two can cancel each other out. | 
|  | #[must_use] | 
|  | pub fn combine(self, other: Self) -> Self { | 
|  | let m = self.b.min(other.a); | 
|  | Self::new(self.a + other.a - m, self.b + other.b - m) | 
|  | } | 
|  | } |