/*
 * Copyright 1998-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 "vis_proto.h"
#include "mlib_image.h"
#include "mlib_v_ImageLookUpFunc.h"

/***************************************************************/
static void mlib_v_ImageLookUp_S16_S32_124_D1(const mlib_s16 *src,
                                              mlib_f32       *dst,
                                              mlib_s32       xsize,
                                              const mlib_f32 *table0,
                                              const mlib_f32 *table1,
                                              const mlib_f32 *table2,
                                              const mlib_f32 *table3);

static void mlib_v_ImageLookUp_S16_S32_3_D1(const mlib_s16 *src,
                                            mlib_f32       *dst,
                                            mlib_s32       xsize,
                                            const mlib_f32 *table0,
                                            const mlib_f32 *table1,
                                            const mlib_f32 *table2);

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_124_D1(const mlib_s16 *src,
                                       mlib_f32       *dst,
                                       mlib_s32       xsize,
                                       const mlib_f32 *table0,
                                       const mlib_f32 *table1,
                                       const mlib_f32 *table2,
                                       const mlib_f32 *table3)
{
  mlib_s32 *sa;          /* aligned pointer to source data */
  mlib_s16 *sp;          /* pointer to source data */
  mlib_s32 s0, s1;       /* source data */
  mlib_f32 *dp;          /* aligned pointer to destination */
  mlib_f32 acc0, acc1;   /* destination data */
  mlib_f32 acc2, acc3;   /* destination data */
  mlib_s32 i;            /* loop variable */
  mlib_s32 s00, s01, s02, s03;

  sa   = (mlib_s32*)src;
  dp   = dst;

  i = 0;

  if (xsize >= 4) {

    s0 = *sa++;
    s1 = *sa++;
    s00 = (s0 >> 14) & (~3);
    s01 = ((s0 << 16) >> 14);

#pragma pipeloop(0)
    for(i = 0; i <= xsize - 8; i+=4, dp += 4) {
      s02 = (s1 >> 14) & (~3);
      s03 = ((s1 << 16) >> 14);
      acc0 = *(mlib_f32*)((mlib_u8*)table0 + s00);
      acc1 = *(mlib_f32*)((mlib_u8*)table1 + s01);
      acc2 = *(mlib_f32*)((mlib_u8*)table2 + s02);
      acc3 = *(mlib_f32*)((mlib_u8*)table3 + s03);
      s0 = *sa++;
      s1 = *sa++;
      s00 = (s0 >> 14) & (~3);
      s01 = ((s0 << 16) >> 14);
      dp[0] = acc0;
      dp[1] = acc1;
      dp[2] = acc2;
      dp[3] = acc3;
    }

    s02 = (s1 >> 14) & (~3);
    s03 = ((s1 << 16) >> 14);
    acc0 = *(mlib_f32*)((mlib_u8*)table0 + s00);
    acc1 = *(mlib_f32*)((mlib_u8*)table1 + s01);
    acc2 = *(mlib_f32*)((mlib_u8*)table2 + s02);
    acc3 = *(mlib_f32*)((mlib_u8*)table3 + s03);
    dp[0] = acc0;
    dp[1] = acc1;
    dp[2] = acc2;
    dp[3] = acc3;
    dp += 4;
    i += 4;
  }

  sp = (mlib_s16*)sa;

  if ( i < xsize ) {
    *dp++ = table0[sp[0]];
    i++; sp++;
  }

  if ( i < xsize ) {
    *dp++ = table1[sp[0]];
    i++; sp++;
  }

  if ( i < xsize ) {
    *dp++ = table2[sp[0]];
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_1(const mlib_s16 *src,
                                  mlib_s32       slb,
                                  mlib_s32       *dst,
                                  mlib_s32       dlb,
                                  mlib_s32       xsize,
                                  mlib_s32       ysize,
                                  const mlib_s32 **table)
{
  mlib_s16 *sl;
  mlib_s32 *dl;
  mlib_f32 *tab = (mlib_f32*)(&table[0][32768]);
  mlib_s32 j;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j ++) {
    mlib_s16 *sp = sl;
    mlib_f32 *dp = (mlib_f32*)dl;
    mlib_s32 off, size = xsize;

    off = (mlib_s32)(((4 - ((mlib_addr)sp & 3)) & 3) >> 1);

    off = (off < size) ? off : size;

    if (off == 1) {
      *dp++ = tab[(*sp++)];
      size--;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S16_S32_124_D1(sp, dp, size, tab, tab, tab, tab);
    }

    sl = (mlib_s16 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_2(const mlib_s16 *src,
                                  mlib_s32       slb,
                                  mlib_s32       *dst,
                                  mlib_s32       dlb,
                                  mlib_s32       xsize,
                                  mlib_s32       ysize,
                                  const mlib_s32 **table)
{
  mlib_s16  *sl;
  mlib_s32  *dl;
  mlib_f32  *tab;
  mlib_s32  j;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j ++) {
    mlib_s16  *sp = sl;
    mlib_f32  *dp = (mlib_f32*)dl;
    mlib_s32  off, size = xsize * 2;
    mlib_f32  *tab0 = (mlib_f32*)(&table[0][32768]);
    mlib_f32  *tab1 = (mlib_f32*)(&table[1][32768]);

    off = (mlib_s32)(((4 - ((mlib_addr)sp & 3)) & 3) >> 1);

    off = (off < size) ? off : size;

    if ((off & 1) != 0) {
      *dp++ = tab0[(*sp++)];
      size--;
      tab = tab0; tab0 = tab1; tab1 = tab;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S16_S32_124_D1(sp, dp, size, tab0, tab1, tab0, tab1);
    }

    sl = (mlib_s16 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_4(const mlib_s16 *src,
                                  mlib_s32       slb,
                                  mlib_s32       *dst,
                                  mlib_s32       dlb,
                                  mlib_s32       xsize,
                                  mlib_s32       ysize,
                                  const mlib_s32 **table)
{
  mlib_s16  *sl;
  mlib_s32  *dl;
  mlib_f32  *tab;
  mlib_s32  j;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j ++) {
    mlib_s16  *sp = sl;
    mlib_f32  *dp = (mlib_f32*)dl;
    mlib_f32  *tab0 = (mlib_f32*)(&table[0][32768]);
    mlib_f32  *tab1 = (mlib_f32*)(&table[1][32768]);
    mlib_f32  *tab2 = (mlib_f32*)(&table[2][32768]);
    mlib_f32  *tab3 = (mlib_f32*)(&table[3][32768]);
    mlib_s32  off, size = xsize * 4;

    off = (mlib_s32)(((4 - ((mlib_addr)sp & 3)) & 3) >> 1);

    off = (off < size) ? off : size;

    if (off == 1) {
      *dp++ = tab0[(*sp++)];
      tab = tab0; tab0 = tab1;
      tab1 = tab2; tab2 = tab3; tab3 = tab;
      size--;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S16_S32_124_D1(sp, dp, size, tab0, tab1, tab2, tab3);
    }

    sl = (mlib_s16 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_3_D1(const mlib_s16 *src,
                                     mlib_f32       *dst,
                                     mlib_s32       xsize,
                                     const mlib_f32 *table0,
                                     const mlib_f32 *table1,
                                     const mlib_f32 *table2)
{
  mlib_s32 *sa;          /* aligned pointer to source data */
  mlib_s16 *sp;          /* pointer to source data */
  mlib_s32 s0, s1;       /* source data */
  mlib_f32 *dp;          /* aligned pointer to destination */
  mlib_f32 acc0, acc1;   /* destination data */
  mlib_f32 acc2, acc3;   /* destination data */
  mlib_s32 i;            /* loop variable */
  const mlib_f32 *table;
  mlib_s32 s00, s01, s02, s03;

  sa   = (mlib_s32*)src;
  dp   = dst;

  i = 0;

  if (xsize >= 4) {

    s0 = *sa++;
    s1 = *sa++;
    s00 = (s0 >> 14) & (~3);
    s01 = ((s0 << 16) >> 14);

#pragma pipeloop(0)
    for(i = 0; i <= xsize - 8; i+=4, dp += 4) {
      s02 = (s1 >> 14) & (~3);
      s03 = ((s1 << 16) >> 14);
      acc0 = *(mlib_f32*)((mlib_u8*)table0 + s00);
      acc1 = *(mlib_f32*)((mlib_u8*)table1 + s01);
      acc2 = *(mlib_f32*)((mlib_u8*)table2 + s02);
      acc3 = *(mlib_f32*)((mlib_u8*)table0 + s03);
      s0 = *sa++;
      s1 = *sa++;
      s00 = (s0 >> 14) & (~3);
      s01 = ((s0 << 16) >> 14);
      table = table0; table0 = table1;
      table1 = table2; table2 = table;
      dp[0] = acc0;
      dp[1] = acc1;
      dp[2] = acc2;
      dp[3] = acc3;
    }

    s02 = (s1 >> 14) & (~3);
    s03 = ((s1 << 16) >> 14);
    acc0 = *(mlib_f32*)((mlib_u8*)table0 + s00);
    acc1 = *(mlib_f32*)((mlib_u8*)table1 + s01);
    acc2 = *(mlib_f32*)((mlib_u8*)table2 + s02);
    acc3 = *(mlib_f32*)((mlib_u8*)table0 + s03);
    dp[0] = acc0;
    dp[1] = acc1;
    dp[2] = acc2;
    dp[3] = acc3;
    table = table0; table0 = table1;
    table1 = table2; table2 = table;
    dp += 4;
    i += 4;
  }

  sp = (mlib_s16*)sa;

  if ( i < xsize ) {
    *dp++ = table0[sp[0]];
    i++; sp++;
  }

  if ( i < xsize ) {
    *dp++ = table1[sp[0]];
    i++; sp++;
  }

  if ( i < xsize ) {
    *dp++ = table2[sp[0]];
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S16_S32_3(const mlib_s16 *src,
                                  mlib_s32       slb,
                                  mlib_s32       *dst,
                                  mlib_s32       dlb,
                                  mlib_s32       xsize,
                                  mlib_s32       ysize,
                                  const mlib_s32 **table)
{
  mlib_s16  *sl;
  mlib_s32  *dl;
  mlib_f32  *tab;
  mlib_s32  j;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j ++) {
    mlib_s16  *sp = sl;
    mlib_f32  *dp = (mlib_f32*)dl;
    mlib_f32  *tab0 = (mlib_f32*)(&table[0][32768]);
    mlib_f32  *tab1 = (mlib_f32*)(&table[1][32768]);
    mlib_f32  *tab2 = (mlib_f32*)(&table[2][32768]);
    mlib_s32  off, size = xsize * 3;

    off = (mlib_s32)(((4 - ((mlib_addr)sp & 3)) & 3) >> 1);

    off = (off < size) ? off : size;

    if (off == 1) {
      *dp++ = tab0[(*sp++)];
      tab = tab0; tab0 = tab1;
      tab1 = tab2; tab2 = tab;
      size--;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S16_S32_3_D1(sp, dp, size, tab0, tab1, tab2);
    }

    sl = (mlib_s16 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s32 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
