Blame libtiff/tif_swab.c

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