summaryrefslogtreecommitdiff
path: root/src/jpg/quantization-table.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/jpg/quantization-table.zig')
-rw-r--r--src/jpg/quantization-table.zig48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/jpg/quantization-table.zig b/src/jpg/quantization-table.zig
new file mode 100644
index 0000000..c4c22d5
--- /dev/null
+++ b/src/jpg/quantization-table.zig
@@ -0,0 +1,48 @@
+const std = @import("std");
+
+const Self = @This();
+
+pub const Precision = enum(u1) {
+ b8 = 0,
+ b16 = 1,
+};
+
+const Header = packed struct(u8) {
+ identifier: u4,
+ precision: u4,
+};
+
+precision: Precision,
+identifier: u2,
+elements: union(Precision) {
+ b8: [64]u8,
+ b16: [64]u16,
+},
+
+pub fn read(reader: *std.Io.Reader) !Self {
+ const header: Header = @bitCast(try reader.takeByte());
+ var self: Self = undefined;
+ self.identifier = @truncate(header.identifier);
+ self.precision = @enumFromInt(@as(u1, @truncate(header.precision)));
+
+ switch (self.precision) {
+ .b8 => {
+ self.elements = .{ .b8 = undefined };
+ for (&self.elements.b8) |*element| {
+ element.* = try reader.takeByte();
+ }
+ },
+ .b16 => {
+ self.elements = .{ .b16 = undefined };
+ for (&self.elements.b16) |*element| {
+ element.* = try reader.takeInt(u16, .big);
+ }
+ },
+ }
+
+ return self;
+}
+
+pub fn size_in_file(self: Self) usize {
+ return 65 + 64 * @as(usize, @intFromEnum(self.precision));
+}