1/* PDFlib GmbH cvsid: $Id: tif_swab.c 14574 2005-10-29 16:27:43Z bonefish $ */
2
3/*
4 * Copyright (c) 1988-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27/*
28 * TIFF Library Bit & Byte Swapping Support.
29 *
30 * XXX We assume short = 16-bits and long = 32-bits XXX
31 */
32#include "tiffiop.h"
33
34void
35TIFFSwabShort(uint16* wp)
36{
37	register tif_char* cp = (tif_char*) wp;
38	int t;
39
40	t = cp[1]; cp[1] = cp[0]; cp[0] = t;
41}
42
43void
44TIFFSwabLong(uint32* lp)
45{
46	register tif_char* cp = (tif_char*) lp;
47	int t;
48
49	t = cp[3]; cp[3] = cp[0]; cp[0] = t;
50	t = cp[2]; cp[2] = cp[1]; cp[1] = t;
51}
52
53void
54TIFFSwabArrayOfShort(uint16* wp, register tif_long n)
55{
56	register tif_char* cp;
57	register int t;
58
59	/* XXX unroll loop some */
60	while (n-- > 0) {
61		cp = (tif_char*) wp;
62		t = cp[1]; cp[1] = cp[0]; cp[0] = t;
63		wp++;
64	}
65}
66
67void
68TIFFSwabArrayOfLong(register uint32* lp, register tif_long n)
69{
70	register unsigned char *cp;
71	register int t;
72
73	/* XXX unroll loop some */
74	while (n-- > 0) {
75		cp = (unsigned char *)lp;
76		t = cp[3]; cp[3] = cp[0]; cp[0] = t;
77		t = cp[2]; cp[2] = cp[1]; cp[1] = t;
78		lp++;
79	}
80}
81
82void
83TIFFSwabDouble(double *dp)
84{
85        register uint32* lp = (uint32*) dp;
86        uint32 t;
87
88	TIFFSwabArrayOfLong(lp, 2);
89	t = lp[0]; lp[0] = lp[1]; lp[1] = t;
90}
91
92void
93TIFFSwabArrayOfDouble(double* dp, register tif_long n)
94{
95	register uint32* lp = (uint32*) dp;
96        register uint32 t;
97
98	TIFFSwabArrayOfLong(lp, n + n);
99        while (n-- > 0) {
100		t = lp[0]; lp[0] = lp[1]; lp[1] = t;
101                lp += 2;
102        }
103}
104
105/*
106 * Bit reversal tables.  TIFFBitRevTable[<byte>] gives
107 * the bit reversed value of <byte>.  Used in various
108 * places in the library when the FillOrder requires
109 * bit reversal of byte values (e.g. CCITT Fax 3
110 * encoding/decoding).  TIFFNoBitRevTable is provided
111 * for algorithms that want an equivalent table that
112 * do not reverse bit values.
113 */
114static const unsigned char TIFFBitRevTable[256] = {
115    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
116    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
117    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
118    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
119    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
120    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
121    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
122    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
123    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
124    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
125    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
126    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
127    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
128    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
129    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
130    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
131    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
132    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
133    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
134    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
135    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
136    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
137    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
138    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
139    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
140    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
141    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
142    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
143    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
144    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
145    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
146    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
147};
148static const unsigned char TIFFNoBitRevTable[256] = {
149    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
150    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
151    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
152    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
153    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
154    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
155    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
156    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
157    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
158    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
159    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
160    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
161    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
162    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
163    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
164    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
165    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
166    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
167    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
168    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
169    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
170    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
171    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
172    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
173    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
174    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
175    0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
176    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
177    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
178    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
179    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
180    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
181};
182
183const unsigned char*
184TIFFGetBitRevTable(int reversed)
185{
186	return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
187}
188
189void
190TIFFReverseBits(register tif_char* cp, register tif_long n)
191{
192	for (; n > 8; n -= 8) {
193		cp[0] = TIFFBitRevTable[cp[0]];
194		cp[1] = TIFFBitRevTable[cp[1]];
195		cp[2] = TIFFBitRevTable[cp[2]];
196		cp[3] = TIFFBitRevTable[cp[3]];
197		cp[4] = TIFFBitRevTable[cp[4]];
198		cp[5] = TIFFBitRevTable[cp[5]];
199		cp[6] = TIFFBitRevTable[cp[6]];
200		cp[7] = TIFFBitRevTable[cp[7]];
201		cp += 8;
202	}
203	while (n-- > 0)
204		*cp = TIFFBitRevTable[*cp], cp++;
205}
206