blob: 018557c5598cebba5996583c0aa7de4d75f522b8 [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
// make.go writes the https://evanw.github.io/thumbhash/ examples to individual
// files, prepending a 3-byte magic string so that /usr/bin/file or similar
// programs can identify the data as thumbhash-formatted data.
//
// That 3-byte magic string is "\xC3\xBE\xFE", which is arbitrary and not part
// of the original thumbhash description or implementation. But "\xC3\xBE" is
// the UTF-8 encoding of 'þ' (U+00FE LATIN SMALL LETTER THORN) and "\xFE" is
// invalid UTF-8 but is the ISO-8859-1 encoding of 'þ'. The Old English letter
// 'þ' is pronounced like the "th" that starts "thumbhash".
//
// The filenames are the base64.RawURLEncoding of the data (similar to but
// slightly different from the base64.RawStdEncoding used on that web page)
// plus a ".th" extension.
//
// The foobar.png files that correspond to each foobar.th file were manually
// scraped from the https://evanw.github.io/thumbhash/ page. These PNG files
// were written by thumbhash's original JavaScript reference implementation,
// exercised by that page. This small JavaScript library favors implementation
// simplicity over maximizing the compression ratio.
//
// For any given foobar.th input file, that library's RGBA output and Wuffs'
// RGBA output may differ slightly, due to floating point versus fixed point
// rounding errors, but they're pretty close.
//
// Usage: go run make.go
import (
"encoding/base64"
"os"
)
func main() {
if err := main1(); err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
}
func main1() error {
for _, d := range data {
filename := convertBase64StdToBase64URL(d) + ".th"
in, err := base64.RawStdEncoding.DecodeString(d)
if err != nil {
return err
}
out := append([]byte(magic), in...)
if err := os.WriteFile(filename, out, 0666); err != nil {
return err
}
}
return nil
}
func convertBase64StdToBase64URL(s string) string {
b := []byte(s)
for i, c := range b {
if c == '+' {
b[i] = '-'
} else if c == '/' {
b[i] = '_'
}
}
return string(b)
}
const magic = "\xC3\xBE\xFE"
var data = []string{
"1QcSHQRnh493V4dIh4eXh1h4kJUI",
"3PcNNYSFeXh/d3eld0iHZoZgVwh2",
"3OcRJYB4d3h/iIeHeEh3eIhw+j3A",
"HBkSHYSIeHiPiHh8eJd4eTN0EEQG",
"VggKDYAW6lZvdYd6d2iZh/p4GE/k",
"2fcZFIB3iId/h3iJh4aIYJ2V8g",
"IQgSLYZ6iHePh4h1eFeHh4dwgwg3",
"YJqGPQw7sFlslqhFafSE+Q6oJ1h2iHB2Rw",
"2IqDBQQnxnj0JoLYdM3f8ahpuDeHiHdwZw",
}