blob: 1976334ef557855ad3779a690a91e8d57cb2d99e [file] [log] [blame]
// Copyright 2024 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
//go:build ignore
// +build ignore
package main
// print-thumbhash-tables.go prints the std/thumbhash tables.
//
// Usage: go run print-thumbhash-tables.go
import (
"fmt"
"math"
"os"
)
func main() {
if err := main1(); err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
}
func main1() error {
printLxLy()
fmt.Println()
printFrom4Bits(1.00)
fmt.Println()
printFrom4Bits(1.25)
fmt.Println()
printCosines()
return nil
}
func printLxLy() {
for bits := 0; bits < 16; bits++ {
lCount := bits & 7
if lCount < 3 {
continue
} else if lCount == 3 {
fmt.Println()
}
hasAlpha := (bits >> 3) & 1
isLandscape := (bits >> 4) & 1
lx := lCount
ly := 7
if hasAlpha != 0 {
ly = 5
}
if isLandscape != 0 {
lx, ly = ly, lx
}
ratio := float64(lx) / float64(ly)
w, h := 32, 32
if ratio > 1 {
h = int(math.Round(32 / ratio))
} else {
w = int(math.Round(32 * ratio))
}
lenlac := 0
for cy := 0; cy < ly; cy++ {
for cx := ifElse(cy, 0, 1); (cx * ly) < (lx * (ly - cy)); cx++ {
lenlac++
}
}
lenpac := 0
for cy := 0; cy < 3; cy++ {
for cx := ifElse(cy, 0, 1); (cx * 3) < (3 * (3 - cy)); cx++ {
lenpac++
}
}
lenaac := 0
if hasAlpha != 0 {
for cy := 0; cy < 5; cy++ {
for cx := ifElse(cy, 0, 1); (cx * 5) < (5 * (5 - cy)); cx++ {
lenaac++
}
}
}
fileSize := 5 + hasAlpha + (lenlac+lenpac+lenpac+lenaac+1)/2
fmt.Printf("l_count: %d lx / ly = %d / %d w = %2d h = %2d #lac = %2d #pac = #qac = %d #aac = %2d file_size = 3 + %2d\n",
lCount, lx, ly, w, h, lenlac, lenpac, lenaac, fileSize)
}
}
func printFrom4Bits(scale float64) {
for i := 0; i < 16; i++ {
x := (float64(i)/7.5 - 1) * scale
y := (x * (1 << 14))
fmt.Printf("0x%04X, // %s%0.3f\n", 0xFFFF&int(math.Round(y)), plusSign(y), x)
}
}
func printCosines() {
widths := []int{
0, 14, 18, 19, 23, 26, 27, 32,
}
for _, w := range widths {
fmt.Printf("\n// w = %2d\n", w)
for x := 0; x < w; x++ {
fmt.Printf("[")
for cx := 1; cx < 7; cx++ {
u := math.Cos(math.Pi * float64(cx) * (float64(x) + 0.5) / float64(w))
v := u * (1 << 14)
fmt.Printf("0x%04X", 0xFFFF&int(math.Round(v)))
if cx < 6 {
fmt.Printf(",")
}
}
fmt.Printf("], // x = %2d\n", x)
}
}
}
func ifElse(c int, x int, y int) int {
if c != 0 {
return x
}
return y
}
func plusSign(x float64) string {
if x >= 0 {
return "+"
}
return ""
}