From 12ad0fa4b68c0748fbbbbf3ba89ceecad3567d0c Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 10 Jun 2025 12:11:59 -0600 Subject: [PATCH] font/sprite: add corner pieces from Geometric Shapes block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ◢ ◣ ◤ ◥ ◸ ◹ ◺ ◿ --- src/font/sprite/Box.zig | 123 +++++++++++++++++++++++++++++++ src/font/sprite/Face.zig | 5 ++ src/font/sprite/testdata/Box.ppm | Bin 1048593 -> 1048593 bytes 3 files changed, 128 insertions(+) diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index dd02f701b..f5140091d 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -581,6 +581,120 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void // '▟' 0x259f => self.draw_quadrant(canvas, .{ .tr = true, .bl = true, .br = true }), + // '◢' + 0x25e2 => self.draw_corner_triangle_shade(canvas, .br, .on), + // '◣' + 0x25e3 => self.draw_corner_triangle_shade(canvas, .bl, .on), + // '◤' + 0x25e4 => self.draw_corner_triangle_shade(canvas, .tl, .on), + // '◥' + 0x25e5 => self.draw_corner_triangle_shade(canvas, .tr, .on), + + // '◸' + 0x25f8 => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // top edge + self.rect( + canvas, + 0, + 0, + self.metrics.cell_width, + thickness_px, + ); + // left edge + self.rect( + canvas, + 0, + 0, + thickness_px, + self.metrics.cell_height -| 1, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .lower_left, + .upper_right, + ); + }, + // '◹' + 0x25f9 => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // top edge + self.rect( + canvas, + 0, + 0, + self.metrics.cell_width, + thickness_px, + ); + // right edge + self.rect( + canvas, + self.metrics.cell_width -| thickness_px, + 0, + self.metrics.cell_width, + self.metrics.cell_height -| 1, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .upper_left, + .lower_right, + ); + }, + // '◺' + 0x25fa => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // bottom edge + self.rect( + canvas, + 0, + self.metrics.cell_height -| thickness_px, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // left edge + self.rect( + canvas, + 0, + 1, + thickness_px, + self.metrics.cell_height, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .upper_left, + .lower_right, + ); + }, + // '◿' + 0x25ff => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // bottom edge + self.rect( + canvas, + 0, + self.metrics.cell_height -| thickness_px, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // right edge + self.rect( + canvas, + self.metrics.cell_width -| thickness_px, + 1, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .lower_left, + .upper_right, + ); + }, + 0x2800...0x28ff => self.draw_braille(canvas, cp), 0x1fb00...0x1fb3b => self.draw_sextant(canvas, cp), @@ -3197,6 +3311,15 @@ fn testRenderAll(self: Box, alloc: Allocator, atlas: *font.Atlas) !void { else => {}, } } + + // Geometric Shapes: filled and outlined corners + for ([_]u21{ '◢', '◣', '◤', '◥', '◸', '◹', '◺', '◿' }) |char| { + _ = try self.renderGlyph( + alloc, + atlas, + char, + ); + } } test "render all sprites" { diff --git a/src/font/sprite/Face.zig b/src/font/sprite/Face.zig index f15423ada..af0c0af6a 100644 --- a/src/font/sprite/Face.zig +++ b/src/font/sprite/Face.zig @@ -190,6 +190,11 @@ const Kind = enum { // ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟ 0x2580...0x259F, + // "Geometric Shapes" block + 0x25e2...0x25e5, // ◢◣◤◥ + 0x25f8...0x25fa, // ◸◹◺ + 0x25ff, // ◿ + // "Braille" block 0x2800...0x28FF, diff --git a/src/font/sprite/testdata/Box.ppm b/src/font/sprite/testdata/Box.ppm index d5a6cc72906318b235e33bc3ea53be8f88b67193..6082475af7d3e2264cf04061e9f63d7c6e6fdc9e 100644 GIT binary patch delta 12462 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 bu?Ieub0j3F(nnbDZT|oFbSw}x7N-3-Q{9$h delta 10213 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