diff options
Diffstat (limited to 'src/zxc.zig')
-rw-r--r-- | src/zxc.zig | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/zxc.zig b/src/zxc.zig new file mode 100644 index 0000000..f394f7d --- /dev/null +++ b/src/zxc.zig @@ -0,0 +1,70 @@ +const std = @import("std"); +const sdl = @import("sdl2"); +const Self = @This(); + +const Config = struct { + const RenderMode = enum { + Pixel, + PixelPerfect, + HdRender, + }; + + width: usize, + height: usize, + scale: usize = 1, + target_fps: usize, + render: RenderMode = .Pixel, + title: [:0]const u8 = "ZXC", +}; + +config: Config, +window: sdl.Window, +renderer: sdl.Renderer, + +pub fn init(config: Config) !Self { + var self = Self{ + .config = config, + .window = undefined, + .renderer = undefined, + }; + + try sdl.init(.{ .video = true }); + errdefer sdl.quit(); + + const basepath = sdl.c.SDL_GetBasePath(); + if (basepath == null) + return sdl.makeError(); + defer sdl.c.SDL_free(basepath); + + try std.os.chdir(std.mem.span(basepath)); + + self.window = try sdl.createWindow( + config.title, + sdl.WindowPosition.default, + sdl.WindowPosition.default, + config.width, + config.height, + .{ .resizable = true }, + ); + errdefer self.window.destroy(); + + self.renderer = try sdl.createRenderer( + self.window, + null, + sdl.RendererFlags{ .accelerated = true }, + ); + errdefer self.renderer.destroy(); + + _ = sdl.setHint( + sdl.hint.render_scale_quality, + if (config.render == .HdRender) "1" else "0", + ); + + return self; +} + +pub fn deinit(self: Self) void { + self.renderer.destroy(); + self.window.destroy(); + sdl.quit(); +} |