Compare commits
1 Commits
af8d725e0c
...
af5f035830
| Author | SHA1 | Date | |
|---|---|---|---|
| af5f035830 |
@@ -100,6 +100,12 @@ const import = struct {
|
|||||||
padding: u8,
|
padding: u8,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const stbtt_kerning_table_iterator = extern struct {
|
||||||
|
data: [*]u8,
|
||||||
|
k: c_int,
|
||||||
|
length: c_int,
|
||||||
|
};
|
||||||
|
|
||||||
extern fn stbtt_GetNumberOfFonts(data: [*]const u8) c_int;
|
extern fn stbtt_GetNumberOfFonts(data: [*]const u8) c_int;
|
||||||
extern fn stbtt_GetFontOffsetForIndex(index: c_int, data: [*]const u8) c_int;
|
extern fn stbtt_GetFontOffsetForIndex(index: c_int, data: [*]const u8) c_int;
|
||||||
extern fn stbtt_InitFont(info: *stbtt_fontinfo, data: [*]const u8, offset: c_int) c_int;
|
extern fn stbtt_InitFont(info: *stbtt_fontinfo, data: [*]const u8, offset: c_int) c_int;
|
||||||
@@ -117,6 +123,8 @@ const import = struct {
|
|||||||
|
|
||||||
extern fn stbtt_UnitsPerEm(info: *const stbtt_fontinfo) c_int;
|
extern fn stbtt_UnitsPerEm(info: *const stbtt_fontinfo) c_int;
|
||||||
extern fn stbtt_GetFontCapHeight(info: *const stbtt_fontinfo, capHeight: ?*c_int) c_int;
|
extern fn stbtt_GetFontCapHeight(info: *const stbtt_fontinfo, capHeight: ?*c_int) c_int;
|
||||||
|
extern fn stbtt_KerningTableIterator(info: *const stbtt_fontinfo, it: *stbtt_kerning_table_iterator) void;
|
||||||
|
extern fn stbtt_KerningTableNext(it: *stbtt_kerning_table_iterator, entry: *stbtt_kerningentry) c_int;
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn initFont(self: *Self, data: []const u8) !*Font {
|
pub fn initFont(self: *Self, data: []const u8) !*Font {
|
||||||
@@ -212,6 +220,13 @@ pub const Font = opaque {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn kerningTableIterator(self: *const Font) KerningTableIterator {
|
||||||
|
const info = @as(*const import.stbtt_fontinfo, @ptrCast(@alignCast(self)));
|
||||||
|
var it: import.stbtt_kerning_table_iterator = undefined;
|
||||||
|
import.stbtt_KerningTableIterator(info, &it);
|
||||||
|
return .{ .it = it };
|
||||||
|
}
|
||||||
|
|
||||||
test "refAllDecls" {
|
test "refAllDecls" {
|
||||||
std.testing.refAllDecls(@This());
|
std.testing.refAllDecls(@This());
|
||||||
}
|
}
|
||||||
@@ -229,6 +244,25 @@ pub const GlyphMetrics = struct {
|
|||||||
left_side_bearing: i16,
|
left_side_bearing: i16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const KerningTableEntry = struct {
|
||||||
|
glyph_prev: u16,
|
||||||
|
glyph_next: u16,
|
||||||
|
advance: i16,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const KerningTableIterator = struct {
|
||||||
|
it: import.stbtt_kerning_table_iterator,
|
||||||
|
|
||||||
|
pub fn next(self: *KerningTableIterator) ?KerningTableEntry {
|
||||||
|
var entry: import.stbtt_kerningentry = undefined;
|
||||||
|
return if (import.stbtt_KerningTableNext(&self.it, &entry) != 0) .{
|
||||||
|
.glyph_prev = @intCast(entry.glyph1),
|
||||||
|
.glyph_next = @intCast(entry.glyph2),
|
||||||
|
.advance = @intCast(entry.advance),
|
||||||
|
} else null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// --- MALLOC INTERFACE --------------------------------------------------------
|
// --- MALLOC INTERFACE --------------------------------------------------------
|
||||||
|
|
||||||
export fn castle_media_stbtt_malloc(self: *Self, size: usize) callconv(.c) VoidPtr {
|
export fn castle_media_stbtt_malloc(self: *Self, size: usize) callconv(.c) VoidPtr {
|
||||||
|
|||||||
@@ -22,3 +22,46 @@ STBTT_DEF int stbtt_GetFontCapHeight(const stbtt_fontinfo *info, int *capHeight)
|
|||||||
if (capHeight) *capHeight = ttSHORT(info->data+tab + 88);
|
if (capHeight) *capHeight = ttSHORT(info->data+tab + 88);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct stbtt_kerning_table_iterator {
|
||||||
|
stbtt_uint8 *data;
|
||||||
|
int k;
|
||||||
|
int length;
|
||||||
|
} stbtt_kerning_table_iterator;
|
||||||
|
|
||||||
|
STBTT_DEF void stbtt_KerningTableIterator(const stbtt_fontinfo *info, stbtt_kerning_table_iterator *it)
|
||||||
|
{
|
||||||
|
stbtt_uint8 *data = info->data + info->kern;
|
||||||
|
|
||||||
|
it->data = data;
|
||||||
|
it->k = 0;
|
||||||
|
it->length = 0;
|
||||||
|
|
||||||
|
if (!info->kern)
|
||||||
|
return;
|
||||||
|
if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
|
||||||
|
return;
|
||||||
|
if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
|
||||||
|
return;
|
||||||
|
|
||||||
|
it->length = ttUSHORT(data+10);
|
||||||
|
}
|
||||||
|
|
||||||
|
STBTT_DEF int stbtt_KerningTableNext(stbtt_kerning_table_iterator *it, stbtt_kerningentry *entry)
|
||||||
|
{
|
||||||
|
stbtt_uint8 *data = it->data;
|
||||||
|
int k = it->k;
|
||||||
|
int length = it->length;
|
||||||
|
|
||||||
|
if (k < length)
|
||||||
|
{
|
||||||
|
entry->glyph1 = ttUSHORT(data+18+(k*6));
|
||||||
|
entry->glyph2 = ttUSHORT(data+20+(k*6));
|
||||||
|
entry->advance = ttSHORT(data+22+(k*6));
|
||||||
|
|
||||||
|
it->k += 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user