diff options
Diffstat (limited to 'src/jpg/quantization-table.zig')
| -rw-r--r-- | src/jpg/quantization-table.zig | 48 |
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)); +} |