/*
* Copyright (c) 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.
*/
#include "mlib_image.h"
#include "mlib_ImageLookUp.h"
#include "mlib_c_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, t0, s1, 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 = (mlib_s32)tab[s0]; \
t1 = (mlib_s32)tab[s1]; \
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[csize]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
} \
t0 = (mlib_s32)tab[s0]; \
t1 = (mlib_s32)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, t0, s1, 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 = (mlib_s32)tab[s0]; \
t1 = (mlib_s32)tab[s1]; \
s0 = (mlib_s32)sa[0]; \
s1 = (mlib_s32)sa[1]; \
da[0] = (DTYPE)t0; \
da[csize] = (DTYPE)t1; \
} \
t0 = (mlib_s32)tab[s0]; \
t1 = (mlib_s32)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_U8_ALIGN(table0, table1, table2, table3) \
t3 = table0[s0 & 0xFF]; \
t2 = table1[s0>>8]; \
t1 = table2[s1 & 0xFF]; \
t0 = table3[s1>>8]
/***************************************************************/
#define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
t3 = table0[s0 >> 8]; \
t2 = table1[s1 & 0xFF]; \
t1 = table2[s1 >> 8]; \
t0 = table3[s2 & 0xFF]
/***************************************************************/
#define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 << 1) & 0x1FE)); \
t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 15) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 >> 23) & 0x1FE))
/***************************************************************/
#define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 7) & 0x1FE)); \
t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 23) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 << 1) & 0x1FE))
/***************************************************************/
#define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 7) & 0x1FE)); \
t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 15) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 >> 23) & 0x1FE))
/***************************************************************/
#define READ_U8_S32(table0, table1, table2, table3) \
t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 << 2) & 0x3FC)); \
t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 6) & 0x3FC)); \
t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 14) & 0x3FC)); \
t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 >> 22) & 0x3FC))
#else /* _LITTLE_ENDIAN */
/***********/
#define READ_U8_U8_ALIGN(table0, table1, table2, table3) \
t0 = table0[s0>>8]; \
t1 = table1[s0 & 0xFF]; \
t2 = table2[s1>>8]; \
t3 = table3[s1 & 0xFF]
/***************************************************************/
#define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
t0 = table0[s0 & 0xFF]; \
t1 = table1[s1 >> 8]; \
t2 = table2[s1 & 0xFF]; \
t3 = table3[s2 >> 8]
/***************************************************************/
#define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 23) & 0x1FE)); \
t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 7) & 0x1FE)); \
t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 << 1) & 0x1FE))
/***************************************************************/
#define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 15) & 0x1FE)); \
t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 << 1) & 0x1FE)); \
t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 >> 23) & 0x1FE))
/***************************************************************/
#define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 15) & 0x1FE)); \
t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 7) & 0x1FE)); \
t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 << 1) & 0x1FE))
/***************************************************************/
#define READ_U8_S32(table0, table1, table2, table3) \
t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 >> 22) & 0x3FC)); \
t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 14) & 0x3FC)); \
t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 6) & 0x3FC)); \
t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 << 2) & 0x3FC))
#endif /* _LITTLE_ENDIAN */
/***************************************************************/
void mlib_c_ImageLookUp_U8_U8(const mlib_u8 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
if (xsize * csize < 9) {
MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u8, table);
}
else if (csize == 1) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *sa;
mlib_u8 *tab = (mlib_u8 *) table[0];
mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_u8 *dp = dst, *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
for (i = 0; i < off; i++, sp++) {
*dp++ = tab[sp[0]];
size--;
}
da = (mlib_u32 *) dp;
if (((mlib_addr) sp & 1) == 0) {
sa = (mlib_u16 *) sp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
READ_U8_U8_ALIGN(tab, tab, tab, tab);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
READ_U8_U8_ALIGN(tab, tab, tab, tab);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, dp++, sp++)
dp[0] = tab[sp[0]];
}
else {
sa = (mlib_u16 *) (sp - 1);
s0 = sa[0];
s1 = sa[1];
s2 = sa[2];
sa += 3;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = s2;
s1 = sa[0];
s2 = sa[1];
da[0] = t;
}
READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
#ifdef _LITTLE_ENDIAN
*dp++ = tab[s2 >> 8];
#else
*dp++ = tab[s2 & 0xFF];
#endif /* _LITTLE_ENDIAN */
sp = (mlib_u8 *) sa;
i += 5;
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 *da;
mlib_u16 *sa;
mlib_u8 *tab0 = (mlib_u8 *) table[0];
mlib_u8 *tab1 = (mlib_u8 *) table[1];
mlib_u8 *tab;
mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
mlib_s32 off;
mlib_s32 size = xsize * 2;
mlib_u8 *dp = dst, *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) dst & 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[0]];
size--;
sp++;
tab = tab0;
tab0 = tab1;
tab1 = tab;
}
da = (mlib_u32 *) dp;
if (((mlib_addr) sp & 1) == 0) {
sa = (mlib_u16 *) sp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
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 {
sa = (mlib_u16 *) (sp - 1);
s0 = sa[0];
s1 = sa[1];
s2 = sa[2];
sa += 3;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = s2;
s1 = sa[0];
s2 = sa[1];
da[0] = t;
}
READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
#ifdef _LITTLE_ENDIAN
*dp++ = tab0[s2 >> 8];
#else
*dp++ = tab0[s2 & 0xFF];
#endif /* _LITTLE_ENDIAN */
sp = (mlib_u8 *) sa;
i += 5;
for (; i < size - 1; i += 2, sp += 2) {
*dp++ = tab1[sp[0]];
*dp++ = tab0[sp[1]];
}
if (i < size)
*dp = tab1[(*sp)];
}
}
}
else if (csize == 3) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *sa;
mlib_u8 *tab0 = (mlib_u8 *) table[0];
mlib_u8 *tab1 = (mlib_u8 *) table[1];
mlib_u8 *tab2 = (mlib_u8 *) table[2];
mlib_u8 *tab;
mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
mlib_s32 off;
mlib_s32 size = xsize * 3;
mlib_u8 *dp = dst, *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
if (off == 1) {
*dp++ = tab0[sp[0]];
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;
}
da = (mlib_u32 *) dp;
if (((mlib_addr) sp & 1) == 0) {
sa = (mlib_u16 *) sp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
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 {
sa = (mlib_u16 *) (sp - 1);
s0 = sa[0];
s1 = sa[1];
s2 = sa[2];
sa += 3;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
s0 = s2;
s1 = sa[0];
s2 = sa[1];
da[0] = t;
}
READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
#ifdef _LITTLE_ENDIAN
*dp++ = tab1[s2 >> 8];
#else
*dp++ = tab1[s2 & 0xFF];
#endif /* _LITTLE_ENDIAN */
sp = (mlib_u8 *) sa;
i += 5;
if (i < size) {
*dp++ = tab2[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab0[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab1[(*sp)];
}
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *sa;
mlib_u8 *tab0 = (mlib_u8 *) table[0];
mlib_u8 *tab1 = (mlib_u8 *) table[1];
mlib_u8 *tab2 = (mlib_u8 *) table[2];
mlib_u8 *tab3 = (mlib_u8 *) table[3];
mlib_u8 *tab;
mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
mlib_s32 off;
mlib_s32 size = xsize * 4;
mlib_u8 *dp = dst, *sp = (void *)src;
off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
if (off == 1) {
*dp++ = tab0[sp[0]];
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;
}
da = (mlib_u32 *) dp;
if (((mlib_addr) sp & 1) == 0) {
sa = (mlib_u16 *) sp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
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)];
}
}
else {
sa = (mlib_u16 *) (sp - 1);
s0 = sa[0];
s1 = sa[1];
s2 = sa[2];
sa += 3;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
s0 = s2;
s1 = sa[0];
s2 = sa[1];
da[0] = t;
}
READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
da[0] = t;
da++;
dp = (mlib_u8 *) da;
#ifdef _LITTLE_ENDIAN
*dp++ = tab0[s2 >> 8];
#else
*dp++ = tab0[s2 & 0xFF];
#endif /* _LITTLE_ENDIAN */
sp = (mlib_u8 *) sa;
i += 5;
if (i < size) {
*dp++ = tab1[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab2[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab3[(*sp)];
}
}
}
}
}
/***************************************************************/
void mlib_c_ImageLookUp_S16_U8(const mlib_s16 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U16_U8(const mlib_u16 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_S32_U8(const mlib_s32 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U8_S16(const mlib_u8 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
if (xsize * csize < 12) {
MLIB_C_IMAGELOOKUP(mlib_s16, 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_u32 *da;
mlib_u16 *tab = (mlib_u16 *) table[0];
mlib_u32 s0, s1, t0, t1, t2, t3;
mlib_u32 res1, res2;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_u16 *dp = (mlib_u16 *) 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;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
READ_U8_S16_ALIGN(tab, tab, tab, tab);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s0 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_ALIGN(tab, tab, tab, tab);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
da += 2;
dp = (mlib_u16 *) da;
sp = (mlib_u8 *) sa;
i += 4;
for (; i < size; i++, dp++, sp++)
dp[0] = tab[sp[0]];
}
else {
*dp++ = tab[(*sp)];
size--;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
s0 = s1;
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s1 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
ADD_READ_U8_S16_NOTALIGN(tab, tab, tab);
res1 = (t0 << 16) + t1;
da[2] = res1;
da += 3;
dp = (mlib_u16 *) da;
*dp++ = (mlib_u16) t2;
sp = (mlib_u8 *) sa;
i += 7;
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_u32 *da;
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_u16 *tab;
mlib_u32 s0, s1, t0, t1, t2, t3;
mlib_u32 res1, res2;
mlib_s32 off;
mlib_s32 size = xsize * 2;
mlib_u16 *dp = (mlib_u16 *) 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;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s0 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
da += 2;
dp = (mlib_u16 *) da;
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 {
*dp++ = tab0[(*sp)];
size--;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
s0 = s1;
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s1 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
ADD_READ_U8_S16_NOTALIGN(tab1, tab0, tab1);
res1 = (t0 << 16) + t1;
da[2] = res1;
da += 3;
dp = (mlib_u16 *) da;
*dp++ = (mlib_u16) t2;
sp = (mlib_u8 *) sa;
i += 7;
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_u32 *da;
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_u16 *tab2 = (mlib_u16 *) table[2];
mlib_u16 *tab;
mlib_u32 s0, s1, t0, t1, t2, t3;
mlib_u32 res1, res2;
mlib_s32 off;
mlib_s32 size = xsize * 3;
mlib_u16 *dp = (mlib_u16 *) 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;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
s0 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
da += 2;
dp = (mlib_u16 *) da;
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 {
*dp++ = tab0[(*sp)];
size--;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
s0 = s1;
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
tab = tab0;
tab0 = tab1;
tab1 = tab2;
tab2 = tab;
s1 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
ADD_READ_U8_S16_NOTALIGN(tab2, tab0, tab1);
res1 = (t0 << 16) + t1;
da[2] = res1;
da += 3;
dp = (mlib_u16 *) da;
*dp++ = (mlib_u16) t2;
sp = (mlib_u8 *) sa;
i += 7;
if (i < size) {
*dp++ = tab2[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab0[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab1[(*sp)];
}
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *sa;
mlib_u32 *da;
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_u16 *tab2 = (mlib_u16 *) table[2];
mlib_u16 *tab3 = (mlib_u16 *) table[3];
mlib_u16 *tab;
mlib_u32 s0, s1, t0, t1, t2, t3;
mlib_u32 res1, res2;
mlib_s32 off;
mlib_s32 size = xsize * 4;
mlib_u16 *dp = (mlib_u16 *) 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;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s0 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
da += 2;
dp = (mlib_u16 *) da;
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)];
}
}
else {
*dp++ = tab0[(*sp)];
size--;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
s0 = s1;
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
s1 = sa[0];
da[0] = res1;
da[1] = res2;
}
READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
res1 = (t0 << 16) + t1;
res2 = (t2 << 16) + t3;
da[0] = res1;
da[1] = res2;
ADD_READ_U8_S16_NOTALIGN(tab1, tab2, tab3);
res1 = (t0 << 16) + t1;
da[2] = res1;
da += 3;
dp = (mlib_u16 *) da;
*dp++ = (mlib_u16) t2;
sp = (mlib_u8 *) sa;
i += 7;
if (i < size) {
*dp++ = tab0[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp++ = tab1[(*sp)];
i++;
sp++;
}
if (i < size) {
*dp = tab2[(*sp)];
}
}
}
}
}
/***************************************************************/
void mlib_c_ImageLookUp_S16_S16(const mlib_s16 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U16_S16(const mlib_u16 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUP(mlib_s16, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_S32_S16(const mlib_s32 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_S16_U16(const mlib_s16 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U16_U16(const mlib_u16 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUP(mlib_u16, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_S32_U16(const mlib_s32 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U8_S32(const mlib_u8 *src,
mlib_s32 slb,
mlib_s32 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s32 **table)
{
if (xsize * csize < 7) {
MLIB_C_IMAGELOOKUP(mlib_s32, 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_u32 *tab = (mlib_u32 *) table[0];
mlib_u32 s0, t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_u32 *dp = (mlib_u32 *) 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_S32(tab, tab, tab, tab);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_S32(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_u32 *tab0 = (mlib_u32 *) table[0];
mlib_u32 *tab1 = (mlib_u32 *) table[1];
mlib_u32 *tab;
mlib_u32 s0, t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 2;
mlib_u32 *dp = (mlib_u32 *) 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_S32(tab0, tab1, tab0, tab1);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_S32(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_u32 *tab0 = (mlib_u32 *) table[0];
mlib_u32 *tab1 = (mlib_u32 *) table[1];
mlib_u32 *tab2 = (mlib_u32 *) table[2];
mlib_u32 *tab;
mlib_u32 s0, t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 3;
mlib_u32 *dp = (mlib_u32 *) 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_S32(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_S32(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_u32 *tab0 = (mlib_u32 *) table[0];
mlib_u32 *tab1 = (mlib_u32 *) table[1];
mlib_u32 *tab2 = (mlib_u32 *) table[2];
mlib_u32 *tab3 = (mlib_u32 *) table[3];
mlib_u32 *tab;
mlib_u32 s0, t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize * 4;
mlib_u32 *dp = (mlib_u32 *) 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_S32(tab0, tab1, tab2, tab3);
s0 = sa[0];
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
}
READ_U8_S32(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_c_ImageLookUp_S16_S32(const mlib_s16 *src,
mlib_s32 slb,
mlib_s32 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s32 **table)
{
const mlib_s32 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUP(mlib_s32, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_U16_S32(const mlib_u16 *src,
mlib_s32 slb,
mlib_s32 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s32 **table)
{
const mlib_s32 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUP(mlib_s32, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUp_S32_S32(const mlib_s32 *src,
mlib_s32 slb,
mlib_s32 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s32 **table)
{
const mlib_s32 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUP(mlib_s32, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_U8_U8(const mlib_u8 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
if ((xsize < 8) || ((xsize * ysize) < 250)) {
MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_u8, table);
}
else if (csize == 2) {
mlib_u16 tab[256];
const mlib_u8 *tab0 = table[0];
const mlib_u8 *tab1 = table[1];
mlib_s32 i, j, s0, s1, s2;
s0 = tab0[0];
s1 = tab1[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s2 = (s1 << 8) + s0;
#else
s2 = (s0 << 8) + s1;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
tab[i - 1] = (mlib_u16) s2;
}
#ifdef _LITTLE_ENDIAN
s2 = (s1 << 8) + s0;
#else
s2 = (s0 << 8) + s1;
#endif /* _LITTLE_ENDIAN */
tab[255] = (mlib_u16) s2;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_s32 *da;
mlib_u8 *dp = dst;
mlib_u8 *sa = (void *)src;
mlib_s32 s0, t0, s1, t1, t, t2, off;
mlib_s32 size = xsize;
if (((mlib_addr) dp & 1) == 0) {
if (((mlib_addr) dp & 3) != 0) {
*((mlib_u16 *) dp) = tab[sa[0]];
sa++;
size--;
dp += 2;
}
da = (mlib_s32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 3; i += 2, da++, sa += 2) {
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
t = (t1 << 16) + t0;
#else
t = (t0 << 16) + t1;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
t = (t1 << 16) + t0;
#else
t = (t0 << 16) + t1;
#endif /* _LITTLE_ENDIAN */
da[0] = t;
da++;
if (size & 1)
*((mlib_u16 *) da) = tab[sa[0]];
}
else {
off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
if (off > 1) {
t0 = tab[sa[0]];
#ifdef _LITTLE_ENDIAN
dp[1] = (t0 >> 8);
dp[0] = t0;
#else
dp[0] = (t0 >> 8);
dp[1] = t0;
#endif /* _LITTLE_ENDIAN */
sa++;
size--;
dp += 2;
}
t0 = tab[sa[0]];
sa++;
#ifdef _LITTLE_ENDIAN
*dp++ = t0;
#else
*dp++ = (t0 >> 8);
#endif /* _LITTLE_ENDIAN */
da = (mlib_s32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 4; i += 2, da++, sa += 2) {
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
t = (t0 >> 8) + (t1 << 8) + (t2 << 24);
#else
t = (t0 << 24) + (t1 << 8) + (t2 >> 8);
#endif /* _LITTLE_ENDIAN */
t0 = t2;
s0 = sa[0];
s1 = sa[1];
da[0] = t;
}
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
t = (t0 >> 8) + (t1 << 8) + (t2 << 24);
#else
t = (t0 << 24) + (t1 << 8) + (t2 >> 8);
#endif /* _LITTLE_ENDIAN */
da[0] = t;
da++;
dp = (mlib_u8 *) da;
#ifdef _LITTLE_ENDIAN
dp[0] = (t2 >> 8);
#else
dp[0] = t2;
#endif /* _LITTLE_ENDIAN */
if ((size & 1) == 0) {
t0 = tab[sa[0]];
#ifdef _LITTLE_ENDIAN
dp[2] = (t0 >> 8);
dp[1] = t0;
#else
dp[1] = (t0 >> 8);
dp[2] = t0;
#endif /* _LITTLE_ENDIAN */
}
}
}
}
else if (csize == 3) {
mlib_u32 tab[256];
const mlib_u8 *tab0 = table[0];
const mlib_u8 *tab1 = table[1];
const mlib_u8 *tab2 = table[2];
mlib_s32 i, j;
mlib_u32 s0, s1, s2, s3;
s0 = tab0[0];
s1 = tab1[0];
s2 = tab2[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s3 = (s2 << 24) + (s1 << 16) + (s0 << 8);
#else
s3 = (s0 << 16) + (s1 << 8) + s2;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
s2 = tab2[i];
tab[i - 1] = s3;
}
#ifdef _LITTLE_ENDIAN
s3 = (s2 << 24) + (s1 << 16) + (s0 << 8);
#else
s3 = (s0 << 16) + (s1 << 8) + s2;
#endif /* _LITTLE_ENDIAN */
tab[255] = s3;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_u8 *sa = (void *)src, *ptr;
mlib_u32 s0, s1, t0, t1;
mlib_u32 res1, res2;
mlib_s32 size = xsize, off;
off = (mlib_s32) ((mlib_addr) dp & 3);
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < off; i++) {
ptr = (mlib_u8 *) (tab + sa[0]);
dp[0] = ptr[1];
dp[1] = ptr[2];
dp[2] = ptr[3];
dp += 3;
sa++;
}
size -= off;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t0 >> 8) + (t1 << 16);
res2 = (t1 >> 16);
#else
da[0] = (t0 << 8) + (t1 >> 16);
res2 = (t1 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
res2 += (t0 << 8);
res1 = (t0 >> 24) + t1;
#else
res2 += (t0 >> 8);
res1 = (t0 << 24) + t1;
#endif /* _LITTLE_ENDIAN */
s0 = sa[2];
s1 = sa[3];
da[1] = res2;
da[2] = res1;
}
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t0 >> 8) + (t1 << 16);
res2 = (t1 >> 16);
#else
da[0] = (t0 << 8) + (t1 >> 16);
res2 = (t1 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab[s0];
t1 = tab[s1];
#ifdef _LITTLE_ENDIAN
res2 += (t0 << 8);
res1 = (t0 >> 24) + t1;
#else
res2 += (t0 >> 8);
res1 = (t0 << 24) + t1;
#endif /* _LITTLE_ENDIAN */
da[1] = res2;
da[2] = res1;
da += 3;
sa += 2;
dp = (mlib_u8 *) da;
i += 4;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (; i < size; i++) {
ptr = (mlib_u8 *) (tab + sa[0]);
dp[0] = ptr[1];
dp[1] = ptr[2];
dp[2] = ptr[3];
dp += 3;
sa++;
}
}
}
else if (csize == 4) {
mlib_u32 tab[256];
const mlib_u8 *tab0 = table[0];
const mlib_u8 *tab1 = table[1];
const mlib_u8 *tab2 = table[2];
const mlib_u8 *tab3 = table[3];
mlib_s32 i, j;
mlib_u32 s0, s1, s2, s3, s4;
s0 = tab0[0];
s1 = tab1[0];
s2 = tab2[0];
s3 = tab3[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s4 = (s3 << 24) + (s2 << 16) + (s1 << 8) + s0;
#else
s4 = (s0 << 24) + (s1 << 16) + (s2 << 8) + s3;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
s2 = tab2[i];
s3 = tab3[i];
tab[i - 1] = s4;
}
#ifdef _LITTLE_ENDIAN
s4 = (s3 << 24) + (s2 << 16) + (s1 << 8) + s0;
#else
s4 = (s0 << 24) + (s1 << 16) + (s2 << 8) + s3;
#endif /* _LITTLE_ENDIAN */
tab[255] = s4;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_u8 *sa = (void *)src;
mlib_u32 s0, t0, s1, t1, t2;
mlib_s32 size = xsize, off;
mlib_u32 shift, shift1, res1, res2;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 3; i += 2, da += 2, sa += 2) {
t0 = tab[s0];
t1 = tab[s1];
s0 = sa[0];
s1 = sa[1];
da[0] = t0;
da[1] = t1;
}
t0 = tab[s0];
t1 = tab[s1];
da[0] = t0;
da[1] = t1;
if (size & 1)
da[2] = tab[sa[0]];
}
else {
off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
shift = 8 * off;
shift1 = 32 - shift;
for (i = 0; i < off; i++) {
dp[i] = table[i][sa[0]];
}
dp += i;
t0 = tab[sa[0]];
sa++;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 4; i += 2, da += 2, sa += 2) {
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> shift) + (t1 << shift1);
res2 = (t1 >> shift) + (t2 << shift1);
#else
res1 = (t0 << shift) + (t1 >> shift1);
res2 = (t1 << shift) + (t2 >> shift1);
#endif /* _LITTLE_ENDIAN */
t0 = t2;
s0 = sa[0];
s1 = sa[1];
da[0] = res1;
da[1] = res2;
}
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> shift) + (t1 << shift1);
res2 = (t1 >> shift) + (t2 << shift1);
#else
res1 = (t0 << shift) + (t1 >> shift1);
res2 = (t1 << shift) + (t2 >> shift1);
#endif /* _LITTLE_ENDIAN */
da[0] = res1;
da[1] = res2;
#ifdef _LITTLE_ENDIAN
t0 = (da[2] >> shift1);
da[2] = (t2 >> shift) + (t0 << shift1);
#else
t0 = (da[2] << shift1);
da[2] = (t2 << shift) + (t0 >> shift1);
#endif /* _LITTLE_ENDIAN */
da += 2;
dp = (mlib_u8 *) da + (4 - off);
if ((size & 1) == 0) {
t0 = tab[sa[0]];
#ifdef _LITTLE_ENDIAN
dp[3] = (mlib_u8) (t0 >> 24);
dp[2] = (mlib_u8) (t0 >> 16);
dp[1] = (mlib_u8) (t0 >> 8);
dp[0] = (mlib_u8) t0;
#else
dp[0] = (mlib_u8) (t0 >> 24);
dp[1] = (mlib_u8) (t0 >> 16);
dp[2] = (mlib_u8) (t0 >> 8);
dp[3] = (mlib_u8) t0;
#endif /* _LITTLE_ENDIAN */
}
}
}
}
}
/***************************************************************/
#ifdef _MSC_VER
#pragma optimize("", off)
#endif /* _MSC_VER */
void mlib_c_ImageLookUpSI_S16_U8(const mlib_s16 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
if ((xsize < 8) || (csize == 2)) {
MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_s16, table_base);
}
else if (csize == 3) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_s16 *sa = (void *)src;
const mlib_u8 *tab0 = table_base[0];
const mlib_u8 *tab1 = table_base[1];
const mlib_u8 *tab2 = table_base[2];
mlib_s32 s0, s1;
mlib_u32 t0, t1, t2, t3, t4, t5;
mlib_u32 res1, res2;
mlib_s32 size = xsize, off;
off = (mlib_s32) ((mlib_addr) dp & 3);
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < off; i++) {
s0 = *sa++;
dp[0] = tab0[s0];
dp[1] = tab1[s0];
dp[2] = tab2[s0];
dp += 3;
}
size -= off;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res2 = (t5 << 8) + t4;
#else
da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res2 = (t4 << 24) + (t5 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
res2 += ((t1 << 24) + (t0 << 16));
res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
#else
res2 += ((t0 << 8) + t1);
res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
#endif /* _LITTLE_ENDIAN */
s0 = sa[2];
s1 = sa[3];
da[1] = res2;
da[2] = res1;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res2 = (t5 << 8) + t4;
#else
da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res2 = (t4 << 24) + (t5 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
res2 += ((t1 << 24) + (t0 << 16));
res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
#else
res2 += ((t0 << 8) + t1);
res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
#endif /* _LITTLE_ENDIAN */
da[1] = res2;
da[2] = res1;
da += 3;
sa += 2;
dp = (mlib_u8 *) da;
i += 4;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (; i < size; i++) {
s0 = *sa++;
dp[0] = tab0[s0];
dp[1] = tab1[s0];
dp[2] = tab2[s0];
dp += 3;
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_s16 *sa = (void *)src;
const mlib_u8 *tab0 = table_base[0];
const mlib_u8 *tab1 = table_base[1];
const mlib_u8 *tab2 = table_base[2];
const mlib_u8 *tab3 = table_base[3];
mlib_s32 s0;
mlib_u32 t0, t1, t2, t3;
mlib_s32 size = xsize, off;
mlib_u32 shift, shift1, res1, res2, res;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 1; i++, da++, sa++) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
da[0] = res;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
da[0] = res;
}
else {
off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
shift = 8 * off;
shift1 = 32 - shift;
s0 = *sa++;
for (i = 0; i < off; i++) {
dp[i] = table_base[i][s0];
}
dp += i;
da = (mlib_u32 *) dp;
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res1 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res1 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 2; i++, da++, sa++) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res = (res1 >> shift) + (res2 << shift1);
#else
res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res = (res1 << shift) + (res2 >> shift1);
#endif /* _LITTLE_ENDIAN */
res1 = res2;
s0 = sa[0];
da[0] = res;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res = (res1 >> shift) + (res2 << shift1);
#else
res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res = (res1 << shift) + (res2 >> shift1);
#endif /* _LITTLE_ENDIAN */
da[0] = res;
#ifdef _LITTLE_ENDIAN
res1 = (da[1] >> shift1);
da[1] = (res2 >> shift) + (res1 << shift1);
#else
res1 = (da[1] << shift1);
da[1] = (res2 << shift) + (res1 >> shift1);
#endif /* _LITTLE_ENDIAN */
}
}
}
}
#ifdef _MSC_VER
#pragma optimize("", on)
#endif /* _MSC_VER */
/***************************************************************/
void mlib_c_ImageLookUpSI_U16_U8(const mlib_u16 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
if ((xsize < 8) || (csize == 2)) {
MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_u16, table_base);
}
else if (csize == 3) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_u16 *sa = (void *)src;
const mlib_u8 *tab0 = table_base[0];
const mlib_u8 *tab1 = table_base[1];
const mlib_u8 *tab2 = table_base[2];
mlib_s32 s0, s1;
mlib_u32 t0, t1, t2, t3, t4, t5;
mlib_u32 res1, res2;
mlib_s32 size = xsize, off;
off = (mlib_s32) ((mlib_addr) dp & 3);
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < off; i++) {
s0 = *sa++;
dp[0] = tab0[s0];
dp[1] = tab1[s0];
dp[2] = tab2[s0];
dp += 3;
}
size -= off;
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res2 = (t5 << 8) + t4;
#else
da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res2 = (t4 << 24) + (t5 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
res2 += ((t1 << 24) + (t0 << 16));
res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
#else
res2 += ((t0 << 8) + t1);
res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
#endif /* _LITTLE_ENDIAN */
s0 = sa[2];
s1 = sa[3];
da[1] = res2;
da[2] = res1;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res2 = (t5 << 8) + t4;
#else
da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res2 = (t4 << 24) + (t5 << 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
s1 = sa[1];
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab0[s1];
t4 = tab1[s1];
t5 = tab2[s1];
#ifdef _LITTLE_ENDIAN
res2 += ((t1 << 24) + (t0 << 16));
res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
#else
res2 += ((t0 << 8) + t1);
res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
#endif /* _LITTLE_ENDIAN */
da[1] = res2;
da[2] = res1;
da += 3;
sa += 2;
dp = (mlib_u8 *) da;
i += 4;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (; i < size; i++) {
s0 = *sa++;
dp[0] = tab0[s0];
dp[1] = tab1[s0];
dp[2] = tab2[s0];
dp += 3;
}
}
}
else if (csize == 4) {
mlib_s32 i, j;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u8 *dp = dst;
mlib_u16 *sa = (void *)src;
const mlib_u8 *tab0 = table_base[0];
const mlib_u8 *tab1 = table_base[1];
const mlib_u8 *tab2 = table_base[2];
const mlib_u8 *tab3 = table_base[3];
mlib_s32 s0;
mlib_u32 t0, t1, t2, t3;
mlib_s32 size = xsize, off;
mlib_u32 shift, shift1, res1, res2, res;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 1; i++, da++, sa++) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
da[0] = res;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
da[0] = res;
}
else {
off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
shift = 8 * off;
shift1 = 32 - shift;
s0 = *sa++;
for (i = 0; i < off; i++) {
dp[i] = table_base[i][s0];
}
dp += i;
da = (mlib_u32 *) dp;
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res1 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
#else
res1 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
sa++;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 2; i++, da++, sa++) {
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res = (res1 >> shift) + (res2 << shift1);
#else
res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res = (res1 << shift) + (res2 >> shift1);
#endif /* _LITTLE_ENDIAN */
res1 = res2;
s0 = sa[0];
da[0] = res;
}
t0 = tab0[s0];
t1 = tab1[s0];
t2 = tab2[s0];
t3 = tab3[s0];
#ifdef _LITTLE_ENDIAN
res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
res = (res1 >> shift) + (res2 << shift1);
#else
res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
res = (res1 << shift) + (res2 >> shift1);
#endif /* _LITTLE_ENDIAN */
da[0] = res;
#ifdef _LITTLE_ENDIAN
res1 = (da[1] >> shift1);
da[1] = (res2 >> shift) + (res1 << shift1);
#else
res1 = (da[1] << shift1);
da[1] = (res2 << shift) + (res1 >> shift1);
#endif /* _LITTLE_ENDIAN */
}
}
}
}
/***************************************************************/
void mlib_c_ImageLookUpSI_S32_U8(const mlib_s32 *src,
mlib_s32 slb,
mlib_u8 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u8 **table)
{
const mlib_u8 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_U8_S16(const mlib_u8 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
if ((xsize < 4) || ((xsize * ysize) < 250)) {
MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_u8, table);
}
else if (csize == 2) {
mlib_u32 tab[256];
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_s32 i, j;
mlib_u32 s0, s1, s2;
s0 = tab0[0];
s1 = tab1[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s2 = (s1 << 16) + s0;
#else
s2 = (s0 << 16) + s1;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
tab[i - 1] = s2;
}
#ifdef _LITTLE_ENDIAN
s2 = (s1 << 16) + s0;
#else
s2 = (s0 << 16) + s1;
#endif /* _LITTLE_ENDIAN */
tab[255] = s2;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *dp = (mlib_u16 *) dst;
mlib_u8 *sa = (void *)src;
mlib_u32 s0, t0, s1, t1, t2;
mlib_u32 res1, res2;
mlib_s32 size = xsize;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 3; i += 2, da += 2, sa += 2) {
t0 = tab[s0];
t1 = tab[s1];
s0 = sa[0];
s1 = sa[1];
da[0] = t0;
da[1] = t1;
}
t0 = tab[s0];
t1 = tab[s1];
da[0] = t0;
da[1] = t1;
if (size & 1)
da[2] = tab[sa[0]];
}
else {
t0 = tab[*sa++];
#ifdef _LITTLE_ENDIAN
*dp++ = (mlib_u16) (t0);
#else
*dp++ = (mlib_u16) (t0 >> 16);
#endif /* _LITTLE_ENDIAN */
da = (mlib_u32 *) dp;
s0 = sa[0];
s1 = sa[1];
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 4; i += 2, da += 2, sa += 2) {
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> 16) + (t1 << 16);
res2 = (t1 >> 16) + (t2 << 16);
#else
res1 = (t0 << 16) + (t1 >> 16);
res2 = (t1 << 16) + (t2 >> 16);
#endif /* _LITTLE_ENDIAN */
t0 = t2;
s0 = sa[0];
s1 = sa[1];
da[0] = res1;
da[1] = res2;
}
t1 = tab[s0];
t2 = tab[s1];
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> 16) + (t1 << 16);
res2 = (t1 >> 16) + (t2 << 16);
#else
res1 = (t0 << 16) + (t1 >> 16);
res2 = (t1 << 16) + (t2 >> 16);
#endif /* _LITTLE_ENDIAN */
da[0] = res1;
da[1] = res2;
da += 2;
dp = (mlib_u16 *) da;
#ifdef _LITTLE_ENDIAN
dp[0] = (mlib_u16) (t2 >> 16);
#else
dp[0] = (mlib_u16) t2;
#endif /* _LITTLE_ENDIAN */
if ((size & 1) == 0) {
t0 = tab[sa[0]];
#ifdef _LITTLE_ENDIAN
dp[2] = (mlib_u16) (t0 >> 16);
dp[1] = (mlib_u16) t0;
#else
dp[1] = (mlib_u16) (t0 >> 16);
dp[2] = (mlib_u16) t0;
#endif /* _LITTLE_ENDIAN */
}
}
}
}
else if (csize == 3) {
mlib_u32 tab[512];
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_u16 *tab2 = (mlib_u16 *) table[2];
mlib_s32 i, j;
mlib_u32 s0, s1, s2, s3, s4;
s0 = tab0[0];
s1 = tab1[0];
s2 = tab2[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s3 = (s0 << 16);
s4 = (s2 << 16) + s1;
#else
s3 = s0;
s4 = (s1 << 16) + s2;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
s2 = tab2[i];
tab[2 * i - 2] = s3;
tab[2 * i - 1] = s4;
}
#ifdef _LITTLE_ENDIAN
s4 = (s2 << 16) + s1;
tab[510] = s0 << 16;
#else
s4 = (s1 << 16) + s2;
tab[510] = s0;
#endif /* _LITTLE_ENDIAN */
tab[511] = s4;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *dp = (mlib_u16 *) dst, *ptr;
mlib_u8 *sa = (void *)src;
mlib_u32 s0, s1, t0, t1, t2, t3;
mlib_u32 res1, res2;
mlib_s32 size = xsize, off;
off = (mlib_s32) ((mlib_addr) dp & 3);
if (off != 0) {
ptr = (mlib_u16 *) (tab + 2 * sa[0]);
dp[0] = ptr[1];
dp[1] = ptr[2];
dp[2] = ptr[3];
dp += 3;
sa++;
size--;
}
da = (mlib_u32 *) dp;
s0 = sa[0] << 3;
s1 = sa[1] << 3;
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 3; i += 2, da += 3, sa += 2) {
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> 16) + (t1 << 16);
res2 = (t1 >> 16) + t2;
#else
res1 = (t0 << 16) + (t1 >> 16);
res2 = (t1 << 16) + t2;
#endif /* _LITTLE_ENDIAN */
s0 = sa[0] << 3;
s1 = sa[1] << 3;
da[0] = res1;
da[1] = res2;
da[2] = t3;
}
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
#ifdef _LITTLE_ENDIAN
res1 = (t0 >> 16) + (t1 << 16);
res2 = (t1 >> 16) + t2;
#else
res1 = (t0 << 16) + (t1 >> 16);
res2 = (t1 << 16) + t2;
#endif /* _LITTLE_ENDIAN */
da[0] = res1;
da[1] = res2;
da[2] = t3;
da += 3;
dp = (mlib_u16 *) da;
i += 2;
if (i < size) {
ptr = (mlib_u16 *) (tab + 2 * sa[0]);
dp[0] = ptr[1];
dp[1] = ptr[2];
dp[2] = ptr[3];
}
}
}
else if (csize == 4) {
mlib_u32 tab[512];
mlib_u16 *tab0 = (mlib_u16 *) table[0];
mlib_u16 *tab1 = (mlib_u16 *) table[1];
mlib_u16 *tab2 = (mlib_u16 *) table[2];
mlib_u16 *tab3 = (mlib_u16 *) table[3];
mlib_s32 i, j;
mlib_u32 s0, s1, s2, s3, s4, s5;
s0 = tab0[0];
s1 = tab1[0];
s2 = tab2[0];
s3 = tab3[0];
for (i = 1; i < 256; i++) {
#ifdef _LITTLE_ENDIAN
s4 = (s1 << 16) + s0;
s5 = (s3 << 16) + s2;
#else
s4 = (s0 << 16) + s1;
s5 = (s2 << 16) + s3;
#endif /* _LITTLE_ENDIAN */
s0 = tab0[i];
s1 = tab1[i];
s2 = tab2[i];
s3 = tab3[i];
tab[2 * i - 2] = s4;
tab[2 * i - 1] = s5;
}
#ifdef _LITTLE_ENDIAN
s4 = (s1 << 16) + s0;
s5 = (s3 << 16) + s2;
#else
s4 = (s0 << 16) + s1;
s5 = (s2 << 16) + s3;
#endif /* _LITTLE_ENDIAN */
tab[510] = s4;
tab[511] = s5;
for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
mlib_u32 *da;
mlib_u16 *dp = (mlib_u16 *) dst;
mlib_u8 *sa = (void *)src;
mlib_u32 s0, t0, s1, t1, t2, t3, t4, t5;
mlib_s32 size = xsize;
mlib_u32 res1, res2, res3, res4;
if (((mlib_addr) dp & 3) == 0) {
da = (mlib_u32 *) dp;
s0 = sa[0] << 3;
s1 = sa[1] << 3;
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 3; i += 2, da += 4, sa += 2) {
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
s0 = sa[0] << 3;
s1 = sa[1] << 3;
da[0] = t0;
da[1] = t1;
da[2] = t2;
da[3] = t3;
}
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
da[0] = t0;
da[1] = t1;
da[2] = t2;
da[3] = t3;
if (size & 1) {
da[4] = tab[2 * sa[0]];
da[5] = tab[2 * sa[0] + 1];
}
}
else {
t4 = tab[2 * sa[0]];
t5 = tab[2 * sa[0] + 1];
#ifdef _LITTLE_ENDIAN
*dp++ = (mlib_u16) (t4);
#else
*dp++ = (mlib_u16) (t4 >> 16);
#endif /* _LITTLE_ENDIAN */
sa++;
da = (mlib_u32 *) dp;
#ifdef _LITTLE_ENDIAN
*da++ = (t4 >> 16) + (t5 << 16);
#else
*da++ = (t4 << 16) + (t5 >> 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0] << 3;
s1 = sa[1] << 3;
sa += 2;
#ifdef __SUNPRO_C
#pragma pipeloop(0)
#endif /* __SUNPRO_C */
for (i = 0; i < size - 4; i += 2, da += 4, sa += 2) {
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
#ifdef _LITTLE_ENDIAN
res1 = (t5 >> 16) + (t0 << 16);
res2 = (t0 >> 16) + (t1 << 16);
res3 = (t1 >> 16) + (t2 << 16);
res4 = (t2 >> 16) + (t3 << 16);
#else
res1 = (t5 << 16) + (t0 >> 16);
res2 = (t0 << 16) + (t1 >> 16);
res3 = (t1 << 16) + (t2 >> 16);
res4 = (t2 << 16) + (t3 >> 16);
#endif /* _LITTLE_ENDIAN */
s0 = sa[0] << 3;
s1 = sa[1] << 3;
da[0] = res1;
da[1] = res2;
da[2] = res3;
da[3] = res4;
t5 = t3;
}
t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
#ifdef _LITTLE_ENDIAN
res1 = (t5 >> 16) + (t0 << 16);
res2 = (t0 >> 16) + (t1 << 16);
res3 = (t1 >> 16) + (t2 << 16);
res4 = (t2 >> 16) + (t3 << 16);
#else
res1 = (t5 << 16) + (t0 >> 16);
res2 = (t0 << 16) + (t1 >> 16);
res3 = (t1 << 16) + (t2 >> 16);
res4 = (t2 << 16) + (t3 >> 16);
#endif /* _LITTLE_ENDIAN */
da[0] = res1;
da[1] = res2;
da[2] = res3;
da[3] = res4;
da += 4;
dp = (mlib_u16 *) da;
#ifdef _LITTLE_ENDIAN
dp[0] = (mlib_u16) (t3 >> 16);
#else
dp[0] = (mlib_u16) t3;
#endif /* _LITTLE_ENDIAN */
if ((size & 1) == 0) {
t0 = tab[2 * sa[0]];
#ifdef _LITTLE_ENDIAN
dp[2] = (mlib_u16) (t0 >> 16);
dp[1] = (mlib_u16) t0;
#else
dp[1] = (mlib_u16) (t0 >> 16);
dp[2] = (mlib_u16) t0;
#endif /* _LITTLE_ENDIAN */
t0 = tab[2 * sa[0] + 1];
#ifdef _LITTLE_ENDIAN
dp[4] = (mlib_u16) (t0 >> 16);
dp[3] = (mlib_u16) t0;
#else
dp[3] = (mlib_u16) (t0 >> 16);
dp[4] = (mlib_u16) t0;
#endif /* _LITTLE_ENDIAN */
}
}
}
}
}
/***************************************************************/
void mlib_c_ImageLookUpSI_S16_S16(const mlib_s16 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_U16_S16(const mlib_u16 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_S32_S16(const mlib_s32 *src,
mlib_s32 slb,
mlib_s16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s16 **table)
{
const mlib_s16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_S16_U16(const mlib_s16 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u16 **table)
{
const mlib_u16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][32768];
}
MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_s16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_U16_U16(const mlib_u16 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u16 **table)
{
const mlib_u16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][0];
}
MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_u16, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_S32_U16(const mlib_s32 *src,
mlib_s32 slb,
mlib_u16 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_u16 **table)
{
const mlib_u16 *table_base[4];
mlib_s32 c;
for (c = 0; c < csize; c++) {
table_base[c] = &table[c][TABLE_SHIFT_S32];
}
MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_s32, table_base);
}
/***************************************************************/
void mlib_c_ImageLookUpSI_U8_S32(const mlib_u8 *src,
mlib_s32 slb,
mlib_s32 *dst,
mlib_s32 dlb,
mlib_s32 xsize,
mlib_s32 ysize,
mlib_s32 csize,
const mlib_s32 **table)
{
if (xsize < 7) {
MLIB_C_IMAGELOOKUPSI(mlib_s32, 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_u32 *tab0 = (mlib_u32 *) table[0];
mlib_u32 *tab1 = (mlib_u32 *) table[1];
mlib_u32 s0, t0, t1, t2, t3;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_u32 *dp = (mlib_u32 *) 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_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
dp[4] = t0;
dp[5] = t1;
dp[6] = t2;
dp[7] = t3;
}
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
#endif /* _LITTLE_ENDIAN */
dp[0] = t0;
dp[1] = t1;
dp[2] = t2;
dp[3] = t3;
#ifdef _LITTLE_ENDIAN
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
#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_u32 *tab0 = (mlib_u32 *) table[0];
mlib_u32 *tab1 = (mlib_u32 *) table[1];
mlib_u32 *tab2 = (mlib_u32 *) table[2];
mlib_u32 s0, t0, t1, t2, t3, t4, t5;
mlib_s32 off;
mlib_s32 size = xsize;
mlib_u32 *dp = (mlib_u32 *) 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_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
#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_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
#else
t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
#endif /* _LITTLE_ENDIAN */
s0 = sa[0];
dp[6] = t0;
/**代码未完, 请加载全部代码(NowJava.com).**/