Develop and Download Open Source Software

Browse Subversion Repository

Contents of /dct.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (show annotations) (download) (as text)
Sun Apr 5 12:08:23 2009 UTC (15 years, 1 month ago) by berupon
File MIME type: text/x-chdr
File size: 6641 byte(s)
既に他の場所で公開済みのImageCompressionのプロジェクトを取り込み。
1 #pragma once
2
3 // http://en.wikipedia.org/wiki/Hadamard_transform
4
5 // integer 4x4 forward Discrete Hadamard Transform
6 inline void dht_4x4(short d[4][4], short t[4][4])
7 {
8 for (size_t i=0; i<4; ++i) {
9 int s01 = d[i][0] + d[i][1];
10 int d01 = d[i][0] - d[i][1];
11 int s23 = d[i][2] + d[i][3];
12 int d23 = d[i][2] - d[i][3];
13
14 t[0][i] = s01 + s23;
15 t[1][i] = s01 - s23;
16 t[2][i] = d01 - d23;
17 t[3][i] = d01 + d23;
18 }
19
20 for (size_t i=0; i<4; ++i) {
21 int s01 = t[i][0] + t[i][1];
22 int d01 = t[i][0] - t[i][1];
23 int s23 = t[i][2] + t[i][3];
24 int d23 = t[i][2] - t[i][3];
25
26 d[i][0] = s01 + s23;
27 d[i][1] = s01 - s23;
28 d[i][2] = d01 - d23;
29 d[i][3] = d01 + d23;
30 }
31 }
32
33 inline void dht_8x8(int d[8][8], int t[8][8])
34 {
35 /*
36
37 1 ----------------
38 2 --------________
39 3 ----________----
40 4 ----____----____
41 5 --____----____--
42 6 --____--__----__
43 7 --__--____--__--
44 8 --__--__--__--__
45
46 */
47 for (size_t i=0; i<8; ++i) {
48 int s01 = d[i][0] + d[i][1];
49 int d01 = d[i][0] - d[i][1];
50 int s23 = d[i][2] + d[i][3];
51 int d23 = d[i][2] - d[i][3];
52 int s45 = d[i][4] + d[i][5];
53 int d45 = d[i][4] - d[i][5];
54 int s67 = d[i][6] + d[i][7];
55 int d67 = d[i][6] - d[i][7];
56
57 int a0 = s01 + s23;
58 int a1 = s01 - s23;
59 int a2 = d01 + d23;
60 int a3 = d01 - d23;
61 int a4 = s45 + s67;
62 int a5 = s45 - s67;
63 int a6 = d45 + d67;
64 int a7 = d45 - d67;
65
66 t[0][i] = a0 + a4;
67 t[1][i] = a0 - a4;
68 t[2][i] = a1 - a5;
69 t[3][i] = a1 + a5;
70 t[4][i] = a3 + a7;
71 t[5][i] = a3 - a7;
72 t[6][i] = a2 - a6;
73 t[7][i] = a2 + a6;
74 }
75 for (size_t i=0; i<8; ++i) {
76 int s01 = t[i][0] + t[i][1];
77 int d01 = t[i][0] - t[i][1];
78 int s23 = t[i][2] + t[i][3];
79 int d23 = t[i][2] - t[i][3];
80 int s45 = t[i][4] + t[i][5];
81 int d45 = t[i][4] - t[i][5];
82 int s67 = t[i][6] + t[i][7];
83 int d67 = t[i][6] - t[i][7];
84
85 int a0 = s01 + s23;
86 int a1 = s01 - s23;
87 int a2 = d01 + d23;
88 int a3 = d01 - d23;
89 int a4 = s45 + s67;
90 int a5 = s45 - s67;
91 int a6 = d45 + d67;
92 int a7 = d45 - d67;
93
94 d[i][0] = a0 + a4;
95 d[i][1] = a0 - a4;
96 d[i][2] = a1 - a5;
97 d[i][3] = a1 + a5;
98 d[i][4] = a3 + a7;
99 d[i][5] = a3 - a7;
100 d[i][6] = a2 - a6;
101 d[i][7] = a2 + a6;
102 }
103 }
104
105 // integer 8x8 forward Discrete Cosine Transform
106 inline void dct_8x8(int d[8][8], int t[8][8])
107 {
108 // horizontal
109 for (size_t i=0; i<8; ++i) {
110 int p0 = d[i][0];
111 int p1 = d[i][1];
112 int p2 = d[i][2];
113 int p3 = d[i][3];
114 int p4 = d[i][4];
115 int p5 = d[i][5];
116 int p6 = d[i][6];
117 int p7 = d[i][7];
118
119 int a0 = p0 + p7;
120 int a1 = p1 + p6;
121 int a2 = p2 + p5;
122 int a3 = p3 + p4;
123
124 int b0 = (a0 + a3) << 1;
125 int b1 = (a1 + a2) << 1;
126 int b2 = (a0 - a3) << 1;
127 int b3 = (a1 - a2) << 1;
128
129 a0 = p0 - p7;
130 a1 = p1 - p6;
131 a2 = p2 - p5;
132 a3 = p3 - p4;
133
134 int b4 = ((a1 + a2) << 1) + (a0 * 3);
135 int b5 = ((a0 - a3) << 1) - (a2 * 3);
136 int b6 = ((a0 + a3) << 1) - (a1 * 3);
137 int b7 = ((a1 - a2) << 1) + (a3 * 3);
138
139 t[i][0] = (b0 + b1) << 2;
140 t[i][1] = (b4 << 2) + b7;
141 t[i][2] = (b2 << 2) + (b3 << 1);
142 t[i][3] = (b5 << 2) + b6;
143 t[i][4] = (b0 - b1) << 2;
144 t[i][5] = (b6 << 2) - b5;
145 t[i][6] = (b2 << 1) - (b3 << 2);
146 t[i][7] = b4 - (b7 << 2);
147 }
148 // vertical
149 for (size_t i=0; i<8; ++i) {
150 int p0 = t[0][i];
151 int p1 = t[1][i];
152 int p2 = t[2][i];
153 int p3 = t[3][i];
154 int p4 = t[4][i];
155 int p5 = t[5][i];
156 int p6 = t[6][i];
157 int p7 = t[7][i];
158
159 int a0 = p0 + p7;
160 int a1 = p1 + p6;
161 int a2 = p2 + p5;
162 int a3 = p3 + p4;
163
164 int b0 = (a0 + a3) << 1;
165 int b1 = (a1 + a2) << 1;
166 int b2 = (a0 - a3) << 1;
167 int b3 = (a1 - a2) << 1;
168
169 a0 = p0 - p7;
170 a1 = p1 - p6;
171 a2 = p2 - p5;
172 a3 = p3 - p4;
173
174 int b4 = ((a1 + a2) << 1) + (a0 * 3);
175 int b5 = ((a0 - a3) << 1) - (a2 * 3);
176 int b6 = ((a0 + a3) << 1) - (a1 * 3);
177 int b7 = ((a1 - a2) << 1) + (a3 * 3);
178
179 d[0][i] = (b0 + b1) << 2;
180 d[1][i] = (b4 << 2) + b7;
181 d[2][i] = (b2 << 2) + (b3 << 1);
182 d[3][i] = (b5 << 2) + b6;
183 d[4][i] = (b0 - b1) << 2;
184 d[5][i] = (b6 << 2) - b5;
185 d[6][i] = (b2 << 1) - (b3 << 2);
186 d[7][i] = b4 - (b7 << 2);
187 }
188 }
189
190 // integer 8x8 inverse Discrete Cosine Transform
191 inline void idct_8x8(int d[8][8], int t[8][8])
192 {
193 // horizontal
194 for (size_t i=0; i<8; ++i) {
195 int p0 = d[i][0];
196 int p1 = d[i][1];
197 int p2 = d[i][2];
198 int p3 = d[i][3];
199 int p4 = d[i][4];
200 int p5 = d[i][5];
201 int p6 = d[i][6];
202 int p7 = d[i][7];
203
204 int a0 = (p0 + p4) << 3;
205 int a1 = (p0 - p4) << 3;
206 int a2 = (p6 << 3) - (p2 << 2);
207 int a3 = (p2 << 3) + (p6 << 2);
208
209 int b0 = a0 + a3;
210 int b2 = a1 - a2;
211 int b4 = a1 + a2;
212 int b6 = a0 - a3;
213
214 a0 = ((-p3 + p5 - p7) << 1) - p7;
215 a1 = (( p1 + p7 - p3) << 1) - p3;
216 a2 = ((-p1 + p7 + p5) << 1) + p5;
217 a3 = (( p3 + p5 + p1) << 1) + p1;
218
219 int b1 = (a0 << 2) + a3;
220 int b3 = (a1 << 2) + a2;
221 int b5 = (a2 << 2) - a1;
222 int b7 = (a3 << 2) - a0;
223
224 t[i][0] = b0 + b7;
225 t[i][1] = b2 - b5;
226 t[i][2] = b4 + b3;
227 t[i][3] = b6 + b1;
228 t[i][4] = b6 - b1;
229 t[i][5] = b4 - b3;
230 t[i][6] = b2 + b5;
231 t[i][7] = b0 - b7;
232 }
233 // vertical
234 for (size_t i=0; i<8; ++i) {
235 int p0 = t[0][i];
236 int p1 = t[1][i];
237 int p2 = t[2][i];
238 int p3 = t[3][i];
239 int p4 = t[4][i];
240 int p5 = t[5][i];
241 int p6 = t[6][i];
242 int p7 = t[7][i];
243
244 int a0 = (p0 + p4) << 3;
245 int a1 = (p0 - p4) << 3;
246 int a2 = (p6 << 3) - (p2 << 2);
247 int a3 = (p2 << 3) + (p6 << 2);
248
249 int b0 = a0 + a3;
250 int b2 = a1 - a2;
251 int b4 = a1 + a2;
252 int b6 = a0 - a3;
253
254 a0 = ((-p3 + p5 - p7) << 1) - p7;
255 a1 = (( p1 + p7 - p3) << 1) - p3;
256 a2 = ((-p1 + p7 + p5) << 1) + p5;
257 a3 = (( p3 + p5 + p1) << 1) + p1;
258
259 int b1 = (a0 << 2) + a3;
260 int b3 = (a1 << 2) + a2;
261 int b5 = (a2 << 2) - a1;
262 int b7 = (a3 << 2) - a0;
263
264 d[0][i] = b0 + b7;
265 d[1][i] = b2 - b5;
266 d[2][i] = b4 + b3;
267 d[3][i] = b6 + b1;
268 d[4][i] = b6 - b1;
269 d[5][i] = b4 - b3;
270 d[6][i] = b2 + b5;
271 d[7][i] = b0 - b7;
272 }
273 }
274
275 /*
276 Y = (R + 2G + B) >> 2
277 Co = (R - B) >> 1
278 Cg = (-R + 2G - B) >> 2
279 */
280 inline void RGB_2_YCoCg(short r, short g, short b, short& y, short& co, short& cg)
281 {
282 assert(r <= 255);
283 assert(g <= 255);
284 assert(b <= 255);
285 y = r + 2 * g + b;
286 co = r - b;
287 cg = -r + 2 * g -b;
288 }
289
290 /*
291 R = Y + Co - Cg
292 G = Y + Cg
293 B = Y - Co - Cg
294 */
295 inline void YCoCg_2_RGB(short y, short co, short cg, short& r, short& g, short& b)
296 {
297 short ymcg = y - cg;
298 short co2 = 2 * co;
299 r = (ymcg + co2) >> 2;
300 g = (y + cg) >> 2;
301 b = (ymcg - co2) >> 2;
302 assert(r <= 255);
303 assert(g <= 255);
304 assert(b <= 255);
305 }
306

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26