Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

draw octants directly rather than relying on font #5433

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 269 additions & 0 deletions src/font/sprite/Box.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems rather tedious and error-prone to convert the name of the octant from "BLOCK OCTANT-12345" to a boolean array like this. With comptime strings and inline for loops this can be made so much easier.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hrmmm, i agree that using the language's native features for this kind of thing would be far less opaque. i'm intrigued, but doubt i'll get to it this weekend--feel encouraged to use this PR as a starting point to do something better. i have no emotional ties to this matrix.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the pointers to the ziggery, though!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't reviewed this PR yet but I agree this code is very C (no surprise!). Zig's comptime facilities should allow us to do something much nicer here I believe.

[_]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.
Expand Down Expand Up @@ -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),

// '🬼'
Expand Down Expand Up @@ -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))),
Expand All @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions src/font/sprite/Face.zig
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,8 @@ const Kind = enum {
// (Geometric Shapes)
// 🯠 🯡 🯢 🯣 🯤 🯥 🯦 🯧 🯨 🯩 🯪 🯫 🯬 🯭 🯮 🯯
0x1FBCE...0x1FBEF,
// (Octants)
0x1cd00...0x1cde5,
=> .box,

// Branch drawing character set, used for drawing git-like
Expand Down