blob: 4f4d88345a8da3e068565632072c9c72dc67a9fb [file] [log] [blame]
// Copyright 2013 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.
// +build ignore
package main
// This program generates palette.go. Invoke it as
// go run gen.go | gofmt > palette.go
import (
"fmt"
)
func main() {
fmt.Println(`// Copyright 2013 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.`)
fmt.Println()
fmt.Println("// generated by go run gen.go; DO NOT EDIT")
fmt.Println()
fmt.Println("// Package palette provides standard color palettes.")
fmt.Println("package palette")
fmt.Println()
fmt.Println(`import "image/color"`)
fmt.Println()
printPlan9()
printWebSafe()
}
func printPlan9() {
c, lines := [3]int{}, [256]string{}
for r, i := 0, 0; r != 4; r++ {
for v := 0; v != 4; v, i = v+1, i+16 {
for g, j := 0, v-r; g != 4; g++ {
for b := 0; b != 4; b, j = b+1, j+1 {
den := r
if g > den {
den = g
}
if b > den {
den = b
}
if den == 0 {
c[0] = 0x11 * v
c[1] = 0x11 * v
c[2] = 0x11 * v
} else {
num := 17 * (4*den + v)
c[0] = r * num / den
c[1] = g * num / den
c[2] = b * num / den
}
lines[i+(j&0x0f)] =
fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", c[0], c[1], c[2])
}
}
}
}
fmt.Println("// Plan9 is a 256-color palette that partitions the 24-bit RGB space")
fmt.Println("// into 4×4×4 subdivision, with 4 shades in each subcube. Compared to the")
fmt.Println("// WebSafe, the idea is to reduce the color resolution by dicing the")
fmt.Println("// color cube into fewer cells, and to use the extra space to increase the")
fmt.Println("// intensity resolution. This results in 16 gray shades (4 gray subcubes with")
fmt.Println("// 4 samples in each), 13 shades of each primary and secondary color (3")
fmt.Println("// subcubes with 4 samples plus black) and a reasonable selection of colors")
fmt.Println("// covering the rest of the color cube. The advantage is better representation")
fmt.Println("// of continuous tones.")
fmt.Println("//")
fmt.Println("// This palette was used in the Plan 9 Operating System, described at")
fmt.Println("// http://plan9.bell-labs.com/magic/man2html/6/color")
fmt.Println("var Plan9 = []color.Color{")
for _, line := range lines {
fmt.Println(line)
}
fmt.Println("}")
fmt.Println()
}
func printWebSafe() {
lines := [6 * 6 * 6]string{}
for r := 0; r < 6; r++ {
for g := 0; g < 6; g++ {
for b := 0; b < 6; b++ {
lines[36*r+6*g+b] =
fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", 0x33*r, 0x33*g, 0x33*b)
}
}
}
fmt.Println("// WebSafe is a 216-color palette that was popularized by early versions")
fmt.Println("// of Netscape Navigator. It is also known as the Netscape Color Cube.")
fmt.Println("//")
fmt.Println("// See http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors for details.")
fmt.Println("var WebSafe = []color.Color{")
for _, line := range lines {
fmt.Println(line)
}
fmt.Println("}")
fmt.Println()
}