5 extern int g_width, g_height;
6 extern void *g_vBackBuf1, *g_vBackBuf2;
8 /* 16 bit decoding routines */
10 static unsigned short *backBuf1, *backBuf2;
11 static int lookup_initialized;
13 static void dispatchDecoder16(unsigned short **pFrame, unsigned char codeType, unsigned char **pData, unsigned char **pOffData, int *pDataRemain, int *curXb, int *curYb);
14 static void genLoopkupTable();
16 void decodeFrame16(unsigned char *pFrame, unsigned char *pMap, int mapRemain, unsigned char *pData, int dataRemain)
19 unsigned char *pOffData, *pEnd;
20 unsigned short offset;
26 if (!lookup_initialized) {
30 backBuf1 = (unsigned short *)g_vBackBuf1;
31 backBuf2 = (unsigned short *)g_vBackBuf2;
36 offset = pData[0]|(pData[1]<<8);
38 pOffData = pData + offset;
39 pEnd = pData + offset;
44 length = offset - 2; /*dataRemain-2;*/
48 for (i=0; i<xb/2; i++)
51 dispatchDecoder16((unsigned short **)&pFrame, op, &pData, &pOffData, &dataRemain, &i, &j);
54 if ((unsigned short *)pFrame < backBuf1)
55 fprintf(stderr, "danger! pointing out of bounds below after dispatch decoder: %d, %d (1) [%x]\n", i, j, (*pMap) & 0xf);
56 else if ((unsigned short *)pFrame >= backBuf1 + g_width*g_height)
57 fprintf(stderr, "danger! pointing out of bounds above after dispatch decoder: %d, %d (1) [%x]\n", i, j, (*pMap) & 0xf);
60 op = ((*pMap) >> 4) & 0xf;
61 dispatchDecoder16((unsigned short **)&pFrame, op, &pData, &pOffData, &dataRemain, &i, &j);
64 if ((unsigned short *)pFrame < backBuf1)
65 fprintf(stderr, "danger! pointing out of bounds below after dispatch decoder: %d, %d (2) [%x]\n", i, j, (*pMap) >> 4);
66 else if ((unsigned short *)pFrame >= backBuf1 + g_width*g_height)
67 fprintf(stderr, "danger! pointing out of bounds above after dispatch decoder: %d, %d (2) [%x]\n", i, j, (*pMap) >> 4);
74 pFrame += 7*g_width*2;
77 if ((length-(pData-pOrig)) != 0) {
78 fprintf(stderr, "DEBUG: junk left over: %d,%d,%d\n", (pData-pOrig), length, (length-(pData-pOrig)));
82 static unsigned short GETPIXEL(unsigned char **buf, int off)
84 unsigned short val = (*buf)[0+off] | ((*buf)[1+off] << 8);
88 static unsigned short GETPIXELI(unsigned char **buf, int off)
90 unsigned short val = (*buf)[0+off] | ((*buf)[1+off] << 8);
95 static void relClose(int i, int *x, int *y)
106 static void relFar(int i, int sign, int *x, int *y)
110 *x = sign * (8 + (i % 7));
115 *x = sign * (-14 + (i - 56) % 29);
116 *y = sign * (8 + (i - 56) / 29);
120 static int close_table[512];
121 static int far_p_table[512];
122 static int far_n_table[512];
124 static void genLoopkupTable()
129 for (i = 0; i < 256; i++) {
132 close_table[i*2+0] = x;
133 close_table[i*2+1] = y;
135 relFar(i, 1, &x, &y);
137 far_p_table[i*2+0] = x;
138 far_p_table[i*2+1] = y;
140 relFar(i, -1, &x, &y);
142 far_n_table[i*2+0] = x;
143 far_n_table[i*2+1] = y;
146 lookup_initialized = 1;
149 static void copyFrame(unsigned short *pDest, unsigned short *pSrc)
155 memcpy(pDest, pSrc, 16);
161 static void patternRow4Pixels(unsigned short *pFrame,
162 unsigned char pat0, unsigned char pat1,
165 unsigned short mask=0x0003;
166 unsigned short shift=0;
167 unsigned short pattern = (pat1 << 8) | pat0;
171 *pFrame++ = p[(mask & pattern) >> shift];
177 static void patternRow4Pixels2(unsigned short *pFrame,
181 unsigned char mask=0x03;
182 unsigned char shift=0;
184 /* ORIGINAL VERSION IS BUGGY
189 pel = p[(mask & pat0) >> shift];
192 pFrame[g_width + 0] = pel;
193 pFrame[g_width + 2] = pel;
202 pel = p[(mask & pat0) >> shift];
205 pFrame[g_width + 0] = pel;
206 pFrame[g_width + 1] = pel;
213 static void patternRow4Pixels2x1(unsigned short *pFrame, unsigned char pat,
216 unsigned char mask=0x03;
217 unsigned char shift=0;
222 pel = p[(mask & pat) >> shift];
231 static void patternQuadrant4Pixels(unsigned short *pFrame,
232 unsigned char pat0, unsigned char pat1, unsigned char pat2,
233 unsigned char pat3, unsigned short *p)
235 unsigned long mask = 0x00000003UL;
238 unsigned long pat = (pat3 << 24) | (pat2 << 16) | (pat1 << 8) | pat0;
242 pFrame[i&3] = p[(pat & mask) >> shift];
253 static void patternRow2Pixels(unsigned short *pFrame, unsigned char pat,
256 unsigned char mask=0x01;
260 *pFrame++ = p[(mask & pat) ? 1 : 0];
265 static void patternRow2Pixels2(unsigned short *pFrame, unsigned char pat,
269 unsigned char mask=0x1;
271 /* ORIGINAL VERSION IS BUGGY
275 pel = p[(mask & pat) ? 1 : 0];
278 pFrame[g_width + 0] = pel;
279 pFrame[g_width + 2] = pel;
285 while (mask != 0x10) {
286 pel = p[(mask & pat) ? 1 : 0];
290 pFrame[g_width + 0] = pel;
291 pFrame[g_width + 1] = pel;
298 static void patternQuadrant2Pixels(unsigned short *pFrame, unsigned char pat0,
299 unsigned char pat1, unsigned short *p)
301 unsigned short mask = 0x0001;
303 unsigned short pat = (pat1 << 8) | pat0;
307 pFrame[i&3] = p[(pat & mask) ? 1 : 0];
316 static void dispatchDecoder16(unsigned short **pFrame, unsigned char codeType, unsigned char **pData, unsigned char **pOffData, int *pDataRemain, int *curXb, int *curYb)
319 unsigned char pat[16];
322 unsigned short *pDstBak;
329 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1));
333 relFar(*(*pOffData)++, 1, &x, &y);
337 x = far_p_table[k*2+0];
338 y = far_p_table[k*2+1];
340 copyFrame(*pFrame, *pFrame + x + y*g_width);
344 relFar(*(*pOffData)++, -1, &x, &y);
348 x = far_n_table[k*2+0];
349 y = far_n_table[k*2+1];
351 copyFrame(*pFrame, *pFrame + x + y*g_width);
355 relClose(*(*pOffData)++, &x, &y);
359 x = close_table[k*2+0];
360 y = close_table[k*2+1];
362 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
366 x = (char)*(*pData)++;
367 y = (char)*(*pData)++;
368 copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
372 fprintf(stderr, "STUB: encoding 6 not tested\n");
376 if (++*curXb == (g_width >> 3))
378 *pFrame += 7*g_width;
380 if (++*curYb == (g_height >> 3))
387 p[0] = GETPIXELI(pData, 0);
388 p[1] = GETPIXELI(pData, 0);
390 if (!((p[0]/*|p[1]*/)&0x8000))
394 patternRow2Pixels(*pFrame, *(*pData), p);
404 patternRow2Pixels2(*pFrame, *(*pData) & 0xf, p);
405 *pFrame += 2*g_width;
406 patternRow2Pixels2(*pFrame, *(*pData) >> 4, p);
409 *pFrame += 2*g_width;
415 p[0] = GETPIXEL(pData, 0);
417 if (!(p[0] & 0x8000))
421 p[0] = GETPIXELI(pData, 0);
422 p[1] = GETPIXELI(pData, 0);
424 pat[0] = (*pData)[0];
425 pat[1] = (*pData)[1];
428 patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
431 *pFrame -= (4*g_width - 4);
433 *pFrame += 4*g_width;
438 p[2] = GETPIXEL(pData, 8);
440 if (!(p[2]&0x8000)) {
445 p[0] = GETPIXELI(pData, 0);
446 p[1] = GETPIXELI(pData, 0);
448 pat[0] = *(*pData)++;
449 pat[1] = *(*pData)++;
450 patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
453 *pFrame -= (4*g_width - 4);
455 *pFrame += 4*g_width;
462 p[0] = GETPIXELI(pData, 0);
463 p[1] = GETPIXELI(pData, 0);
465 patternRow2Pixels(*pFrame, *(*pData), p);
475 p[0] = GETPIXELI(pData, 0);
476 p[1] = GETPIXELI(pData, 0);
477 p[2] = GETPIXELI(pData, 0);
478 p[3] = GETPIXELI(pData, 0);
482 if (!(p[0] & 0x8000))
484 if (!(p[2] & 0x8000))
489 pat[0] = (*pData)[0];
490 pat[1] = (*pData)[1];
492 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
500 patternRow4Pixels2(*pFrame, (*pData)[0], p);
501 *pFrame += 2*g_width;
502 patternRow4Pixels2(*pFrame, (*pData)[1], p);
503 *pFrame += 2*g_width;
504 patternRow4Pixels2(*pFrame, (*pData)[2], p);
505 *pFrame += 2*g_width;
506 patternRow4Pixels2(*pFrame, (*pData)[3], p);
515 if (!(p[2] & 0x8000))
519 pat[0] = (*pData)[0];
521 patternRow4Pixels2x1(*pFrame, pat[0], p);
530 pat[0] = (*pData)[0];
531 pat[1] = (*pData)[1];
535 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
537 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
546 p[0] = GETPIXEL(pData, 0);
548 if (!(p[0] & 0x8000))
552 p[0] = GETPIXELI(pData, 0);
553 p[1] = GETPIXELI(pData, 0);
554 p[2] = GETPIXELI(pData, 0);
555 p[3] = GETPIXELI(pData, 0);
556 pat[0] = (*pData)[0];
557 pat[1] = (*pData)[1];
558 pat[2] = (*pData)[2];
559 pat[3] = (*pData)[3];
563 patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
566 *pFrame -= (4*g_width - 4);
568 *pFrame += 4*g_width;
573 p[0] = GETPIXEL(pData, 16);
575 if (!(p[0] & 0x8000))
581 p[0] = GETPIXELI(pData, 0);
582 p[1] = GETPIXELI(pData, 0);
583 p[2] = GETPIXELI(pData, 0);
584 p[3] = GETPIXELI(pData, 0);
587 pat[0] = (*pData)[0];
588 pat[1] = (*pData)[1];
589 pat[2] = (*pData)[2];
590 pat[3] = (*pData)[3];
594 patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
597 *pFrame -= (4*g_width - 4);
599 *pFrame += 4*g_width;
608 p[0] = GETPIXELI(pData, 0);
609 p[1] = GETPIXELI(pData, 0);
610 p[2] = GETPIXELI(pData, 0);
611 p[3] = GETPIXELI(pData, 0);
614 pat[0] = (*pData)[0];
615 pat[1] = (*pData)[1];
616 patternRow4Pixels(*pFrame, pat[0], pat[1], p);
628 memcpy(*pFrame, *pData, 16);
638 p[0] = GETPIXEL(pData, 0);
639 p[1] = GETPIXEL(pData, 2);
640 p[2] = GETPIXEL(pData, 4);
641 p[3] = GETPIXEL(pData, 6);
647 (*pFrame)[j+2*k] = p[k];
648 (*pFrame)[g_width+j+2*k] = p[k];
660 p[0] = GETPIXEL(pData, 0);
661 p[1] = GETPIXEL(pData, 2);
667 (*pFrame)[k*g_width+j] = p[0];
668 (*pFrame)[k*g_width+j+4] = p[1];
672 *pFrame += 4*g_width;
680 p[0] = GETPIXEL(pData, 0);
682 for (i = 0; i < 8; i++) {
683 for (j = 0; j < 8; j++) {
696 p[0] = GETPIXEL(pData, 0);
697 p[1] = GETPIXEL(pData, 1);
703 (*pFrame)[j] = p[(i+j)&1];