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