summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zig-ppm/Makefile2
-rw-r--r--zig-ppm/main.zig45
2 files changed, 47 insertions, 0 deletions
diff --git a/zig-ppm/Makefile b/zig-ppm/Makefile
new file mode 100644
index 0000000..b962fd1
--- /dev/null
+++ b/zig-ppm/Makefile
@@ -0,0 +1,2 @@
+default:
+ zig run main.zig
diff --git a/zig-ppm/main.zig b/zig-ppm/main.zig
new file mode 100644
index 0000000..4dc2439
--- /dev/null
+++ b/zig-ppm/main.zig
@@ -0,0 +1,45 @@
+// PPM image format - https://netpbm.sourceforge.net/doc/ppm.html
+
+const std = @import("std");
+const debug = @import("std").debug;
+
+const ImageSize = 600;
+
+const Color = struct {
+ r: u8,
+ g: u8,
+ b: u8,
+
+ pub fn initRandom() Color {
+ const rand = std.crypto.random;
+ return Color{
+ .r = rand.int(u8),
+ .g = rand.int(u8),
+ .b = rand.int(u8),
+ };
+ }
+
+ pub fn toString(self: Color) []const u8 {
+ return std.fmt.allocPrint(std.heap.page_allocator, "{d} {d} {d} ", .{ self.r, self.g, self.b }) catch unreachable;
+ }
+};
+
+pub fn main() !void {
+ const imageFile = try std.fs.cwd().createFile("image.ppm", .{});
+ defer imageFile.close();
+
+ // NOTE: This should be done at compile time instead since the data is
+ // known in advance. I am leaving this here as a reference.
+ // const header: []const u8 = std.fmt.allocPrint(std.heap.page_allocator, "P3\n{d} {d}\n255\n", .{ ImageSize, ImageSize }) catch unreachable;
+
+ // NOTE: This is done at compile time instead. It does look a bit ugly
+ // and there must be a better way of doing this. Good enough!
+ const header = "P3\n" ++ std.fmt.comptimePrint("{d}", .{ImageSize}) ++ " " ++ std.fmt.comptimePrint("{d}", .{ImageSize}) ++ "\n255\n";
+
+ _ = try imageFile.write(header);
+
+ for (0..(ImageSize * ImageSize)) |_| {
+ const color = Color.initRandom();
+ _ = try imageFile.write(color.toString());
+ }
+}