Path: blob/master/src/java.desktop/share/native/libmlib_image/mlib_ImageLookUp_64.c
41152 views
/*1* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/242526/*27* FUNCTION28* mlib_ImageLookUp_U8D64 - table lookup29* mlib_ImageLookUp_S16D64 - table lookup30* mlib_ImageLookUp_U16D64 - table lookup31* mlib_ImageLookUp_S32D64 - table lookup32*33* SYNOPSIS34* void mlib_ImageLookUp_U8_D64(src, slb,35* dst, dlb,36* xsize, ysize,37* csize, table)38*39* void mlib_ImageLookUp_S16_D64(src, slb,40* dst, dlb,41* xsize, ysize,42* csize, table)43*44* void mlib_ImageLookUp_U16_D64(src, slb,45* dst, dlb,46* xsize, ysize,47* csize, table)48*49* void mlib_ImageLookUp_S32_D64(src, slb,50* dst, dlb,51* xsize, ysize,52* csize, table)53*54* ARGUMENT55* src pointer to input image (BYTE, SHORT, USHORT, INT)56* slb stride of input image (in pixels)57* dst pointer to output image (DOUBLE)58* dlb stride of output image (in pixels)59* xsize image width60* ysize image height61* csize number of channels62* table lookup table63*64* DESCRIPTION65* dst = table[src] (c, vis version)66*/6768#include "mlib_image.h"69#include "mlib_ImageLookUp.h"7071/***************************************************************/72#define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE) \73{ \74mlib_s32 i, j, k; \75\76if (xsize < 2) { \77for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \78for(k = 0; k < csize; k++) { \79DTYPE *da = dst + k; \80const STYPE *sa = src + k; \81DTYPE *tab = (DTYPE*) TABLE[k]; \82\83for(i = 0; i < xsize; i++, da += csize, sa += csize) \84*da=tab[*sa]; \85} \86} \87} else { \88for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \89for(k = 0; k < csize; k++) { \90DTYPE *da = dst + k; \91const STYPE *sa = src + k; \92DTYPE *tab = (DTYPE*) TABLE[k]; \93mlib_s32 s0, s1; \94DTYPE t0, t1; \95\96s0 = (mlib_s32)sa[0]; \97s1 = (mlib_s32)sa[csize]; \98sa += 2*csize; \99\100for(i = 0; \101i < xsize - 3; \102i+=2, da += 2*csize, sa += 2*csize) { \103t0 = tab[s0]; \104t1 = tab[s1]; \105s0 = (mlib_s32)sa[0]; \106s1 = (mlib_s32)sa[csize]; \107da[0] = (DTYPE)t0; \108da[csize] = (DTYPE)t1; \109} \110t0 = tab[s0]; \111t1 = tab[s1]; \112da[0] = (DTYPE)t0; \113da[csize] = (DTYPE)t1; \114if (xsize & 1) da[2*csize] = tab[sa[0]]; \115} \116} \117} \118}119120/***************************************************************/121#define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE) \122{ \123mlib_s32 i, j, k; \124\125if (xsize < 2) { \126for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \127for(k = 0; k < csize; k++) { \128DTYPE *da = dst + k; \129const STYPE *sa = (void *)src; \130DTYPE *tab = (DTYPE*) TABLE[k]; \131\132for(i = 0; i < xsize; i++, da += csize, sa ++) \133*da=tab[*sa]; \134} \135} \136} else { \137for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \138for(k = 0; k < csize; k++) { \139DTYPE *da = dst + k; \140const STYPE *sa = (void *)src; \141DTYPE *tab = (DTYPE*) TABLE[k]; \142mlib_s32 s0, s1; \143DTYPE t0, t1; \144\145s0 = (mlib_s32)sa[0]; \146s1 = (mlib_s32)sa[1]; \147sa += 2; \148\149for(i = 0; \150i < xsize - 3; \151i+=2, da += 2*csize, sa += 2) { \152t0 = tab[s0]; \153t1 = tab[s1]; \154s0 = (mlib_s32)sa[0]; \155s1 = (mlib_s32)sa[1]; \156da[0] = (DTYPE)t0; \157da[csize] = (DTYPE)t1; \158} \159t0 = tab[s0]; \160t1 = tab[s1]; \161da[0] = (DTYPE)t0; \162da[csize] = (DTYPE)t1; \163if (xsize & 1) da[2*csize] = tab[sa[0]]; \164} \165} \166} \167}168169/***************************************************************/170#ifdef _LITTLE_ENDIAN171172#define READ_U8_D64(table0, table1, table2, table3) \173t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 << 3) & 0x7F8)); \174t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 5) & 0x7F8)); \175t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 13) & 0x7F8)); \176t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 >> 21) & 0x7F8))177178#else179180#define READ_U8_D64(table0, table1, table2, table3) \181t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 >> 21) & 0x7F8)); \182t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 13) & 0x7F8)); \183t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 5) & 0x7F8)); \184t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 << 3) & 0x7F8))185186#endif /* _LITTLE_ENDIAN */187188/***************************************************************/189void mlib_ImageLookUp_U8_D64(const mlib_u8 *src,190mlib_s32 slb,191mlib_d64 *dst,192mlib_s32 dlb,193mlib_s32 xsize,194mlib_s32 ysize,195mlib_s32 csize,196const mlib_d64 **table)197{198199if (xsize * csize < 7) {200MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u8, table);201}202else if (csize == 1) {203mlib_s32 i, j;204205for (j = 0; j < ysize; j++, dst += dlb, src += slb) {206mlib_u32 *sa;207mlib_d64 *tab = (mlib_d64 *) table[0];208mlib_u32 s0;209mlib_d64 t0, t1, t2, t3;210mlib_s32 off;211mlib_s32 size = xsize;212mlib_d64 *dp = (mlib_d64 *) dst;213mlib_u8 *sp = (void *)src;214215off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);216217for (i = 0; i < off; i++, sp++) {218*dp++ = tab[sp[0]];219size--;220}221222sa = (mlib_u32 *) sp;223224s0 = sa[0];225sa++;226227for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {228READ_U8_D64(tab, tab, tab, tab);229s0 = sa[0];230dp[0] = t0;231dp[1] = t1;232dp[2] = t2;233dp[3] = t3;234}235236READ_U8_D64(tab, tab, tab, tab);237dp[0] = t0;238dp[1] = t1;239dp[2] = t2;240dp[3] = t3;241dp += 4;242sp = (mlib_u8 *) sa;243i += 4;244for (; i < size; i++, dp++, sp++)245dp[0] = tab[sp[0]];246}247}248else if (csize == 2) {249mlib_s32 i, j;250251for (j = 0; j < ysize; j++, dst += dlb, src += slb) {252mlib_u32 *sa;253mlib_d64 *tab0 = (mlib_d64 *) table[0];254mlib_d64 *tab1 = (mlib_d64 *) table[1];255mlib_d64 *tab;256mlib_u32 s0;257mlib_d64 t0, t1, t2, t3;258mlib_s32 off;259mlib_s32 size = xsize * 2;260mlib_d64 *dp = (mlib_d64 *) dst;261mlib_u8 *sp = (void *)src;262263off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);264265for (i = 0; i < off - 1; i += 2, sp += 2) {266*dp++ = tab0[sp[0]];267*dp++ = tab1[sp[1]];268size -= 2;269}270271if ((off & 1) != 0) {272*dp++ = tab0[*sp];273size--;274sp++;275tab = tab0;276tab0 = tab1;277tab1 = tab;278}279280sa = (mlib_u32 *) sp;281282s0 = sa[0];283sa++;284285for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {286READ_U8_D64(tab0, tab1, tab0, tab1);287s0 = sa[0];288dp[0] = t0;289dp[1] = t1;290dp[2] = t2;291dp[3] = t3;292}293294READ_U8_D64(tab0, tab1, tab0, tab1);295dp[0] = t0;296dp[1] = t1;297dp[2] = t2;298dp[3] = t3;299dp += 4;300sp = (mlib_u8 *) sa;301i += 4;302303for (; i < size - 1; i += 2, sp += 2) {304*dp++ = tab0[sp[0]];305*dp++ = tab1[sp[1]];306}307308if (i < size)309*dp = tab0[(*sp)];310}311}312else if (csize == 3) {313mlib_s32 i, j;314315for (j = 0; j < ysize; j++, dst += dlb, src += slb) {316mlib_u32 *sa;317mlib_d64 *tab0 = (mlib_d64 *) table[0];318mlib_d64 *tab1 = (mlib_d64 *) table[1];319mlib_d64 *tab2 = (mlib_d64 *) table[2];320mlib_d64 *tab;321mlib_u32 s0;322mlib_d64 t0, t1, t2, t3;323mlib_s32 off;324mlib_s32 size = xsize * 3;325mlib_d64 *dp = (mlib_d64 *) dst;326mlib_u8 *sp = (void *)src;327328off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);329330if (off == 1) {331*dp++ = tab0[(*sp)];332tab = tab0;333tab0 = tab1;334tab1 = tab2;335tab2 = tab;336size--;337sp++;338}339else if (off == 2) {340*dp++ = tab0[sp[0]];341*dp++ = tab1[sp[1]];342tab = tab2;343tab2 = tab1;344tab1 = tab0;345tab0 = tab;346size -= 2;347sp += 2;348}349else if (off == 3) {350*dp++ = tab0[sp[0]];351*dp++ = tab1[sp[1]];352*dp++ = tab2[sp[2]];353size -= 3;354sp += 3;355}356357sa = (mlib_u32 *) sp;358359s0 = sa[0];360sa++;361362for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {363READ_U8_D64(tab0, tab1, tab2, tab0);364tab = tab0;365tab0 = tab1;366tab1 = tab2;367tab2 = tab;368s0 = sa[0];369dp[0] = t0;370dp[1] = t1;371dp[2] = t2;372dp[3] = t3;373}374375READ_U8_D64(tab0, tab1, tab2, tab0);376dp[0] = t0;377dp[1] = t1;378dp[2] = t2;379dp[3] = t3;380dp += 4;381sp = (mlib_u8 *) sa;382i += 4;383384if (i < size) {385*dp++ = tab1[(*sp)];386i++;387sp++;388}389390if (i < size) {391*dp++ = tab2[(*sp)];392i++;393sp++;394}395396if (i < size) {397*dp = tab0[(*sp)];398}399}400}401else if (csize == 4) {402mlib_s32 i, j;403404for (j = 0; j < ysize; j++, dst += dlb, src += slb) {405mlib_u32 *sa;406mlib_d64 *tab0 = (mlib_d64 *) table[0];407mlib_d64 *tab1 = (mlib_d64 *) table[1];408mlib_d64 *tab2 = (mlib_d64 *) table[2];409mlib_d64 *tab3 = (mlib_d64 *) table[3];410mlib_d64 *tab;411mlib_u32 s0;412mlib_d64 t0, t1, t2, t3;413mlib_s32 off;414mlib_s32 size = xsize * 4;415mlib_d64 *dp = (mlib_d64 *) dst;416mlib_u8 *sp = (void *)src;417418off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);419420if (off == 1) {421*dp++ = tab0[(*sp)];422tab = tab0;423tab0 = tab1;424tab1 = tab2;425tab2 = tab3;426tab3 = tab;427size--;428sp++;429}430else if (off == 2) {431*dp++ = tab0[sp[0]];432*dp++ = tab1[sp[1]];433tab = tab0;434tab0 = tab2;435tab2 = tab;436tab = tab1;437tab1 = tab3;438tab3 = tab;439size -= 2;440sp += 2;441}442else if (off == 3) {443*dp++ = tab0[sp[0]];444*dp++ = tab1[sp[1]];445*dp++ = tab2[sp[2]];446tab = tab3;447tab3 = tab2;448tab2 = tab1;449tab1 = tab0;450tab0 = tab;451size -= 3;452sp += 3;453}454455sa = (mlib_u32 *) sp;456457s0 = sa[0];458sa++;459460for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {461READ_U8_D64(tab0, tab1, tab2, tab3);462s0 = sa[0];463dp[0] = t0;464dp[1] = t1;465dp[2] = t2;466dp[3] = t3;467}468469READ_U8_D64(tab0, tab1, tab2, tab3);470dp[0] = t0;471dp[1] = t1;472dp[2] = t2;473dp[3] = t3;474dp += 4;475sp = (mlib_u8 *) sa;476i += 4;477478if (i < size) {479*dp++ = tab0[(*sp)];480i++;481sp++;482}483484if (i < size) {485*dp++ = tab1[(*sp)];486i++;487sp++;488}489490if (i < size) {491*dp = tab2[(*sp)];492}493}494}495}496497/***************************************************************/498void mlib_ImageLookUp_S16_D64(const mlib_s16 *src,499mlib_s32 slb,500mlib_d64 *dst,501mlib_s32 dlb,502mlib_s32 xsize,503mlib_s32 ysize,504mlib_s32 csize,505const mlib_d64 **table)506{507const mlib_d64 *table_base[4];508mlib_s32 c;509510for (c = 0; c < csize; c++) {511table_base[c] = &table[c][32768];512}513514MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s16, table_base);515}516517/***************************************************************/518void mlib_ImageLookUp_U16_D64(const mlib_u16 *src,519mlib_s32 slb,520mlib_d64 *dst,521mlib_s32 dlb,522mlib_s32 xsize,523mlib_s32 ysize,524mlib_s32 csize,525const mlib_d64 **table)526{527const mlib_d64 *table_base[4];528mlib_s32 c;529530for (c = 0; c < csize; c++) {531table_base[c] = &table[c][0];532}533534MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u16, table_base);535}536537/***************************************************************/538void mlib_ImageLookUp_S32_D64(const mlib_s32 *src,539mlib_s32 slb,540mlib_d64 *dst,541mlib_s32 dlb,542mlib_s32 xsize,543mlib_s32 ysize,544mlib_s32 csize,545const mlib_d64 **table)546{547const mlib_d64 *table_base[4];548mlib_u32 shift = TABLE_SHIFT_S32;549mlib_s32 c;550551for (c = 0; c < csize; c++) {552table_base[c] = &table[c][shift];553}554555MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s32, table_base);556}557558/***************************************************************/559void mlib_ImageLookUpSI_U8_D64(const mlib_u8 *src,560mlib_s32 slb,561mlib_d64 *dst,562mlib_s32 dlb,563mlib_s32 xsize,564mlib_s32 ysize,565mlib_s32 csize,566const mlib_d64 **table)567{568569if (xsize < 7) {570MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u8, table);571}572else if (csize == 2) {573mlib_s32 i, j;574575for (j = 0; j < ysize; j++, dst += dlb, src += slb) {576mlib_u32 *sa;577mlib_d64 *tab0 = (mlib_d64 *) table[0];578mlib_d64 *tab1 = (mlib_d64 *) table[1];579mlib_u32 s0;580mlib_d64 t0, t1, t2, t3;581mlib_s32 off;582mlib_s32 size = xsize;583mlib_d64 *dp = (mlib_d64 *) dst;584mlib_u8 *sp = (void *)src;585586off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);587588for (i = 0; i < off; i++, sp++) {589*dp++ = tab0[sp[0]];590*dp++ = tab1[sp[0]];591size--;592}593594sa = (mlib_u32 *) sp;595596s0 = sa[0];597sa++;598599for (i = 0; i < size - 7; i += 4, dp += 8, sa++) {600#ifdef _LITTLE_ENDIAN601t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));602t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));603t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));604t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));605#else606t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));607t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));608t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));609t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));610#endif /* _LITTLE_ENDIAN */611dp[0] = t0;612dp[1] = t1;613dp[2] = t2;614dp[3] = t3;615#ifdef _LITTLE_ENDIAN616t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));617t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));618t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));619t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));620#else621t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));622t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));623t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));624t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));625#endif /* _LITTLE_ENDIAN */626s0 = sa[0];627dp[4] = t0;628dp[5] = t1;629dp[6] = t2;630dp[7] = t3;631}632633#ifdef _LITTLE_ENDIAN634t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));635t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));636t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));637t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));638#else639t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));640t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));641t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));642t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));643#endif /* _LITTLE_ENDIAN */644dp[0] = t0;645dp[1] = t1;646dp[2] = t2;647dp[3] = t3;648#ifdef _LITTLE_ENDIAN649t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));650t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));651t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));652t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));653#else654t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));655t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));656t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));657t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));658#endif /* _LITTLE_ENDIAN */659dp[4] = t0;660dp[5] = t1;661dp[6] = t2;662dp[7] = t3;663dp += 8;664sp = (mlib_u8 *) sa;665i += 4;666667for (; i < size; i++, sp++) {668*dp++ = tab0[sp[0]];669*dp++ = tab1[sp[0]];670}671}672}673else if (csize == 3) {674mlib_s32 i, j;675676for (j = 0; j < ysize; j++, dst += dlb, src += slb) {677mlib_u32 *sa;678mlib_d64 *tab0 = (mlib_d64 *) table[0];679mlib_d64 *tab1 = (mlib_d64 *) table[1];680mlib_d64 *tab2 = (mlib_d64 *) table[2];681mlib_u32 s0;682mlib_d64 t0, t1, t2, t3, t4, t5;683mlib_s32 off;684mlib_s32 size = xsize;685mlib_d64 *dp = (mlib_d64 *) dst;686mlib_u8 *sp = (void *)src;687688off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);689690for (i = 0; i < off; i++, sp++) {691*dp++ = tab0[sp[0]];692*dp++ = tab1[sp[0]];693*dp++ = tab2[sp[0]];694size--;695}696697sa = (mlib_u32 *) sp;698699s0 = sa[0];700sa++;701702for (i = 0; i < size - 7; i += 4, dp += 12, sa++) {703#ifdef _LITTLE_ENDIAN704t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));705t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));706t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));707t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));708t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));709t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));710#else711t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));712t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));713t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));714t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));715t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));716t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));717#endif /* _LITTLE_ENDIAN */718dp[0] = t0;719dp[1] = t1;720dp[2] = t2;721dp[3] = t3;722dp[4] = t4;723dp[5] = t5;724#ifdef _LITTLE_ENDIAN725t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));726t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));727t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));728t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));729t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));730t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));731#else732t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));733t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));734t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));735t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));736t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));737t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));738#endif /* _LITTLE_ENDIAN */739s0 = sa[0];740dp[6] = t0;741dp[7] = t1;742dp[8] = t2;743dp[9] = t3;744dp[10] = t4;745dp[11] = t5;746}747748#ifdef _LITTLE_ENDIAN749t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));750t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));751t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));752t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));753t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));754t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));755#else756t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));757t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));758t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));759t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));760t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));761t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));762#endif /* _LITTLE_ENDIAN */763dp[0] = t0;764dp[1] = t1;765dp[2] = t2;766dp[3] = t3;767dp[4] = t4;768dp[5] = t5;769#ifdef _LITTLE_ENDIAN770t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));771t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));772t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));773t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));774t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));775t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));776#else777t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));778t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));779t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));780t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));781t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));782t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));783#endif /* _LITTLE_ENDIAN */784dp[6] = t0;785dp[7] = t1;786dp[8] = t2;787dp[9] = t3;788dp[10] = t4;789dp[11] = t5;790dp += 12;791sp = (mlib_u8 *) sa;792i += 4;793794for (; i < size; i++, sp++) {795*dp++ = tab0[sp[0]];796*dp++ = tab1[sp[0]];797*dp++ = tab2[sp[0]];798}799}800}801else if (csize == 4) {802mlib_s32 i, j;803804for (j = 0; j < ysize; j++, dst += dlb, src += slb) {805mlib_u32 *sa;806mlib_d64 *tab0 = (mlib_d64 *) table[0];807mlib_d64 *tab1 = (mlib_d64 *) table[1];808mlib_d64 *tab2 = (mlib_d64 *) table[2];809mlib_d64 *tab3 = (mlib_d64 *) table[3];810mlib_u32 s0;811mlib_d64 t0, t1, t2, t3;812mlib_s32 off;813mlib_s32 size = xsize;814mlib_d64 *dp = (mlib_d64 *) dst;815mlib_u8 *sp = (void *)src;816817off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);818819for (i = 0; i < off; i++, sp++) {820*dp++ = tab0[sp[0]];821*dp++ = tab1[sp[0]];822*dp++ = tab2[sp[0]];823*dp++ = tab3[sp[0]];824size--;825}826827sa = (mlib_u32 *) sp;828829s0 = sa[0];830sa++;831832for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {833#ifdef _LITTLE_ENDIAN834t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));835t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));836t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));837t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));838#else839t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));840t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));841t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));842t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));843#endif /* _LITTLE_ENDIAN */844dp[0] = t0;845dp[1] = t1;846dp[2] = t2;847dp[3] = t3;848#ifdef _LITTLE_ENDIAN849t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));850t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));851t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));852t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));853#else854t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));855t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));856t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));857t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));858#endif /* _LITTLE_ENDIAN */859dp[4] = t0;860dp[5] = t1;861dp[6] = t2;862dp[7] = t3;863#ifdef _LITTLE_ENDIAN864t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));865t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));866t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));867t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));868#else869t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));870t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));871t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));872t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));873#endif /* _LITTLE_ENDIAN */874dp[8] = t0;875dp[9] = t1;876dp[10] = t2;877dp[11] = t3;878#ifdef _LITTLE_ENDIAN879t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));880t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));881t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));882t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));883#else884t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));885t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));886t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));887t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));888#endif /* _LITTLE_ENDIAN */889s0 = sa[0];890dp[12] = t0;891dp[13] = t1;892dp[14] = t2;893dp[15] = t3;894}895896#ifdef _LITTLE_ENDIAN897t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));898t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));899t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));900t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));901#else902t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));903t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));904t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));905t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));906#endif /* _LITTLE_ENDIAN */907dp[0] = t0;908dp[1] = t1;909dp[2] = t2;910dp[3] = t3;911#ifdef _LITTLE_ENDIAN912t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));913t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));914t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));915t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));916#else917t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));918t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));919t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));920t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));921#endif /* _LITTLE_ENDIAN */922dp[4] = t0;923dp[5] = t1;924dp[6] = t2;925dp[7] = t3;926#ifdef _LITTLE_ENDIAN927t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));928t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));929t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));930t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));931#else932t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));933t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));934t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));935t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));936#endif /* _LITTLE_ENDIAN */937dp[8] = t0;938dp[9] = t1;939dp[10] = t2;940dp[11] = t3;941#ifdef _LITTLE_ENDIAN942t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));943t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));944t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));945t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));946#else947t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));948t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));949t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));950t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));951#endif /* _LITTLE_ENDIAN */952dp[12] = t0;953dp[13] = t1;954dp[14] = t2;955dp[15] = t3;956dp += 16;957sp = (mlib_u8 *) sa;958i += 4;959960for (; i < size; i++, sp++) {961*dp++ = tab0[sp[0]];962*dp++ = tab1[sp[0]];963*dp++ = tab2[sp[0]];964*dp++ = tab3[sp[0]];965}966}967}968}969970/***************************************************************/971void mlib_ImageLookUpSI_S16_D64(const mlib_s16 *src,972mlib_s32 slb,973mlib_d64 *dst,974mlib_s32 dlb,975mlib_s32 xsize,976mlib_s32 ysize,977mlib_s32 csize,978const mlib_d64 **table)979{980const mlib_d64 *table_base[4];981mlib_s32 c;982983for (c = 0; c < csize; c++) {984table_base[c] = &table[c][32768];985}986987MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s16, table_base);988}989990/***************************************************************/991void mlib_ImageLookUpSI_U16_D64(const mlib_u16 *src,992mlib_s32 slb,993mlib_d64 *dst,994mlib_s32 dlb,995mlib_s32 xsize,996mlib_s32 ysize,997mlib_s32 csize,998const mlib_d64 **table)999{1000const mlib_d64 *table_base[4];1001mlib_s32 c;10021003for (c = 0; c < csize; c++) {1004table_base[c] = &table[c][0];1005}10061007MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u16, table_base);1008}10091010/***************************************************************/1011void mlib_ImageLookUpSI_S32_D64(const mlib_s32 *src,1012mlib_s32 slb,1013mlib_d64 *dst,1014mlib_s32 dlb,1015mlib_s32 xsize,1016mlib_s32 ysize,1017mlib_s32 csize,1018const mlib_d64 **table)1019{1020const mlib_d64 *table_base[4];1021mlib_u32 shift = TABLE_SHIFT_S32;1022mlib_s32 c;10231024for (c = 0; c < csize; c++) {1025table_base[c] = &table[c][shift];1026}10271028MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s32, table_base);1029}10301031/***************************************************************/103210331034