/* * Copyright (c) 1999, 2020, 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++; 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++; 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++; 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++; 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_u32 shift = TABLE_SHIFT_S32; mlib_s32 c; for (c = 0; c < csize; c++) { table_base[c] = &table[c][shift]; } 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++; 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++; 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++; 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_u32 shift = TABLE_SHIFT_S32; mlib_s32 c; for (c = 0; c < csize; c++) { table_base[c] = &table[c][shift]; } MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s32, table_base); } /***************************************************************/