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