font/sprite: align quadrants better with other glyphs

Use `xHalfs` and `yHalfs` so that the dimensions of each quadrant are
appropriately aligned with block elements like the one half block, which
could be 1px taller than the bottom quadrants before this change.

This is in line with what we do for sextants, the fact that on odd-sized
cells there's a 1px overlap is considered acceptable there so I assume
it's acceptable here too.
This commit is contained in:
Qwerasd
2025-06-30 18:46:49 -06:00
parent 0414e9e281
commit b4d83e6349
2 changed files with 16 additions and 6 deletions

View File

@@ -15,6 +15,8 @@ const common = @import("common.zig");
const Shade = common.Shade;
const Quads = common.Quads;
const Alignment = common.Alignment;
const xHalfs = common.xHalfs;
const yHalfs = common.yHalfs;
const rect = common.rect;
const font = @import("../../main.zig");
@@ -174,11 +176,11 @@ fn quadrant(
canvas: *font.sprite.Canvas,
comptime quads: Quads,
) void {
const center_x = metrics.cell_width / 2 + metrics.cell_width % 2;
const center_y = metrics.cell_height / 2 + metrics.cell_height % 2;
const x_halfs = xHalfs(metrics);
const y_halfs = yHalfs(metrics);
if (quads.tl) rect(metrics, canvas, 0, 0, center_x, center_y);
if (quads.tr) rect(metrics, canvas, center_x, 0, metrics.cell_width, center_y);
if (quads.bl) rect(metrics, canvas, 0, center_y, center_x, metrics.cell_height);
if (quads.br) rect(metrics, canvas, center_x, center_y, metrics.cell_width, metrics.cell_height);
if (quads.tl) rect(metrics, canvas, 0, 0, x_halfs[0], y_halfs[0]);
if (quads.tr) rect(metrics, canvas, x_halfs[1], 0, metrics.cell_width, y_halfs[0]);
if (quads.bl) rect(metrics, canvas, 0, y_halfs[1], x_halfs[0], metrics.cell_height);
if (quads.br) rect(metrics, canvas, x_halfs[1], y_halfs[1], metrics.cell_width, metrics.cell_height);
}

View File

@@ -204,6 +204,14 @@ pub fn xHalfs(metrics: font.Metrics) [2]u32 {
return .{ half_width, metrics.cell_width - half_width };
}
/// yHalfs[0] should be used as the bottom edge of a top-aligned half.
/// yHalfs[1] should be used as the top edge of a bottom-aligned half.
pub fn yHalfs(metrics: font.Metrics) [2]u32 {
const float_height: f64 = @floatFromInt(metrics.cell_height);
const half_height: u32 = @intFromFloat(@round(0.5 * float_height));
return .{ half_height, metrics.cell_height - half_height };
}
/// Use these values as such:
/// yThirds[0] bottom edge of the first third.
/// yThirds[1] top edge of the second third.