package state import "fmt" // Color is an internal representation of a hexadecimal color string. // It can take one of these formats: // #RRGGBBAA // #RRGGBB // #RGBA // #RGB // When marshaling, it will always choose the most efficient format, but any format can be used when unmarshaling. type Color struct { // R is the red component of the color. R uint8 // G is the green component of the color. G uint8 // B is the blue component of the color. B uint8 // A is the alpha component of the color. A uint8 } // String prints the Color as an abbreviated notation. // Specifically, short form is used when possible (i.e., when all components are evenly divisible by 0x11). // The alpha component is left out if it's 0xFF. func (c Color) String() string { if c.R%0x11 == 0 && c.G%0x11 == 0 && c.B%0x11 == 0 && c.A%0x11 == 0 { // Short form works. if c.A == 0xFF { // It's great when it's easy! return fmt.Sprintf("#%01X%01X%01X", c.R/0x11, c.G/0x11, c.B/0x11) } else { // Just need to add the alpha. return fmt.Sprintf("#%01X%01X%01X%01X", c.R/0x11, c.G/0x11, c.B/0x11, c.A/0x11) } } else { // Gotta use long form. if c.A == 0xFF { // Can skip the alpha channel, though. return fmt.Sprintf("#%02X%02X%02X", c.R, c.G, c.B) } else { // Doing things the hard way. return fmt.Sprintf("#%02X%02X%02X%02X", c.R, c.G, c.B, c.A) } } }