41#define HUFF_LEN (1 << HUFF_BIT)
42#define HUFF_MASK (HUFF_LEN - 1)
51 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
52 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
53 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
54 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
83#define BYTECLIP(v) Clip8[(unsigned int)(v) & 0x3FF]
85static const uint8_t Clip8[1024] = {
87 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
88 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
89 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
90 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
91 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
92 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
93 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
94 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
96 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
97 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
98 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
99 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
100 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
101 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
102 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
103 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
120 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
121 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
128 if (val < 0)
return 0;
129 else if (val > 255)
return 255;
149 ndata = (ndata + 3) & ~3;
151 if (jd->sz_pool >= ndata) {
152 jd->sz_pool -= ndata;
153 rp = (
char*)jd->pool;
154 jd->pool = (
void*)(rp + ndata);
187 for (i = 0; i < 64; i++) {
209 unsigned int i, j, b, cls, num;
220 cls = d >> 4; num = d & 0x0F;
223 jd->huffbits[num][cls] = pb;
224 for (np = i = 0; i < 16; i++) {
225 np += (pb[i] = *data++);
229 jd->huffcode[num][cls] = ph;
231 for (j = i = 0; i < 16; i++) {
233 while (b--) ph[j++] = hc++;
241 jd->huffdata[num][cls] = pd;
242 for (i = 0; i < np; i++) {
244 if (!cls && d > 11)
return JDR_FMT1;
247#if JD_FASTDECODE == 2
249 unsigned int span, td, ti;
256 jd->hufflut_ac[num] = tbl_ac;
261 jd->hufflut_dc[num] = tbl_dc;
264 for (i = b = 0; b < HUFF_BIT; b++) {
265 for (j = pb[b]; j; j--) {
266 ti = ph[i] << (HUFF_BIT - 1 - b) & HUFF_MASK;
268 td = pd[i++] | ((b + 1) << 8);
271 td = pd[i++] | ((b + 1) << 4);
276 jd->longofs[num][cls] = i;
297 size_t dc = jd->dctr;
299 unsigned int d, flg = 0;
301#if JD_FASTDECODE == 0
303 const uint8_t *hb = jd->huffbits[id][cls];
304 const uint16_t *hc = jd->huffcode[id][cls];
305 const uint8_t *hd = jd->huffdata[id][cls];
315 if (!dc)
return 0 - (int)
JDR_INP;
322 if (*dp != 0)
return 0 - (int)
JDR_FMT1;
335 for (nd = *hb++; nd; nd--) {
337 jd->dbit = bm; jd->dctr = dc; jd->dptr = dp;
348 unsigned int nc, bl, wbit = jd->dbit % 32;
349 uint32_t w = jd->wreg & ((1UL << wbit) - 1);
359 if (!dc)
return 0 - (int)
JDR_INP;
364 if (d != 0) jd->marker = d;
375 jd->dctr = dc; jd->dptr = dp;
378#if JD_FASTDECODE == 2
380 d = (
unsigned int)(w >> (wbit - HUFF_BIT));
382 d = jd->hufflut_ac[id][d];
384 jd->dbit = wbit - (d >> 8);
388 d = jd->hufflut_dc[id][d];
390 jd->dbit = wbit - (d >> 4);
396 hb = jd->huffbits[id][cls] + HUFF_BIT;
397 hc = jd->huffcode[id][cls] + jd->longofs[id][cls];
398 hd = jd->huffdata[id][cls] + jd->longofs[id][cls];
402 hb = jd->huffbits[id][cls];
403 hc = jd->huffcode[id][cls];
404 hd = jd->huffdata[id][cls];
407 for ( ; bl <= 16; bl++) {
410 d = w >> (wbit - bl);
413 jd->dbit = wbit - bl;
437 size_t dc = jd->dctr;
439 unsigned int d, flg = 0;
441#if JD_FASTDECODE == 0
450 if (!dc)
return 0 - (int)
JDR_INP;
457 if (*dp != 0)
return 0 - (int)
JDR_FMT1;
467 if (*dp & mbit) d |= 1;
472 jd->dbit = mbit; jd->dctr = dc; jd->dptr = dp;
476 unsigned int wbit = jd->dbit % 32;
477 uint32_t w = jd->wreg & ((1UL << wbit) - 1);
480 while (wbit < nbit) {
487 if (!dc)
return 0 - (int)
JDR_INP;
492 if (d != 0) jd->marker = d;
503 jd->wreg = w; jd->dbit = wbit - nbit;
504 jd->dctr = dc; jd->dptr = dp;
506 return (
int)(w >> ((wbit - nbit) % 32));
524 size_t dc = jd->dctr;
526#if JD_FASTDECODE == 0
530 for (i = 0; i < 2; i++) {
541 jd->dptr = dp; jd->dctr = dc; jd->dbit = 0;
544 if ((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) {
553 marker = 0xFF00 | jd->marker;
557 for (i = 0; i < 2; i++) {
563 marker = (marker << 8) | *dp++;
566 jd->dptr = dp; jd->dctr = dc;
570 if ((marker & 0xFFD8) != 0xFFD0 || (marker & 7) != (rstn & 7)) {
577 jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0;
594 int32_t v0, v1, v2, v3, v4, v5, v6, v7;
599 for (i = 0; i < 8; i++) {
607 t11 = (v1 - v3) * M13 >> 12;
624 v5 = (t11 - v7) * M13 >> 12;
626 t13 = (t10 + t12) * M5 >> 12;
627 v4 = t13 - (t10 * M2 >> 12);
628 v6 = t13 - (t12 * M4 >> 12) - v7;
632 src[8 * 0] = v0 + v7;
633 src[8 * 7] = v0 - v7;
634 src[8 * 1] = v1 + v6;
635 src[8 * 6] = v1 - v6;
636 src[8 * 2] = v2 + v5;
637 src[8 * 5] = v2 - v5;
638 src[8 * 3] = v3 + v4;
639 src[8 * 4] = v3 - v4;
646 for (i = 0; i < 8; i++) {
647 v0 = src[0] + (128L << 8);
654 t11 = (v1 - v3) * M13 >> 12;
671 v5 = (t11 - v7) * M13 >> 12;
673 t13 = (t10 + t12) * M5 >> 12;
674 v4 = t13 - (t10 * M2 >> 12);
675 v6 = t13 - (t12 * M4 >> 12) - v7;
680#if JD_FASTDECODE >= 1
681 dst[0] = (
int16_t)((v0 + v7) >> 8);
682 dst[7] = (
int16_t)((v0 - v7) >> 8);
683 dst[1] = (
int16_t)((v1 + v6) >> 8);
684 dst[6] = (
int16_t)((v1 - v6) >> 8);
685 dst[2] = (
int16_t)((v2 + v5) >> 8);
686 dst[5] = (
int16_t)((v2 - v5) >> 8);
687 dst[3] = (
int16_t)((v3 + v4) >> 8);
688 dst[4] = (
int16_t)((v3 - v4) >> 8);
717 unsigned int blk, nby, i, bc,
z, id, cmp;
722 nby = jd->msx * jd->msy;
725 for (blk = 0; blk < nby + 2; blk++) {
726 cmp = (blk < nby) ? 0 : blk - nby + 1;
728 if (cmp && jd->ncomp != 3) {
729 for (i = 0; i < 64; bp[i++] = 128) ;
736 if (d < 0)
return (
JRESULT)(0 - d);
737 bc = (
unsigned int)d;
741 if (e < 0)
return (
JRESULT)(0 - e);
743 if (!(e & bc)) e -= (bc << 1) - 1;
747 dqf = jd->qttbl[jd->qtid[cmp]];
748 tmp[0] = d * dqf[0] >> 8;
756 if (d < 0)
return (
JRESULT)(0 - d);
757 bc = (
unsigned int)d;
762 if (d < 0)
return (
JRESULT)(0 - d);
764 if (!(d & bc)) d -= (bc << 1) - 1;
766 tmp[i] = d * dqf[i] >> 8;
774 for (i = 0; i < 64; bp[i++] = d) ;
804 const int CVACC = (
sizeof (int) > 2) ? 1024 : 128;
805 unsigned int ix, iy, mx, my, rx, ry;
812 mx = jd->
msx * 8; my = jd->
msy * 8;
817 if (!rx || !ry)
return JDR_OK;
828 for (iy = 0; iy < my; iy++) {
831 pc += 64 * 4 + (iy >> 1) * 8;
832 if (iy >= 8) py += 64;
834 pc += mx * 8 + iy * 8;
837 for (ix = 0; ix < mx; ix++) {
841 if (ix == 8) py += 64 - 8;
847 *pix++ =
BYTECLIP(yy + ((
int)(1.402 * CVACC) * cr) / CVACC);
848 *pix++ =
BYTECLIP(yy - ((
int)(0.344 * CVACC) * cb + (
int)(0.714 * CVACC) * cr) / CVACC);
849 *pix++ =
BYTECLIP(yy + ((
int)(1.772 * CVACC) * cb) / CVACC);
853 for (iy = 0; iy < my; iy++) {
856 if (iy >= 8) py += 64;
858 for (ix = 0; ix < mx; ix++) {
860 if (ix == 8) py += 64 - 8;
873 unsigned int x,
y, r, g, b, s, w, a;
881 for (iy = 0; iy < my; iy += w) {
882 for (ix = 0; ix < mx; ix += w) {
885 for (
y = 0;
y < w;
y++) {
886 for (
x = 0;
x < w;
x++) {
908 pc = jd->
mcubuf + mx * my;
911 for (iy = 0; iy < my; iy += 8) {
913 if (iy == 8) py += 64 * 2;
914 for (ix = 0; ix < mx; ix += 8) {
918 *pix++ =
BYTECLIP(yy + ((
int)(1.402 * CVACC) * cr / CVACC));
919 *pix++ =
BYTECLIP(yy - ((
int)(0.344 * CVACC) * cb + (
int)(0.714 * CVACC) * cr) / CVACC);
920 *pix++ =
BYTECLIP(yy + ((
int)(1.772 * CVACC) * cb / CVACC));
935 for (
y = 0;
y < ry;
y++) {
936 for (
x = 0;
x < rx;
x++) {
943 s += (mx - rx) * (
JD_FORMAT != 2 ? 3 : 1);
951 unsigned int n = rx * ry;
956 w = (*s++ & 0xF8) << 8;
957 w |= (*s++ & 0xFC) << 3;
959 *d++ = (w << 8) | (w >> 8);
965 w = ( *s++ & 0xF8) << 8;
966 w |= (*s++ & 0xFC) << 3;
984#define LDB_WORD(ptr) (uint16_t)(((uint16_t)*((uint8_t*)(ptr))<<8)|(uint16_t)*(uint8_t*)((ptr)+1))
997 unsigned int n, i, ofs;
1016 marker = marker << 8 | seg[0];
1017 }
while (marker != 0xFFD8);
1024 if (len <= 2 || (marker >> 8) != 0xFF)
return JDR_FMT1;
1028 switch (marker & 0xFF) {
1039 for (i = 0; i < jd->
ncomp; i++) {
1042 if (b != 0x11 && b != 0x22 && b != 0x21) {
1045 jd->
msx = b >> 4; jd->
msy = b & 15;
1049 jd->
qtid[i] = seg[8 + 3 * i];
1085 for (i = 0; i < jd->
ncomp; i++) {
1087 if (b != 0x00 && b != 0x11)
return JDR_FMT3;
1100 len = n * 64 * 2 + 64;
1101 if (len < 256) len = 256;
1150 unsigned int x,
y, mx, my;
1158 mx = jd->
msx * 8; my = jd->
msy * 8;
1160 jd->
dcv[2] = jd->
dcv[1] = jd->
dcv[0] = 0;
1165 for (
x = 0;
x < jd->
width;
x += mx) {
1166 if (jd->
nrst && rst++ == jd->
nrst) {
1168 if (rc !=
JDR_OK)
return rc;
1172 if (rc !=
JDR_OK)
return rc;
1174 if (rc !=
JDR_OK)
return rc;
1196 unsigned int mx, my;
1199 uint16_t mcus_processed_this_call = 0;
1202 if (more_data_needed) *more_data_needed = 0;
1203 if (processing_complete) *processing_complete = 0;
1208 mx = jd->
msx * 8; my = jd->
msy * 8;
1220 jd->
dcv[2] = jd->
dcv[1] = jd->
dcv[0] = 0;
1236 if (jd->
nrst && rst++ == jd->
nrst) {
1238 if (rc !=
JDR_OK)
return rc;
1244 if (rc !=
JDR_OK)
return rc;
1247 if (rc !=
JDR_OK)
return rc;
1251 mcus_processed_this_call++;
1256 if (mcus_processed_this_call >= max_mcus_per_call) {
1280 if (processing_complete) *processing_complete = 1;
fl::UISlider scale("Scale", 4,.1, 4,.1)
static uint8_t BYTECLIP(int val) FL_NOEXCEPT
JRESULT jd_decomp(JDEC *jd, int(*outfunc)(JDEC *, void *, JRECT *), uint8_t scale) FL_NOEXCEPT
static void block_idct(int32_t *src, jd_yuv_t *dst) FL_NOEXCEPT
static JRESULT create_huffman_tbl(JDEC *jd, const uint8_t *data, size_t ndata) FL_NOEXCEPT
static JRESULT create_qt_tbl(JDEC *jd, const uint8_t *data, size_t ndata) FL_NOEXCEPT
static int bitext(JDEC *jd, unsigned int nbit) FL_NOEXCEPT
JRESULT jd_prepare(JDEC *jd, size_t(*infunc)(JDEC *, uint8_t *, size_t), void *pool, size_t sz_pool, void *dev) FL_NOEXCEPT
static const uint8_t Zig[64]
static void * alloc_pool(JDEC *jd, size_t ndata) FL_NOEXCEPT
static JRESULT restart(JDEC *jd, uint16_t rstn) FL_NOEXCEPT
JRESULT jd_decomp_progressive(JDEC_Progressive *jpd, int(*outfunc)(JDEC *, void *, JRECT *), uint8_t scale, uint16_t max_mcus_per_call, uint8_t *more_data_needed, uint8_t *processing_complete) FL_NOEXCEPT
static JRESULT mcu_load(JDEC *jd) FL_NOEXCEPT
static JRESULT mcu_output(JDEC *jd, int(*outfunc)(JDEC *, void *, JRECT *), unsigned int x, unsigned int y) FL_NOEXCEPT
static const uint16_t Ipsf[64]
static int huffext(JDEC *jd, unsigned int id, unsigned int cls) FL_NOEXCEPT
size_t(* infunc)(JDEC *, uint8_t *, size_t)
uint8_t workspace_initialized
void * memset(void *s, int c, size_t n) FL_NOEXCEPT
Base definition for an LED controller.