summaryrefslogtreecommitdiff
path: root/src/zxc.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/zxc.zig')
-rw-r--r--src/zxc.zig70
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();
+}