Various cleanup

I replaced the rgb function with a packed struct, formatted the code,
and updated a couple of allocator things to fit Zig v0.9.0.
This commit is contained in:
2022-01-09 11:26:21 -07:00
parent f7754c81fb
commit 293b8729c0
3 changed files with 122 additions and 86 deletions

View File

@ -23,7 +23,7 @@ pub fn link(b: *std.build.Builder, step: *std.build.LibExeObjStep) void {
step.linkLibrary(lib);
}
fn fromHere(allocator: *std.mem.Allocator, path: []const u8) []const u8 {
fn fromHere(allocator: std.mem.Allocator, path: []const u8) []const u8 {
const here = std.fs.path.dirname(@src().file) orelse ".";
return std.fs.path.join(allocator, &.{here, path}) catch unreachable;
}

View File

@ -1,13 +1,16 @@
const std = @import("std");
const minifb_c = @cImport({
const c = @cImport({
@cInclude("MiniFB.h");
@cInclude("MiniFB_enums.h");
});
const testing = std.testing;
pub fn rgb(r: u8, g: u8, b: u8) u32 {
return @intCast(u32, r) << 16 | @intCast(u32, g) << 8 | b;
}
pub const Rgb = packed struct {
r: u8,
g: u8,
b: u8,
_reserved: u8 = 0,
};
pub const KeyMod = packed struct {
shift: bool = false,
@ -16,20 +19,20 @@ pub const KeyMod = packed struct {
super: bool = false,
capsLock: bool = false,
numLock: bool = false,
reserved: u26 = 0,
_reserved: u26 = 0,
};
pub fn Window(comptime TUserData: type) type {
return struct {
cwin: *minifb_c.mfb_window,
return packed struct {
cwin: *c.mfb_window,
pub const UpdateError = error {
pub const UpdateError = error{
InvalidWindow,
InvalidBuffer,
InternalError,
};
pub const State = enum {ok, exit};
pub const State = enum { ok, exit };
pub const OpenFlags = packed struct {
resizable: bool = false,
@ -43,104 +46,112 @@ pub fn Window(comptime TUserData: type) type {
pub fn open(title: [*:0]const u8, width: u32, height: u32, flags: OpenFlags) !Window(TUserData) {
const intFlags = @bitCast(u32, flags);
const cTitle = @as([*c]const u8, title);
const cwin: ?*minifb_c.mfb_window = minifb_c.mfb_open_ex(cTitle, width, height, intFlags);
const cwin: ?*c.mfb_window = c.mfb_open_ex(cTitle, width, height, intFlags);
if (cwin) |value| {
return Window(TUserData) {.cwin=value};
return Window(TUserData){ .cwin = value };
} else {
return error.ItBroke;
}
}
pub fn waitSync(self: Window(TUserData)) bool {
return minifb_c.mfb_wait_sync(self.cwin);
return c.mfb_wait_sync(self.cwin);
}
pub fn update(self: Window(TUserData), buffer: []u32) UpdateError!State {
const rawState = minifb_c.mfb_update(self.cwin, buffer.ptr);
pub fn update(self: Window(TUserData), buffer: []Rgb) UpdateError!State {
const rawState = c.mfb_update(self.cwin, @ptrCast(*anyopaque, buffer.ptr));
switch (rawState) {
.STATE_OK => return State.ok,
.STATE_EXIT => return State.exit,
.STATE_INVALID_WINDOW => return UpdateError.InvalidWindow,
.STATE_INVALID_BUFFER => return UpdateError.InvalidBuffer,
c.STATE_OK => return State.ok,
c.STATE_EXIT => return State.exit,
c.STATE_INVALID_WINDOW => return UpdateError.InvalidWindow,
c.STATE_INVALID_BUFFER => return UpdateError.InvalidBuffer,
else => return UpdateError.InternalError,
}
}
pub fn setUserData(self: Window(TUserData), data: *TUserData) void {
minifb_c.mfb_set_user_data(self.cwin, data);
c.mfb_set_user_data(self.cwin, data);
}
pub fn getUserData(self: Window(TUserData)) ?*TUserData {
return @ptrCast(?*TUserData, @alignCast(@alignOf(?*TUserData), minifb_c.mfb_get_user_data(self.cwin)));
}
test "user data is null if never set" {
const win = try Window(u8).open("", 100, 100);
const data = win.getUserData();
testing.expectEqual(null, data);
var cData = c.mfb_get_user_data(self.cwin);
std.log.info("@alignOf cwin={d}, addr={x}", .{ @alignOf(@TypeOf(self.cwin)), @ptrToInt(self.cwin) });
std.log.info("@alignOf cdata={d}, addr={x}", .{ @alignOf(@TypeOf(cData)), @ptrToInt(cData) });
return @ptrCast(?*TUserData, @alignCast(@alignOf(?*TUserData), cData));
}
test "user data is not null if previously set" {
const win = try Window(u8).open("", 100, 100);
var data: u8 = 42;
win.setUserData(&data);
testing.expectEqual(42, win.getUserData().?.*);
pub const ActiveFunc = fn (win: Window(TUserData), isActive: bool) void;
pub fn setActiveCallback(self: Window(TUserData), callback: ActiveFunc) void {
c.mfb_set_active_callback(self.cwin, @ptrCast(c.mfb_active_func, callback));
}
};
}
test "user data is null if never set" {
const win = try Window(u64).open("abc", 100, 100, .{});
const data = win.getUserData();
try testing.expectEqual(@as(?*u64, null), data);
}
// test "user data is not null if previously set" {
// const win = try Window(u64).open("abc", 100, 100, .{});
// var data: u64 = 42;
// win.setUserData(&data);
// const expected: u64 = 42;
// try testing.expectEqual(expected, win.getUserData().?.*);
// }
pub fn getTargetFPS() u32 {
return minifb_c.mfb_get_target_fps();
return c.mfb_get_target_fps();
}
pub fn setTargetFPS(fps: u32) void {
minifb_c.mfb_set_target_fps(fps);
c.mfb_set_target_fps(fps);
}
// TODO Figure out how to run this once I have Internet access.
test "set and get target FPS" {
const max = 40;
var fps: u32 = 30;
while (fps < max) {
setTargetFPS(fps);
try std.testing.expectEqual(fps, getTargetFPS());
}
}
// test "set and get target FPS" {
// const max = 40;
// var fps: u32 = 30;
// while (fps < max) {
// setTargetFPS(fps);
// try std.testing.expectEqual(fps, getTargetFPS());
// }
// }
pub const Timer = struct {
ctimer: *minifb_c.mfb_timer,
pub const Timer = extern struct {
ctimer: *c.mfb_timer,
pub fn init() !Timer {
const ctimer: ?*minifb_c.mfb_timer = minifb_c.mfb_timer_create();
const ctimer: ?*c.mfb_timer = c.mfb_timer_create();
if (ctimer) |value| {
return Timer {.ctimer=value};
return Timer{ .ctimer = value };
} else {
return error.ItBroke;
}
}
pub fn deinit(self: Timer) void {
minifb_c.mfb_timer_destroy(self.ctimer);
c.mfb_timer_destroy(self.ctimer);
}
pub fn reset(self: Timer) void {
minifb_c.mfb_timer_reset(self.ctimer);
c.mfb_timer_reset(self.ctimer);
}
pub fn now(self: Timer) f64 {
return minifb_c.mfb_timer_now(self.ctimer);
return c.mfb_timer_now(self.ctimer);
}
pub fn delta(self: Timer) f64 {
return minifb_c.mfb_timer_delta(self.ctimer);
return c.mfb_timer_delta(self.ctimer);
}
pub fn getFrequency() f64 {
return minifb_c.mfb_timer_get_frequency();
return c.mfb_timer_get_frequency();
}
pub fn getResolution() f64 {
return minifb_c.mfb_timer_get_resolution();
return c.mfb_timer_get_resolution();
}
};
};