1 /* PDFlib GmbH cvsid: $Id: tif_swab.c,v 1.9 2005/12/19 18:36:55 rjs Exp $ */
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 
34 void
TIFFSwabShort(uint16 * wp)35 TIFFSwabShort(uint16* wp)
36 {
37 	register unsigned char* cp = (unsigned char*) wp;
38 	unsigned char t;
39 
40 	t = cp[1]; cp[1] = cp[0]; cp[0] = t;
41 }
42 
43 void
TIFFSwabLong(uint32 * lp)44 TIFFSwabLong(uint32* lp)
45 {
46 	register unsigned char* cp = (unsigned char*) lp;
47 	unsigned char 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 
53 void
TIFFSwabArrayOfShort(uint16 * wp,register unsigned long n)54 TIFFSwabArrayOfShort(uint16* wp, register unsigned long n)
55 {
56 	register unsigned char* cp;
57 	register unsigned char t;
58 
59 	/* XXX unroll loop some */
60 	while (n-- > 0) {
61 		cp = (unsigned char*) wp;
62 		t = cp[1]; cp[1] = cp[0]; cp[0] = t;
63 		wp++;
64 	}
65 }
66 
67 void
TIFFSwabArrayOfTriples(uint8 * tp,unsigned long n)68 TIFFSwabArrayOfTriples(uint8* tp, unsigned long n)
69 {
70        unsigned char* cp;
71        unsigned char t;
72 
73        /* XXX unroll loop some */
74        while (n-- > 0) {
75                cp = (unsigned char*) tp;
76                t = cp[2]; cp[2] = cp[0]; cp[0] = t;
77                tp += 3;
78        }
79 }
80 
81 void
TIFFSwabArrayOfLong(register uint32 * lp,register unsigned long n)82 TIFFSwabArrayOfLong(register uint32* lp, register unsigned long n)
83 {
84 	register unsigned char *cp;
85 	register unsigned char t;
86 
87 	/* XXX unroll loop some */
88 	while (n-- > 0) {
89 		cp = (unsigned char *)lp;
90 		t = cp[3]; cp[3] = cp[0]; cp[0] = t;
91 		t = cp[2]; cp[2] = cp[1]; cp[1] = t;
92 		lp++;
93 	}
94 }
95 
96 void
TIFFSwabDouble(double * dp)97 TIFFSwabDouble(double *dp)
98 {
99         register uint32* lp = (uint32*) dp;
100         uint32 t;
101 
102 	TIFFSwabArrayOfLong(lp, 2);
103 	t = lp[0]; lp[0] = lp[1]; lp[1] = t;
104 }
105 
106 void
TIFFSwabArrayOfDouble(double * dp,register unsigned long n)107 TIFFSwabArrayOfDouble(double* dp, register unsigned long n)
108 {
109 	register uint32* lp = (uint32*) dp;
110         register uint32 t;
111 
112 	TIFFSwabArrayOfLong(lp, n + n);
113         while (n-- > 0) {
114 		t = lp[0]; lp[0] = lp[1]; lp[1] = t;
115                 lp += 2;
116         }
117 }
118 
119 /*
120  * Bit reversal tables.  TIFFBitRevTable[<byte>] gives
121  * the bit reversed value of <byte>.  Used in various
122  * places in the library when the FillOrder requires
123  * bit reversal of byte values (e.g. CCITT Fax 3
124  * encoding/decoding).  TIFFNoBitRevTable is provided
125  * for algorithms that want an equivalent table that
126  * do not reverse bit values.
127  */
128 static const unsigned char TIFFBitRevTable[256] = {
129     0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
130     0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
131     0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
132     0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
133     0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
134     0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
135     0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
136     0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
137     0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
138     0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
139     0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
140     0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
141     0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
142     0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
143     0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
144     0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
145     0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
146     0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
147     0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
148     0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
149     0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
150     0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
151     0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
152     0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
153     0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
154     0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
155     0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
156     0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
157     0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
158     0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
159     0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
160     0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
161 };
162 static const unsigned char TIFFNoBitRevTable[256] = {
163     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
164     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
165     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
166     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
167     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
168     0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
169     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
170     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
171     0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
172     0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
173     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
174     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
175     0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
176     0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
177     0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
178     0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
179     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
180     0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
181     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
182     0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
183     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
184     0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
185     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
186     0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
187     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
188     0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
189     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
190     0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
191     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
192     0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
193     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
194     0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
195 };
196 
197 const unsigned char*
TIFFGetBitRevTable(int reversed)198 TIFFGetBitRevTable(int reversed)
199 {
200 	return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
201 }
202 
203 void
TIFFReverseBits(register unsigned char * cp,register unsigned long n)204 TIFFReverseBits(register unsigned char* cp, register unsigned long n)
205 {
206 	for (; n > 8; n -= 8) {
207 		cp[0] = TIFFBitRevTable[cp[0]];
208 		cp[1] = TIFFBitRevTable[cp[1]];
209 		cp[2] = TIFFBitRevTable[cp[2]];
210 		cp[3] = TIFFBitRevTable[cp[3]];
211 		cp[4] = TIFFBitRevTable[cp[4]];
212 		cp[5] = TIFFBitRevTable[cp[5]];
213 		cp[6] = TIFFBitRevTable[cp[6]];
214 		cp[7] = TIFFBitRevTable[cp[7]];
215 		cp += 8;
216 	}
217 	while (n-- > 0)
218 		*cp = TIFFBitRevTable[*cp], cp++;
219 }
220 
221 /* vim: set ts=8 sts=8 sw=8 noet: */
222