OSDN Git Service

Update to current version of Go library.
[pf3gnuchains/gcc-fork.git] / libgo / go / image / jpeg / fdct.go
1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package jpeg
6
7 // This file implements a Forward Discrete Cosine Transformation.
8
9 /*
10 It is based on the code in jfdctint.c from the Independent JPEG Group,
11 found at http://www.ijg.org/files/jpegsrc.v8c.tar.gz.
12
13 The "LEGAL ISSUES" section of the README in that archive says:
14
15 In plain English:
16
17 1. We don't promise that this software works.  (But if you find any bugs,
18    please let us know!)
19 2. You can use this software for whatever you want.  You don't have to pay us.
20 3. You may not pretend that you wrote this software.  If you use it in a
21    program, you must acknowledge somewhere in your documentation that
22    you've used the IJG code.
23
24 In legalese:
25
26 The authors make NO WARRANTY or representation, either express or implied,
27 with respect to this software, its quality, accuracy, merchantability, or
28 fitness for a particular purpose.  This software is provided "AS IS", and you,
29 its user, assume the entire risk as to its quality and accuracy.
30
31 This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
32 All Rights Reserved except as specified below.
33
34 Permission is hereby granted to use, copy, modify, and distribute this
35 software (or portions thereof) for any purpose, without fee, subject to these
36 conditions:
37 (1) If any part of the source code for this software is distributed, then this
38 README file must be included, with this copyright and no-warranty notice
39 unaltered; and any additions, deletions, or changes to the original files
40 must be clearly indicated in accompanying documentation.
41 (2) If only executable code is distributed, then the accompanying
42 documentation must state that "this software is based in part on the work of
43 the Independent JPEG Group".
44 (3) Permission for use of this software is granted only if the user accepts
45 full responsibility for any undesirable consequences; the authors accept
46 NO LIABILITY for damages of any kind.
47
48 These conditions apply to any software derived from or based on the IJG code,
49 not just to the unmodified library.  If you use our work, you ought to
50 acknowledge us.
51
52 Permission is NOT granted for the use of any IJG author's name or company name
53 in advertising or publicity relating to this software or products derived from
54 it.  This software may be referred to only as "the Independent JPEG Group's
55 software".
56
57 We specifically permit and encourage the use of this software as the basis of
58 commercial products, provided that all warranty or liability claims are
59 assumed by the product vendor.
60 */
61
62 // Trigonometric constants in 13-bit fixed point format.
63 const (
64         fix_0_298631336 = 2446
65         fix_0_390180644 = 3196
66         fix_0_541196100 = 4433
67         fix_0_765366865 = 6270
68         fix_0_899976223 = 7373
69         fix_1_175875602 = 9633
70         fix_1_501321110 = 12299
71         fix_1_847759065 = 15137
72         fix_1_961570560 = 16069
73         fix_2_053119869 = 16819
74         fix_2_562915447 = 20995
75         fix_3_072711026 = 25172
76 )
77
78 const (
79         constBits     = 13
80         pass1Bits     = 2
81         centerJSample = 128
82 )
83
84 // fdct performs a forward DCT on an 8x8 block of coefficients, including a
85 // level shift.
86 func fdct(b *block) {
87         // Pass 1: process rows.
88         for y := 0; y < 8; y++ {
89                 x0 := b[y*8+0]
90                 x1 := b[y*8+1]
91                 x2 := b[y*8+2]
92                 x3 := b[y*8+3]
93                 x4 := b[y*8+4]
94                 x5 := b[y*8+5]
95                 x6 := b[y*8+6]
96                 x7 := b[y*8+7]
97
98                 tmp0 := x0 + x7
99                 tmp1 := x1 + x6
100                 tmp2 := x2 + x5
101                 tmp3 := x3 + x4
102
103                 tmp10 := tmp0 + tmp3
104                 tmp12 := tmp0 - tmp3
105                 tmp11 := tmp1 + tmp2
106                 tmp13 := tmp1 - tmp2
107
108                 tmp0 = x0 - x7
109                 tmp1 = x1 - x6
110                 tmp2 = x2 - x5
111                 tmp3 = x3 - x4
112
113                 b[y*8+0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits
114                 b[y*8+4] = (tmp10 - tmp11) << pass1Bits
115                 z1 := (tmp12 + tmp13) * fix_0_541196100
116                 z1 += 1 << (constBits - pass1Bits - 1)
117                 b[y*8+2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits)
118                 b[y*8+6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits)
119
120                 tmp10 = tmp0 + tmp3
121                 tmp11 = tmp1 + tmp2
122                 tmp12 = tmp0 + tmp2
123                 tmp13 = tmp1 + tmp3
124                 z1 = (tmp12 + tmp13) * fix_1_175875602
125                 z1 += 1 << (constBits - pass1Bits - 1)
126                 tmp0 = tmp0 * fix_1_501321110
127                 tmp1 = tmp1 * fix_3_072711026
128                 tmp2 = tmp2 * fix_2_053119869
129                 tmp3 = tmp3 * fix_0_298631336
130                 tmp10 = tmp10 * -fix_0_899976223
131                 tmp11 = tmp11 * -fix_2_562915447
132                 tmp12 = tmp12 * -fix_0_390180644
133                 tmp13 = tmp13 * -fix_1_961570560
134
135                 tmp12 += z1
136                 tmp13 += z1
137                 b[y*8+1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits)
138                 b[y*8+3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits)
139                 b[y*8+5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits)
140                 b[y*8+7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits)
141         }
142         // Pass 2: process columns.
143         // We remove pass1Bits scaling, but leave results scaled up by an overall factor of 8.
144         for x := 0; x < 8; x++ {
145                 tmp0 := b[0*8+x] + b[7*8+x]
146                 tmp1 := b[1*8+x] + b[6*8+x]
147                 tmp2 := b[2*8+x] + b[5*8+x]
148                 tmp3 := b[3*8+x] + b[4*8+x]
149
150                 tmp10 := tmp0 + tmp3 + 1<<(pass1Bits-1)
151                 tmp12 := tmp0 - tmp3
152                 tmp11 := tmp1 + tmp2
153                 tmp13 := tmp1 - tmp2
154
155                 tmp0 = b[0*8+x] - b[7*8+x]
156                 tmp1 = b[1*8+x] - b[6*8+x]
157                 tmp2 = b[2*8+x] - b[5*8+x]
158                 tmp3 = b[3*8+x] - b[4*8+x]
159
160                 b[0*8+x] = (tmp10 + tmp11) >> pass1Bits
161                 b[4*8+x] = (tmp10 - tmp11) >> pass1Bits
162
163                 z1 := (tmp12 + tmp13) * fix_0_541196100
164                 z1 += 1 << (constBits + pass1Bits - 1)
165                 b[2*8+x] = (z1 + tmp12*fix_0_765366865) >> (constBits + pass1Bits)
166                 b[6*8+x] = (z1 - tmp13*fix_1_847759065) >> (constBits + pass1Bits)
167
168                 tmp10 = tmp0 + tmp3
169                 tmp11 = tmp1 + tmp2
170                 tmp12 = tmp0 + tmp2
171                 tmp13 = tmp1 + tmp3
172                 z1 = (tmp12 + tmp13) * fix_1_175875602
173                 z1 += 1 << (constBits + pass1Bits - 1)
174                 tmp0 = tmp0 * fix_1_501321110
175                 tmp1 = tmp1 * fix_3_072711026
176                 tmp2 = tmp2 * fix_2_053119869
177                 tmp3 = tmp3 * fix_0_298631336
178                 tmp10 = tmp10 * -fix_0_899976223
179                 tmp11 = tmp11 * -fix_2_562915447
180                 tmp12 = tmp12 * -fix_0_390180644
181                 tmp13 = tmp13 * -fix_1_961570560
182
183                 tmp12 += z1
184                 tmp13 += z1
185                 b[1*8+x] = (tmp0 + tmp10 + tmp12) >> (constBits + pass1Bits)
186                 b[3*8+x] = (tmp1 + tmp11 + tmp13) >> (constBits + pass1Bits)
187                 b[5*8+x] = (tmp2 + tmp11 + tmp12) >> (constBits + pass1Bits)
188                 b[7*8+x] = (tmp3 + tmp10 + tmp13) >> (constBits + pass1Bits)
189         }
190 }