kusano 7d535a
/* $Id: tif_swab.c,v 1.13 2010-03-10 18:56:49 bfriesen Exp $ */
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * Copyright (c) 1988-1997 Sam Leffler
kusano 7d535a
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
kusano 7d535a
 *
kusano 7d535a
 * Permission to use, copy, modify, distribute, and sell this software and 
kusano 7d535a
 * its documentation for any purpose is hereby granted without fee, provided
kusano 7d535a
 * that (i) the above copyright notices and this permission notice appear in
kusano 7d535a
 * all copies of the software and related documentation, and (ii) the names of
kusano 7d535a
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
kusano 7d535a
 * publicity relating to the software without the specific, prior written
kusano 7d535a
 * permission of Sam Leffler and Silicon Graphics.
kusano 7d535a
 * 
kusano 7d535a
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
kusano 7d535a
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
kusano 7d535a
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
kusano 7d535a
 * 
kusano 7d535a
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
kusano 7d535a
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
kusano 7d535a
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
kusano 7d535a
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
kusano 7d535a
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
kusano 7d535a
 * OF THIS SOFTWARE.
kusano 7d535a
 */
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * TIFF Library Bit & Byte Swapping Support.
kusano 7d535a
 *
kusano 7d535a
 * XXX We assume short = 16-bits and long = 32-bits XXX
kusano 7d535a
 */
kusano 7d535a
#include "tiffiop.h"
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabShort
kusano 7d535a
void
kusano 7d535a
TIFFSwabShort(uint16* wp)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp = (unsigned char*) wp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
	assert(sizeof(uint16)==2);
kusano 7d535a
	t = cp[1]; cp[1] = cp[0]; cp[0] = t;
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabLong
kusano 7d535a
void
kusano 7d535a
TIFFSwabLong(uint32* lp)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp = (unsigned char*) lp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
	assert(sizeof(uint32)==4);
kusano 7d535a
	t = cp[3]; cp[3] = cp[0]; cp[0] = t;
kusano 7d535a
	t = cp[2]; cp[2] = cp[1]; cp[1] = t;
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabLong8
kusano 7d535a
void
kusano 7d535a
TIFFSwabLong8(uint64* lp)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp = (unsigned char*) lp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
	assert(sizeof(uint64)==8);
kusano 7d535a
	t = cp[7]; cp[7] = cp[0]; cp[0] = t;
kusano 7d535a
	t = cp[6]; cp[6] = cp[1]; cp[1] = t;
kusano 7d535a
	t = cp[5]; cp[5] = cp[2]; cp[2] = t;
kusano 7d535a
	t = cp[4]; cp[4] = cp[3]; cp[3] = t;
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfShort
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfShort(register uint16* wp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp;
kusano 7d535a
	register unsigned char t;
kusano 7d535a
	assert(sizeof(uint16)==2);
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char*) wp;
kusano 7d535a
		t = cp[1]; cp[1] = cp[0]; cp[0] = t;
kusano 7d535a
		wp++;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfTriples
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfTriples(register uint8* tp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	unsigned char* cp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char*) tp;
kusano 7d535a
		t = cp[2]; cp[2] = cp[0]; cp[0] = t;
kusano 7d535a
		tp += 3;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfLong
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfLong(register uint32* lp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	register unsigned char *cp;
kusano 7d535a
	register unsigned char t;
kusano 7d535a
	assert(sizeof(uint32)==4);
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char *)lp;
kusano 7d535a
		t = cp[3]; cp[3] = cp[0]; cp[0] = t;
kusano 7d535a
		t = cp[2]; cp[2] = cp[1]; cp[1] = t;
kusano 7d535a
		lp++;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfLong8
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfLong8(register uint64* lp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	register unsigned char *cp;
kusano 7d535a
	register unsigned char t;
kusano 7d535a
	assert(sizeof(uint64)==8);
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char *)lp;
kusano 7d535a
		t = cp[7]; cp[7] = cp[0]; cp[0] = t;
kusano 7d535a
		t = cp[6]; cp[6] = cp[1]; cp[1] = t;
kusano 7d535a
		t = cp[5]; cp[5] = cp[2]; cp[2] = t;
kusano 7d535a
		t = cp[4]; cp[4] = cp[3]; cp[3] = t;
kusano 7d535a
		lp++;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabFloat
kusano 7d535a
void
kusano 7d535a
TIFFSwabFloat(float* fp)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp = (unsigned char*) fp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
	assert(sizeof(float)==4);
kusano 7d535a
	t = cp[3]; cp[3] = cp[0]; cp[0] = t;
kusano 7d535a
	t = cp[2]; cp[2] = cp[1]; cp[1] = t;
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfFloat
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfFloat(register float* fp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	register unsigned char *cp;
kusano 7d535a
	register unsigned char t;
kusano 7d535a
	assert(sizeof(float)==4);
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char *)fp;
kusano 7d535a
		t = cp[3]; cp[3] = cp[0]; cp[0] = t;
kusano 7d535a
		t = cp[2]; cp[2] = cp[1]; cp[1] = t;
kusano 7d535a
		fp++;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabDouble
kusano 7d535a
void
kusano 7d535a
TIFFSwabDouble(double *dp)
kusano 7d535a
{
kusano 7d535a
	register unsigned char* cp = (unsigned char*) dp;
kusano 7d535a
	unsigned char t;
kusano 7d535a
	assert(sizeof(double)==8);
kusano 7d535a
	t = cp[7]; cp[7] = cp[0]; cp[0] = t;
kusano 7d535a
	t = cp[6]; cp[6] = cp[1]; cp[1] = t;
kusano 7d535a
	t = cp[5]; cp[5] = cp[2]; cp[2] = t;
kusano 7d535a
	t = cp[4]; cp[4] = cp[3]; cp[3] = t;
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
#ifndef TIFFSwabArrayOfDouble
kusano 7d535a
void
kusano 7d535a
TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
kusano 7d535a
{
kusano 7d535a
	register unsigned char *cp;
kusano 7d535a
	register unsigned char t;
kusano 7d535a
	assert(sizeof(double)==8);
kusano 7d535a
	/* XXX unroll loop some */
kusano 7d535a
	while (n-- > 0) {
kusano 7d535a
		cp = (unsigned char *)dp;
kusano 7d535a
		t = cp[7]; cp[7] = cp[0]; cp[0] = t;
kusano 7d535a
		t = cp[6]; cp[6] = cp[1]; cp[1] = t;
kusano 7d535a
		t = cp[5]; cp[5] = cp[2]; cp[2] = t;
kusano 7d535a
		t = cp[4]; cp[4] = cp[3]; cp[3] = t;
kusano 7d535a
		dp++;
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
#endif
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * Bit reversal tables.  TIFFBitRevTable[<byte>] gives</byte>
kusano 7d535a
 * the bit reversed value of <byte>.  Used in various</byte>
kusano 7d535a
 * places in the library when the FillOrder requires
kusano 7d535a
 * bit reversal of byte values (e.g. CCITT Fax 3
kusano 7d535a
 * encoding/decoding).  TIFFNoBitRevTable is provided
kusano 7d535a
 * for algorithms that want an equivalent table that
kusano 7d535a
 * do not reverse bit values.
kusano 7d535a
 */
kusano 7d535a
static const unsigned char TIFFBitRevTable[256] = {
kusano 7d535a
    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
kusano 7d535a
    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
kusano 7d535a
    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
kusano 7d535a
    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
kusano 7d535a
    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
kusano 7d535a
    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
kusano 7d535a
    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
kusano 7d535a
    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
kusano 7d535a
    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
kusano 7d535a
    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
kusano 7d535a
    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
kusano 7d535a
    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
kusano 7d535a
    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
kusano 7d535a
    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
kusano 7d535a
    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
kusano 7d535a
    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
kusano 7d535a
    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
kusano 7d535a
    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
kusano 7d535a
    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
kusano 7d535a
    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
kusano 7d535a
    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
kusano 7d535a
    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
kusano 7d535a
    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
kusano 7d535a
    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
kusano 7d535a
    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
kusano 7d535a
    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
kusano 7d535a
    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
kusano 7d535a
    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
kusano 7d535a
    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
kusano 7d535a
    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
kusano 7d535a
    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
kusano 7d535a
    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
kusano 7d535a
};
kusano 7d535a
static const unsigned char TIFFNoBitRevTable[256] = {
kusano 7d535a
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
kusano 7d535a
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 
kusano 7d535a
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 
kusano 7d535a
    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 
kusano 7d535a
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 
kusano 7d535a
    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 
kusano 7d535a
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
kusano 7d535a
    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 
kusano 7d535a
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 
kusano 7d535a
    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 
kusano 7d535a
    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 
kusano 7d535a
    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 
kusano 7d535a
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 
kusano 7d535a
    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 
kusano 7d535a
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 
kusano 7d535a
    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 
kusano 7d535a
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 
kusano 7d535a
    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 
kusano 7d535a
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 
kusano 7d535a
    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 
kusano 7d535a
    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 
kusano 7d535a
    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 
kusano 7d535a
    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 
kusano 7d535a
    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 
kusano 7d535a
    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 
kusano 7d535a
    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 
kusano 7d535a
    0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 
kusano 7d535a
    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 
kusano 7d535a
    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 
kusano 7d535a
    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 
kusano 7d535a
    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 
kusano 7d535a
    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 
kusano 7d535a
};
kusano 7d535a
kusano 7d535a
const unsigned char*
kusano 7d535a
TIFFGetBitRevTable(int reversed)
kusano 7d535a
{
kusano 7d535a
	return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
void
kusano 7d535a
TIFFReverseBits(uint8* cp, tmsize_t n)  
kusano 7d535a
{
kusano 7d535a
	for (; n > 8; n -= 8) {
kusano 7d535a
		cp[0] = TIFFBitRevTable[cp[0]];
kusano 7d535a
		cp[1] = TIFFBitRevTable[cp[1]];
kusano 7d535a
		cp[2] = TIFFBitRevTable[cp[2]];
kusano 7d535a
		cp[3] = TIFFBitRevTable[cp[3]];
kusano 7d535a
		cp[4] = TIFFBitRevTable[cp[4]];
kusano 7d535a
		cp[5] = TIFFBitRevTable[cp[5]];
kusano 7d535a
		cp[6] = TIFFBitRevTable[cp[6]];
kusano 7d535a
		cp[7] = TIFFBitRevTable[cp[7]];
kusano 7d535a
		cp += 8;
kusano 7d535a
	}
kusano 7d535a
	while (n-- > 0)
kusano 7d535a
		*cp = TIFFBitRevTable[*cp], cp++;
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
/* vim: set ts=8 sts=8 sw=8 noet: */
kusano 7d535a
/*
kusano 7d535a
 * Local Variables:
kusano 7d535a
 * mode: c
kusano 7d535a
 * c-basic-offset: 8
kusano 7d535a
 * fill-column: 78
kusano 7d535a
 * End:
kusano 7d535a
 */