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