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
00035
00036
00037
00038 #define JPEG_INTERNALS
00039 #include "jinclude.h"
00040 #include "jpeglib.h"
00041 #include "jdct.h"
00042
00043 #ifdef DCT_FLOAT_SUPPORTED
00044
00045
00046
00047
00048
00049
00050 #if DCTSIZE != 8
00051 Sorry, this code only copes with 8x8 DCTs.
00052 #endif
00053
00054
00055
00056
00057
00058
00059 GLOBAL(void)
00060 jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00061 {
00062 FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00063 FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
00064 FAST_FLOAT z1, z2, z3, z4, z5, z11, z13;
00065 FAST_FLOAT *dataptr;
00066 JSAMPROW elemptr;
00067 int ctr;
00068
00069
00070
00071 dataptr = data;
00072 for (ctr = 0; ctr < DCTSIZE; ctr++) {
00073 elemptr = sample_data[ctr] + start_col;
00074
00075
00076 tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]));
00077 tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]));
00078 tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]));
00079 tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]));
00080 tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]));
00081 tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]));
00082 tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]));
00083 tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]));
00084
00085
00086
00087 tmp10 = tmp0 + tmp3;
00088 tmp13 = tmp0 - tmp3;
00089 tmp11 = tmp1 + tmp2;
00090 tmp12 = tmp1 - tmp2;
00091
00092
00093 dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE;
00094 dataptr[4] = tmp10 - tmp11;
00095
00096 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781);
00097 dataptr[2] = tmp13 + z1;
00098 dataptr[6] = tmp13 - z1;
00099
00100
00101
00102 tmp10 = tmp4 + tmp5;
00103 tmp11 = tmp5 + tmp6;
00104 tmp12 = tmp6 + tmp7;
00105
00106
00107 z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433);
00108 z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5;
00109 z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5;
00110 z3 = tmp11 * ((FAST_FLOAT) 0.707106781);
00111
00112 z11 = tmp7 + z3;
00113 z13 = tmp7 - z3;
00114
00115 dataptr[5] = z13 + z2;
00116 dataptr[3] = z13 - z2;
00117 dataptr[1] = z11 + z4;
00118 dataptr[7] = z11 - z4;
00119
00120 dataptr += DCTSIZE;
00121 }
00122
00123
00124
00125 dataptr = data;
00126 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00127 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00128 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00129 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00130 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00131 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00132 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00133 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00134 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00135
00136
00137
00138 tmp10 = tmp0 + tmp3;
00139 tmp13 = tmp0 - tmp3;
00140 tmp11 = tmp1 + tmp2;
00141 tmp12 = tmp1 - tmp2;
00142
00143 dataptr[DCTSIZE*0] = tmp10 + tmp11;
00144 dataptr[DCTSIZE*4] = tmp10 - tmp11;
00145
00146 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781);
00147 dataptr[DCTSIZE*2] = tmp13 + z1;
00148 dataptr[DCTSIZE*6] = tmp13 - z1;
00149
00150
00151
00152 tmp10 = tmp4 + tmp5;
00153 tmp11 = tmp5 + tmp6;
00154 tmp12 = tmp6 + tmp7;
00155
00156
00157 z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433);
00158 z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5;
00159 z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5;
00160 z3 = tmp11 * ((FAST_FLOAT) 0.707106781);
00161
00162 z11 = tmp7 + z3;
00163 z13 = tmp7 - z3;
00164
00165 dataptr[DCTSIZE*5] = z13 + z2;
00166 dataptr[DCTSIZE*3] = z13 - z2;
00167 dataptr[DCTSIZE*1] = z11 + z4;
00168 dataptr[DCTSIZE*7] = z11 - z4;
00169
00170 dataptr++;
00171 }
00172 }
00173
00174 #endif