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