Blame libtiff/tif_swab.c

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