source: trunk/src/3rdparty/libjpeg/jfdctflt.c@ 116

Last change on this file since 116 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 5.4 KB
Line 
1/*
2 * jfdctflt.c
3 *
4 * Copyright (C) 1994-1996, Thomas G. Lane.
5 * This file is part of the Independent JPEG Group's software.
6 * For conditions of distribution and use, see the accompanying README file.
7 *
8 * This file contains a floating-point implementation of the
9 * forward DCT (Discrete Cosine Transform).
10 *
11 * This implementation should be more accurate than either of the integer
12 * DCT implementations. However, it may not give the same results on all
13 * machines because of differences in roundoff behavior. Speed will depend
14 * on the hardware's floating point capacity.
15 *
16 * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
17 * on each column. Direct algorithms are also available, but they are
18 * much more complex and seem not to be any faster when reduced to code.
19 *
20 * This implementation is based on Arai, Agui, and Nakajima's algorithm for
21 * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
22 * Japanese, but the algorithm is described in the Pennebaker & Mitchell
23 * JPEG textbook (see REFERENCES section in file README). The following code
24 * is based directly on figure 4-8 in P&M.
25 * While an 8-point DCT cannot be done in less than 11 multiplies, it is
26 * possible to arrange the computation so that many of the multiplies are
27 * simple scalings of the final outputs. These multiplies can then be
28 * folded into the multiplications or divisions by the JPEG quantization
29 * table entries. The AA&N method leaves only 5 multiplies and 29 adds
30 * to be done in the DCT itself.
31 * The primary disadvantage of this method is that with a fixed-point
32 * implementation, accuracy is lost due to imprecise representation of the
33 * scaled quantization values. However, that problem does not arise if
34 * we use floating point arithmetic.
35 */
36
37#define JPEG_INTERNALS
38#include "jinclude.h"
39#include "jpeglib.h"
40#include "jdct.h" /* Private declarations for DCT subsystem */
41
42#ifdef DCT_FLOAT_SUPPORTED
43
44
45/*
46 * This module is specialized to the case DCTSIZE = 8.
47 */
48
49#if DCTSIZE != 8
50 Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
51#endif
52
53
54/*
55 * Perform the forward DCT on one block of samples.
56 */
57
58GLOBAL(void)
59jpeg_fdct_float (FAST_FLOAT * data)
60{
61 FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
62 FAST_FLOAT tmp10, tmp11, tmp12, tmp13;
63 FAST_FLOAT z1, z2, z3, z4, z5, z11, z13;
64 FAST_FLOAT *dataptr;
65 int ctr;
66
67 /* Pass 1: process rows. */
68
69 dataptr = data;
70 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
71 tmp0 = dataptr[0] + dataptr[7];
72 tmp7 = dataptr[0] - dataptr[7];
73 tmp1 = dataptr[1] + dataptr[6];
74 tmp6 = dataptr[1] - dataptr[6];
75 tmp2 = dataptr[2] + dataptr[5];
76 tmp5 = dataptr[2] - dataptr[5];
77 tmp3 = dataptr[3] + dataptr[4];
78 tmp4 = dataptr[3] - dataptr[4];
79
80 /* Even part */
81
82 tmp10 = tmp0 + tmp3; /* phase 2 */
83 tmp13 = tmp0 - tmp3;
84 tmp11 = tmp1 + tmp2;
85 tmp12 = tmp1 - tmp2;
86
87 dataptr[0] = tmp10 + tmp11; /* phase 3 */