package tins2020 import ( "errors" "regexp" "github.com/veandco/go-sdl2/sdl" ) var hexColorRE = regexp.MustCompile(`^#?([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})?$`) func HexColor(s string) (sdl.Color, error) { match := hexColorRE.FindStringSubmatch(s) if match == nil { return sdl.Color{}, errors.New("invalid color format") } values, err := HexToInts(match[1:]...) if err != nil { return sdl.Color{}, err } a := 255 if len(match[4]) > 0 { a = values[3] } return sdl.Color{R: uint8(values[0]), G: uint8(values[1]), B: uint8(values[2]), A: uint8(a)}, nil } func MustHexColor(s string) sdl.Color { color, err := HexColor(s) if err != nil { panic(err) } return color } func HexToInt(s string) (int, error) { var i int for _, c := range s { i *= 16 if c >= '0' && c <= '9' { i += int(c - '0') } else if c >= 'A' && c <= 'F' { i += int(c - 'A' + 10) } else if c >= 'a' && c <= 'f' { i += int(c - 'a' + 10) } else { return 0, errors.New("hex digit not supported") } } return i, nil } func HexToInts(s ...string) ([]int, error) { ints := make([]int, len(s)) for i, s := range s { value, err := HexToInt(s) if err != nil { return nil, err } ints[i] = value } return ints, nil }