| // 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", | |
| } |