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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 aaAk&8OZB|f2)~dj4w`aM6&XsT5I+Fj-I(40