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/quantization-table.zig | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/jpg/quantization-table.zig (limited to 'src/jpg/quantization-table.zig') 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)); +} -- cgit v1.2.3-70-g09d2