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 };