Skip to content

Commit 7693599

Browse files
feat: add memory frame buffer
1 parent 75de50d commit 7693599

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/phantom/painting/fb.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub const Base = @import("fb/base.zig");
22
pub const AllocatedFrameBuffer = @import("fb/alloc.zig");
3+
pub const MemoryFrameBuffer = @import("fb/mem.zig");
34
pub const FileDescriptorFrameBuffer = @import("fb/fd.zig");

src/phantom/painting/fb/mem.zig

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
const std = @import("std");
2+
const Allocator = std.mem.Allocator;
3+
const vizops = @import("vizops");
4+
const Base = @import("base.zig");
5+
const MemoryFrameBuffer = @This();
6+
7+
base: Base,
8+
info: Base.Info,
9+
buffer: []u8,
10+
11+
pub fn create(alloc: Allocator, info: Base.Info, ptr: [*]u8) !*Base {
12+
const self = try alloc.create(MemoryFrameBuffer);
13+
errdefer alloc.destroy(self);
14+
15+
self.* = .{
16+
.info = info,
17+
.buffer = ptr[0..(info.res.value[0] * info.res.value[1] * @divExact(info.colorFormat.width(), 8))],
18+
.base = .{
19+
.allocator = alloc,
20+
.vtable = &.{
21+
.addr = impl_addr,
22+
.info = impl_info,
23+
.dupe = impl_dupe,
24+
.deinit = impl_deinit,
25+
.blt = null,
26+
},
27+
.ptr = self,
28+
},
29+
};
30+
return &self.base;
31+
}
32+
33+
fn impl_addr(ctx: *anyopaque) anyerror!*anyopaque {
34+
const self: *MemoryFrameBuffer = @ptrCast(@alignCast(ctx));
35+
return @ptrCast(@alignCast(self.buffer));
36+
}
37+
38+
fn impl_info(ctx: *anyopaque) Base.Info {
39+
const self: *MemoryFrameBuffer = @ptrCast(@alignCast(ctx));
40+
return self.info;
41+
}
42+
43+
fn impl_dupe(ctx: *anyopaque) anyerror!*Base {
44+
const self: *MemoryFrameBuffer = @ptrCast(@alignCast(ctx));
45+
const d = try self.base.allocator.create(MemoryFrameBuffer);
46+
errdefer self.base.allocator.destroy(d);
47+
48+
d.* = .{
49+
.info = self.info,
50+
.buffer = self.buffer,
51+
.base = .{
52+
.ptr = d,
53+
.allocator = self.base.allocator,
54+
.vtable = self.base.vtable,
55+
},
56+
};
57+
return &d.base;
58+
}
59+
60+
fn impl_deinit(ctx: *anyopaque) void {
61+
const self: *MemoryFrameBuffer = @ptrCast(@alignCast(ctx));
62+
self.base.allocator.destroy(self);
63+
}

0 commit comments

Comments
 (0)