diff --git a/src/output.zig b/src/output.zig index 95d4603..3bd687b 100644 --- a/src/output.zig +++ b/src/output.zig @@ -16,17 +16,17 @@ const HuffCode = struct { const Scan = struct { arena: std.heap.ArenaAllocator, - diffs: [3]i16, + dc_diffs: [3]i16, rles: [3]RLE_Seq, freqs: [4][]u32, huffs: [4]Huffman, const Self = @This(); - fn init(alloc_: std.mem.Allocator) !Self { - var arena = std.heap.ArenaAllocator.init(alloc_); + fn init(alloc_root: std.mem.Allocator) !Self { + var arena = std.heap.ArenaAllocator.init(alloc_root); var alloc = arena.allocator(); - return Self{ .arena = arena, .diffs = [3]i16{ 0, 0, 0 }, .rles = [3]RLE_Seq{ + return Self{ .arena = arena, .dc_diffs = [3]i16{ 0, 0, 0 }, .rles = [3]RLE_Seq{ RLE_Seq.init(alloc), RLE_Seq.init(alloc), RLE_Seq.init(alloc), @@ -40,14 +40,36 @@ const Scan = struct { fn deinit(self: *Self) void { self.arena.deinit(); } + + fn do_rle_freq_pass(self: *Self, buff: *const util.Buffers) !void { + const h = buff.Y_quant.len; + const w = buff.Y_quant[0].len; + + for (0..h) |x| { + for (0..w) |y| { + for (0..4) |Y_sub_i| { + try parse_block(&buff.Y_quant[x][y][Y_sub_i], &self.dc_diffs[0], &self.rles[0], self.freqs[0], self.freqs[1]); + } + try parse_block(&buff.U_quant[x][y], &self.dc_diffs[1], &self.rles[1], self.freqs[2], self.freqs[3]); + try parse_block(&buff.V_quant[x][y], &self.dc_diffs[2], &self.rles[2], self.freqs[2], self.freqs[3]); + } + } + } }; +fn parse_block(block: *util.BlockQuantized, dc_diff: *i16, dc_rle: *RLE_Seq, dc_freqs: []u32, ac_freqs: []u32) !void { + _ = ac_freqs; + _ = dc_freqs; + _ = dc_rle; + _ = dc_diff; + _ = block; +} + pub fn generate_jpg(buff: util.Buffers, alloc: std.mem.Allocator) !void { - _ = buff; var scan_data = try Scan.init(alloc); defer scan_data.deinit(); - scan_data.do_rle_freq_pass(buff); + try scan_data.do_rle_freq_pass(&buff); // rle, huffman pass // file headers