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