mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 16:26:08 +03:00
metal: understand explicit padding
This commit is contained in:
@ -33,6 +33,9 @@ alloc: std.mem.Allocator,
|
|||||||
/// Current cell dimensions for this grid.
|
/// Current cell dimensions for this grid.
|
||||||
cell_size: renderer.CellSize,
|
cell_size: renderer.CellSize,
|
||||||
|
|
||||||
|
/// Explicit padding.
|
||||||
|
padding: renderer.Options.Padding,
|
||||||
|
|
||||||
/// True if the window is focused
|
/// True if the window is focused
|
||||||
focused: bool,
|
focused: bool,
|
||||||
|
|
||||||
@ -130,7 +133,7 @@ pub fn windowInit(window: glfw.Window) !void {
|
|||||||
// else up during actual initialization.
|
// else up during actual initialization.
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(alloc: Allocator, font_group: *font.GroupCache) !Metal {
|
pub fn init(alloc: Allocator, options: renderer.Options) !Metal {
|
||||||
// Initialize our metal stuff
|
// Initialize our metal stuff
|
||||||
const device = objc.Object.fromId(MTLCreateSystemDefaultDevice());
|
const device = objc.Object.fromId(MTLCreateSystemDefaultDevice());
|
||||||
const queue = device.msgSend(objc.Object, objc.sel("newCommandQueue"), .{});
|
const queue = device.msgSend(objc.Object, objc.sel("newCommandQueue"), .{});
|
||||||
@ -150,8 +153,8 @@ pub fn init(alloc: Allocator, font_group: *font.GroupCache) !Metal {
|
|||||||
// Doesn't matter, any normal ASCII will do we're just trying to make
|
// Doesn't matter, any normal ASCII will do we're just trying to make
|
||||||
// sure we use the regular font.
|
// sure we use the regular font.
|
||||||
const metrics = metrics: {
|
const metrics = metrics: {
|
||||||
const index = (try font_group.indexForCodepoint(alloc, 'M', .regular, .text)).?;
|
const index = (try options.font_group.indexForCodepoint(alloc, 'M', .regular, .text)).?;
|
||||||
const face = try font_group.group.faceFromIndex(index);
|
const face = try options.font_group.group.faceFromIndex(index);
|
||||||
break :metrics face.metrics;
|
break :metrics face.metrics;
|
||||||
};
|
};
|
||||||
log.debug("cell dimensions={}", .{metrics});
|
log.debug("cell dimensions={}", .{metrics});
|
||||||
@ -200,12 +203,13 @@ pub fn init(alloc: Allocator, font_group: *font.GroupCache) !Metal {
|
|||||||
// Initialize our shader (MTLLibrary)
|
// Initialize our shader (MTLLibrary)
|
||||||
const library = try initLibrary(device, @embedFile("../shaders/cell.metal"));
|
const library = try initLibrary(device, @embedFile("../shaders/cell.metal"));
|
||||||
const pipeline_state = try initPipelineState(device, library);
|
const pipeline_state = try initPipelineState(device, library);
|
||||||
const texture_greyscale = try initAtlasTexture(device, &font_group.atlas_greyscale);
|
const texture_greyscale = try initAtlasTexture(device, &options.font_group.atlas_greyscale);
|
||||||
const texture_color = try initAtlasTexture(device, &font_group.atlas_color);
|
const texture_color = try initAtlasTexture(device, &options.font_group.atlas_color);
|
||||||
|
|
||||||
return Metal{
|
return Metal{
|
||||||
.alloc = alloc,
|
.alloc = alloc,
|
||||||
.cell_size = .{ .width = metrics.cell_width, .height = metrics.cell_height },
|
.cell_size = .{ .width = metrics.cell_width, .height = metrics.cell_height },
|
||||||
|
.padding = options.padding,
|
||||||
.background = .{ .r = 0, .g = 0, .b = 0 },
|
.background = .{ .r = 0, .g = 0, .b = 0 },
|
||||||
.foreground = .{ .r = 255, .g = 255, .b = 255 },
|
.foreground = .{ .r = 255, .g = 255, .b = 255 },
|
||||||
.focused = true,
|
.focused = true,
|
||||||
@ -224,7 +228,7 @@ pub fn init(alloc: Allocator, font_group: *font.GroupCache) !Metal {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Fonts
|
// Fonts
|
||||||
.font_group = font_group,
|
.font_group = options.font_group,
|
||||||
.font_shaper = font_shaper,
|
.font_shaper = font_shaper,
|
||||||
|
|
||||||
// Metal stuff
|
// Metal stuff
|
||||||
@ -302,6 +306,15 @@ pub fn threadExit(self: *const Metal) void {
|
|||||||
// Metal requires no per-thread state.
|
// Metal requires no per-thread state.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the grid size for a given screen size. This is safe to call
|
||||||
|
/// on any thread.
|
||||||
|
pub fn gridSize(self: *Metal, screen_size: renderer.ScreenSize) renderer.GridSize {
|
||||||
|
return renderer.GridSize.init(
|
||||||
|
screen_size.subPadding(self.padding.explicit),
|
||||||
|
self.cell_size,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// Callback when the focus changes for the terminal this is rendering.
|
/// Callback when the focus changes for the terminal this is rendering.
|
||||||
pub fn setFocus(self: *Metal, focus: bool) !void {
|
pub fn setFocus(self: *Metal, focus: bool) !void {
|
||||||
self.focused = focus;
|
self.focused = focus;
|
||||||
@ -562,12 +575,14 @@ fn setScreenSize(self: *Metal, bounds: macos.graphics.Size) !void {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Recalculate the rows/columns.
|
// Recalculate the rows/columns.
|
||||||
const grid_size = renderer.GridSize.init(dim, self.cell_size);
|
const grid_size = self.gridSize(dim);
|
||||||
|
|
||||||
// Determine if we need to pad the window. For "auto" padding, we take
|
// Determine if we need to pad the window. For "auto" padding, we take
|
||||||
// the leftover amounts on the right/bottom that don't fit a full grid cell
|
// the leftover amounts on the right/bottom that don't fit a full grid cell
|
||||||
// and we split them equal across all boundaries.
|
// and we split them equal across all boundaries.
|
||||||
const padding = renderer.Padding.balanced(dim, grid_size, self.cell_size);
|
const padding = self.padding.explicit.add(if (self.padding.balance)
|
||||||
|
renderer.Padding.balanced(dim, grid_size, self.cell_size)
|
||||||
|
else .{});
|
||||||
const padded_dim = dim.subPadding(padding);
|
const padded_dim = dim.subPadding(padding);
|
||||||
|
|
||||||
// Update our shaper
|
// Update our shaper
|
||||||
@ -585,8 +600,8 @@ fn setScreenSize(self: *Metal, bounds: macos.graphics.Size) !void {
|
|||||||
self.uniforms = .{
|
self.uniforms = .{
|
||||||
.projection_matrix = math.ortho2d(
|
.projection_matrix = math.ortho2d(
|
||||||
-1 * padding.left,
|
-1 * padding.left,
|
||||||
@intToFloat(f32, padded_dim.width),
|
@intToFloat(f32, padded_dim.width) + padding.right,
|
||||||
@intToFloat(f32, padded_dim.height),
|
@intToFloat(f32, padded_dim.height) + padding.bottom,
|
||||||
-1 * padding.top,
|
-1 * padding.top,
|
||||||
),
|
),
|
||||||
.cell_size = .{ self.cell_size.width, self.cell_size.height },
|
.cell_size = .{ self.cell_size.width, self.cell_size.height },
|
||||||
|
Reference in New Issue
Block a user