/MRI-J/jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c
C | 3878 lines | 3360 code | 449 blank | 69 comment | 381 complexity | 35116b010c761e573bb7faf9db7564ac MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-3.0
- /*
- * Copyright 2003 Sun Microsystems, Inc. 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. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.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;
- dp[7] = t1;
- dp[8] = t2;
- dp[9] = t3;
- dp[10] = t4;
- dp[11] = t5;
- }
- #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 */
- 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_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 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]];
- *dp++ = tab2[sp[0]];
- *dp++ = tab3[sp[0]];
- size--;
- }
- sa = (mlib_u32 *) sp;
- s0 = sa[0];
- sa++;
- #ifdef __SUNPRO_C
- #pragma pipeloop(0)
- #endif /* __SUNPRO_C */
- for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {
- #ifdef _LITTLE_ENDIAN
- t0 = *(mlib_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 *) tab3 + ((s0 << 2) & 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 *) tab3 + ((s0 >> 22) & 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 >> 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 *) tab3 + ((s0 >> 6) & 0x3FC));
- #else
- 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 *) tab3 + ((s0 >> 14) & 0x3FC));
- #endif /* _LITTLE_ENDIAN */
- dp[4] = t0;
- dp[5] = t1;
- dp[6] = t2;
- dp[7] = 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 *) tab2 + ((s0 >> 14) & 0x3FC));
- t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 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 *) tab3 + ((s0 >> 6) & 0x3FC));
- #endif /* _LITTLE_ENDIAN */
- dp[8] = t0;
- dp[9] = t1;
- dp[10] = t2;
- dp[11] = t3;
- #ifdef _LITTLE_ENDIAN
- 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 *) tab3 + ((s0 >> 22) & 0x3FC));
- #else
- 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 *) tab3 + ((s0 << 2) & 0x3FC));
- #endif /* _LITTLE_ENDIAN */
- s0 = sa[0];
- dp[12] = t0;
- dp[13] = t1;
- dp[14] = t2;
- dp[15] = 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 *) tab2 + ((s0 << 2) & 0x3FC));
- t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 << 2) & 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 *) tab3 + ((s0 >> 22) & 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 >> 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 *) tab3 + ((s0 >> 6) & 0x3FC));
- #else
- 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 *) tab3 + ((s0 >> 14) & 0x3FC));
- #endif /* _LITTLE_ENDIAN */
- dp[4] = t0;
- dp[5] = t1;
- dp[6] = t2;
- dp[7] = 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 *) tab2 + ((s0 >> 14) & 0x3FC));
- t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 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 *) tab3 + ((s0 >> 6) & 0x3FC));
- #endif /* _LITTLE_ENDIAN */
- dp[8] = t0;
- dp[9] = t1;
- dp[10] = t2;
- dp[11] = t3;
- #ifdef _LITTLE_ENDIAN
- 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 *) tab3 + ((s0 >> 22) & 0x3FC));
- #else
- 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 *) tab3 + ((s0 << 2) & 0x3FC));
- #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_c_ImageLookUpSI_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_IMAGELOOKUPSI(mlib_s32, mlib_s16, table_base);
- }
- /***************************************************************/
- void mlib_c_ImageLookUpSI_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_IMAGELOOKUPSI(mlib_s32, mlib_u16, table_base);
- }
- /***************************************************************/
- void mlib_c_ImageLookUpSI_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_IMAGELOOKUPSI(mlib_s32, mlib_s32, table_base);
- }
- /***************************************************************/