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