// 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()
}
