From 527d8baaa0e626f52181c3cd005d51d2821ec65d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 30 Jun 2022 10:05:47 -0700 Subject: [PATCH] invert attribute --- src/Grid.zig | 46 ++++++++++++++++++++++++++++++++++++---------- src/Window.zig | 5 +++++ 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/Grid.zig b/src/Grid.zig index 14a2a9869..ccdc1f14e 100644 --- a/src/Grid.zig +++ b/src/Grid.zig @@ -45,6 +45,9 @@ cursor_style: CursorStyle, /// Default foreground color foreground: terminal.color.RGB, +/// Default background color +background: terminal.color.RGB, + /// Available cursor styles for drawing. The values represents the mode value /// in the shader. pub const CursorStyle = enum(u8) { @@ -242,6 +245,7 @@ pub fn init(alloc: Allocator) !Grid { .atlas_dirty = false, .cursor_visible = true, .cursor_style = .box, + .background = .{ .r = 0, .g = 0, .b = 0 }, .foreground = .{ .r = 255, .g = 255, .b = 255 }, }; } @@ -283,10 +287,34 @@ pub fn updateCells(self: *Grid, term: Terminal) !void { defer y += 1; for (line) |cell, x| { - // TODO: inverse + // The colors for the cell. + const colors: struct { + /// Background is optional because in un-inverted mode + /// it may just be equivalent to the default background in + /// which case we do nothing to save on GPU render time. + bg: ?terminal.color.RGB, + + /// Fg is always set to some color, though we may not render + /// any fg if the cell is empty or has no attributes like + /// underline. + fg: terminal.color.RGB, + } = if (cell.attrs.inverse == 0) .{ + // In normal mode, background and fg match the cell. We + // un-optionalize the fg by defaulting to our fg color. + .bg = cell.bg, + .fg = cell.fg orelse self.foreground, + } else .{ + // In inverted mode, the background MUST be set to something + // (is never null) so it is either the fg or default fg. The + // fg is either the bg or default background. + // + // TODO(mitchellh): How should this interact with DECSCNM? + .bg = cell.fg orelse self.foreground, + .fg = cell.bg orelse self.background, + }; // If the cell has a background, we always draw it. - if (cell.bg) |rgb| { + if (colors.bg) |rgb| { self.cells.appendAssumeCapacity(.{ .mode = 1, .grid_col = @intCast(u16, x), @@ -308,8 +336,6 @@ pub fn updateCells(self: *Grid, term: Terminal) !void { }); } - const fg = cell.fg orelse self.foreground; - // If the cell is empty then we draw nothing in the box. if (!cell.empty()) { // Determine our glyph styling @@ -337,9 +363,9 @@ pub fn updateCells(self: *Grid, term: Terminal) !void { .glyph_height = glyph.height, .glyph_offset_x = glyph.offset_x, .glyph_offset_y = glyph.offset_y, - .fg_r = fg.r, - .fg_g = fg.g, - .fg_b = fg.b, + .fg_r = colors.fg.r, + .fg_g = colors.fg.g, + .fg_b = colors.fg.b, .fg_a = 255, .bg_r = 0, .bg_g = 0, @@ -359,9 +385,9 @@ pub fn updateCells(self: *Grid, term: Terminal) !void { .glyph_height = 0, .glyph_offset_x = 0, .glyph_offset_y = 0, - .fg_r = fg.r, - .fg_g = fg.g, - .fg_b = fg.b, + .fg_r = colors.fg.r, + .fg_g = colors.fg.g, + .fg_b = colors.fg.b, .fg_a = 255, .bg_r = 0, .bg_g = 0, diff --git a/src/Window.zig b/src/Window.zig index f2966bcf3..e38a5aafb 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -150,6 +150,11 @@ pub fn create(alloc: Allocator, loop: libuv.Loop, config: *const Config) !*Windo const window_size = try window.getSize(); var grid = try Grid.init(alloc); try grid.setScreenSize(.{ .width = window_size.width, .height = window_size.height }); + grid.background = .{ + .r = config.background.r, + .g = config.background.g, + .b = config.background.b, + }; grid.foreground = .{ .r = config.foreground.r, .g = config.foreground.g,