1 /* |
1 /* |
2 * jfdctflt.c |
2 * jfdctflt.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 floating-point implementation of the |
9 * This file contains a floating-point implementation of the |
9 * forward DCT (Discrete Cosine Transform). |
10 * forward DCT (Discrete Cosine Transform). |
54 /* |
55 /* |
55 * Perform the forward DCT on one block of samples. |
56 * Perform the forward DCT on one block of samples. |
56 */ |
57 */ |
57 |
58 |
58 GLOBAL(void) |
59 GLOBAL(void) |
59 jpeg_fdct_float (FAST_FLOAT * data) |
60 jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col) |
60 { |
61 { |
61 FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
62 FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
62 FAST_FLOAT tmp10, tmp11, tmp12, tmp13; |
63 FAST_FLOAT tmp10, tmp11, tmp12, tmp13; |
63 FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; |
64 FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; |
64 FAST_FLOAT *dataptr; |
65 FAST_FLOAT *dataptr; |
|
66 JSAMPROW elemptr; |
65 int ctr; |
67 int ctr; |
66 |
68 |
67 /* Pass 1: process rows. */ |
69 /* Pass 1: process rows. */ |
68 |
70 |
69 dataptr = data; |
71 dataptr = data; |
70 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { |
72 for (ctr = 0; ctr < DCTSIZE; ctr++) { |
71 tmp0 = dataptr[0] + dataptr[7]; |
73 elemptr = sample_data[ctr] + start_col; |
72 tmp7 = dataptr[0] - dataptr[7]; |
74 |
73 tmp1 = dataptr[1] + dataptr[6]; |
75 /* Load data into workspace */ |
74 tmp6 = dataptr[1] - dataptr[6]; |
76 tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7])); |
75 tmp2 = dataptr[2] + dataptr[5]; |
77 tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7])); |
76 tmp5 = dataptr[2] - dataptr[5]; |
78 tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6])); |
77 tmp3 = dataptr[3] + dataptr[4]; |
79 tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6])); |
78 tmp4 = dataptr[3] - dataptr[4]; |
80 tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5])); |
79 |
81 tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5])); |
|
82 tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4])); |
|
83 tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4])); |
|
84 |
80 /* Even part */ |
85 /* Even part */ |
81 |
86 |
82 tmp10 = tmp0 + tmp3; /* phase 2 */ |
87 tmp10 = tmp0 + tmp3; /* phase 2 */ |
83 tmp13 = tmp0 - tmp3; |
88 tmp13 = tmp0 - tmp3; |
84 tmp11 = tmp1 + tmp2; |
89 tmp11 = tmp1 + tmp2; |
85 tmp12 = tmp1 - tmp2; |
90 tmp12 = tmp1 - tmp2; |
86 |
91 |
87 dataptr[0] = tmp10 + tmp11; /* phase 3 */ |
92 /* Apply unsigned->signed conversion */ |
|
93 dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ |
88 dataptr[4] = tmp10 - tmp11; |
94 dataptr[4] = tmp10 - tmp11; |
89 |
95 |
90 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ |
96 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ |
91 dataptr[2] = tmp13 + z1; /* phase 5 */ |
97 dataptr[2] = tmp13 + z1; /* phase 5 */ |
92 dataptr[6] = tmp13 - z1; |
98 dataptr[6] = tmp13 - z1; |
93 |
99 |
94 /* Odd part */ |
100 /* Odd part */ |
95 |
101 |
96 tmp10 = tmp4 + tmp5; /* phase 2 */ |
102 tmp10 = tmp4 + tmp5; /* phase 2 */ |
97 tmp11 = tmp5 + tmp6; |
103 tmp11 = tmp5 + tmp6; |
98 tmp12 = tmp6 + tmp7; |
104 tmp12 = tmp6 + tmp7; |
124 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; |
130 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; |
125 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; |
131 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; |
126 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; |
132 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; |
127 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; |
133 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; |
128 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; |
134 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; |
129 |
135 |
130 /* Even part */ |
136 /* Even part */ |
131 |
137 |
132 tmp10 = tmp0 + tmp3; /* phase 2 */ |
138 tmp10 = tmp0 + tmp3; /* phase 2 */ |
133 tmp13 = tmp0 - tmp3; |
139 tmp13 = tmp0 - tmp3; |
134 tmp11 = tmp1 + tmp2; |
140 tmp11 = tmp1 + tmp2; |
135 tmp12 = tmp1 - tmp2; |
141 tmp12 = tmp1 - tmp2; |
136 |
142 |
137 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ |
143 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ |
138 dataptr[DCTSIZE*4] = tmp10 - tmp11; |
144 dataptr[DCTSIZE*4] = tmp10 - tmp11; |
139 |
145 |
140 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ |
146 z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ |
141 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ |
147 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ |
142 dataptr[DCTSIZE*6] = tmp13 - z1; |
148 dataptr[DCTSIZE*6] = tmp13 - z1; |
143 |
149 |
144 /* Odd part */ |
150 /* Odd part */ |
145 |
151 |
146 tmp10 = tmp4 + tmp5; /* phase 2 */ |
152 tmp10 = tmp4 + tmp5; /* phase 2 */ |
147 tmp11 = tmp5 + tmp6; |
153 tmp11 = tmp5 + tmp6; |
148 tmp12 = tmp6 + tmp7; |
154 tmp12 = tmp6 + tmp7; |