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
00039
00040
00041
00042
00043
00044 #define JPEG_INTERNALS
00045 #include "jinclude.h"
00046 #include "jpeglib.h"
00047 #include "jdct.h"
00048
00049 #ifdef DCT_ISLOW_SUPPORTED
00050
00051
00052
00053
00054
00055
00056 #if DCTSIZE != 8
00057 Sorry, this code only copes with 8x8 DCT blocks.
00058 #endif
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #if BITS_IN_JSAMPLE == 8
00096 #define CONST_BITS 13
00097 #define PASS1_BITS 2
00098 #else
00099 #define CONST_BITS 13
00100 #define PASS1_BITS 1
00101 #endif
00102
00103
00104
00105
00106
00107
00108
00109
00110 #if CONST_BITS == 13
00111 #define FIX_0_298631336 ((INT32) 2446)
00112 #define FIX_0_390180644 ((INT32) 3196)
00113 #define FIX_0_541196100 ((INT32) 4433)
00114 #define FIX_0_765366865 ((INT32) 6270)
00115 #define FIX_0_899976223 ((INT32) 7373)
00116 #define FIX_1_175875602 ((INT32) 9633)
00117 #define FIX_1_501321110 ((INT32) 12299)
00118 #define FIX_1_847759065 ((INT32) 15137)
00119 #define FIX_1_961570560 ((INT32) 16069)
00120 #define FIX_2_053119869 ((INT32) 16819)
00121 #define FIX_2_562915447 ((INT32) 20995)
00122 #define FIX_3_072711026 ((INT32) 25172)
00123 #else
00124 #define FIX_0_298631336 FIX(0.298631336)
00125 #define FIX_0_390180644 FIX(0.390180644)
00126 #define FIX_0_541196100 FIX(0.541196100)
00127 #define FIX_0_765366865 FIX(0.765366865)
00128 #define FIX_0_899976223 FIX(0.899976223)
00129 #define FIX_1_175875602 FIX(1.175875602)
00130 #define FIX_1_501321110 FIX(1.501321110)
00131 #define FIX_1_847759065 FIX(1.847759065)
00132 #define FIX_1_961570560 FIX(1.961570560)
00133 #define FIX_2_053119869 FIX(2.053119869)
00134 #define FIX_2_562915447 FIX(2.562915447)
00135 #define FIX_3_072711026 FIX(3.072711026)
00136 #endif
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 #if BITS_IN_JSAMPLE == 8
00147 #define MULTIPLY(var,const) MULTIPLY16C16(var,const)
00148 #else
00149 #define MULTIPLY(var,const) ((var) * (const))
00150 #endif
00151
00152
00153
00154
00155
00156
00157 GLOBAL(void)
00158 jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00159 {
00160 INT32 tmp0, tmp1, tmp2, tmp3;
00161 INT32 tmp10, tmp11, tmp12, tmp13;
00162 INT32 z1;
00163 DCTELEM *dataptr;
00164 JSAMPROW elemptr;
00165 int ctr;
00166 SHIFT_TEMPS
00167
00168
00169
00170
00171
00172 dataptr = data;
00173 for (ctr = 0; ctr < DCTSIZE; ctr++) {
00174 elemptr = sample_data[ctr] + start_col;
00175
00176
00177
00178
00179
00180 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
00181 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);
00182 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);
00183 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);
00184
00185 tmp10 = tmp0 + tmp3;
00186 tmp12 = tmp0 - tmp3;
00187 tmp11 = tmp1 + tmp2;
00188 tmp13 = tmp1 - tmp2;
00189
00190 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);
00191 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);
00192 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
00193 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
00194
00195
00196 dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
00197 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
00198
00199 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00200
00201 z1 += ONE << (CONST_BITS-PASS1_BITS-1);
00202 dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
00203 CONST_BITS-PASS1_BITS);
00204 dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
00205 CONST_BITS-PASS1_BITS);
00206
00207
00208
00209
00210
00211
00212 tmp10 = tmp0 + tmp3;
00213 tmp11 = tmp1 + tmp2;
00214 tmp12 = tmp0 + tmp2;
00215 tmp13 = tmp1 + tmp3;
00216 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
00217
00218 z1 += ONE << (CONST_BITS-PASS1_BITS-1);
00219
00220 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
00221 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
00222 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
00223 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
00224 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
00225 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
00226 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
00227 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
00228
00229 tmp12 += z1;
00230 tmp13 += z1;
00231
00232 dataptr[1] = (DCTELEM)
00233 RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
00234 dataptr[3] = (DCTELEM)
00235 RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
00236 dataptr[5] = (DCTELEM)
00237 RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
00238 dataptr[7] = (DCTELEM)
00239 RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
00240
00241 dataptr += DCTSIZE;
00242 }
00243
00244
00245
00246
00247
00248
00249 dataptr = data;
00250 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00251
00252
00253
00254
00255 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00256 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00257 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00258 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00259
00260
00261 tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1));
00262 tmp12 = tmp0 - tmp3;
00263 tmp11 = tmp1 + tmp2;
00264 tmp13 = tmp1 - tmp2;
00265
00266 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00267 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00268 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00269 tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00270
00271 dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
00272 dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
00273
00274 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00275
00276 z1 += ONE << (CONST_BITS+PASS1_BITS-1);
00277 dataptr[DCTSIZE*2] = (DCTELEM)
00278 RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
00279 dataptr[DCTSIZE*6] = (DCTELEM)
00280 RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
00281
00282
00283
00284
00285
00286
00287 tmp10 = tmp0 + tmp3;
00288 tmp11 = tmp1 + tmp2;
00289 tmp12 = tmp0 + tmp2;
00290 tmp13 = tmp1 + tmp3;
00291 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
00292
00293 z1 += ONE << (CONST_BITS+PASS1_BITS-1);
00294
00295 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
00296 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
00297 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
00298 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
00299 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
00300 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
00301 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
00302 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
00303
00304 tmp12 += z1;
00305 tmp13 += z1;
00306
00307 dataptr[DCTSIZE*1] = (DCTELEM)
00308 RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
00309 dataptr[DCTSIZE*3] = (DCTELEM)
00310 RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
00311 dataptr[DCTSIZE*5] = (DCTELEM)
00312 RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
00313 dataptr[DCTSIZE*7] = (DCTELEM)
00314 RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
00315
00316 dataptr++;
00317 }
00318 }
00319
00320 #ifdef DCT_SCALING_SUPPORTED
00321
00322
00323
00324
00325
00326
00327 GLOBAL(void)
00328 jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00329 {
00330 INT32 tmp0, tmp1, tmp2, tmp3;
00331 INT32 tmp10, tmp11, tmp12;
00332 INT32 z1, z2, z3;
00333 DCTELEM *dataptr;
00334 JSAMPROW elemptr;
00335 int ctr;
00336 SHIFT_TEMPS
00337
00338
00339 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00340
00341
00342
00343
00344
00345
00346 dataptr = data;
00347 for (ctr = 0; ctr < 7; ctr++) {
00348 elemptr = sample_data[ctr] + start_col;
00349
00350
00351
00352 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]);
00353 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]);
00354 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]);
00355 tmp3 = GETJSAMPLE(elemptr[3]);
00356
00357 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]);
00358 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]);
00359 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);
00360
00361 z1 = tmp0 + tmp2;
00362
00363 dataptr[0] = (DCTELEM)
00364 ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);
00365 tmp3 += tmp3;
00366 z1 -= tmp3;
00367 z1 -= tmp3;
00368 z1 = MULTIPLY(z1, FIX(0.353553391));
00369 z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002));
00370 z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123));
00371 dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS);
00372 z1 -= z2;
00373 z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734));
00374 dataptr[4] = (DCTELEM)
00375 DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)),
00376 CONST_BITS-PASS1_BITS);
00377 dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS);
00378
00379
00380
00381 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347));
00382 tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339));
00383 tmp0 = tmp1 - tmp2;
00384 tmp1 += tmp2;
00385 tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276));
00386 tmp1 += tmp2;
00387 tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268));
00388 tmp0 += tmp3;
00389 tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693));
00390
00391 dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);
00392 dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);
00393 dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);
00394
00395 dataptr += DCTSIZE;
00396 }
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406 dataptr = data;
00407 for (ctr = 0; ctr < 7; ctr++) {
00408
00409
00410 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6];
00411 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5];
00412 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4];
00413 tmp3 = dataptr[DCTSIZE*3];
00414
00415 tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6];
00416 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5];
00417 tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4];
00418
00419 z1 = tmp0 + tmp2;
00420 dataptr[DCTSIZE*0] = (DCTELEM)
00421 DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)),
00422 CONST_BITS+PASS1_BITS);
00423 tmp3 += tmp3;
00424 z1 -= tmp3;
00425 z1 -= tmp3;
00426 z1 = MULTIPLY(z1, FIX(0.461784020));
00427 z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084));
00428 z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446));
00429 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS);
00430 z1 -= z2;
00431 z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509));
00432 dataptr[DCTSIZE*4] = (DCTELEM)
00433 DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)),
00434 CONST_BITS+PASS1_BITS);
00435 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS);
00436
00437
00438
00439 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677));
00440 tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464));
00441 tmp0 = tmp1 - tmp2;
00442 tmp1 += tmp2;
00443 tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523));
00444 tmp1 += tmp2;
00445 tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310));
00446 tmp0 += tmp3;
00447 tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355));
00448
00449 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS);
00450 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS);
00451 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS);
00452
00453 dataptr++;
00454 }
00455 }
00456
00457
00458
00459
00460
00461
00462 GLOBAL(void)
00463 jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00464 {
00465 INT32 tmp0, tmp1, tmp2;
00466 INT32 tmp10, tmp11, tmp12;
00467 DCTELEM *dataptr;
00468 JSAMPROW elemptr;
00469 int ctr;
00470 SHIFT_TEMPS
00471
00472
00473 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00474
00475
00476
00477
00478
00479
00480 dataptr = data;
00481 for (ctr = 0; ctr < 6; ctr++) {
00482 elemptr = sample_data[ctr] + start_col;
00483
00484
00485
00486 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);
00487 tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);
00488 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);
00489
00490 tmp10 = tmp0 + tmp2;
00491 tmp12 = tmp0 - tmp2;
00492
00493 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);
00494 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
00495 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
00496
00497
00498 dataptr[0] = (DCTELEM)
00499 ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);
00500 dataptr[2] = (DCTELEM)
00501 DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),
00502 CONST_BITS-PASS1_BITS);
00503 dataptr[4] = (DCTELEM)
00504 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)),
00505 CONST_BITS-PASS1_BITS);
00506
00507
00508
00509 tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),
00510 CONST_BITS-PASS1_BITS);
00511
00512 dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS));
00513 dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS);
00514 dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS));
00515
00516 dataptr += DCTSIZE;
00517 }
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 dataptr = data;
00528 for (ctr = 0; ctr < 6; ctr++) {
00529
00530
00531 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];
00532 tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];
00533 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
00534
00535 tmp10 = tmp0 + tmp2;
00536 tmp12 = tmp0 - tmp2;
00537
00538 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];
00539 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];
00540 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
00541
00542 dataptr[DCTSIZE*0] = (DCTELEM)
00543 DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),
00544 CONST_BITS+PASS1_BITS);
00545 dataptr[DCTSIZE*2] = (DCTELEM)
00546 DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),
00547 CONST_BITS+PASS1_BITS);
00548 dataptr[DCTSIZE*4] = (DCTELEM)
00549 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)),
00550 CONST_BITS+PASS1_BITS);
00551
00552
00553
00554 tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));
00555
00556 dataptr[DCTSIZE*1] = (DCTELEM)
00557 DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),
00558 CONST_BITS+PASS1_BITS);
00559 dataptr[DCTSIZE*3] = (DCTELEM)
00560 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),
00561 CONST_BITS+PASS1_BITS);
00562 dataptr[DCTSIZE*5] = (DCTELEM)
00563 DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),
00564 CONST_BITS+PASS1_BITS);
00565
00566 dataptr++;
00567 }
00568 }
00569
00570
00571
00572
00573
00574
00575 GLOBAL(void)
00576 jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00577 {
00578 INT32 tmp0, tmp1, tmp2;
00579 INT32 tmp10, tmp11;
00580 DCTELEM *dataptr;
00581 JSAMPROW elemptr;
00582 int ctr;
00583 SHIFT_TEMPS
00584
00585
00586 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00587
00588
00589
00590
00591
00592
00593
00594
00595 dataptr = data;
00596 for (ctr = 0; ctr < 5; ctr++) {
00597 elemptr = sample_data[ctr] + start_col;
00598
00599
00600
00601 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]);
00602 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]);
00603 tmp2 = GETJSAMPLE(elemptr[2]);
00604
00605 tmp10 = tmp0 + tmp1;
00606 tmp11 = tmp0 - tmp1;
00607
00608 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);
00609 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);
00610
00611
00612 dataptr[0] = (DCTELEM)
00613 ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1));
00614 tmp11 = MULTIPLY(tmp11, FIX(0.790569415));
00615 tmp10 -= tmp2 << 2;
00616 tmp10 = MULTIPLY(tmp10, FIX(0.353553391));
00617 dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1);
00618 dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1);
00619
00620
00621
00622 tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876));
00623
00624 dataptr[1] = (DCTELEM)
00625 DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)),
00626 CONST_BITS-PASS1_BITS-1);
00627 dataptr[3] = (DCTELEM)
00628 DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)),
00629 CONST_BITS-PASS1_BITS-1);
00630
00631 dataptr += DCTSIZE;
00632 }
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642 dataptr = data;
00643 for (ctr = 0; ctr < 5; ctr++) {
00644
00645
00646 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4];
00647 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3];
00648 tmp2 = dataptr[DCTSIZE*2];
00649
00650 tmp10 = tmp0 + tmp1;
00651 tmp11 = tmp0 - tmp1;
00652
00653 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4];
00654 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3];
00655
00656 dataptr[DCTSIZE*0] = (DCTELEM)
00657 DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)),
00658 CONST_BITS+PASS1_BITS);
00659 tmp11 = MULTIPLY(tmp11, FIX(1.011928851));
00660 tmp10 -= tmp2 << 2;
00661 tmp10 = MULTIPLY(tmp10, FIX(0.452548340));
00662 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS);
00663 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS);
00664
00665
00666
00667 tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961));
00668
00669 dataptr[DCTSIZE*1] = (DCTELEM)
00670 DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)),
00671 CONST_BITS+PASS1_BITS);
00672 dataptr[DCTSIZE*3] = (DCTELEM)
00673 DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)),
00674 CONST_BITS+PASS1_BITS);
00675
00676 dataptr++;
00677 }
00678 }
00679
00680
00681
00682
00683
00684
00685 GLOBAL(void)
00686 jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00687 {
00688 INT32 tmp0, tmp1;
00689 INT32 tmp10, tmp11;
00690 DCTELEM *dataptr;
00691 JSAMPROW elemptr;
00692 int ctr;
00693 SHIFT_TEMPS
00694
00695
00696 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00697
00698
00699
00700
00701
00702
00703
00704 dataptr = data;
00705 for (ctr = 0; ctr < 4; ctr++) {
00706 elemptr = sample_data[ctr] + start_col;
00707
00708
00709
00710 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
00711 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
00712
00713 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
00714 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
00715
00716
00717 dataptr[0] = (DCTELEM)
00718 ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2));
00719 dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2));
00720
00721
00722
00723 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
00724
00725 tmp0 += ONE << (CONST_BITS-PASS1_BITS-3);
00726
00727 dataptr[1] = (DCTELEM)
00728 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
00729 CONST_BITS-PASS1_BITS-2);
00730 dataptr[3] = (DCTELEM)
00731 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
00732 CONST_BITS-PASS1_BITS-2);
00733
00734 dataptr += DCTSIZE;
00735 }
00736
00737
00738
00739
00740
00741
00742 dataptr = data;
00743 for (ctr = 0; ctr < 4; ctr++) {
00744
00745
00746
00747 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1));
00748 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];
00749
00750 tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
00751 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
00752
00753 dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);
00754 dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);
00755
00756
00757
00758 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
00759
00760 tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);
00761
00762 dataptr[DCTSIZE*1] = (DCTELEM)
00763 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
00764 CONST_BITS+PASS1_BITS);
00765 dataptr[DCTSIZE*3] = (DCTELEM)
00766 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
00767 CONST_BITS+PASS1_BITS);
00768
00769 dataptr++;
00770 }
00771 }
00772
00773
00774
00775
00776
00777
00778 GLOBAL(void)
00779 jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00780 {
00781 INT32 tmp0, tmp1, tmp2;
00782 DCTELEM *dataptr;
00783 JSAMPROW elemptr;
00784 int ctr;
00785 SHIFT_TEMPS
00786
00787
00788 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00789
00790
00791
00792
00793
00794
00795
00796
00797 dataptr = data;
00798 for (ctr = 0; ctr < 3; ctr++) {
00799 elemptr = sample_data[ctr] + start_col;
00800
00801
00802
00803 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]);
00804 tmp1 = GETJSAMPLE(elemptr[1]);
00805
00806 tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);
00807
00808
00809 dataptr[0] = (DCTELEM)
00810 ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2));
00811 dataptr[2] = (DCTELEM)
00812 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)),
00813 CONST_BITS-PASS1_BITS-2);
00814
00815
00816
00817 dataptr[1] = (DCTELEM)
00818 DESCALE(MULTIPLY(tmp2, FIX(1.224744871)),
00819 CONST_BITS-PASS1_BITS-2);
00820
00821 dataptr += DCTSIZE;
00822 }
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832 dataptr = data;
00833 for (ctr = 0; ctr < 3; ctr++) {
00834
00835
00836 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2];
00837 tmp1 = dataptr[DCTSIZE*1];
00838
00839 tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2];
00840
00841 dataptr[DCTSIZE*0] = (DCTELEM)
00842 DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),
00843 CONST_BITS+PASS1_BITS);
00844 dataptr[DCTSIZE*2] = (DCTELEM)
00845 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)),
00846 CONST_BITS+PASS1_BITS);
00847
00848
00849
00850 dataptr[DCTSIZE*1] = (DCTELEM)
00851 DESCALE(MULTIPLY(tmp2, FIX(2.177324216)),
00852 CONST_BITS+PASS1_BITS);
00853
00854 dataptr++;
00855 }
00856 }
00857
00858
00859
00860
00861
00862
00863 GLOBAL(void)
00864 jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00865 {
00866 INT32 tmp0, tmp1, tmp2, tmp3;
00867 JSAMPROW elemptr;
00868
00869
00870 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00871
00872
00873
00874
00875
00876 elemptr = sample_data[0] + start_col;
00877
00878 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]);
00879 tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]);
00880
00881
00882 elemptr = sample_data[1] + start_col;
00883
00884 tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]);
00885 tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]);
00886
00887
00888
00889
00890
00891
00892
00893
00894 data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4);
00895 data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4);
00896
00897
00898 data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4);
00899 data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4);
00900 }
00901
00902
00903
00904
00905
00906
00907 GLOBAL(void)
00908 jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00909 {
00910
00911 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
00912
00913
00914
00915
00916 data[0] = (DCTELEM)
00917 ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6);
00918 }
00919
00920
00921
00922
00923
00924
00925 GLOBAL(void)
00926 jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
00927 {
00928 INT32 tmp0, tmp1, tmp2, tmp3, tmp4;
00929 INT32 tmp10, tmp11, tmp12, tmp13;
00930 INT32 z1, z2;
00931 DCTELEM workspace[8];
00932 DCTELEM *dataptr;
00933 DCTELEM *wsptr;
00934 JSAMPROW elemptr;
00935 int ctr;
00936 SHIFT_TEMPS
00937
00938
00939
00940
00941
00942
00943
00944 dataptr = data;
00945 ctr = 0;
00946 for (;;) {
00947 elemptr = sample_data[ctr] + start_col;
00948
00949
00950
00951 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]);
00952 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]);
00953 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]);
00954 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]);
00955 tmp4 = GETJSAMPLE(elemptr[4]);
00956
00957 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]);
00958 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]);
00959 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]);
00960 tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]);
00961
00962 z1 = tmp0 + tmp2 + tmp3;
00963 z2 = tmp1 + tmp4;
00964
00965 dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1);
00966 dataptr[6] = (DCTELEM)
00967 DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)),
00968 CONST_BITS-1);
00969 z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049));
00970 z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781));
00971 dataptr[2] = (DCTELEM)
00972 DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441))
00973 + z1 + z2, CONST_BITS-1);
00974 dataptr[4] = (DCTELEM)
00975 DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608))
00976 + z1 - z2, CONST_BITS-1);
00977
00978
00979
00980 dataptr[3] = (DCTELEM)
00981 DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)),
00982 CONST_BITS-1);
00983
00984 tmp11 = MULTIPLY(tmp11, FIX(1.224744871));
00985 tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955));
00986 tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525));
00987
00988 dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1);
00989
00990 tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481));
00991
00992 dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1);
00993 dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1);
00994
00995 ctr++;
00996
00997 if (ctr != DCTSIZE) {
00998 if (ctr == 9)
00999 break;
01000 dataptr += DCTSIZE;
01001 } else
01002 dataptr = workspace;
01003 }
01004
01005
01006
01007
01008
01009
01010
01011
01012 dataptr = data;
01013 wsptr = workspace;
01014 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01015
01016
01017 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0];
01018 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7];
01019 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6];
01020 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5];
01021 tmp4 = dataptr[DCTSIZE*4];
01022
01023 tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0];
01024 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7];
01025 tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6];
01026 tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5];
01027
01028 z1 = tmp0 + tmp2 + tmp3;
01029 z2 = tmp1 + tmp4;
01030 dataptr[DCTSIZE*0] = (DCTELEM)
01031 DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)),
01032 CONST_BITS+2);
01033 dataptr[DCTSIZE*6] = (DCTELEM)
01034 DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)),
01035 CONST_BITS+2);
01036 z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287));
01037 z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309));
01038 dataptr[DCTSIZE*2] = (DCTELEM)
01039 DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190))
01040 + z1 + z2, CONST_BITS+2);
01041 dataptr[DCTSIZE*4] = (DCTELEM)
01042 DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096))
01043 + z1 - z2, CONST_BITS+2);
01044
01045
01046
01047 dataptr[DCTSIZE*3] = (DCTELEM)
01048 DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)),
01049 CONST_BITS+2);
01050
01051 tmp11 = MULTIPLY(tmp11, FIX(1.935399303));
01052 tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004));
01053 tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879));
01054
01055 dataptr[DCTSIZE*1] = (DCTELEM)
01056 DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2);
01057
01058 tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883));
01059
01060 dataptr[DCTSIZE*5] = (DCTELEM)
01061 DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2);
01062 dataptr[DCTSIZE*7] = (DCTELEM)
01063 DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2);
01064
01065 dataptr++;
01066 wsptr++;
01067 }
01068 }
01069
01070
01071
01072
01073
01074
01075 GLOBAL(void)
01076 jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01077 {
01078 INT32 tmp0, tmp1, tmp2, tmp3, tmp4;
01079 INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
01080 DCTELEM workspace[8*2];
01081 DCTELEM *dataptr;
01082 DCTELEM *wsptr;
01083 JSAMPROW elemptr;
01084 int ctr;
01085 SHIFT_TEMPS
01086
01087
01088
01089
01090
01091
01092
01093 dataptr = data;
01094 ctr = 0;
01095 for (;;) {
01096 elemptr = sample_data[ctr] + start_col;
01097
01098
01099
01100 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]);
01101 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]);
01102 tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]);
01103 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]);
01104 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]);
01105
01106 tmp10 = tmp0 + tmp4;
01107 tmp13 = tmp0 - tmp4;
01108 tmp11 = tmp1 + tmp3;
01109 tmp14 = tmp1 - tmp3;
01110
01111 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]);
01112 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]);
01113 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]);
01114 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);
01115 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);
01116
01117
01118 dataptr[0] = (DCTELEM)
01119 ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1);
01120 tmp12 += tmp12;
01121 dataptr[4] = (DCTELEM)
01122 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) -
01123 MULTIPLY(tmp11 - tmp12, FIX(0.437016024)),
01124 CONST_BITS-1);
01125 tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876));
01126 dataptr[2] = (DCTELEM)
01127 DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)),
01128 CONST_BITS-1);
01129 dataptr[6] = (DCTELEM)
01130 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)),
01131 CONST_BITS-1);
01132
01133
01134
01135 tmp10 = tmp0 + tmp4;
01136 tmp11 = tmp1 - tmp3;
01137 dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1);
01138 tmp2 <<= CONST_BITS;
01139 dataptr[1] = (DCTELEM)
01140 DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) +
01141 MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 +
01142 MULTIPLY(tmp3, FIX(0.642039522)) +
01143 MULTIPLY(tmp4, FIX(0.221231742)),
01144 CONST_BITS-1);
01145 tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) -
01146 MULTIPLY(tmp1 + tmp3, FIX(0.587785252));
01147 tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) +
01148 (tmp11 << (CONST_BITS - 1)) - tmp2;
01149 dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1);
01150 dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1);
01151
01152 ctr++;
01153
01154 if (ctr != DCTSIZE) {
01155 if (ctr == 10)
01156 break;
01157 dataptr += DCTSIZE;
01158 } else
01159 dataptr = workspace;
01160 }
01161
01162
01163
01164
01165
01166
01167
01168
01169 dataptr = data;
01170 wsptr = workspace;
01171 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01172
01173
01174 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1];
01175 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0];
01176 tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7];
01177 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6];
01178 tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
01179
01180 tmp10 = tmp0 + tmp4;
01181 tmp13 = tmp0 - tmp4;
01182 tmp11 = tmp1 + tmp3;
01183 tmp14 = tmp1 - tmp3;
01184
01185 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1];
01186 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0];
01187 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7];
01188 tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6];
01189 tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
01190
01191 dataptr[DCTSIZE*0] = (DCTELEM)
01192 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)),
01193 CONST_BITS+2);
01194 tmp12 += tmp12;
01195 dataptr[DCTSIZE*4] = (DCTELEM)
01196 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) -
01197 MULTIPLY(tmp11 - tmp12, FIX(0.559380511)),
01198 CONST_BITS+2);
01199 tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961));
01200 dataptr[DCTSIZE*2] = (DCTELEM)
01201 DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)),
01202 CONST_BITS+2);
01203 dataptr[DCTSIZE*6] = (DCTELEM)
01204 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)),
01205 CONST_BITS+2);
01206
01207
01208
01209 tmp10 = tmp0 + tmp4;
01210 tmp11 = tmp1 - tmp3;
01211 dataptr[DCTSIZE*5] = (DCTELEM)
01212 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)),
01213 CONST_BITS+2);
01214 tmp2 = MULTIPLY(tmp2, FIX(1.28));
01215 dataptr[DCTSIZE*1] = (DCTELEM)
01216 DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) +
01217 MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 +
01218 MULTIPLY(tmp3, FIX(0.821810588)) +
01219 MULTIPLY(tmp4, FIX(0.283176630)),
01220 CONST_BITS+2);
01221 tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) -
01222 MULTIPLY(tmp1 + tmp3, FIX(0.752365123));
01223 tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) +
01224 MULTIPLY(tmp11, FIX(0.64)) - tmp2;
01225 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2);
01226 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2);
01227
01228 dataptr++;
01229 wsptr++;
01230 }
01231 }
01232
01233
01234
01235
01236
01237
01238 GLOBAL(void)
01239 jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01240 {
01241 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
01242 INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
01243 INT32 z1, z2, z3;
01244 DCTELEM workspace[8*3];
01245 DCTELEM *dataptr;
01246 DCTELEM *wsptr;
01247 JSAMPROW elemptr;
01248 int ctr;
01249 SHIFT_TEMPS
01250
01251
01252
01253
01254
01255
01256
01257 dataptr = data;
01258 ctr = 0;
01259 for (;;) {
01260 elemptr = sample_data[ctr] + start_col;
01261
01262
01263
01264 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]);
01265 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]);
01266 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]);
01267 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]);
01268 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]);
01269 tmp5 = GETJSAMPLE(elemptr[5]);
01270
01271 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]);
01272 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]);
01273 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]);
01274 tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]);
01275 tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]);
01276
01277
01278 dataptr[0] = (DCTELEM)
01279 ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1);
01280 tmp5 += tmp5;
01281 tmp0 -= tmp5;
01282 tmp1 -= tmp5;
01283 tmp2 -= tmp5;
01284 tmp3 -= tmp5;
01285 tmp4 -= tmp5;
01286 z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) +
01287 MULTIPLY(tmp2 + tmp4, FIX(0.201263574));
01288 z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931));
01289 z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156));
01290 dataptr[2] = (DCTELEM)
01291 DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590))
01292 - MULTIPLY(tmp4, FIX(1.390975730)),
01293 CONST_BITS-1);
01294 dataptr[4] = (DCTELEM)
01295 DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650))
01296 - MULTIPLY(tmp2, FIX(1.356927976))
01297 + MULTIPLY(tmp4, FIX(0.587485545)),
01298 CONST_BITS-1);
01299 dataptr[6] = (DCTELEM)
01300 DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200))
01301 - MULTIPLY(tmp2, FIX(0.788749120)),
01302 CONST_BITS-1);
01303
01304
01305
01306 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905));
01307 tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298));
01308 tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576));
01309 tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871))
01310 + MULTIPLY(tmp14, FIX(0.398430003));
01311 tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576));
01312 tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907));
01313 tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582))
01314 - MULTIPLY(tmp14, FIX(1.068791298));
01315 tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003));
01316 tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629))
01317 + MULTIPLY(tmp14, FIX(1.399818907));
01318 tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626))
01319 - MULTIPLY(tmp14, FIX(1.286413905));
01320
01321 dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1);
01322 dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1);
01323 dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1);
01324 dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1);
01325
01326 ctr++;
01327
01328 if (ctr != DCTSIZE) {
01329 if (ctr == 11)
01330 break;
01331 dataptr += DCTSIZE;
01332 } else
01333 dataptr = workspace;
01334 }
01335
01336
01337
01338
01339
01340
01341
01342
01343 dataptr = data;
01344 wsptr = workspace;
01345 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01346
01347
01348 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2];
01349 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1];
01350 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0];
01351 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7];
01352 tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6];
01353 tmp5 = dataptr[DCTSIZE*5];
01354
01355 tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2];
01356 tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1];
01357 tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0];
01358 tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7];
01359 tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6];
01360
01361 dataptr[DCTSIZE*0] = (DCTELEM)
01362 DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5,
01363 FIX(1.057851240)),
01364 CONST_BITS+2);
01365 tmp5 += tmp5;
01366 tmp0 -= tmp5;
01367 tmp1 -= tmp5;
01368 tmp2 -= tmp5;
01369 tmp3 -= tmp5;
01370 tmp4 -= tmp5;
01371 z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) +
01372 MULTIPLY(tmp2 + tmp4, FIX(0.212906922));
01373 z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713));
01374 z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479));
01375 dataptr[DCTSIZE*2] = (DCTELEM)
01376 DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542))
01377 - MULTIPLY(tmp4, FIX(1.471445400)),
01378 CONST_BITS+2);
01379 dataptr[DCTSIZE*4] = (DCTELEM)
01380 DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844))
01381 - MULTIPLY(tmp2, FIX(1.435427942))
01382 + MULTIPLY(tmp4, FIX(0.621472312)),
01383 CONST_BITS+2);
01384 dataptr[DCTSIZE*6] = (DCTELEM)
01385 DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708))
01386 - MULTIPLY(tmp2, FIX(0.834379234)),
01387 CONST_BITS+2);
01388
01389
01390
01391 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544));
01392 tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199));
01393 tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568));
01394 tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145))
01395 + MULTIPLY(tmp14, FIX(0.421479672));
01396 tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568));
01397 tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167));
01398 tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864))
01399 - MULTIPLY(tmp14, FIX(1.130622199));
01400 tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672));
01401 tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847))
01402 + MULTIPLY(tmp14, FIX(1.480800167));
01403 tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125))
01404 - MULTIPLY(tmp14, FIX(1.360834544));
01405
01406 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2);
01407 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2);
01408 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2);
01409 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2);
01410
01411 dataptr++;
01412 wsptr++;
01413 }
01414 }
01415
01416
01417
01418
01419
01420
01421 GLOBAL(void)
01422 jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01423 {
01424 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
01425 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
01426 DCTELEM workspace[8*4];
01427 DCTELEM *dataptr;
01428 DCTELEM *wsptr;
01429 JSAMPROW elemptr;
01430 int ctr;
01431 SHIFT_TEMPS
01432
01433
01434
01435
01436
01437 dataptr = data;
01438 ctr = 0;
01439 for (;;) {
01440 elemptr = sample_data[ctr] + start_col;
01441
01442
01443
01444 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]);
01445 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]);
01446 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]);
01447 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]);
01448 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]);
01449 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]);
01450
01451 tmp10 = tmp0 + tmp5;
01452 tmp13 = tmp0 - tmp5;
01453 tmp11 = tmp1 + tmp4;
01454 tmp14 = tmp1 - tmp4;
01455 tmp12 = tmp2 + tmp3;
01456 tmp15 = tmp2 - tmp3;
01457
01458 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]);
01459 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]);
01460 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]);
01461 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]);
01462 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);
01463 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);
01464
01465
01466 dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE);
01467 dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15);
01468 dataptr[4] = (DCTELEM)
01469 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)),
01470 CONST_BITS);
01471 dataptr[2] = (DCTELEM)
01472 DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)),
01473 CONST_BITS);
01474
01475
01476
01477 tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100);
01478 tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865);
01479 tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065);
01480 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054));
01481 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669));
01482 tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953))
01483 + MULTIPLY(tmp5, FIX(0.184591911));
01484 tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911));
01485 tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912))
01486 + MULTIPLY(tmp5, FIX(0.860918669));
01487 tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011))
01488 - MULTIPLY(tmp5, FIX(1.121971054));
01489 tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965))
01490 - MULTIPLY(tmp2 + tmp5, FIX_0_541196100);
01491
01492 dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS);
01493 dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS);
01494 dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS);
01495 dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS);
01496
01497 ctr++;
01498
01499 if (ctr != DCTSIZE) {
01500 if (ctr == 12)
01501 break;
01502 dataptr += DCTSIZE;
01503 } else
01504 dataptr = workspace;
01505 }
01506
01507
01508
01509
01510
01511
01512
01513
01514 dataptr = data;
01515 wsptr = workspace;
01516 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01517
01518
01519 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3];
01520 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2];
01521 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1];
01522 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0];
01523 tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7];
01524 tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6];
01525
01526 tmp10 = tmp0 + tmp5;
01527 tmp13 = tmp0 - tmp5;
01528 tmp11 = tmp1 + tmp4;
01529 tmp14 = tmp1 - tmp4;
01530 tmp12 = tmp2 + tmp3;
01531 tmp15 = tmp2 - tmp3;
01532
01533 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3];
01534 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2];
01535 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1];
01536 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0];
01537 tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7];
01538 tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6];
01539
01540 dataptr[DCTSIZE*0] = (DCTELEM)
01541 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)),
01542 CONST_BITS+1);
01543 dataptr[DCTSIZE*6] = (DCTELEM)
01544 DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)),
01545 CONST_BITS+1);
01546 dataptr[DCTSIZE*4] = (DCTELEM)
01547 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)),
01548 CONST_BITS+1);
01549 dataptr[DCTSIZE*2] = (DCTELEM)
01550 DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) +
01551 MULTIPLY(tmp13 + tmp15, FIX(1.214244803)),
01552 CONST_BITS+1);
01553
01554
01555
01556 tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200));
01557 tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102));
01558 tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502));
01559 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603));
01560 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039));
01561 tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403))
01562 + MULTIPLY(tmp5, FIX(0.164081699));
01563 tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699));
01564 tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144))
01565 + MULTIPLY(tmp5, FIX(0.765261039));
01566 tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899))
01567 - MULTIPLY(tmp5, FIX(0.997307603));
01568 tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302))
01569 - MULTIPLY(tmp2 + tmp5, FIX(0.481063200));
01570
01571 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1);
01572 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1);
01573 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1);
01574 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1);
01575
01576 dataptr++;
01577 wsptr++;
01578 }
01579 }
01580
01581
01582
01583
01584
01585
01586 GLOBAL(void)
01587 jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01588 {
01589 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
01590 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
01591 INT32 z1, z2;
01592 DCTELEM workspace[8*5];
01593 DCTELEM *dataptr;
01594 DCTELEM *wsptr;
01595 JSAMPROW elemptr;
01596 int ctr;
01597 SHIFT_TEMPS
01598
01599
01600
01601
01602
01603 dataptr = data;
01604 ctr = 0;
01605 for (;;) {
01606 elemptr = sample_data[ctr] + start_col;
01607
01608
01609
01610 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]);
01611 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]);
01612 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]);
01613 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]);
01614 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]);
01615 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]);
01616 tmp6 = GETJSAMPLE(elemptr[6]);
01617
01618 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]);
01619 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]);
01620 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]);
01621 tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]);
01622 tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]);
01623 tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]);
01624
01625
01626 dataptr[0] = (DCTELEM)
01627 (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE);
01628 tmp6 += tmp6;
01629 tmp0 -= tmp6;
01630 tmp1 -= tmp6;
01631 tmp2 -= tmp6;
01632 tmp3 -= tmp6;
01633 tmp4 -= tmp6;
01634 tmp5 -= tmp6;
01635 dataptr[2] = (DCTELEM)
01636 DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) +
01637 MULTIPLY(tmp1, FIX(1.058554052)) +
01638 MULTIPLY(tmp2, FIX(0.501487041)) -
01639 MULTIPLY(tmp3, FIX(0.170464608)) -
01640 MULTIPLY(tmp4, FIX(0.803364869)) -
01641 MULTIPLY(tmp5, FIX(1.252223920)),
01642 CONST_BITS);
01643 z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) -
01644 MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) -
01645 MULTIPLY(tmp1 - tmp5, FIX(0.316450131));
01646 z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) -
01647 MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) +
01648 MULTIPLY(tmp1 + tmp5, FIX(0.486914739));
01649
01650 dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS);
01651 dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS);
01652
01653
01654
01655 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651));
01656 tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945));
01657 tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) +
01658 MULTIPLY(tmp14 + tmp15, FIX(0.338443458));
01659 tmp0 = tmp1 + tmp2 + tmp3 -
01660 MULTIPLY(tmp10, FIX(2.020082300)) +
01661 MULTIPLY(tmp14, FIX(0.318774355));
01662 tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) -
01663 MULTIPLY(tmp11 + tmp12, FIX(0.338443458));
01664 tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945));
01665 tmp1 += tmp4 + tmp5 +
01666 MULTIPLY(tmp11, FIX(0.837223564)) -
01667 MULTIPLY(tmp14, FIX(2.341699410));
01668 tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813));
01669 tmp2 += tmp4 + tmp6 -
01670 MULTIPLY(tmp12, FIX(1.572116027)) +
01671 MULTIPLY(tmp15, FIX(2.260109708));
01672 tmp3 += tmp5 + tmp6 +
01673 MULTIPLY(tmp13, FIX(2.205608352)) -
01674 MULTIPLY(tmp15, FIX(1.742345811));
01675
01676 dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS);
01677 dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS);
01678 dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS);
01679 dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS);
01680
01681 ctr++;
01682
01683 if (ctr != DCTSIZE) {
01684 if (ctr == 13)
01685 break;
01686 dataptr += DCTSIZE;
01687 } else
01688 dataptr = workspace;
01689 }
01690
01691
01692
01693
01694
01695
01696
01697
01698 dataptr = data;
01699 wsptr = workspace;
01700 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01701
01702
01703 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4];
01704 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3];
01705 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2];
01706 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1];
01707 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0];
01708 tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7];
01709 tmp6 = dataptr[DCTSIZE*6];
01710
01711 tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4];
01712 tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3];
01713 tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2];
01714 tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1];
01715 tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0];
01716 tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7];
01717
01718 dataptr[DCTSIZE*0] = (DCTELEM)
01719 DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6,
01720 FIX(0.757396450)),
01721 CONST_BITS+1);
01722 tmp6 += tmp6;
01723 tmp0 -= tmp6;
01724 tmp1 -= tmp6;
01725 tmp2 -= tmp6;
01726 tmp3 -= tmp6;
01727 tmp4 -= tmp6;
01728 tmp5 -= tmp6;
01729 dataptr[DCTSIZE*2] = (DCTELEM)
01730 DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) +
01731 MULTIPLY(tmp1, FIX(0.801745081)) +
01732 MULTIPLY(tmp2, FIX(0.379824504)) -
01733 MULTIPLY(tmp3, FIX(0.129109289)) -
01734 MULTIPLY(tmp4, FIX(0.608465700)) -
01735 MULTIPLY(tmp5, FIX(0.948429952)),
01736 CONST_BITS+1);
01737 z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) -
01738 MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) -
01739 MULTIPLY(tmp1 - tmp5, FIX(0.239678205));
01740 z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) -
01741 MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) +
01742 MULTIPLY(tmp1 + tmp5, FIX(0.368787494));
01743
01744 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1);
01745 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1);
01746
01747
01748
01749 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908));
01750 tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751));
01751 tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) +
01752 MULTIPLY(tmp14 + tmp15, FIX(0.256335874));
01753 tmp0 = tmp1 + tmp2 + tmp3 -
01754 MULTIPLY(tmp10, FIX(1.530003162)) +
01755 MULTIPLY(tmp14, FIX(0.241438564));
01756 tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) -
01757 MULTIPLY(tmp11 + tmp12, FIX(0.256335874));
01758 tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751));
01759 tmp1 += tmp4 + tmp5 +
01760 MULTIPLY(tmp11, FIX(0.634110155)) -
01761 MULTIPLY(tmp14, FIX(1.773594819));
01762 tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438));
01763 tmp2 += tmp4 + tmp6 -
01764 MULTIPLY(tmp12, FIX(1.190715098)) +
01765 MULTIPLY(tmp15, FIX(1.711799069));
01766 tmp3 += tmp5 + tmp6 +
01767 MULTIPLY(tmp13, FIX(1.670519935)) -
01768 MULTIPLY(tmp15, FIX(1.319646532));
01769
01770 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1);
01771 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1);
01772 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1);
01773 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1);
01774
01775 dataptr++;
01776 wsptr++;
01777 }
01778 }
01779
01780
01781
01782
01783
01784
01785 GLOBAL(void)
01786 jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01787 {
01788 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
01789 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
01790 DCTELEM workspace[8*6];
01791 DCTELEM *dataptr;
01792 DCTELEM *wsptr;
01793 JSAMPROW elemptr;
01794 int ctr;
01795 SHIFT_TEMPS
01796
01797
01798
01799
01800
01801 dataptr = data;
01802 ctr = 0;
01803 for (;;) {
01804 elemptr = sample_data[ctr] + start_col;
01805
01806
01807
01808 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]);
01809 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]);
01810 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]);
01811 tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]);
01812 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]);
01813 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]);
01814 tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]);
01815
01816 tmp10 = tmp0 + tmp6;
01817 tmp14 = tmp0 - tmp6;
01818 tmp11 = tmp1 + tmp5;
01819 tmp15 = tmp1 - tmp5;
01820 tmp12 = tmp2 + tmp4;
01821 tmp16 = tmp2 - tmp4;
01822
01823 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]);
01824 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]);
01825 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]);
01826 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]);
01827 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]);
01828 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);
01829 tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);
01830
01831
01832 dataptr[0] = (DCTELEM)
01833 (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE);
01834 tmp13 += tmp13;
01835 dataptr[4] = (DCTELEM)
01836 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) +
01837 MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) -
01838 MULTIPLY(tmp12 - tmp13, FIX(0.881747734)),
01839 CONST_BITS);
01840
01841 tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686));
01842
01843 dataptr[2] = (DCTELEM)
01844 DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590))
01845 + MULTIPLY(tmp16, FIX(0.613604268)),
01846 CONST_BITS);
01847 dataptr[6] = (DCTELEM)
01848 DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954))
01849 - MULTIPLY(tmp16, FIX(1.378756276)),
01850 CONST_BITS);
01851
01852
01853
01854 tmp10 = tmp1 + tmp2;
01855 tmp11 = tmp5 - tmp4;
01856 dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6);
01857 tmp3 <<= CONST_BITS;
01858 tmp10 = MULTIPLY(tmp10, - FIX(0.158341681));
01859 tmp11 = MULTIPLY(tmp11, FIX(1.405321284));
01860 tmp10 += tmp11 - tmp3;
01861 tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) +
01862 MULTIPLY(tmp4 + tmp6, FIX(0.752406978));
01863 dataptr[5] = (DCTELEM)
01864 DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773))
01865 + MULTIPLY(tmp4, FIX(1.119999435)),
01866 CONST_BITS);
01867 tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) +
01868 MULTIPLY(tmp5 - tmp6, FIX(0.467085129));
01869 dataptr[3] = (DCTELEM)
01870 DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948))
01871 - MULTIPLY(tmp5, FIX(3.069855259)),
01872 CONST_BITS);
01873 dataptr[1] = (DCTELEM)
01874 DESCALE(tmp11 + tmp12 + tmp3 + tmp6 -
01875 MULTIPLY(tmp0 + tmp6, FIX(1.126980169)),
01876 CONST_BITS);
01877
01878 ctr++;
01879
01880 if (ctr != DCTSIZE) {
01881 if (ctr == 14)
01882 break;
01883 dataptr += DCTSIZE;
01884 } else
01885 dataptr = workspace;
01886 }
01887
01888
01889
01890
01891
01892
01893
01894
01895 dataptr = data;
01896 wsptr = workspace;
01897 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
01898
01899
01900 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5];
01901 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4];
01902 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3];
01903 tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2];
01904 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1];
01905 tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0];
01906 tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
01907
01908 tmp10 = tmp0 + tmp6;
01909 tmp14 = tmp0 - tmp6;
01910 tmp11 = tmp1 + tmp5;
01911 tmp15 = tmp1 - tmp5;
01912 tmp12 = tmp2 + tmp4;
01913 tmp16 = tmp2 - tmp4;
01914
01915 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5];
01916 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4];
01917 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3];
01918 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2];
01919 tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1];
01920 tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0];
01921 tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
01922
01923 dataptr[DCTSIZE*0] = (DCTELEM)
01924 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13,
01925 FIX(0.653061224)),
01926 CONST_BITS+1);
01927 tmp13 += tmp13;
01928 dataptr[DCTSIZE*4] = (DCTELEM)
01929 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) +
01930 MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) -
01931 MULTIPLY(tmp12 - tmp13, FIX(0.575835255)),
01932 CONST_BITS+1);
01933
01934 tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570));
01935
01936 dataptr[DCTSIZE*2] = (DCTELEM)
01937 DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691))
01938 + MULTIPLY(tmp16, FIX(0.400721155)),
01939 CONST_BITS+1);
01940 dataptr[DCTSIZE*6] = (DCTELEM)
01941 DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725))
01942 - MULTIPLY(tmp16, FIX(0.900412262)),
01943 CONST_BITS+1);
01944
01945
01946
01947 tmp10 = tmp1 + tmp2;
01948 tmp11 = tmp5 - tmp4;
01949 dataptr[DCTSIZE*7] = (DCTELEM)
01950 DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6,
01951 FIX(0.653061224)),
01952 CONST_BITS+1);
01953 tmp3 = MULTIPLY(tmp3 , FIX(0.653061224));
01954 tmp10 = MULTIPLY(tmp10, - FIX(0.103406812));
01955 tmp11 = MULTIPLY(tmp11, FIX(0.917760839));
01956 tmp10 += tmp11 - tmp3;
01957 tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) +
01958 MULTIPLY(tmp4 + tmp6, FIX(0.491367823));
01959 dataptr[DCTSIZE*5] = (DCTELEM)
01960 DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076))
01961 + MULTIPLY(tmp4, FIX(0.731428202)),
01962 CONST_BITS+1);
01963 tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) +
01964 MULTIPLY(tmp5 - tmp6, FIX(0.305035186));
01965 dataptr[DCTSIZE*3] = (DCTELEM)
01966 DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844))
01967 - MULTIPLY(tmp5, FIX(2.004803435)),
01968 CONST_BITS+1);
01969 dataptr[DCTSIZE*1] = (DCTELEM)
01970 DESCALE(tmp11 + tmp12 + tmp3
01971 - MULTIPLY(tmp0, FIX(0.735987049))
01972 - MULTIPLY(tmp6, FIX(0.082925825)),
01973 CONST_BITS+1);
01974
01975 dataptr++;
01976 wsptr++;
01977 }
01978 }
01979
01980
01981
01982
01983
01984
01985 GLOBAL(void)
01986 jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
01987 {
01988 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
01989 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
01990 INT32 z1, z2, z3;
01991 DCTELEM workspace[8*7];
01992 DCTELEM *dataptr;
01993 DCTELEM *wsptr;
01994 JSAMPROW elemptr;
01995 int ctr;
01996 SHIFT_TEMPS
01997
01998
01999
02000
02001
02002 dataptr = data;
02003 ctr = 0;
02004 for (;;) {
02005 elemptr = sample_data[ctr] + start_col;
02006
02007
02008
02009 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]);
02010 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]);
02011 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]);
02012 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]);
02013 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]);
02014 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]);
02015 tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]);
02016 tmp7 = GETJSAMPLE(elemptr[7]);
02017
02018 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]);
02019 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]);
02020 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]);
02021 tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]);
02022 tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]);
02023 tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]);
02024 tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]);
02025
02026 z1 = tmp0 + tmp4 + tmp5;
02027 z2 = tmp1 + tmp3 + tmp6;
02028 z3 = tmp2 + tmp7;
02029
02030 dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE);
02031 z3 += z3;
02032 dataptr[6] = (DCTELEM)
02033 DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) -
02034 MULTIPLY(z2 - z3, FIX(0.437016024)),
02035 CONST_BITS);
02036 tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7;
02037 z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) -
02038 MULTIPLY(tmp6 - tmp2, FIX(2.238241955));
02039 z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) -
02040 MULTIPLY(tmp0 - tmp2, FIX(0.091361227));
02041 z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) +
02042 MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) +
02043 MULTIPLY(tmp1 - tmp4, FIX(0.790569415));
02044
02045 dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS);
02046 dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS);
02047
02048
02049
02050 tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16,
02051 FIX(1.224744871));
02052 tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) +
02053 MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876));
02054 tmp12 = MULTIPLY(tmp12, FIX(1.224744871));
02055 tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) +
02056 MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) +
02057 MULTIPLY(tmp13 + tmp15, FIX(0.575212477));
02058 tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) -
02059 MULTIPLY(tmp14, FIX(0.513743148)) +
02060 MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12;
02061 tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) -
02062 MULTIPLY(tmp11, FIX(2.176250899)) -
02063 MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12;
02064
02065 dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS);
02066 dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS);
02067 dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS);
02068 dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS);
02069
02070 ctr++;
02071
02072 if (ctr != DCTSIZE) {
02073 if (ctr == 15)
02074 break;
02075 dataptr += DCTSIZE;
02076 } else
02077 dataptr = workspace;
02078 }
02079
02080
02081
02082
02083
02084
02085
02086
02087 dataptr = data;
02088 wsptr = workspace;
02089 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02090
02091
02092 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6];
02093 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5];
02094 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4];
02095 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3];
02096 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2];
02097 tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1];
02098 tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0];
02099 tmp7 = dataptr[DCTSIZE*7];
02100
02101 tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6];
02102 tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5];
02103 tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4];
02104 tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3];
02105 tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2];
02106 tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1];
02107 tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0];
02108
02109 z1 = tmp0 + tmp4 + tmp5;
02110 z2 = tmp1 + tmp3 + tmp6;
02111 z3 = tmp2 + tmp7;
02112 dataptr[DCTSIZE*0] = (DCTELEM)
02113 DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)),
02114 CONST_BITS+2);
02115 z3 += z3;
02116 dataptr[DCTSIZE*6] = (DCTELEM)
02117 DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) -
02118 MULTIPLY(z2 - z3, FIX(0.497227121)),
02119 CONST_BITS+2);
02120 tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7;
02121 z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) -
02122 MULTIPLY(tmp6 - tmp2, FIX(2.546621957));
02123 z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) -
02124 MULTIPLY(tmp0 - tmp2, FIX(0.103948774));
02125 z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) +
02126 MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) +
02127 MULTIPLY(tmp1 - tmp4, FIX(0.899492312));
02128
02129 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2);
02130 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2);
02131
02132
02133
02134 tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16,
02135 FIX(1.393487498));
02136 tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) +
02137 MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187));
02138 tmp12 = MULTIPLY(tmp12, FIX(1.393487498));
02139 tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) +
02140 MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) +
02141 MULTIPLY(tmp13 + tmp15, FIX(0.654463974));
02142 tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) -
02143 MULTIPLY(tmp14, FIX(0.584525538)) +
02144 MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12;
02145 tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) -
02146 MULTIPLY(tmp11, FIX(2.476089912)) -
02147 MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12;
02148
02149 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2);
02150 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2);
02151 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2);
02152 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2);
02153
02154 dataptr++;
02155 wsptr++;
02156 }
02157 }
02158
02159
02160
02161
02162
02163
02164 GLOBAL(void)
02165 jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02166 {
02167 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
02168 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;
02169 DCTELEM workspace[DCTSIZE2];
02170 DCTELEM *dataptr;
02171 DCTELEM *wsptr;
02172 JSAMPROW elemptr;
02173 int ctr;
02174 SHIFT_TEMPS
02175
02176
02177
02178
02179
02180
02181 dataptr = data;
02182 ctr = 0;
02183 for (;;) {
02184 elemptr = sample_data[ctr] + start_col;
02185
02186
02187
02188 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]);
02189 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]);
02190 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]);
02191 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]);
02192 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]);
02193 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]);
02194 tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]);
02195 tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]);
02196
02197 tmp10 = tmp0 + tmp7;
02198 tmp14 = tmp0 - tmp7;
02199 tmp11 = tmp1 + tmp6;
02200 tmp15 = tmp1 - tmp6;
02201 tmp12 = tmp2 + tmp5;
02202 tmp16 = tmp2 - tmp5;
02203 tmp13 = tmp3 + tmp4;
02204 tmp17 = tmp3 - tmp4;
02205
02206 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]);
02207 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]);
02208 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]);
02209 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]);
02210 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]);
02211 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]);
02212 tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);
02213 tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);
02214
02215
02216 dataptr[0] = (DCTELEM)
02217 ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);
02218 dataptr[4] = (DCTELEM)
02219 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) +
02220 MULTIPLY(tmp11 - tmp12, FIX_0_541196100),
02221 CONST_BITS-PASS1_BITS);
02222
02223 tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +
02224 MULTIPLY(tmp14 - tmp16, FIX(1.387039845));
02225
02226 dataptr[2] = (DCTELEM)
02227 DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))
02228 + MULTIPLY(tmp16, FIX(2.172734804)),
02229 CONST_BITS-PASS1_BITS);
02230 dataptr[6] = (DCTELEM)
02231 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))
02232 - MULTIPLY(tmp17, FIX(1.061594338)),
02233 CONST_BITS-PASS1_BITS);
02234
02235
02236
02237 tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +
02238 MULTIPLY(tmp6 - tmp7, FIX(0.410524528));
02239 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +
02240 MULTIPLY(tmp5 + tmp7, FIX(0.666655658));
02241 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +
02242 MULTIPLY(tmp4 - tmp7, FIX(0.897167586));
02243 tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +
02244 MULTIPLY(tmp6 - tmp5, FIX(1.407403738));
02245 tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +
02246 MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));
02247 tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +
02248 MULTIPLY(tmp5 - tmp4, FIX(0.410524528));
02249 tmp10 = tmp11 + tmp12 + tmp13 -
02250 MULTIPLY(tmp0, FIX(2.286341144)) +
02251 MULTIPLY(tmp7, FIX(0.779653625));
02252 tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074))
02253 - MULTIPLY(tmp6, FIX(1.663905119));
02254 tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048))
02255 + MULTIPLY(tmp5, FIX(1.227391138));
02256 tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962))
02257 + MULTIPLY(tmp4, FIX(2.167985692));
02258
02259 dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
02260 dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
02261 dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
02262 dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
02263
02264 ctr++;
02265
02266 if (ctr != DCTSIZE) {
02267 if (ctr == DCTSIZE * 2)
02268 break;
02269 dataptr += DCTSIZE;
02270 } else
02271 dataptr = workspace;
02272 }
02273
02274
02275
02276
02277
02278
02279
02280 dataptr = data;
02281 wsptr = workspace;
02282 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02283
02284
02285 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7];
02286 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6];
02287 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5];
02288 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4];
02289 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3];
02290 tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2];
02291 tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1];
02292 tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0];
02293
02294 tmp10 = tmp0 + tmp7;
02295 tmp14 = tmp0 - tmp7;
02296 tmp11 = tmp1 + tmp6;
02297 tmp15 = tmp1 - tmp6;
02298 tmp12 = tmp2 + tmp5;
02299 tmp16 = tmp2 - tmp5;
02300 tmp13 = tmp3 + tmp4;
02301 tmp17 = tmp3 - tmp4;
02302
02303 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7];
02304 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6];
02305 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5];
02306 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4];
02307 tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3];
02308 tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2];
02309 tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1];
02310 tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0];
02311
02312 dataptr[DCTSIZE*0] = (DCTELEM)
02313 DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2);
02314 dataptr[DCTSIZE*4] = (DCTELEM)
02315 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) +
02316 MULTIPLY(tmp11 - tmp12, FIX_0_541196100),
02317 CONST_BITS+PASS1_BITS+2);
02318
02319 tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +
02320 MULTIPLY(tmp14 - tmp16, FIX(1.387039845));
02321
02322 dataptr[DCTSIZE*2] = (DCTELEM)
02323 DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))
02324 + MULTIPLY(tmp16, FIX(2.172734804)),
02325 CONST_BITS+PASS1_BITS+2);
02326 dataptr[DCTSIZE*6] = (DCTELEM)
02327 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))
02328 - MULTIPLY(tmp17, FIX(1.061594338)),
02329 CONST_BITS+PASS1_BITS+2);
02330
02331
02332
02333 tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +
02334 MULTIPLY(tmp6 - tmp7, FIX(0.410524528));
02335 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +
02336 MULTIPLY(tmp5 + tmp7, FIX(0.666655658));
02337 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +
02338 MULTIPLY(tmp4 - tmp7, FIX(0.897167586));
02339 tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +
02340 MULTIPLY(tmp6 - tmp5, FIX(1.407403738));
02341 tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +
02342 MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));
02343 tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +
02344 MULTIPLY(tmp5 - tmp4, FIX(0.410524528));
02345 tmp10 = tmp11 + tmp12 + tmp13 -
02346 MULTIPLY(tmp0, FIX(2.286341144)) +
02347 MULTIPLY(tmp7, FIX(0.779653625));
02348 tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074))
02349 - MULTIPLY(tmp6, FIX(1.663905119));
02350 tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048))
02351 + MULTIPLY(tmp5, FIX(1.227391138));
02352 tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962))
02353 + MULTIPLY(tmp4, FIX(2.167985692));
02354
02355 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2);
02356 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2);
02357 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2);
02358 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2);
02359
02360 dataptr++;
02361 wsptr++;
02362 }
02363 }
02364
02365
02366
02367
02368
02369
02370
02371
02372 GLOBAL(void)
02373 jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02374 {
02375 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
02376 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;
02377 INT32 z1;
02378 DCTELEM *dataptr;
02379 JSAMPROW elemptr;
02380 int ctr;
02381 SHIFT_TEMPS
02382
02383
02384
02385
02386
02387
02388 dataptr = data;
02389 ctr = 0;
02390 for (ctr = 0; ctr < DCTSIZE; ctr++) {
02391 elemptr = sample_data[ctr] + start_col;
02392
02393
02394
02395 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]);
02396 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]);
02397 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]);
02398 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]);
02399 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]);
02400 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]);
02401 tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]);
02402 tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]);
02403
02404 tmp10 = tmp0 + tmp7;
02405 tmp14 = tmp0 - tmp7;
02406 tmp11 = tmp1 + tmp6;
02407 tmp15 = tmp1 - tmp6;
02408 tmp12 = tmp2 + tmp5;
02409 tmp16 = tmp2 - tmp5;
02410 tmp13 = tmp3 + tmp4;
02411 tmp17 = tmp3 - tmp4;
02412
02413 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]);
02414 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]);
02415 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]);
02416 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]);
02417 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]);
02418 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]);
02419 tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);
02420 tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);
02421
02422
02423 dataptr[0] = (DCTELEM)
02424 ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);
02425 dataptr[4] = (DCTELEM)
02426 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) +
02427 MULTIPLY(tmp11 - tmp12, FIX_0_541196100),
02428 CONST_BITS-PASS1_BITS);
02429
02430 tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +
02431 MULTIPLY(tmp14 - tmp16, FIX(1.387039845));
02432
02433 dataptr[2] = (DCTELEM)
02434 DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))
02435 + MULTIPLY(tmp16, FIX(2.172734804)),
02436 CONST_BITS-PASS1_BITS);
02437 dataptr[6] = (DCTELEM)
02438 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))
02439 - MULTIPLY(tmp17, FIX(1.061594338)),
02440 CONST_BITS-PASS1_BITS);
02441
02442
02443
02444 tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +
02445 MULTIPLY(tmp6 - tmp7, FIX(0.410524528));
02446 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +
02447 MULTIPLY(tmp5 + tmp7, FIX(0.666655658));
02448 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +
02449 MULTIPLY(tmp4 - tmp7, FIX(0.897167586));
02450 tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +
02451 MULTIPLY(tmp6 - tmp5, FIX(1.407403738));
02452 tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +
02453 MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));
02454 tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +
02455 MULTIPLY(tmp5 - tmp4, FIX(0.410524528));
02456 tmp10 = tmp11 + tmp12 + tmp13 -
02457 MULTIPLY(tmp0, FIX(2.286341144)) +
02458 MULTIPLY(tmp7, FIX(0.779653625));
02459 tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074))
02460 - MULTIPLY(tmp6, FIX(1.663905119));
02461 tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048))
02462 + MULTIPLY(tmp5, FIX(1.227391138));
02463 tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962))
02464 + MULTIPLY(tmp4, FIX(2.167985692));
02465
02466 dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
02467 dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
02468 dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
02469 dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
02470
02471 dataptr += DCTSIZE;
02472 }
02473
02474
02475
02476
02477
02478
02479
02480 dataptr = data;
02481 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02482
02483
02484
02485
02486 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
02487 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
02488 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
02489 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
02490
02491 tmp10 = tmp0 + tmp3;
02492 tmp12 = tmp0 - tmp3;
02493 tmp11 = tmp1 + tmp2;
02494 tmp13 = tmp1 - tmp2;
02495
02496 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
02497 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
02498 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
02499 tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
02500
02501 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1);
02502 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1);
02503
02504 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
02505 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
02506 CONST_BITS+PASS1_BITS+1);
02507 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
02508 CONST_BITS+PASS1_BITS+1);
02509
02510
02511
02512
02513
02514
02515 tmp10 = tmp0 + tmp3;
02516 tmp11 = tmp1 + tmp2;
02517 tmp12 = tmp0 + tmp2;
02518 tmp13 = tmp1 + tmp3;
02519 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
02520
02521 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
02522 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
02523 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
02524 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
02525 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
02526 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
02527 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
02528 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
02529
02530 tmp12 += z1;
02531 tmp13 += z1;
02532
02533 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12,
02534 CONST_BITS+PASS1_BITS+1);
02535 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13,
02536 CONST_BITS+PASS1_BITS+1);
02537 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12,
02538 CONST_BITS+PASS1_BITS+1);
02539 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13,
02540 CONST_BITS+PASS1_BITS+1);
02541
02542 dataptr++;
02543 }
02544 }
02545
02546
02547
02548
02549
02550
02551
02552
02553 GLOBAL(void)
02554 jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02555 {
02556 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
02557 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
02558 INT32 z1, z2, z3;
02559 DCTELEM *dataptr;
02560 JSAMPROW elemptr;
02561 int ctr;
02562 SHIFT_TEMPS
02563
02564
02565 MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE);
02566
02567
02568
02569
02570
02571
02572 dataptr = data;
02573 for (ctr = 0; ctr < 7; ctr++) {
02574 elemptr = sample_data[ctr] + start_col;
02575
02576
02577
02578 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]);
02579 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]);
02580 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]);
02581 tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]);
02582 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]);
02583 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]);
02584 tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]);
02585
02586 tmp10 = tmp0 + tmp6;
02587 tmp14 = tmp0 - tmp6;
02588 tmp11 = tmp1 + tmp5;
02589 tmp15 = tmp1 - tmp5;
02590 tmp12 = tmp2 + tmp4;
02591 tmp16 = tmp2 - tmp4;
02592
02593 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]);
02594 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]);
02595 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]);
02596 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]);
02597 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]);
02598 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);
02599 tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);
02600
02601
02602 dataptr[0] = (DCTELEM)
02603 ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS);
02604 tmp13 += tmp13;
02605 dataptr[4] = (DCTELEM)
02606 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) +
02607 MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) -
02608 MULTIPLY(tmp12 - tmp13, FIX(0.881747734)),
02609 CONST_BITS-PASS1_BITS);
02610
02611 tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686));
02612
02613 dataptr[2] = (DCTELEM)
02614 DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590))
02615 + MULTIPLY(tmp16, FIX(0.613604268)),
02616 CONST_BITS-PASS1_BITS);
02617 dataptr[6] = (DCTELEM)
02618 DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954))
02619 - MULTIPLY(tmp16, FIX(1.378756276)),
02620 CONST_BITS-PASS1_BITS);
02621
02622
02623
02624 tmp10 = tmp1 + tmp2;
02625 tmp11 = tmp5 - tmp4;
02626 dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS);
02627 tmp3 <<= CONST_BITS;
02628 tmp10 = MULTIPLY(tmp10, - FIX(0.158341681));
02629 tmp11 = MULTIPLY(tmp11, FIX(1.405321284));
02630 tmp10 += tmp11 - tmp3;
02631 tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) +
02632 MULTIPLY(tmp4 + tmp6, FIX(0.752406978));
02633 dataptr[5] = (DCTELEM)
02634 DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773))
02635 + MULTIPLY(tmp4, FIX(1.119999435)),
02636 CONST_BITS-PASS1_BITS);
02637 tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) +
02638 MULTIPLY(tmp5 - tmp6, FIX(0.467085129));
02639 dataptr[3] = (DCTELEM)
02640 DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948))
02641 - MULTIPLY(tmp5, FIX(3.069855259)),
02642 CONST_BITS-PASS1_BITS);
02643 dataptr[1] = (DCTELEM)
02644 DESCALE(tmp11 + tmp12 + tmp3 + tmp6 -
02645 MULTIPLY(tmp0 + tmp6, FIX(1.126980169)),
02646 CONST_BITS-PASS1_BITS);
02647
02648 dataptr += DCTSIZE;
02649 }
02650
02651
02652
02653
02654
02655
02656
02657
02658
02659 dataptr = data;
02660 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02661
02662
02663 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6];
02664 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5];
02665 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4];
02666 tmp3 = dataptr[DCTSIZE*3];
02667
02668 tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6];
02669 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5];
02670 tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4];
02671
02672 z1 = tmp0 + tmp2;
02673 dataptr[DCTSIZE*0] = (DCTELEM)
02674 DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)),
02675 CONST_BITS+PASS1_BITS+1);
02676 tmp3 += tmp3;
02677 z1 -= tmp3;
02678 z1 -= tmp3;
02679 z1 = MULTIPLY(z1, FIX(0.461784020));
02680 z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084));
02681 z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446));
02682 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1);
02683 z1 -= z2;
02684 z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509));
02685 dataptr[DCTSIZE*4] = (DCTELEM)
02686 DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)),
02687 CONST_BITS+PASS1_BITS+1);
02688 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1);
02689
02690
02691
02692 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677));
02693 tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464));
02694 tmp0 = tmp1 - tmp2;
02695 tmp1 += tmp2;
02696 tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523));
02697 tmp1 += tmp2;
02698 tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310));
02699 tmp0 += tmp3;
02700 tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355));
02701
02702 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1);
02703 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1);
02704 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1);
02705
02706 dataptr++;
02707 }
02708 }
02709
02710
02711
02712
02713
02714
02715
02716
02717 GLOBAL(void)
02718 jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02719 {
02720 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
02721 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
02722 DCTELEM *dataptr;
02723 JSAMPROW elemptr;
02724 int ctr;
02725 SHIFT_TEMPS
02726
02727
02728 MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2);
02729
02730
02731
02732
02733
02734
02735 dataptr = data;
02736 for (ctr = 0; ctr < 6; ctr++) {
02737 elemptr = sample_data[ctr] + start_col;
02738
02739
02740
02741 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]);
02742 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]);
02743 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]);
02744 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]);
02745 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]);
02746 tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]);
02747
02748 tmp10 = tmp0 + tmp5;
02749 tmp13 = tmp0 - tmp5;
02750 tmp11 = tmp1 + tmp4;
02751 tmp14 = tmp1 - tmp4;
02752 tmp12 = tmp2 + tmp3;
02753 tmp15 = tmp2 - tmp3;
02754
02755 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]);
02756 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]);
02757 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]);
02758 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]);
02759 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);
02760 tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);
02761
02762
02763 dataptr[0] = (DCTELEM)
02764 ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS);
02765 dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS);
02766 dataptr[4] = (DCTELEM)
02767 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)),
02768 CONST_BITS-PASS1_BITS);
02769 dataptr[2] = (DCTELEM)
02770 DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)),
02771 CONST_BITS-PASS1_BITS);
02772
02773
02774
02775 tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100);
02776 tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865);
02777 tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065);
02778 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054));
02779 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669));
02780 tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953))
02781 + MULTIPLY(tmp5, FIX(0.184591911));
02782 tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911));
02783 tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912))
02784 + MULTIPLY(tmp5, FIX(0.860918669));
02785 tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011))
02786 - MULTIPLY(tmp5, FIX(1.121971054));
02787 tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965))
02788 - MULTIPLY(tmp2 + tmp5, FIX_0_541196100);
02789
02790 dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
02791 dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
02792 dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
02793 dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
02794
02795 dataptr += DCTSIZE;
02796 }
02797
02798
02799
02800
02801
02802
02803
02804
02805
02806 dataptr = data;
02807 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02808
02809
02810 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];
02811 tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];
02812 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
02813
02814 tmp10 = tmp0 + tmp2;
02815 tmp12 = tmp0 - tmp2;
02816
02817 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];
02818 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];
02819 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
02820
02821 dataptr[DCTSIZE*0] = (DCTELEM)
02822 DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),
02823 CONST_BITS+PASS1_BITS+1);
02824 dataptr[DCTSIZE*2] = (DCTELEM)
02825 DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),
02826 CONST_BITS+PASS1_BITS+1);
02827 dataptr[DCTSIZE*4] = (DCTELEM)
02828 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)),
02829 CONST_BITS+PASS1_BITS+1);
02830
02831
02832
02833 tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));
02834
02835 dataptr[DCTSIZE*1] = (DCTELEM)
02836 DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),
02837 CONST_BITS+PASS1_BITS+1);
02838 dataptr[DCTSIZE*3] = (DCTELEM)
02839 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),
02840 CONST_BITS+PASS1_BITS+1);
02841 dataptr[DCTSIZE*5] = (DCTELEM)
02842 DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),
02843 CONST_BITS+PASS1_BITS+1);
02844
02845 dataptr++;
02846 }
02847 }
02848
02849
02850
02851
02852
02853
02854
02855
02856 GLOBAL(void)
02857 jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02858 {
02859 INT32 tmp0, tmp1, tmp2, tmp3, tmp4;
02860 INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
02861 DCTELEM *dataptr;
02862 JSAMPROW elemptr;
02863 int ctr;
02864 SHIFT_TEMPS
02865
02866
02867 MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3);
02868
02869
02870
02871
02872
02873
02874 dataptr = data;
02875 for (ctr = 0; ctr < 5; ctr++) {
02876 elemptr = sample_data[ctr] + start_col;
02877
02878
02879
02880 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]);
02881 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]);
02882 tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]);
02883 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]);
02884 tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]);
02885
02886 tmp10 = tmp0 + tmp4;
02887 tmp13 = tmp0 - tmp4;
02888 tmp11 = tmp1 + tmp3;
02889 tmp14 = tmp1 - tmp3;
02890
02891 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]);
02892 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]);
02893 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]);
02894 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);
02895 tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);
02896
02897
02898 dataptr[0] = (DCTELEM)
02899 ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS);
02900 tmp12 += tmp12;
02901 dataptr[4] = (DCTELEM)
02902 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) -
02903 MULTIPLY(tmp11 - tmp12, FIX(0.437016024)),
02904 CONST_BITS-PASS1_BITS);
02905 tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876));
02906 dataptr[2] = (DCTELEM)
02907 DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)),
02908 CONST_BITS-PASS1_BITS);
02909 dataptr[6] = (DCTELEM)
02910 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)),
02911 CONST_BITS-PASS1_BITS);
02912
02913
02914
02915 tmp10 = tmp0 + tmp4;
02916 tmp11 = tmp1 - tmp3;
02917 dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS);
02918 tmp2 <<= CONST_BITS;
02919 dataptr[1] = (DCTELEM)
02920 DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) +
02921 MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 +
02922 MULTIPLY(tmp3, FIX(0.642039522)) +
02923 MULTIPLY(tmp4, FIX(0.221231742)),
02924 CONST_BITS-PASS1_BITS);
02925 tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) -
02926 MULTIPLY(tmp1 + tmp3, FIX(0.587785252));
02927 tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) +
02928 (tmp11 << (CONST_BITS - 1)) - tmp2;
02929 dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS);
02930 dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-PASS1_BITS);
02931
02932 dataptr += DCTSIZE;
02933 }
02934
02935
02936
02937
02938
02939
02940
02941
02942
02943 dataptr = data;
02944 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
02945
02946
02947 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4];
02948 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3];
02949 tmp2 = dataptr[DCTSIZE*2];
02950
02951 tmp10 = tmp0 + tmp1;
02952 tmp11 = tmp0 - tmp1;
02953
02954 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4];
02955 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3];
02956
02957 dataptr[DCTSIZE*0] = (DCTELEM)
02958 DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)),
02959 CONST_BITS+PASS1_BITS);
02960 tmp11 = MULTIPLY(tmp11, FIX(1.011928851));
02961 tmp10 -= tmp2 << 2;
02962 tmp10 = MULTIPLY(tmp10, FIX(0.452548340));
02963 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS);
02964 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS);
02965
02966
02967
02968 tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961));
02969
02970 dataptr[DCTSIZE*1] = (DCTELEM)
02971 DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)),
02972 CONST_BITS+PASS1_BITS);
02973 dataptr[DCTSIZE*3] = (DCTELEM)
02974 DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)),
02975 CONST_BITS+PASS1_BITS);
02976
02977 dataptr++;
02978 }
02979 }
02980
02981
02982
02983
02984
02985
02986
02987
02988 GLOBAL(void)
02989 jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
02990 {
02991 INT32 tmp0, tmp1, tmp2, tmp3;
02992 INT32 tmp10, tmp11, tmp12, tmp13;
02993 INT32 z1;
02994 DCTELEM *dataptr;
02995 JSAMPROW elemptr;
02996 int ctr;
02997 SHIFT_TEMPS
02998
02999
03000 MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4);
03001
03002
03003
03004
03005
03006
03007 dataptr = data;
03008 for (ctr = 0; ctr < 4; ctr++) {
03009 elemptr = sample_data[ctr] + start_col;
03010
03011
03012
03013
03014
03015 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
03016 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);
03017 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);
03018 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);
03019
03020 tmp10 = tmp0 + tmp3;
03021 tmp12 = tmp0 - tmp3;
03022 tmp11 = tmp1 + tmp2;
03023 tmp13 = tmp1 - tmp2;
03024
03025 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);
03026 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);
03027 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
03028 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
03029
03030
03031 dataptr[0] = (DCTELEM)
03032 ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1));
03033 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1));
03034
03035 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
03036
03037 z1 += ONE << (CONST_BITS-PASS1_BITS-2);
03038 dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
03039 CONST_BITS-PASS1_BITS-1);
03040 dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
03041 CONST_BITS-PASS1_BITS-1);
03042
03043
03044
03045
03046
03047
03048 tmp10 = tmp0 + tmp3;
03049 tmp11 = tmp1 + tmp2;
03050 tmp12 = tmp0 + tmp2;
03051 tmp13 = tmp1 + tmp3;
03052 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
03053
03054 z1 += ONE << (CONST_BITS-PASS1_BITS-2);
03055
03056 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
03057 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
03058 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
03059 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
03060 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
03061 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
03062 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
03063 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
03064
03065 tmp12 += z1;
03066 tmp13 += z1;
03067
03068 dataptr[1] = (DCTELEM)
03069 RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1);
03070 dataptr[3] = (DCTELEM)
03071 RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1);
03072 dataptr[5] = (DCTELEM)
03073 RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1);
03074 dataptr[7] = (DCTELEM)
03075 RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1);
03076
03077 dataptr += DCTSIZE;
03078 }
03079
03080
03081
03082
03083
03084
03085
03086 dataptr = data;
03087 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
03088
03089
03090
03091 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1));
03092 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];
03093
03094 tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
03095 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
03096
03097 dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);
03098 dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);
03099
03100
03101
03102 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
03103
03104 tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);
03105
03106 dataptr[DCTSIZE*1] = (DCTELEM)
03107 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
03108 CONST_BITS+PASS1_BITS);
03109 dataptr[DCTSIZE*3] = (DCTELEM)
03110 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
03111 CONST_BITS+PASS1_BITS);
03112
03113 dataptr++;
03114 }
03115 }
03116
03117
03118
03119
03120
03121
03122
03123
03124 GLOBAL(void)
03125 jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03126 {
03127 INT32 tmp0, tmp1, tmp2;
03128 INT32 tmp10, tmp11, tmp12;
03129 DCTELEM *dataptr;
03130 JSAMPROW elemptr;
03131 int ctr;
03132 SHIFT_TEMPS
03133
03134
03135 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03136
03137
03138
03139
03140
03141
03142
03143
03144 dataptr = data;
03145 for (ctr = 0; ctr < 3; ctr++) {
03146 elemptr = sample_data[ctr] + start_col;
03147
03148
03149
03150 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);
03151 tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);
03152 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);
03153
03154 tmp10 = tmp0 + tmp2;
03155 tmp12 = tmp0 - tmp2;
03156
03157 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);
03158 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
03159 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
03160
03161
03162 dataptr[0] = (DCTELEM)
03163 ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1));
03164 dataptr[2] = (DCTELEM)
03165 DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),
03166 CONST_BITS-PASS1_BITS-1);
03167 dataptr[4] = (DCTELEM)
03168 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)),
03169 CONST_BITS-PASS1_BITS-1);
03170
03171
03172
03173 tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),
03174 CONST_BITS-PASS1_BITS-1);
03175
03176 dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1)));
03177 dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1));
03178 dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1)));
03179
03180 dataptr += DCTSIZE;
03181 }
03182
03183
03184
03185
03186
03187
03188
03189
03190
03191 dataptr = data;
03192 for (ctr = 0; ctr < 6; ctr++) {
03193
03194
03195 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2];
03196 tmp1 = dataptr[DCTSIZE*1];
03197
03198 tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2];
03199
03200 dataptr[DCTSIZE*0] = (DCTELEM)
03201 DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),
03202 CONST_BITS+PASS1_BITS);
03203 dataptr[DCTSIZE*2] = (DCTELEM)
03204 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)),
03205 CONST_BITS+PASS1_BITS);
03206
03207
03208
03209 dataptr[DCTSIZE*1] = (DCTELEM)
03210 DESCALE(MULTIPLY(tmp2, FIX(2.177324216)),
03211 CONST_BITS+PASS1_BITS);
03212
03213 dataptr++;
03214 }
03215 }
03216
03217
03218
03219
03220
03221
03222
03223
03224 GLOBAL(void)
03225 jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03226 {
03227 INT32 tmp0, tmp1;
03228 INT32 tmp10, tmp11;
03229 DCTELEM *dataptr;
03230 JSAMPROW elemptr;
03231 int ctr;
03232 SHIFT_TEMPS
03233
03234
03235 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03236
03237
03238
03239
03240
03241
03242
03243
03244 dataptr = data;
03245 for (ctr = 0; ctr < 2; ctr++) {
03246 elemptr = sample_data[ctr] + start_col;
03247
03248
03249
03250 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
03251 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
03252
03253 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
03254 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
03255
03256
03257 dataptr[0] = (DCTELEM)
03258 ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3));
03259 dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3));
03260
03261
03262
03263 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
03264
03265 tmp0 += ONE << (CONST_BITS-PASS1_BITS-4);
03266
03267 dataptr[1] = (DCTELEM)
03268 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
03269 CONST_BITS-PASS1_BITS-3);
03270 dataptr[3] = (DCTELEM)
03271 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
03272 CONST_BITS-PASS1_BITS-3);
03273
03274 dataptr += DCTSIZE;
03275 }
03276
03277
03278
03279
03280
03281
03282 dataptr = data;
03283 for (ctr = 0; ctr < 4; ctr++) {
03284
03285
03286
03287 tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1));
03288 tmp1 = dataptr[DCTSIZE*1];
03289
03290 dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);
03291
03292
03293
03294 dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);
03295
03296 dataptr++;
03297 }
03298 }
03299
03300
03301
03302
03303
03304
03305
03306
03307 GLOBAL(void)
03308 jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03309 {
03310 INT32 tmp0, tmp1;
03311 JSAMPROW elemptr;
03312
03313
03314 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03315
03316 elemptr = sample_data[0] + start_col;
03317
03318 tmp0 = GETJSAMPLE(elemptr[0]);
03319 tmp1 = GETJSAMPLE(elemptr[1]);
03320
03321
03322
03323
03324
03325
03326
03327 data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
03328
03329
03330 data[1] = (DCTELEM) ((tmp0 - tmp1) << 5);
03331 }
03332
03333
03334
03335
03336
03337
03338
03339
03340 GLOBAL(void)
03341 jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03342 {
03343 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
03344 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17;
03345 INT32 z1;
03346 DCTELEM workspace[DCTSIZE2];
03347 DCTELEM *dataptr;
03348 DCTELEM *wsptr;
03349 JSAMPROW elemptr;
03350 int ctr;
03351 SHIFT_TEMPS
03352
03353
03354
03355
03356
03357 dataptr = data;
03358 ctr = 0;
03359 for (;;) {
03360 elemptr = sample_data[ctr] + start_col;
03361
03362
03363
03364
03365
03366 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
03367 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]);
03368 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]);
03369 tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]);
03370
03371 tmp10 = tmp0 + tmp3;
03372 tmp12 = tmp0 - tmp3;
03373 tmp11 = tmp1 + tmp2;
03374 tmp13 = tmp1 - tmp2;
03375
03376 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]);
03377 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]);
03378 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
03379 tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
03380
03381
03382 dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
03383 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
03384
03385 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
03386 dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
03387 CONST_BITS-PASS1_BITS);
03388 dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
03389 CONST_BITS-PASS1_BITS);
03390
03391
03392
03393
03394
03395
03396 tmp10 = tmp0 + tmp3;
03397 tmp11 = tmp1 + tmp2;
03398 tmp12 = tmp0 + tmp2;
03399 tmp13 = tmp1 + tmp3;
03400 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
03401
03402 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
03403 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
03404 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
03405 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
03406 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
03407 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
03408 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
03409 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
03410
03411 tmp12 += z1;
03412 tmp13 += z1;
03413
03414 dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
03415 dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
03416 dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
03417 dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
03418
03419 ctr++;
03420
03421 if (ctr != DCTSIZE) {
03422 if (ctr == DCTSIZE * 2)
03423 break;
03424 dataptr += DCTSIZE;
03425 } else
03426 dataptr = workspace;
03427 }
03428
03429
03430
03431
03432
03433
03434
03435
03436 dataptr = data;
03437 wsptr = workspace;
03438 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
03439
03440
03441 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7];
03442 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6];
03443 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5];
03444 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4];
03445 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3];
03446 tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2];
03447 tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1];
03448 tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0];
03449
03450 tmp10 = tmp0 + tmp7;
03451 tmp14 = tmp0 - tmp7;
03452 tmp11 = tmp1 + tmp6;
03453 tmp15 = tmp1 - tmp6;
03454 tmp12 = tmp2 + tmp5;
03455 tmp16 = tmp2 - tmp5;
03456 tmp13 = tmp3 + tmp4;
03457 tmp17 = tmp3 - tmp4;
03458
03459 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7];
03460 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6];
03461 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5];
03462 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4];
03463 tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3];
03464 tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2];
03465 tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1];
03466 tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0];
03467
03468 dataptr[DCTSIZE*0] = (DCTELEM)
03469 DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1);
03470 dataptr[DCTSIZE*4] = (DCTELEM)
03471 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) +
03472 MULTIPLY(tmp11 - tmp12, FIX_0_541196100),
03473 CONST_BITS+PASS1_BITS+1);
03474
03475 tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) +
03476 MULTIPLY(tmp14 - tmp16, FIX(1.387039845));
03477
03478 dataptr[DCTSIZE*2] = (DCTELEM)
03479 DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982))
03480 + MULTIPLY(tmp16, FIX(2.172734804)),
03481 CONST_BITS+PASS1_BITS+1);
03482 dataptr[DCTSIZE*6] = (DCTELEM)
03483 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243))
03484 - MULTIPLY(tmp17, FIX(1.061594338)),
03485 CONST_BITS+PASS1_BITS+1);
03486
03487
03488
03489 tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) +
03490 MULTIPLY(tmp6 - tmp7, FIX(0.410524528));
03491 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) +
03492 MULTIPLY(tmp5 + tmp7, FIX(0.666655658));
03493 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) +
03494 MULTIPLY(tmp4 - tmp7, FIX(0.897167586));
03495 tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) +
03496 MULTIPLY(tmp6 - tmp5, FIX(1.407403738));
03497 tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) +
03498 MULTIPLY(tmp4 + tmp6, - FIX(1.247225013));
03499 tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) +
03500 MULTIPLY(tmp5 - tmp4, FIX(0.410524528));
03501 tmp10 = tmp11 + tmp12 + tmp13 -
03502 MULTIPLY(tmp0, FIX(2.286341144)) +
03503 MULTIPLY(tmp7, FIX(0.779653625));
03504 tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074))
03505 - MULTIPLY(tmp6, FIX(1.663905119));
03506 tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048))
03507 + MULTIPLY(tmp5, FIX(1.227391138));
03508 tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962))
03509 + MULTIPLY(tmp4, FIX(2.167985692));
03510
03511 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1);
03512 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1);
03513 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1);
03514 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1);
03515
03516 dataptr++;
03517 wsptr++;
03518 }
03519 }
03520
03521
03522
03523
03524
03525
03526
03527
03528 GLOBAL(void)
03529 jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03530 {
03531 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
03532 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
03533 INT32 z1, z2, z3;
03534 DCTELEM workspace[8*6];
03535 DCTELEM *dataptr;
03536 DCTELEM *wsptr;
03537 JSAMPROW elemptr;
03538 int ctr;
03539 SHIFT_TEMPS
03540
03541
03542 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03543
03544
03545
03546
03547
03548
03549 dataptr = data;
03550 ctr = 0;
03551 for (;;) {
03552 elemptr = sample_data[ctr] + start_col;
03553
03554
03555
03556 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]);
03557 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]);
03558 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]);
03559 tmp3 = GETJSAMPLE(elemptr[3]);
03560
03561 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]);
03562 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]);
03563 tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);
03564
03565 z1 = tmp0 + tmp2;
03566
03567 dataptr[0] = (DCTELEM)
03568 ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);
03569 tmp3 += tmp3;
03570 z1 -= tmp3;
03571 z1 -= tmp3;
03572 z1 = MULTIPLY(z1, FIX(0.353553391));
03573 z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002));
03574 z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123));
03575 dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS);
03576 z1 -= z2;
03577 z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734));
03578 dataptr[4] = (DCTELEM)
03579 DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)),
03580 CONST_BITS-PASS1_BITS);
03581 dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS);
03582
03583
03584
03585 tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347));
03586 tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339));
03587 tmp0 = tmp1 - tmp2;
03588 tmp1 += tmp2;
03589 tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276));
03590 tmp1 += tmp2;
03591 tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268));
03592 tmp0 += tmp3;
03593 tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693));
03594
03595 dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);
03596 dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);
03597 dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);
03598
03599 ctr++;
03600
03601 if (ctr != DCTSIZE) {
03602 if (ctr == 14)
03603 break;
03604 dataptr += DCTSIZE;
03605 } else
03606 dataptr = workspace;
03607 }
03608
03609
03610
03611
03612
03613
03614
03615
03616
03617 dataptr = data;
03618 wsptr = workspace;
03619 for (ctr = 0; ctr < 7; ctr++) {
03620
03621
03622 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5];
03623 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4];
03624 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3];
03625 tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2];
03626 tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1];
03627 tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0];
03628 tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
03629
03630 tmp10 = tmp0 + tmp6;
03631 tmp14 = tmp0 - tmp6;
03632 tmp11 = tmp1 + tmp5;
03633 tmp15 = tmp1 - tmp5;
03634 tmp12 = tmp2 + tmp4;
03635 tmp16 = tmp2 - tmp4;
03636
03637 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5];
03638 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4];
03639 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3];
03640 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2];
03641 tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1];
03642 tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0];
03643 tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
03644
03645 dataptr[DCTSIZE*0] = (DCTELEM)
03646 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13,
03647 FIX(0.653061224)),
03648 CONST_BITS+PASS1_BITS);
03649 tmp13 += tmp13;
03650 dataptr[DCTSIZE*4] = (DCTELEM)
03651 DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) +
03652 MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) -
03653 MULTIPLY(tmp12 - tmp13, FIX(0.575835255)),
03654 CONST_BITS+PASS1_BITS);
03655
03656 tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570));
03657
03658 dataptr[DCTSIZE*2] = (DCTELEM)
03659 DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691))
03660 + MULTIPLY(tmp16, FIX(0.400721155)),
03661 CONST_BITS+PASS1_BITS);
03662 dataptr[DCTSIZE*6] = (DCTELEM)
03663 DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725))
03664 - MULTIPLY(tmp16, FIX(0.900412262)),
03665 CONST_BITS+PASS1_BITS);
03666
03667
03668
03669 tmp10 = tmp1 + tmp2;
03670 tmp11 = tmp5 - tmp4;
03671 dataptr[DCTSIZE*7] = (DCTELEM)
03672 DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6,
03673 FIX(0.653061224)),
03674 CONST_BITS+PASS1_BITS);
03675 tmp3 = MULTIPLY(tmp3 , FIX(0.653061224));
03676 tmp10 = MULTIPLY(tmp10, - FIX(0.103406812));
03677 tmp11 = MULTIPLY(tmp11, FIX(0.917760839));
03678 tmp10 += tmp11 - tmp3;
03679 tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) +
03680 MULTIPLY(tmp4 + tmp6, FIX(0.491367823));
03681 dataptr[DCTSIZE*5] = (DCTELEM)
03682 DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076))
03683 + MULTIPLY(tmp4, FIX(0.731428202)),
03684 CONST_BITS+PASS1_BITS);
03685 tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) +
03686 MULTIPLY(tmp5 - tmp6, FIX(0.305035186));
03687 dataptr[DCTSIZE*3] = (DCTELEM)
03688 DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844))
03689 - MULTIPLY(tmp5, FIX(2.004803435)),
03690 CONST_BITS+PASS1_BITS);
03691 dataptr[DCTSIZE*1] = (DCTELEM)
03692 DESCALE(tmp11 + tmp12 + tmp3
03693 - MULTIPLY(tmp0, FIX(0.735987049))
03694 - MULTIPLY(tmp6, FIX(0.082925825)),
03695 CONST_BITS+PASS1_BITS);
03696
03697 dataptr++;
03698 wsptr++;
03699 }
03700 }
03701
03702
03703
03704
03705
03706
03707
03708
03709 GLOBAL(void)
03710 jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03711 {
03712 INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
03713 INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
03714 DCTELEM workspace[8*4];
03715 DCTELEM *dataptr;
03716 DCTELEM *wsptr;
03717 JSAMPROW elemptr;
03718 int ctr;
03719 SHIFT_TEMPS
03720
03721
03722 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03723
03724
03725
03726
03727
03728
03729 dataptr = data;
03730 ctr = 0;
03731 for (;;) {
03732 elemptr = sample_data[ctr] + start_col;
03733
03734
03735
03736 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]);
03737 tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]);
03738 tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]);
03739
03740 tmp10 = tmp0 + tmp2;
03741 tmp12 = tmp0 - tmp2;
03742
03743 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]);
03744 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
03745 tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
03746
03747
03748 dataptr[0] = (DCTELEM)
03749 ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);
03750 dataptr[2] = (DCTELEM)
03751 DESCALE(MULTIPLY(tmp12, FIX(1.224744871)),
03752 CONST_BITS-PASS1_BITS);
03753 dataptr[4] = (DCTELEM)
03754 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)),
03755 CONST_BITS-PASS1_BITS);
03756
03757
03758
03759 tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)),
03760 CONST_BITS-PASS1_BITS);
03761
03762 dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS));
03763 dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS);
03764 dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS));
03765
03766 ctr++;
03767
03768 if (ctr != DCTSIZE) {
03769 if (ctr == 12)
03770 break;
03771 dataptr += DCTSIZE;
03772 } else
03773 dataptr = workspace;
03774 }
03775
03776
03777
03778
03779
03780
03781
03782
03783
03784 dataptr = data;
03785 wsptr = workspace;
03786 for (ctr = 0; ctr < 6; ctr++) {
03787
03788
03789 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3];
03790 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2];
03791 tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1];
03792 tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0];
03793 tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7];
03794 tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6];
03795
03796 tmp10 = tmp0 + tmp5;
03797 tmp13 = tmp0 - tmp5;
03798 tmp11 = tmp1 + tmp4;
03799 tmp14 = tmp1 - tmp4;
03800 tmp12 = tmp2 + tmp3;
03801 tmp15 = tmp2 - tmp3;
03802
03803 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3];
03804 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2];
03805 tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1];
03806 tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0];
03807 tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7];
03808 tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6];
03809
03810 dataptr[DCTSIZE*0] = (DCTELEM)
03811 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)),
03812 CONST_BITS+PASS1_BITS);
03813 dataptr[DCTSIZE*6] = (DCTELEM)
03814 DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)),
03815 CONST_BITS+PASS1_BITS);
03816 dataptr[DCTSIZE*4] = (DCTELEM)
03817 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)),
03818 CONST_BITS+PASS1_BITS);
03819 dataptr[DCTSIZE*2] = (DCTELEM)
03820 DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) +
03821 MULTIPLY(tmp13 + tmp15, FIX(1.214244803)),
03822 CONST_BITS+PASS1_BITS);
03823
03824
03825
03826 tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200));
03827 tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102));
03828 tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502));
03829 tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603));
03830 tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039));
03831 tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403))
03832 + MULTIPLY(tmp5, FIX(0.164081699));
03833 tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699));
03834 tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144))
03835 + MULTIPLY(tmp5, FIX(0.765261039));
03836 tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899))
03837 - MULTIPLY(tmp5, FIX(0.997307603));
03838 tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302))
03839 - MULTIPLY(tmp2 + tmp5, FIX(0.481063200));
03840
03841 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS);
03842 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS);
03843 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS);
03844 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS);
03845
03846 dataptr++;
03847 wsptr++;
03848 }
03849 }
03850
03851
03852
03853
03854
03855
03856
03857
03858 GLOBAL(void)
03859 jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
03860 {
03861 INT32 tmp0, tmp1, tmp2, tmp3, tmp4;
03862 INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
03863 DCTELEM workspace[8*2];
03864 DCTELEM *dataptr;
03865 DCTELEM *wsptr;
03866 JSAMPROW elemptr;
03867 int ctr;
03868 SHIFT_TEMPS
03869
03870
03871 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
03872
03873
03874
03875
03876
03877
03878 dataptr = data;
03879 ctr = 0;
03880 for (;;) {
03881 elemptr = sample_data[ctr] + start_col;
03882
03883
03884
03885 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]);
03886 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]);
03887 tmp2 = GETJSAMPLE(elemptr[2]);
03888
03889 tmp10 = tmp0 + tmp1;
03890 tmp11 = tmp0 - tmp1;
03891
03892 tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);
03893 tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);
03894
03895
03896 dataptr[0] = (DCTELEM)
03897 ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS);
03898 tmp11 = MULTIPLY(tmp11, FIX(0.790569415));
03899 tmp10 -= tmp2 << 2;
03900 tmp10 = MULTIPLY(tmp10, FIX(0.353553391));
03901 dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS);
03902 dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS);
03903
03904
03905
03906 tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876));
03907
03908 dataptr[1] = (DCTELEM)
03909 DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)),
03910 CONST_BITS-PASS1_BITS);
03911 dataptr[3] = (DCTELEM)
03912 DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)),
03913 CONST_BITS-PASS1_BITS);
03914
03915 ctr++;
03916
03917 if (ctr != DCTSIZE) {
03918 if (ctr == 10)
03919 break;
03920 dataptr += DCTSIZE;
03921 } else
03922 dataptr = workspace;
03923 }
03924
03925
03926
03927
03928
03929
03930
03931
03932
03933 dataptr = data;
03934 wsptr = workspace;
03935 for (ctr = 0; ctr < 5; ctr++) {
03936
03937
03938 tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1];
03939 tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0];
03940 tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7];
03941 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6];
03942 tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
03943
03944 tmp10 = tmp0 + tmp4;
03945 tmp13 = tmp0 - tmp4;
03946 tmp11 = tmp1 + tmp3;
03947 tmp14 = tmp1 - tmp3;
03948
03949 tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1];
03950 tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0];
03951 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7];
03952 tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6];
03953 tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
03954
03955 dataptr[DCTSIZE*0] = (DCTELEM)
03956 DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)),
03957 CONST_BITS+PASS1_BITS);
03958 tmp12 += tmp12;
03959 dataptr[DCTSIZE*4] = (DCTELEM)
03960 DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) -
03961 MULTIPLY(tmp11 - tmp12, FIX(0.559380511)),
03962 CONST_BITS+PASS1_BITS);
03963 tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961));
03964 dataptr[DCTSIZE*2] = (DCTELEM)
03965 DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)),
03966 CONST_BITS+PASS1_BITS);
03967 dataptr[DCTSIZE*6] = (DCTELEM)
03968 DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)),
03969 CONST_BITS+PASS1_BITS);
03970
03971
03972
03973 tmp10 = tmp0 + tmp4;
03974 tmp11 = tmp1 - tmp3;
03975 dataptr[DCTSIZE*5] = (DCTELEM)
03976 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)),
03977 CONST_BITS+PASS1_BITS);
03978 tmp2 = MULTIPLY(tmp2, FIX(1.28));
03979 dataptr[DCTSIZE*1] = (DCTELEM)
03980 DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) +
03981 MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 +
03982 MULTIPLY(tmp3, FIX(0.821810588)) +
03983 MULTIPLY(tmp4, FIX(0.283176630)),
03984 CONST_BITS+PASS1_BITS);
03985 tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) -
03986 MULTIPLY(tmp1 + tmp3, FIX(0.752365123));
03987 tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) +
03988 MULTIPLY(tmp11, FIX(0.64)) - tmp2;
03989 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS);
03990 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS);
03991
03992 dataptr++;
03993 wsptr++;
03994 }
03995 }
03996
03997
03998
03999
04000
04001
04002
04003
04004 GLOBAL(void)
04005 jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
04006 {
04007 INT32 tmp0, tmp1, tmp2, tmp3;
04008 INT32 tmp10, tmp11, tmp12, tmp13;
04009 INT32 z1;
04010 DCTELEM *dataptr;
04011 JSAMPROW elemptr;
04012 int ctr;
04013 SHIFT_TEMPS
04014
04015
04016 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
04017
04018
04019
04020
04021
04022
04023
04024 dataptr = data;
04025 for (ctr = 0; ctr < DCTSIZE; ctr++) {
04026 elemptr = sample_data[ctr] + start_col;
04027
04028
04029
04030 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
04031 tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
04032
04033 tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
04034 tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
04035
04036
04037 dataptr[0] = (DCTELEM)
04038 ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1));
04039 dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1));
04040
04041
04042
04043 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
04044
04045 tmp0 += ONE << (CONST_BITS-PASS1_BITS-2);
04046
04047 dataptr[1] = (DCTELEM)
04048 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
04049 CONST_BITS-PASS1_BITS-1);
04050 dataptr[3] = (DCTELEM)
04051 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
04052 CONST_BITS-PASS1_BITS-1);
04053
04054 dataptr += DCTSIZE;
04055 }
04056
04057
04058
04059
04060
04061
04062 dataptr = data;
04063 for (ctr = 0; ctr < 4; ctr++) {
04064
04065
04066
04067
04068 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
04069 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
04070 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
04071 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
04072
04073
04074 tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1));
04075 tmp12 = tmp0 - tmp3;
04076 tmp11 = tmp1 + tmp2;
04077 tmp13 = tmp1 - tmp2;
04078
04079 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
04080 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
04081 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
04082 tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
04083
04084 dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
04085 dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
04086
04087 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
04088
04089 z1 += ONE << (CONST_BITS+PASS1_BITS-1);
04090 dataptr[DCTSIZE*2] = (DCTELEM)
04091 RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
04092 dataptr[DCTSIZE*6] = (DCTELEM)
04093 RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
04094
04095
04096
04097
04098
04099
04100 tmp10 = tmp0 + tmp3;
04101 tmp11 = tmp1 + tmp2;
04102 tmp12 = tmp0 + tmp2;
04103 tmp13 = tmp1 + tmp3;
04104 z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602);
04105
04106 z1 += ONE << (CONST_BITS+PASS1_BITS-1);
04107
04108 tmp0 = MULTIPLY(tmp0, FIX_1_501321110);
04109 tmp1 = MULTIPLY(tmp1, FIX_3_072711026);
04110 tmp2 = MULTIPLY(tmp2, FIX_2_053119869);
04111 tmp3 = MULTIPLY(tmp3, FIX_0_298631336);
04112 tmp10 = MULTIPLY(tmp10, - FIX_0_899976223);
04113 tmp11 = MULTIPLY(tmp11, - FIX_2_562915447);
04114 tmp12 = MULTIPLY(tmp12, - FIX_0_390180644);
04115 tmp13 = MULTIPLY(tmp13, - FIX_1_961570560);
04116
04117 tmp12 += z1;
04118 tmp13 += z1;
04119
04120 dataptr[DCTSIZE*1] = (DCTELEM)
04121 RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
04122 dataptr[DCTSIZE*3] = (DCTELEM)
04123 RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
04124 dataptr[DCTSIZE*5] = (DCTELEM)
04125 RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
04126 dataptr[DCTSIZE*7] = (DCTELEM)
04127 RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
04128
04129 dataptr++;
04130 }
04131 }
04132
04133
04134
04135
04136
04137
04138
04139
04140 GLOBAL(void)
04141 jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
04142 {
04143 INT32 tmp0, tmp1, tmp2;
04144 INT32 tmp10, tmp11, tmp12;
04145 DCTELEM *dataptr;
04146 JSAMPROW elemptr;
04147 int ctr;
04148 SHIFT_TEMPS
04149
04150
04151 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
04152
04153
04154
04155
04156
04157
04158
04159
04160 dataptr = data;
04161 for (ctr = 0; ctr < 6; ctr++) {
04162 elemptr = sample_data[ctr] + start_col;
04163
04164
04165
04166 tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]);
04167 tmp1 = GETJSAMPLE(elemptr[1]);
04168
04169 tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);
04170
04171
04172 dataptr[0] = (DCTELEM)
04173 ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1));
04174 dataptr[2] = (DCTELEM)
04175 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)),
04176 CONST_BITS-PASS1_BITS-1);
04177
04178
04179
04180 dataptr[1] = (DCTELEM)
04181 DESCALE(MULTIPLY(tmp2, FIX(1.224744871)),
04182 CONST_BITS-PASS1_BITS-1);
04183
04184 dataptr += DCTSIZE;
04185 }
04186
04187
04188
04189
04190
04191
04192
04193
04194
04195 dataptr = data;
04196 for (ctr = 0; ctr < 3; ctr++) {
04197
04198
04199 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5];
04200 tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4];
04201 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
04202
04203 tmp10 = tmp0 + tmp2;
04204 tmp12 = tmp0 - tmp2;
04205
04206 tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5];
04207 tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4];
04208 tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
04209
04210 dataptr[DCTSIZE*0] = (DCTELEM)
04211 DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)),
04212 CONST_BITS+PASS1_BITS);
04213 dataptr[DCTSIZE*2] = (DCTELEM)
04214 DESCALE(MULTIPLY(tmp12, FIX(2.177324216)),
04215 CONST_BITS+PASS1_BITS);
04216 dataptr[DCTSIZE*4] = (DCTELEM)
04217 DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)),
04218 CONST_BITS+PASS1_BITS);
04219
04220
04221
04222 tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829));
04223
04224 dataptr[DCTSIZE*1] = (DCTELEM)
04225 DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)),
04226 CONST_BITS+PASS1_BITS);
04227 dataptr[DCTSIZE*3] = (DCTELEM)
04228 DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)),
04229 CONST_BITS+PASS1_BITS);
04230 dataptr[DCTSIZE*5] = (DCTELEM)
04231 DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)),
04232 CONST_BITS+PASS1_BITS);
04233
04234 dataptr++;
04235 }
04236 }
04237
04238
04239
04240
04241
04242
04243
04244
04245 GLOBAL(void)
04246 jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
04247 {
04248 INT32 tmp0, tmp1;
04249 INT32 tmp10, tmp11;
04250 DCTELEM *dataptr;
04251 JSAMPROW elemptr;
04252 int ctr;
04253 SHIFT_TEMPS
04254
04255
04256 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
04257
04258
04259
04260
04261
04262 dataptr = data;
04263 for (ctr = 0; ctr < 4; ctr++) {
04264 elemptr = sample_data[ctr] + start_col;
04265
04266
04267
04268 tmp0 = GETJSAMPLE(elemptr[0]);
04269 tmp1 = GETJSAMPLE(elemptr[1]);
04270
04271
04272 dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3);
04273
04274
04275
04276 dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3);
04277
04278 dataptr += DCTSIZE;
04279 }
04280
04281
04282
04283
04284
04285
04286
04287 dataptr = data;
04288 for (ctr = 0; ctr < 2; ctr++) {
04289
04290
04291 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3];
04292 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2];
04293
04294 tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
04295 tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
04296
04297 dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1);
04298 dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1);
04299
04300
04301
04302 tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100);
04303
04304 tmp0 += ONE << (CONST_BITS-1);
04305
04306 dataptr[DCTSIZE*1] = (DCTELEM)
04307 RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865),
04308 CONST_BITS);
04309 dataptr[DCTSIZE*3] = (DCTELEM)
04310 RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065),
04311 CONST_BITS);
04312
04313 dataptr++;
04314 }
04315 }
04316
04317
04318
04319
04320
04321
04322
04323
04324 GLOBAL(void)
04325 jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
04326 {
04327 INT32 tmp0, tmp1;
04328
04329
04330 MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
04331
04332 tmp0 = GETJSAMPLE(sample_data[0][start_col]);
04333 tmp1 = GETJSAMPLE(sample_data[1][start_col]);
04334
04335
04336
04337
04338
04339
04340
04341 data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
04342
04343
04344 data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5);
04345 }
04346
04347 #endif
04348 #endif