pkg/harfbuzz: shape

This commit is contained in:
Mitchell Hashimoto
2022-08-28 12:11:26 -07:00
parent 1f2d2e926c
commit c377e19bd0
3 changed files with 49 additions and 0 deletions

View File

@ -214,3 +214,32 @@ pub const Language = struct {
return .{ .handle = c.hb_language_get_default() }; return .{ .handle = c.hb_language_get_default() };
} }
}; };
/// The hb_feature_t is the structure that holds information about requested
/// feature application. The feature will be applied with the given value to
/// all glyphs which are in clusters between start (inclusive) and end
/// (exclusive). Setting start to HB_FEATURE_GLOBAL_START and end to
/// HB_FEATURE_GLOBAL_END specifies that the feature always applies to the
/// entire buffer.
pub const Feature = extern struct {
tag: c.hb_tag_t,
value: u32,
start: c_uint,
end: c_uint,
pub fn fromString(str: []const u8) ?Feature {
var f: Feature = undefined;
return if (c.hb_feature_from_string(
str.ptr,
@intCast(c_int, str.len),
&f,
) > 1)
f
else
null;
}
pub fn toString(self: *Feature, buf: []u8) void {
c.hb_feature_to_string(self, buf.ptr, @intCast(c_uint, buf.len));
}
};

View File

@ -5,6 +5,7 @@ pub usingnamespace @import("common.zig");
pub usingnamespace @import("errors.zig"); pub usingnamespace @import("errors.zig");
pub usingnamespace @import("face.zig"); pub usingnamespace @import("face.zig");
pub usingnamespace @import("font.zig"); pub usingnamespace @import("font.zig");
pub usingnamespace @import("shape.zig");
pub usingnamespace @import("version.zig"); pub usingnamespace @import("version.zig");
pub const Freetype = @import("freetype.zig"); pub const Freetype = @import("freetype.zig");

19
pkg/harfbuzz/shape.zig Normal file
View File

@ -0,0 +1,19 @@
const std = @import("std");
const c = @import("c.zig");
const Font = @import("font.zig").Font;
const Buffer = @import("buffer.zig").Buffer;
const Feature = @import("common.zig").Feature;
/// Shapes buffer using font turning its Unicode characters content to
/// positioned glyphs. If features is not NULL, it will be used to control
/// the features applied during shaping. If two features have the same tag
/// but overlapping ranges the value of the feature with the higher index
/// takes precedence.
pub fn shape(font: Font, buf: Buffer, features: ?[]const Feature) void {
c.hb_shape(
font.handle,
buf.handle,
if (features) |f| @ptrCast([*]const c.hb_feature_t, f.ptr) else null,
if (features) |f| @intCast(c_uint, f.len) else 0,
);
}