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