diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-12-17 20:56:01 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2025-02-07 21:54:55 +0100 |
commit | 9225c3bf291061a25dadbdfc5ec6eab72e86bb5e (patch) | |
tree | fdf7ef2d917258485ab2d4b4bb70a4f845d95525 /ppm/ppm.zig | |
parent | 177aad9d77cb94cc19a52860c2f3c9add018868e (diff) | |
download | zig-playground-9225c3bf291061a25dadbdfc5ec6eab72e86bb5e.tar.gz zig-playground-9225c3bf291061a25dadbdfc5ec6eab72e86bb5e.zip |
ppm: simple example to generate a ppm image
Diffstat (limited to 'ppm/ppm.zig')
-rw-r--r-- | ppm/ppm.zig | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/ppm/ppm.zig b/ppm/ppm.zig new file mode 100644 index 0000000..0606a8b --- /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[y][x] = 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); + } + } + } + }; +} |