pixels: []u8, extent: core.Vector2i, const std = @import("std"); const core = @import("core"); const colors = core.colors; pub fn init(allocator: std.mem.Allocator, extent: core.Vector2i) !@This() { return .{ .pixels = try allocator.alignedAlloc(u8, 8, @intCast(extent.x * extent.y * 4)), .extent = extent, }; } pub fn clear(self: *@This(), clearColor: colors.ColorRGBA8) void { var as32: []u32 = undefined; as32.len = self.pixels.len / 4; as32.ptr = @alignCast(@ptrCast(self.pixels.ptr)); @memset(as32, @as(u32, @bitCast(clearColor))); } pub fn deinit(self: *@This(), allocator: std.mem.Allocator) void { allocator.free(self.pixels); } pub inline fn getPixel(self: *@This(), position: core.Vector2i) *colors.ColorRGBA8 { const offset = position.x * position.y * 4; const r: *u8 = &self.pixels[@intCast(offset)]; return @as(*colors.ColorRGBA8, @alignCast(@ptrCast(r))); }