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
5package jpeg
6
7// This file implements a Forward Discrete Cosine Transformation.
8
9/*
10It is based on the code in jfdctint.c from the Independent JPEG Group,
11found at http://www.ijg.org/files/jpegsrc.v8c.tar.gz.
12
13The "LEGAL ISSUES" section of the README in that archive says:
14
15In plain English:
16
171. We don't promise that this software works.  (But if you find any bugs,
18   please let us know!)
192. You can use this software for whatever you want.  You don't have to pay us.
203. 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
24In legalese:
25
26The authors make NO WARRANTY or representation, either express or implied,
27with respect to this software, its quality, accuracy, merchantability, or
28fitness for a particular purpose.  This software is provided "AS IS", and you,
29its user, assume the entire risk as to its quality and accuracy.
30
31This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
32All Rights Reserved except as specified below.
33
34Permission is hereby granted to use, copy, modify, and distribute this
35software (or portions thereof) for any purpose, without fee, subject to these
36conditions:
37(1) If any part of the source code for this software is distributed, then this
38README file must be included, with this copyright and no-warranty notice
39unaltered; and any additions, deletions, or changes to the original files
40must be clearly indicated in accompanying documentation.
41(2) If only executable code is distributed, then the accompanying
42documentation must state that "this software is based in part on the work of
43the Independent JPEG Group".
44(3) Permission for use of this software is granted only if the user accepts
45full responsibility for any undesirable consequences; the authors accept
46NO LIABILITY for damages of any kind.
47
48These conditions apply to any software derived from or based on the IJG code,
49not just to the unmodified library.  If you use our work, you ought to
50acknowledge us.
51
52Permission is NOT granted for the use of any IJG author's name or company name
53in advertising or publicity relating to this software or products derived from
54it.  This software may be referred to only as "the Independent JPEG Group's
55software".
56
57We specifically permit and encourage the use of this software as the basis of
58commercial products, provided that all warranty or liability claims are
59assumed by the product vendor.
60*/
61
62// Trigonometric constants in 13-bit fixed point format.
63const (
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
78const (
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.
86func 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}
191