00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #define JPEG_INTERNALS
00035 #include "jinclude.h"
00036 #include "jpeglib.h"
00037 #include "jdct.h"
00038
00039 #ifdef DCT_IFAST_SUPPORTED
00040
00041
00042
00043
00044
00045
00046 #if DCTSIZE != 8
00047 Sorry, this code only copes with 8x8 DCTs.
00048 #endif
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #define CONST_BITS 8
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 #if CONST_BITS == 8
00080 #define FIX_0_382683433 ((INT32) 98)
00081 #define FIX_0_541196100 ((INT32) 139)
00082 #define FIX_0_707106781 ((INT32) 181)
00083 #define FIX_1_306562965 ((INT32) 334)
00084 #else
00085 #define FIX_0_382683433 FIX(0.382683433)
00086 #define FIX_0_541196100 FIX(0.541196100)
00087 #define FIX_0_707106781 FIX(0.707106781)
00088 #define FIX_1_306562965 FIX(1.306562965)
00089 #endif
00090
00091
00092
00093
00094
00095
00096
00097 #ifndef USE_ACCURATE_ROUNDING
00098 #undef DESCALE
00099 #define DESCALE(x,n) RIGHT_SHIFT(x, n)
00100 #endif
00101
00102
00103
00104
00105
00106
00107 #define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
00108
00109
00110
00111
00112
00113
00114 GLOBAL(void)
00115 jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00116 {
00117 DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00118 DCTELEM tmp10, tmp11, tmp12, tmp13;
00119 DCTELEM z1, z2, z3, z4, z5, z11, z13;
00120 DCTELEM *dataptr;
00121 JSAMPROW elemptr;
00122 int ctr;
00123 SHIFT_TEMPS
00124
00125
00126
00127 dataptr = data;
00128 for (ctr = 0; ctr < DCTSIZE; ctr++) {
00129 elemptr = sample_data[ctr] + start_col;
00130
00131
00132 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
00133 tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);
00134 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);
00135 tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);
00136 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);
00137 tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
00138 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);
00139 tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
00140
00141
00142
00143 tmp10 = tmp0 + tmp3;
00144 tmp13 = tmp0 - tmp3;
00145 tmp11 = tmp1 + tmp2;
00146 tmp12 = tmp1 - tmp2;
00147
00148
00149 dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE;
00150 dataptr[4] = tmp10 - tmp11;
00151
00152 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00153 dataptr[2] = tmp13 + z1;
00154 dataptr[6] = tmp13 - z1;
00155
00156
00157
00158 tmp10 = tmp4 + tmp5;
00159 tmp11 = tmp5 + tmp6;
00160 tmp12 = tmp6 + tmp7;
00161
00162
00163 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433);
00164 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5;
00165 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5;
00166 z3 = MULTIPLY(tmp11, FIX_0_707106781);
00167
00168 z11 = tmp7 + z3;
00169 z13 = tmp7 - z3;
00170
00171 dataptr[5] = z13 + z2;
00172 dataptr[3] = z13 - z2;
00173 dataptr[1] = z11 + z4;
00174 dataptr[7] = z11 - z4;
00175
00176 dataptr += DCTSIZE;
00177 }
00178
00179
00180
00181 dataptr = data;
00182 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00183 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00184 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00185 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00186 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00187 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00188 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00189 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00190 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00191
00192
00193
00194 tmp10 = tmp0 + tmp3;
00195 tmp13 = tmp0 - tmp3;
00196 tmp11 = tmp1 + tmp2;
00197 tmp12 = tmp1 - tmp2;
00198
00199 dataptr[DCTSIZE*0] = tmp10 + tmp11;
00200 dataptr[DCTSIZE*4] = tmp10 - tmp11;
00201
00202 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00203 dataptr[DCTSIZE*2] = tmp13 + z1;
00204 dataptr[DCTSIZE*6] = tmp13 - z1;
00205
00206
00207
00208 tmp10 = tmp4 + tmp5;
00209 tmp11 = tmp5 + tmp6;
00210 tmp12 = tmp6 + tmp7;
00211
00212
00213 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433);
00214 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5;
00215 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5;
00216 z3 = MULTIPLY(tmp11, FIX_0_707106781);
00217
00218 z11 = tmp7 + z3;
00219 z13 = tmp7 - z3;
00220
00221 dataptr[DCTSIZE*5] = z13 + z2;
00222 dataptr[DCTSIZE*3] = z13 - z2;
00223 dataptr[DCTSIZE*1] = z11 + z4;
00224 dataptr[DCTSIZE*7] = z11 - z4;
00225
00226 dataptr++;
00227 }
00228 }
00229
00230 #endif