// Copyright 2016 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 vector

import (
	"bytes"
	"fmt"
	"math"
	"math/rand"
	"runtime"
	"testing"
)

// TestDivideByFFFF tests that dividing by 0xffff is equivalent to multiplying
// and then shifting by magic constants. The Go compiler itself issues this
// multiply-and-shift for a division by the constant value 0xffff. This trick
// is used in the asm code as the GOARCH=amd64 SIMD instructions have parallel
// multiply but not parallel divide.
//
// There's undoubtedly a justification somewhere in Hacker's Delight chapter 10
// "Integer Division by Constants", but I don't have a more specific link.
//
// http://www.hackersdelight.org/divcMore.pdf and
// http://www.hackersdelight.org/magic.htm
func TestDivideByFFFF(t *testing.T) {
	const mul, shift = 0x80008001, 47
	rng := rand.New(rand.NewSource(1))
	for i := 0; i < 20000; i++ {
		u := rng.Uint32()
		got := uint32((uint64(u) * mul) >> shift)
		want := u / 0xffff
		if got != want {
			t.Fatalf("i=%d, u=%#08x: got %#08x, want %#08x", i, u, got, want)
		}
	}
}

// TestXxxSIMDUnaligned tests that unaligned SIMD loads/stores don't crash.

func TestFixedAccumulateSIMDUnaligned(t *testing.T) {
	if !haveAccumulateSIMD {
		t.Skip("No SIMD implemention")
	}

	dst := make([]uint8, 64)
	src := make([]uint32, 64)
	for d := 0; d < 16; d++ {
		for s := 0; s < 16; s++ {
			fixedAccumulateOpSrcSIMD(dst[d:d+32], src[s:s+32])
		}
	}
}

func TestFloatingAccumulateSIMDUnaligned(t *testing.T) {
	if !haveAccumulateSIMD {
		t.Skip("No SIMD implemention")
	}

	dst := make([]uint8, 64)
	src := make([]float32, 64)
	for d := 0; d < 16; d++ {
		for s := 0; s < 16; s++ {
			floatingAccumulateOpSrcSIMD(dst[d:d+32], src[s:s+32])
		}
	}
}

// TestXxxSIMDShortDst tests that the SIMD implementations don't write past the
// end of the dst buffer.

func TestFixedAccumulateSIMDShortDst(t *testing.T) {
	if !haveAccumulateSIMD {
		t.Skip("No SIMD implemention")
	}

	const oneQuarter = uint32(int2ϕ(fxOne*fxOne)) / 4
	src := []uint32{oneQuarter, oneQuarter, oneQuarter, oneQuarter}
	for i := 0; i < 4; i++ {
		dst := make([]uint8, 4)
		fixedAccumulateOpSrcSIMD(dst[:i], src[:i])
		for j := range dst {
			if j < i {
				if got := dst[j]; got == 0 {
					t.Errorf("i=%d, j=%d: got %#02x, want non-zero", i, j, got)
				}
			} else {
				if got := dst[j]; got != 0 {
					t.Errorf("i=%d, j=%d: got %#02x, want zero", i, j, got)
				}
			}
		}
	}
}

func TestFloatingAccumulateSIMDShortDst(t *testing.T) {
	if !haveAccumulateSIMD {
		t.Skip("No SIMD implemention")
	}

	const oneQuarter = 0.25
	src := []float32{oneQuarter, oneQuarter, oneQuarter, oneQuarter}
	for i := 0; i < 4; i++ {
		dst := make([]uint8, 4)
		floatingAccumulateOpSrcSIMD(dst[:i], src[:i])
		for j := range dst {
			if j < i {
				if got := dst[j]; got == 0 {
					t.Errorf("i=%d, j=%d: got %#02x, want non-zero", i, j, got)
				}
			} else {
				if got := dst[j]; got != 0 {
					t.Errorf("i=%d, j=%d: got %#02x, want zero", i, j, got)
				}
			}
		}
	}
}

func TestFixedAccumulateOpOverShort(t *testing.T)    { testAcc(t, fxInShort, fxMaskShort, "over") }
func TestFixedAccumulateOpSrcShort(t *testing.T)     { testAcc(t, fxInShort, fxMaskShort, "src") }
func TestFixedAccumulateMaskShort(t *testing.T)      { testAcc(t, fxInShort, fxMaskShort, "mask") }
func TestFloatingAccumulateOpOverShort(t *testing.T) { testAcc(t, flInShort, flMaskShort, "over") }
func TestFloatingAccumulateOpSrcShort(t *testing.T)  { testAcc(t, flInShort, flMaskShort, "src") }
func TestFloatingAccumulateMaskShort(t *testing.T)   { testAcc(t, flInShort, flMaskShort, "mask") }

func TestFixedAccumulateOpOver16(t *testing.T)    { testAcc(t, fxIn16, fxMask16, "over") }
func TestFixedAccumulateOpSrc16(t *testing.T)     { testAcc(t, fxIn16, fxMask16, "src") }
func TestFixedAccumulateMask16(t *testing.T)      { testAcc(t, fxIn16, fxMask16, "mask") }
func TestFloatingAccumulateOpOver16(t *testing.T) { testAcc(t, flIn16, flMask16, "over") }
func TestFloatingAccumulateOpSrc16(t *testing.T)  { testAcc(t, flIn16, flMask16, "src") }
func TestFloatingAccumulateMask16(t *testing.T)   { testAcc(t, flIn16, flMask16, "mask") }

func testAcc(t *testing.T, in interface{}, mask []uint32, op string) {
	for _, simd := range []bool{false, true} {
		maxN := 0
		switch in := in.(type) {
		case []uint32:
			if simd && !haveAccumulateSIMD {
				continue
			}
			maxN = len(in)
		case []float32:
			if simd && !haveAccumulateSIMD {
				continue
			}
			maxN = len(in)
		}

		for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
			33, 55, 79, 96, 120, 165, 256, maxN} {

			if n > maxN {
				continue
			}

			var (
				got8, want8   []uint8
				got32, want32 []uint32
			)
			switch op {
			case "over":
				const background = 0x40
				got8 = make([]uint8, n)
				for i := range got8 {
					got8[i] = background
				}
				want8 = make([]uint8, n)
				for i := range want8 {
					dstA := uint32(background * 0x101)
					maskA := mask[i]
					outA := dstA*(0xffff-maskA)/0xffff + maskA
					want8[i] = uint8(outA >> 8)
				}

			case "src":
				got8 = make([]uint8, n)
				want8 = make([]uint8, n)
				for i := range want8 {
					want8[i] = uint8(mask[i] >> 8)
				}

			case "mask":
				got32 = make([]uint32, n)
				want32 = mask[:n]
			}

			switch in := in.(type) {
			case []uint32:
				switch op {
				case "over":
					if simd {
						fixedAccumulateOpOverSIMD(got8, in[:n])
					} else {
						fixedAccumulateOpOver(got8, in[:n])
					}
				case "src":
					if simd {
						fixedAccumulateOpSrcSIMD(got8, in[:n])
					} else {
						fixedAccumulateOpSrc(got8, in[:n])
					}
				case "mask":
					copy(got32, in[:n])
					if simd {
						fixedAccumulateMaskSIMD(got32)
					} else {
						fixedAccumulateMask(got32)
					}
				}
			case []float32:
				switch op {
				case "over":
					if simd {
						floatingAccumulateOpOverSIMD(got8, in[:n])
					} else {
						floatingAccumulateOpOver(got8, in[:n])
					}
				case "src":
					if simd {
						floatingAccumulateOpSrcSIMD(got8, in[:n])
					} else {
						floatingAccumulateOpSrc(got8, in[:n])
					}
				case "mask":
					if simd {
						floatingAccumulateMaskSIMD(got32, in[:n])
					} else {
						floatingAccumulateMask(got32, in[:n])
					}
				}
			}

			if op != "mask" {
				if !bytes.Equal(got8, want8) {
					t.Errorf("simd=%t, n=%d:\ngot:  % x\nwant: % x", simd, n, got8, want8)
				}
			} else {
				if !uint32sMatch(got32, want32) {
					t.Errorf("simd=%t, n=%d:\ngot:  % x\nwant: % x", simd, n, got32, want32)
				}
			}
		}
	}
}

// This package contains multiple implementations of the same algorithm, e.g.
// there are both SIMD and non-SIMD (vanilla) implementations on GOARCH=amd64.
// In general, the tests in this file check that the output is *exactly* the
// same, regardless of implementation.
//
// On GOARCH=wasm, float32 arithmetic is done with 64 bit precision. This is
// allowed by the Go specification: only explicit conversions to float32 have
// to round to 32 bit precision. However, the vanilla implementation therefore
// produces different output for GOARCH=wasm than on other GOARCHes.
//
// We therefore treat GOARCH=wasm as a special case, where the tests check that
// the output is only *approximately* the same (within a 0.1% tolerance).
//
// It's not that, on GOARCH=wasm, we produce the "wrong" answer. In fact, the
// computation is more, not less, accurate on GOARCH=wasm. It's that the golden
// output that the tests compare to were, for historical reasons, produced on
// GOARCH=amd64 and so done with less accuracy (where float32 arithmetic is
// performed entirely with 32 bits, not with 64 bits and then rounded back to
// 32 bits). Furthermore, on amd64, we still want to test that SIMD and
// non-SIMD produce exactly the same (albeit less accurate) output. The SIMD
// implementation in particular is limited by what the underlying hardware
// instructions provide, which often favors speed over accuracy.

// approxEquals returns whether got is within 0.1% of want.
func approxEquals(got, want float64) bool {
	const tolerance = 0.001
	return math.Abs(got-want) <= math.Abs(want)*tolerance
}

// sixteen is used by TestFloat32ArithmeticWithinTolerance, below. It needs to
// be a package-level variable so that the compiler does not replace the
// calculation with a single constant.
var sixteen float32 = 16

// TestFloat32ArithmeticWithinTolerance checks that approxEquals' tolerance is
// sufficiently high so that the results of two separate ways of computing the
// arbitrary fraction 16 / 1122 are deemed "approximately equal" even if they
// aren't "exactly equal".
//
// We're not testing whether the computation on amd64 or wasm is "right" or
// "wrong". We're testing that we cope with them being different.
//
// On GOARCH=amd64, printing x and y gives:
//
//	0.0142602495543672
//	0.014260249212384224
//
// On GOARCH=wasm,  printing x and y gives:
//
//	0.0142602495543672
//	0.0142602495543672
//
// The infinitely precise (mathematical) answer is:
//
//	0.014260249554367201426024955436720142602495543672recurring...
//
// See https://play.golang.org/p/RxzKSdD_suE
//
// This test establishes a lower bound on approxEquals' tolerance constant.
// Passing this one test (on all of the various supported GOARCH's) is a
// necessary but not a sufficient condition on that value. Other tests in this
// package that call uint32sMatch or float32sMatch (such as TestMakeFxInXxx,
// TestMakeFlInXxx or anything calling testAcc) also require a sufficiently
// large tolerance. But those tests are more complicated, and if there is a
// problem with the tolerance constant, debugging this test can be simpler.
func TestFloat32ArithmeticWithinTolerance(t *testing.T) {
	x := float64(sixteen) / 1122 // Always use 64-bit division.
	y := float64(sixteen / 1122) // Use 32- or 64-bit division (GOARCH dependent).
	if !approxEquals(x, y) {
		t.Errorf("x and y were not approximately equal:\nx = %v\ny = %v", x, y)
	}
}

func uint32sMatch(xs, ys []uint32) bool {
	if len(xs) != len(ys) {
		return false
	}
	if runtime.GOARCH == "wasm" {
		for i := range xs {
			if !approxEquals(float64(xs[i]), float64(ys[i])) {
				return false
			}
		}
	} else {
		for i := range xs {
			if xs[i] != ys[i] {
				return false
			}
		}
	}
	return true
}

func float32sMatch(xs, ys []float32) bool {
	if len(xs) != len(ys) {
		return false
	}
	if runtime.GOARCH == "wasm" {
		for i := range xs {
			if !approxEquals(float64(xs[i]), float64(ys[i])) {
				return false
			}
		}
	} else {
		for i := range xs {
			if xs[i] != ys[i] {
				return false
			}
		}
	}
	return true
}

func BenchmarkFixedAccumulateOpOver16(b *testing.B)        { benchAcc(b, fxIn16, "over", false) }
func BenchmarkFixedAccumulateOpOverSIMD16(b *testing.B)    { benchAcc(b, fxIn16, "over", true) }
func BenchmarkFixedAccumulateOpSrc16(b *testing.B)         { benchAcc(b, fxIn16, "src", false) }
func BenchmarkFixedAccumulateOpSrcSIMD16(b *testing.B)     { benchAcc(b, fxIn16, "src", true) }
func BenchmarkFixedAccumulateMask16(b *testing.B)          { benchAcc(b, fxIn16, "mask", false) }
func BenchmarkFixedAccumulateMaskSIMD16(b *testing.B)      { benchAcc(b, fxIn16, "mask", true) }
func BenchmarkFloatingAccumulateOpOver16(b *testing.B)     { benchAcc(b, flIn16, "over", false) }
func BenchmarkFloatingAccumulateOpOverSIMD16(b *testing.B) { benchAcc(b, flIn16, "over", true) }
func BenchmarkFloatingAccumulateOpSrc16(b *testing.B)      { benchAcc(b, flIn16, "src", false) }
func BenchmarkFloatingAccumulateOpSrcSIMD16(b *testing.B)  { benchAcc(b, flIn16, "src", true) }
func BenchmarkFloatingAccumulateMask16(b *testing.B)       { benchAcc(b, flIn16, "mask", false) }
func BenchmarkFloatingAccumulateMaskSIMD16(b *testing.B)   { benchAcc(b, flIn16, "mask", true) }

func BenchmarkFixedAccumulateOpOver64(b *testing.B)        { benchAcc(b, fxIn64, "over", false) }
func BenchmarkFixedAccumulateOpOverSIMD64(b *testing.B)    { benchAcc(b, fxIn64, "over", true) }
func BenchmarkFixedAccumulateOpSrc64(b *testing.B)         { benchAcc(b, fxIn64, "src", false) }
func BenchmarkFixedAccumulateOpSrcSIMD64(b *testing.B)     { benchAcc(b, fxIn64, "src", true) }
func BenchmarkFixedAccumulateMask64(b *testing.B)          { benchAcc(b, fxIn64, "mask", false) }
func BenchmarkFixedAccumulateMaskSIMD64(b *testing.B)      { benchAcc(b, fxIn64, "mask", true) }
func BenchmarkFloatingAccumulateOpOver64(b *testing.B)     { benchAcc(b, flIn64, "over", false) }
func BenchmarkFloatingAccumulateOpOverSIMD64(b *testing.B) { benchAcc(b, flIn64, "over", true) }
func BenchmarkFloatingAccumulateOpSrc64(b *testing.B)      { benchAcc(b, flIn64, "src", false) }
func BenchmarkFloatingAccumulateOpSrcSIMD64(b *testing.B)  { benchAcc(b, flIn64, "src", true) }
func BenchmarkFloatingAccumulateMask64(b *testing.B)       { benchAcc(b, flIn64, "mask", false) }
func BenchmarkFloatingAccumulateMaskSIMD64(b *testing.B)   { benchAcc(b, flIn64, "mask", true) }

func benchAcc(b *testing.B, in interface{}, op string, simd bool) {
	var f func()

	switch in := in.(type) {
	case []uint32:
		if simd && !haveAccumulateSIMD {
			b.Skip("No SIMD implemention")
		}

		switch op {
		case "over":
			dst := make([]uint8, len(in))
			if simd {
				f = func() { fixedAccumulateOpOverSIMD(dst, in) }
			} else {
				f = func() { fixedAccumulateOpOver(dst, in) }
			}
		case "src":
			dst := make([]uint8, len(in))
			if simd {
				f = func() { fixedAccumulateOpSrcSIMD(dst, in) }
			} else {
				f = func() { fixedAccumulateOpSrc(dst, in) }
			}
		case "mask":
			buf := make([]uint32, len(in))
			copy(buf, in)
			if simd {
				f = func() { fixedAccumulateMaskSIMD(buf) }
			} else {
				f = func() { fixedAccumulateMask(buf) }
			}
		}

	case []float32:
		if simd && !haveAccumulateSIMD {
			b.Skip("No SIMD implemention")
		}

		switch op {
		case "over":
			dst := make([]uint8, len(in))
			if simd {
				f = func() { floatingAccumulateOpOverSIMD(dst, in) }
			} else {
				f = func() { floatingAccumulateOpOver(dst, in) }
			}
		case "src":
			dst := make([]uint8, len(in))
			if simd {
				f = func() { floatingAccumulateOpSrcSIMD(dst, in) }
			} else {
				f = func() { floatingAccumulateOpSrc(dst, in) }
			}
		case "mask":
			dst := make([]uint32, len(in))
			if simd {
				f = func() { floatingAccumulateMaskSIMD(dst, in) }
			} else {
				f = func() { floatingAccumulateMask(dst, in) }
			}
		}
	}

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		f()
	}
}

// itou exists because "uint32(int2ϕ(-1))" doesn't compile: constant -1
// overflows uint32.
func itou(i int2ϕ) uint32 {
	return uint32(i)
}

var fxInShort = []uint32{
	itou(+0x08000), // +0.125, // Running sum: +0.125
	itou(-0x20000), // -0.500, // Running sum: -0.375
	itou(+0x10000), // +0.250, // Running sum: -0.125
	itou(+0x18000), // +0.375, // Running sum: +0.250
	itou(+0x08000), // +0.125, // Running sum: +0.375
	itou(+0x00000), // +0.000, // Running sum: +0.375
	itou(-0x40000), // -1.000, // Running sum: -0.625
	itou(-0x20000), // -0.500, // Running sum: -1.125
	itou(+0x10000), // +0.250, // Running sum: -0.875
	itou(+0x38000), // +0.875, // Running sum: +0.000
	itou(+0x10000), // +0.250, // Running sum: +0.250
	itou(+0x30000), // +0.750, // Running sum: +1.000
}

var flInShort = []float32{
	+0.125, // Running sum: +0.125
	-0.500, // Running sum: -0.375
	+0.250, // Running sum: -0.125
	+0.375, // Running sum: +0.250
	+0.125, // Running sum: +0.375
	+0.000, // Running sum: +0.375
	-1.000, // Running sum: -0.625
	-0.500, // Running sum: -1.125
	+0.250, // Running sum: -0.875
	+0.875, // Running sum: +0.000
	+0.250, // Running sum: +0.250
	+0.750, // Running sum: +1.000
}

// It's OK for fxMaskShort and flMaskShort to have slightly different values.
// Both the fixed and floating point implementations already have (different)
// rounding errors in the xxxLineTo methods before we get to accumulation. It's
// OK for 50% coverage (in ideal math) to be approximated by either 0x7fff or
// 0x8000. Both slices do contain checks that 0% and 100% map to 0x0000 and
// 0xffff, as does checkCornersCenter in vector_test.go.
//
// It is important, though, for the SIMD and non-SIMD fixed point
// implementations to give the exact same output, and likewise for the floating
// point implementations.

var fxMaskShort = []uint32{
	0x2000,
	0x6000,
	0x2000,
	0x4000,
	0x6000,
	0x6000,
	0xa000,
	0xffff,
	0xe000,
	0x0000,
	0x4000,
	0xffff,
}

var flMaskShort = []uint32{
	0x1fff,
	0x5fff,
	0x1fff,
	0x3fff,
	0x5fff,
	0x5fff,
	0x9fff,
	0xffff,
	0xdfff,
	0x0000,
	0x3fff,
	0xffff,
}

func TestMakeFxInXxx(t *testing.T) {
	dump := func(us []uint32) string {
		var b bytes.Buffer
		for i, u := range us {
			if i%8 == 0 {
				b.WriteByte('\n')
			}
			fmt.Fprintf(&b, "%#08x, ", u)
		}
		return b.String()
	}

	if !uint32sMatch(fxIn16, hardCodedFxIn16) {
		t.Errorf("height 16: got:%v\nwant:%v", dump(fxIn16), dump(hardCodedFxIn16))
	}
}

func TestMakeFlInXxx(t *testing.T) {
	dump := func(fs []float32) string {
		var b bytes.Buffer
		for i, f := range fs {
			if i%8 == 0 {
				b.WriteByte('\n')
			}
			fmt.Fprintf(&b, "%v, ", f)
		}
		return b.String()
	}

	if !float32sMatch(flIn16, hardCodedFlIn16) {
		t.Errorf("height 16: got:%v\nwant:%v", dump(flIn16), dump(hardCodedFlIn16))
	}
}

func makeInXxx(height int, useFloatingPointMath bool) *Rasterizer {
	width, data := scaledBenchmarkGlyphData(height)
	z := NewRasterizer(width, height)
	z.setUseFloatingPointMath(useFloatingPointMath)
	for _, d := range data {
		switch d.n {
		case 0:
			z.MoveTo(d.px, d.py)
		case 1:
			z.LineTo(d.px, d.py)
		case 2:
			z.QuadTo(d.px, d.py, d.qx, d.qy)
		}
	}
	return z
}

func makeFxInXxx(height int) []uint32 {
	z := makeInXxx(height, false)
	return z.bufU32
}

func makeFlInXxx(height int) []float32 {
	z := makeInXxx(height, true)
	return z.bufF32
}

// fxInXxx and flInXxx are the z.bufU32 and z.bufF32 inputs to the accumulate
// functions when rasterizing benchmarkGlyphData at a height of Xxx pixels.
//
// fxMaskXxx and flMaskXxx are the corresponding golden outputs of those
// accumulateMask functions.
//
// The hardCodedEtc versions are a sanity check for unexpected changes in the
// rasterization implementations up to but not including accumulation.

var (
	fxIn16 = makeFxInXxx(16)
	fxIn64 = makeFxInXxx(64)
	flIn16 = makeFlInXxx(16)
	flIn64 = makeFlInXxx(64)
)

var hardCodedFxIn16 = []uint32{
	0x00000000, 0x00000000, 0xffffe91d, 0xfffe7c4a, 0xfffeaa9f, 0xffff4e33, 0xffffc1c5, 0x00007782,
	0x00009619, 0x0001a857, 0x000129e9, 0x00000028, 0x00000000, 0x00000000, 0xffff6e70, 0xfffd3199,
	0xffff5ff8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00014b29,
	0x0002acf3, 0x000007e2, 0xffffca5a, 0xfffcab73, 0xffff8a34, 0x00001b55, 0x0001b334, 0x0001449e,
	0x0000434d, 0xffff62ec, 0xfffe1443, 0xffff325d, 0x00000000, 0x0002234a, 0x0001dcb6, 0xfffe2948,
	0xfffdd6b8, 0x00000000, 0x00028cc0, 0x00017340, 0x00000000, 0x00000000, 0x00000000, 0xffffd2d6,
	0xfffcadd0, 0xffff7f5c, 0x00007400, 0x00038c00, 0xfffe9260, 0xffff2da0, 0x0000023a, 0x0002259b,
	0x0000182a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffdc600, 0xfffe3a00, 0x00000059,
	0x0003a44d, 0x00005b59, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
	0x00000000, 0x00000000, 0xfffe33f3, 0xfffdcc0d, 0x00000000, 0x00033c02, 0x0000c3fe, 0x00000000,
	0x00000000, 0xffffa13d, 0xfffeeec8, 0xffff8c02, 0xffff8c48, 0xffffc7b5, 0x00000000, 0xffff5b68,
	0xffff3498, 0x00000000, 0x00033c00, 0x0000c400, 0xffff9bc4, 0xfffdf4a3, 0xfffe8df3, 0xffffe1a8,
	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00033c00,
	0x000092c7, 0xfffcf373, 0xffff3dc7, 0x00000fcc, 0x00011ae7, 0x000130c3, 0x0000680d, 0x00004a59,
	0x00000a20, 0xfffe9dc4, 0xfffe4a3c, 0x00000000, 0x00033c00, 0xfffe87ef, 0xfffe3c11, 0x0000105e,
	0x0002b9c4, 0x000135dc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffe3600, 0xfffdca00,
	0x00000000, 0x00033c00, 0xfffd9000, 0xffff3400, 0x0000e400, 0x00031c00, 0x00000000, 0x00000000,
	0x00000000, 0x00000000, 0x00000000, 0xfffe3600, 0xfffdca00, 0x00000000, 0x00033c00, 0xfffcf9a5,
	0xffffca5b, 0x000120e6, 0x0002df1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
	0xfffdb195, 0xfffe4e6b, 0x00000000, 0x00033c00, 0xfffd9e00, 0xffff2600, 0x00002f0e, 0x00033ea3,
	0x0000924d, 0x00000000, 0x00000000, 0x00000000, 0xfffe83b3, 0xfffd881d, 0xfffff431, 0x00000000,
	0x00031f60, 0xffff297a, 0xfffdb726, 0x00000000, 0x000053a7, 0x0001b506, 0x0000a24b, 0xffffa32d,
	0xfffead9b, 0xffff0479, 0xffffffc9, 0x00000000, 0x00000000, 0x0002d800, 0x0001249d, 0xfffd67bb,
	0xfffe9baa, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000ac03, 0x0001448b,
	0xfffe0f70, 0x00000000, 0x000229ea, 0x0001d616, 0xffffff8c, 0xfffebf76, 0xfffe54d9, 0xffff5d9e,
	0xffffd3eb, 0x0000c65e, 0x0000fc15, 0x0001d491, 0xffffb566, 0xfffd9433, 0x00000000, 0x0000e4ec,
}

var hardCodedFlIn16 = []float32{
	0, 0, -0.022306755, -0.3782405, -0.33334962, -0.1741521, -0.0607556, 0.11660573,
	0.14664596, 0.41462868, 0.2907673, 0.0001568835, 0, 0, -0.14239307, -0.7012868,
	-0.15632017, 0, 0, 0, 0, 0, 0, 0.3230303,
	0.6690931, 0.007876594, -0.05189419, -0.832786, -0.11531975, 0.026225802, 0.42518616, 0.3154636,
	0.06598757, -0.15304244, -0.47969276, -0.20012794, 0, 0.5327272, 0.46727282, -0.45950258,
	-0.5404974, 0, 0.63484025, 0.36515975, 0, 0, 0, -0.04351709,
	-0.8293345, -0.12714837, 0.11087036, 0.88912964, -0.35792422, -0.2053554, 0.0022513224, 0.5374398,
	0.023588525, 0, 0, 0, 0, -0.55346966, -0.44653034, 0.0002531938,
	0.9088273, 0.090919495, 0, 0, 0, 0, 0, 0,
	0, 0, -0.44745448, -0.5525455, 0, 0.80748945, 0.19251058, 0,
	0, -0.092476256, -0.2661464, -0.11322958, -0.11298219, -0.055094406, 0, -0.16045958,
	-0.1996116, 0, 0.80748653, 0.19251347, -0.09804727, -0.51129663, -0.3610403, -0.029615778,
	0, 0, 0, 0, 0, 0, 0, 0.80748653,
	0.14411622, -0.76251525, -0.1890875, 0.01527351, 0.27528667, 0.29730347, 0.101477206, 0.07259522,
	0.009900213, -0.34395567, -0.42788061, 0, 0.80748653, -0.3648737, -0.44261283, 0.015778137,
	0.6826565, 0.30156538, 0, 0, 0, 0, -0.44563293, -0.55436707,
	0, 0.80748653, -0.60703933, -0.20044717, 0.22371745, 0.77628255, 0, 0,
	0, 0, 0, -0.44563293, -0.55436707, 0, 0.80748653, -0.7550391,
	-0.05244744, 0.2797074, 0.72029257, 0, 0, 0, 0, 0,
	-0.57440215, -0.42559785, 0, 0.80748653, -0.59273535, -0.21475118, 0.04544862, 0.81148535,
	0.14306602, 0, 0, 0, -0.369642, -0.61841226, -0.011945802, 0,
	0.7791623, -0.20691396, -0.57224834, 0, 0.08218567, 0.42637306, 0.1586175, -0.089709565,
	-0.32935485, -0.24788953, -0.00022224105, 0, 0, 0.7085409, 0.28821066, -0.64765793,
	-0.34909368, 0, 0, 0, 0, 0, 0.16679136, 0.31914657,
	-0.48593786, 0, 0.537915, 0.462085, -0.00041967133, -0.3120329, -0.41914812, -0.15886839,
	-0.042683028, 0.19370951, 0.24624406, 0.45803425, -0.07049577, -0.6091341, 0, 0.22253075,
}

var fxMask16 = []uint32{
	0x0000, 0x0000, 0x05b8, 0x66a6, 0xbbfe, 0xe871, 0xf800, 0xda20, 0xb499, 0x4a84, 0x0009, 0x0000, 0x0000,
	0x0000, 0x2463, 0xd7fd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xad35, 0x01f8, 0x0000,
	0x0d69, 0xe28c, 0xffff, 0xf92a, 0x8c5d, 0x3b36, 0x2a62, 0x51a7, 0xcc97, 0xffff, 0xffff, 0x772d, 0x0000,
	0x75ad, 0xffff, 0xffff, 0x5ccf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b4a, 0xdfd6, 0xffff, 0xe2ff, 0x0000,
	0x5b67, 0x8fff, 0x8f70, 0x060a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e7f, 0xffff, 0xffe9, 0x16d6,
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7303, 0xffff, 0xffff, 0x30ff,
	0x0000, 0x0000, 0x0000, 0x17b0, 0x5bfe, 0x78fe, 0x95ec, 0xa3fe, 0xa3fe, 0xcd24, 0xfffe, 0xfffe, 0x30fe,
	0x0001, 0x190d, 0x9be5, 0xf868, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0x30fe,
	0x0c4c, 0xcf6f, 0xfffe, 0xfc0b, 0xb551, 0x6920, 0x4f1d, 0x3c87, 0x39ff, 0x928e, 0xffff, 0xffff, 0x30ff,
	0x8f03, 0xffff, 0xfbe7, 0x4d76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x727f, 0xffff, 0xffff, 0x30ff,
	0xccff, 0xffff, 0xc6ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x727f, 0xffff, 0xffff, 0x30ff,
	0xf296, 0xffff, 0xb7c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x939a, 0xffff, 0xffff, 0x30ff,
	0xc97f, 0xffff, 0xf43c, 0x2493, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f13, 0xfd0c, 0xffff, 0xffff, 0x3827,
	0x6dc9, 0xffff, 0xffff, 0xeb16, 0x7dd4, 0x5541, 0x6c76, 0xc10f, 0xfff1, 0xffff, 0xffff, 0xffff, 0x49ff,
	0x00d8, 0xa6e9, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xd4fe, 0x83db, 0xffff, 0xffff, 0x7584,
	0x0000, 0x001c, 0x503e, 0xbb08, 0xe3a1, 0xeea6, 0xbd0e, 0x7e09, 0x08e5, 0x1b8b, 0xb67f, 0xb67f, 0x7d44,
}

var flMask16 = []uint32{
	0x0000, 0x0000, 0x05b5, 0x668a, 0xbbe0, 0xe875, 0xf803, 0xda29, 0xb49f, 0x4a7a, 0x000a, 0x0000, 0x0000,
	0x0000, 0x2473, 0xd7fb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xad4d, 0x0204, 0x0000,
	0x0d48, 0xe27a, 0xffff, 0xf949, 0x8c70, 0x3bae, 0x2ac9, 0x51f7, 0xccc4, 0xffff, 0xffff, 0x779f, 0x0000,
	0x75a1, 0xffff, 0xffff, 0x5d7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b23, 0xdf73, 0xffff, 0xe39d, 0x0000,
	0x5ba0, 0x9033, 0x8f9f, 0x0609, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8db0, 0xffff, 0xffef, 0x1746,
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x728c, 0xffff, 0xffff, 0x3148,
	0x0000, 0x0000, 0x0000, 0x17ac, 0x5bce, 0x78cb, 0x95b7, 0xa3d2, 0xa3d2, 0xcce6, 0xffff, 0xffff, 0x3148,
	0x0000, 0x1919, 0x9bfd, 0xf86b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x3148,
	0x0c63, 0xcf97, 0xffff, 0xfc17, 0xb59d, 0x6981, 0x4f87, 0x3cf1, 0x3a68, 0x9276, 0xffff, 0xffff, 0x3148,
	0x8eb0, 0xffff, 0xfbf5, 0x4d33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7214, 0xffff, 0xffff, 0x3148,
	0xccaf, 0xffff, 0xc6ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7214, 0xffff, 0xffff, 0x3148,
	0xf292, 0xffff, 0xb865, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x930c, 0xffff, 0xffff, 0x3148,
	0xc906, 0xffff, 0xf45d, 0x249f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ea0, 0xfcf1, 0xffff, 0xffff, 0x3888,
	0x6d81, 0xffff, 0xffff, 0xeaf5, 0x7dcf, 0x5533, 0x6c2b, 0xc07b, 0xfff1, 0xffff, 0xffff, 0xffff, 0x4a9d,
	0x00d4, 0xa6a1, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xd54d, 0x8399, 0xffff, 0xffff, 0x764b,
	0x0000, 0x001b, 0x4ffc, 0xbb4a, 0xe3f5, 0xeee3, 0xbd4c, 0x7e42, 0x0900, 0x1b0c, 0xb6fc, 0xb6fc, 0x7e04,
}

// TestFixedFloatingCloseness compares the closeness of the fixed point and
// floating point rasterizer.
func TestFixedFloatingCloseness(t *testing.T) {
	if len(fxMask16) != len(flMask16) {
		t.Fatalf("len(fxMask16) != len(flMask16)")
	}

	total := uint32(0)
	for i := range fxMask16 {
		a := fxMask16[i]
		b := flMask16[i]
		if a > b {
			total += a - b
		} else {
			total += b - a
		}
	}
	n := len(fxMask16)

	// This log message is useful when changing the fixed point rasterizer
	// implementation, such as by changing ϕ. Assuming that the floating point
	// rasterizer is accurate, the average difference is a measure of how
	// inaccurate the (faster) fixed point rasterizer is.
	//
	// Smaller is better.
	percent := float64(total*100) / float64(n*65535)
	t.Logf("Comparing closeness of the fixed point and floating point rasterizer.\n"+
		"Specifically, the elements of fxMask16 and flMask16.\n"+
		"Total diff = %d, n = %d, avg = %.5f out of 65535, or %.5f%%.\n",
		total, n, float64(total)/float64(n), percent)

	const thresholdPercent = 1.0
	if percent > thresholdPercent {
		t.Errorf("average difference: got %.5f%%, want <= %.5f%%", percent, thresholdPercent)
	}
}
