src/3rdparty/libjpeg/jfdctfst.c
changeset 30 5dc02b23752f
parent 0 1918ee327afb
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
     1 /*
     1 /*
     2  * jfdctfst.c
     2  * jfdctfst.c
     3  *
     3  *
     4  * Copyright (C) 1994-1996, Thomas G. Lane.
     4  * Copyright (C) 1994-1996, Thomas G. Lane.
       
     5  * Modified 2003-2009 by Guido Vollbeding.
     5  * This file is part of the Independent JPEG Group's software.
     6  * This file is part of the Independent JPEG Group's software.
     6  * For conditions of distribution and use, see the accompanying README file.
     7  * For conditions of distribution and use, see the accompanying README file.
     7  *
     8  *
     8  * This file contains a fast, not so accurate integer implementation of the
     9  * This file contains a fast, not so accurate integer implementation of the
     9  * forward DCT (Discrete Cosine Transform).
    10  * forward DCT (Discrete Cosine Transform).
   109 /*
   110 /*
   110  * Perform the forward DCT on one block of samples.
   111  * Perform the forward DCT on one block of samples.
   111  */
   112  */
   112 
   113 
   113 GLOBAL(void)
   114 GLOBAL(void)
   114 jpeg_fdct_ifast (DCTELEM * data)
   115 jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
   115 {
   116 {
   116   DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
   117   DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
   117   DCTELEM tmp10, tmp11, tmp12, tmp13;
   118   DCTELEM tmp10, tmp11, tmp12, tmp13;
   118   DCTELEM z1, z2, z3, z4, z5, z11, z13;
   119   DCTELEM z1, z2, z3, z4, z5, z11, z13;
   119   DCTELEM *dataptr;
   120   DCTELEM *dataptr;
       
   121   JSAMPROW elemptr;
   120   int ctr;
   122   int ctr;
   121   SHIFT_TEMPS
   123   SHIFT_TEMPS
   122 
   124 
   123   /* Pass 1: process rows. */
   125   /* Pass 1: process rows. */
   124 
   126 
   125   dataptr = data;
   127   dataptr = data;
   126   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
   128   for (ctr = 0; ctr < DCTSIZE; ctr++) {
   127     tmp0 = dataptr[0] + dataptr[7];
   129     elemptr = sample_data[ctr] + start_col;
   128     tmp7 = dataptr[0] - dataptr[7];
   130 
   129     tmp1 = dataptr[1] + dataptr[6];
   131     /* Load data into workspace */
   130     tmp6 = dataptr[1] - dataptr[6];
   132     tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
   131     tmp2 = dataptr[2] + dataptr[5];
   133     tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);
   132     tmp5 = dataptr[2] - dataptr[5];
   134     tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);
   133     tmp3 = dataptr[3] + dataptr[4];
   135     tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);
   134     tmp4 = dataptr[3] - dataptr[4];
   136     tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);
   135     
   137     tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
       
   138     tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);
       
   139     tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
       
   140 
   136     /* Even part */
   141     /* Even part */
   137     
   142 
   138     tmp10 = tmp0 + tmp3;	/* phase 2 */
   143     tmp10 = tmp0 + tmp3;	/* phase 2 */
   139     tmp13 = tmp0 - tmp3;
   144     tmp13 = tmp0 - tmp3;
   140     tmp11 = tmp1 + tmp2;
   145     tmp11 = tmp1 + tmp2;
   141     tmp12 = tmp1 - tmp2;
   146     tmp12 = tmp1 - tmp2;
   142     
   147 
   143     dataptr[0] = tmp10 + tmp11; /* phase 3 */
   148     /* Apply unsigned->signed conversion */
       
   149     dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */
   144     dataptr[4] = tmp10 - tmp11;
   150     dataptr[4] = tmp10 - tmp11;
   145     
   151 
   146     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
   152     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
   147     dataptr[2] = tmp13 + z1;	/* phase 5 */
   153     dataptr[2] = tmp13 + z1;	/* phase 5 */
   148     dataptr[6] = tmp13 - z1;
   154     dataptr[6] = tmp13 - z1;
   149     
   155 
   150     /* Odd part */
   156     /* Odd part */
   151 
   157 
   152     tmp10 = tmp4 + tmp5;	/* phase 2 */
   158     tmp10 = tmp4 + tmp5;	/* phase 2 */
   153     tmp11 = tmp5 + tmp6;
   159     tmp11 = tmp5 + tmp6;
   154     tmp12 = tmp6 + tmp7;
   160     tmp12 = tmp6 + tmp7;
   180     tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
   186     tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
   181     tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
   187     tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
   182     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
   188     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
   183     tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
   189     tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
   184     tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
   190     tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
   185     
   191 
   186     /* Even part */
   192     /* Even part */
   187     
   193 
   188     tmp10 = tmp0 + tmp3;	/* phase 2 */
   194     tmp10 = tmp0 + tmp3;	/* phase 2 */
   189     tmp13 = tmp0 - tmp3;
   195     tmp13 = tmp0 - tmp3;
   190     tmp11 = tmp1 + tmp2;
   196     tmp11 = tmp1 + tmp2;
   191     tmp12 = tmp1 - tmp2;
   197     tmp12 = tmp1 - tmp2;
   192     
   198 
   193     dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
   199     dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
   194     dataptr[DCTSIZE*4] = tmp10 - tmp11;
   200     dataptr[DCTSIZE*4] = tmp10 - tmp11;
   195     
   201 
   196     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
   202     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
   197     dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
   203     dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
   198     dataptr[DCTSIZE*6] = tmp13 - z1;
   204     dataptr[DCTSIZE*6] = tmp13 - z1;
   199     
   205 
   200     /* Odd part */
   206     /* Odd part */
   201 
   207 
   202     tmp10 = tmp4 + tmp5;	/* phase 2 */
   208     tmp10 = tmp4 + tmp5;	/* phase 2 */
   203     tmp11 = tmp5 + tmp6;
   209     tmp11 = tmp5 + tmp6;
   204     tmp12 = tmp6 + tmp7;
   210     tmp12 = tmp6 + tmp7;