1mod affine_transform;
9mod extend;
10mod layer;
11pub mod layout;
12mod lines;
13mod order;
14pub mod painter;
15mod path;
16mod point;
17pub mod rasterizer;
18mod simd;
19mod transform;
20
21pub use affine_transform::AffineTransform;
22pub use layer::Layer;
23pub use lines::{GeomId, Lines, LinesBuilder};
24pub use order::{Order, OrderError};
25pub use path::{Path, PathBuilder};
26pub use point::Point;
27pub use transform::{GeomPresTransform, GeomPresTransformError};
28
29const PIXEL_WIDTH: usize = 16;
30const PIXEL_DOUBLE_WIDTH: usize = PIXEL_WIDTH * 2;
31const PIXEL_SHIFT: usize = PIXEL_WIDTH.trailing_zeros() as usize;
32
33pub const MAX_WIDTH: usize = 1 << 16;
34pub const MAX_HEIGHT: usize = 1 << 15;
35
36const MAX_WIDTH_SHIFT: usize = MAX_WIDTH.trailing_zeros() as usize;
37const MAX_HEIGHT_SHIFT: usize = MAX_HEIGHT.trailing_zeros() as usize;
38
39pub const TILE_WIDTH: usize = 16;
41const _ASSERT_TILE_WIFTH_MULTIPLE_OF_16: usize = 0 - (TILE_WIDTH % 16);
42const _ASSERT_MAX_TILE_WIDTH: usize = 128 - TILE_WIDTH;
43const TILE_WIDTH_SHIFT: usize = TILE_WIDTH.trailing_zeros() as usize;
44
45pub const TILE_HEIGHT: usize = 16;
46const _ASSERT_TILE_WIDTH_MULTIPLE_OF_16: usize = 0 - (TILE_HEIGHT % 16);
47const _ASSERT_MAX_TILE_HEIGHT: usize = 128 - TILE_HEIGHT;
48const TILE_HEIGHT_SHIFT: usize = TILE_HEIGHT.trailing_zeros() as usize;
49
50const LAYER_LIMIT: usize = (1 << rasterizer::bit_field_lens::<TILE_WIDTH, TILE_HEIGHT>()[2]) - 1;
51
52trait CanonBits {
53 fn to_canon_bits(self) -> u32;
54}
55
56impl CanonBits for f32 {
57 fn to_canon_bits(self) -> u32 {
58 if self.is_nan() {
59 return f32::NAN.to_bits();
60 }
61
62 if self == 0.0 {
63 return 0.0f32.to_bits();
64 }
65
66 self.to_bits()
67 }
68}
69
70#[cfg(test)]
71mod tests {
72 use super::*;
73
74 #[test]
75 fn f32_canon_bits_nan() {
76 let nan0 = f32::NAN;
77 let nan1 = nan0 + 1.0;
78
79 assert_ne!(nan0, nan1);
80 assert_eq!(nan0.to_canon_bits(), nan1.to_canon_bits());
81 }
82
83 #[test]
84 fn f32_canon_bits_zero() {
85 let neg_zero = -0.0f32;
86 let pos_zero = 0.0;
87
88 assert_eq!(neg_zero, pos_zero);
89 assert_ne!(neg_zero.to_bits(), pos_zero.to_bits());
90 assert_eq!(neg_zero.to_canon_bits(), pos_zero.to_canon_bits());
91 }
92}