From b6b1f02565331cd653758e1bdd295febd3baaf7c Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 8 Dec 2025 14:32:01 +0100 Subject: [PATCH] fix: switch to a shared GraphemeCache and increase it's size to 512kb --- src/renderer/vaxis/GraphemeCache.zig | 23 +++++++++++++++++++++++ src/renderer/vaxis/Layer.zig | 3 +++ src/renderer/vaxis/Plane.zig | 16 +++------------- src/renderer/vaxis/renderer.zig | 3 +++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 src/renderer/vaxis/GraphemeCache.zig diff --git a/src/renderer/vaxis/GraphemeCache.zig b/src/renderer/vaxis/GraphemeCache.zig new file mode 100644 index 0000000..b47e9b6 --- /dev/null +++ b/src/renderer/vaxis/GraphemeCache.zig @@ -0,0 +1,23 @@ +storage: *Storage, + +pub const GraphemeCache = @This(); + +pub inline fn put(self: *@This(), bytes: []const u8) []u8 { + return self.storage.put(bytes); +} + +pub const Storage = struct { + buf: [1024 * 512]u8 = undefined, + idx: usize = 0, + + pub fn put(self: *@This(), bytes: []const u8) []u8 { + if (self.idx + bytes.len > self.buf.len) self.idx = 0; + defer self.idx += bytes.len; + @memcpy(self.buf[self.idx .. self.idx + bytes.len], bytes); + return self.buf[self.idx .. self.idx + bytes.len]; + } + + pub fn cache(self: *@This()) GraphemeCache { + return .{ .storage = self }; + } +}; diff --git a/src/renderer/vaxis/Layer.zig b/src/renderer/vaxis/Layer.zig index 50831c8..042af43 100644 --- a/src/renderer/vaxis/Layer.zig +++ b/src/renderer/vaxis/Layer.zig @@ -2,6 +2,7 @@ const std = @import("std"); const vaxis = @import("vaxis"); pub const Plane = @import("Plane.zig"); +const GraphemeCache = @import("GraphemeCache.zig"); const Layer = @This(); @@ -9,6 +10,7 @@ view: View, y_off: i32 = 0, x_off: i32 = 0, plane_: Plane, +cache_storage: GraphemeCache.Storage = .{}, const View = struct { allocator: std.mem.Allocator, @@ -57,6 +59,7 @@ pub fn init(allocator: std.mem.Allocator, opts: Options) std.mem.Allocator.Error const name = "layer"; self.plane_ = .{ .window = self.window(), + .cache = self.cache_storage.cache(), .name_buf = undefined, .name_len = name.len, }; diff --git a/src/renderer/vaxis/Plane.zig b/src/renderer/vaxis/Plane.zig index 50fcf1e..8ff6943 100644 --- a/src/renderer/vaxis/Plane.zig +++ b/src/renderer/vaxis/Plane.zig @@ -8,6 +8,7 @@ const vaxis = @import("vaxis"); const Buffer = @import("Buffer"); const color = @import("color"); const RGB = @import("color").RGB; +const GraphemeCache = @import("GraphemeCache.zig"); const Plane = @This(); @@ -18,7 +19,7 @@ row: i32 = 0, col: i32 = 0, name_buf: [name_buf_len]u8, name_len: usize, -cache: GraphemeCache = .{}, +cache: GraphemeCache, style: vaxis.Cell.Style = .{}, style_base: vaxis.Cell.Style = .{}, scrolling: bool = false, @@ -49,6 +50,7 @@ pub fn init(nopts: *const Options, parent_: Plane) !Plane { const len = @min(nopts.name.len, name_buf_len); var plane: Plane = .{ .window = parent_.window.child(opts), + .cache = parent_.cache, .name_buf = undefined, .name_len = len, .scrolling = nopts.flags == .VSCROLL, @@ -500,18 +502,6 @@ pub fn metrics(self: *const Plane, tab_width: usize) Buffer.Metrics { }; } -const GraphemeCache = struct { - buf: [1024 * 32]u8 = undefined, - idx: usize = 0, - - pub fn put(self: *GraphemeCache, bytes: []const u8) []u8 { - if (self.idx + bytes.len > self.buf.len) self.idx = 0; - defer self.idx += bytes.len; - @memcpy(self.buf[self.idx .. self.idx + bytes.len], bytes); - return self.buf[self.idx .. self.idx + bytes.len]; - } -}; - fn to_cell_color(col: ThemeColor) vaxis.Cell.Color { return .{ .rgb = RGB.to_u8s(RGB.from_u24(col.color)) }; } diff --git a/src/renderer/vaxis/renderer.zig b/src/renderer/vaxis/renderer.zig index 5f6376c..78524c2 100644 --- a/src/renderer/vaxis/renderer.zig +++ b/src/renderer/vaxis/renderer.zig @@ -16,6 +16,7 @@ pub const CursorShape = vaxis.Cell.CursorShape; pub const style = @import("style.zig").StyleBits; pub const styles = @import("style.zig"); +const GraphemeCache = @import("GraphemeCache.zig"); const Self = @This(); pub const log_name = "vaxis"; @@ -25,6 +26,7 @@ allocator: std.mem.Allocator, tty: vaxis.Tty, vx: vaxis.Vaxis, tty_buffer: []u8, +cache_storage: GraphemeCache.Storage = .{}, no_alternate: bool, event_buffer: std.Io.Writer.Allocating, @@ -240,6 +242,7 @@ pub fn stdplane(self: *Self) Plane { const name = "root"; var plane: Plane = .{ .window = self.vx.window(), + .cache = self.cache_storage.cache(), .name_buf = undefined, .name_len = name.len, };