173 lines
4.7 KiB
Go
173 lines
4.7 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
MistyRose = color.RGBA{R: 0xFF, G: 0xE4, B: 0xE1, A: 0xFF}
|
|
DarkSalmon = color.RGBA{R: 0xE9, G: 0x96, B: 0x7A, A: 0xFF}
|
|
Tan = color.RGBA{R: 0xD2, G: 0xB4, B: 0x8C, A: 0xFF}
|
|
Bisque = color.RGBA{R: 0xFF, G: 0xE4, B: 0xC4, A: 0xFF}
|
|
Mintcream = color.RGBA{R: 0xF5, G: 0xFF, B: 0xFA, A: 0xFF}
|
|
Aquamarine = color.RGBA{R: 0x7F, G: 0xFF, B: 0xD4, A: 0xFF}
|
|
Azure = color.RGBA{R: 0xF0, G: 0xFF, B: 0xFF, A: 0xFF}
|
|
Lavender = color.RGBA{R: 0xE6, G: 0xE6, B: 0xFA, A: 0xFF}
|
|
Plum = color.RGBA{R: 0xDD, G: 0xA0, B: 0xDD, A: 0xFF}
|
|
AntiqueWhite = color.RGBA{R: 0xFA, G: 0xEB, B: 0xD7, A: 0xFF}
|
|
NavajoWhite = color.RGBA{R: 0xFF, G: 0xDE, B: 0xAD, A: 0xFF}
|
|
Moccasin = color.RGBA{R: 0xFF, G: 0xE4, B: 0xB5, A: 0xFF}
|
|
MediumAquamarine = color.RGBA{R: 0x66, G: 0xCD, B: 0xAA, A: 0xFF}
|
|
PaleTurquoise = color.RGBA{R: 0xAF, G: 0xEE, B: 0xEE, A: 0xFF}
|
|
LightPink = color.RGBA{R: 0xFF, G: 0xB6, B: 0xC1, A: 0xFF}
|
|
Tomato = color.RGBA{R: 0xFF, G: 0x63, B: 0x47, A: 0xFF}
|
|
Orange = color.RGBA{R: 0xFF, G: 0xA5, A: 0xFF}
|
|
Black = color.RGBA{A: 0xFF}
|
|
White = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}
|
|
LightGray = color.RGBA{R: 200, G: 200, B: 200, A: 255}
|
|
Outdoors = []color.RGBA{
|
|
{67, 110, 165, 255},
|
|
{47, 76, 114, 255},
|
|
{165, 138, 3, 255},
|
|
{242, 182, 4, 255},
|
|
{191, 131, 59, 255},
|
|
}
|
|
Reddery = []color.RGBA{
|
|
{89, 2, 16, 255},
|
|
{37, 2, 5, 255},
|
|
{186, 7, 55, 255},
|
|
{253, 55, 51, 255},
|
|
{245, 169, 167, 255},
|
|
}
|
|
DarkPink = []color.RGBA{
|
|
{2, 64, 89, 255},
|
|
{242, 131, 107, 255},
|
|
{140, 40, 31, 255},
|
|
{191, 69, 57, 255},
|
|
{13, 13, 13, 255},
|
|
}
|
|
|
|
DarkRed = []color.RGBA{
|
|
{48, 19, 21, 255},
|
|
{71, 15, 16, 255},
|
|
{92, 10, 12, 255},
|
|
{115, 5, 4, 255},
|
|
{139, 0, 3, 255},
|
|
{163, 32, 1, 255},
|
|
{185, 66, 0, 255},
|
|
{208, 98, 1, 255},
|
|
{231, 133, 0, 255},
|
|
{254, 165, 0, 255},
|
|
}
|
|
|
|
Sleek = []color.RGBA{
|
|
{R: 0x2C, G: 0x35, B: 0x31, A: 0xFF},
|
|
{R: 0x11, G: 0x64, B: 0x66, A: 0xFF},
|
|
{R: 0xD9, G: 0xB0, B: 0x8C, A: 0xFF},
|
|
{R: 0xFF, G: 0xCB, B: 0x9A, A: 0xFF},
|
|
{R: 0xD1, G: 0xE8, B: 0xE2, A: 0xFF},
|
|
}
|
|
|
|
Energetic = []color.RGBA{
|
|
{R: 0x56, G: 0x80, B: 0xE9, A: 0xFF},
|
|
{R: 0x84, G: 0xCE, B: 0xEB, A: 0xFF},
|
|
{R: 0x5A, G: 0x89, B: 0xEA, A: 0xFF},
|
|
{R: 0xC1, G: 0xC8, B: 0xEA, A: 0xFF},
|
|
{R: 0x88, G: 0x60, B: 0xD0, A: 0xFF},
|
|
}
|
|
|
|
Youthful = []color.RGBA{
|
|
{R: 0xA6, G: 0x4A, B: 0xC9, A: 0xFF},
|
|
{R: 0xFC, G: 0xCD, B: 0x04, A: 0xFF},
|
|
{R: 0xFF, G: 0xB4, B: 0x8F, A: 0xFF},
|
|
{R: 0xF5, G: 0xE6, B: 0xCC, A: 0xFF},
|
|
{R: 0x17, G: 0xE9, B: 0xE0, A: 0xFF},
|
|
}
|
|
|
|
PinkPastel = []color.RGBA{
|
|
{R: 0xA1, G: 0xC3, B: 0xD1, A: 0xFF},
|
|
{R: 0xB3, G: 0x9B, B: 0xC8, A: 0xFF},
|
|
{R: 0xF0, G: 0xEB, B: 0xF4, A: 0xFF},
|
|
{R: 0xF1, G: 0x72, B: 0xA1, A: 0xFF},
|
|
{R: 0xE6, G: 0x43, B: 0x98, A: 0xFF},
|
|
}
|
|
|
|
Citrus = []color.RGBA{
|
|
{R: 0x1F, G: 0x26, B: 0x05, A: 0xFF},
|
|
{R: 0x1F, G: 0x65, B: 0x21, A: 0xFF},
|
|
{R: 0x53, G: 0x90, B: 0x0F, A: 0xFF},
|
|
{R: 0xA4, G: 0xA7, B: 0x1E, A: 0xFF},
|
|
{R: 0xD6, G: 0xCE, B: 0x15, A: 0xFF},
|
|
}
|
|
|
|
Cheerful = []color.RGBA{
|
|
{R: 0xFB, G: 0xE8, B: 0xA6, A: 0xFF},
|
|
{R: 0xF4, G: 0x97, B: 0x6C, A: 0xFF},
|
|
{R: 0x30, G: 0x3C, B: 0x6C, A: 0xFF},
|
|
{R: 0xB4, G: 0xDF, B: 0xE5, A: 0xFF},
|
|
{R: 0xD2, G: 0xFD, B: 0xFF, A: 0xFF},
|
|
}
|
|
|
|
Earthy = []color.RGBA{
|
|
{R: 0x8D, G: 0x87, B: 0x41, A: 0xFF},
|
|
{R: 0xF4, G: 0x97, B: 0x6C, A: 0xFF},
|
|
{R: 0x30, G: 0x3C, B: 0x6C, A: 0xFF},
|
|
{R: 0xB4, G: 0xDF, B: 0xE5, A: 0xFF},
|
|
{R: 0xD2, G: 0xFD, B: 0xFF, A: 0xFF},
|
|
}
|
|
)
|
|
|
|
// ParseHexColor parses color string likes #FFFFFF or #2398EFFF
|
|
func ParseHexColor(s string) (color.RGBA, error) {
|
|
s = strings.TrimSpace(strings.ToLower(s))
|
|
|
|
if !strings.HasPrefix(s, "#") {
|
|
return Black, fmt.Errorf("invalid hex color string %v", s)
|
|
}
|
|
|
|
if c, ok := parseHex(s[1:]); ok {
|
|
return c, nil
|
|
}
|
|
return Black, fmt.Errorf("invalid hex color string %v", s)
|
|
}
|
|
|
|
// parseHex returns a color.RGBA by parsing a hex string
|
|
// Reference: https://stackoverflow.com/questions/54197913/parse-hex-string-to-image-color
|
|
func parseHex(s string) (color.RGBA, bool) {
|
|
c := color.RGBA{}
|
|
c.A = 255
|
|
ok := true
|
|
|
|
hexToByte := func(b byte) byte {
|
|
switch {
|
|
case b >= '0' && b <= '9':
|
|
return b - '0'
|
|
case b >= 'a' && b <= 'f':
|
|
return b - 'a' + 10
|
|
}
|
|
ok = false
|
|
return 0
|
|
}
|
|
|
|
n := len(s)
|
|
if n == 6 || n == 8 {
|
|
c.R = hexToByte(s[0])<<4+hexToByte(s[1])
|
|
c.G = hexToByte(s[2])<<4+hexToByte(s[3])
|
|
c.B = hexToByte(s[4])<<4+hexToByte(s[5])
|
|
if n == 8 {
|
|
c.A = hexToByte(s[6])<<4+hexToByte(s[7])
|
|
}
|
|
} else if n == 3 || n == 4 {
|
|
c.R = hexToByte(s[0])*17
|
|
c.G = hexToByte(s[1])*17
|
|
c.B = hexToByte(s[2])*17
|
|
if n == 4 {
|
|
c.A = hexToByte(s[3])*17
|
|
}
|
|
} else {
|
|
ok = false
|
|
}
|
|
return c, ok
|
|
} |