├── .gitignore ├── .travis.yml ├── LICENSE ├── README.markdown ├── examples ├── build_example │ ├── .gitignore │ └── build_example.go ├── example │ ├── .gitignore │ └── example.go ├── heatweb │ ├── .gitignore │ └── heatweb.go ├── kml_example │ ├── .gitignore │ └── kml_example.go ├── kmz_example │ ├── .gitignore │ └── kmz_example.go └── wikipedia │ └── wikipedia.go ├── heatmap.go ├── heatmap_test.go ├── kml.go ├── kml_test.go ├── schemecompiler └── main.go └── schemes ├── alphafire.go ├── alphafire.png ├── classic.go ├── classic.png ├── fire.go ├── fire.png ├── omg.go ├── omg.png ├── pbj.go ├── pbj.png ├── pgaitch.go ├── pgaitch.png ├── scheme_test.go └── schemes.go /.gitignore: -------------------------------------------------------------------------------- 1 | #* 2 | *.db 3 | *~ 4 | .#* 5 | /examples/wikipedia/wikipedia 6 | /schemecompiler/schemecompiler 7 | _* 8 | c.out 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: go 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2015 Dustin Sallings 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | 21 | 22 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # Heatmaps 2 | 3 | This is a toolkit for creating [heatmaps][heatmap]. Heatmaps are 4 | awesome. I use them for a few things, and now you can, too. 5 | 6 | There are quite a few things you can do here and they don't all have 7 | the high level documentation they deserve currently. You can start by 8 | looking at the [example][example] to get a feel for what you can do. 9 | Basically, feed in a bunch of `x,y` type data and get back a heatmap. 10 | Awesome. 11 | 12 | Here's an example from a real-live report: 13 | 14 | ![Northeast US](https://raw.github.com/wiki/dustin/go-heatmap/ne-us.jpg) 15 | 16 | ## Colors 17 | 18 | Colors are always the hardest part, so I attempted to make it easy by 19 | providing three things: 20 | 21 | ### Predefined Color Schemes 22 | 23 | [gheat][gheat] has a set of colors that are available by default under 24 | the `schemes` subpackage. You can preview them in 25 | [their documentation][ghschemes] and use them directly. 26 | 27 | ### Drawing Color Schemes 28 | 29 | The `schemes` subpackage also has a tool for generating a color scheme 30 | from an image. Given an image that looks like this: 31 | 32 | ![Alpha Fire Scheme](https://raw.github.com/dustin/go-heatmap/master/schemes/alphafire.png) 33 | 34 | You can use `schemes.FromImage("/path/to/file")` to load it and use it 35 | directly. Colors near the bottom are for sparsely populated areas and 36 | colors near the top are for areas that are densely populated. 37 | 38 | ### Computing Color Schemes 39 | 40 | You can also compute a color scheme from spec using `schemes.Build`. 41 | This lets you specify starting and ending colors across multiple 42 | segments. Fun away! 43 | 44 | [heatmap]: http://en.wikipedia.org/wiki/Heat_map 45 | [example]: examples/example/example.go 46 | [gheat]: http://www.zetadev.com/software/gheat/0.2/__/doc/html/configuration.html 47 | [ghschemes]: http://www.zetadev.com/software/gheat/0.2/__/doc/html/configuration.html#SECTION003200000000000000000 48 | -------------------------------------------------------------------------------- /examples/build_example/.gitignore: -------------------------------------------------------------------------------- 1 | build_example 2 | test.png 3 | -------------------------------------------------------------------------------- /examples/build_example/build_example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image/color" 5 | "image/png" 6 | "log" 7 | "os" 8 | 9 | "github.com/dustin/go-heatmap/schemes" 10 | ) 11 | 12 | func main() { 13 | // This is what generated the prototype image for AlphaFire. 14 | spec := schemes.SchemeSpec{ 15 | // From white to yellow 16 | schemes.SchemeRange{ 17 | From: color.White, 18 | To: color.NRGBA{255, 255, 0, 255}, 19 | Steps: 50, 20 | }, 21 | // Then from yellow to red 22 | schemes.SchemeRange{ 23 | From: color.NRGBA{255, 255, 0, 255}, 24 | To: color.NRGBA{255, 0, 0, 255}, 25 | Steps: 60, 26 | }, 27 | // Then go from red to a bit of grey. 28 | schemes.SchemeRange{ 29 | From: color.NRGBA{255, 0, 0, 255}, 30 | To: color.NRGBA{128, 128, 128, 220}, 31 | Steps: 100, 32 | }, 33 | // Then down to transparent 34 | schemes.SchemeRange{ 35 | From: color.NRGBA{128, 128, 128, 220}, 36 | To: color.Transparent, 37 | Steps: 46, 38 | }, 39 | } 40 | 41 | f, err := os.Create("test.png") 42 | if err != nil { 43 | log.Fatalf("Error making test.png: %v", err) 44 | } 45 | defer f.Close() 46 | png.Encode(f, spec) 47 | } 48 | -------------------------------------------------------------------------------- /examples/example/.gitignore: -------------------------------------------------------------------------------- 1 | example 2 | test.png 3 | -------------------------------------------------------------------------------- /examples/example/example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image" 5 | "image/png" 6 | "math/rand" 7 | "os" 8 | 9 | "github.com/dustin/go-heatmap" 10 | "github.com/dustin/go-heatmap/schemes" 11 | ) 12 | 13 | func main() { 14 | points := []heatmap.DataPoint{} 15 | for n := 0; n < 350; n++ { 16 | points = append(points, 17 | heatmap.P(rand.Float64(), rand.Float64())) 18 | } 19 | 20 | // scheme, _ := schemes.FromImage("../schemes/fire.png") 21 | scheme := schemes.AlphaFire 22 | 23 | img := heatmap.Heatmap(image.Rect(0, 0, 1024, 1024), 24 | points, 150, 128, scheme) 25 | png.Encode(os.Stdout, img) 26 | } 27 | -------------------------------------------------------------------------------- /examples/heatweb/.gitignore: -------------------------------------------------------------------------------- 1 | heatweb 2 | -------------------------------------------------------------------------------- /examples/heatweb/heatweb.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/csv" 5 | "flag" 6 | "fmt" 7 | "image" 8 | "io" 9 | "log" 10 | "net/http" 11 | "net/url" 12 | "strconv" 13 | 14 | "github.com/dustin/go-heatmap" 15 | "github.com/dustin/go-heatmap/schemes" 16 | ) 17 | 18 | const maxInputLength = 10000 19 | 20 | type csvpoint []string 21 | 22 | func (c csvpoint) X() float64 { 23 | x, _ := strconv.ParseFloat(c[0], 64) 24 | return x 25 | } 26 | 27 | func (c csvpoint) Y() float64 { 28 | x, _ := strconv.ParseFloat(c[1], 64) 29 | return x 30 | } 31 | 32 | func parseInt(vals url.Values, v string, def, min, max int) int { 33 | rv, err := strconv.ParseInt(vals.Get(v), 10, 32) 34 | if err != nil || int(rv) < min || int(rv) > max { 35 | return def 36 | } 37 | return int(rv) 38 | } 39 | 40 | func rootHandler(w http.ResponseWriter, req *http.Request) { 41 | 42 | vals := req.URL.Query() 43 | 44 | width := parseInt(vals, "w", 1024, 100, 4096) 45 | height := parseInt(vals, "h", 768, 100, 4096) 46 | dotsize := parseInt(vals, "d", 200, 1, 256) 47 | opacity := uint8(parseInt(vals, "o", 128, 1, 255)) 48 | 49 | defer req.Body.Close() 50 | lr := io.LimitReader(req.Body, maxInputLength) 51 | cr := csv.NewReader(lr) 52 | 53 | data := []heatmap.DataPoint{} 54 | reading := true 55 | for reading { 56 | rec, err := cr.Read() 57 | switch err { 58 | case io.EOF: 59 | reading = false 60 | case nil: 61 | data = append(data, csvpoint(rec)) 62 | default: 63 | log.Printf("Other error: %#v", err) 64 | w.WriteHeader(400) 65 | fmt.Fprintf(w, "Error reading data: %v", err) 66 | return 67 | } 68 | } 69 | 70 | w.Header().Set("Content-type", "application/vnd.google-earth.kmz") 71 | w.WriteHeader(200) 72 | heatmap.KMZ(image.Rect(0, 0, width, height), 73 | data, dotsize, opacity, schemes.AlphaFire, w) 74 | } 75 | 76 | func main() { 77 | flag.Parse() 78 | 79 | http.HandleFunc("/", rootHandler) 80 | log.Fatal(http.ListenAndServe(":1756", nil)) 81 | } 82 | -------------------------------------------------------------------------------- /examples/kml_example/.gitignore: -------------------------------------------------------------------------------- 1 | kml_example 2 | test.kml 3 | test.png 4 | -------------------------------------------------------------------------------- /examples/kml_example/kml_example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image" 5 | "image/png" 6 | "log" 7 | "math/rand" 8 | "os" 9 | 10 | "github.com/dustin/go-heatmap" 11 | "github.com/dustin/go-heatmap/schemes" 12 | ) 13 | 14 | func main() { 15 | // Cluster a few points randomly around Lawrence station. 16 | lawrence := heatmap.P(-121.996158, 37.370713) 17 | 18 | points := []heatmap.DataPoint{lawrence} 19 | for n := 0; n < 35; n++ { 20 | points = append(points, 21 | heatmap.P(lawrence.X()+(rand.Float64()/100.0)-0.005, 22 | lawrence.Y()+(rand.Float64()/100.0)-0.005)) 23 | } 24 | 25 | kmlout, err := os.Create("test.kml") 26 | if err != nil { 27 | log.Fatalf("Error creating kml file: %v", err) 28 | } 29 | defer kmlout.Close() 30 | 31 | imgout, err := os.Create("test.png") 32 | if err != nil { 33 | log.Fatalf("Error creating image file: %v", err) 34 | } 35 | defer imgout.Close() 36 | 37 | img, err := heatmap.KML(image.Rect(0, 0, 1024, 1024), 38 | points, 200, 128, schemes.AlphaFire, "test.png", kmlout) 39 | png.Encode(imgout, img) 40 | } 41 | -------------------------------------------------------------------------------- /examples/kmz_example/.gitignore: -------------------------------------------------------------------------------- 1 | kmz_example 2 | test.kmz 3 | -------------------------------------------------------------------------------- /examples/kmz_example/kmz_example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image" 5 | "log" 6 | "math/rand" 7 | "os" 8 | 9 | "github.com/dustin/go-heatmap" 10 | "github.com/dustin/go-heatmap/schemes" 11 | ) 12 | 13 | func main() { 14 | // Cluster a few points randomly around Lawrence station. 15 | lawrence := heatmap.P(-121.996158, 37.370713) 16 | 17 | points := []heatmap.DataPoint{lawrence} 18 | for n := 0; n < 35; n++ { 19 | points = append(points, 20 | heatmap.P(lawrence.X()+(rand.Float64()/100.0)-0.005, 21 | lawrence.Y()+(rand.Float64()/100.0)-0.005)) 22 | } 23 | 24 | kmzout, err := os.Create("test.kmz") 25 | if err != nil { 26 | log.Fatalf("Error creating kml file: %v", err) 27 | } 28 | defer kmzout.Close() 29 | err = heatmap.KMZ(image.Rect(0, 0, 1024, 1024), 30 | points, 200, 128, schemes.AlphaFire, kmzout) 31 | if err != nil { 32 | log.Fatalf("Error creating heatmap: %v", err) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /examples/wikipedia/wikipedia.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "encoding/json" 6 | "image" 7 | "log" 8 | "net/http" 9 | "os" 10 | "time" 11 | 12 | "github.com/dustin/go-heatmap" 13 | "github.com/dustin/go-heatmap/schemes" 14 | "github.com/dustin/go-humanize" 15 | ) 16 | 17 | const url = "http://single.couchbase.net/wikipedia2012/_design/places/_spatial/points?bbox=-180,-90,180,90" 18 | 19 | type row struct { 20 | ID string `json:"id"` 21 | Value int `json:"value"` 22 | Geometry struct { 23 | Coordinates []float64 `json:"coordinates"` 24 | } `json:"geometry"` 25 | } 26 | 27 | func main() { 28 | start := time.Now() 29 | res, err := http.Get(url) 30 | if err != nil { 31 | log.Fatalf("Error opening strem from %q: %v", url, err) 32 | } 33 | defer res.Body.Close() 34 | 35 | r := bufio.NewReader(res.Body) 36 | _, _, err = r.ReadLine() 37 | if err != nil { 38 | log.Fatalf("Error reading first line: %v", err) 39 | } 40 | 41 | locations := make([]heatmap.DataPoint, 0, 200000) 42 | 43 | for { 44 | bytes, isPrefix, err := r.ReadLine() 45 | if err != nil { 46 | log.Fatalf("Error reading line: %v", err) 47 | } 48 | if isPrefix { 49 | log.Fatalf("Crap, that was a prefix...") 50 | } 51 | if bytes[0] != '{' { 52 | break 53 | } 54 | r := row{} 55 | if bytes[len(bytes)-1] == ',' { 56 | bytes = bytes[:len(bytes)-1] 57 | } 58 | err = json.Unmarshal(bytes, &r) 59 | if err != nil { 60 | log.Printf("Couldn't parse %v: %v", string(bytes), err) 61 | break 62 | } 63 | 64 | locations = append(locations, heatmap.P(r.Geometry.Coordinates[0], 65 | r.Geometry.Coordinates[1])) 66 | } 67 | end := time.Now() 68 | 69 | log.Printf("Parsed %s items in %s", 70 | humanize.Comma(int64(len(locations))), end.Sub(start)) 71 | 72 | out, err := os.Create("wikipedia.kmz") 73 | if err != nil { 74 | log.Fatalf("Error making output file: %v", err) 75 | } 76 | defer out.Close() 77 | 78 | err = heatmap.KMZ(image.Rect(0, 0, 8192, 4096), locations, 50, 96, 79 | schemes.AlphaFire, out) 80 | if err != nil { 81 | log.Fatalf("Error generating thingy: %v", err) 82 | } 83 | 84 | log.Printf("Completed heatmap generation in %s", time.Now().Sub(end)) 85 | } 86 | -------------------------------------------------------------------------------- /heatmap.go: -------------------------------------------------------------------------------- 1 | // Package heatmap generates heatmaps for map overlays. 2 | package heatmap 3 | 4 | import ( 5 | "image" 6 | "image/color" 7 | "image/draw" 8 | "math" 9 | "sync" 10 | ) 11 | 12 | // A DataPoint to be plotted. 13 | // These are all normalized to use the maximum amount of 14 | // space available in the output image. 15 | type DataPoint interface { 16 | X() float64 17 | Y() float64 18 | } 19 | 20 | type apoint struct { 21 | x float64 22 | y float64 23 | } 24 | 25 | func (a apoint) X() float64 { 26 | return a.x 27 | } 28 | 29 | func (a apoint) Y() float64 { 30 | return a.y 31 | } 32 | 33 | // P is a shorthand simple datapoint constructor. 34 | func P(x, y float64) DataPoint { 35 | return apoint{x, y} 36 | } 37 | 38 | type limits struct { 39 | Min DataPoint 40 | Max DataPoint 41 | } 42 | 43 | func (l limits) inRange(lx, hx, ly, hy float64) bool { 44 | return l.Min.X() >= lx && 45 | l.Max.X() <= hx && 46 | l.Min.Y() >= ly && 47 | l.Max.Y() <= hy 48 | } 49 | 50 | func (l limits) Dx() float64 { 51 | return l.Max.X() - l.Min.X() 52 | } 53 | 54 | func (l limits) Dy() float64 { 55 | return l.Max.Y() - l.Min.Y() 56 | } 57 | 58 | // Heatmap draws a heatmap. 59 | // 60 | // size is the size of the image to crate 61 | // dotSize is the impact size of each point on the output 62 | // opacity is the alpha value (0-255) of the impact of the image overlay 63 | // scheme is the color palette to choose from the overlay 64 | func Heatmap(size image.Rectangle, points []DataPoint, dotSize int, opacity uint8, 65 | scheme []color.Color) image.Image { 66 | 67 | dot := mkDot(float64(dotSize)) 68 | 69 | limits := findLimits(points) 70 | 71 | // Draw black/alpha into the image 72 | bw := image.NewRGBA(size) 73 | placePoints(size, limits, bw, points, dot) 74 | 75 | rv := image.NewRGBA(size) 76 | 77 | // Then we transplant the pixels one at a time pulling from our color map 78 | warm(rv, bw, opacity, scheme) 79 | return rv 80 | } 81 | 82 | func placePoints(size image.Rectangle, limits limits, 83 | bw *image.RGBA, points []DataPoint, dot draw.Image) { 84 | for _, p := range points { 85 | limits.placePoint(p, bw, dot) 86 | } 87 | } 88 | 89 | func warm(out, in draw.Image, opacity uint8, colors []color.Color) { 90 | draw.Draw(out, out.Bounds(), image.Transparent, image.ZP, draw.Src) 91 | bounds := in.Bounds() 92 | collen := float64(len(colors)) 93 | wg := &sync.WaitGroup{} 94 | for x := bounds.Min.X; x < bounds.Max.X; x++ { 95 | wg.Add(1) 96 | go func(x int) { 97 | defer wg.Done() 98 | for y := bounds.Min.Y; y < bounds.Max.Y; y++ { 99 | col := in.At(x, y) 100 | _, _, _, alpha := col.RGBA() 101 | if alpha > 0 { 102 | percent := float64(alpha) / float64(0xffff) 103 | template := colors[int((collen-1)*(1.0-percent))] 104 | tr, tg, tb, ta := template.RGBA() 105 | ta /= 256 106 | outalpha := uint8(float64(ta) * 107 | (float64(opacity) / 256.0)) 108 | outcol := color.NRGBA{ 109 | uint8(tr / 256), 110 | uint8(tg / 256), 111 | uint8(tb / 256), 112 | uint8(outalpha)} 113 | out.Set(x, y, outcol) 114 | } 115 | } 116 | }(x) 117 | } 118 | wg.Wait() 119 | } 120 | 121 | func findLimits(points []DataPoint) limits { 122 | minx, miny := points[0].X(), points[0].Y() 123 | maxx, maxy := minx, miny 124 | 125 | for _, p := range points { 126 | minx = math.Min(p.X(), minx) 127 | miny = math.Min(p.Y(), miny) 128 | maxx = math.Max(p.X(), maxx) 129 | maxy = math.Max(p.Y(), maxy) 130 | } 131 | 132 | return limits{apoint{minx, miny}, apoint{maxx, maxy}} 133 | } 134 | 135 | func mkDot(size float64) draw.Image { 136 | i := image.NewRGBA(image.Rect(0, 0, int(size), int(size))) 137 | 138 | md := 0.5 * math.Sqrt(math.Pow(float64(size)/2.0, 2)+math.Pow((float64(size)/2.0), 2)) 139 | for x := float64(0); x < size; x++ { 140 | for y := float64(0); y < size; y++ { 141 | d := math.Sqrt(math.Pow(x-size/2.0, 2) + math.Pow(y-size/2.0, 2)) 142 | if d < md { 143 | rgbVal := uint8(200.0*d/md + 50.0) 144 | rgba := color.NRGBA{0, 0, 0, 255 - rgbVal} 145 | i.Set(int(x), int(y), rgba) 146 | } 147 | } 148 | } 149 | 150 | return i 151 | } 152 | 153 | func (l limits) translate(p DataPoint, i draw.Image, dotsize int) (rv image.Point) { 154 | // Normalize to 0-1 155 | x := float64(p.X()-l.Min.X()) / float64(l.Dx()) 156 | y := float64(p.Y()-l.Min.Y()) / float64(l.Dy()) 157 | 158 | // And remap to the image 159 | rv.X = int(x * float64((i.Bounds().Max.X - dotsize))) 160 | rv.Y = int((1.0 - y) * float64((i.Bounds().Max.Y - dotsize))) 161 | 162 | return 163 | } 164 | 165 | func (l limits) placePoint(p DataPoint, i, dot draw.Image) { 166 | pos := l.translate(p, i, dot.Bounds().Max.X) 167 | dotw, doth := dot.Bounds().Max.X, dot.Bounds().Max.Y 168 | draw.Draw(i, image.Rect(pos.X, pos.Y, pos.X+dotw, pos.Y+doth), dot, 169 | image.ZP, draw.Over) 170 | } 171 | -------------------------------------------------------------------------------- /heatmap_test.go: -------------------------------------------------------------------------------- 1 | package heatmap 2 | 3 | import ( 4 | "image" 5 | "io" 6 | "math" 7 | "math/rand" 8 | "testing" 9 | 10 | "github.com/dustin/go-heatmap/schemes" 11 | 12 | "github.com/jteeuwen/imghash" 13 | ) 14 | 15 | var testPoints = []DataPoint{} 16 | 17 | func init() { 18 | rand.Seed(4828458249) 19 | for n := 0; n < 350; n++ { 20 | testPoints = append(testPoints, 21 | P(rand.Float64(), rand.Float64())) 22 | } 23 | } 24 | 25 | func assertEpsilon(t *testing.T, field string, expected, got float64) { 26 | if math.Abs(got-expected) > 0.00001 { 27 | t.Fatalf("Expected %v for %v, got %v", 28 | expected, field, got) 29 | } 30 | } 31 | func TestFindLimits(t *testing.T) { 32 | l := findLimits(testPoints) 33 | 34 | assertEpsilon(t, "minx", 0.005923822722460793, l.Min.X()) 35 | assertEpsilon(t, "miny", 0.0038807964380815894, l.Min.Y()) 36 | assertEpsilon(t, "maxx", 0.984841695550329, l.Max.X()) 37 | assertEpsilon(t, "maxy", 0.9990553050102642, l.Max.Y()) 38 | 39 | assertEpsilon(t, "dx", 0.9789178728278681, l.Dx()) 40 | assertEpsilon(t, "dy", 0.9951745085721826, l.Dy()) 41 | } 42 | 43 | func TestHeatmapKMLLimits(t *testing.T) { 44 | tests := []DataPoint{ 45 | P(-200, 0), 46 | P(200, 0), 47 | P(0, 100), 48 | P(0, -100), 49 | } 50 | 51 | for _, test := range tests { 52 | lim := findLimits([]DataPoint{test}) 53 | if lim.inRange(-180, 180, -90, 90) { 54 | t.Errorf("Expected out of range on %v", test) 55 | } 56 | } 57 | } 58 | 59 | const expHash = uint64(62624876249118208) 60 | 61 | func TestMkImage(t *testing.T) { 62 | got := imghash.Average(Heatmap(image.Rect(0, 0, 1024, 1024), 63 | testPoints, 150, 128, schemes.AlphaFire)) 64 | if got != expHash { 65 | t.Errorf("Expected hash = %v, got %v", expHash, got) 66 | } 67 | } 68 | 69 | func TestMust(t *testing.T) { 70 | must(nil) // no panic 71 | panicked := false 72 | func() { 73 | defer func() { panicked = recover() != nil }() 74 | must(io.EOF) 75 | }() 76 | if !panicked { 77 | t.Fatalf("Expected a panic, but didn't get one") 78 | } 79 | } 80 | 81 | func BenchmarkPlacement(b *testing.B) { 82 | b.StopTimer() 83 | l := findLimits(testPoints) 84 | size := image.Rect(0, 0, 4096, 4096) 85 | dot := mkDot(float64(100)) 86 | b.StartTimer() 87 | 88 | for i := 0; i < b.N; i++ { 89 | b.StopTimer() 90 | bw := image.NewRGBA(size) 91 | b.StartTimer() 92 | 93 | placePoints(size, l, bw, testPoints, dot) 94 | } 95 | } 96 | 97 | func BenchmarkWarming(b *testing.B) { 98 | b.StopTimer() 99 | 100 | l := findLimits(testPoints) 101 | size := image.Rect(0, 0, 4096, 4096) 102 | dot := mkDot(float64(100)) 103 | colors := schemes.AlphaFire 104 | 105 | b.StartTimer() 106 | 107 | for i := 0; i < b.N; i++ { 108 | b.StopTimer() 109 | bw := image.NewRGBA(size) 110 | placePoints(size, l, bw, testPoints, dot) 111 | out := image.NewRGBA(size) 112 | b.StartTimer() 113 | 114 | warm(out, bw, 64, colors) 115 | } 116 | } 117 | 118 | func BenchmarkWarmingParallel(b *testing.B) { 119 | l := findLimits(testPoints) 120 | size := image.Rect(0, 0, 4096, 4096) 121 | dot := mkDot(float64(100)) 122 | colors := schemes.AlphaFire 123 | 124 | b.ResetTimer() 125 | 126 | b.RunParallel(func(pb *testing.PB) { 127 | bw := image.NewRGBA(size) 128 | placePoints(size, l, bw, testPoints, dot) 129 | out := image.NewRGBA(size) 130 | 131 | for pb.Next() { 132 | warm(out, bw, 64, colors) 133 | } 134 | }) 135 | } 136 | -------------------------------------------------------------------------------- /kml.go: -------------------------------------------------------------------------------- 1 | package heatmap 2 | 3 | import ( 4 | "archive/zip" 5 | "errors" 6 | "fmt" 7 | "image" 8 | "image/color" 9 | "image/png" 10 | "io" 11 | ) 12 | 13 | const kmlStart = ` 14 | 15 | ` 16 | const kmlOverlay = ` 17 | 18 | 19 | %s 20 | 21 | 22 | %2.16f 23 | %2.16f 24 | %2.16f 25 | %2.16f 26 | 0 27 | 28 | ` 29 | const kmlEnd = `` 30 | 31 | const kml = kmlStart + kmlOverlay + kmlEnd 32 | 33 | // KML generates a heatmap for geographical data and the kml required to render it. 34 | func KML(size image.Rectangle, points []DataPoint, dotSize int, opacity uint8, 35 | scheme []color.Color, imgurl string, out io.Writer) (image.Image, error) { 36 | 37 | limits := findLimits(points) 38 | if !limits.inRange(-180, 180, -90, 90) { 39 | return nil, errors.New("limits out of range") 40 | } 41 | 42 | mapimg := Heatmap(size, points, dotSize, opacity, scheme) 43 | 44 | adjustedLimits := adjustLimits(limits, size, dotSize) 45 | 46 | _, err := fmt.Fprintf(out, kml, imgurl, 47 | adjustedLimits.Max.Y(), 48 | adjustedLimits.Min.Y(), 49 | adjustedLimits.Max.X(), 50 | adjustedLimits.Min.X()) 51 | 52 | return mapimg, err 53 | } 54 | 55 | func must(err error) { 56 | if err != nil { 57 | panic(err) 58 | } 59 | } 60 | 61 | // KMZ generates a heatmap for geographical data as a kmz. 62 | func KMZ(size image.Rectangle, points []DataPoint, dotSize int, opacity uint8, 63 | scheme []color.Color, out io.Writer) error { 64 | 65 | z := zip.NewWriter(out) 66 | defer z.Close() 67 | dockml, err := z.Create("doc.kml") 68 | must(err) // no known condition can cause failure here 69 | 70 | img, err := KML(size, points, dotSize, opacity, scheme, 71 | "heatmap.png", dockml) 72 | if err != nil { 73 | return err 74 | } 75 | 76 | imgf, err := z.Create("heatmap.png") 77 | must(err) // Can't induce failure here, either 78 | 79 | return png.Encode(imgf, img) 80 | } 81 | 82 | func adjustLimits(limits limits, size image.Rectangle, dotSize int) (rv limits) { 83 | halfdot := float64(dotSize) / 2.0 84 | offx := (halfdot / float64(size.Dx()-dotSize)) * float64(limits.Dx()) 85 | offy := (halfdot / float64(size.Dy()-dotSize)) * float64(limits.Dy()) 86 | 87 | rv.Min = P(limits.Min.X()-offx, limits.Min.Y()-offy) 88 | rv.Max = P(limits.Max.X()+offx, limits.Max.Y()+offy) 89 | return 90 | } 91 | -------------------------------------------------------------------------------- /kml_test.go: -------------------------------------------------------------------------------- 1 | package heatmap 2 | 3 | import ( 4 | "archive/zip" 5 | "bytes" 6 | "image" 7 | "io" 8 | "io/ioutil" 9 | "strings" 10 | "testing" 11 | 12 | "github.com/dustin/go-heatmap/schemes" 13 | "github.com/jteeuwen/imghash" 14 | ) 15 | 16 | const testKmlImgURL = "http://www.example.com/thing.png" 17 | 18 | const expKml = ` 19 | 20 | 21 | 22 | 23 | http://www.example.com/thing.png 24 | 25 | 26 | 1.0844535751966644 27 | -0.0815174737483185 28 | 1.0688449455069537 29 | -0.0780794272341640 30 | 0 31 | 32 | ` 33 | 34 | const expKmz = ` 35 | 36 | 37 | 38 | 39 | heatmap.png 40 | 41 | 42 | 1.0844535751966644 43 | -0.0815174737483185 44 | 1.0688449455069537 45 | -0.0780794272341640 46 | 0 47 | 48 | ` 49 | 50 | func xsimilar(a, b string) bool { 51 | return strings.Join(strings.Fields(a), " ") == 52 | strings.Join(strings.Fields(b), " ") 53 | } 54 | 55 | func TestKML(t *testing.T) { 56 | kmlBuf := &bytes.Buffer{} 57 | 58 | img, err := KML(image.Rect(0, 0, 1024, 1024), 59 | testPoints, 150, 128, schemes.AlphaFire, 60 | testKmlImgURL, kmlBuf) 61 | if err != nil { 62 | t.Fatalf("Error generating kml: %v", err) 63 | } 64 | got := imghash.Average(img) 65 | if got != expHash { 66 | t.Errorf("Expected image hash %v, got %v", expHash, got) 67 | } 68 | gotK := kmlBuf.String() 69 | if !xsimilar(gotK, expKml) { 70 | t.Errorf("Expected kml=%v, got %v", expKml, gotK) 71 | } 72 | } 73 | 74 | func TestKMLOutOfRange(t *testing.T) { 75 | kmlBuf := &bytes.Buffer{} 76 | 77 | _, err := KML(image.Rect(0, 0, 1024, 1024), 78 | append(testPoints, P(-200, 0)), 150, 128, schemes.AlphaFire, 79 | testKmlImgURL, kmlBuf) 80 | if err == nil { 81 | t.Fatalf("Expected error with bad input") 82 | } 83 | } 84 | 85 | func TestKMZBadInput(t *testing.T) { 86 | err := KMZ(image.Rect(0, 0, 1024, 1024), 87 | append(testPoints, P(-200, 0)), 150, 128, schemes.AlphaFire, 88 | ioutil.Discard) 89 | if err == nil { 90 | t.Fatalf("Expected error with bad input") 91 | } 92 | } 93 | 94 | type writeFailer struct { 95 | n int 96 | } 97 | 98 | func (w *writeFailer) Write(p []byte) (int, error) { 99 | towrite := len(p) 100 | var err error 101 | if towrite > w.n { 102 | towrite = w.n 103 | err = io.EOF 104 | } 105 | w.n -= towrite 106 | return towrite, err 107 | } 108 | 109 | func TestKMZBadWriter(t *testing.T) { 110 | err := KMZ(image.Rect(0, 0, 1024, 1024), 111 | testPoints, 150, 128, schemes.AlphaFire, 112 | &writeFailer{514}) 113 | if err == nil { 114 | t.Fatalf("Expected error with bad input") 115 | } 116 | } 117 | 118 | func rzd(t *testing.T, zf *zip.File) []byte { 119 | r, err := zf.Open() 120 | if err != nil { 121 | t.Fatalf("Error opening %v: %v", zf.Name, err) 122 | } 123 | defer r.Close() 124 | data, err := ioutil.ReadAll(r) 125 | if err != nil { 126 | t.Fatalf("Error reading %v: %v", zf.Name, err) 127 | } 128 | return data 129 | } 130 | 131 | func TestKMZ(t *testing.T) { 132 | buf := &bytes.Buffer{} 133 | err := KMZ(image.Rect(0, 0, 1024, 1024), 134 | testPoints, 150, 128, schemes.AlphaFire, 135 | buf) 136 | if err != nil { 137 | t.Fatalf("Failed to build kmz: %v", err) 138 | } 139 | zr, err := zip.NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len())) 140 | if err != nil { 141 | t.Fatalf("Error reading kmz: %v", err) 142 | } 143 | 144 | for _, zf := range zr.File { 145 | switch zf.Name { 146 | case "doc.kml": 147 | gotK := rzd(t, zf) 148 | if !xsimilar(string(gotK), expKmz) { 149 | t.Errorf("Expected kml=%v, got %s", expKmz, gotK) 150 | } 151 | case "heatmap.png": 152 | img, _, err := image.Decode(bytes.NewReader(rzd(t, zf))) 153 | if err != nil { 154 | t.Errorf("Error decoding image: %v", err) 155 | } 156 | got := imghash.Average(img) 157 | if got != expHash { 158 | t.Errorf("Expected image hash %v, got %v", expHash, got) 159 | } 160 | default: 161 | t.Fatalf("Unexpected zipfile name: %v", err) 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /schemecompiler/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "log" 7 | "os" 8 | 9 | "github.com/dustin/go-heatmap/schemes" 10 | ) 11 | 12 | func init() { 13 | flag.Usage = func() { 14 | fmt.Fprintf(os.Stderr, "Usage: schemecompiler [-flags] infile.png\n") 15 | flag.PrintDefaults() 16 | } 17 | } 18 | 19 | func main() { 20 | 21 | var pkg = flag.String("package", "example", "scheme's package") 22 | var name = flag.String("name", "MyAwesomeScheme", "scheme's name") 23 | 24 | flag.Parse() 25 | log.SetFlags(0) 26 | if flag.NArg() < 1 { 27 | flag.Usage() 28 | os.Exit(1) 29 | } 30 | 31 | scheme, err := schemes.FromImage(flag.Arg(0)) 32 | if err != nil { 33 | log.Fatalf("Error initializing scheme: %v", err) 34 | } 35 | 36 | fmt.Printf("package %s\n\n", *pkg) 37 | fmt.Printf("import \"image/color\"\n\n") 38 | fmt.Printf("var %s []color.Color\n\n", *name) 39 | 40 | fmt.Printf("func init() {\n") 41 | fmt.Printf("\t%s = []color.Color{\n", *name) 42 | for _, c := range scheme { 43 | fmt.Printf("\t\t%#v,\n", c) 44 | } 45 | fmt.Printf("\t}\n}\n") 46 | } 47 | -------------------------------------------------------------------------------- /schemes/alphafire.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // AlphaFire is a gradient color scheme from transparent through red 6 | // to yellow then white. 7 | var AlphaFire []color.Color 8 | 9 | func init() { 10 | AlphaFire = []color.Color{ 11 | color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}, 12 | color.NRGBA{R: 0xff, G: 0xff, B: 0xfa, A: 0xff}, 13 | color.NRGBA{R: 0xff, G: 0xff, B: 0xf5, A: 0xff}, 14 | color.NRGBA{R: 0xff, G: 0xff, B: 0xf0, A: 0xff}, 15 | color.NRGBA{R: 0xff, G: 0xff, B: 0xeb, A: 0xff}, 16 | color.NRGBA{R: 0xff, G: 0xff, B: 0xe6, A: 0xff}, 17 | color.NRGBA{R: 0xff, G: 0xff, B: 0xe1, A: 0xff}, 18 | color.NRGBA{R: 0xff, G: 0xff, B: 0xdc, A: 0xff}, 19 | color.NRGBA{R: 0xff, G: 0xff, B: 0xd7, A: 0xff}, 20 | color.NRGBA{R: 0xff, G: 0xff, B: 0xd1, A: 0xff}, 21 | color.NRGBA{R: 0xff, G: 0xff, B: 0xcc, A: 0xff}, 22 | color.NRGBA{R: 0xff, G: 0xff, B: 0xc7, A: 0xff}, 23 | color.NRGBA{R: 0xff, G: 0xff, B: 0xc2, A: 0xff}, 24 | color.NRGBA{R: 0xff, G: 0xff, B: 0xbd, A: 0xff}, 25 | color.NRGBA{R: 0xff, G: 0xff, B: 0xb8, A: 0xff}, 26 | color.NRGBA{R: 0xff, G: 0xff, B: 0xb3, A: 0xff}, 27 | color.NRGBA{R: 0xff, G: 0xff, B: 0xae, A: 0xff}, 28 | color.NRGBA{R: 0xff, G: 0xff, B: 0xa8, A: 0xff}, 29 | color.NRGBA{R: 0xff, G: 0xff, B: 0xa3, A: 0xff}, 30 | color.NRGBA{R: 0xff, G: 0xff, B: 0x9e, A: 0xff}, 31 | color.NRGBA{R: 0xff, G: 0xff, B: 0x99, A: 0xff}, 32 | color.NRGBA{R: 0xff, G: 0xff, B: 0x94, A: 0xff}, 33 | color.NRGBA{R: 0xff, G: 0xff, B: 0x8f, A: 0xff}, 34 | color.NRGBA{R: 0xff, G: 0xff, B: 0x8a, A: 0xff}, 35 | color.NRGBA{R: 0xff, G: 0xff, B: 0x85, A: 0xff}, 36 | color.NRGBA{R: 0xff, G: 0xff, B: 0x7f, A: 0xff}, 37 | color.NRGBA{R: 0xff, G: 0xff, B: 0x7a, A: 0xff}, 38 | color.NRGBA{R: 0xff, G: 0xff, B: 0x75, A: 0xff}, 39 | color.NRGBA{R: 0xff, G: 0xff, B: 0x70, A: 0xff}, 40 | color.NRGBA{R: 0xff, G: 0xff, B: 0x6b, A: 0xff}, 41 | color.NRGBA{R: 0xff, G: 0xff, B: 0x66, A: 0xff}, 42 | color.NRGBA{R: 0xff, G: 0xff, B: 0x61, A: 0xff}, 43 | color.NRGBA{R: 0xff, G: 0xff, B: 0x5c, A: 0xff}, 44 | color.NRGBA{R: 0xff, G: 0xff, B: 0x57, A: 0xff}, 45 | color.NRGBA{R: 0xff, G: 0xff, B: 0x51, A: 0xff}, 46 | color.NRGBA{R: 0xff, G: 0xff, B: 0x4c, A: 0xff}, 47 | color.NRGBA{R: 0xff, G: 0xff, B: 0x47, A: 0xff}, 48 | color.NRGBA{R: 0xff, G: 0xff, B: 0x42, A: 0xff}, 49 | color.NRGBA{R: 0xff, G: 0xff, B: 0x3d, A: 0xff}, 50 | color.NRGBA{R: 0xff, G: 0xff, B: 0x38, A: 0xff}, 51 | color.NRGBA{R: 0xff, G: 0xff, B: 0x33, A: 0xff}, 52 | color.NRGBA{R: 0xff, G: 0xff, B: 0x2e, A: 0xff}, 53 | color.NRGBA{R: 0xff, G: 0xff, B: 0x28, A: 0xff}, 54 | color.NRGBA{R: 0xff, G: 0xff, B: 0x23, A: 0xff}, 55 | color.NRGBA{R: 0xff, G: 0xff, B: 0x1e, A: 0xff}, 56 | color.NRGBA{R: 0xff, G: 0xff, B: 0x19, A: 0xff}, 57 | color.NRGBA{R: 0xff, G: 0xff, B: 0x14, A: 0xff}, 58 | color.NRGBA{R: 0xff, G: 0xff, B: 0xf, A: 0xff}, 59 | color.NRGBA{R: 0xff, G: 0xff, B: 0xa, A: 0xff}, 60 | color.NRGBA{R: 0xff, G: 0xff, B: 0x5, A: 0xff}, 61 | color.NRGBA{R: 0xff, G: 0xff, B: 0x0, A: 0xff}, 62 | color.NRGBA{R: 0xff, G: 0xfb, B: 0x0, A: 0xff}, 63 | color.NRGBA{R: 0xff, G: 0xf7, B: 0x0, A: 0xff}, 64 | color.NRGBA{R: 0xff, G: 0xf3, B: 0x0, A: 0xff}, 65 | color.NRGBA{R: 0xff, G: 0xee, B: 0x0, A: 0xff}, 66 | color.NRGBA{R: 0xff, G: 0xea, B: 0x0, A: 0xff}, 67 | color.NRGBA{R: 0xff, G: 0xe6, B: 0x0, A: 0xff}, 68 | color.NRGBA{R: 0xff, G: 0xe2, B: 0x0, A: 0xff}, 69 | color.NRGBA{R: 0xff, G: 0xdd, B: 0x0, A: 0xff}, 70 | color.NRGBA{R: 0xff, G: 0xd9, B: 0x0, A: 0xff}, 71 | color.NRGBA{R: 0xff, G: 0xd5, B: 0x0, A: 0xff}, 72 | color.NRGBA{R: 0xff, G: 0xd1, B: 0x0, A: 0xff}, 73 | color.NRGBA{R: 0xff, G: 0xcc, B: 0x0, A: 0xff}, 74 | color.NRGBA{R: 0xff, G: 0xc8, B: 0x0, A: 0xff}, 75 | color.NRGBA{R: 0xff, G: 0xc4, B: 0x0, A: 0xff}, 76 | color.NRGBA{R: 0xff, G: 0xbf, B: 0x0, A: 0xff}, 77 | color.NRGBA{R: 0xff, G: 0xbb, B: 0x0, A: 0xff}, 78 | color.NRGBA{R: 0xff, G: 0xb7, B: 0x0, A: 0xff}, 79 | color.NRGBA{R: 0xff, G: 0xb3, B: 0x0, A: 0xff}, 80 | color.NRGBA{R: 0xff, G: 0xae, B: 0x0, A: 0xff}, 81 | color.NRGBA{R: 0xff, G: 0xaa, B: 0x0, A: 0xff}, 82 | color.NRGBA{R: 0xff, G: 0xa6, B: 0x0, A: 0xff}, 83 | color.NRGBA{R: 0xff, G: 0xa2, B: 0x0, A: 0xff}, 84 | color.NRGBA{R: 0xff, G: 0x9d, B: 0x0, A: 0xff}, 85 | color.NRGBA{R: 0xff, G: 0x99, B: 0x0, A: 0xff}, 86 | color.NRGBA{R: 0xff, G: 0x95, B: 0x0, A: 0xff}, 87 | color.NRGBA{R: 0xff, G: 0x91, B: 0x0, A: 0xff}, 88 | color.NRGBA{R: 0xff, G: 0x8c, B: 0x0, A: 0xff}, 89 | color.NRGBA{R: 0xff, G: 0x88, B: 0x0, A: 0xff}, 90 | color.NRGBA{R: 0xff, G: 0x84, B: 0x0, A: 0xff}, 91 | color.NRGBA{R: 0xff, G: 0x7f, B: 0x0, A: 0xff}, 92 | color.NRGBA{R: 0xff, G: 0x7b, B: 0x0, A: 0xff}, 93 | color.NRGBA{R: 0xff, G: 0x77, B: 0x0, A: 0xff}, 94 | color.NRGBA{R: 0xff, G: 0x73, B: 0x0, A: 0xff}, 95 | color.NRGBA{R: 0xff, G: 0x6e, B: 0x0, A: 0xff}, 96 | color.NRGBA{R: 0xff, G: 0x6a, B: 0x0, A: 0xff}, 97 | color.NRGBA{R: 0xff, G: 0x66, B: 0x0, A: 0xff}, 98 | color.NRGBA{R: 0xff, G: 0x62, B: 0x0, A: 0xff}, 99 | color.NRGBA{R: 0xff, G: 0x5d, B: 0x0, A: 0xff}, 100 | color.NRGBA{R: 0xff, G: 0x59, B: 0x0, A: 0xff}, 101 | color.NRGBA{R: 0xff, G: 0x55, B: 0x0, A: 0xff}, 102 | color.NRGBA{R: 0xff, G: 0x51, B: 0x0, A: 0xff}, 103 | color.NRGBA{R: 0xff, G: 0x4c, B: 0x0, A: 0xff}, 104 | color.NRGBA{R: 0xff, G: 0x48, B: 0x0, A: 0xff}, 105 | color.NRGBA{R: 0xff, G: 0x44, B: 0x0, A: 0xff}, 106 | color.NRGBA{R: 0xff, G: 0x3f, B: 0x0, A: 0xff}, 107 | color.NRGBA{R: 0xff, G: 0x3b, B: 0x0, A: 0xff}, 108 | color.NRGBA{R: 0xff, G: 0x37, B: 0x0, A: 0xff}, 109 | color.NRGBA{R: 0xff, G: 0x33, B: 0x0, A: 0xff}, 110 | color.NRGBA{R: 0xff, G: 0x2e, B: 0x0, A: 0xff}, 111 | color.NRGBA{R: 0xff, G: 0x2a, B: 0x0, A: 0xff}, 112 | color.NRGBA{R: 0xff, G: 0x26, B: 0x0, A: 0xff}, 113 | color.NRGBA{R: 0xff, G: 0x22, B: 0x0, A: 0xff}, 114 | color.NRGBA{R: 0xff, G: 0x1d, B: 0x0, A: 0xff}, 115 | color.NRGBA{R: 0xff, G: 0x19, B: 0x0, A: 0xff}, 116 | color.NRGBA{R: 0xff, G: 0x15, B: 0x0, A: 0xff}, 117 | color.NRGBA{R: 0xff, G: 0x11, B: 0x0, A: 0xff}, 118 | color.NRGBA{R: 0xff, G: 0xc, B: 0x0, A: 0xff}, 119 | color.NRGBA{R: 0xff, G: 0x8, B: 0x0, A: 0xff}, 120 | color.NRGBA{R: 0xff, G: 0x4, B: 0x0, A: 0xff}, 121 | color.NRGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 122 | color.NRGBA{R: 0xfe, G: 0x1, B: 0x1, A: 0xff}, 123 | color.NRGBA{R: 0xfd, G: 0x2, B: 0x2, A: 0xff}, 124 | color.NRGBA{R: 0xfc, G: 0x3, B: 0x3, A: 0xfe}, 125 | color.NRGBA{R: 0xfb, G: 0x4, B: 0x4, A: 0xfe}, 126 | color.NRGBA{R: 0xf9, G: 0x5, B: 0x5, A: 0xfe}, 127 | color.NRGBA{R: 0xf9, G: 0x6, B: 0x6, A: 0xfd}, 128 | color.NRGBA{R: 0xf7, G: 0x7, B: 0x7, A: 0xfd}, 129 | color.NRGBA{R: 0xf6, G: 0x8, B: 0x8, A: 0xfd}, 130 | color.NRGBA{R: 0xf5, G: 0x9, B: 0x9, A: 0xfc}, 131 | color.NRGBA{R: 0xf4, G: 0xb, B: 0xb, A: 0xfc}, 132 | color.NRGBA{R: 0xf3, G: 0xc, B: 0xc, A: 0xfc}, 133 | color.NRGBA{R: 0xf2, G: 0xd, B: 0xd, A: 0xfb}, 134 | color.NRGBA{R: 0xf1, G: 0xe, B: 0xe, A: 0xfb}, 135 | color.NRGBA{R: 0xef, G: 0xf, B: 0xf, A: 0xfb}, 136 | color.NRGBA{R: 0xef, G: 0x10, B: 0x10, A: 0xfa}, 137 | color.NRGBA{R: 0xed, G: 0x11, B: 0x11, A: 0xfa}, 138 | color.NRGBA{R: 0xec, G: 0x12, B: 0x12, A: 0xfa}, 139 | color.NRGBA{R: 0xeb, G: 0x13, B: 0x13, A: 0xf9}, 140 | color.NRGBA{R: 0xea, G: 0x15, B: 0x15, A: 0xf9}, 141 | color.NRGBA{R: 0xe9, G: 0x16, B: 0x16, A: 0xf8}, 142 | color.NRGBA{R: 0xe8, G: 0x17, B: 0x17, A: 0xf8}, 143 | color.NRGBA{R: 0xe7, G: 0x18, B: 0x18, A: 0xf8}, 144 | color.NRGBA{R: 0xe6, G: 0x19, B: 0x19, A: 0xf7}, 145 | color.NRGBA{R: 0xe5, G: 0x1a, B: 0x1a, A: 0xf7}, 146 | color.NRGBA{R: 0xe2, G: 0x1b, B: 0x1b, A: 0xf7}, 147 | color.NRGBA{R: 0xe2, G: 0x1d, B: 0x1d, A: 0xf6}, 148 | color.NRGBA{R: 0xe0, G: 0x1e, B: 0x1e, A: 0xf6}, 149 | color.NRGBA{R: 0xdf, G: 0x20, B: 0x20, A: 0xf6}, 150 | color.NRGBA{R: 0xde, G: 0x21, B: 0x21, A: 0xf5}, 151 | color.NRGBA{R: 0xdd, G: 0x22, B: 0x22, A: 0xf5}, 152 | color.NRGBA{R: 0xdc, G: 0x23, B: 0x23, A: 0xf5}, 153 | color.NRGBA{R: 0xdb, G: 0x24, B: 0x24, A: 0xf4}, 154 | color.NRGBA{R: 0xda, G: 0x25, B: 0x25, A: 0xf4}, 155 | color.NRGBA{R: 0xd8, G: 0x26, B: 0x26, A: 0xf4}, 156 | color.NRGBA{R: 0xd7, G: 0x28, B: 0x28, A: 0xf3}, 157 | color.NRGBA{R: 0xd5, G: 0x29, B: 0x29, A: 0xf3}, 158 | color.NRGBA{R: 0xd5, G: 0x2b, B: 0x2b, A: 0xf2}, 159 | color.NRGBA{R: 0xd3, G: 0x2c, B: 0x2c, A: 0xf2}, 160 | color.NRGBA{R: 0xd2, G: 0x2d, B: 0x2d, A: 0xf2}, 161 | color.NRGBA{R: 0xd1, G: 0x2e, B: 0x2e, A: 0xf1}, 162 | color.NRGBA{R: 0xd0, G: 0x2f, B: 0x2f, A: 0xf1}, 163 | color.NRGBA{R: 0xcf, G: 0x30, B: 0x30, A: 0xf1}, 164 | color.NRGBA{R: 0xcd, G: 0x32, B: 0x32, A: 0xf0}, 165 | color.NRGBA{R: 0xcc, G: 0x33, B: 0x33, A: 0xf0}, 166 | color.NRGBA{R: 0xca, G: 0x34, B: 0x34, A: 0xf0}, 167 | color.NRGBA{R: 0xca, G: 0x35, B: 0x35, A: 0xef}, 168 | color.NRGBA{R: 0xc8, G: 0x37, B: 0x37, A: 0xef}, 169 | color.NRGBA{R: 0xc7, G: 0x38, B: 0x38, A: 0xef}, 170 | color.NRGBA{R: 0xc5, G: 0x3a, B: 0x3a, A: 0xee}, 171 | color.NRGBA{R: 0xc4, G: 0x3b, B: 0x3b, A: 0xee}, 172 | color.NRGBA{R: 0xc2, G: 0x3c, B: 0x3c, A: 0xee}, 173 | color.NRGBA{R: 0xc2, G: 0x3d, B: 0x3d, A: 0xed}, 174 | color.NRGBA{R: 0xc1, G: 0x3e, B: 0x3e, A: 0xed}, 175 | color.NRGBA{R: 0xbf, G: 0x3f, B: 0x3f, A: 0xed}, 176 | color.NRGBA{R: 0xbe, G: 0x41, B: 0x41, A: 0xec}, 177 | color.NRGBA{R: 0xbc, G: 0x43, B: 0x43, A: 0xec}, 178 | color.NRGBA{R: 0xbc, G: 0x44, B: 0x44, A: 0xeb}, 179 | color.NRGBA{R: 0xba, G: 0x45, B: 0x45, A: 0xeb}, 180 | color.NRGBA{R: 0xb9, G: 0x46, B: 0x46, A: 0xeb}, 181 | color.NRGBA{R: 0xb7, G: 0x48, B: 0x48, A: 0xea}, 182 | color.NRGBA{R: 0xb6, G: 0x49, B: 0x49, A: 0xea}, 183 | color.NRGBA{R: 0xb5, G: 0x4a, B: 0x4a, A: 0xea}, 184 | color.NRGBA{R: 0xb4, G: 0x4b, B: 0x4b, A: 0xe9}, 185 | color.NRGBA{R: 0xb3, G: 0x4c, B: 0x4c, A: 0xe9}, 186 | color.NRGBA{R: 0xb0, G: 0x4f, B: 0x4f, A: 0xe9}, 187 | color.NRGBA{R: 0xb0, G: 0x50, B: 0x50, A: 0xe8}, 188 | color.NRGBA{R: 0xae, G: 0x51, B: 0x51, A: 0xe8}, 189 | color.NRGBA{R: 0xad, G: 0x52, B: 0x52, A: 0xe8}, 190 | color.NRGBA{R: 0xab, G: 0x54, B: 0x54, A: 0xe7}, 191 | color.NRGBA{R: 0xaa, G: 0x55, B: 0x55, A: 0xe7}, 192 | color.NRGBA{R: 0xa8, G: 0x56, B: 0x56, A: 0xe7}, 193 | color.NRGBA{R: 0xa8, G: 0x57, B: 0x57, A: 0xe6}, 194 | color.NRGBA{R: 0xa6, G: 0x59, B: 0x59, A: 0xe6}, 195 | color.NRGBA{R: 0xa5, G: 0x5b, B: 0x5b, A: 0xe5}, 196 | color.NRGBA{R: 0xa4, G: 0x5c, B: 0x5c, A: 0xe5}, 197 | color.NRGBA{R: 0xa2, G: 0x5d, B: 0x5d, A: 0xe5}, 198 | color.NRGBA{R: 0xa1, G: 0x5f, B: 0x5f, A: 0xe4}, 199 | color.NRGBA{R: 0x9f, G: 0x60, B: 0x60, A: 0xe4}, 200 | color.NRGBA{R: 0x9e, G: 0x61, B: 0x61, A: 0xe4}, 201 | color.NRGBA{R: 0x9c, G: 0x63, B: 0x63, A: 0xe3}, 202 | color.NRGBA{R: 0x9b, G: 0x64, B: 0x64, A: 0xe3}, 203 | color.NRGBA{R: 0x99, G: 0x65, B: 0x65, A: 0xe3}, 204 | color.NRGBA{R: 0x98, G: 0x68, B: 0x68, A: 0xe2}, 205 | color.NRGBA{R: 0x97, G: 0x69, B: 0x69, A: 0xe2}, 206 | color.NRGBA{R: 0x95, G: 0x6a, B: 0x6a, A: 0xe2}, 207 | color.NRGBA{R: 0x95, G: 0x6c, B: 0x6c, A: 0xe1}, 208 | color.NRGBA{R: 0x92, G: 0x6d, B: 0x6d, A: 0xe1}, 209 | color.NRGBA{R: 0x91, G: 0x6e, B: 0x6e, A: 0xe1}, 210 | color.NRGBA{R: 0x8f, G: 0x6f, B: 0x6f, A: 0xe0}, 211 | color.NRGBA{R: 0x8e, G: 0x71, B: 0x71, A: 0xe0}, 212 | color.NRGBA{R: 0x8c, G: 0x72, B: 0x72, A: 0xe0}, 213 | color.NRGBA{R: 0x8c, G: 0x73, B: 0x73, A: 0xdf}, 214 | color.NRGBA{R: 0x8a, G: 0x76, B: 0x76, A: 0xdf}, 215 | color.NRGBA{R: 0x89, G: 0x77, B: 0x77, A: 0xde}, 216 | color.NRGBA{R: 0x88, G: 0x79, B: 0x79, A: 0xde}, 217 | color.NRGBA{R: 0x85, G: 0x7a, B: 0x7a, A: 0xde}, 218 | color.NRGBA{R: 0x85, G: 0x7b, B: 0x7b, A: 0xdd}, 219 | color.NRGBA{R: 0x82, G: 0x7d, B: 0x7d, A: 0xdd}, 220 | color.NRGBA{R: 0x81, G: 0x7e, B: 0x7e, A: 0xdd}, 221 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xdc}, 222 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xd8}, 223 | color.NRGBA{R: 0x80, G: 0x80, B: 0x80, A: 0xd3}, 224 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xce}, 225 | color.NRGBA{R: 0x80, G: 0x80, B: 0x80, A: 0xc9}, 226 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xc4}, 227 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xc0}, 228 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xbb}, 229 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xb6}, 230 | color.NRGBA{R: 0x80, G: 0x80, B: 0x80, A: 0xb1}, 231 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xac}, 232 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xa8}, 233 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xa3}, 234 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x9e}, 235 | color.NRGBA{R: 0x80, G: 0x80, B: 0x80, A: 0x99}, 236 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x94}, 237 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x90}, 238 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x8b}, 239 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x86}, 240 | color.NRGBA{R: 0x80, G: 0x80, B: 0x80, A: 0x81}, 241 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x7c}, 242 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x78}, 243 | color.NRGBA{R: 0x7e, G: 0x7e, B: 0x7e, A: 0x73}, 244 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x6e}, 245 | color.NRGBA{R: 0x81, G: 0x81, B: 0x81, A: 0x69}, 246 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x64}, 247 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x60}, 248 | color.NRGBA{R: 0x7e, G: 0x7e, B: 0x7e, A: 0x5b}, 249 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x56}, 250 | color.NRGBA{R: 0x7e, G: 0x7e, B: 0x7e, A: 0x51}, 251 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x4c}, 252 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x48}, 253 | color.NRGBA{R: 0x7e, G: 0x7e, B: 0x7e, A: 0x43}, 254 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x3e}, 255 | color.NRGBA{R: 0x7d, G: 0x7d, B: 0x7d, A: 0x39}, 256 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x34}, 257 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x30}, 258 | color.NRGBA{R: 0x7d, G: 0x7d, B: 0x7d, A: 0x2b}, 259 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x26}, 260 | color.NRGBA{R: 0x7c, G: 0x7c, B: 0x7c, A: 0x21}, 261 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x1c}, 262 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x18}, 263 | color.NRGBA{R: 0x79, G: 0x79, B: 0x79, A: 0x13}, 264 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0xe}, 265 | color.NRGBA{R: 0x71, G: 0x71, B: 0x71, A: 0x9}, 266 | color.NRGBA{R: 0x7f, G: 0x7f, B: 0x7f, A: 0x4}, 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /schemes/alphafire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/alphafire.png -------------------------------------------------------------------------------- /schemes/classic.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // Classic is a color scheme that goes through a variety of colors. 6 | var Classic []color.Color 7 | 8 | func init() { 9 | Classic = []color.Color{ 10 | color.RGBA{R: 0xff, G: 0xed, B: 0xed, A: 0xff}, 11 | color.RGBA{R: 0xff, G: 0xe0, B: 0xe0, A: 0xff}, 12 | color.RGBA{R: 0xff, G: 0xd1, B: 0xd1, A: 0xff}, 13 | color.RGBA{R: 0xff, G: 0xc1, B: 0xc1, A: 0xff}, 14 | color.RGBA{R: 0xff, G: 0xb0, B: 0xb0, A: 0xff}, 15 | color.RGBA{R: 0xff, G: 0x9f, B: 0x9f, A: 0xff}, 16 | color.RGBA{R: 0xff, G: 0x8e, B: 0x8e, A: 0xff}, 17 | color.RGBA{R: 0xff, G: 0x7e, B: 0x7e, A: 0xff}, 18 | color.RGBA{R: 0xff, G: 0x6e, B: 0x6e, A: 0xff}, 19 | color.RGBA{R: 0xff, G: 0x5e, B: 0x5e, A: 0xff}, 20 | color.RGBA{R: 0xff, G: 0x51, B: 0x51, A: 0xff}, 21 | color.RGBA{R: 0xff, G: 0x43, B: 0x43, A: 0xff}, 22 | color.RGBA{R: 0xff, G: 0x38, B: 0x38, A: 0xff}, 23 | color.RGBA{R: 0xff, G: 0x2e, B: 0x2e, A: 0xff}, 24 | color.RGBA{R: 0xff, G: 0x25, B: 0x25, A: 0xff}, 25 | color.RGBA{R: 0xff, G: 0x1d, B: 0x1d, A: 0xff}, 26 | color.RGBA{R: 0xff, G: 0x17, B: 0x17, A: 0xff}, 27 | color.RGBA{R: 0xff, G: 0x12, B: 0x12, A: 0xff}, 28 | color.RGBA{R: 0xff, G: 0xe, B: 0xe, A: 0xff}, 29 | color.RGBA{R: 0xff, G: 0xb, B: 0xb, A: 0xff}, 30 | color.RGBA{R: 0xff, G: 0x8, B: 0x8, A: 0xff}, 31 | color.RGBA{R: 0xff, G: 0x6, B: 0x6, A: 0xff}, 32 | color.RGBA{R: 0xff, G: 0x5, B: 0x5, A: 0xff}, 33 | color.RGBA{R: 0xff, G: 0x3, B: 0x3, A: 0xff}, 34 | color.RGBA{R: 0xff, G: 0x2, B: 0x2, A: 0xff}, 35 | color.RGBA{R: 0xff, G: 0x2, B: 0x2, A: 0xff}, 36 | color.RGBA{R: 0xff, G: 0x1, B: 0x1, A: 0xff}, 37 | color.RGBA{R: 0xff, G: 0x1, B: 0x1, A: 0xff}, 38 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 39 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 40 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 41 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 42 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 43 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 44 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 45 | color.RGBA{R: 0xff, G: 0x0, B: 0x0, A: 0xff}, 46 | color.RGBA{R: 0xff, G: 0x1, B: 0x0, A: 0xff}, 47 | color.RGBA{R: 0xff, G: 0x4, B: 0x0, A: 0xff}, 48 | color.RGBA{R: 0xff, G: 0x6, B: 0x0, A: 0xff}, 49 | color.RGBA{R: 0xff, G: 0xa, B: 0x0, A: 0xff}, 50 | color.RGBA{R: 0xff, G: 0xe, B: 0x0, A: 0xff}, 51 | color.RGBA{R: 0xff, G: 0x12, B: 0x0, A: 0xff}, 52 | color.RGBA{R: 0xff, G: 0x16, B: 0x0, A: 0xff}, 53 | color.RGBA{R: 0xff, G: 0x1a, B: 0x0, A: 0xff}, 54 | color.RGBA{R: 0xff, G: 0x1f, B: 0x0, A: 0xff}, 55 | color.RGBA{R: 0xff, G: 0x24, B: 0x0, A: 0xff}, 56 | color.RGBA{R: 0xff, G: 0x29, B: 0x0, A: 0xff}, 57 | color.RGBA{R: 0xff, G: 0x2d, B: 0x0, A: 0xff}, 58 | color.RGBA{R: 0xff, G: 0x33, B: 0x0, A: 0xff}, 59 | color.RGBA{R: 0xff, G: 0x39, B: 0x0, A: 0xff}, 60 | color.RGBA{R: 0xff, G: 0x3e, B: 0x0, A: 0xff}, 61 | color.RGBA{R: 0xff, G: 0x44, B: 0x0, A: 0xff}, 62 | color.RGBA{R: 0xff, G: 0x4a, B: 0x0, A: 0xff}, 63 | color.RGBA{R: 0xff, G: 0x51, B: 0x0, A: 0xff}, 64 | color.RGBA{R: 0xff, G: 0x56, B: 0x0, A: 0xff}, 65 | color.RGBA{R: 0xff, G: 0x5d, B: 0x0, A: 0xff}, 66 | color.RGBA{R: 0xff, G: 0x63, B: 0x0, A: 0xff}, 67 | color.RGBA{R: 0xff, G: 0x69, B: 0x0, A: 0xff}, 68 | color.RGBA{R: 0xff, G: 0x6f, B: 0x0, A: 0xff}, 69 | color.RGBA{R: 0xff, G: 0x76, B: 0x0, A: 0xff}, 70 | color.RGBA{R: 0xff, G: 0x7c, B: 0x0, A: 0xff}, 71 | color.RGBA{R: 0xff, G: 0x83, B: 0x0, A: 0xff}, 72 | color.RGBA{R: 0xff, G: 0x89, B: 0x0, A: 0xff}, 73 | color.RGBA{R: 0xff, G: 0x90, B: 0x0, A: 0xff}, 74 | color.RGBA{R: 0xff, G: 0x96, B: 0x0, A: 0xff}, 75 | color.RGBA{R: 0xff, G: 0x9c, B: 0x0, A: 0xff}, 76 | color.RGBA{R: 0xff, G: 0xa3, B: 0x0, A: 0xff}, 77 | color.RGBA{R: 0xff, G: 0xa9, B: 0x0, A: 0xff}, 78 | color.RGBA{R: 0xff, G: 0xaf, B: 0x0, A: 0xff}, 79 | color.RGBA{R: 0xff, G: 0xb5, B: 0x0, A: 0xff}, 80 | color.RGBA{R: 0xff, G: 0xbb, B: 0x0, A: 0xff}, 81 | color.RGBA{R: 0xff, G: 0xc0, B: 0x0, A: 0xff}, 82 | color.RGBA{R: 0xff, G: 0xc6, B: 0x0, A: 0xff}, 83 | color.RGBA{R: 0xff, G: 0xcb, B: 0x0, A: 0xff}, 84 | color.RGBA{R: 0xff, G: 0xd0, B: 0x0, A: 0xff}, 85 | color.RGBA{R: 0xff, G: 0xd5, B: 0x0, A: 0xff}, 86 | color.RGBA{R: 0xff, G: 0xda, B: 0x0, A: 0xff}, 87 | color.RGBA{R: 0xff, G: 0xde, B: 0x0, A: 0xff}, 88 | color.RGBA{R: 0xff, G: 0xe3, B: 0x0, A: 0xff}, 89 | color.RGBA{R: 0xff, G: 0xe8, B: 0x0, A: 0xff}, 90 | color.RGBA{R: 0xff, G: 0xeb, B: 0x0, A: 0xff}, 91 | color.RGBA{R: 0xff, G: 0xee, B: 0x0, A: 0xff}, 92 | color.RGBA{R: 0xff, G: 0xf2, B: 0x0, A: 0xff}, 93 | color.RGBA{R: 0xff, G: 0xf5, B: 0x0, A: 0xff}, 94 | color.RGBA{R: 0xff, G: 0xf7, B: 0x0, A: 0xff}, 95 | color.RGBA{R: 0xff, G: 0xfa, B: 0x0, A: 0xff}, 96 | color.RGBA{R: 0xff, G: 0xfb, B: 0x0, A: 0xff}, 97 | color.RGBA{R: 0xfd, G: 0xfc, B: 0x0, A: 0xff}, 98 | color.RGBA{R: 0xfa, G: 0xfc, B: 0x1, A: 0xff}, 99 | color.RGBA{R: 0xf8, G: 0xfc, B: 0x2, A: 0xff}, 100 | color.RGBA{R: 0xf4, G: 0xfc, B: 0x2, A: 0xff}, 101 | color.RGBA{R: 0xf1, G: 0xfc, B: 0x3, A: 0xff}, 102 | color.RGBA{R: 0xed, G: 0xfc, B: 0x3, A: 0xff}, 103 | color.RGBA{R: 0xe9, G: 0xfc, B: 0x3, A: 0xff}, 104 | color.RGBA{R: 0xe5, G: 0xfc, B: 0x4, A: 0xff}, 105 | color.RGBA{R: 0xe1, G: 0xfc, B: 0x4, A: 0xff}, 106 | color.RGBA{R: 0xdc, G: 0xfc, B: 0x5, A: 0xff}, 107 | color.RGBA{R: 0xd8, G: 0xfc, B: 0x5, A: 0xff}, 108 | color.RGBA{R: 0xd3, G: 0xfc, B: 0x6, A: 0xff}, 109 | color.RGBA{R: 0xce, G: 0xfc, B: 0x7, A: 0xff}, 110 | color.RGBA{R: 0xc9, G: 0xfc, B: 0x7, A: 0xff}, 111 | color.RGBA{R: 0xc5, G: 0xfc, B: 0x8, A: 0xff}, 112 | color.RGBA{R: 0xbf, G: 0xfb, B: 0x8, A: 0xff}, 113 | color.RGBA{R: 0xb9, G: 0xf9, B: 0x9, A: 0xff}, 114 | color.RGBA{R: 0xb4, G: 0xf7, B: 0x9, A: 0xff}, 115 | color.RGBA{R: 0xae, G: 0xf6, B: 0xa, A: 0xff}, 116 | color.RGBA{R: 0xa9, G: 0xf4, B: 0xb, A: 0xff}, 117 | color.RGBA{R: 0xa4, G: 0xf2, B: 0xb, A: 0xff}, 118 | color.RGBA{R: 0x9e, G: 0xf0, B: 0xc, A: 0xff}, 119 | color.RGBA{R: 0x97, G: 0xee, B: 0xd, A: 0xff}, 120 | color.RGBA{R: 0x92, G: 0xec, B: 0xe, A: 0xff}, 121 | color.RGBA{R: 0x8c, G: 0xe9, B: 0xe, A: 0xff}, 122 | color.RGBA{R: 0x86, G: 0xe7, B: 0xf, A: 0xff}, 123 | color.RGBA{R: 0x80, G: 0xe4, B: 0x10, A: 0xff}, 124 | color.RGBA{R: 0x7a, G: 0xe2, B: 0x11, A: 0xff}, 125 | color.RGBA{R: 0x74, G: 0xdf, B: 0x12, A: 0xff}, 126 | color.RGBA{R: 0x6e, G: 0xdd, B: 0x13, A: 0xff}, 127 | color.RGBA{R: 0x69, G: 0xda, B: 0x14, A: 0xff}, 128 | color.RGBA{R: 0x63, G: 0xd8, B: 0x15, A: 0xff}, 129 | color.RGBA{R: 0x5d, G: 0xd6, B: 0x16, A: 0xff}, 130 | color.RGBA{R: 0x58, G: 0xd3, B: 0x17, A: 0xff}, 131 | color.RGBA{R: 0x52, G: 0xd1, B: 0x18, A: 0xff}, 132 | color.RGBA{R: 0x4c, G: 0xcf, B: 0x19, A: 0xff}, 133 | color.RGBA{R: 0x47, G: 0xcc, B: 0x1a, A: 0xff}, 134 | color.RGBA{R: 0x42, G: 0xca, B: 0x1c, A: 0xff}, 135 | color.RGBA{R: 0x3c, G: 0xc8, B: 0x1e, A: 0xff}, 136 | color.RGBA{R: 0x37, G: 0xc6, B: 0x1f, A: 0xff}, 137 | color.RGBA{R: 0x32, G: 0xc4, B: 0x21, A: 0xff}, 138 | color.RGBA{R: 0x2d, G: 0xc2, B: 0x22, A: 0xff}, 139 | color.RGBA{R: 0x28, G: 0xbf, B: 0x23, A: 0xff}, 140 | color.RGBA{R: 0x24, G: 0xbe, B: 0x25, A: 0xff}, 141 | color.RGBA{R: 0x1f, G: 0xbc, B: 0x27, A: 0xff}, 142 | color.RGBA{R: 0x1b, G: 0xbb, B: 0x28, A: 0xff}, 143 | color.RGBA{R: 0x17, G: 0xb9, B: 0x2b, A: 0xff}, 144 | color.RGBA{R: 0x13, G: 0xb8, B: 0x2c, A: 0xff}, 145 | color.RGBA{R: 0xf, G: 0xb7, B: 0x2e, A: 0xff}, 146 | color.RGBA{R: 0xc, G: 0xb6, B: 0x30, A: 0xff}, 147 | color.RGBA{R: 0x9, G: 0xb5, B: 0x33, A: 0xff}, 148 | color.RGBA{R: 0x6, G: 0xb5, B: 0x35, A: 0xff}, 149 | color.RGBA{R: 0x3, G: 0xb4, B: 0x37, A: 0xff}, 150 | color.RGBA{R: 0x1, G: 0xb4, B: 0x39, A: 0xff}, 151 | color.RGBA{R: 0x0, G: 0xb4, B: 0x3c, A: 0xff}, 152 | color.RGBA{R: 0x0, G: 0xb4, B: 0x3e, A: 0xff}, 153 | color.RGBA{R: 0x0, G: 0xb4, B: 0x41, A: 0xff}, 154 | color.RGBA{R: 0x0, G: 0xb5, B: 0x44, A: 0xff}, 155 | color.RGBA{R: 0x0, G: 0xb6, B: 0x46, A: 0xff}, 156 | color.RGBA{R: 0x0, G: 0xb6, B: 0x4a, A: 0xff}, 157 | color.RGBA{R: 0x0, G: 0xb7, B: 0x4d, A: 0xff}, 158 | color.RGBA{R: 0x0, G: 0xb8, B: 0x50, A: 0xff}, 159 | color.RGBA{R: 0x0, G: 0xb8, B: 0x54, A: 0xff}, 160 | color.RGBA{R: 0x0, G: 0xba, B: 0x58, A: 0xff}, 161 | color.RGBA{R: 0x0, G: 0xbb, B: 0x5c, A: 0xff}, 162 | color.RGBA{R: 0x0, G: 0xbc, B: 0x5f, A: 0xff}, 163 | color.RGBA{R: 0x0, G: 0xbe, B: 0x63, A: 0xff}, 164 | color.RGBA{R: 0x0, G: 0xbf, B: 0x68, A: 0xff}, 165 | color.RGBA{R: 0x0, G: 0xc1, B: 0x6c, A: 0xff}, 166 | color.RGBA{R: 0x0, G: 0xc2, B: 0x70, A: 0xff}, 167 | color.RGBA{R: 0x0, G: 0xc4, B: 0x74, A: 0xff}, 168 | color.RGBA{R: 0x0, G: 0xc6, B: 0x78, A: 0xff}, 169 | color.RGBA{R: 0x0, G: 0xc8, B: 0x7d, A: 0xff}, 170 | color.RGBA{R: 0x0, G: 0xc9, B: 0x81, A: 0xff}, 171 | color.RGBA{R: 0x0, G: 0xcb, B: 0x86, A: 0xff}, 172 | color.RGBA{R: 0x0, G: 0xcd, B: 0x8a, A: 0xff}, 173 | color.RGBA{R: 0x0, G: 0xcf, B: 0x8f, A: 0xff}, 174 | color.RGBA{R: 0x0, G: 0xd1, B: 0x93, A: 0xff}, 175 | color.RGBA{R: 0x0, G: 0xd3, B: 0x97, A: 0xff}, 176 | color.RGBA{R: 0x0, G: 0xd5, B: 0x9c, A: 0xff}, 177 | color.RGBA{R: 0x0, G: 0xd7, B: 0xa0, A: 0xff}, 178 | color.RGBA{R: 0x0, G: 0xd8, B: 0xa5, A: 0xff}, 179 | color.RGBA{R: 0x0, G: 0xdb, B: 0xab, A: 0xff}, 180 | color.RGBA{R: 0x0, G: 0xde, B: 0xb2, A: 0xff}, 181 | color.RGBA{R: 0x0, G: 0xe0, B: 0xb8, A: 0xff}, 182 | color.RGBA{R: 0x0, G: 0xe3, B: 0xbe, A: 0xff}, 183 | color.RGBA{R: 0x0, G: 0xe5, B: 0xc5, A: 0xff}, 184 | color.RGBA{R: 0x0, G: 0xe7, B: 0xcb, A: 0xff}, 185 | color.RGBA{R: 0x0, G: 0xe9, B: 0xd1, A: 0xff}, 186 | color.RGBA{R: 0x0, G: 0xea, B: 0xd6, A: 0xff}, 187 | color.RGBA{R: 0x0, G: 0xea, B: 0xdc, A: 0xff}, 188 | color.RGBA{R: 0x0, G: 0xea, B: 0xe1, A: 0xff}, 189 | color.RGBA{R: 0x0, G: 0xea, B: 0xe6, A: 0xff}, 190 | color.RGBA{R: 0x0, G: 0xea, B: 0xea, A: 0xff}, 191 | color.RGBA{R: 0x0, G: 0xea, B: 0xee, A: 0xff}, 192 | color.RGBA{R: 0x0, G: 0xea, B: 0xf2, A: 0xff}, 193 | color.RGBA{R: 0x0, G: 0xea, B: 0xf6, A: 0xff}, 194 | color.RGBA{R: 0x0, G: 0xea, B: 0xf8, A: 0xff}, 195 | color.RGBA{R: 0x0, G: 0xea, B: 0xfb, A: 0xff}, 196 | color.RGBA{R: 0x0, G: 0xea, B: 0xfe, A: 0xff}, 197 | color.RGBA{R: 0x0, G: 0xea, B: 0xff, A: 0xff}, 198 | color.RGBA{R: 0x0, G: 0xe8, B: 0xff, A: 0xff}, 199 | color.RGBA{R: 0x0, G: 0xe4, B: 0xff, A: 0xff}, 200 | color.RGBA{R: 0x0, G: 0xe0, B: 0xff, A: 0xff}, 201 | color.RGBA{R: 0x0, G: 0xdb, B: 0xff, A: 0xff}, 202 | color.RGBA{R: 0x0, G: 0xd6, B: 0xfe, A: 0xff}, 203 | color.RGBA{R: 0x0, G: 0xd0, B: 0xfc, A: 0xff}, 204 | color.RGBA{R: 0x0, G: 0xca, B: 0xfa, A: 0xff}, 205 | color.RGBA{R: 0x0, G: 0xc3, B: 0xf7, A: 0xff}, 206 | color.RGBA{R: 0x0, G: 0xbc, B: 0xf4, A: 0xff}, 207 | color.RGBA{R: 0x0, G: 0xb4, B: 0xf0, A: 0xff}, 208 | color.RGBA{R: 0x0, G: 0xad, B: 0xec, A: 0xff}, 209 | color.RGBA{R: 0x0, G: 0xa4, B: 0xe8, A: 0xff}, 210 | color.RGBA{R: 0x0, G: 0x9c, B: 0xe4, A: 0xff}, 211 | color.RGBA{R: 0x0, G: 0x93, B: 0xde, A: 0xff}, 212 | color.RGBA{R: 0x0, G: 0x8b, B: 0xda, A: 0xff}, 213 | color.RGBA{R: 0x0, G: 0x82, B: 0xd5, A: 0xff}, 214 | color.RGBA{R: 0x0, G: 0x7a, B: 0xd0, A: 0xff}, 215 | color.RGBA{R: 0x0, G: 0x75, B: 0xcd, A: 0xff}, 216 | color.RGBA{R: 0x0, G: 0x70, B: 0xcb, A: 0xff}, 217 | color.RGBA{R: 0x0, G: 0x6b, B: 0xc7, A: 0xff}, 218 | color.RGBA{R: 0x0, G: 0x63, B: 0xc4, A: 0xff}, 219 | color.RGBA{R: 0x0, G: 0x5d, B: 0xc1, A: 0xff}, 220 | color.RGBA{R: 0x0, G: 0x56, B: 0xbd, A: 0xff}, 221 | color.RGBA{R: 0x0, G: 0x4e, B: 0xb8, A: 0xff}, 222 | color.RGBA{R: 0x0, G: 0x47, B: 0xb4, A: 0xff}, 223 | color.RGBA{R: 0x0, G: 0x41, B: 0xaf, A: 0xff}, 224 | color.RGBA{R: 0x0, G: 0x3a, B: 0xab, A: 0xff}, 225 | color.RGBA{R: 0x0, G: 0x34, B: 0xa7, A: 0xff}, 226 | color.RGBA{R: 0x0, G: 0x2e, B: 0xa2, A: 0xff}, 227 | color.RGBA{R: 0x0, G: 0x28, B: 0x9d, A: 0xff}, 228 | color.RGBA{R: 0x0, G: 0x23, B: 0x98, A: 0xff}, 229 | color.RGBA{R: 0x0, G: 0x1e, B: 0x93, A: 0xff}, 230 | color.RGBA{R: 0x0, G: 0x1a, B: 0x8e, A: 0xff}, 231 | color.RGBA{R: 0x0, G: 0x16, B: 0x88, A: 0xff}, 232 | color.RGBA{R: 0x0, G: 0x12, B: 0x83, A: 0xff}, 233 | color.RGBA{R: 0x0, G: 0xf, B: 0x7e, A: 0xff}, 234 | color.RGBA{R: 0x0, G: 0xc, B: 0x78, A: 0xff}, 235 | color.RGBA{R: 0x0, G: 0x9, B: 0x73, A: 0xff}, 236 | color.RGBA{R: 0x1, G: 0x8, B: 0x6e, A: 0xff}, 237 | color.RGBA{R: 0x1, G: 0x6, B: 0x6a, A: 0xff}, 238 | color.RGBA{R: 0x1, G: 0x5, B: 0x65, A: 0xff}, 239 | color.RGBA{R: 0x2, G: 0x4, B: 0x61, A: 0xff}, 240 | color.RGBA{R: 0x3, G: 0x4, B: 0x5c, A: 0xff}, 241 | color.RGBA{R: 0x4, G: 0x5, B: 0x59, A: 0xff}, 242 | color.RGBA{R: 0x5, G: 0x5, B: 0x55, A: 0xff}, 243 | color.RGBA{R: 0x6, G: 0x6, B: 0x52, A: 0xff}, 244 | color.RGBA{R: 0x7, G: 0x7, B: 0x4f, A: 0xff}, 245 | color.RGBA{R: 0x8, G: 0x8, B: 0x4d, A: 0xff}, 246 | color.RGBA{R: 0xa, G: 0xa, B: 0x4d, A: 0xff}, 247 | color.RGBA{R: 0xc, G: 0xc, B: 0x4d, A: 0xff}, 248 | color.RGBA{R: 0xe, G: 0xe, B: 0x4c, A: 0xff}, 249 | color.RGBA{R: 0x10, G: 0x10, B: 0x4a, A: 0xff}, 250 | color.RGBA{R: 0x13, G: 0x13, B: 0x49, A: 0xff}, 251 | color.RGBA{R: 0x15, G: 0x15, B: 0x48, A: 0xff}, 252 | color.RGBA{R: 0x18, G: 0x18, B: 0x47, A: 0xff}, 253 | color.RGBA{R: 0x1a, G: 0x1a, B: 0x45, A: 0xff}, 254 | color.RGBA{R: 0x1d, G: 0x1d, B: 0x46, A: 0xff}, 255 | color.RGBA{R: 0x20, G: 0x20, B: 0x45, A: 0xff}, 256 | color.RGBA{R: 0x23, G: 0x23, B: 0x44, A: 0xff}, 257 | color.RGBA{R: 0x25, G: 0x25, B: 0x43, A: 0xff}, 258 | color.RGBA{R: 0x28, G: 0x28, B: 0x43, A: 0xff}, 259 | color.RGBA{R: 0x2a, G: 0x2a, B: 0x41, A: 0xff}, 260 | color.RGBA{R: 0x2c, G: 0x2c, B: 0x41, A: 0xff}, 261 | color.RGBA{R: 0x2e, G: 0x2e, B: 0x40, A: 0xff}, 262 | color.RGBA{R: 0x30, G: 0x30, B: 0x3f, A: 0xff}, 263 | color.RGBA{R: 0x31, G: 0x32, B: 0x3e, A: 0xff}, 264 | color.RGBA{R: 0x33, G: 0x33, B: 0x3d, A: 0xff}, 265 | color.RGBA{R: 0x35, G: 0x34, B: 0x3d, A: 0xff}, 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /schemes/classic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/classic.png -------------------------------------------------------------------------------- /schemes/fire.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // Fire is a gradient color scheme from grey to white through red and 6 | // yellow. 7 | var Fire []color.Color 8 | 9 | func init() { 10 | Fire = []color.Color{ 11 | color.RGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}, 12 | color.RGBA{R: 0xff, G: 0xff, B: 0xfd, A: 0xff}, 13 | color.RGBA{R: 0xff, G: 0xff, B: 0xfa, A: 0xff}, 14 | color.RGBA{R: 0xff, G: 0xff, B: 0xf7, A: 0xff}, 15 | color.RGBA{R: 0xff, G: 0xff, B: 0xf4, A: 0xff}, 16 | color.RGBA{R: 0xff, G: 0xff, B: 0xf1, A: 0xff}, 17 | color.RGBA{R: 0xff, G: 0xff, B: 0xee, A: 0xff}, 18 | color.RGBA{R: 0xff, G: 0xff, B: 0xea, A: 0xff}, 19 | color.RGBA{R: 0xff, G: 0xff, B: 0xe7, A: 0xff}, 20 | color.RGBA{R: 0xff, G: 0xff, B: 0xe3, A: 0xff}, 21 | color.RGBA{R: 0xff, G: 0xff, B: 0xdf, A: 0xff}, 22 | color.RGBA{R: 0xff, G: 0xff, B: 0xdb, A: 0xff}, 23 | color.RGBA{R: 0xff, G: 0xff, B: 0xd6, A: 0xff}, 24 | color.RGBA{R: 0xff, G: 0xff, B: 0xd3, A: 0xff}, 25 | color.RGBA{R: 0xff, G: 0xff, B: 0xce, A: 0xff}, 26 | color.RGBA{R: 0xff, G: 0xff, B: 0xca, A: 0xff}, 27 | color.RGBA{R: 0xff, G: 0xff, B: 0xc5, A: 0xff}, 28 | color.RGBA{R: 0xff, G: 0xff, B: 0xc0, A: 0xff}, 29 | color.RGBA{R: 0xff, G: 0xff, B: 0xbb, A: 0xff}, 30 | color.RGBA{R: 0xff, G: 0xff, B: 0xb7, A: 0xff}, 31 | color.RGBA{R: 0xff, G: 0xff, B: 0xb2, A: 0xff}, 32 | color.RGBA{R: 0xff, G: 0xff, B: 0xac, A: 0xff}, 33 | color.RGBA{R: 0xff, G: 0xff, B: 0xa7, A: 0xff}, 34 | color.RGBA{R: 0xff, G: 0xff, B: 0xa3, A: 0xff}, 35 | color.RGBA{R: 0xff, G: 0xff, B: 0x9d, A: 0xff}, 36 | color.RGBA{R: 0xff, G: 0xff, B: 0x98, A: 0xff}, 37 | color.RGBA{R: 0xff, G: 0xff, B: 0x93, A: 0xff}, 38 | color.RGBA{R: 0xff, G: 0xff, B: 0x8e, A: 0xff}, 39 | color.RGBA{R: 0xff, G: 0xff, B: 0x88, A: 0xff}, 40 | color.RGBA{R: 0xff, G: 0xff, B: 0x84, A: 0xff}, 41 | color.RGBA{R: 0xff, G: 0xff, B: 0x7e, A: 0xff}, 42 | color.RGBA{R: 0xff, G: 0xff, B: 0x79, A: 0xff}, 43 | color.RGBA{R: 0xff, G: 0xff, B: 0x74, A: 0xff}, 44 | color.RGBA{R: 0xff, G: 0xff, B: 0x6f, A: 0xff}, 45 | color.RGBA{R: 0xff, G: 0xff, B: 0x6a, A: 0xff}, 46 | color.RGBA{R: 0xff, G: 0xff, B: 0x66, A: 0xff}, 47 | color.RGBA{R: 0xff, G: 0xff, B: 0x61, A: 0xff}, 48 | color.RGBA{R: 0xff, G: 0xff, B: 0x5b, A: 0xff}, 49 | color.RGBA{R: 0xff, G: 0xff, B: 0x57, A: 0xff}, 50 | color.RGBA{R: 0xff, G: 0xff, B: 0x52, A: 0xff}, 51 | color.RGBA{R: 0xff, G: 0xff, B: 0x4e, A: 0xff}, 52 | color.RGBA{R: 0xff, G: 0xff, B: 0x4a, A: 0xff}, 53 | color.RGBA{R: 0xff, G: 0xff, B: 0x46, A: 0xff}, 54 | color.RGBA{R: 0xff, G: 0xff, B: 0x41, A: 0xff}, 55 | color.RGBA{R: 0xff, G: 0xff, B: 0x3d, A: 0xff}, 56 | color.RGBA{R: 0xff, G: 0xff, B: 0x39, A: 0xff}, 57 | color.RGBA{R: 0xff, G: 0xff, B: 0x35, A: 0xff}, 58 | color.RGBA{R: 0xff, G: 0xff, B: 0x32, A: 0xff}, 59 | color.RGBA{R: 0xff, G: 0xff, B: 0x2e, A: 0xff}, 60 | color.RGBA{R: 0xff, G: 0xff, B: 0x2b, A: 0xff}, 61 | color.RGBA{R: 0xff, G: 0xff, B: 0x27, A: 0xff}, 62 | color.RGBA{R: 0xff, G: 0xff, B: 0x26, A: 0xff}, 63 | color.RGBA{R: 0xff, G: 0xff, B: 0x22, A: 0xff}, 64 | color.RGBA{R: 0xff, G: 0xff, B: 0x1f, A: 0xff}, 65 | color.RGBA{R: 0xff, G: 0xff, B: 0x1d, A: 0xff}, 66 | color.RGBA{R: 0xff, G: 0xff, B: 0x1a, A: 0xff}, 67 | color.RGBA{R: 0xff, G: 0xff, B: 0x19, A: 0xff}, 68 | color.RGBA{R: 0xff, G: 0xfe, B: 0x17, A: 0xff}, 69 | color.RGBA{R: 0xff, G: 0xfb, B: 0x16, A: 0xff}, 70 | color.RGBA{R: 0xff, G: 0xfa, B: 0x16, A: 0xff}, 71 | color.RGBA{R: 0xff, G: 0xf7, B: 0x17, A: 0xff}, 72 | color.RGBA{R: 0xff, G: 0xf5, B: 0x17, A: 0xff}, 73 | color.RGBA{R: 0xff, G: 0xf2, B: 0x18, A: 0xff}, 74 | color.RGBA{R: 0xff, G: 0xef, B: 0x18, A: 0xff}, 75 | color.RGBA{R: 0xff, G: 0xec, B: 0x19, A: 0xff}, 76 | color.RGBA{R: 0xff, G: 0xe8, B: 0x19, A: 0xff}, 77 | color.RGBA{R: 0xff, G: 0xe5, B: 0x1a, A: 0xff}, 78 | color.RGBA{R: 0xff, G: 0xe2, B: 0x1a, A: 0xff}, 79 | color.RGBA{R: 0xff, G: 0xde, B: 0x1b, A: 0xff}, 80 | color.RGBA{R: 0xff, G: 0xda, B: 0x1b, A: 0xff}, 81 | color.RGBA{R: 0xff, G: 0xd7, B: 0x1c, A: 0xff}, 82 | color.RGBA{R: 0xff, G: 0xd2, B: 0x1c, A: 0xff}, 83 | color.RGBA{R: 0xff, G: 0xcf, B: 0x1d, A: 0xff}, 84 | color.RGBA{R: 0xff, G: 0xcb, B: 0x1d, A: 0xff}, 85 | color.RGBA{R: 0xff, G: 0xc7, B: 0x1e, A: 0xff}, 86 | color.RGBA{R: 0xff, G: 0xc2, B: 0x1e, A: 0xff}, 87 | color.RGBA{R: 0xff, G: 0xbe, B: 0x1f, A: 0xff}, 88 | color.RGBA{R: 0xff, G: 0xba, B: 0x1f, A: 0xff}, 89 | color.RGBA{R: 0xff, G: 0xb6, B: 0x20, A: 0xff}, 90 | color.RGBA{R: 0xff, G: 0xb0, B: 0x20, A: 0xff}, 91 | color.RGBA{R: 0xff, G: 0xac, B: 0x21, A: 0xff}, 92 | color.RGBA{R: 0xff, G: 0xa8, B: 0x22, A: 0xff}, 93 | color.RGBA{R: 0xff, G: 0xa3, B: 0x22, A: 0xff}, 94 | color.RGBA{R: 0xff, G: 0x9f, B: 0x23, A: 0xff}, 95 | color.RGBA{R: 0xff, G: 0x9a, B: 0x23, A: 0xff}, 96 | color.RGBA{R: 0xff, G: 0x96, B: 0x24, A: 0xff}, 97 | color.RGBA{R: 0xff, G: 0x91, B: 0x24, A: 0xff}, 98 | color.RGBA{R: 0xff, G: 0x8d, B: 0x25, A: 0xff}, 99 | color.RGBA{R: 0xff, G: 0x88, B: 0x25, A: 0xff}, 100 | color.RGBA{R: 0xff, G: 0x84, B: 0x26, A: 0xff}, 101 | color.RGBA{R: 0xff, G: 0x80, B: 0x27, A: 0xff}, 102 | color.RGBA{R: 0xff, G: 0x7c, B: 0x27, A: 0xff}, 103 | color.RGBA{R: 0xff, G: 0x77, B: 0x28, A: 0xff}, 104 | color.RGBA{R: 0xff, G: 0x73, B: 0x28, A: 0xff}, 105 | color.RGBA{R: 0xff, G: 0x6f, B: 0x29, A: 0xff}, 106 | color.RGBA{R: 0xff, G: 0x6b, B: 0x29, A: 0xff}, 107 | color.RGBA{R: 0xff, G: 0x67, B: 0x2a, A: 0xff}, 108 | color.RGBA{R: 0xff, G: 0x63, B: 0x2a, A: 0xff}, 109 | color.RGBA{R: 0xff, G: 0x5f, B: 0x2b, A: 0xff}, 110 | color.RGBA{R: 0xff, G: 0x5c, B: 0x2c, A: 0xff}, 111 | color.RGBA{R: 0xff, G: 0x59, B: 0x2c, A: 0xff}, 112 | color.RGBA{R: 0xff, G: 0x55, B: 0x2d, A: 0xff}, 113 | color.RGBA{R: 0xff, G: 0x51, B: 0x2d, A: 0xff}, 114 | color.RGBA{R: 0xff, G: 0x4f, B: 0x2e, A: 0xff}, 115 | color.RGBA{R: 0xff, G: 0x4c, B: 0x2f, A: 0xff}, 116 | color.RGBA{R: 0xff, G: 0x48, B: 0x2f, A: 0xff}, 117 | color.RGBA{R: 0xff, G: 0x46, B: 0x30, A: 0xff}, 118 | color.RGBA{R: 0xff, G: 0x43, B: 0x30, A: 0xff}, 119 | color.RGBA{R: 0xff, G: 0x41, B: 0x31, A: 0xff}, 120 | color.RGBA{R: 0xff, G: 0x3f, B: 0x32, A: 0xff}, 121 | color.RGBA{R: 0xff, G: 0x3c, B: 0x32, A: 0xff}, 122 | color.RGBA{R: 0xff, G: 0x3b, B: 0x33, A: 0xff}, 123 | color.RGBA{R: 0xff, G: 0x39, B: 0x33, A: 0xff}, 124 | color.RGBA{R: 0xff, G: 0x37, B: 0x34, A: 0xff}, 125 | color.RGBA{R: 0xff, G: 0x37, B: 0x35, A: 0xff}, 126 | color.RGBA{R: 0xff, G: 0x35, B: 0x35, A: 0xff}, 127 | color.RGBA{R: 0xfd, G: 0x36, B: 0x36, A: 0xff}, 128 | color.RGBA{R: 0xfd, G: 0x36, B: 0x36, A: 0xff}, 129 | color.RGBA{R: 0xfb, G: 0x37, B: 0x37, A: 0xff}, 130 | color.RGBA{R: 0xfa, G: 0x38, B: 0x38, A: 0xff}, 131 | color.RGBA{R: 0xf8, G: 0x38, B: 0x38, A: 0xff}, 132 | color.RGBA{R: 0xf7, G: 0x39, B: 0x39, A: 0xff}, 133 | color.RGBA{R: 0xf6, G: 0x39, B: 0x39, A: 0xff}, 134 | color.RGBA{R: 0xf4, G: 0x3a, B: 0x3a, A: 0xff}, 135 | color.RGBA{R: 0xf2, G: 0x3b, B: 0x3b, A: 0xff}, 136 | color.RGBA{R: 0xf0, G: 0x3b, B: 0x3b, A: 0xff}, 137 | color.RGBA{R: 0xef, G: 0x3c, B: 0x3c, A: 0xff}, 138 | color.RGBA{R: 0xee, G: 0x3d, B: 0x3d, A: 0xff}, 139 | color.RGBA{R: 0xeb, G: 0x3d, B: 0x3d, A: 0xff}, 140 | color.RGBA{R: 0xea, G: 0x3e, B: 0x3e, A: 0xff}, 141 | color.RGBA{R: 0xe8, G: 0x3e, B: 0x3e, A: 0xff}, 142 | color.RGBA{R: 0xe5, G: 0x3f, B: 0x3f, A: 0xff}, 143 | color.RGBA{R: 0xe4, G: 0x40, B: 0x40, A: 0xff}, 144 | color.RGBA{R: 0xe2, G: 0x40, B: 0x40, A: 0xff}, 145 | color.RGBA{R: 0xe0, G: 0x41, B: 0x41, A: 0xff}, 146 | color.RGBA{R: 0xde, G: 0x42, B: 0x42, A: 0xff}, 147 | color.RGBA{R: 0xdb, G: 0x42, B: 0x42, A: 0xff}, 148 | color.RGBA{R: 0xda, G: 0x43, B: 0x43, A: 0xff}, 149 | color.RGBA{R: 0xd8, G: 0x43, B: 0x43, A: 0xff}, 150 | color.RGBA{R: 0xd5, G: 0x44, B: 0x44, A: 0xff}, 151 | color.RGBA{R: 0xd3, G: 0x45, B: 0x45, A: 0xff}, 152 | color.RGBA{R: 0xd1, G: 0x45, B: 0x45, A: 0xff}, 153 | color.RGBA{R: 0xcf, G: 0x46, B: 0x46, A: 0xff}, 154 | color.RGBA{R: 0xcd, G: 0x47, B: 0x47, A: 0xff}, 155 | color.RGBA{R: 0xcb, G: 0x47, B: 0x47, A: 0xff}, 156 | color.RGBA{R: 0xc8, G: 0x48, B: 0x48, A: 0xff}, 157 | color.RGBA{R: 0xc7, G: 0x49, B: 0x49, A: 0xff}, 158 | color.RGBA{R: 0xc4, G: 0x49, B: 0x49, A: 0xff}, 159 | color.RGBA{R: 0xc2, G: 0x4a, B: 0x4a, A: 0xff}, 160 | color.RGBA{R: 0xc0, G: 0x4a, B: 0x4a, A: 0xff}, 161 | color.RGBA{R: 0xbe, G: 0x4b, B: 0x4b, A: 0xff}, 162 | color.RGBA{R: 0xbc, G: 0x4c, B: 0x4c, A: 0xff}, 163 | color.RGBA{R: 0xba, G: 0x4c, B: 0x4c, A: 0xff}, 164 | color.RGBA{R: 0xb7, G: 0x4d, B: 0x4d, A: 0xff}, 165 | color.RGBA{R: 0xb5, G: 0x4e, B: 0x4e, A: 0xff}, 166 | color.RGBA{R: 0xb3, G: 0x4e, B: 0x4e, A: 0xff}, 167 | color.RGBA{R: 0xb1, G: 0x4f, B: 0x4f, A: 0xff}, 168 | color.RGBA{R: 0xaf, G: 0x50, B: 0x50, A: 0xff}, 169 | color.RGBA{R: 0xad, G: 0x50, B: 0x50, A: 0xff}, 170 | color.RGBA{R: 0xaa, G: 0x51, B: 0x51, A: 0xff}, 171 | color.RGBA{R: 0xa9, G: 0x52, B: 0x52, A: 0xff}, 172 | color.RGBA{R: 0xa6, G: 0x52, B: 0x52, A: 0xff}, 173 | color.RGBA{R: 0xa5, G: 0x53, B: 0x53, A: 0xff}, 174 | color.RGBA{R: 0xa2, G: 0x53, B: 0x53, A: 0xff}, 175 | color.RGBA{R: 0xa0, G: 0x54, B: 0x54, A: 0xff}, 176 | color.RGBA{R: 0x9e, G: 0x55, B: 0x55, A: 0xff}, 177 | color.RGBA{R: 0x9c, G: 0x55, B: 0x55, A: 0xff}, 178 | color.RGBA{R: 0x9a, G: 0x56, B: 0x56, A: 0xff}, 179 | color.RGBA{R: 0x99, G: 0x57, B: 0x57, A: 0xff}, 180 | color.RGBA{R: 0x96, G: 0x57, B: 0x57, A: 0xff}, 181 | color.RGBA{R: 0x95, G: 0x58, B: 0x58, A: 0xff}, 182 | color.RGBA{R: 0x93, G: 0x59, B: 0x59, A: 0xff}, 183 | color.RGBA{R: 0x92, G: 0x5a, B: 0x5a, A: 0xff}, 184 | color.RGBA{R: 0x90, G: 0x5b, B: 0x5b, A: 0xff}, 185 | color.RGBA{R: 0x8e, G: 0x5c, B: 0x5c, A: 0xff}, 186 | color.RGBA{R: 0x8e, G: 0x5e, B: 0x5e, A: 0xff}, 187 | color.RGBA{R: 0x8d, G: 0x5f, B: 0x5f, A: 0xff}, 188 | color.RGBA{R: 0x8c, G: 0x60, B: 0x60, A: 0xff}, 189 | color.RGBA{R: 0x8b, G: 0x62, B: 0x62, A: 0xff}, 190 | color.RGBA{R: 0x8a, G: 0x63, B: 0x63, A: 0xff}, 191 | color.RGBA{R: 0x88, G: 0x64, B: 0x64, A: 0xff}, 192 | color.RGBA{R: 0x87, G: 0x65, B: 0x65, A: 0xff}, 193 | color.RGBA{R: 0x87, G: 0x67, B: 0x67, A: 0xff}, 194 | color.RGBA{R: 0x86, G: 0x68, B: 0x68, A: 0xff}, 195 | color.RGBA{R: 0x85, G: 0x69, B: 0x69, A: 0xff}, 196 | color.RGBA{R: 0x85, G: 0x6b, B: 0x6b, A: 0xff}, 197 | color.RGBA{R: 0x84, G: 0x6c, B: 0x6c, A: 0xff}, 198 | color.RGBA{R: 0x83, G: 0x6d, B: 0x6d, A: 0xff}, 199 | color.RGBA{R: 0x84, G: 0x6f, B: 0x6f, A: 0xff}, 200 | color.RGBA{R: 0x83, G: 0x70, B: 0x70, A: 0xff}, 201 | color.RGBA{R: 0x82, G: 0x71, B: 0x71, A: 0xff}, 202 | color.RGBA{R: 0x82, G: 0x72, B: 0x72, A: 0xff}, 203 | color.RGBA{R: 0x82, G: 0x74, B: 0x74, A: 0xff}, 204 | color.RGBA{R: 0x82, G: 0x75, B: 0x75, A: 0xff}, 205 | color.RGBA{R: 0x82, G: 0x76, B: 0x76, A: 0xff}, 206 | color.RGBA{R: 0x81, G: 0x77, B: 0x77, A: 0xff}, 207 | color.RGBA{R: 0x82, G: 0x79, B: 0x79, A: 0xff}, 208 | color.RGBA{R: 0x82, G: 0x7a, B: 0x7a, A: 0xff}, 209 | color.RGBA{R: 0x82, G: 0x7b, B: 0x7b, A: 0xff}, 210 | color.RGBA{R: 0x82, G: 0x7c, B: 0x7c, A: 0xff}, 211 | color.RGBA{R: 0x83, G: 0x7e, B: 0x7e, A: 0xff}, 212 | color.RGBA{R: 0x83, G: 0x7f, B: 0x7f, A: 0xff}, 213 | color.RGBA{R: 0x82, G: 0x80, B: 0x80, A: 0xff}, 214 | color.RGBA{R: 0x83, G: 0x81, B: 0x81, A: 0xff}, 215 | color.RGBA{R: 0x84, G: 0x83, B: 0x83, A: 0xff}, 216 | color.RGBA{R: 0x84, G: 0x84, B: 0x84, A: 0xff}, 217 | color.RGBA{R: 0x85, G: 0x85, B: 0x85, A: 0xff}, 218 | color.RGBA{R: 0x86, G: 0x86, B: 0x86, A: 0xff}, 219 | color.RGBA{R: 0x87, G: 0x87, B: 0x87, A: 0xff}, 220 | color.RGBA{R: 0x88, G: 0x88, B: 0x88, A: 0xff}, 221 | color.RGBA{R: 0x8a, G: 0x8a, B: 0x8a, A: 0xff}, 222 | color.RGBA{R: 0x8b, G: 0x8b, B: 0x8b, A: 0xff}, 223 | color.RGBA{R: 0x8c, G: 0x8c, B: 0x8c, A: 0xff}, 224 | color.RGBA{R: 0x8d, G: 0x8d, B: 0x8d, A: 0xff}, 225 | color.RGBA{R: 0x8e, G: 0x8e, B: 0x8e, A: 0xff}, 226 | color.RGBA{R: 0x8f, G: 0x8f, B: 0x8f, A: 0xff}, 227 | color.RGBA{R: 0x90, G: 0x90, B: 0x90, A: 0xff}, 228 | color.RGBA{R: 0x91, G: 0x91, B: 0x91, A: 0xff}, 229 | color.RGBA{R: 0x93, G: 0x93, B: 0x93, A: 0xff}, 230 | color.RGBA{R: 0x94, G: 0x94, B: 0x94, A: 0xff}, 231 | color.RGBA{R: 0x95, G: 0x95, B: 0x95, A: 0xff}, 232 | color.RGBA{R: 0x96, G: 0x96, B: 0x96, A: 0xff}, 233 | color.RGBA{R: 0x97, G: 0x97, B: 0x97, A: 0xff}, 234 | color.RGBA{R: 0x98, G: 0x98, B: 0x98, A: 0xff}, 235 | color.RGBA{R: 0x99, G: 0x99, B: 0x99, A: 0xff}, 236 | color.RGBA{R: 0x9a, G: 0x9a, B: 0x9a, A: 0xff}, 237 | color.RGBA{R: 0x9b, G: 0x9b, B: 0x9b, A: 0xff}, 238 | color.RGBA{R: 0x9c, G: 0x9c, B: 0x9c, A: 0xff}, 239 | color.RGBA{R: 0x9d, G: 0x9d, B: 0x9d, A: 0xff}, 240 | color.RGBA{R: 0x9e, G: 0x9e, B: 0x9e, A: 0xff}, 241 | color.RGBA{R: 0x9f, G: 0x9f, B: 0x9f, A: 0xff}, 242 | color.RGBA{R: 0xa0, G: 0xa0, B: 0xa0, A: 0xff}, 243 | color.RGBA{R: 0xa0, G: 0xa0, B: 0xa0, A: 0xff}, 244 | color.RGBA{R: 0xa1, G: 0xa1, B: 0xa1, A: 0xff}, 245 | color.RGBA{R: 0xa2, G: 0xa2, B: 0xa2, A: 0xff}, 246 | color.RGBA{R: 0xa3, G: 0xa3, B: 0xa3, A: 0xff}, 247 | color.RGBA{R: 0xa4, G: 0xa4, B: 0xa4, A: 0xff}, 248 | color.RGBA{R: 0xa5, G: 0xa5, B: 0xa5, A: 0xff}, 249 | color.RGBA{R: 0xa6, G: 0xa6, B: 0xa6, A: 0xff}, 250 | color.RGBA{R: 0xa7, G: 0xa7, B: 0xa7, A: 0xff}, 251 | color.RGBA{R: 0xa7, G: 0xa7, B: 0xa7, A: 0xff}, 252 | color.RGBA{R: 0xa8, G: 0xa8, B: 0xa8, A: 0xff}, 253 | color.RGBA{R: 0xa9, G: 0xa9, B: 0xa9, A: 0xff}, 254 | color.RGBA{R: 0xaa, G: 0xaa, B: 0xaa, A: 0xff}, 255 | color.RGBA{R: 0xaa, G: 0xaa, B: 0xaa, A: 0xff}, 256 | color.RGBA{R: 0xab, G: 0xab, B: 0xab, A: 0xff}, 257 | color.RGBA{R: 0xac, G: 0xac, B: 0xac, A: 0xff}, 258 | color.RGBA{R: 0xad, G: 0xad, B: 0xad, A: 0xff}, 259 | color.RGBA{R: 0xad, G: 0xad, B: 0xad, A: 0xff}, 260 | color.RGBA{R: 0xae, G: 0xae, B: 0xae, A: 0xff}, 261 | color.RGBA{R: 0xaf, G: 0xaf, B: 0xaf, A: 0xff}, 262 | color.RGBA{R: 0xaf, G: 0xaf, B: 0xaf, A: 0xff}, 263 | color.RGBA{R: 0xb0, G: 0xb0, B: 0xb0, A: 0xff}, 264 | color.RGBA{R: 0xb0, G: 0xb0, B: 0xb0, A: 0xff}, 265 | color.RGBA{R: 0xb1, G: 0xb1, B: 0xb1, A: 0xff}, 266 | color.RGBA{R: 0xb1, G: 0xb1, B: 0xb1, A: 0xff}, 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /schemes/fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/fire.png -------------------------------------------------------------------------------- /schemes/omg.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // OMG is a gradient color scheme from purple through red to white. 6 | var OMG []color.Color 7 | 8 | func init() { 9 | OMG = []color.Color{ 10 | color.RGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}, 11 | color.RGBA{R: 0xff, G: 0xfe, B: 0xfe, A: 0xff}, 12 | color.RGBA{R: 0xff, G: 0xfd, B: 0xfd, A: 0xff}, 13 | color.RGBA{R: 0xff, G: 0xfb, B: 0xfb, A: 0xff}, 14 | color.RGBA{R: 0xff, G: 0xfa, B: 0xfa, A: 0xff}, 15 | color.RGBA{R: 0xff, G: 0xf9, B: 0xf9, A: 0xff}, 16 | color.RGBA{R: 0xff, G: 0xf7, B: 0xf7, A: 0xff}, 17 | color.RGBA{R: 0xff, G: 0xf6, B: 0xf6, A: 0xff}, 18 | color.RGBA{R: 0xff, G: 0xf4, B: 0xf4, A: 0xff}, 19 | color.RGBA{R: 0xff, G: 0xf2, B: 0xf2, A: 0xff}, 20 | color.RGBA{R: 0xff, G: 0xf1, B: 0xf1, A: 0xff}, 21 | color.RGBA{R: 0xff, G: 0xef, B: 0xef, A: 0xff}, 22 | color.RGBA{R: 0xff, G: 0xed, B: 0xed, A: 0xff}, 23 | color.RGBA{R: 0xff, G: 0xeb, B: 0xeb, A: 0xff}, 24 | color.RGBA{R: 0xff, G: 0xe9, B: 0xe9, A: 0xff}, 25 | color.RGBA{R: 0xff, G: 0xe7, B: 0xe7, A: 0xff}, 26 | color.RGBA{R: 0xff, G: 0xe5, B: 0xe5, A: 0xff}, 27 | color.RGBA{R: 0xff, G: 0xe3, B: 0xe3, A: 0xff}, 28 | color.RGBA{R: 0xff, G: 0xe2, B: 0xe2, A: 0xff}, 29 | color.RGBA{R: 0xff, G: 0xe0, B: 0xe0, A: 0xff}, 30 | color.RGBA{R: 0xff, G: 0xde, B: 0xde, A: 0xff}, 31 | color.RGBA{R: 0xff, G: 0xdc, B: 0xdc, A: 0xff}, 32 | color.RGBA{R: 0xff, G: 0xd9, B: 0xd9, A: 0xff}, 33 | color.RGBA{R: 0xff, G: 0xd7, B: 0xd7, A: 0xff}, 34 | color.RGBA{R: 0xff, G: 0xd5, B: 0xd5, A: 0xff}, 35 | color.RGBA{R: 0xff, G: 0xd2, B: 0xd2, A: 0xff}, 36 | color.RGBA{R: 0xff, G: 0xd0, B: 0xd0, A: 0xff}, 37 | color.RGBA{R: 0xff, G: 0xce, B: 0xce, A: 0xff}, 38 | color.RGBA{R: 0xff, G: 0xcc, B: 0xcc, A: 0xff}, 39 | color.RGBA{R: 0xff, G: 0xca, B: 0xca, A: 0xff}, 40 | color.RGBA{R: 0xff, G: 0xc7, B: 0xc7, A: 0xff}, 41 | color.RGBA{R: 0xff, G: 0xc5, B: 0xc5, A: 0xff}, 42 | color.RGBA{R: 0xff, G: 0xc2, B: 0xc2, A: 0xff}, 43 | color.RGBA{R: 0xff, G: 0xc0, B: 0xc0, A: 0xff}, 44 | color.RGBA{R: 0xff, G: 0xbd, B: 0xbd, A: 0xff}, 45 | color.RGBA{R: 0xff, G: 0xbc, B: 0xbc, A: 0xff}, 46 | color.RGBA{R: 0xff, G: 0xb9, B: 0xb9, A: 0xff}, 47 | color.RGBA{R: 0xff, G: 0xb7, B: 0xb7, A: 0xff}, 48 | color.RGBA{R: 0xff, G: 0xb4, B: 0xb4, A: 0xff}, 49 | color.RGBA{R: 0xff, G: 0xb2, B: 0xb2, A: 0xff}, 50 | color.RGBA{R: 0xff, G: 0xb0, B: 0xb0, A: 0xff}, 51 | color.RGBA{R: 0xff, G: 0xad, B: 0xad, A: 0xff}, 52 | color.RGBA{R: 0xff, G: 0xab, B: 0xab, A: 0xff}, 53 | color.RGBA{R: 0xff, G: 0xa9, B: 0xa9, A: 0xff}, 54 | color.RGBA{R: 0xff, G: 0xa7, B: 0xa7, A: 0xff}, 55 | color.RGBA{R: 0xff, G: 0xa4, B: 0xa4, A: 0xff}, 56 | color.RGBA{R: 0xff, G: 0xa2, B: 0xa2, A: 0xff}, 57 | color.RGBA{R: 0xff, G: 0xa0, B: 0xa0, A: 0xff}, 58 | color.RGBA{R: 0xff, G: 0x9e, B: 0x9e, A: 0xff}, 59 | color.RGBA{R: 0xff, G: 0x9b, B: 0x9b, A: 0xff}, 60 | color.RGBA{R: 0xff, G: 0x99, B: 0x99, A: 0xff}, 61 | color.RGBA{R: 0xff, G: 0x97, B: 0x97, A: 0xff}, 62 | color.RGBA{R: 0xff, G: 0x95, B: 0x95, A: 0xff}, 63 | color.RGBA{R: 0xff, G: 0x93, B: 0x93, A: 0xff}, 64 | color.RGBA{R: 0xff, G: 0x91, B: 0x91, A: 0xff}, 65 | color.RGBA{R: 0xff, G: 0x8f, B: 0x8f, A: 0xff}, 66 | color.RGBA{R: 0xff, G: 0x8d, B: 0x8d, A: 0xff}, 67 | color.RGBA{R: 0xff, G: 0x8b, B: 0x8b, A: 0xff}, 68 | color.RGBA{R: 0xff, G: 0x89, B: 0x89, A: 0xff}, 69 | color.RGBA{R: 0xff, G: 0x88, B: 0x88, A: 0xff}, 70 | color.RGBA{R: 0xff, G: 0x86, B: 0x86, A: 0xff}, 71 | color.RGBA{R: 0xff, G: 0x84, B: 0x84, A: 0xff}, 72 | color.RGBA{R: 0xff, G: 0x83, B: 0x83, A: 0xff}, 73 | color.RGBA{R: 0xff, G: 0x81, B: 0x81, A: 0xff}, 74 | color.RGBA{R: 0xff, G: 0x80, B: 0x80, A: 0xff}, 75 | color.RGBA{R: 0xff, G: 0x7f, B: 0x7f, A: 0xff}, 76 | color.RGBA{R: 0xff, G: 0x7f, B: 0x7f, A: 0xff}, 77 | color.RGBA{R: 0xff, G: 0x7e, B: 0x7e, A: 0xff}, 78 | color.RGBA{R: 0xff, G: 0x7d, B: 0x7d, A: 0xff}, 79 | color.RGBA{R: 0xff, G: 0x7d, B: 0x7d, A: 0xff}, 80 | color.RGBA{R: 0xff, G: 0x7c, B: 0x7c, A: 0xff}, 81 | color.RGBA{R: 0xff, G: 0x7b, B: 0x7a, A: 0xff}, 82 | color.RGBA{R: 0xff, G: 0x7b, B: 0x7a, A: 0xff}, 83 | color.RGBA{R: 0xff, G: 0x7a, B: 0x79, A: 0xff}, 84 | color.RGBA{R: 0xff, G: 0x7a, B: 0x79, A: 0xff}, 85 | color.RGBA{R: 0xff, G: 0x79, B: 0x78, A: 0xff}, 86 | color.RGBA{R: 0xff, G: 0x78, B: 0x77, A: 0xff}, 87 | color.RGBA{R: 0xff, G: 0x77, B: 0x76, A: 0xff}, 88 | color.RGBA{R: 0xff, G: 0x77, B: 0x76, A: 0xff}, 89 | color.RGBA{R: 0xff, G: 0x76, B: 0x74, A: 0xff}, 90 | color.RGBA{R: 0xff, G: 0x75, B: 0x74, A: 0xff}, 91 | color.RGBA{R: 0xff, G: 0x75, B: 0x73, A: 0xff}, 92 | color.RGBA{R: 0xff, G: 0x73, B: 0x72, A: 0xff}, 93 | color.RGBA{R: 0xff, G: 0x73, B: 0x72, A: 0xff}, 94 | color.RGBA{R: 0xff, G: 0x72, B: 0x71, A: 0xff}, 95 | color.RGBA{R: 0xff, G: 0x72, B: 0x70, A: 0xff}, 96 | color.RGBA{R: 0xff, G: 0x71, B: 0x6f, A: 0xff}, 97 | color.RGBA{R: 0xff, G: 0x71, B: 0x6f, A: 0xff}, 98 | color.RGBA{R: 0xff, G: 0x70, B: 0x6e, A: 0xff}, 99 | color.RGBA{R: 0xff, G: 0x6f, B: 0x6c, A: 0xff}, 100 | color.RGBA{R: 0xff, G: 0x6f, B: 0x6c, A: 0xff}, 101 | color.RGBA{R: 0xff, G: 0x6e, B: 0x6b, A: 0xff}, 102 | color.RGBA{R: 0xff, G: 0x6e, B: 0x6b, A: 0xff}, 103 | color.RGBA{R: 0xff, G: 0x6d, B: 0x69, A: 0xff}, 104 | color.RGBA{R: 0xff, G: 0x6d, B: 0x69, A: 0xff}, 105 | color.RGBA{R: 0xff, G: 0x6c, B: 0x68, A: 0xff}, 106 | color.RGBA{R: 0xff, G: 0x6b, B: 0x68, A: 0xff}, 107 | color.RGBA{R: 0xff, G: 0x6b, B: 0x66, A: 0xff}, 108 | color.RGBA{R: 0xff, G: 0x6a, B: 0x66, A: 0xff}, 109 | color.RGBA{R: 0xff, G: 0x6a, B: 0x65, A: 0xff}, 110 | color.RGBA{R: 0xff, G: 0x69, B: 0x65, A: 0xff}, 111 | color.RGBA{R: 0xff, G: 0x68, B: 0x63, A: 0xff}, 112 | color.RGBA{R: 0xff, G: 0x68, B: 0x63, A: 0xff}, 113 | color.RGBA{R: 0xff, G: 0x67, B: 0x62, A: 0xff}, 114 | color.RGBA{R: 0xff, G: 0x67, B: 0x62, A: 0xff}, 115 | color.RGBA{R: 0xff, G: 0x66, B: 0x61, A: 0xff}, 116 | color.RGBA{R: 0xff, G: 0x66, B: 0x60, A: 0xff}, 117 | color.RGBA{R: 0xff, G: 0x65, B: 0x60, A: 0xff}, 118 | color.RGBA{R: 0xff, G: 0x65, B: 0x60, A: 0xff}, 119 | color.RGBA{R: 0xff, G: 0x64, B: 0x5e, A: 0xff}, 120 | color.RGBA{R: 0xff, G: 0x64, B: 0x5e, A: 0xff}, 121 | color.RGBA{R: 0xff, G: 0x63, B: 0x5d, A: 0xff}, 122 | color.RGBA{R: 0xff, G: 0x63, B: 0x5c, A: 0xff}, 123 | color.RGBA{R: 0xff, G: 0x62, B: 0x5b, A: 0xff}, 124 | color.RGBA{R: 0xff, G: 0x62, B: 0x5b, A: 0xff}, 125 | color.RGBA{R: 0xff, G: 0x61, B: 0x5a, A: 0xff}, 126 | color.RGBA{R: 0xff, G: 0x61, B: 0x59, A: 0xff}, 127 | color.RGBA{R: 0xff, G: 0x60, B: 0x59, A: 0xff}, 128 | color.RGBA{R: 0xff, G: 0x60, B: 0x59, A: 0xff}, 129 | color.RGBA{R: 0xff, G: 0x5f, B: 0x58, A: 0xff}, 130 | color.RGBA{R: 0xff, G: 0x5f, B: 0x58, A: 0xff}, 131 | color.RGBA{R: 0xff, G: 0x5e, B: 0x56, A: 0xff}, 132 | color.RGBA{R: 0xff, G: 0x5d, B: 0x56, A: 0xff}, 133 | color.RGBA{R: 0xff, G: 0x5d, B: 0x55, A: 0xff}, 134 | color.RGBA{R: 0xff, G: 0x5d, B: 0x55, A: 0xff}, 135 | color.RGBA{R: 0xff, G: 0x5c, B: 0x55, A: 0xff}, 136 | color.RGBA{R: 0xff, G: 0x5c, B: 0x54, A: 0xff}, 137 | color.RGBA{R: 0xff, G: 0x5b, B: 0x53, A: 0xff}, 138 | color.RGBA{R: 0xff, G: 0x5b, B: 0x53, A: 0xff}, 139 | color.RGBA{R: 0xff, G: 0x5a, B: 0x52, A: 0xff}, 140 | color.RGBA{R: 0xff, G: 0x5a, B: 0x52, A: 0xff}, 141 | color.RGBA{R: 0xff, G: 0x59, B: 0x51, A: 0xff}, 142 | color.RGBA{R: 0xff, G: 0x59, B: 0x52, A: 0xff}, 143 | color.RGBA{R: 0xff, G: 0x59, B: 0x50, A: 0xff}, 144 | color.RGBA{R: 0xff, G: 0x59, B: 0x50, A: 0xff}, 145 | color.RGBA{R: 0xff, G: 0x59, B: 0x4f, A: 0xff}, 146 | color.RGBA{R: 0xff, G: 0x59, B: 0x4f, A: 0xff}, 147 | color.RGBA{R: 0xff, G: 0x58, B: 0x4f, A: 0xff}, 148 | color.RGBA{R: 0xff, G: 0x58, B: 0x4f, A: 0xff}, 149 | color.RGBA{R: 0xff, G: 0x57, B: 0x4e, A: 0xff}, 150 | color.RGBA{R: 0xff, G: 0x57, B: 0x4e, A: 0xff}, 151 | color.RGBA{R: 0xff, G: 0x57, B: 0x4e, A: 0xff}, 152 | color.RGBA{R: 0xff, G: 0x57, B: 0x4d, A: 0xff}, 153 | color.RGBA{R: 0xff, G: 0x57, B: 0x4d, A: 0xff}, 154 | color.RGBA{R: 0xff, G: 0x56, B: 0x4d, A: 0xff}, 155 | color.RGBA{R: 0xff, G: 0x56, B: 0x4d, A: 0xff}, 156 | color.RGBA{R: 0xff, G: 0x55, B: 0x4c, A: 0xff}, 157 | color.RGBA{R: 0xff, G: 0x55, B: 0x4c, A: 0xff}, 158 | color.RGBA{R: 0xff, G: 0x55, B: 0x4b, A: 0xff}, 159 | color.RGBA{R: 0xff, G: 0x55, B: 0x4c, A: 0xff}, 160 | color.RGBA{R: 0xff, G: 0x55, B: 0x4b, A: 0xff}, 161 | color.RGBA{R: 0xff, G: 0x55, B: 0x4c, A: 0xff}, 162 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 163 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 164 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 165 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 166 | color.RGBA{R: 0xff, G: 0x55, B: 0x4b, A: 0xff}, 167 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 168 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 169 | color.RGBA{R: 0xff, G: 0x53, B: 0x4a, A: 0xff}, 170 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 171 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 172 | color.RGBA{R: 0xff, G: 0x54, B: 0x4b, A: 0xff}, 173 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 174 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 175 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 176 | color.RGBA{R: 0xff, G: 0x53, B: 0x4b, A: 0xff}, 177 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 178 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 179 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 180 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 181 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 182 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 183 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 184 | color.RGBA{R: 0xff, G: 0x53, B: 0x4c, A: 0xff}, 185 | color.RGBA{R: 0xff, G: 0x53, B: 0x4d, A: 0xff}, 186 | color.RGBA{R: 0xff, G: 0x54, B: 0x4e, A: 0xff}, 187 | color.RGBA{R: 0xff, G: 0x53, B: 0x4e, A: 0xff}, 188 | color.RGBA{R: 0xff, G: 0x54, B: 0x4f, A: 0xff}, 189 | color.RGBA{R: 0xff, G: 0x54, B: 0x4e, A: 0xff}, 190 | color.RGBA{R: 0xff, G: 0x54, B: 0x4f, A: 0xff}, 191 | color.RGBA{R: 0xff, G: 0x53, B: 0x4f, A: 0xff}, 192 | color.RGBA{R: 0xff, G: 0x54, B: 0x50, A: 0xff}, 193 | color.RGBA{R: 0xff, G: 0x53, B: 0x50, A: 0xff}, 194 | color.RGBA{R: 0xff, G: 0x54, B: 0x51, A: 0xff}, 195 | color.RGBA{R: 0xff, G: 0x55, B: 0x52, A: 0xff}, 196 | color.RGBA{R: 0xff, G: 0x55, B: 0x52, A: 0xff}, 197 | color.RGBA{R: 0xff, G: 0x55, B: 0x53, A: 0xff}, 198 | color.RGBA{R: 0xff, G: 0x55, B: 0x53, A: 0xff}, 199 | color.RGBA{R: 0xff, G: 0x55, B: 0x54, A: 0xff}, 200 | color.RGBA{R: 0xff, G: 0x55, B: 0x54, A: 0xff}, 201 | color.RGBA{R: 0xff, G: 0x56, B: 0x55, A: 0xff}, 202 | color.RGBA{R: 0xff, G: 0x56, B: 0x55, A: 0xff}, 203 | color.RGBA{R: 0xff, G: 0x57, B: 0x57, A: 0xff}, 204 | color.RGBA{R: 0xfe, G: 0x59, B: 0x59, A: 0xff}, 205 | color.RGBA{R: 0xfe, G: 0x5b, B: 0x5c, A: 0xff}, 206 | color.RGBA{R: 0xfd, G: 0x5c, B: 0x5d, A: 0xff}, 207 | color.RGBA{R: 0xfc, G: 0x5e, B: 0x60, A: 0xff}, 208 | color.RGBA{R: 0xfb, G: 0x60, B: 0x62, A: 0xff}, 209 | color.RGBA{R: 0xfb, G: 0x61, B: 0x64, A: 0xff}, 210 | color.RGBA{R: 0xf9, G: 0x63, B: 0x67, A: 0xff}, 211 | color.RGBA{R: 0xf9, G: 0x64, B: 0x69, A: 0xff}, 212 | color.RGBA{R: 0xf8, G: 0x66, B: 0x6c, A: 0xff}, 213 | color.RGBA{R: 0xf7, G: 0x68, B: 0x6f, A: 0xff}, 214 | color.RGBA{R: 0xf6, G: 0x69, B: 0x71, A: 0xff}, 215 | color.RGBA{R: 0xf5, G: 0x6b, B: 0x74, A: 0xff}, 216 | color.RGBA{R: 0xf4, G: 0x6d, B: 0x77, A: 0xff}, 217 | color.RGBA{R: 0xf3, G: 0x6e, B: 0x7a, A: 0xff}, 218 | color.RGBA{R: 0xf2, G: 0x70, B: 0x7d, A: 0xff}, 219 | color.RGBA{R: 0xf1, G: 0x71, B: 0x7f, A: 0xff}, 220 | color.RGBA{R: 0xf0, G: 0x73, B: 0x82, A: 0xff}, 221 | color.RGBA{R: 0xef, G: 0x75, B: 0x86, A: 0xff}, 222 | color.RGBA{R: 0xee, G: 0x76, B: 0x88, A: 0xff}, 223 | color.RGBA{R: 0xed, G: 0x78, B: 0x8c, A: 0xff}, 224 | color.RGBA{R: 0xec, G: 0x79, B: 0x8e, A: 0xff}, 225 | color.RGBA{R: 0xeb, G: 0x7b, B: 0x91, A: 0xff}, 226 | color.RGBA{R: 0xea, G: 0x7c, B: 0x94, A: 0xff}, 227 | color.RGBA{R: 0xe9, G: 0x7e, B: 0x97, A: 0xff}, 228 | color.RGBA{R: 0xe8, G: 0x7f, B: 0x9a, A: 0xff}, 229 | color.RGBA{R: 0xe8, G: 0x81, B: 0x9d, A: 0xff}, 230 | color.RGBA{R: 0xe6, G: 0x82, B: 0x9f, A: 0xff}, 231 | color.RGBA{R: 0xe6, G: 0x84, B: 0xa2, A: 0xff}, 232 | color.RGBA{R: 0xe5, G: 0x85, B: 0xa5, A: 0xff}, 233 | color.RGBA{R: 0xe4, G: 0x87, B: 0xa8, A: 0xff}, 234 | color.RGBA{R: 0xe3, G: 0x88, B: 0xaa, A: 0xff}, 235 | color.RGBA{R: 0xe3, G: 0x8a, B: 0xad, A: 0xff}, 236 | color.RGBA{R: 0xe2, G: 0x8b, B: 0xb0, A: 0xff}, 237 | color.RGBA{R: 0xe1, G: 0x8c, B: 0xb2, A: 0xff}, 238 | color.RGBA{R: 0xe0, G: 0x8e, B: 0xb5, A: 0xff}, 239 | color.RGBA{R: 0xdf, G: 0x8f, B: 0xb7, A: 0xff}, 240 | color.RGBA{R: 0xdf, G: 0x90, B: 0xb9, A: 0xff}, 241 | color.RGBA{R: 0xdf, G: 0x92, B: 0xbc, A: 0xff}, 242 | color.RGBA{R: 0xde, G: 0x93, B: 0xbe, A: 0xff}, 243 | color.RGBA{R: 0xdd, G: 0x94, B: 0xc0, A: 0xff}, 244 | color.RGBA{R: 0xdd, G: 0x96, B: 0xc3, A: 0xff}, 245 | color.RGBA{R: 0xdc, G: 0x97, B: 0xc5, A: 0xff}, 246 | color.RGBA{R: 0xdb, G: 0x98, B: 0xc7, A: 0xff}, 247 | color.RGBA{R: 0xdb, G: 0x99, B: 0xc9, A: 0xff}, 248 | color.RGBA{R: 0xdb, G: 0x9a, B: 0xca, A: 0xff}, 249 | color.RGBA{R: 0xdb, G: 0x9c, B: 0xcd, A: 0xff}, 250 | color.RGBA{R: 0xda, G: 0x9d, B: 0xcf, A: 0xff}, 251 | color.RGBA{R: 0xd9, G: 0x9e, B: 0xd0, A: 0xff}, 252 | color.RGBA{R: 0xd9, G: 0x9f, B: 0xd2, A: 0xff}, 253 | color.RGBA{R: 0xd9, G: 0xa0, B: 0xd3, A: 0xff}, 254 | color.RGBA{R: 0xd9, G: 0xa1, B: 0xd5, A: 0xff}, 255 | color.RGBA{R: 0xd8, G: 0xa2, B: 0xd6, A: 0xff}, 256 | color.RGBA{R: 0xd8, G: 0xa3, B: 0xd8, A: 0xff}, 257 | color.RGBA{R: 0xd8, G: 0xa4, B: 0xd9, A: 0xff}, 258 | color.RGBA{R: 0xd7, G: 0xa5, B: 0xda, A: 0xff}, 259 | color.RGBA{R: 0xd8, G: 0xa6, B: 0xdb, A: 0xff}, 260 | color.RGBA{R: 0xd7, G: 0xa6, B: 0xdc, A: 0xff}, 261 | color.RGBA{R: 0xd7, G: 0xa7, B: 0xde, A: 0xff}, 262 | color.RGBA{R: 0xd7, G: 0xa8, B: 0xdf, A: 0xff}, 263 | color.RGBA{R: 0xd7, G: 0xa9, B: 0xdf, A: 0xff}, 264 | color.RGBA{R: 0xd7, G: 0xaa, B: 0xe0, A: 0xff}, 265 | color.RGBA{R: 0xd7, G: 0xaa, B: 0xe1, A: 0xff}, 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /schemes/omg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/omg.png -------------------------------------------------------------------------------- /schemes/pbj.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // PBJ is a gradient color scheme from orange to purple. 6 | var PBJ []color.Color 7 | 8 | func init() { 9 | PBJ = []color.Color{ 10 | color.RGBA{R: 0x29, G: 0xa, B: 0x59, A: 0xff}, 11 | color.RGBA{R: 0x29, G: 0xa, B: 0x59, A: 0xff}, 12 | color.RGBA{R: 0x2a, G: 0xa, B: 0x59, A: 0xff}, 13 | color.RGBA{R: 0x2a, G: 0xa, B: 0x59, A: 0xff}, 14 | color.RGBA{R: 0x2a, G: 0xa, B: 0x58, A: 0xff}, 15 | color.RGBA{R: 0x2b, G: 0xa, B: 0x58, A: 0xff}, 16 | color.RGBA{R: 0x2b, G: 0x9, B: 0x58, A: 0xff}, 17 | color.RGBA{R: 0x2b, G: 0x9, B: 0x58, A: 0xff}, 18 | color.RGBA{R: 0x2c, G: 0x9, B: 0x58, A: 0xff}, 19 | color.RGBA{R: 0x2c, G: 0x9, B: 0x58, A: 0xff}, 20 | color.RGBA{R: 0x2d, G: 0xa, B: 0x59, A: 0xff}, 21 | color.RGBA{R: 0x2e, G: 0xa, B: 0x58, A: 0xff}, 22 | color.RGBA{R: 0x2e, G: 0x9, B: 0x58, A: 0xff}, 23 | color.RGBA{R: 0x2f, G: 0x9, B: 0x58, A: 0xff}, 24 | color.RGBA{R: 0x2f, G: 0x9, B: 0x58, A: 0xff}, 25 | color.RGBA{R: 0x2f, G: 0x9, B: 0x58, A: 0xff}, 26 | color.RGBA{R: 0x30, G: 0x8, B: 0x58, A: 0xff}, 27 | color.RGBA{R: 0x30, G: 0x8, B: 0x57, A: 0xff}, 28 | color.RGBA{R: 0x31, G: 0x8, B: 0x57, A: 0xff}, 29 | color.RGBA{R: 0x31, G: 0x8, B: 0x57, A: 0xff}, 30 | color.RGBA{R: 0x31, G: 0x7, B: 0x57, A: 0xff}, 31 | color.RGBA{R: 0x32, G: 0x7, B: 0x57, A: 0xff}, 32 | color.RGBA{R: 0x32, G: 0x7, B: 0x57, A: 0xff}, 33 | color.RGBA{R: 0x33, G: 0x7, B: 0x56, A: 0xff}, 34 | color.RGBA{R: 0x33, G: 0x6, B: 0x56, A: 0xff}, 35 | color.RGBA{R: 0x35, G: 0x7, B: 0x56, A: 0xff}, 36 | color.RGBA{R: 0x35, G: 0x7, B: 0x56, A: 0xff}, 37 | color.RGBA{R: 0x36, G: 0x7, B: 0x56, A: 0xff}, 38 | color.RGBA{R: 0x36, G: 0x6, B: 0x55, A: 0xff}, 39 | color.RGBA{R: 0x37, G: 0x6, B: 0x55, A: 0xff}, 40 | color.RGBA{R: 0x37, G: 0x6, B: 0x55, A: 0xff}, 41 | color.RGBA{R: 0x38, G: 0x5, B: 0x55, A: 0xff}, 42 | color.RGBA{R: 0x38, G: 0x5, B: 0x55, A: 0xff}, 43 | color.RGBA{R: 0x39, G: 0x5, B: 0x54, A: 0xff}, 44 | color.RGBA{R: 0x39, G: 0x5, B: 0x54, A: 0xff}, 45 | color.RGBA{R: 0x3a, G: 0x4, B: 0x54, A: 0xff}, 46 | color.RGBA{R: 0x3b, G: 0x4, B: 0x54, A: 0xff}, 47 | color.RGBA{R: 0x3b, G: 0x5, B: 0x54, A: 0xff}, 48 | color.RGBA{R: 0x3c, G: 0x4, B: 0x54, A: 0xff}, 49 | color.RGBA{R: 0x3c, G: 0x4, B: 0x54, A: 0xff}, 50 | color.RGBA{R: 0x3d, G: 0x4, B: 0x54, A: 0xff}, 51 | color.RGBA{R: 0x3d, G: 0x4, B: 0x53, A: 0xff}, 52 | color.RGBA{R: 0x3e, G: 0x3, B: 0x53, A: 0xff}, 53 | color.RGBA{R: 0x3f, G: 0x3, B: 0x53, A: 0xff}, 54 | color.RGBA{R: 0x3f, G: 0x3, B: 0x53, A: 0xff}, 55 | color.RGBA{R: 0x40, G: 0x3, B: 0x52, A: 0xff}, 56 | color.RGBA{R: 0x40, G: 0x3, B: 0x52, A: 0xff}, 57 | color.RGBA{R: 0x41, G: 0x3, B: 0x52, A: 0xff}, 58 | color.RGBA{R: 0x42, G: 0x3, B: 0x52, A: 0xff}, 59 | color.RGBA{R: 0x43, G: 0x4, B: 0x52, A: 0xff}, 60 | color.RGBA{R: 0x44, G: 0x4, B: 0x52, A: 0xff}, 61 | color.RGBA{R: 0x45, G: 0x4, B: 0x52, A: 0xff}, 62 | color.RGBA{R: 0x45, G: 0x4, B: 0x51, A: 0xff}, 63 | color.RGBA{R: 0x46, G: 0x4, B: 0x51, A: 0xff}, 64 | color.RGBA{R: 0x47, G: 0x4, B: 0x51, A: 0xff}, 65 | color.RGBA{R: 0x47, G: 0x4, B: 0x50, A: 0xff}, 66 | color.RGBA{R: 0x48, G: 0x4, B: 0x50, A: 0xff}, 67 | color.RGBA{R: 0x49, G: 0x4, B: 0x50, A: 0xff}, 68 | color.RGBA{R: 0x49, G: 0x4, B: 0x4f, A: 0xff}, 69 | color.RGBA{R: 0x4b, G: 0x5, B: 0x50, A: 0xff}, 70 | color.RGBA{R: 0x4c, G: 0x5, B: 0x50, A: 0xff}, 71 | color.RGBA{R: 0x4d, G: 0x5, B: 0x4f, A: 0xff}, 72 | color.RGBA{R: 0x4d, G: 0x5, B: 0x4f, A: 0xff}, 73 | color.RGBA{R: 0x4e, G: 0x5, B: 0x4f, A: 0xff}, 74 | color.RGBA{R: 0x4f, G: 0x5, B: 0x4e, A: 0xff}, 75 | color.RGBA{R: 0x50, G: 0x5, B: 0x4e, A: 0xff}, 76 | color.RGBA{R: 0x50, G: 0x5, B: 0x4e, A: 0xff}, 77 | color.RGBA{R: 0x50, G: 0x5, B: 0x4d, A: 0xff}, 78 | color.RGBA{R: 0x51, G: 0x5, B: 0x4d, A: 0xff}, 79 | color.RGBA{R: 0x53, G: 0x6, B: 0x4c, A: 0xff}, 80 | color.RGBA{R: 0x53, G: 0x6, B: 0x4c, A: 0xff}, 81 | color.RGBA{R: 0x54, G: 0x6, B: 0x4c, A: 0xff}, 82 | color.RGBA{R: 0x55, G: 0x6, B: 0x4b, A: 0xff}, 83 | color.RGBA{R: 0x56, G: 0x6, B: 0x4b, A: 0xff}, 84 | color.RGBA{R: 0x57, G: 0x6, B: 0x4a, A: 0xff}, 85 | color.RGBA{R: 0x58, G: 0x6, B: 0x4a, A: 0xff}, 86 | color.RGBA{R: 0x58, G: 0x6, B: 0x49, A: 0xff}, 87 | color.RGBA{R: 0x59, G: 0x6, B: 0x49, A: 0xff}, 88 | color.RGBA{R: 0x5b, G: 0x7, B: 0x49, A: 0xff}, 89 | color.RGBA{R: 0x5c, G: 0x7, B: 0x49, A: 0xff}, 90 | color.RGBA{R: 0x5d, G: 0x7, B: 0x48, A: 0xff}, 91 | color.RGBA{R: 0x5e, G: 0x7, B: 0x48, A: 0xff}, 92 | color.RGBA{R: 0x5e, G: 0x7, B: 0x47, A: 0xff}, 93 | color.RGBA{R: 0x5f, G: 0x7, B: 0x47, A: 0xff}, 94 | color.RGBA{R: 0x60, G: 0x7, B: 0x46, A: 0xff}, 95 | color.RGBA{R: 0x60, G: 0x7, B: 0x46, A: 0xff}, 96 | color.RGBA{R: 0x61, G: 0x7, B: 0x45, A: 0xff}, 97 | color.RGBA{R: 0x63, G: 0x9, B: 0x46, A: 0xff}, 98 | color.RGBA{R: 0x64, G: 0x9, B: 0x45, A: 0xff}, 99 | color.RGBA{R: 0x65, G: 0xa, B: 0x45, A: 0xff}, 100 | color.RGBA{R: 0x66, G: 0xa, B: 0x44, A: 0xff}, 101 | color.RGBA{R: 0x67, G: 0xb, B: 0x43, A: 0xff}, 102 | color.RGBA{R: 0x68, G: 0xb, B: 0x43, A: 0xff}, 103 | color.RGBA{R: 0x69, G: 0xc, B: 0x42, A: 0xff}, 104 | color.RGBA{R: 0x6a, G: 0xd, B: 0x42, A: 0xff}, 105 | color.RGBA{R: 0x6b, G: 0xe, B: 0x42, A: 0xff}, 106 | color.RGBA{R: 0x6c, G: 0xf, B: 0x41, A: 0xff}, 107 | color.RGBA{R: 0x6d, G: 0x10, B: 0x40, A: 0xff}, 108 | color.RGBA{R: 0x6e, G: 0x10, B: 0x40, A: 0xff}, 109 | color.RGBA{R: 0x6f, G: 0x11, B: 0x3f, A: 0xff}, 110 | color.RGBA{R: 0x70, G: 0x12, B: 0x3e, A: 0xff}, 111 | color.RGBA{R: 0x71, G: 0x12, B: 0x3d, A: 0xff}, 112 | color.RGBA{R: 0x72, G: 0x13, B: 0x3d, A: 0xff}, 113 | color.RGBA{R: 0x73, G: 0x14, B: 0x3c, A: 0xff}, 114 | color.RGBA{R: 0x76, G: 0x16, B: 0x3c, A: 0xff}, 115 | color.RGBA{R: 0x77, G: 0x16, B: 0x3b, A: 0xff}, 116 | color.RGBA{R: 0x78, G: 0x16, B: 0x3a, A: 0xff}, 117 | color.RGBA{R: 0x78, G: 0x17, B: 0x3a, A: 0xff}, 118 | color.RGBA{R: 0x79, G: 0x18, B: 0x39, A: 0xff}, 119 | color.RGBA{R: 0x7a, G: 0x19, B: 0x38, A: 0xff}, 120 | color.RGBA{R: 0x7c, G: 0x1a, B: 0x37, A: 0xff}, 121 | color.RGBA{R: 0x7d, G: 0x1b, B: 0x36, A: 0xff}, 122 | color.RGBA{R: 0x7f, G: 0x1d, B: 0x36, A: 0xff}, 123 | color.RGBA{R: 0x80, G: 0x1e, B: 0x36, A: 0xff}, 124 | color.RGBA{R: 0x82, G: 0x1f, B: 0x35, A: 0xff}, 125 | color.RGBA{R: 0x83, G: 0x20, B: 0x34, A: 0xff}, 126 | color.RGBA{R: 0x84, G: 0x21, B: 0x33, A: 0xff}, 127 | color.RGBA{R: 0x85, G: 0x22, B: 0x32, A: 0xff}, 128 | color.RGBA{R: 0x86, G: 0x23, B: 0x31, A: 0xff}, 129 | color.RGBA{R: 0x87, G: 0x24, B: 0x30, A: 0xff}, 130 | color.RGBA{R: 0x89, G: 0x26, B: 0x30, A: 0xff}, 131 | color.RGBA{R: 0x8a, G: 0x27, B: 0x2f, A: 0xff}, 132 | color.RGBA{R: 0x8c, G: 0x28, B: 0x2e, A: 0xff}, 133 | color.RGBA{R: 0x8d, G: 0x29, B: 0x2e, A: 0xff}, 134 | color.RGBA{R: 0x8e, G: 0x2a, B: 0x2d, A: 0xff}, 135 | color.RGBA{R: 0x8f, G: 0x2a, B: 0x2c, A: 0xff}, 136 | color.RGBA{R: 0x90, G: 0x2b, B: 0x2b, A: 0xff}, 137 | color.RGBA{R: 0x91, G: 0x2c, B: 0x2a, A: 0xff}, 138 | color.RGBA{R: 0x92, G: 0x2d, B: 0x2a, A: 0xff}, 139 | color.RGBA{R: 0x95, G: 0x2f, B: 0x29, A: 0xff}, 140 | color.RGBA{R: 0x96, G: 0x30, B: 0x29, A: 0xff}, 141 | color.RGBA{R: 0x97, G: 0x31, B: 0x28, A: 0xff}, 142 | color.RGBA{R: 0x98, G: 0x32, B: 0x27, A: 0xff}, 143 | color.RGBA{R: 0x99, G: 0x33, B: 0x26, A: 0xff}, 144 | color.RGBA{R: 0x9a, G: 0x34, B: 0x26, A: 0xff}, 145 | color.RGBA{R: 0x9b, G: 0x35, B: 0x25, A: 0xff}, 146 | color.RGBA{R: 0x9d, G: 0x37, B: 0x24, A: 0xff}, 147 | color.RGBA{R: 0x9f, G: 0x39, B: 0x24, A: 0xff}, 148 | color.RGBA{R: 0xa0, G: 0x39, B: 0x23, A: 0xff}, 149 | color.RGBA{R: 0xa0, G: 0x3a, B: 0x22, A: 0xff}, 150 | color.RGBA{R: 0xa2, G: 0x3b, B: 0x21, A: 0xff}, 151 | color.RGBA{R: 0xa3, G: 0x3c, B: 0x21, A: 0xff}, 152 | color.RGBA{R: 0xa4, G: 0x3d, B: 0x20, A: 0xff}, 153 | color.RGBA{R: 0xa5, G: 0x3e, B: 0x1f, A: 0xff}, 154 | color.RGBA{R: 0xa7, G: 0x3f, B: 0x1e, A: 0xff}, 155 | color.RGBA{R: 0xa8, G: 0x41, B: 0x1e, A: 0xff}, 156 | color.RGBA{R: 0xa9, G: 0x42, B: 0x1d, A: 0xff}, 157 | color.RGBA{R: 0xaa, G: 0x43, B: 0x1d, A: 0xff}, 158 | color.RGBA{R: 0xac, G: 0x44, B: 0x1c, A: 0xff}, 159 | color.RGBA{R: 0xad, G: 0x45, B: 0x1b, A: 0xff}, 160 | color.RGBA{R: 0xae, G: 0x46, B: 0x1a, A: 0xff}, 161 | color.RGBA{R: 0xaf, G: 0x47, B: 0x1a, A: 0xff}, 162 | color.RGBA{R: 0xb0, G: 0x47, B: 0x19, A: 0xff}, 163 | color.RGBA{R: 0xb2, G: 0x49, B: 0x19, A: 0xff}, 164 | color.RGBA{R: 0xb3, G: 0x4a, B: 0x18, A: 0xff}, 165 | color.RGBA{R: 0xb4, G: 0x4b, B: 0x18, A: 0xff}, 166 | color.RGBA{R: 0xb5, G: 0x4c, B: 0x17, A: 0xff}, 167 | color.RGBA{R: 0xb6, G: 0x4d, B: 0x17, A: 0xff}, 168 | color.RGBA{R: 0xb7, G: 0x4e, B: 0x17, A: 0xff}, 169 | color.RGBA{R: 0xb8, G: 0x4f, B: 0x16, A: 0xff}, 170 | color.RGBA{R: 0xba, G: 0x50, B: 0x16, A: 0xff}, 171 | color.RGBA{R: 0xbb, G: 0x51, B: 0x15, A: 0xff}, 172 | color.RGBA{R: 0xbc, G: 0x52, B: 0x15, A: 0xff}, 173 | color.RGBA{R: 0xbd, G: 0x53, B: 0x15, A: 0xff}, 174 | color.RGBA{R: 0xbe, G: 0x53, B: 0x14, A: 0xff}, 175 | color.RGBA{R: 0xbf, G: 0x54, B: 0x14, A: 0xff}, 176 | color.RGBA{R: 0xc0, G: 0x55, B: 0x13, A: 0xff}, 177 | color.RGBA{R: 0xc0, G: 0x56, B: 0x13, A: 0xff}, 178 | color.RGBA{R: 0xc1, G: 0x57, B: 0x12, A: 0xff}, 179 | color.RGBA{R: 0xc2, G: 0x57, B: 0x12, A: 0xff}, 180 | color.RGBA{R: 0xc4, G: 0x59, B: 0x12, A: 0xff}, 181 | color.RGBA{R: 0xc4, G: 0x5a, B: 0x12, A: 0xff}, 182 | color.RGBA{R: 0xc5, G: 0x5a, B: 0x12, A: 0xff}, 183 | color.RGBA{R: 0xc6, G: 0x5a, B: 0x12, A: 0xff}, 184 | color.RGBA{R: 0xc7, G: 0x5b, B: 0x12, A: 0xff}, 185 | color.RGBA{R: 0xc8, G: 0x5c, B: 0x12, A: 0xff}, 186 | color.RGBA{R: 0xc9, G: 0x5d, B: 0x12, A: 0xff}, 187 | color.RGBA{R: 0xca, G: 0x5d, B: 0x12, A: 0xff}, 188 | color.RGBA{R: 0xcb, G: 0x5e, B: 0x12, A: 0xff}, 189 | color.RGBA{R: 0xcc, G: 0x60, B: 0x13, A: 0xff}, 190 | color.RGBA{R: 0xcc, G: 0x60, B: 0x13, A: 0xff}, 191 | color.RGBA{R: 0xcd, G: 0x61, B: 0x13, A: 0xff}, 192 | color.RGBA{R: 0xce, G: 0x62, B: 0x13, A: 0xff}, 193 | color.RGBA{R: 0xcf, G: 0x63, B: 0x13, A: 0xff}, 194 | color.RGBA{R: 0xd0, G: 0x63, B: 0x13, A: 0xff}, 195 | color.RGBA{R: 0xd1, G: 0x64, B: 0x13, A: 0xff}, 196 | color.RGBA{R: 0xd2, G: 0x64, B: 0x13, A: 0xff}, 197 | color.RGBA{R: 0xd3, G: 0x64, B: 0x13, A: 0xff}, 198 | color.RGBA{R: 0xd4, G: 0x66, B: 0x14, A: 0xff}, 199 | color.RGBA{R: 0xd5, G: 0x67, B: 0x14, A: 0xff}, 200 | color.RGBA{R: 0xd6, G: 0x67, B: 0x14, A: 0xff}, 201 | color.RGBA{R: 0xd6, G: 0x68, B: 0x14, A: 0xff}, 202 | color.RGBA{R: 0xd7, G: 0x69, B: 0x14, A: 0xff}, 203 | color.RGBA{R: 0xd7, G: 0x69, B: 0x14, A: 0xff}, 204 | color.RGBA{R: 0xd8, G: 0x6a, B: 0x14, A: 0xff}, 205 | color.RGBA{R: 0xd9, G: 0x6b, B: 0x14, A: 0xff}, 206 | color.RGBA{R: 0xda, G: 0x6b, B: 0x14, A: 0xff}, 207 | color.RGBA{R: 0xdb, G: 0x6c, B: 0x14, A: 0xff}, 208 | color.RGBA{R: 0xdc, G: 0x6d, B: 0x15, A: 0xff}, 209 | color.RGBA{R: 0xdd, G: 0x6d, B: 0x15, A: 0xff}, 210 | color.RGBA{R: 0xde, G: 0x6e, B: 0x15, A: 0xff}, 211 | color.RGBA{R: 0xde, G: 0x6f, B: 0x15, A: 0xff}, 212 | color.RGBA{R: 0xdf, G: 0x6f, B: 0x15, A: 0xff}, 213 | color.RGBA{R: 0xe0, G: 0x70, B: 0x15, A: 0xff}, 214 | color.RGBA{R: 0xe1, G: 0x71, B: 0x15, A: 0xff}, 215 | color.RGBA{R: 0xe2, G: 0x71, B: 0x15, A: 0xff}, 216 | color.RGBA{R: 0xe3, G: 0x72, B: 0x15, A: 0xff}, 217 | color.RGBA{R: 0xe3, G: 0x72, B: 0x15, A: 0xff}, 218 | color.RGBA{R: 0xe4, G: 0x73, B: 0x16, A: 0xff}, 219 | color.RGBA{R: 0xe5, G: 0x74, B: 0x16, A: 0xff}, 220 | color.RGBA{R: 0xe5, G: 0x74, B: 0x16, A: 0xff}, 221 | color.RGBA{R: 0xe6, G: 0x75, B: 0x16, A: 0xff}, 222 | color.RGBA{R: 0xe7, G: 0x75, B: 0x16, A: 0xff}, 223 | color.RGBA{R: 0xe7, G: 0x76, B: 0x16, A: 0xff}, 224 | color.RGBA{R: 0xe8, G: 0x77, B: 0x16, A: 0xff}, 225 | color.RGBA{R: 0xe9, G: 0x77, B: 0x16, A: 0xff}, 226 | color.RGBA{R: 0xea, G: 0x78, B: 0x16, A: 0xff}, 227 | color.RGBA{R: 0xea, G: 0x78, B: 0x16, A: 0xff}, 228 | color.RGBA{R: 0xeb, G: 0x79, B: 0x16, A: 0xff}, 229 | color.RGBA{R: 0xec, G: 0x79, B: 0x16, A: 0xff}, 230 | color.RGBA{R: 0xed, G: 0x7a, B: 0x17, A: 0xff}, 231 | color.RGBA{R: 0xed, G: 0x7a, B: 0x17, A: 0xff}, 232 | color.RGBA{R: 0xee, G: 0x7b, B: 0x17, A: 0xff}, 233 | color.RGBA{R: 0xef, G: 0x7c, B: 0x17, A: 0xff}, 234 | color.RGBA{R: 0xef, G: 0x7c, B: 0x17, A: 0xff}, 235 | color.RGBA{R: 0xf0, G: 0x7d, B: 0x17, A: 0xff}, 236 | color.RGBA{R: 0xf0, G: 0x7d, B: 0x17, A: 0xff}, 237 | color.RGBA{R: 0xf1, G: 0x7e, B: 0x17, A: 0xff}, 238 | color.RGBA{R: 0xf1, G: 0x7e, B: 0x17, A: 0xff}, 239 | color.RGBA{R: 0xf2, G: 0x7f, B: 0x17, A: 0xff}, 240 | color.RGBA{R: 0xf3, G: 0x7f, B: 0x17, A: 0xff}, 241 | color.RGBA{R: 0xf3, G: 0x80, B: 0x17, A: 0xff}, 242 | color.RGBA{R: 0xf4, G: 0x80, B: 0x18, A: 0xff}, 243 | color.RGBA{R: 0xf4, G: 0x80, B: 0x18, A: 0xff}, 244 | color.RGBA{R: 0xf5, G: 0x81, B: 0x18, A: 0xff}, 245 | color.RGBA{R: 0xf6, G: 0x81, B: 0x18, A: 0xff}, 246 | color.RGBA{R: 0xf6, G: 0x82, B: 0x18, A: 0xff}, 247 | color.RGBA{R: 0xf7, G: 0x82, B: 0x18, A: 0xff}, 248 | color.RGBA{R: 0xf7, G: 0x83, B: 0x18, A: 0xff}, 249 | color.RGBA{R: 0xf8, G: 0x83, B: 0x18, A: 0xff}, 250 | color.RGBA{R: 0xf9, G: 0x83, B: 0x18, A: 0xff}, 251 | color.RGBA{R: 0xf9, G: 0x84, B: 0x18, A: 0xff}, 252 | color.RGBA{R: 0xfa, G: 0x84, B: 0x18, A: 0xff}, 253 | color.RGBA{R: 0xfa, G: 0x85, B: 0x18, A: 0xff}, 254 | color.RGBA{R: 0xfa, G: 0x85, B: 0x18, A: 0xff}, 255 | color.RGBA{R: 0xfa, G: 0x85, B: 0x18, A: 0xff}, 256 | color.RGBA{R: 0xfb, G: 0x86, B: 0x18, A: 0xff}, 257 | color.RGBA{R: 0xfb, G: 0x86, B: 0x19, A: 0xff}, 258 | color.RGBA{R: 0xfc, G: 0x87, B: 0x19, A: 0xff}, 259 | color.RGBA{R: 0xfc, G: 0x87, B: 0x19, A: 0xff}, 260 | color.RGBA{R: 0xfd, G: 0x87, B: 0x19, A: 0xff}, 261 | color.RGBA{R: 0xfd, G: 0x88, B: 0x19, A: 0xff}, 262 | color.RGBA{R: 0xfd, G: 0x88, B: 0x19, A: 0xff}, 263 | color.RGBA{R: 0xfe, G: 0x88, B: 0x19, A: 0xff}, 264 | color.RGBA{R: 0xfe, G: 0x88, B: 0x19, A: 0xff}, 265 | color.RGBA{R: 0xff, G: 0x89, B: 0x19, A: 0xff}, 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /schemes/pbj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/pbj.png -------------------------------------------------------------------------------- /schemes/pgaitch.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import "image/color" 4 | 5 | // PGAitch is a gradient color scheme from a dismal dark to a bright 6 | // yellow. 7 | var PGAitch []color.Color 8 | 9 | func init() { 10 | PGAitch = []color.Color{ 11 | color.RGBA{R: 0xff, G: 0xfe, B: 0xa5, A: 0xff}, 12 | color.RGBA{R: 0xff, G: 0xfe, B: 0xa4, A: 0xff}, 13 | color.RGBA{R: 0xff, G: 0xfd, B: 0xa3, A: 0xff}, 14 | color.RGBA{R: 0xff, G: 0xfd, B: 0xa2, A: 0xff}, 15 | color.RGBA{R: 0xff, G: 0xfd, B: 0xa1, A: 0xff}, 16 | color.RGBA{R: 0xff, G: 0xfc, B: 0xa0, A: 0xff}, 17 | color.RGBA{R: 0xff, G: 0xfc, B: 0x9f, A: 0xff}, 18 | color.RGBA{R: 0xff, G: 0xfc, B: 0x9d, A: 0xff}, 19 | color.RGBA{R: 0xff, G: 0xfb, B: 0x9c, A: 0xff}, 20 | color.RGBA{R: 0xff, G: 0xfb, B: 0x9b, A: 0xff}, 21 | color.RGBA{R: 0xff, G: 0xfb, B: 0x99, A: 0xff}, 22 | color.RGBA{R: 0xff, G: 0xfa, B: 0x98, A: 0xff}, 23 | color.RGBA{R: 0xff, G: 0xfa, B: 0x96, A: 0xff}, 24 | color.RGBA{R: 0xff, G: 0xfa, B: 0x95, A: 0xff}, 25 | color.RGBA{R: 0xff, G: 0xf9, B: 0x94, A: 0xff}, 26 | color.RGBA{R: 0xff, G: 0xf9, B: 0x92, A: 0xff}, 27 | color.RGBA{R: 0xff, G: 0xf9, B: 0x91, A: 0xff}, 28 | color.RGBA{R: 0xff, G: 0xf8, B: 0x8f, A: 0xff}, 29 | color.RGBA{R: 0xff, G: 0xf8, B: 0x8d, A: 0xff}, 30 | color.RGBA{R: 0xff, G: 0xf8, B: 0x8b, A: 0xff}, 31 | color.RGBA{R: 0xff, G: 0xf7, B: 0x8a, A: 0xff}, 32 | color.RGBA{R: 0xff, G: 0xf7, B: 0x88, A: 0xff}, 33 | color.RGBA{R: 0xff, G: 0xf6, B: 0x86, A: 0xff}, 34 | color.RGBA{R: 0xff, G: 0xf6, B: 0x84, A: 0xff}, 35 | color.RGBA{R: 0xff, G: 0xf6, B: 0x82, A: 0xff}, 36 | color.RGBA{R: 0xff, G: 0xf5, B: 0x81, A: 0xff}, 37 | color.RGBA{R: 0xff, G: 0xf5, B: 0x7f, A: 0xff}, 38 | color.RGBA{R: 0xff, G: 0xf5, B: 0x7d, A: 0xff}, 39 | color.RGBA{R: 0xff, G: 0xf4, B: 0x7b, A: 0xff}, 40 | color.RGBA{R: 0xff, G: 0xf4, B: 0x79, A: 0xff}, 41 | color.RGBA{R: 0xff, G: 0xf3, B: 0x77, A: 0xff}, 42 | color.RGBA{R: 0xff, G: 0xf3, B: 0x75, A: 0xff}, 43 | color.RGBA{R: 0xff, G: 0xf2, B: 0x72, A: 0xff}, 44 | color.RGBA{R: 0xff, G: 0xf2, B: 0x70, A: 0xff}, 45 | color.RGBA{R: 0xff, G: 0xf1, B: 0x6f, A: 0xff}, 46 | color.RGBA{R: 0xff, G: 0xf1, B: 0x6d, A: 0xff}, 47 | color.RGBA{R: 0xff, G: 0xf0, B: 0x6b, A: 0xff}, 48 | color.RGBA{R: 0xff, G: 0xf0, B: 0x69, A: 0xff}, 49 | color.RGBA{R: 0xff, G: 0xef, B: 0x66, A: 0xff}, 50 | color.RGBA{R: 0xff, G: 0xef, B: 0x64, A: 0xff}, 51 | color.RGBA{R: 0xff, G: 0xee, B: 0x63, A: 0xff}, 52 | color.RGBA{R: 0xff, G: 0xee, B: 0x61, A: 0xff}, 53 | color.RGBA{R: 0xff, G: 0xed, B: 0x5f, A: 0xff}, 54 | color.RGBA{R: 0xff, G: 0xed, B: 0x5c, A: 0xff}, 55 | color.RGBA{R: 0xff, G: 0xec, B: 0x5a, A: 0xff}, 56 | color.RGBA{R: 0xff, G: 0xed, B: 0x59, A: 0xff}, 57 | color.RGBA{R: 0xff, G: 0xec, B: 0x57, A: 0xff}, 58 | color.RGBA{R: 0xff, G: 0xeb, B: 0x54, A: 0xff}, 59 | color.RGBA{R: 0xff, G: 0xeb, B: 0x52, A: 0xff}, 60 | color.RGBA{R: 0xff, G: 0xea, B: 0x50, A: 0xff}, 61 | color.RGBA{R: 0xff, G: 0xe9, B: 0x4f, A: 0xff}, 62 | color.RGBA{R: 0xff, G: 0xe9, B: 0x4d, A: 0xff}, 63 | color.RGBA{R: 0xff, G: 0xe8, B: 0x4a, A: 0xff}, 64 | color.RGBA{R: 0xff, G: 0xe7, B: 0x48, A: 0xff}, 65 | color.RGBA{R: 0xff, G: 0xe6, B: 0x46, A: 0xff}, 66 | color.RGBA{R: 0xff, G: 0xe6, B: 0x45, A: 0xff}, 67 | color.RGBA{R: 0xff, G: 0xe5, B: 0x43, A: 0xff}, 68 | color.RGBA{R: 0xff, G: 0xe4, B: 0x41, A: 0xff}, 69 | color.RGBA{R: 0xff, G: 0xe3, B: 0x3f, A: 0xff}, 70 | color.RGBA{R: 0xff, G: 0xe2, B: 0x3d, A: 0xff}, 71 | color.RGBA{R: 0xff, G: 0xe1, B: 0x3c, A: 0xff}, 72 | color.RGBA{R: 0xff, G: 0xe1, B: 0x3a, A: 0xff}, 73 | color.RGBA{R: 0xff, G: 0xe0, B: 0x38, A: 0xff}, 74 | color.RGBA{R: 0xff, G: 0xdf, B: 0x36, A: 0xff}, 75 | color.RGBA{R: 0xff, G: 0xde, B: 0x34, A: 0xff}, 76 | color.RGBA{R: 0xff, G: 0xde, B: 0x33, A: 0xff}, 77 | color.RGBA{R: 0xff, G: 0xdd, B: 0x31, A: 0xff}, 78 | color.RGBA{R: 0xff, G: 0xdc, B: 0x2f, A: 0xff}, 79 | color.RGBA{R: 0xff, G: 0xdb, B: 0x2e, A: 0xff}, 80 | color.RGBA{R: 0xff, G: 0xda, B: 0x2c, A: 0xff}, 81 | color.RGBA{R: 0xff, G: 0xd8, B: 0x2b, A: 0xff}, 82 | color.RGBA{R: 0xff, G: 0xd7, B: 0x2a, A: 0xff}, 83 | color.RGBA{R: 0xff, G: 0xd6, B: 0x29, A: 0xff}, 84 | color.RGBA{R: 0xff, G: 0xd5, B: 0x27, A: 0xff}, 85 | color.RGBA{R: 0xff, G: 0xd4, B: 0x27, A: 0xff}, 86 | color.RGBA{R: 0xff, G: 0xd3, B: 0x25, A: 0xff}, 87 | color.RGBA{R: 0xff, G: 0xd1, B: 0x24, A: 0xff}, 88 | color.RGBA{R: 0xff, G: 0xd0, B: 0x22, A: 0xff}, 89 | color.RGBA{R: 0xff, G: 0xd0, B: 0x21, A: 0xff}, 90 | color.RGBA{R: 0xff, G: 0xce, B: 0x21, A: 0xff}, 91 | color.RGBA{R: 0xff, G: 0xcd, B: 0x20, A: 0xff}, 92 | color.RGBA{R: 0xff, G: 0xcc, B: 0x1e, A: 0xff}, 93 | color.RGBA{R: 0xff, G: 0xca, B: 0x1d, A: 0xff}, 94 | color.RGBA{R: 0xff, G: 0xc9, B: 0x1d, A: 0xff}, 95 | color.RGBA{R: 0xff, G: 0xc7, B: 0x1c, A: 0xff}, 96 | color.RGBA{R: 0xfe, G: 0xc7, B: 0x1c, A: 0xff}, 97 | color.RGBA{R: 0xfe, G: 0xc7, B: 0x1b, A: 0xff}, 98 | color.RGBA{R: 0xfd, G: 0xc6, B: 0x1b, A: 0xff}, 99 | color.RGBA{R: 0xfc, G: 0xc5, B: 0x1b, A: 0xff}, 100 | color.RGBA{R: 0xfb, G: 0xc4, B: 0x1b, A: 0xff}, 101 | color.RGBA{R: 0xfa, G: 0xc3, B: 0x1a, A: 0xff}, 102 | color.RGBA{R: 0xf9, G: 0xc3, B: 0x1a, A: 0xff}, 103 | color.RGBA{R: 0xf8, G: 0xc2, B: 0x1a, A: 0xff}, 104 | color.RGBA{R: 0xf8, G: 0xc1, B: 0x1a, A: 0xff}, 105 | color.RGBA{R: 0xf7, G: 0xc0, B: 0x1a, A: 0xff}, 106 | color.RGBA{R: 0xf6, G: 0xc0, B: 0x19, A: 0xff}, 107 | color.RGBA{R: 0xf5, G: 0xbf, B: 0x1a, A: 0xff}, 108 | color.RGBA{R: 0xf4, G: 0xbe, B: 0x1a, A: 0xff}, 109 | color.RGBA{R: 0xf3, G: 0xbd, B: 0x19, A: 0xff}, 110 | color.RGBA{R: 0xf1, G: 0xbc, B: 0x19, A: 0xff}, 111 | color.RGBA{R: 0xf0, G: 0xbb, B: 0x19, A: 0xff}, 112 | color.RGBA{R: 0xef, G: 0xbb, B: 0x19, A: 0xff}, 113 | color.RGBA{R: 0xee, G: 0xba, B: 0x19, A: 0xff}, 114 | color.RGBA{R: 0xec, G: 0xb9, B: 0x19, A: 0xff}, 115 | color.RGBA{R: 0xec, G: 0xb8, B: 0x1a, A: 0xff}, 116 | color.RGBA{R: 0xeb, G: 0xb7, B: 0x1a, A: 0xff}, 117 | color.RGBA{R: 0xe9, G: 0xb6, B: 0x19, A: 0xff}, 118 | color.RGBA{R: 0xe8, G: 0xb5, B: 0x19, A: 0xff}, 119 | color.RGBA{R: 0xe6, G: 0xb5, B: 0x1a, A: 0xff}, 120 | color.RGBA{R: 0xe5, G: 0xb4, B: 0x1a, A: 0xff}, 121 | color.RGBA{R: 0xe4, G: 0xb3, B: 0x19, A: 0xff}, 122 | color.RGBA{R: 0xe3, G: 0xb2, B: 0x19, A: 0xff}, 123 | color.RGBA{R: 0xe2, G: 0xb1, B: 0x1a, A: 0xff}, 124 | color.RGBA{R: 0xe0, G: 0xb0, B: 0x1a, A: 0xff}, 125 | color.RGBA{R: 0xde, G: 0xb0, B: 0x19, A: 0xff}, 126 | color.RGBA{R: 0xdd, G: 0xaf, B: 0x19, A: 0xff}, 127 | color.RGBA{R: 0xdc, G: 0xad, B: 0x1a, A: 0xff}, 128 | color.RGBA{R: 0xdb, G: 0xac, B: 0x1a, A: 0xff}, 129 | color.RGBA{R: 0xd9, G: 0xab, B: 0x19, A: 0xff}, 130 | color.RGBA{R: 0xd7, G: 0xaa, B: 0x19, A: 0xff}, 131 | color.RGBA{R: 0xd6, G: 0xaa, B: 0x1a, A: 0xff}, 132 | color.RGBA{R: 0xd4, G: 0xa9, B: 0x1a, A: 0xff}, 133 | color.RGBA{R: 0xd3, G: 0xa7, B: 0x19, A: 0xff}, 134 | color.RGBA{R: 0xd1, G: 0xa6, B: 0x19, A: 0xff}, 135 | color.RGBA{R: 0xd0, G: 0xa6, B: 0x1a, A: 0xff}, 136 | color.RGBA{R: 0xce, G: 0xa5, B: 0x1a, A: 0xff}, 137 | color.RGBA{R: 0xcc, G: 0xa3, B: 0x1a, A: 0xff}, 138 | color.RGBA{R: 0xcb, G: 0xa2, B: 0x1a, A: 0xff}, 139 | color.RGBA{R: 0xca, G: 0xa1, B: 0x19, A: 0xff}, 140 | color.RGBA{R: 0xc8, G: 0xa1, B: 0x1a, A: 0xff}, 141 | color.RGBA{R: 0xc6, G: 0x9f, B: 0x1a, A: 0xff}, 142 | color.RGBA{R: 0xc5, G: 0x9e, B: 0x1a, A: 0xff}, 143 | color.RGBA{R: 0xc3, G: 0x9d, B: 0x1a, A: 0xff}, 144 | color.RGBA{R: 0xc1, G: 0x9d, B: 0x1b, A: 0xff}, 145 | color.RGBA{R: 0xc0, G: 0x9b, B: 0x1b, A: 0xff}, 146 | color.RGBA{R: 0xbe, G: 0x9a, B: 0x1b, A: 0xff}, 147 | color.RGBA{R: 0xbd, G: 0x99, B: 0x1b, A: 0xff}, 148 | color.RGBA{R: 0xbb, G: 0x98, B: 0x1c, A: 0xff}, 149 | color.RGBA{R: 0xba, G: 0x97, B: 0x1c, A: 0xff}, 150 | color.RGBA{R: 0xb8, G: 0x96, B: 0x1c, A: 0xff}, 151 | color.RGBA{R: 0xb6, G: 0x95, B: 0x1c, A: 0xff}, 152 | color.RGBA{R: 0xb5, G: 0x94, B: 0x1d, A: 0xff}, 153 | color.RGBA{R: 0xb3, G: 0x93, B: 0x1d, A: 0xff}, 154 | color.RGBA{R: 0xb1, G: 0x92, B: 0x1d, A: 0xff}, 155 | color.RGBA{R: 0xaf, G: 0x90, B: 0x1d, A: 0xff}, 156 | color.RGBA{R: 0xae, G: 0x90, B: 0x1e, A: 0xff}, 157 | color.RGBA{R: 0xac, G: 0x8e, B: 0x1e, A: 0xff}, 158 | color.RGBA{R: 0xaa, G: 0x8d, B: 0x1e, A: 0xff}, 159 | color.RGBA{R: 0xa9, G: 0x8c, B: 0x1e, A: 0xff}, 160 | color.RGBA{R: 0xa7, G: 0x8b, B: 0x1f, A: 0xff}, 161 | color.RGBA{R: 0xa5, G: 0x8a, B: 0x1f, A: 0xff}, 162 | color.RGBA{R: 0xa4, G: 0x89, B: 0x1f, A: 0xff}, 163 | color.RGBA{R: 0xa2, G: 0x88, B: 0x1f, A: 0xff}, 164 | color.RGBA{R: 0xa1, G: 0x87, B: 0x20, A: 0xff}, 165 | color.RGBA{R: 0x9f, G: 0x86, B: 0x20, A: 0xff}, 166 | color.RGBA{R: 0x9d, G: 0x85, B: 0x20, A: 0xff}, 167 | color.RGBA{R: 0x9a, G: 0x84, B: 0x20, A: 0xff}, 168 | color.RGBA{R: 0x99, G: 0x83, B: 0x21, A: 0xff}, 169 | color.RGBA{R: 0x97, G: 0x82, B: 0x21, A: 0xff}, 170 | color.RGBA{R: 0x96, G: 0x81, B: 0x21, A: 0xff}, 171 | color.RGBA{R: 0x94, G: 0x7f, B: 0x21, A: 0xff}, 172 | color.RGBA{R: 0x93, G: 0x7f, B: 0x22, A: 0xff}, 173 | color.RGBA{R: 0x91, G: 0x7e, B: 0x22, A: 0xff}, 174 | color.RGBA{R: 0x8f, G: 0x7c, B: 0x22, A: 0xff}, 175 | color.RGBA{R: 0x8d, G: 0x7b, B: 0x22, A: 0xff}, 176 | color.RGBA{R: 0x8c, G: 0x7a, B: 0x23, A: 0xff}, 177 | color.RGBA{R: 0x8b, G: 0x79, B: 0x23, A: 0xff}, 178 | color.RGBA{R: 0x89, G: 0x78, B: 0x23, A: 0xff}, 179 | color.RGBA{R: 0x87, G: 0x77, B: 0x23, A: 0xff}, 180 | color.RGBA{R: 0x86, G: 0x76, B: 0x24, A: 0xff}, 181 | color.RGBA{R: 0x84, G: 0x75, B: 0x24, A: 0xff}, 182 | color.RGBA{R: 0x82, G: 0x74, B: 0x24, A: 0xff}, 183 | color.RGBA{R: 0x81, G: 0x73, B: 0x24, A: 0xff}, 184 | color.RGBA{R: 0x7f, G: 0x71, B: 0x24, A: 0xff}, 185 | color.RGBA{R: 0x7e, G: 0x71, B: 0x25, A: 0xff}, 186 | color.RGBA{R: 0x7c, G: 0x70, B: 0x25, A: 0xff}, 187 | color.RGBA{R: 0x7a, G: 0x6f, B: 0x25, A: 0xff}, 188 | color.RGBA{R: 0x79, G: 0x6e, B: 0x25, A: 0xff}, 189 | color.RGBA{R: 0x78, G: 0x6d, B: 0x26, A: 0xff}, 190 | color.RGBA{R: 0x76, G: 0x6c, B: 0x26, A: 0xff}, 191 | color.RGBA{R: 0x74, G: 0x6b, B: 0x26, A: 0xff}, 192 | color.RGBA{R: 0x73, G: 0x69, B: 0x26, A: 0xff}, 193 | color.RGBA{R: 0x71, G: 0x68, B: 0x26, A: 0xff}, 194 | color.RGBA{R: 0x70, G: 0x68, B: 0x27, A: 0xff}, 195 | color.RGBA{R: 0x6e, G: 0x67, B: 0x27, A: 0xff}, 196 | color.RGBA{R: 0x6c, G: 0x66, B: 0x27, A: 0xff}, 197 | color.RGBA{R: 0x6b, G: 0x65, B: 0x27, A: 0xff}, 198 | color.RGBA{R: 0x6a, G: 0x64, B: 0x28, A: 0xff}, 199 | color.RGBA{R: 0x68, G: 0x63, B: 0x28, A: 0xff}, 200 | color.RGBA{R: 0x66, G: 0x62, B: 0x28, A: 0xff}, 201 | color.RGBA{R: 0x65, G: 0x60, B: 0x28, A: 0xff}, 202 | color.RGBA{R: 0x63, G: 0x60, B: 0x28, A: 0xff}, 203 | color.RGBA{R: 0x63, G: 0x60, B: 0x29, A: 0xff}, 204 | color.RGBA{R: 0x61, G: 0x5e, B: 0x29, A: 0xff}, 205 | color.RGBA{R: 0x60, G: 0x5d, B: 0x29, A: 0xff}, 206 | color.RGBA{R: 0x5e, G: 0x5c, B: 0x29, A: 0xff}, 207 | color.RGBA{R: 0x5c, G: 0x5b, B: 0x29, A: 0xff}, 208 | color.RGBA{R: 0x5c, G: 0x5a, B: 0x2a, A: 0xff}, 209 | color.RGBA{R: 0x5a, G: 0x5a, B: 0x2a, A: 0xff}, 210 | color.RGBA{R: 0x59, G: 0x59, B: 0x2a, A: 0xff}, 211 | color.RGBA{R: 0x57, G: 0x57, B: 0x2a, A: 0xff}, 212 | color.RGBA{R: 0x56, G: 0x56, B: 0x2a, A: 0xff}, 213 | color.RGBA{R: 0x55, G: 0x56, B: 0x2b, A: 0xff}, 214 | color.RGBA{R: 0x54, G: 0x55, B: 0x2b, A: 0xff}, 215 | color.RGBA{R: 0x53, G: 0x54, B: 0x2b, A: 0xff}, 216 | color.RGBA{R: 0x51, G: 0x53, B: 0x2b, A: 0xff}, 217 | color.RGBA{R: 0x50, G: 0x52, B: 0x2b, A: 0xff}, 218 | color.RGBA{R: 0x50, G: 0x52, B: 0x2c, A: 0xff}, 219 | color.RGBA{R: 0x4e, G: 0x50, B: 0x2c, A: 0xff}, 220 | color.RGBA{R: 0x4d, G: 0x50, B: 0x2c, A: 0xff}, 221 | color.RGBA{R: 0x4b, G: 0x4f, B: 0x2c, A: 0xff}, 222 | color.RGBA{R: 0x4b, G: 0x4e, B: 0x2c, A: 0xff}, 223 | color.RGBA{R: 0x4a, G: 0x4e, B: 0x2d, A: 0xff}, 224 | color.RGBA{R: 0x49, G: 0x4c, B: 0x2d, A: 0xff}, 225 | color.RGBA{R: 0x47, G: 0x4b, B: 0x2d, A: 0xff}, 226 | color.RGBA{R: 0x47, G: 0x4b, B: 0x2d, A: 0xff}, 227 | color.RGBA{R: 0x46, G: 0x4a, B: 0x2d, A: 0xff}, 228 | color.RGBA{R: 0x45, G: 0x4a, B: 0x2e, A: 0xff}, 229 | color.RGBA{R: 0x44, G: 0x49, B: 0x2e, A: 0xff}, 230 | color.RGBA{R: 0x43, G: 0x48, B: 0x2e, A: 0xff}, 231 | color.RGBA{R: 0x42, G: 0x47, B: 0x2e, A: 0xff}, 232 | color.RGBA{R: 0x41, G: 0x47, B: 0x2e, A: 0xff}, 233 | color.RGBA{R: 0x40, G: 0x45, B: 0x2e, A: 0xff}, 234 | color.RGBA{R: 0x40, G: 0x45, B: 0x2f, A: 0xff}, 235 | color.RGBA{R: 0x3f, G: 0x44, B: 0x2f, A: 0xff}, 236 | color.RGBA{R: 0x3e, G: 0x43, B: 0x2f, A: 0xff}, 237 | color.RGBA{R: 0x3d, G: 0x43, B: 0x2f, A: 0xff}, 238 | color.RGBA{R: 0x3c, G: 0x42, B: 0x2f, A: 0xff}, 239 | color.RGBA{R: 0x3b, G: 0x41, B: 0x2f, A: 0xff}, 240 | color.RGBA{R: 0x3b, G: 0x41, B: 0x30, A: 0xff}, 241 | color.RGBA{R: 0x3b, G: 0x40, B: 0x30, A: 0xff}, 242 | color.RGBA{R: 0x3a, G: 0x3f, B: 0x30, A: 0xff}, 243 | color.RGBA{R: 0x39, G: 0x3f, B: 0x30, A: 0xff}, 244 | color.RGBA{R: 0x38, G: 0x3e, B: 0x30, A: 0xff}, 245 | color.RGBA{R: 0x38, G: 0x3e, B: 0x30, A: 0xff}, 246 | color.RGBA{R: 0x37, G: 0x3d, B: 0x30, A: 0xff}, 247 | color.RGBA{R: 0x37, G: 0x3d, B: 0x31, A: 0xff}, 248 | color.RGBA{R: 0x37, G: 0x3c, B: 0x31, A: 0xff}, 249 | color.RGBA{R: 0x37, G: 0x3c, B: 0x31, A: 0xff}, 250 | color.RGBA{R: 0x36, G: 0x3b, B: 0x31, A: 0xff}, 251 | color.RGBA{R: 0x35, G: 0x3a, B: 0x31, A: 0xff}, 252 | color.RGBA{R: 0x35, G: 0x39, B: 0x31, A: 0xff}, 253 | color.RGBA{R: 0x34, G: 0x39, B: 0x31, A: 0xff}, 254 | color.RGBA{R: 0x34, G: 0x39, B: 0x32, A: 0xff}, 255 | color.RGBA{R: 0x34, G: 0x38, B: 0x32, A: 0xff}, 256 | color.RGBA{R: 0x34, G: 0x38, B: 0x32, A: 0xff}, 257 | color.RGBA{R: 0x34, G: 0x38, B: 0x32, A: 0xff}, 258 | color.RGBA{R: 0x34, G: 0x37, B: 0x32, A: 0xff}, 259 | color.RGBA{R: 0x33, G: 0x36, B: 0x32, A: 0xff}, 260 | color.RGBA{R: 0x33, G: 0x35, B: 0x32, A: 0xff}, 261 | color.RGBA{R: 0x33, G: 0x35, B: 0x32, A: 0xff}, 262 | color.RGBA{R: 0x33, G: 0x34, B: 0x32, A: 0xff}, 263 | color.RGBA{R: 0x33, G: 0x35, B: 0x33, A: 0xff}, 264 | color.RGBA{R: 0x33, G: 0x35, B: 0x33, A: 0xff}, 265 | color.RGBA{R: 0x33, G: 0x34, B: 0x33, A: 0xff}, 266 | color.RGBA{R: 0x33, G: 0x34, B: 0x33, A: 0xff}, 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /schemes/pgaitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dustin/go-heatmap/b89dbd73785a2348b5e0558f719f27a826987ceb/schemes/pgaitch.png -------------------------------------------------------------------------------- /schemes/scheme_test.go: -------------------------------------------------------------------------------- 1 | package schemes 2 | 3 | import ( 4 | "image/color" 5 | "reflect" 6 | "testing" 7 | ) 8 | 9 | func TestFromImage(t *testing.T) { 10 | colors, err := FromImage("nonexistent.png") 11 | if err == nil { 12 | t.Errorf("Expected failure on nonexistent flie, got %v", colors) 13 | } 14 | colors, err = FromImage("classic.go") 15 | if err == nil { 16 | t.Errorf("Expected failure on classic.go, got %v", colors) 17 | } 18 | 19 | colors, err = FromImage("classic.png") 20 | if err != nil { 21 | t.Fatalf("Failed loading classic.png: %v", err) 22 | } 23 | if !reflect.DeepEqual(colors, Classic) { 24 | t.Errorf("Got %v, wanted %v", colors, Classic) 25 | } 26 | } 27 | 28 | func TestBuild(t *testing.T) { 29 | colors := Build(SchemeSpec{ 30 | SchemeRange{ 31 | From: color.NRGBA{255, 0, 0, 255}, 32 | To: color.NRGBA{0, 255, 0, 255}, 33 | Steps: 10, 34 | }, 35 | SchemeRange{ 36 | From: color.NRGBA{0, 255, 0, 255}, 37 | To: color.NRGBA{0, 0, 255, 255}, 38 | Steps: 10, 39 | }}) 40 | 41 | exp := []color.Color{ 42 | mycolor{R: 65535, G: 0, B: 0, A: 65535}, 43 | mycolor{R: 58981.5, G: 6553.5, B: 0, A: 65535}, 44 | mycolor{R: 52428, G: 13107, B: 0, A: 65535}, 45 | mycolor{R: 45874.5, G: 19660.5, B: 0, A: 65535}, 46 | mycolor{R: 39321, G: 26214, B: 0, A: 65535}, 47 | mycolor{R: 32767.5, G: 32767.5, B: 0, A: 65535}, 48 | mycolor{R: 26214, G: 39321, B: 0, A: 65535}, 49 | mycolor{R: 19660.5, G: 45874.5, B: 0, A: 65535}, 50 | mycolor{R: 13107, G: 52428, B: 0, A: 65535}, 51 | mycolor{R: 6553.5, G: 58981.5, B: 0, A: 65535}, 52 | 53 | mycolor{R: 0, G: 65535, B: 0, A: 65535}, 54 | mycolor{R: 0, G: 58981.5, B: 6553.5, A: 65535}, 55 | mycolor{R: 0, G: 52428, B: 13107, A: 65535}, 56 | mycolor{R: 0, G: 45874.5, B: 19660.5, A: 65535}, 57 | mycolor{R: 0, G: 39321, B: 26214, A: 65535}, 58 | mycolor{R: 0, G: 32767.5, B: 32767.5, A: 65535}, 59 | mycolor{R: 0, G: 26214, B: 39321, A: 65535}, 60 | mycolor{R: 0, G: 19660.5, B: 45874.5, A: 65535}, 61 | mycolor{R: 0, G: 13107, B: 52428, A: 65535}, 62 | mycolor{R: 0, G: 6553.5, B: 58981.5, A: 65535}} 63 | 64 | if !reflect.DeepEqual(colors, exp) { 65 | t.Errorf("Got %v, wanted %v", colors, exp) 66 | } 67 | } 68 | 69 | func TestColorRGBA(t *testing.T) { 70 | c := mycolor{0x1fff, 0x1fff, 0x1fff, 0xffff} 71 | r, g, b, a := c.RGBA() 72 | for g, w := range map[uint32]uint32{r: 0x1f1f, g: 0x1f1f, b: 0x1f1f, a: 0xffff} { 73 | if g != w { 74 | t.Errorf("Expected %x, got %x", w, g) 75 | } 76 | } 77 | } 78 | 79 | func TestSchemeSpec(t *testing.T) { 80 | ss := SchemeSpec{ 81 | SchemeRange{ 82 | From: color.NRGBA{255, 0, 0, 255}, 83 | To: color.NRGBA{0, 255, 0, 255}, 84 | Steps: 256, 85 | }} 86 | 87 | if ss.ColorModel() != color.NRGBAModel { 88 | t.Errorf("Expected NRGBAModel, got %v", ss.ColorModel()) 89 | } 90 | 91 | bounds := ss.Bounds() 92 | if bounds.Size().X != 32 { 93 | t.Errorf("Expected width of 32, got %v", bounds.Size().X) 94 | } 95 | if bounds.Size().Y != 256 { 96 | t.Errorf("Expected width of 256, got %v", bounds.Size().Y) 97 | } 98 | 99 | r1, g1, b1, a1 := ss.At(0, 0).RGBA() 100 | if r1 != 65535 || g1 != 0 || b1 != 0 || a1 != 65535 { 101 | t.Errorf("Expected rgb1 == 65535, 0, 0, 65535, got %v %v %v %v", r1, g1, b1, a1) 102 | } 103 | 104 | r2, g2, b2, a2 := ss.At(31, 255).RGBA() 105 | if r2 != 0 || g2 != 65278 || b2 != 0 || a2 != 65535 { 106 | t.Errorf("Expected rgb2 == 65278, 0, 0, 65535, got %v %v %v %v", r2, g2, b2, a2) 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /schemes/schemes.go: -------------------------------------------------------------------------------- 1 | // Package schemes provides standard color schemes from gheat. 2 | // 3 | // These color schemes were converted from the pngs from gheat are made 4 | // available for your convenience. 5 | package schemes 6 | 7 | import ( 8 | "image" 9 | "image/color" 10 | _ "image/gif" // image format side effect 11 | _ "image/jpeg" // image format side effect 12 | _ "image/png" // image format side effect 13 | "os" 14 | ) 15 | 16 | // FromImage creates a color scheme from an image. 17 | // The image should have all of the colors you want to use arranged vertically 18 | // with the "coldest" on the bottom and the "hottest" on the top. 19 | func FromImage(filename string) ([]color.Color, error) { 20 | f, err := os.Open(filename) 21 | if err != nil { 22 | return nil, err 23 | } 24 | defer f.Close() 25 | 26 | img, _, err := image.Decode(f) 27 | if err != nil { 28 | return nil, err 29 | } 30 | 31 | rv := []color.Color{} 32 | bounds := img.Bounds() 33 | for y := bounds.Min.Y; y < bounds.Max.Y; y++ { 34 | rv = append(rv, img.At(0, y)) 35 | } 36 | return rv, nil 37 | } 38 | 39 | type mycolor struct { 40 | R float64 41 | G float64 42 | B float64 43 | A float64 44 | } 45 | 46 | var _ = color.Color(mycolor{}) 47 | 48 | func (c mycolor) RGBA() (R, G, B, A uint32) { 49 | // My colors aren't pre-multiplied, so I've got to convert 50 | // myself to an NRGBA, then an RGBA, then expand. 51 | 52 | return color.RGBAModel.Convert(color.NRGBA{ 53 | uint8(c.R / 256.0), 54 | uint8(c.G / 256.0), 55 | uint8(c.B / 256.0), 56 | uint8(c.A / 256.0), 57 | }).RGBA() 58 | } 59 | 60 | // Build generates a heatmap color scheme smoothly across the given 61 | // scheme ranges. 62 | func Build(spec SchemeSpec) []color.Color { 63 | rv := []color.Color{} 64 | 65 | for _, r := range spec { 66 | fr, fg, fb, fa := floatRGBA(r.From) 67 | tr, tg, tb, ta := floatRGBA(r.To) 68 | 69 | rd := (tr - fr) / float64(r.Steps) 70 | gd := (tg - fg) / float64(r.Steps) 71 | bd := (tb - fb) / float64(r.Steps) 72 | ad := (ta - fa) / float64(r.Steps) 73 | 74 | for x := 0; x < r.Steps; x++ { 75 | rv = append(rv, mycolor{fr, fg, fb, fa}) 76 | 77 | fr += rd 78 | fg += gd 79 | fb += bd 80 | fa += ad 81 | } 82 | } 83 | 84 | return rv 85 | } 86 | 87 | func floatRGBA(c color.Color) (r, g, b, a float64) { 88 | ir, ig, ib, ia := color.NRGBAModel.Convert(c).RGBA() 89 | return float64(ir), float64(ig), float64(ib), float64(ia) 90 | } 91 | 92 | // A SchemeRange is a color range for computing a scheme. 93 | type SchemeRange struct { 94 | // The starting color for this range 95 | From color.Color 96 | // The ending color for this range 97 | To color.Color 98 | // The number of colors to which this range should expand 99 | Steps int 100 | } 101 | 102 | // A SchemeSpec is a color generator specification. 103 | // 104 | // Basically, this is just a bunch of start/stop points and colors 105 | // along a range. 106 | type SchemeSpec []SchemeRange 107 | 108 | // ColorModel satisfies the image.Image interface. 109 | func (ss SchemeSpec) ColorModel() color.Model { 110 | return color.NRGBAModel 111 | } 112 | 113 | // Bounds satisfies the image.Image interface. 114 | func (ss SchemeSpec) Bounds() image.Rectangle { 115 | return image.Rect(0, 0, 32, 256) 116 | } 117 | 118 | // At satisfies the image.Image interface. 119 | func (ss SchemeSpec) At(x, y int) color.Color { 120 | // This is the ridiculously slow version. 121 | return Build(ss)[y] 122 | } 123 | 124 | var _ = image.Image(SchemeSpec{}) 125 | --------------------------------------------------------------------------------