Home | History | Annotate | Download | only in jpeg
      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 }
    191