From 2084d5f256c2260c3ad6dc7d750c46b339585f0c Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 29 Jun 2025 21:32:22 -0600 Subject: [PATCH] font/sprite+renderer: never constrain sprite glyphs This was creating problems with the branch drawing glyphs at some sizes. In the future the whole "foreground modes" thing needs to be reworked, so this is just a stopgap until that gets turned in to something nicer. --- src/font/Glyph.zig | 3 +++ src/font/sprite/Face.zig | 3 ++- src/renderer/generic.zig | 25 ++++++++++++++++--------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/font/Glyph.zig b/src/font/Glyph.zig index 5449e2440..fa29e44fa 100644 --- a/src/font/Glyph.zig +++ b/src/font/Glyph.zig @@ -20,3 +20,6 @@ atlas_y: u32, /// horizontal position to increase drawing position for strings advance_x: f32, + +/// Whether we drew this glyph ourselves with the sprite font. +sprite: bool = false, diff --git a/src/font/sprite/Face.zig b/src/font/sprite/Face.zig index 25968e865..8c39daef4 100644 --- a/src/font/sprite/Face.zig +++ b/src/font/sprite/Face.zig @@ -216,7 +216,7 @@ pub fn renderGlyph( // Write the drawing to the atlas const region = try canvas.writeAtlas(alloc, atlas); - return font.Glyph{ + return .{ .width = region.width, .height = region.height, .offset_x = @as(i32, @intCast(canvas.clip_left)) - @as(i32, @intCast(padding_x)), @@ -224,6 +224,7 @@ pub fn renderGlyph( .atlas_x = region.x, .atlas_y = region.y, .advance_x = @floatFromInt(width), + .sprite = true, }; } diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 0e97808af..810e17686 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -3039,15 +3039,22 @@ pub fn Renderer(comptime GraphicsAPI: type) type { return; } - const mode: shaderpkg.CellText.Mode = switch (fgMode( - render.presentation, - cell_pin, - )) { - .normal => .fg, - .color => .fg_color, - .constrained => .fg_constrained, - .powerline => .fg_powerline, - }; + // We always use fg mode for sprite glyphs, since we know we never + // need to constrain them, and we don't have any color sprites. + // + // Otherwise we defer to `fgMode`. + const mode: shaderpkg.CellText.Mode = + if (render.glyph.sprite) + .fg + else switch (fgMode( + render.presentation, + cell_pin, + )) { + .normal => .fg, + .color => .fg_color, + .constrained => .fg_constrained, + .powerline => .fg_powerline, + }; try self.cells.add(self.alloc, .text, .{ .mode = mode,