summaryrefslogtreecommitdiff
path: root/src/jpg/huffman-table.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/jpg/huffman-table.zig')
-rw-r--r--src/jpg/huffman-table.zig48
1 files changed, 48 insertions, 0 deletions
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;
+}