package ps import "encoding/hex" // Some basic colors. var ( ColorBlack Color = RGB{0, 0, 0} ColorGray Color = RGB{128, 128, 128} ColorWhite Color = RGB{255, 255, 255} ) // Color is an interface for color objects, allowing colors to be // used in various formats. // // RGB is the default format for everything. type Color interface { RGB() [3]int // The color in RGB format. Hex() []uint8 // The color in hexadecimal format. } // Compare returns the brighter of a and b. func Compare(a, b Color) Color { A := a.RGB() B := b.RGB() Aavg := (A[0] + A[1] + A[2]) / 3 Bavg := (B[0] + B[1] + B[2]) / 3 if Aavg > Bavg { return a } return b } // RGB is a color format. It implements the Color interface. type RGB struct { Red int Green int Blue int } // RGB returns the color in RGB format. func (r RGB) RGB() [3]int { return [3]int{r.Red, r.Green, r.Blue} } // Hex returns the color coverted to hexidecimal format. func (r RGB) Hex() []uint8 { src := []uint8{uint8(r.Red), uint8(r.Green), uint8(r.Blue)} hex := make([]byte, hex.EncodedLen(len(src))) return hex } // Hex is a color in hexadecimal format. // It satisfies the Color interface. type Hex []uint8 // RGB returns the Hex value converted to RGB func (h Hex) RGB() [3]int { src := []byte(h) dst := make([]byte, hex.DecodedLen(len(src))) _, err := hex.Decode(dst, src) if err != nil { panic(err) } return [3]int{int(dst[0]), int(dst[1]), int(dst[2])} } // Hex returns the hex value of the number, // to satisfy the Color interface. func (h Hex) Hex() []uint8 { return h } // Stroke represents a layer stroke effect. type Stroke struct { Size float32 Color }