1 /* 16 bit decoding routines */
9 static unsigned short *backBuf1, *backBuf2;
10 static int lookup_initialized;
12 static void dispatchDecoder16(unsigned short **pFrame, unsigned char codeType, unsigned char **pData, unsigned char **pOffData, int *pDataRemain, int *curXb, int *curYb);
13 static void genLoopkupTable();
15 void decodeFrame16(unsigned char *pFrame, unsigned char *pMap, int mapRemain, unsigned char *pData, int dataRemain)
18 unsigned char *pOffData, *pEnd;
19 unsigned short offset;
25 if (!lookup_initialized) {
29 backBuf1 = (unsigned short *)g_vBackBuf1;
30 backBuf2 = (unsigned short *)g_vBackBuf2;
35 offset = pData[0]|(pData[1]<<8);
37 pOffData = pData + offset;
38 pEnd = pData + offset;
43 length = offset - 2; /*dataRemain-2;*/
47 for (i=0; i<xb/2; i++)
50 dispatchDecoder16((unsigned short **)&pFrame, op, &pData, &pOffData, &dataRemain, &i, &j);
53 if ((unsigned short *)pFrame < backBuf1)
54 fprintf(stderr, "danger! pointing out of bounds below after dispatch decoder: %d, %d (1) [%x]\n", i, j, (*pMap) & 0xf);
55 else if ((unsigned short *)pFrame >= backBuf1 + g_width*g_height)
56 fprintf(stderr, "danger! pointing out of bounds above after dispatch decoder: %d, %d (1) [%x]\n", i, j, (*pMap) & 0xf);
59 op = ((*pMap) >> 4) & 0xf;
60 dispatchDecoder16((unsigned short **)&pFrame, op, &pData, &pOffData, &dataRemain, &i, &j);
63 if ((unsigned short *)pFrame < backBuf1)
64 fprintf(stderr, "danger! pointing out of bounds below after dispatch decoder: %d, %d (2) [%x]\n", i, j, (*pMap) >> 4);
65 else if ((unsigned short *)pFrame >= backBuf1 + g_width*g_height)
66 fprintf(stderr, "danger! pointing out of bounds above after dispatch decoder: %d, %d (2) [%x]\n", i, j, (*pMap) >> 4);
73 pFrame += 7*g_width*2;
76 if ((length-(pData-pOrig)) != 0) {
77 fprintf(stderr, "DEBUG: junk left over: %d,%d,%d\n", (pData-pOrig), length, (length-(pData-pOrig)));
81 static unsigned short GETPIXEL(unsigned char **buf, int off)
83 unsigned short val = (*buf)[0+off] | ((*buf)[1+off] << 8);
87 static unsigned short GETPIXELI(unsigned char **buf, int off)
89 unsigned short val = (*buf)[0+off] | ((*buf)[1+off] << 8);
94 static void relClose(int i, int *x, int *y)
105 static void relFar(int i, int sign, int *x, int *y)
109 *x = sign * (8 + (i % 7));
114 *x = sign * (-14 + (i - 56) % 29);
115 *y = sign * (8 + (i - 56) / 29);
119 static int close_table[512];
120 static int far_p_table[512];
121 static int far_n_table[512];
123 static void genLoopkupTable()
128 for (i = 0; i < 256; i++) {
131 close_table[i*2+0] = x;
132 close_table[i*2+1] = y;
134 relFar(i, 1, &x, &y);
136 far_p_table[i*2+0] = x;
137 far_p_table[i*2+1] = y;
139 relFar(i, -1, &x, &y);
141 far_n_table[i*2+0] = x;
142 far_n_table[i*2+1] = y;
145 lookup_initialized = 1;
148 static void copyFrame(unsigned short *pDest, unsigned short *pSrc)
154 memcpy(pDest, pSrc, 16);
160 static void patternRow4Pixels(unsigned short *pFrame,
161 unsigned char pat0, unsigned char pat1,
164 unsigned short mask=0x0003;
165 unsigned short shift=0;
166 unsigned short pattern = (pat1 << 8) | pat0;
170 *pFrame++ = p[(mask & pattern) >> shift];
176 static void patternRow4Pixels2(unsigned short *pFrame,
180 unsigned char mask=0x03;
181 unsigned char shift=0;
183 /* ORIGINAL VERSION IS BUGGY
188 pel = p[(mask & pat0) >> shift];
191 pFrame[g_width + 0] = pel;
192 pFrame[g_width + 2] = pel;
201 pel = p[(mask & pat0) >> shift];
204 pFrame[g_width + 0] = pel;
205 pFrame[g_width + 1] = pel;
212 static void patternRow4Pixels2x1(unsigned short *pFrame, unsigned char pat,
215 unsigned char mask=0x03;
216 unsigned char shift=0;
221 pel = p[(mask & pat) >> shift];
230 static void patternQuadrant4Pixels(unsigned short *pFrame,
231 unsigned char pat0, unsigned char pat1, unsigned char pat2,
232 unsigned char pat3, unsigned short *p)
234 unsigned long mask = 0x00000003UL;
237 unsigned long pat = (pat3 << 24) | (pat2 << 16) | (pat1 << 8) | pat0;
241 pFrame[i&3] = p[(pat & mask) >> shift];
252 static void patternRow2Pixels(unsigned short *pFrame, unsigned char pat,
255 unsigned char mask=0x01;
259 *pFrame++ = p[(mask & pat) ? 1 : 0];
264 static void patternRow2Pixels2(unsigned short *pFrame, unsigned char pat,
268 unsigned char mask=0x1;
270 /* ORIGINAL VERSION IS BUGGY
274 pel = p[(mask & pat) ? 1 : 0];
277 pFrame[g_width + 0] = pel;
278 pFrame[g_width + 2] = pel;
284 while (mask != 0x10) {
285 pel = p[(mask & pat) ? 1 : 0];
289 pFrame[g_width + 0] = pel;
290 pFrame[g_width + 1] = pel;
297 static void patternQuadrant2Pixels(unsigned short *pFrame, unsigned char pat0,
298 unsigned char pat1, unsigned short *p)
300 unsigned short mask = 0x0001;
302 unsigned short pat = (pat1 << 8) | pat0;
306 pFrame[i&3] = p[(pat & mask) ? 1 : 0];
315 static void dispatchDecoder16(unsigned short **pFrame, unsigned char codeType, unsigned char **pData, unsigned char **pOffData, int *pDataRemain, int *curXb, int *curYb)
318 unsigned char pat[16];
321 unsigned short *pDstBak;
328 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1));
332 relFar(*(*pOffData)++, 1, &x, &y);
336 x = far_p_table[k*2+0];
337 y = far_p_table[k*2+1];
339 copyFrame(*pFrame, *pFrame + x + y*g_width);
343 relFar(*(*pOffData)++, -1, &x, &y);
347 x = far_n_table[k*2+0];
348 y = far_n_table[k*2+1];
350 copyFrame(*pFrame, *pFrame + x + y*g_width);
354 relClose(*(*pOffData)++, &x, &y);
358 x = close_table[k*2+0];
359 y = close_table[k*2+1];
361 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
365 x = (char)*(*pData)++;
366 y = (char)*(*pData)++;
367 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
371 fprintf(stderr, "STUB: encoding 6 not tested\n");
375 if (++*curXb == (g_width >> 3))
377 *pFrame += 7*g_width;
379 if (++*curYb == (g_height >> 3))
386 p[0] = GETPIXELI(pData, 0);
387 p[1] = GETPIXELI(pData, 0);
389 if (!((p[0]/*|p[1]*/)&0x8000))
393 patternRow2Pixels(*pFrame, *(*pData), p);
403 patternRow2Pixels2(*pFrame, *(*pData) & 0xf, p);
404 *pFrame += 2*g_width;
405 patternRow2Pixels2(*pFrame, *(*pData) >> 4, p);
408 *pFrame += 2*g_width;
414 p[0] = GETPIXEL(pData, 0);
416 if (!(p[0] & 0x8000))
420 p[0] = GETPIXELI(pData, 0);
421 p[1] = GETPIXELI(pData, 0);
423 pat[0] = (*pData)[0];
424 pat[1] = (*pData)[1];
427 patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
430 *pFrame -= (4*g_width - 4);
432 *pFrame += 4*g_width;
437 p[2] = GETPIXEL(pData, 8);
439 if (!(p[2]&0x8000)) {
444 p[0] = GETPIXELI(pData, 0);
445 p[1] = GETPIXELI(pData, 0);
447 pat[0] = *(*pData)++;
448 pat[1] = *(*pData)++;
449 patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
452 *pFrame -= (4*g_width - 4);
454 *pFrame += 4*g_width;
461 p[0] = GETPIXELI(pData, 0);
462 p[1] = GETPIXELI(pData, 0);
464 patternRow2Pixels(*pFrame, *(*pData), p);
474 p[0] = GETPIXELI(pData, 0);
475 p[1] = GETPIXELI(pData, 0);
476 p[2] = GETPIXELI(pData, 0);
477 p[3] = GETPIXELI(pData, 0);
481 if (!(p[0] & 0x8000))
483 if (!(p[2] & 0x8000))
488 pat[0] = (*pData)[0];
489 pat[1] = (*pData)[1];
491 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
499 patternRow4Pixels2(*pFrame, (*pData)[0], p);
500 *pFrame += 2*g_width;
501 patternRow4Pixels2(*pFrame, (*pData)[1], p);
502 *pFrame += 2*g_width;
503 patternRow4Pixels2(*pFrame, (*pData)[2], p);
504 *pFrame += 2*g_width;
505 patternRow4Pixels2(*pFrame, (*pData)[3], p);
514 if (!(p[2] & 0x8000))
518 pat[0] = (*pData)[0];
520 patternRow4Pixels2x1(*pFrame, pat[0], p);
529 pat[0] = (*pData)[0];
530 pat[1] = (*pData)[1];
534 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
536 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
545 p[0] = GETPIXEL(pData, 0);
547 if (!(p[0] & 0x8000))
551 p[0] = GETPIXELI(pData, 0);
552 p[1] = GETPIXELI(pData, 0);
553 p[2] = GETPIXELI(pData, 0);
554 p[3] = GETPIXELI(pData, 0);
555 pat[0] = (*pData)[0];
556 pat[1] = (*pData)[1];
557 pat[2] = (*pData)[2];
558 pat[3] = (*pData)[3];
562 patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
565 *pFrame -= (4*g_width - 4);
567 *pFrame += 4*g_width;
572 p[0] = GETPIXEL(pData, 16);
574 if (!(p[0] & 0x8000))
580 p[0] = GETPIXELI(pData, 0);
581 p[1] = GETPIXELI(pData, 0);
582 p[2] = GETPIXELI(pData, 0);
583 p[3] = GETPIXELI(pData, 0);
586 pat[0] = (*pData)[0];
587 pat[1] = (*pData)[1];
588 pat[2] = (*pData)[2];
589 pat[3] = (*pData)[3];
593 patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
596 *pFrame -= (4*g_width - 4);
598 *pFrame += 4*g_width;
607 p[0] = GETPIXELI(pData, 0);
608 p[1] = GETPIXELI(pData, 0);
609 p[2] = GETPIXELI(pData, 0);
610 p[3] = GETPIXELI(pData, 0);
613 pat[0] = (*pData)[0];
614 pat[1] = (*pData)[1];
615 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
627 memcpy(*pFrame, *pData, 16);
637 p[0] = GETPIXEL(pData, 0);
638 p[1] = GETPIXEL(pData, 2);
639 p[2] = GETPIXEL(pData, 4);
640 p[3] = GETPIXEL(pData, 6);
646 (*pFrame)[j+2*k] = p[k];
647 (*pFrame)[g_width+j+2*k] = p[k];
659 p[0] = GETPIXEL(pData, 0);
660 p[1] = GETPIXEL(pData, 2);
666 (*pFrame)[k*g_width+j] = p[0];
667 (*pFrame)[k*g_width+j+4] = p[1];
671 *pFrame += 4*g_width;
679 p[0] = GETPIXEL(pData, 0);
681 for (i = 0; i < 8; i++) {
682 for (j = 0; j < 8; j++) {
695 p[0] = GETPIXEL(pData, 0);
696 p[1] = GETPIXEL(pData, 1);
702 (*pFrame)[j] = p[(i+j)&1];