Sort transparent colors from colors.txt to front of lookup table. Makes it easier

to determine if a color index corresponds to a transparent color.
This commit is contained in:
Sascha L. Teichmann 2014-10-19 11:43:53 +02:00
parent e4baf66fb9
commit 1c530a2ce7

View File

@ -9,12 +9,33 @@ import (
"fmt" "fmt"
"image/color" "image/color"
"os" "os"
"sort"
"strings" "strings"
) )
type Colors struct { type Colors struct {
Colors []color.RGBA Colors []color.RGBA
NameIndex map[string]int32 NameIndex map[string]int32
Transparent int
}
type namedColor struct {
name string
color color.RGBA
}
type sortByAlpha []namedColor
func (colors sortByAlpha) Less(i, j int) bool {
return colors[i].color.A < colors[j].color.A
}
func (colors sortByAlpha) Len() int {
return len(colors)
}
func (colors sortByAlpha) Swap(i, j int) {
colors[i], colors[j] = colors[j], colors[i]
} }
func ParseColors(filename string) (colors *Colors, err error) { func ParseColors(filename string) (colors *Colors, err error) {
@ -25,8 +46,7 @@ func ParseColors(filename string) (colors *Colors, err error) {
} }
defer file.Close() defer file.Close()
nameIndex := make(map[string]int32) cols := make([]namedColor, 0, 2200)
cols := make([]color.RGBA, 0, 2200)
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
for scanner.Scan() { for scanner.Scan() {
@ -38,12 +58,26 @@ func ParseColors(filename string) (colors *Colors, err error) {
var name string var name string
if n, _ := fmt.Sscanf( if n, _ := fmt.Sscanf(
line, "%s %d %d %d %d", &name, &c.R, &c.G, &c.B, &c.A); n > 0 { line, "%s %d %d %d %d", &name, &c.R, &c.G, &c.B, &c.A); n > 0 {
idx := int32(len(cols)) cols = append(cols, namedColor{name: name, color: c})
cols = append(cols, c)
nameIndex[name] = idx
} }
} }
err = scanner.Err() err = scanner.Err()
colors = &Colors{Colors: cols, NameIndex: nameIndex}
// Sort transparent colors to front. Makes it easier to figure out
// if an index corresponds to a transparent color (i < Transparent).
sort.Sort(sortByAlpha(cols))
cs := make([]color.RGBA, len(cols))
nameIndex := make(map[string]int32, len(cols))
transparent := 0
for i, nc := range cols {
if nc.color.A < 0xff {
transparent++
}
cs[i] = nc.color
nameIndex[nc.name] = int32(i)
}
colors = &Colors{Colors: cs, NameIndex: nameIndex, Transparent: transparent}
return return
} }