From b3996a9109a32eb83f877ba7cd1b1271c5cbe975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?= Date: Sat, 14 Sep 2024 23:58:53 +0300 Subject: improve pango and cairo bindings --- src/main.zig | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) (limited to 'src/main.zig') diff --git a/src/main.zig b/src/main.zig index 436e14d..ebf2ac6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -27,7 +27,9 @@ const WindowBuffer = struct { /// Backing data slice from memory mapping for this buffer map: []u8, /// Cairo surface for painting with cairo - c_surface: cairo.Surface, + cr_surface: *cairo.Surface, + /// Cairo context + cr_ctx: *cairo.Context, /// Are we being read by the compositor right now? busy: bool = false, }; @@ -48,7 +50,7 @@ pub const Window = struct { /// Memory mapped for both buffers buffers_map: []align(mem.page_size) u8 = undefined, /// Pango font description for rendering our text - font: pango.FontDescription, + font_dsc: *pango.FontDescription, /// This window's title title: [*:0]const u8, /// Width in pixels @@ -74,15 +76,15 @@ pub const Window = struct { .allocator = allocator, .wl_surface = try compositor.createSurface(), .title = title, - // .font = try pango.FontDescription.fromString("monospace 24"), - .font = try pango.FontDescription.create(), + // .font_dsc = try pango.FontDescription.fromString("monospace 24"), + .font_dsc = try pango.FontDescription.create(), }; win.xdg_surface = try wm_base.getXdgSurface(win.wl_surface); win.xdg_toplevel = try win.xdg_surface.getToplevel(); - win.font.setFamily("monospace"); - win.font.setWeight(600); - win.font.setSizePt(18); + win.font_dsc.setFamily("monospace"); + win.font_dsc.setWeight(600); + win.font_dsc.setSizePt(18); try win.allocBuffers(); @@ -102,7 +104,7 @@ pub const Window = struct { /// Destroy this window and all its associated resources pub fn destroy(win: *Window) void { win.destroyBuffers(); - win.font.destroy(); + win.font_dsc.destroy(); win.xdg_toplevel.destroy(); win.xdg_surface.destroy(); win.wl_surface.destroy(); @@ -111,8 +113,8 @@ pub const Window = struct { /// Allocate new buffers for this window fn allocBuffers(win: *Window) !void { - const c_format = cairo.Format.argb32; - const stride = cairo.Surface.formatStrideForWidth(c_format, win.width); + const cr_format = cairo.Format.argb32; + const stride = cr_format.strideForWidth(win.width); const buffer_size = stride * win.height; const total_size = buffer_size * 2; // we need two buffers @@ -142,23 +144,25 @@ pub const Window = struct { const bsize: usize = @intCast(buffer_size); buffer.busy = false; buffer.map = win.buffers_map[bsize *% i .. bsize *% (i + 1)]; - buffer.c_surface = try cairo.Surface.createImageForData( + buffer.cr_surface = try cairo.Surface.createImageForData( buffer.map, - c_format, + cr_format, win.width, win.height, stride, ); + buffer.cr_ctx = try cairo.Context.create(buffer.cr_surface); buffer.wl_buffer.setListener(*WindowBuffer, bufferListener, buffer); } } /// Destroy this window's buffers fn destroyBuffers(win: *Window) void { - win.buffers[0].c_surface.destroy(); - win.buffers[1].c_surface.destroy(); - win.buffers[0].wl_buffer.destroy(); - win.buffers[1].wl_buffer.destroy(); + inline for (&win.buffers) |*buffer| { + buffer.cr_ctx.destroy(); + buffer.cr_surface.destroy(); + buffer.wl_buffer.destroy(); + } posix.munmap(win.buffers_map); } @@ -190,14 +194,14 @@ pub const Window = struct { } } - const layout = try pango.Layout.createForCairo(&buffer.c_surface); + const layout = try pango.Layout.createForCairo(buffer.cr_ctx); defer layout.unref(); - buffer.c_surface.setSourceRgba(1, 1, 1, 1); + buffer.cr_ctx.setSourceRgba(1, 1, 1, 1); - layout.setFont(win.font); + layout.setFontDescription(win.font_dsc); layout.setText("Hello, wayland!", -1); - buffer.c_surface.moveTo(5, 5); - layout.show(&buffer.c_surface); + buffer.cr_ctx.moveTo(5, 5); + buffer.cr_ctx.showPangoLayout(layout); var fps_buf: [32]u8 = undefined; const fps_output = std.fmt.bufPrintZ( @@ -206,8 +210,8 @@ pub const Window = struct { .{win.current_fps}, ) catch unreachable; layout.setText(fps_output, -1); - buffer.c_surface.moveTo(5, 40); - layout.show(&buffer.c_surface); + buffer.cr_ctx.moveTo(5, 40); + buffer.cr_ctx.showPangoLayout(layout); buffer.busy = true; return buffer.wl_buffer; -- cgit v1.2.3