lib/ui/src/style/paint.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const abi = @import("../abi/root.zig");
3
4 pub const Paint = extern struct {
5 background: abi.Color = .{},
6 foreground: abi.Color = .{},
7 border_color: [4]abi.Color = @splat(.{}),
8 outline_color: abi.Color = .{},
9 border_width: [4]f32 = @splat(0),
10 radius: [4]f32 = @splat(0),
11 outline_width: f32 = 0,
12 outline_offset: f32 = 0,
13 outset: f32 = 0,
14 image: u32 = 0,
15 border_style: [4]u8 = @splat(0),
16 outline_style: u8 = 0,
17 opacity: u8 = 255,
18 flags: u16 = 0,
19 };
20
21 pub const ImagePaint = extern struct {
22 asset: abi.AssetHandle = .{},
23 source: abi.Rect = .{},
24 tint: abi.Color = .{},
25 fit: u8 = 0,
26 repeat: u8 = 0,
27 origin_box: u8 = 0,
28 clip_box: u8 = 0,
29 };
30
31 pub const TextStyle = extern struct {
32 face: abi.AssetHandle = .{},
33 fallback_first: u32 = 0,
34 fallback_count: u32 = 0,
35 size: f32 = 0,
36 line_height: f32 = 0,
37 letter_spacing: f32 = 0,
38 word_spacing: f32 = 0,
39 indent: f32 = 0,
40 underline_offset: f32 = 0,
41 decoration_thickness: f32 = 0,
42 decoration_color: abi.Color = .{},
43 weight: u16 = 400,
44 flags: u16 = 0,
45 text_align: u8 = 0,
46 transform: u8 = 0,
47 decoration_line: u8 = 0,
48 decoration_style: u8 = 0,
49 };
50
51 pub const TextFlags = struct {
52 pub const white_space_shift: u4 = 0;
53 pub const word_break_shift: u4 = 3;
54 pub const overflow_wrap_shift: u4 = 5;
55 pub const direction_shift: u4 = 7;
56 pub const user_select_shift: u4 = 8;
57 pub const slant_shift: u4 = 10;
58 };
59
60 comptime {
61 std.debug.assert(@sizeOf(Paint) == 84);
62 std.debug.assert(@alignOf(Paint) == 4);
63 std.debug.assert(@offsetOf(Paint, "background") == 0);
64 std.debug.assert(@offsetOf(Paint, "foreground") == 4);
65 std.debug.assert(@offsetOf(Paint, "border_color") == 8);
66 std.debug.assert(@offsetOf(Paint, "outline_color") == 24);
67 std.debug.assert(@offsetOf(Paint, "border_width") == 28);
68 std.debug.assert(@offsetOf(Paint, "radius") == 44);
69 std.debug.assert(@offsetOf(Paint, "outline_width") == 60);
70 std.debug.assert(@offsetOf(Paint, "outline_offset") == 64);
71 std.debug.assert(@offsetOf(Paint, "outset") == 68);
72 std.debug.assert(@offsetOf(Paint, "image") == 72);
73 std.debug.assert(@offsetOf(Paint, "border_style") == 76);
74 std.debug.assert(@offsetOf(Paint, "outline_style") == 80);
75 std.debug.assert(@offsetOf(Paint, "opacity") == 81);
76 std.debug.assert(@offsetOf(Paint, "flags") == 82);
77 std.debug.assert(@sizeOf(ImagePaint) == 32);
78 std.debug.assert(@alignOf(ImagePaint) == 4);
79 std.debug.assert(@offsetOf(ImagePaint, "asset") == 0);
80 std.debug.assert(@offsetOf(ImagePaint, "source") == 8);
81 std.debug.assert(@offsetOf(ImagePaint, "tint") == 24);
82 std.debug.assert(@offsetOf(ImagePaint, "fit") == 28);
83 std.debug.assert(@offsetOf(ImagePaint, "repeat") == 29);
84 std.debug.assert(@offsetOf(ImagePaint, "origin_box") == 30);
85 std.debug.assert(@offsetOf(ImagePaint, "clip_box") == 31);
86 std.debug.assert(@sizeOf(TextStyle) == 56);
87 std.debug.assert(@alignOf(TextStyle) == 4);
88 std.debug.assert(@offsetOf(TextStyle, "face") == 0);
89 std.debug.assert(@offsetOf(TextStyle, "fallback_first") == 8);
90 std.debug.assert(@offsetOf(TextStyle, "fallback_count") == 12);
91 std.debug.assert(@offsetOf(TextStyle, "size") == 16);
92 std.debug.assert(@offsetOf(TextStyle, "line_height") == 20);
93 std.debug.assert(@offsetOf(TextStyle, "letter_spacing") == 24);
94 std.debug.assert(@offsetOf(TextStyle, "word_spacing") == 28);
95 std.debug.assert(@offsetOf(TextStyle, "indent") == 32);
96 std.debug.assert(@offsetOf(TextStyle, "underline_offset") == 36);
97 std.debug.assert(@offsetOf(TextStyle, "decoration_thickness") == 40);
98 std.debug.assert(@offsetOf(TextStyle, "decoration_color") == 44);
99 std.debug.assert(@offsetOf(TextStyle, "weight") == 48);
100 std.debug.assert(@offsetOf(TextStyle, "flags") == 50);
101 std.debug.assert(@offsetOf(TextStyle, "text_align") == 52);
102 std.debug.assert(@offsetOf(TextStyle, "transform") == 53);
103 std.debug.assert(@offsetOf(TextStyle, "decoration_line") == 54);
104 std.debug.assert(@offsetOf(TextStyle, "decoration_style") == 55);
105 }