From a25ac8b1b295d397948154217f1a62fd25965616 Mon Sep 17 00:00:00 2001 From: nick black Date: Thu, 30 Jan 2025 09:13:30 -0500 Subject: [PATCH] Octants constant array --- src/font/sprite/Box.zig | 269 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index ba7caa26a7..0007aa4a1f 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -25,6 +25,241 @@ const z2d = @import("z2d"); const font = @import("../main.zig"); const Sprite = @import("../sprite.zig").Sprite; +const OctantMin = 0x1cd00; +const OctantMax = 0x1cde5; +const Octants = [OctantMax - OctantMin + 1][8]bool{ + [_]bool{ false, false, true, false, false, false, false, false }, + [_]bool{ false, true, true, false, false, false, false, false }, + [_]bool{ true, true, true, false, false, false, false, false }, + [_]bool{ false, false, false, true, false, false, false, false }, + [_]bool{ true, false, false, true, false, false, false, false }, + [_]bool{ true, true, false, true, false, false, false, false }, + [_]bool{ false, false, true, true, false, false, false, false }, + [_]bool{ true, false, true, true, false, false, false, false }, + [_]bool{ false, true, true, true, false, false, false, false }, + [_]bool{ false, false, false, false, true, false, false, false }, + [_]bool{ true, false, false, false, true, false, false, false }, + [_]bool{ false, true, false, false, true, false, false, false }, + [_]bool{ true, true, false, false, true, false, false, false }, + [_]bool{ true, false, true, false, true, false, false, false }, + [_]bool{ false, true, true, false, true, false, false, false }, + [_]bool{ true, true, true, false, true, false, false, false }, + [_]bool{ false, false, false, true, true, false, false, false }, + [_]bool{ true, false, false, true, true, false, false, false }, + [_]bool{ false, true, false, true, true, false, false, false }, + [_]bool{ true, true, false, true, true, false, false, false }, + [_]bool{ false, false, true, true, true, false, false, false }, + [_]bool{ true, false, true, true, true, false, false, false }, + [_]bool{ false, true, true, true, true, false, false, false }, + [_]bool{ true, true, true, true, true, false, false, false }, + [_]bool{ false, false, false, false, false, true, false, false }, + [_]bool{ true, false, false, false, false, true, false, false }, + [_]bool{ false, true, false, false, false, true, false, false }, + [_]bool{ true, true, false, false, false, true, false, false }, + [_]bool{ false, false, true, false, false, true, false, false }, + [_]bool{ true, false, true, false, false, true, false, false }, + [_]bool{ false, true, true, false, false, true, false, false }, + [_]bool{ true, true, true, false, false, true, false, false }, + [_]bool{ true, false, false, true, false, true, false, false }, + [_]bool{ false, true, false, true, false, true, false, false }, + [_]bool{ true, true, false, true, false, true, false, false }, + [_]bool{ false, false, true, true, false, true, false, false }, + [_]bool{ true, false, true, true, false, true, false, false }, + [_]bool{ false, true, true, true, false, true, false, false }, + [_]bool{ true, true, true, true, false, true, false, false }, + [_]bool{ false, false, false, false, true, true, false, false }, + [_]bool{ true, false, false, false, true, true, false, false }, + [_]bool{ false, true, false, false, true, true, false, false }, + [_]bool{ true, true, false, false, true, true, false, false }, + [_]bool{ false, false, true, false, true, true, false, false }, + [_]bool{ true, false, true, false, true, true, false, false }, + [_]bool{ false, true, true, false, true, true, false, false }, + [_]bool{ true, true, true, false, true, true, false, false }, + [_]bool{ false, false, false, true, true, true, false, false }, + [_]bool{ true, false, false, true, true, true, false, false }, + [_]bool{ false, true, false, true, true, true, false, false }, + [_]bool{ true, true, false, true, true, true, false, false }, + [_]bool{ false, false, true, true, true, true, false, false }, + [_]bool{ true, false, true, true, true, true, false, false }, + [_]bool{ false, true, true, true, true, true, false, false }, + [_]bool{ true, false, false, false, false, false, true, false }, + [_]bool{ false, true, false, false, false, false, true, false }, + [_]bool{ true, true, false, false, false, false, true, false }, + [_]bool{ false, false, true, false, false, false, true, false }, + [_]bool{ true, false, true, false, false, false, true, false }, + [_]bool{ false, true, true, false, false, false, true, false }, + [_]bool{ true, true, true, false, false, false, true, false }, + [_]bool{ false, false, false, true, false, false, true, false }, + [_]bool{ true, false, false, true, false, false, true, false }, + [_]bool{ false, true, false, true, false, false, true, false }, + [_]bool{ true, true, false, true, false, false, true, false }, + [_]bool{ false, false, true, true, false, false, true, false }, + [_]bool{ true, false, true, true, false, false, true, false }, + [_]bool{ false, true, true, true, false, false, true, false }, + [_]bool{ true, true, true, true, false, false, true, false }, + [_]bool{ true, false, false, false, true, false, true, false }, + [_]bool{ false, true, false, false, true, false, true, false }, + [_]bool{ true, true, false, false, true, false, true, false }, + [_]bool{ false, false, true, false, true, false, true, false }, + [_]bool{ false, true, true, false, true, false, true, false }, + [_]bool{ true, true, true, false, true, false, true, false }, + [_]bool{ false, false, false, true, true, false, true, false }, + [_]bool{ true, false, false, true, true, false, true, false }, + [_]bool{ true, true, false, true, true, false, true, false }, + [_]bool{ false, false, true, true, true, false, true, false }, + [_]bool{ true, false, true, true, true, false, true, false }, + [_]bool{ false, true, true, true, true, false, true, false }, + [_]bool{ false, false, false, false, false, true, true, false }, + [_]bool{ true, false, false, false, false, true, true, false }, + [_]bool{ false, true, false, false, false, true, true, false }, + [_]bool{ true, true, false, false, false, true, true, false }, + [_]bool{ false, false, true, false, false, true, true, false }, + [_]bool{ true, false, true, false, false, true, true, false }, + [_]bool{ false, true, true, false, false, true, true, false }, + [_]bool{ true, true, true, false, false, true, true, false }, + [_]bool{ false, false, false, true, false, true, true, false }, + [_]bool{ true, false, false, true, false, true, true, false }, + [_]bool{ false, true, false, true, false, true, true, false }, + [_]bool{ true, true, false, true, false, true, true, false }, + [_]bool{ false, false, true, true, false, true, true, false }, + [_]bool{ true, false, true, true, false, true, true, false }, + [_]bool{ false, true, true, true, false, true, true, false }, + [_]bool{ true, true, true, true, false, true, true, false }, + [_]bool{ false, false, false, false, true, true, true, false }, + [_]bool{ true, false, false, false, true, true, true, false }, + [_]bool{ false, true, false, false, true, true, true, false }, + [_]bool{ true, true, false, false, true, true, true, false }, + [_]bool{ false, false, true, false, true, true, true, false }, + [_]bool{ true, false, true, false, true, true, true, false }, + [_]bool{ false, true, true, false, true, true, true, false }, + [_]bool{ true, true, true, false, true, true, true, false }, + [_]bool{ false, false, false, true, true, true, true, false }, + [_]bool{ true, false, false, true, true, true, true, false }, + [_]bool{ false, true, false, true, true, true, true, false }, + [_]bool{ true, true, false, true, true, true, true, false }, + [_]bool{ false, false, true, true, true, true, true, false }, + [_]bool{ true, false, true, true, true, true, true, false }, + [_]bool{ false, true, true, true, true, true, true, false }, + [_]bool{ true, true, true, true, true, true, true, false }, + [_]bool{ true, false, false, false, false, false, false, true }, + [_]bool{ false, true, false, false, false, false, false, true }, + [_]bool{ true, true, false, false, false, false, false, true }, + [_]bool{ false, false, true, false, false, false, false, true }, + [_]bool{ true, false, true, false, false, false, false, true }, + [_]bool{ false, true, true, false, false, false, false, true }, + [_]bool{ true, true, true, false, false, false, false, true }, + [_]bool{ false, false, false, true, false, false, false, true }, + [_]bool{ true, false, false, true, false, false, false, true }, + [_]bool{ false, true, false, true, false, false, false, true }, + [_]bool{ true, true, false, true, false, false, false, true }, + [_]bool{ false, false, true, true, false, false, false, true }, + [_]bool{ true, false, true, true, false, false, false, true }, + [_]bool{ false, true, true, true, false, false, false, true }, + [_]bool{ true, true, true, true, false, false, false, true }, + [_]bool{ false, false, false, false, true, false, false, true }, + [_]bool{ true, false, false, false, true, false, false, true }, + [_]bool{ false, true, false, false, true, false, false, true }, + [_]bool{ true, true, false, false, true, false, false, true }, + [_]bool{ false, false, true, false, true, false, false, true }, + [_]bool{ true, false, true, false, true, false, false, true }, + [_]bool{ false, true, true, false, true, false, false, true }, + [_]bool{ true, true, true, false, true, false, false, true }, + [_]bool{ false, false, false, true, true, false, false, true }, + [_]bool{ true, false, false, true, true, false, false, true }, + [_]bool{ false, true, false, true, true, false, false, true }, + [_]bool{ true, true, false, true, true, false, false, true }, + [_]bool{ false, false, true, true, true, false, false, true }, + [_]bool{ true, false, true, true, true, false, false, true }, + [_]bool{ false, true, true, true, true, false, false, true }, + [_]bool{ true, true, true, true, true, false, false, true }, + [_]bool{ true, false, false, false, false, true, false, true }, + [_]bool{ false, true, false, false, false, true, false, true }, + [_]bool{ true, true, false, false, false, true, false, true }, + [_]bool{ false, false, true, false, false, true, false, true }, + [_]bool{ false, true, true, false, false, true, false, true }, + [_]bool{ true, true, true, false, false, true, false, true }, + [_]bool{ false, false, false, true, false, true, false, true }, + [_]bool{ true, false, false, true, false, true, false, true }, + [_]bool{ true, true, false, true, false, true, false, true }, + [_]bool{ false, false, true, true, false, true, false, true }, + [_]bool{ true, false, true, true, false, true, false, true }, + [_]bool{ false, true, true, true, false, true, false, true }, + [_]bool{ false, false, false, false, true, true, false, true }, + [_]bool{ true, false, false, false, true, true, false, true }, + [_]bool{ false, true, false, false, true, true, false, true }, + [_]bool{ true, true, false, false, true, true, false, true }, + [_]bool{ false, false, true, false, true, true, false, true }, + [_]bool{ true, false, true, false, true, true, false, true }, + [_]bool{ false, true, true, false, true, true, false, true }, + [_]bool{ true, true, true, false, true, true, false, true }, + [_]bool{ false, false, false, true, true, true, false, true }, + [_]bool{ true, false, false, true, true, true, false, true }, + [_]bool{ false, true, false, true, true, true, false, true }, + [_]bool{ true, true, false, true, true, true, false, true }, + [_]bool{ false, false, true, true, true, true, false, true }, + [_]bool{ true, false, true, true, true, true, false, true }, + [_]bool{ false, true, true, true, true, true, false, true }, + [_]bool{ true, true, true, true, true, true, false, true }, + [_]bool{ true, false, false, false, false, false, true, true }, + [_]bool{ false, true, false, false, false, false, true, true }, + [_]bool{ true, true, false, false, false, false, true, true }, + [_]bool{ false, false, true, false, false, false, true, true }, + [_]bool{ true, false, true, false, false, false, true, true }, + [_]bool{ false, true, true, false, false, false, true, true }, + [_]bool{ true, true, true, false, false, false, true, true }, + [_]bool{ false, false, false, true, false, false, true, true }, + [_]bool{ true, false, false, true, false, false, true, true }, + [_]bool{ false, true, false, true, false, false, true, true }, + [_]bool{ true, true, false, true, false, false, true, true }, + [_]bool{ false, false, true, true, false, false, true, true }, + [_]bool{ true, false, true, true, false, false, true, true }, + [_]bool{ false, true, true, true, false, false, true, true }, + [_]bool{ true, true, true, true, false, false, true, true }, + [_]bool{ false, false, false, false, true, false, true, true }, + [_]bool{ true, false, false, false, true, false, true, true }, + [_]bool{ false, true, false, false, true, false, true, true }, + [_]bool{ true, true, false, false, true, false, true, true }, + [_]bool{ false, false, true, false, true, false, true, true }, + [_]bool{ true, false, true, false, true, false, true, true }, + [_]bool{ false, true, true, false, true, false, true, true }, + [_]bool{ true, true, true, false, true, false, true, true }, + [_]bool{ false, false, false, true, true, false, true, true }, + [_]bool{ true, false, false, true, true, false, true, true }, + [_]bool{ false, true, false, true, true, false, true, true }, + [_]bool{ true, true, false, true, true, false, true, true }, + [_]bool{ false, false, true, true, true, false, true, true }, + [_]bool{ true, false, true, true, true, false, true, true }, + [_]bool{ false, true, true, true, true, false, true, true }, + [_]bool{ true, true, true, true, true, false, true, true }, + [_]bool{ false, false, false, false, false, true, true, true }, + [_]bool{ true, false, false, false, false, true, true, true }, + [_]bool{ false, true, false, false, false, true, true, true }, + [_]bool{ true, true, false, false, false, true, true, true }, + [_]bool{ false, false, true, false, false, true, true, true }, + [_]bool{ true, false, true, false, false, true, true, true }, + [_]bool{ false, true, true, false, false, true, true, true }, + [_]bool{ true, true, true, false, false, true, true, true }, + [_]bool{ false, false, false, true, false, true, true, true }, + [_]bool{ true, false, false, true, false, true, true, true }, + [_]bool{ false, true, false, true, false, true, true, true }, + [_]bool{ true, true, false, true, false, true, true, true }, + [_]bool{ false, false, true, true, false, true, true, true }, + [_]bool{ true, false, true, true, false, true, true, true }, + [_]bool{ false, true, true, true, false, true, true, true }, + [_]bool{ true, true, true, true, false, true, true, true }, + [_]bool{ true, false, false, false, true, true, true, true }, + [_]bool{ false, true, false, false, true, true, true, true }, + [_]bool{ true, true, false, false, true, true, true, true }, + [_]bool{ false, false, true, false, true, true, true, true }, + [_]bool{ false, true, true, false, true, true, true, true }, + [_]bool{ true, true, true, false, true, true, true, true }, + [_]bool{ false, false, false, true, true, true, true, true }, + [_]bool{ true, false, false, true, true, true, true, true }, + [_]bool{ true, true, false, true, true, true, true, true }, + [_]bool{ true, false, true, true, true, true, true, true }, + [_]bool{ false, true, true, true, true, true, true, true }, +}; + const log = std.log.scoped(.box_font); /// Grid metrics for the rendering. @@ -579,6 +814,8 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void 0x2800...0x28ff => self.draw_braille(canvas, cp), + OctantMin...OctantMax => self.draw_octant(canvas, cp), + 0x1fb00...0x1fb3b => self.draw_sextant(canvas, cp), // '🬼' @@ -2484,6 +2721,23 @@ fn draw_sextant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { if (sex.br) self.rect(canvas, x_halfs[1], y_thirds[1], self.metrics.cell_width, self.metrics.cell_height); } +fn draw_octant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { + assert(cp >= OctantMin and cp <= OctantMax); + const oct = Octants[cp - OctantMin]; + + const x_halfs = self.xHalfs(); + const y_quads = self.yQuads(); + + if (oct[0]) self.rect(canvas, 0, 0, x_halfs[0], y_quads[0]); + if (oct[1]) self.rect(canvas, x_halfs[1], 0, self.metrics.cell_width, y_quads[0]); + if (oct[2]) self.rect(canvas, 0, y_quads[0], x_halfs[0], y_quads[1]); + if (oct[3]) self.rect(canvas, x_halfs[1], y_quads[0], self.metrics.cell_width, y_quads[1]); + if (oct[4]) self.rect(canvas, 0, y_quads[1], x_halfs[0], y_quads[2]); + if (oct[5]) self.rect(canvas, x_halfs[1], y_quads[1], self.metrics.cell_width, y_quads[2]); + if (oct[6]) self.rect(canvas, 0, y_quads[2], x_halfs[0], self.metrics.cell_height); + if (oct[7]) self.rect(canvas, x_halfs[1], y_quads[2], self.metrics.cell_width, self.metrics.cell_height); +} + fn xHalfs(self: Box) [2]u32 { return .{ @as(u32, @intFromFloat(@round(@as(f64, @floatFromInt(self.metrics.cell_width)) / 2))), @@ -2500,6 +2754,21 @@ fn yThirds(self: Box) [2]u32 { }; } +// assume octants might be striped across multiple rows of cells. to maximize +// distance between excess pixellines, we want (1) an arbitrary region (there +// will be a pattern of 1'-3-1'-3-1'-3 no matter what), (2) discontiguous +// regions (0 and 2 or 1 and 3), and (3) an arbitrary three regions (there will +// be a pattern of 3-1-3-1-3-1 no matter what). +fn yQuads(self: Box) [3]u32 { + return switch (@mod(self.metrics.cell_height, 4)) { + 0 => .{ self.metrics.cell_height / 4, 2 * self.metrics.cell_height / 4, 3 * self.metrics.cell_height / 4 }, + 1 => .{ self.metrics.cell_height / 4, 2 * self.metrics.cell_height / 4 + 1, 3 * self.metrics.cell_height / 4 }, + 2 => .{ self.metrics.cell_height / 4 + 1, 2 * self.metrics.cell_height / 4, 3 * self.metrics.cell_height / 4 + 1 }, + 3 => .{ self.metrics.cell_height / 4 + 1, 2 * self.metrics.cell_height / 4 + 1, 3 * self.metrics.cell_height / 4 }, + else => unreachable, + }; +} + fn draw_smooth_mosaic( self: Box, canvas: *font.sprite.Canvas,