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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 delta 10213 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 R7rV|sIb7THYWhq{{6F2@nBD*Y