lib/ui/src/text/contract.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const abi = @import("../abi/root.zig");
3 const fact = @import("../fact/root.zig");
4
5 pub const ShapeRequest = extern struct {
6 text: [*]const u8,
7 text_len: u32,
8 source_offset: u32 = 0,
9 style: *const fact.TextStyle,
10 faces: [*]const abi.AssetHandle,
11 face_count: u32,
12 script: u16 = 0,
13 flags: u16 = 0,
14 };
15
16 pub const MetricsRequest = extern struct {
17 style: *const fact.TextStyle,
18 available_width: f32 = 0,
19 };
20
21 pub const LineMetrics = extern struct {
22 ascent: f32 = 0,
23 descent: f32 = 0,
24 leading: f32 = 0,
25 };
26
27 pub const Shaper = extern struct {
28 context: ?*anyopaque = null,
29 shape_run: *const fn (?*anyopaque, *const ShapeRequest, [*]fact.Cluster, u32) callconv(.c) u32,
30 line_metrics: *const fn (?*anyopaque, *const MetricsRequest) callconv(.c) LineMetrics,
31
32 pub fn shape(
33 self: Shaper,
34 request: *const ShapeRequest,
35 output: []fact.Cluster,
36 ) error{OutputTooSmall}![]fact.Cluster {
37 std.debug.assert(output.len <= std.math.maxInt(u32));
38 const count = self.shape_run(self.context, request, output.ptr, @intCast(output.len));
39 if (count > output.len) return error.OutputTooSmall;
40 return output[0..count];
41 }
42
43 pub fn metrics(self: Shaper, request: *const MetricsRequest) LineMetrics {
44 return self.line_metrics(self.context, request);
45 }
46 };