// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package vp8

// This file implements the inverse Discrete Cosine Transform and the inverse
// Walsh Hadamard Transform (WHT), as specified in sections 14.3 and 14.4.

func clip8( int32) uint8 {
	if  < 0 {
		return 0
	}
	if  > 255 {
		return 255
	}
	return uint8()
}

func ( *Decoder) (, ,  int) {
	const (
		 = 85627 // 65536 * cos(pi/8) * sqrt(2).
		 = 35468 // 65536 * sin(pi/8) * sqrt(2).
	)
	var  [4][4]int32
	for  := 0;  < 4; ++ {
		 := int32(.coeff[+0]) + int32(.coeff[+8])
		 := int32(.coeff[+0]) - int32(.coeff[+8])
		 := (int32(.coeff[+4])*)>>16 - (int32(.coeff[+12])*)>>16
		 := (int32(.coeff[+4])*)>>16 + (int32(.coeff[+12])*)>>16
		[][0] =  + 
		[][1] =  + 
		[][2] =  - 
		[][3] =  - 
		++
	}
	for  := 0;  < 4; ++ {
		 := [0][] + 4
		 :=  + [2][]
		 :=  - [2][]
		 := ([1][]*)>>16 - ([3][]*)>>16
		 := ([1][]*)>>16 + ([3][]*)>>16
		.ybr[+][+0] = clip8(int32(.ybr[+][+0]) + (+)>>3)
		.ybr[+][+1] = clip8(int32(.ybr[+][+1]) + (+)>>3)
		.ybr[+][+2] = clip8(int32(.ybr[+][+2]) + (-)>>3)
		.ybr[+][+3] = clip8(int32(.ybr[+][+3]) + (-)>>3)
	}
}

func ( *Decoder) (, ,  int) {
	 := (int32(.coeff[+0]) + 4) >> 3
	for  := 0;  < 4; ++ {
		for  := 0;  < 4; ++ {
			.ybr[+][+] = clip8(int32(.ybr[+][+]) + )
		}
	}
}

func ( *Decoder) (, ,  int) {
	.inverseDCT4(+0, +0, +0*16)
	.inverseDCT4(+0, +4, +1*16)
	.inverseDCT4(+4, +0, +2*16)
	.inverseDCT4(+4, +4, +3*16)
}

func ( *Decoder) (, ,  int) {
	.inverseDCT4DCOnly(+0, +0, +0*16)
	.inverseDCT4DCOnly(+0, +4, +1*16)
	.inverseDCT4DCOnly(+4, +0, +2*16)
	.inverseDCT4DCOnly(+4, +4, +3*16)
}

func ( *Decoder) () {
	var  [16]int32
	for  := 0;  < 4; ++ {
		 := int32(.coeff[384+0+]) + int32(.coeff[384+12+])
		 := int32(.coeff[384+4+]) + int32(.coeff[384+8+])
		 := int32(.coeff[384+4+]) - int32(.coeff[384+8+])
		 := int32(.coeff[384+0+]) - int32(.coeff[384+12+])
		[0+] =  + 
		[8+] =  - 
		[4+] =  + 
		[12+] =  - 
	}
	 := 0
	for  := 0;  < 4; ++ {
		 := [0+*4] + 3
		 :=  + [3+*4]
		 := [1+*4] + [2+*4]
		 := [1+*4] - [2+*4]
		 :=  - [3+*4]
		.coeff[+0] = int16(( + ) >> 3)
		.coeff[+16] = int16(( + ) >> 3)
		.coeff[+32] = int16(( - ) >> 3)
		.coeff[+48] = int16(( - ) >> 3)
		 += 64
	}
}