mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 07:46:12 +03:00
cell: convert atlas x/y to NDC in shader
This commit is contained in:
@ -71,10 +71,12 @@ void main() {
|
|||||||
cell_pos = cell_pos + glyph_size * position + glyph_offset_calc;
|
cell_pos = cell_pos + glyph_size * position + glyph_offset_calc;
|
||||||
gl_Position = projection * vec4(cell_pos, 0.0, 1.0);
|
gl_Position = projection * vec4(cell_pos, 0.0, 1.0);
|
||||||
|
|
||||||
// Calculate our texture coordinate
|
// We need to convert our texture position and size to normalized
|
||||||
|
// device coordinates (0 to 1.0) by dividing by the size of the texture.
|
||||||
ivec2 text_size = textureSize(text, 0);
|
ivec2 text_size = textureSize(text, 0);
|
||||||
vec2 glyph_tex_size = glyph_size / text_size.xy;
|
vec2 glyph_tex_pos = glyph_pos / text_size;
|
||||||
glyph_tex_coords = glyph_pos + glyph_tex_size * position;
|
vec2 glyph_tex_size = glyph_size / text_size;
|
||||||
|
glyph_tex_coords = glyph_tex_pos + glyph_tex_size * position;
|
||||||
|
|
||||||
// Set our foreground color output
|
// Set our foreground color output
|
||||||
color = fg_color_in / 255.;
|
color = fg_color_in / 255.;
|
||||||
|
@ -41,11 +41,10 @@ pub const Glyph = struct {
|
|||||||
/// top bearing
|
/// top bearing
|
||||||
offset_y: i32,
|
offset_y: i32,
|
||||||
|
|
||||||
/// normalized x, y (s, t) coordinates
|
/// coordinates in the atlas of the top-left corner. These have to
|
||||||
s0: f32,
|
/// be normalized to be between 0 and 1 prior to use.
|
||||||
t0: f32,
|
atlas_x: u32,
|
||||||
s1: f32,
|
atlas_y: u32,
|
||||||
t1: f32,
|
|
||||||
|
|
||||||
/// horizontal position to increase drawing position for strings
|
/// horizontal position to increase drawing position for strings
|
||||||
advance_x: f32,
|
advance_x: f32,
|
||||||
@ -170,10 +169,8 @@ pub fn addGlyph(self: *FontAtlas, alloc: Allocator, v: anytype) !*Glyph {
|
|||||||
.height = tgt_h,
|
.height = tgt_h,
|
||||||
.offset_x = glyph.*.bitmap_left,
|
.offset_x = glyph.*.bitmap_left,
|
||||||
.offset_y = glyph.*.bitmap_top,
|
.offset_y = glyph.*.bitmap_top,
|
||||||
.s0 = @intToFloat(f32, region.x) / @intToFloat(f32, self.atlas.size),
|
.atlas_x = region.x,
|
||||||
.t0 = @intToFloat(f32, region.y) / @intToFloat(f32, self.atlas.size),
|
.atlas_y = region.y,
|
||||||
.s1 = @intToFloat(f32, region.x + tgt_w) / @intToFloat(f32, self.atlas.size),
|
|
||||||
.t1 = @intToFloat(f32, region.y + tgt_h) / @intToFloat(f32, self.atlas.size),
|
|
||||||
.advance_x = f26dot6ToFloat(glyph.*.advance.x),
|
.advance_x = f26dot6ToFloat(glyph.*.advance.x),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
12
src/Grid.zig
12
src/Grid.zig
@ -41,8 +41,8 @@ const GPUCell = struct {
|
|||||||
grid_row: u16,
|
grid_row: u16,
|
||||||
|
|
||||||
/// vec2 glyph_pos
|
/// vec2 glyph_pos
|
||||||
glyph_x: f32,
|
glyph_x: u32,
|
||||||
glyph_y: f32,
|
glyph_y: u32,
|
||||||
|
|
||||||
/// vec2 glyph_size
|
/// vec2 glyph_size
|
||||||
glyph_width: u32,
|
glyph_width: u32,
|
||||||
@ -139,8 +139,8 @@ pub fn init(alloc: Allocator) !Grid {
|
|||||||
var offset: usize = 0;
|
var offset: usize = 0;
|
||||||
try vbobind.attributeAdvanced(0, 2, gl.c.GL_UNSIGNED_SHORT, false, @sizeOf(GPUCell), offset);
|
try vbobind.attributeAdvanced(0, 2, gl.c.GL_UNSIGNED_SHORT, false, @sizeOf(GPUCell), offset);
|
||||||
offset += 2 * @sizeOf(u16);
|
offset += 2 * @sizeOf(u16);
|
||||||
try vbobind.attributeAdvanced(1, 2, gl.c.GL_FLOAT, false, @sizeOf(GPUCell), offset);
|
try vbobind.attributeAdvanced(1, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(GPUCell), offset);
|
||||||
offset += 2 * @sizeOf(f32);
|
offset += 2 * @sizeOf(u32);
|
||||||
try vbobind.attributeAdvanced(2, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(GPUCell), offset);
|
try vbobind.attributeAdvanced(2, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(GPUCell), offset);
|
||||||
offset += 2 * @sizeOf(u32);
|
offset += 2 * @sizeOf(u32);
|
||||||
try vbobind.attributeAdvanced(3, 2, gl.c.GL_INT, false, @sizeOf(GPUCell), offset);
|
try vbobind.attributeAdvanced(3, 2, gl.c.GL_INT, false, @sizeOf(GPUCell), offset);
|
||||||
@ -251,8 +251,8 @@ pub fn updateCells(self: *Grid, term: Terminal) !void {
|
|||||||
self.cells.appendAssumeCapacity(.{
|
self.cells.appendAssumeCapacity(.{
|
||||||
.grid_col = @intCast(u16, x),
|
.grid_col = @intCast(u16, x),
|
||||||
.grid_row = @intCast(u16, y),
|
.grid_row = @intCast(u16, y),
|
||||||
.glyph_x = glyph.s0,
|
.glyph_x = glyph.atlas_x,
|
||||||
.glyph_y = glyph.t0,
|
.glyph_y = glyph.atlas_y,
|
||||||
.glyph_width = glyph.width,
|
.glyph_width = glyph.width,
|
||||||
.glyph_height = glyph.height,
|
.glyph_height = glyph.height,
|
||||||
.glyph_offset_x = glyph.offset_x,
|
.glyph_offset_x = glyph.offset_x,
|
||||||
|
Reference in New Issue
Block a user