Skip to content

Commit c86b5f4

Browse files
committed
font/sprite: refactor box drawing quads/sextants
Move away from C-style bit sets, calculate sextants procedurally rather than hard coding.
1 parent d63cf6e commit c86b5f4

File tree

1 file changed

+52
-110
lines changed

1 file changed

+52
-110
lines changed

src/font/sprite/Box.zig

+52-110
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ const Lines = struct {
6868
};
6969
};
7070

71+
/// Specification of a quadrants char, which has each of the
72+
/// 4 quadrants of the character cell either filled or empty.
73+
const Quads = struct {
74+
tl: bool = false,
75+
tr: bool = false,
76+
bl: bool = false,
77+
br: bool = false,
78+
};
79+
7180
/// Alignment of a figure within a cell
7281
const Alignment = struct {
7382
horizontal: enum {
@@ -454,9 +463,26 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void
454463
0x2594 => self.draw_block(canvas, Alignment.upper, 1, one_eighth),
455464
// '▕' RIGHT ONE EIGHTH BLOCK
456465
0x2595 => self.draw_block(canvas, Alignment.right, one_eighth, 1),
457-
458-
// ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟
459-
0x2596...0x259f => self.draw_quadrant(canvas, cp),
466+
// '▖'
467+
0x2596 => self.draw_quadrant(canvas, .{ .bl = true }),
468+
// '▗'
469+
0x2597 => self.draw_quadrant(canvas, .{ .br = true }),
470+
// '▘'
471+
0x2598 => self.draw_quadrant(canvas, .{ .tl = true }),
472+
// '▙'
473+
0x2599 => self.draw_quadrant(canvas, .{ .tl = true, .bl = true, .br = true }),
474+
// '▚'
475+
0x259a => self.draw_quadrant(canvas, .{ .tl = true, .br = true }),
476+
// '▛'
477+
0x259b => self.draw_quadrant(canvas, .{ .tl = true, .tr = true, .bl = true }),
478+
// '▜'
479+
0x259c => self.draw_quadrant(canvas, .{ .tl = true, .tr = true, .br = true }),
480+
// '▝'
481+
0x259d => self.draw_quadrant(canvas, .{ .tr = true }),
482+
// '▞'
483+
0x259e => self.draw_quadrant(canvas, .{ .tr = true, .bl = true }),
484+
// '▟'
485+
0x259f => self.draw_quadrant(canvas, .{ .tr = true, .bl = true, .br = true }),
460486

461487
0x2800...0x28ff => self.draw_braille(canvas, cp),
462488

@@ -975,32 +1001,14 @@ fn draw_horizontal_one_eighth_1358_block(self: Box, canvas: *font.sprite.Canvas)
9751001
self.draw_horizontal_one_eighth_block_n(canvas, 7);
9761002
}
9771003

978-
fn draw_quadrant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void {
979-
const UPPER_LEFT: u8 = 1 << 0;
980-
const UPPER_RIGHT: u8 = 1 << 1;
981-
const LOWER_LEFT: u8 = 1 << 2;
982-
const LOWER_RIGHT: u8 = 1 << 3;
983-
const matrix: [10]u8 = .{
984-
LOWER_LEFT,
985-
LOWER_RIGHT,
986-
UPPER_LEFT,
987-
UPPER_LEFT | LOWER_LEFT | LOWER_RIGHT,
988-
UPPER_LEFT | LOWER_RIGHT,
989-
UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT,
990-
UPPER_LEFT | UPPER_RIGHT | LOWER_RIGHT,
991-
UPPER_RIGHT,
992-
UPPER_RIGHT | LOWER_LEFT,
993-
UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
994-
};
995-
996-
assert(cp >= 0x2596 and cp <= 0x259f);
997-
const idx = cp - 0x2596;
998-
const encoded = matrix[idx];
1004+
fn draw_quadrant(self: Box, canvas: *font.sprite.Canvas, comptime quads: Quads) void {
1005+
const center_x = self.width / 2 + self.width % 2;
1006+
const center_y = self.height / 2 + self.height % 2;
9991007

1000-
if (encoded & UPPER_LEFT == UPPER_LEFT) self.draw_block(canvas, .{ .horizontal = .left, .vertical = .top }, 0.5, 0.5);
1001-
if (encoded & UPPER_RIGHT == UPPER_RIGHT) self.draw_block(canvas, .{ .horizontal = .right, .vertical = .top }, 0.5, 0.5);
1002-
if (encoded & LOWER_LEFT == LOWER_LEFT) self.draw_block(canvas, .{ .horizontal = .left, .vertical = .bottom }, 0.5, 0.5);
1003-
if (encoded & LOWER_RIGHT == LOWER_RIGHT) self.draw_block(canvas, .{ .horizontal = .right, .vertical = .bottom }, 0.5, 0.5);
1008+
if (quads.tl) self.rect(canvas, 0, 0, center_x, center_y);
1009+
if (quads.tr) self.rect(canvas, center_x, 0, self.width, center_y);
1010+
if (quads.bl) self.rect(canvas, 0, center_y, center_x, self.height);
1011+
if (quads.br) self.rect(canvas, center_x, center_y, self.width, self.height);
10041012
}
10051013

10061014
fn draw_braille(self: Box, canvas: *font.sprite.Canvas, cp: u32) void {
@@ -1099,96 +1107,30 @@ fn draw_braille(self: Box, canvas: *font.sprite.Canvas, cp: u32) void {
10991107
}
11001108

11011109
fn draw_sextant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void {
1102-
const UPPER_LEFT: u8 = 1 << 0;
1103-
const MIDDLE_LEFT: u8 = 1 << 1;
1104-
const LOWER_LEFT: u8 = 1 << 2;
1105-
const UPPER_RIGHT: u8 = 1 << 3;
1106-
const MIDDLE_RIGHT: u8 = 1 << 4;
1107-
const LOWER_RIGHT: u8 = 1 << 5;
1108-
1109-
const matrix: [60]u8 = .{
1110-
// U+1fb00 - U+1fb0f
1111-
UPPER_LEFT,
1112-
UPPER_RIGHT,
1113-
UPPER_LEFT | UPPER_RIGHT,
1114-
MIDDLE_LEFT,
1115-
UPPER_LEFT | MIDDLE_LEFT,
1116-
UPPER_RIGHT | MIDDLE_LEFT,
1117-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT,
1118-
MIDDLE_RIGHT,
1119-
UPPER_LEFT | MIDDLE_RIGHT,
1120-
UPPER_RIGHT | MIDDLE_RIGHT,
1121-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT,
1122-
MIDDLE_LEFT | MIDDLE_RIGHT,
1123-
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT,
1124-
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT,
1125-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT,
1126-
LOWER_LEFT,
1127-
1128-
// U+1fb10 - U+1fb1f
1129-
UPPER_LEFT | LOWER_LEFT,
1130-
UPPER_RIGHT | LOWER_LEFT,
1131-
UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT,
1132-
MIDDLE_LEFT | LOWER_LEFT,
1133-
UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT,
1134-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT,
1135-
MIDDLE_RIGHT | LOWER_LEFT,
1136-
UPPER_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
1137-
UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT,
1138-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT,
1139-
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
1140-
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
1141-
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
1142-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
1143-
LOWER_RIGHT,
1144-
UPPER_LEFT | LOWER_RIGHT,
1145-
1146-
// U+1fb20 - U+1fb2f
1147-
UPPER_RIGHT | LOWER_RIGHT,
1148-
UPPER_LEFT | UPPER_RIGHT | LOWER_RIGHT,
1149-
MIDDLE_LEFT | LOWER_RIGHT,
1150-
UPPER_LEFT | MIDDLE_LEFT | LOWER_RIGHT,
1151-
UPPER_RIGHT | MIDDLE_LEFT | LOWER_RIGHT,
1152-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_RIGHT,
1153-
MIDDLE_RIGHT | LOWER_RIGHT,
1154-
UPPER_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
1155-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_RIGHT,
1156-
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
1157-
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
1158-
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
1159-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
1160-
LOWER_LEFT | LOWER_RIGHT,
1161-
UPPER_LEFT | LOWER_LEFT | LOWER_RIGHT,
1162-
UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1163-
1164-
// U+1fb30 - U+1fb3b
1165-
UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1166-
MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
1167-
UPPER_LEFT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
1168-
UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
1169-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
1170-
MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1171-
UPPER_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1172-
UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1173-
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1174-
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1175-
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1176-
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
1110+
const Sextants = packed struct(u6) {
1111+
tl: bool,
1112+
tr: bool,
1113+
ml: bool,
1114+
mr: bool,
1115+
bl: bool,
1116+
br: bool,
11771117
};
11781118

11791119
assert(cp >= 0x1fb00 and cp <= 0x1fb3b);
11801120
const idx = cp - 0x1fb00;
1181-
const encoded = matrix[idx];
1121+
const sex: Sextants = @bitCast(@as(u6, @intCast(
1122+
idx + (idx / 0x14) + 1,
1123+
)));
11821124

11831125
const x_halfs = self.xHalfs();
11841126
const y_thirds = self.yThirds();
11851127

1186-
if (encoded & UPPER_LEFT > 0) self.rect(canvas, 0, 0, x_halfs[0], y_thirds[0]);
1187-
if (encoded & MIDDLE_LEFT > 0) self.rect(canvas, 0, y_thirds[0], x_halfs[0], y_thirds[1]);
1188-
if (encoded & LOWER_LEFT > 0) self.rect(canvas, 0, y_thirds[1], x_halfs[0], self.height);
1189-
if (encoded & UPPER_RIGHT > 0) self.rect(canvas, x_halfs[1], 0, self.width, y_thirds[0]);
1190-
if (encoded & MIDDLE_RIGHT > 0) self.rect(canvas, x_halfs[1], y_thirds[0], self.width, y_thirds[1]);
1191-
if (encoded & LOWER_RIGHT > 0) self.rect(canvas, x_halfs[1], y_thirds[1], self.width, self.height);
1128+
if (sex.tl) self.rect(canvas, 0, 0, x_halfs[0], y_thirds[0]);
1129+
if (sex.tr) self.rect(canvas, x_halfs[1], 0, self.width, y_thirds[0]);
1130+
if (sex.ml) self.rect(canvas, 0, y_thirds[0], x_halfs[0], y_thirds[1]);
1131+
if (sex.mr) self.rect(canvas, x_halfs[1], y_thirds[0], self.width, y_thirds[1]);
1132+
if (sex.bl) self.rect(canvas, 0, y_thirds[1], x_halfs[0], self.height);
1133+
if (sex.br) self.rect(canvas, x_halfs[1], y_thirds[1], self.width, self.height);
11921134
}
11931135

11941136
fn xHalfs(self: Box) [2]u32 {

0 commit comments

Comments
 (0)