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