blob: 320ecfd8fa356f05df8ffead8c3c36134304a677 [file] [log] [blame]
/*
* Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* FUNCTION
* mlib_ImageLookUp_U8D64 - table lookup
* mlib_ImageLookUp_S16D64 - table lookup
* mlib_ImageLookUp_U16D64 - table lookup
* mlib_ImageLookUp_S32D64 - table lookup
*
* SYNOPSIS
* void mlib_ImageLookUp_U8_D64(src, slb,
* dst, dlb,
* xsize, ysize,
* csize, table)
*
* void mlib_ImageLookUp_S16_D64(src, slb,
* dst, dlb,
* xsize, ysize,
* csize, table)
*
* void mlib_ImageLookUp_U16_D64(src, slb,
* dst, dlb,
* xsize, ysize,
* csize, table)
*
* void mlib_ImageLookUp_S32_D64(src, slb,
* dst, dlb,
* xsize, ysize,
* csize, table)
*
* ARGUMENT
* src pointer to input image (BYTE, SHORT, USHORT, INT)
* slb stride of input image (in pixels)
* dst pointer to output image (DOUBLE)
* dlb stride of output image (in pixels)
* xsize image width
* ysize image height
* csize number of channels
* table lookup table
*
* DESCRIPTION
* dst = table[src] (c, vis version)
*/
#include "mlib_image.h"
#include "mlib_ImageLookUp.h"
/***************************************************************/
#define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE) \
{ \
mlib_s32 i, j, k; \
\
if (xsize < 2) { \
for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
for(k = 0; k < csize; k++) { \
DTYPE *da = dst + k; \
const STYPE *sa = src + k; \
DTYPE *tab = (DTYPE*) TABLE[k]; \
\
for(i = 0; i < xsize; i++, da += csize, sa += csize) \
*da=tab[*sa]; \
} \
} \
} else { \
for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
for(k = 0; k < csize; k++) { \
DTYPE *da = dst + k; \
const STYPE *sa = src + k; \
DTYPE *tab = (DTYPE*) TABLE[k]; \
mlib_s32 s0, s1; \
DTYPE t0, t1; \
\
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[csize]; \
sa += 2*csize; \
\
for(i = 0; \
i < xsize - 3; \
i+=2, da += 2*csize, sa += 2*csize) { \
t0 = tab[s0]; \
t1 = tab[s1]; \
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[csize]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
} \
t0 = tab[s0]; \
t1 = tab[s1]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
if (xsize & 1) da[2*csize] = tab[sa[0]]; \
} \
} \
} \
}
/***************************************************************/
#define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE) \
{ \
mlib_s32 i, j, k; \
\
if (xsize < 2) { \
for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
for(k = 0; k < csize; k++) { \
DTYPE *da = dst + k; \
const STYPE *sa = (void *)src; \
DTYPE *tab = (DTYPE*) TABLE[k]; \
\
for(i = 0; i < xsize; i++, da += csize, sa ++) \
*da=tab[*sa]; \
} \
} \
} else { \
for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
for(k = 0; k < csize; k++) { \
DTYPE *da = dst + k; \
const STYPE *sa = (void *)src; \
DTYPE *tab = (DTYPE*) TABLE[k]; \
mlib_s32 s0, s1; \
DTYPE t0, t1; \
\
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[1]; \
sa += 2; \
\
for(i = 0; \
i < xsize - 3; \
i+=2, da += 2*csize, sa += 2) { \
t0 = tab[s0]; \
t1 = tab[s1]; \
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[1]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
} \
t0 = tab[s0]; \
t1 = tab[s1]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
if (xsize & 1) da[2*csize] = tab[sa[0]]; \
} \
} \
} \
}
/***************************************************************/
#ifdef _LITTLE_ENDIAN
#define READ_U8_D64(table0, table1, table2, table3) \
t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 << 3) & 0x7F8)); \
t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 5) & 0x7F8)); \
t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 13) & 0x7F8)); \
t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 >> 21) & 0x7F8))
#else
#define READ_U8_D64(table0, table1, table2, table3) \
t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 >> 21) & 0x7F8)); \
t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 13) & 0x7F8)); \
t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 5) & 0x7F8)); \
t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 << 3) & 0x7F8))
#endif /* _LITTLE_ENDIAN */
/***************************************************************/
void mlib_ImageLookUp_U8_D64(const mlib_u8 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
if (xsize * csize < 7) {
MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u8, table);
}
else if (csize == 1) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab = (mlib_d64 *) table[0];
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
for (i = 0; i < off; i++, sp++) {
*dp++ = tab[sp[0]];
size--;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
READ_U8_D64(tab, tab, tab, tab);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_D64(tab, tab, tab, tab);
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp += 4;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, dp++, sp++)
dp[0] = tab[sp[0]];
}
}
else if (csize == 2) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_d64 *tab;
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 2;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
for (i = 0; i < off - 1; i += 2, sp += 2) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
size -= 2;
}
if ((off & 1) != 0) {
*dp++ = tab0[*sp];
size--;
sp++;
tab = tab0;
tab0 = tab1;
tab1 = tab;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
READ_U8_D64(tab0, tab1, tab0, tab1);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_D64(tab0, tab1, tab0, tab1);
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp += 4;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size - 1; i += 2, sp += 2) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
}
if (i < size)
*dp = tab0[(*sp)];
}
}
else if (csize == 3) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_d64 *tab2 = (mlib_d64 *) table[2];
mlib_d64 *tab;
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 3;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
if (off == 1) {
*dp++ = tab0[(*sp)];
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
size--;
sp++;
}
else if (off == 2) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
tab = tab2;
tab2 = tab1;
tab1 = tab0;
tab0 = tab;
size -= 2;
sp += 2;
}
else if (off == 3) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
*dp++ = tab2[sp[2]];
size -= 3;
sp += 3;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
READ_U8_D64(tab0, tab1, tab2, tab0);
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_D64(tab0, tab1, tab2, tab0);
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp += 4;
sp = (mlib_u8 *) sa;
i += 4;
if (i < size) {
*dp++ = tab1[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab2[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab0[(*sp)];
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_d64 *tab2 = (mlib_d64 *) table[2];
mlib_d64 *tab3 = (mlib_d64 *) table[3];
mlib_d64 *tab;
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 4;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
if (off == 1) {
*dp++ = tab0[(*sp)];
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab3;
tab3 = tab;
size--;
sp++;
}
else if (off == 2) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
tab = tab0;
tab0 = tab2;
tab2 = tab;
tab = tab1;
tab1 = tab3;
tab3 = tab;
size -= 2;
sp += 2;
}
else if (off == 3) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[1]];
*dp++ = tab2[sp[2]];
tab = tab3;
tab3 = tab2;
tab2 = tab1;
tab1 = tab0;
tab0 = tab;
size -= 3;
sp += 3;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
READ_U8_D64(tab0, tab1, tab2, tab3);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_D64(tab0, tab1, tab2, tab3);
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp += 4;
sp = (mlib_u8 *) sa;
i += 4;
if (i < size) {
*dp++ = tab0[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab1[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab2[(*sp)];
}
}
}
}
/***************************************************************/
void mlib_ImageLookUp_S16_D64(const mlib_s16 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s16, table_base);
}
/***************************************************************/
void mlib_ImageLookUp_U16_D64(const mlib_u16 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u16, table_base);
}
/***************************************************************/
void mlib_ImageLookUp_S32_D64(const mlib_s32 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s32, table_base);
}
/***************************************************************/
void mlib_ImageLookUpSI_U8_D64(const mlib_u8 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
if (xsize < 7) {
MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u8, table);
}
else if (csize == 2) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
for (i = 0; i < off; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
size--;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 8, sa++) {
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
dp[4] = t0;
dp[5] = t1;
dp[6] = t2;
dp[7] = t3;
}
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[4] = t0;
dp[5] = t1;
dp[6] = t2;
dp[7] = t3;
dp += 8;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
}
}
}
else if (csize == 3) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_d64 *tab2 = (mlib_d64 *) table[2];
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3, t4, t5;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
for (i = 0; i < off; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
*dp++ = tab2[sp[0]];
size--;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 12, sa++) {
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp[4] = t4;
dp[5] = t5;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
dp[6] = t0;
dp[7] = t1;
dp[8] = t2;
dp[9] = t3;
dp[10] = t4;
dp[11] = t5;
}
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
dp[4] = t4;
dp[5] = t5;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[6] = t0;
dp[7] = t1;
dp[8] = t2;
dp[9] = t3;
dp[10] = t4;
dp[11] = t5;
dp += 12;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
*dp++ = tab2[sp[0]];
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_d64 *tab0 = (mlib_d64 *) table[0];
mlib_d64 *tab1 = (mlib_d64 *) table[1];
mlib_d64 *tab2 = (mlib_d64 *) table[2];
mlib_d64 *tab3 = (mlib_d64 *) table[3];
mlib_u32 s0;
mlib_d64 t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_d64 *dp = (mlib_d64 *) dst;
mlib_u8 *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
for (i = 0; i < off; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
*dp++ = tab2[sp[0]];
*dp++ = tab3[sp[0]];
size--;
}
sa = (mlib_u32 *) sp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[4] = t0;
dp[5] = t1;
dp[6] = t2;
dp[7] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[8] = t0;
dp[9] = t1;
dp[10] = t2;
dp[11] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
dp[12] = t0;
dp[13] = t1;
dp[14] = t2;
dp[15] = t3;
}
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[4] = t0;
dp[5] = t1;
dp[6] = t2;
dp[7] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[8] = t0;
dp[9] = t1;
dp[10] = t2;
dp[11] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
#else
t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
#endif /* _LITTLE_ENDIAN */
dp[12] = t0;
dp[13] = t1;
dp[14] = t2;
dp[15] = t3;
dp += 16;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, sp++) {
*dp++ = tab0[sp[0]];
*dp++ = tab1[sp[0]];
*dp++ = tab2[sp[0]];
*dp++ = tab3[sp[0]];
}
}
}
}
/***************************************************************/
void mlib_ImageLookUpSI_S16_D64(const mlib_s16 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s16, table_base);
}
/***************************************************************/
void mlib_ImageLookUpSI_U16_D64(const mlib_u16 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u16, table_base);
}
/***************************************************************/
void mlib_ImageLookUpSI_S32_D64(const mlib_s32 *src,
mlib_s32 slb,
mlib_d64 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_d64 **table)
{
const mlib_d64 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s32, table_base);
}
/***************************************************************/