From e398295a2beee67ca90fb536398c638b3df73459 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 26 Mar 2026 10:14:09 +0100 Subject: jpeg: add segments --- src/jpg/huffman-table.zig | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/jpg/huffman-table.zig (limited to 'src/jpg/huffman-table.zig') diff --git a/src/jpg/huffman-table.zig b/src/jpg/huffman-table.zig new file mode 100644 index 0000000..8d653ab --- /dev/null +++ b/src/jpg/huffman-table.zig @@ -0,0 +1,48 @@ +const std = @import("std"); + +const Self = @This(); + +class: u4, +destination_identifier: u4, +codes_count: [16]u8, +values: [16][]u8, + +pub fn read(gpa: std.mem.Allocator, reader: *std.Io.Reader) !Self { + const kind = try reader.takeByte(); + var self: Self = undefined; + + self.class = @truncate(kind >> 4); + self.destination_identifier = @truncate(kind); + + for (self.codes_count[0..]) |*count| { + count.* = try reader.takeByte(); + } + + for (self.values[0..], self.codes_count) |*values, count| { + values.* = try gpa.alloc(u8, count); + + for (values.*) |*value| { + value.* = try reader.takeByte(); + } + } + + return self; +} + +pub fn deinit(self: *Self, gpa: std.mem.Allocator) void { + for (self.values) |value| { + gpa.free(value); + } + + self.* = undefined; +} + +pub fn size_in_file(self: Self) usize { + var size: usize = 17; + + for (self.codes_count) |count| { + size += count; + } + + return size; +} -- cgit v1.2.3-70-g09d2