summaryrefslogtreecommitdiff
path: root/ppm/ppm.zig
diff options
context:
space:
mode:
Diffstat (limited to 'ppm/ppm.zig')
-rw-r--r--ppm/ppm.zig51
1 files changed, 51 insertions, 0 deletions
diff --git a/ppm/ppm.zig b/ppm/ppm.zig
new file mode 100644
index 0000000..8b89456
--- /dev/null
+++ b/ppm/ppm.zig
@@ -0,0 +1,51 @@
+const std = @import("std");
+const assert = std.debug.assert;
+
+pub const Pixel = extern struct {
+ r: u8,
+ g: u8,
+ b: u8,
+};
+
+pub fn ppm(comptime xdim: u32, comptime ydim: u32) type {
+ return struct {
+ const Self = @This();
+
+ /// Pixel data of the ppm image.
+ px: [ydim][xdim]Pixel,
+
+ /// Initial value of the `ppm` type.
+ pub const init: Self = .{
+ .px = undefined,
+ };
+
+ /// Set pixel data at `(x, y)`.
+ pub fn set(self: *Self, x: u32, y: u32, px: Pixel) void {
+ assert(x < xdim and y < ydim);
+ self.px[x][y] = px;
+ }
+
+ /// Get slice of pixels for row `y`.
+ pub fn row(self: *Self, y: u32) []Pixel {
+ assert(y < ydim);
+ return self.px[y][0..];
+ }
+
+ /// Write out image file with `name`.
+ pub fn dump(self: *const Self, name: []const u8) !void {
+ const f = try std.fs.cwd().createFile(name, .{ .truncate = true });
+ defer f.close();
+
+ const w = f.writer();
+ // Write ppm header (in ascii):
+ // MAGIC XDIM YDIM MAX_COLOR_VALUE
+ try w.print("P6 {} {} 255\n", .{ xdim, ydim });
+
+ for (self.px) |curr_row| {
+ for (curr_row) |px| {
+ try w.writeStruct(px);
+ }
+ }
+ }
+ };
+}