From: sgunderson@bigfoot.com <> Date: Sat, 30 May 2009 23:11:09 +0000 (+0200) Subject: Add un-zigzag table. X-Git-Url: https://git.sesse.net/?p=fjl;a=commitdiff_plain;h=8013439fb5294f64bd76af91c4303070db2448a7 Add un-zigzag table. --- diff --git a/driver.c b/driver.c index 08b684a..dd1b1ae 100644 --- a/driver.c +++ b/driver.c @@ -5,6 +5,7 @@ #include "choice.h" #include "dehuff.h" #include "input.h" +#include "zigzag.h" struct jpeg_image { unsigned precision; @@ -121,7 +122,7 @@ void read_scan(struct byte_source* source, struct jpeg_image* image, huffman_tab possibly_refill(&bits, s); i += r; - zz[i] = extend(read_bits(&bits, s), s); + zz[unzigzag[i]] = extend(read_bits(&bits, s), s); } for (unsigned i = 0; i < 63; ++i) { diff --git a/zigzag.h b/zigzag.h new file mode 100644 index 0000000..3fc1377 --- /dev/null +++ b/zigzag.h @@ -0,0 +1,26 @@ +#ifndef _ZIGZAG_H +#define _ZIGZAG_H + +#include "idct.h" + +// Table for transforming from zig-zag order to natural order. +// We use the same trick as libjpeg here; there are 16 extra entries +// after the end of the table, since the run-length decoder could +// potentially cause entries indices >= 64 to be decoded. +static const unsigned unzigzag[DCTSIZE2 + 16] = { + // Regular entries. + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + + // Extra padding entries; should never be referenced in well-formed data. + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, +}; + +#endif /* !defined(_ZIGZAG_H) */