2 * Copyright (C) 2001, Novell Inc.
3 * Copyright (C) 2010 Kevin O'Connor <kevin@koconnor.net>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of Novell nor the names of the contributors may
18 * be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
36 * a tiny jpeg decoder.
38 * written in August 2001 by Michael Schroeder <mls@suse.de>
42 #define __LITTLE_ENDIAN
48 #define IFIX(a) ((int)((a) * (1 << ISHIFT) + .5))
49 #define IMULT(a, b) (((a) * (b)) >> ISHIFT)
50 #define ITOINT(a) ((a) >> ISHIFT)
66 int (*func) __P((void *));
70 /*********************************/
75 struct dec_hufftbl *dhuff;
76 struct enc_hufftbl *ehuff;
80 int dc; /* old dc value */
84 int next; /* when to switch to next scan */
86 int cid; /* component id */
87 int hv; /* horiz/vert, copied from comp */
88 int tq; /* quant tbl, copied from comp */
91 /*********************************/
93 #define DECBITS 10 /* seems to be the optimum */
98 unsigned char vals[256];
99 unsigned int llvals[1 << DECBITS];
102 static void decode_mcus __P((struct in *, int *, int, struct scan *, int *));
103 static int dec_readmarker __P((struct in *));
104 static void dec_makehuff __P((struct dec_hufftbl *, int *, unsigned char *));
106 static void setinput __P((struct in *, unsigned char *));
107 /*********************************/
112 static void idctqtab __P((unsigned char *, PREC *));
113 static void idct __P((int *, int *, PREC *, PREC, int));
114 static void scaleidctqtab __P((PREC *, PREC));
116 /*********************************/
118 static void initcol __P((PREC[][64]));
120 static void col221111 __P((int *, unsigned char *, int));
121 static void col221111_16 __P((int *, unsigned char *, int));
122 static void col221111_32 __P((int *, unsigned char *, int));
124 /*********************************/
127 #define ERR_NOT_8BIT 2
128 #define ERR_HEIGHT_MISMATCH 3
129 #define ERR_WIDTH_MISMATCH 4
130 #define ERR_BAD_WIDTH_OR_HEIGHT 5
131 #define ERR_TOO_MANY_COMPPS 6
132 #define ERR_ILLEGAL_HV 7
133 #define ERR_QUANT_TABLE_SELECTOR 8
134 #define ERR_NOT_YCBCR_221111 9
135 #define ERR_UNKNOWN_CID_IN_SCAN 10
136 #define ERR_NOT_SEQUENTIAL_DCT 11
137 #define ERR_WRONG_MARKER 12
138 #define ERR_NO_EOI 13
139 #define ERR_BAD_TABLES 14
140 #define ERR_DEPTH_MISMATCH 15
142 /*********************************/
163 int nc; /* number of components */
164 int ns; /* number of scans */
165 int dri; /* restart interval */
166 int nm; /* mcus til next marker */
167 int rm; /* next restart marker */
170 struct jpeg_decdata {
171 int dcts[6 * 64 + 16];
175 unsigned char *datap;
177 struct comp comps[MAXCOMP];
178 struct scan dscans[MAXCOMP];
179 unsigned char quant[4][64];
180 struct dec_hufftbl dhuff[4];
186 static int getbyte(struct jpeg_decdata *jpeg)
188 return *jpeg->datap++;
191 static int getword(struct jpeg_decdata *jpeg)
199 static int readtables(struct jpeg_decdata *jpeg, int till)
201 int m, l, i, j, lq, pq, tq;
205 if (getbyte(jpeg) != 0xff)
207 if ((m = getbyte(jpeg)) == till)
224 for (i = 0; i < 64; i++)
225 jpeg->quant[tq][i] = getbyte(jpeg);
234 unsigned char huffvals[256];
240 if (tc > 1 || th > 1)
242 for (i = 0; i < 16; i++)
243 hufflen[i] = getbyte(jpeg);
246 for (i = 0; i < 16; i++) {
247 for (j = 0; j < hufflen[i]; j++)
248 huffvals[k++] = getbyte(jpeg);
251 dec_makehuff(jpeg->dhuff + tt, hufflen, huffvals);
257 jpeg->info.dri = getword(jpeg);
270 static void dec_initscans(struct jpeg_decdata *jpeg)
274 jpeg->info.nm = jpeg->info.dri + 1;
275 jpeg->info.rm = M_RST0;
276 for (i = 0; i < jpeg->info.ns; i++)
277 jpeg->dscans[i].dc = 0;
280 static int dec_checkmarker(struct jpeg_decdata *jpeg)
284 if (dec_readmarker(&jpeg->in) != jpeg->info.rm)
286 jpeg->info.nm = jpeg->info.dri;
287 jpeg->info.rm = (jpeg->info.rm + 1) & ~0x08;
288 for (i = 0; i < jpeg->info.ns; i++)
289 jpeg->dscans[i].dc = 0;
293 struct jpeg_decdata *jpeg_alloc(void)
295 struct jpeg_decdata *jpeg = malloc_tmphigh(sizeof(*jpeg));
299 int jpeg_decode(struct jpeg_decdata *jpeg, unsigned char *buf)
301 int i, j, m, tac, tdc;
306 if (getbyte(jpeg) != 0xff)
308 if (getbyte(jpeg) != M_SOI)
310 if (readtables(jpeg, M_SOF0))
311 return ERR_BAD_TABLES;
316 jpeg->height = getword(jpeg);
317 jpeg->width = getword(jpeg);
318 if ((jpeg->height & 15) || (jpeg->width & 15))
319 return ERR_BAD_WIDTH_OR_HEIGHT;
320 jpeg->info.nc = getbyte(jpeg);
321 if (jpeg->info.nc > MAXCOMP)
322 return ERR_TOO_MANY_COMPPS;
323 for (i = 0; i < jpeg->info.nc; i++) {
325 jpeg->comps[i].cid = getbyte(jpeg);
326 jpeg->comps[i].hv = getbyte(jpeg);
327 v = jpeg->comps[i].hv & 15;
328 h = jpeg->comps[i].hv >> 4;
329 jpeg->comps[i].tq = getbyte(jpeg);
331 return ERR_ILLEGAL_HV;
332 if (jpeg->comps[i].tq > 3)
333 return ERR_QUANT_TABLE_SELECTOR;
335 if (readtables(jpeg, M_SOS))
336 return ERR_BAD_TABLES;
338 jpeg->info.ns = getbyte(jpeg);
339 if (jpeg->info.ns != 3)
340 return ERR_NOT_YCBCR_221111;
341 for (i = 0; i < 3; i++) {
342 jpeg->dscans[i].cid = getbyte(jpeg);
346 if (tdc > 1 || tac > 1)
347 return ERR_QUANT_TABLE_SELECTOR;
348 for (j = 0; j < jpeg->info.nc; j++)
349 if (jpeg->comps[j].cid == jpeg->dscans[i].cid)
351 if (j == jpeg->info.nc)
352 return ERR_UNKNOWN_CID_IN_SCAN;
353 jpeg->dscans[i].hv = jpeg->comps[j].hv;
354 jpeg->dscans[i].tq = jpeg->comps[j].tq;
355 jpeg->dscans[i].hudc.dhuff = &jpeg->dhuff[tdc];
356 jpeg->dscans[i].huac.dhuff = &jpeg->dhuff[2 + tac];
363 if (i != 0 || j != 63 || m != 0)
364 return ERR_NOT_SEQUENTIAL_DCT;
366 if (jpeg->dscans[0].cid != 1 || jpeg->dscans[1].cid != 2
367 || jpeg->dscans[2].cid != 3)
368 return ERR_NOT_YCBCR_221111;
370 if (jpeg->dscans[0].hv != 0x22 || jpeg->dscans[1].hv != 0x11
371 || jpeg->dscans[2].hv != 0x11)
372 return ERR_NOT_YCBCR_221111;
374 idctqtab(jpeg->quant[jpeg->dscans[0].tq], jpeg->dquant[0]);
375 idctqtab(jpeg->quant[jpeg->dscans[1].tq], jpeg->dquant[1]);
376 idctqtab(jpeg->quant[jpeg->dscans[2].tq], jpeg->dquant[2]);
377 initcol(jpeg->dquant);
378 setinput(&jpeg->in, jpeg->datap);
384 img[len + 2] = M_EOF;
392 void jpeg_get_size(struct jpeg_decdata *jpeg, int *width, int *height)
394 *width = jpeg->width;
395 *height = jpeg->height;
398 int jpeg_show(struct jpeg_decdata *jpeg, unsigned char *pic, int width
399 , int height, int depth, int bytes_per_line_dest)
401 int m, mcusx, mcusy, mx, my, mloffset, jpgbpl;
404 if (jpeg->height != height)
405 return ERR_HEIGHT_MISMATCH;
406 if (jpeg->width != width)
407 return ERR_WIDTH_MISMATCH;
409 jpgbpl = width * depth / 8;
410 mloffset = bytes_per_line_dest > jpgbpl ? bytes_per_line_dest : jpgbpl;
412 mcusx = jpeg->width >> 4;
413 mcusy = jpeg->height >> 4;
415 jpeg->dscans[0].next = 6 - 4;
416 jpeg->dscans[1].next = 6 - 4 - 1;
417 jpeg->dscans[2].next = 6 - 4 - 1 - 1; /* 411 encoding */
418 for (my = 0; my < mcusy; my++) {
419 for (mx = 0; mx < mcusx; mx++) {
420 if (jpeg->info.dri && !--jpeg->info.nm)
421 if (dec_checkmarker(jpeg))
422 return ERR_WRONG_MARKER;
424 decode_mcus(&jpeg->in, jpeg->dcts, 6, jpeg->dscans, max);
425 idct(jpeg->dcts, jpeg->out, jpeg->dquant[0],
426 IFIX(128.5), max[0]);
427 idct(jpeg->dcts + 64, jpeg->out + 64, jpeg->dquant[0],
428 IFIX(128.5), max[1]);
429 idct(jpeg->dcts + 128, jpeg->out + 128, jpeg->dquant[0],
430 IFIX(128.5), max[2]);
431 idct(jpeg->dcts + 192, jpeg->out + 192, jpeg->dquant[0],
432 IFIX(128.5), max[3]);
433 idct(jpeg->dcts + 256, jpeg->out + 256, jpeg->dquant[1],
435 idct(jpeg->dcts + 320, jpeg->out + 320, jpeg->dquant[2],
440 col221111_32(jpeg->out,
441 pic + (my * 16 * mloffset + mx * 16 * 4),
446 pic + (my * 16 * mloffset + mx * 16 * 3),
450 col221111_16(jpeg->out,
451 pic + (my * 16 * mloffset + mx * 16 * 2),
455 return ERR_DEPTH_MISMATCH;
461 m = dec_readmarker(&jpeg->in);
468 /****************************************************************/
469 /************** huffman decoder ***************/
470 /****************************************************************/
472 static int fillbits __P((struct in *, int, unsigned int));
473 static int dec_rec2 __P((struct in *, struct dec_hufftbl *, int *, int, int));
475 static void setinput(struct in *in, unsigned char *p)
483 static int fillbits(struct in *in, int le, unsigned int bi)
489 in->bits = bi << 16, le += 16;
494 if (b == 0xff && (m = *in->p++) != 0) {
496 if (in->func && (m = in->func(in->data)) == 0)
501 bi = bi << 16, le += 16;
507 in->bits = bi; /* tmp... 2 return values needed */
511 static int dec_readmarker(struct in *in)
515 in->left = fillbits(in, in->left, in->bits);
516 if ((m = in->marker) == 0)
523 #define LEBI_DCL int le, bi
524 #define LEBI_GET(in) (le = in->left, bi = in->bits)
525 #define LEBI_PUT(in) (in->left = le, in->bits = bi)
527 #define GETBITS(in, n) ( \
528 (le < (n) ? le = fillbits(in, le, bi), bi = in->bits : 0), \
530 bi >> le & ((1 << (n)) - 1) \
533 #define UNGETBITS(in, n) ( \
538 static int dec_rec2(struct in *in, struct dec_hufftbl *hu, int *runp,
545 UNGETBITS(in, i & 127);
550 (c = ((c << 1) | GETBITS(in, 1))) >= (hu->maxcode[i]); i++);
552 in->marker = M_BADHUFF;
555 i = hu->vals[hu->valptr[i] + c - hu->maxcode[i - 1] * 2];
559 if (i == 0) { /* sigh, 0xf0 is 11 bit */
565 if (c < (1 << (i - 1)))
571 #define DEC_REC(in, hu, r, i) ( \
572 r = GETBITS(in, DECBITS), \
576 UNGETBITS(in, i & 127), \
583 i = dec_rec2(in, hu, &r, r, i), \
589 static void decode_mcus(struct in *in, int *dct, int n, struct scan *sc,
592 struct dec_hufftbl *hu;
596 memset(dct, 0, n * 64 * sizeof(*dct));
600 *dct++ = (sc->dc += DEC_REC(in, hu, r, t));
605 t = DEC_REC(in, hu, r, t);
606 if (t == 0 && r == 0) {
621 static void dec_makehuff(struct dec_hufftbl *hu, int *hufflen,
622 unsigned char *huffvals)
624 int code, k, i, j, d, x, c, v;
625 for (i = 0; i < (1 << DECBITS); i++)
631 * value v already known, run r, backup u bits:
632 * vvvvvvvvvvvvvvvv 0000 rrrr 1 uuuuuuu
633 * value unknown, size b bits, run r, backup u bits:
634 * 000000000000bbbb 0000 rrrr 0 uuuuuuu
635 * value and size unknown:
636 * 0000000000000000 0000 0000 0 0000000
641 for (i = 0; i < 16; i++, code <<= 1) { /* sizes */
643 for (j = 0; j < hufflen[i]; j++) {
644 hu->vals[k] = *huffvals++;
646 c = code << (DECBITS - 1 - i);
647 v = hu->vals[k] & 0x0f; /* size */
648 for (d = 1 << (DECBITS - 1 - i); --d >= 0;) {
649 if (v + i < DECBITS) { /* both fit in table */
650 x = d >> (DECBITS - 1 - v - i);
651 if (v && x < (1 << (v - 1)))
653 x = x << 16 | (hu->vals[k] & 0xf0) << 4 |
654 (DECBITS - (i + 1 + v)) | 128;
656 x = v << 16 | (hu->vals[k] & 0xf0) << 4 |
658 hu->llvals[c | d] = x;
664 hu->maxcode[i] = code;
666 hu->maxcode[16] = 0x20000; /* always terminate decode */
669 /****************************************************************/
670 /************** idct ***************/
671 /****************************************************************/
673 #define ONE ((PREC)IFIX(1.))
674 #define S2 ((PREC)IFIX(0.382683432))
675 #define C2 ((PREC)IFIX(0.923879532))
676 #define C4 ((PREC)IFIX(0.707106781))
678 #define S22 ((PREC)IFIX(2 * 0.382683432))
679 #define C22 ((PREC)IFIX(2 * 0.923879532))
680 #define IC4 ((PREC)IFIX(1 / 0.707106781))
682 #define C3IC1 ((PREC)IFIX(0.847759065)) /* c3/c1 */
683 #define C5IC1 ((PREC)IFIX(0.566454497)) /* c5/c1 */
684 #define C7IC1 ((PREC)IFIX(0.198912367)) /* c7/c1 */
686 #define XPP(a,b) (t = a + b, b = a - b, a = t)
687 #define XMP(a,b) (t = a - b, b = a + b, a = t)
688 #define XPM(a,b) (t = a + b, b = b - a, a = t)
690 #define ROT(a,b,s,c) ( t = IMULT(a + b, s), \
691 a = IMULT(a, c - s) + t, \
692 b = IMULT(b, c + s) - t)
698 t2 = IMULT(t2, IC4) - t3, \
704 t5 = IMULT(t5, IC4), \
705 ROT(t4, t6, S22, C22), \
715 static unsigned char zig2[64] = {
716 0, 2, 3, 9, 10, 20, 21, 35,
717 14, 16, 25, 31, 39, 46, 50, 57,
718 5, 7, 12, 18, 23, 33, 37, 48,
719 27, 29, 41, 44, 52, 55, 59, 62,
720 15, 26, 30, 40, 45, 51, 56, 58,
721 1, 4, 8, 11, 19, 22, 34, 36,
722 28, 42, 43, 53, 54, 60, 61, 63,
723 6, 13, 17, 24, 32, 38, 47, 49
726 static void idct(int *in, int *out, PREC * quant, PREC off, int max)
728 PREC t0, t1, t2, t3, t4, t5, t6, t7, t;
731 unsigned char *zig2p;
735 t0 += in[0] * quant[0];
736 for (i = 0; i < 64; i++)
742 for (i = 0; i < 8; i++) {
744 t0 += in[j] * quant[j];
746 t5 = in[j] * quant[j];
748 t2 = in[j] * quant[j];
750 t7 = in[j] * quant[j];
752 t1 = in[j] * quant[j];
754 t4 = in[j] * quant[j];
756 t3 = in[j] * quant[j];
758 t6 = in[j] * quant[j];
771 for (i = 0; i < 8; i++) {
781 out[8 * i + 0] = ITOINT(t0);
782 out[8 * i + 1] = ITOINT(t1);
783 out[8 * i + 2] = ITOINT(t2);
784 out[8 * i + 3] = ITOINT(t3);
785 out[8 * i + 4] = ITOINT(t4);
786 out[8 * i + 5] = ITOINT(t5);
787 out[8 * i + 6] = ITOINT(t6);
788 out[8 * i + 7] = ITOINT(t7);
792 static unsigned char zig[64] = {
793 0, 1, 5, 6, 14, 15, 27, 28,
794 2, 4, 7, 13, 16, 26, 29, 42,
795 3, 8, 12, 17, 25, 30, 41, 43,
796 9, 11, 18, 24, 31, 40, 44, 53,
797 10, 19, 23, 32, 39, 45, 52, 54,
798 20, 22, 33, 38, 46, 51, 55, 60,
799 21, 34, 37, 47, 50, 56, 59, 61,
800 35, 36, 48, 49, 57, 58, 62, 63
803 static PREC aaidct[8] = {
804 IFIX(0.3535533906), IFIX(0.4903926402),
805 IFIX(0.4619397663), IFIX(0.4157348062),
806 IFIX(0.3535533906), IFIX(0.2777851165),
807 IFIX(0.1913417162), IFIX(0.0975451610)
811 static void idctqtab(unsigned char *qin, PREC * qout)
815 for (i = 0; i < 8; i++)
816 for (j = 0; j < 8; j++)
817 qout[zig[i * 8 + j]] = qin[zig[i * 8 + j]] *
818 IMULT(aaidct[i], aaidct[j]);
821 static void scaleidctqtab(PREC * q, PREC sc)
825 for (i = 0; i < 64; i++)
826 q[i] = IMULT(q[i], sc);
829 /****************************************************************/
830 /************** color decoder ***************/
831 /****************************************************************/
836 * YCbCr Color transformation:
838 * y:0..255 Cb:-128..127 Cr:-128..127
840 * R = Y + 1.40200 * Cr
841 * G = Y - 0.34414 * Cb - 0.71414 * Cr
842 * B = Y + 1.77200 * Cb
847 * Cg = 0.19421 * Cb + .50937 * Cr;
853 * Cg = (50 * Cb + 130 * Cr + 128) >> 8;
856 static void initcol(PREC q[][64])
858 scaleidctqtab(q[1], IFIX(1.77200));
859 scaleidctqtab(q[2], IFIX(1.40200));
862 /* This is optimized for the stupid sun SUNWspro compiler. */
863 #define STORECLAMP(a,x) \
866 (unsigned int)(x) >= 256 ? \
867 ((a) = (x) < 0 ? 0 : 255) \
872 #define CLAMP(x) ((unsigned int)(x) >= 256 ? ((x) < 0 ? 0 : 255) : (x))
876 #define CBCRCG(yin, xin) \
878 cb = outc[0 +yin*8+xin], \
879 cr = outc[64+yin*8+xin], \
880 cg = (50 * cb + 130 * cr + 128) >> 8 \
885 #define CBCRCG(yin, xin) \
887 cb = outc[0 +yin*8+xin], \
888 cr = outc[64+yin*8+xin], \
889 cg = (3 * cb + 8 * cr) >> 4 \
894 #ifdef __LITTLE_ENDIAN
895 #define PIC(yin, xin, p, xout) \
897 y = outy[(yin) * 8 + xin], \
898 STORECLAMP(p[(xout) * 3 + 2], y + cr), \
899 STORECLAMP(p[(xout) * 3 + 1], y - cg), \
900 STORECLAMP(p[(xout) * 3 + 0], y + cb) \
903 #define PIC(yin, xin, p, xout) \
905 y = outy[(yin) * 8 + xin], \
906 STORECLAMP(p[(xout) * 3 + 0], y + cr), \
907 STORECLAMP(p[(xout) * 3 + 1], y - cg), \
908 STORECLAMP(p[(xout) * 3 + 2], y + cb) \
912 #ifdef __LITTLE_ENDIAN
913 #define PIC_16(yin, xin, p, xout, add) \
915 y = outy[(yin) * 8 + xin], \
916 y = ((CLAMP(y + cr + add*2+1) & 0xf8) << 8) | \
917 ((CLAMP(y - cg + add ) & 0xfc) << 3) | \
918 ((CLAMP(y + cb + add*2+1) ) >> 3), \
919 p[(xout) * 2 + 0] = y & 0xff, \
920 p[(xout) * 2 + 1] = y >> 8 \
924 #define PIC_16(yin, xin, p, xout, add) \
926 y = outy[(yin) * 8 + xin], \
927 y = ((CLAMP(y + cr + add*2+1) & 0xf8) << 7) | \
928 ((CLAMP(y - cg + add*2+1) & 0xf8) << 2) | \
929 ((CLAMP(y + cb + add*2+1) ) >> 3), \
930 p[(xout) * 2 + 0] = y >> 8, \
931 p[(xout) * 2 + 1] = y & 0xff \
934 #define PIC_16(yin, xin, p, xout, add) \
936 y = outy[(yin) * 8 + xin], \
937 y = ((CLAMP(y + cr + add*2+1) & 0xf8) << 8) | \
938 ((CLAMP(y - cg + add ) & 0xfc) << 3) | \
939 ((CLAMP(y + cb + add*2+1) ) >> 3), \
940 p[(xout) * 2 + 0] = y >> 8, \
941 p[(xout) * 2 + 1] = y & 0xff \
946 #define PIC_32(yin, xin, p, xout) \
948 y = outy[(yin) * 8 + xin], \
949 STORECLAMP(p[(xout) * 4 + 0], y + cr), \
950 STORECLAMP(p[(xout) * 4 + 1], y - cg), \
951 STORECLAMP(p[(xout) * 4 + 2], y + cb), \
952 p[(xout) * 4 + 3] = 0 \
955 #define PIC221111(xin) \
958 PIC(xin / 4 * 8 + 0, (xin & 3) * 2 + 0, pic0, xin * 2 + 0), \
959 PIC(xin / 4 * 8 + 0, (xin & 3) * 2 + 1, pic0, xin * 2 + 1), \
960 PIC(xin / 4 * 8 + 1, (xin & 3) * 2 + 0, pic1, xin * 2 + 0), \
961 PIC(xin / 4 * 8 + 1, (xin & 3) * 2 + 1, pic1, xin * 2 + 1) \
964 #define PIC221111_16(xin) \
967 PIC_16(xin / 4 * 8 + 0, (xin & 3) * 2 + 0, pic0, xin * 2 + 0, 3), \
968 PIC_16(xin / 4 * 8 + 0, (xin & 3) * 2 + 1, pic0, xin * 2 + 1, 0), \
969 PIC_16(xin / 4 * 8 + 1, (xin & 3) * 2 + 0, pic1, xin * 2 + 0, 1), \
970 PIC_16(xin / 4 * 8 + 1, (xin & 3) * 2 + 1, pic1, xin * 2 + 1, 2) \
973 #define PIC221111_32(xin) \
976 PIC_32(xin / 4 * 8 + 0, (xin & 3) * 2 + 0, pic0, xin * 2 + 0), \
977 PIC_32(xin / 4 * 8 + 0, (xin & 3) * 2 + 1, pic0, xin * 2 + 1), \
978 PIC_32(xin / 4 * 8 + 1, (xin & 3) * 2 + 0, pic1, xin * 2 + 0), \
979 PIC_32(xin / 4 * 8 + 1, (xin & 3) * 2 + 1, pic1, xin * 2 + 1) \
982 static void col221111(int *out, unsigned char *pic, int width)
985 unsigned char *pic0, *pic1;
993 for (i = 2; i > 0; i--) {
994 for (j = 4; j > 0; j--) {
995 for (k = 0; k < 8; k++) {
1003 outy += 64 * 2 - 16 * 4;
1007 static void col221111_16(int *out, unsigned char *pic, int width)
1010 unsigned char *pic0, *pic1;
1017 outc = out + 64 * 4;
1018 for (i = 2; i > 0; i--) {
1019 for (j = 4; j > 0; j--) {
1020 for (k = 0; k < 8; k++) {
1028 outy += 64 * 2 - 16 * 4;
1032 static void col221111_32(int *out, unsigned char *pic, int width)
1035 unsigned char *pic0, *pic1;
1042 outc = out + 64 * 4;
1043 for (i = 2; i > 0; i--) {
1044 for (j = 4; j > 0; j--) {
1045 for (k = 0; k < 8; k++) {
1053 outy += 64 * 2 - 16 * 4;