github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/image/jpeg/fdct.go (about) 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 }