github.com/jmigpin/editor@v1.6.0/util/imageutil/colorutils.go (about) 1 package imageutil 2 3 import ( 4 "fmt" 5 "image/color" 6 ) 7 8 func RgbaColor(c color.Color) color.RGBA { 9 if u, ok := c.(color.RGBA); ok { 10 return u 11 } else { 12 return convertToRgbaColor(c) 13 } 14 } 15 func convertToRgbaColor(c color.Color) color.RGBA { 16 // slow 17 //return color.RGBAModel.Convert(c).(color.RGBA) 18 19 r, g, b, a := c.RGBA() 20 return color.RGBA{ 21 uint8(r >> 8), 22 uint8(g >> 8), 23 uint8(b >> 8), 24 uint8(a >> 8), 25 } 26 } 27 28 //---------- 29 30 func RgbaFromInt(u int) color.RGBA { 31 v := u & 0xffffff 32 r := uint8((v << 0) >> 16) 33 g := uint8((v << 8) >> 16) 34 b := uint8((v << 16) >> 16) 35 return color.RGBA{r, g, b, 255} 36 } 37 38 //---------- 39 40 // Ex. usage: editor.xutil.cursors 41 func ColorUint16s(c color.Color) (uint16, uint16, uint16, uint16) { 42 r, g, b, a := c.RGBA() 43 return uint16(r << 8), uint16(g << 8), uint16(b << 8), uint16(a) 44 } 45 46 //---------- 47 48 func SprintRgb(c color.Color) string { 49 rgba := RgbaColor(c) 50 return fmt.Sprintf("%x %x %x", rgba.R, rgba.G, rgba.B) 51 } 52 53 //---------- 54 55 // Turn color lighter by v percent (0.0, 1.0). 56 func Tint(c color.Color, v float64) color.Color { 57 c2 := RgbaColor(c) 58 return tint(c2, v) 59 } 60 61 func tint(c color.RGBA, v float64) color.Color { 62 if v < 0 || v > 1 { 63 panic("!") 64 } 65 c.R += uint8(v * float64((255 - c.R))) 66 c.G += uint8(v * float64((255 - c.G))) 67 c.B += uint8(v * float64((255 - c.B))) 68 return c 69 } 70 71 //---------- 72 73 // Turn color darker by v percent (0.0, 1.0). 74 func Shade(c color.Color, v float64) color.Color { 75 c2 := RgbaColor(c) 76 return shade(c2, v) 77 } 78 79 func shade(c color.RGBA, v float64) color.Color { 80 if v < 0 || v > 1 { 81 panic("!") 82 } 83 v = 1.0 - v 84 c.R = uint8(v * float64(c.R)) 85 c.G = uint8(v * float64(c.G)) 86 c.B = uint8(v * float64(c.B)) 87 return c 88 } 89 90 //---------- 91 92 func TintOrShade(c color.Color, v float64) color.Color { 93 c2 := RgbaColor(c) 94 if isLighter(c2) { 95 return shade(c2, v) 96 } else { 97 return tint(c2, v) 98 } 99 } 100 101 func IsLighter(c color.Color) bool { 102 c2 := RgbaColor(c) 103 return isLighter(c2) 104 } 105 106 func isLighter(c color.RGBA) bool { 107 u := int(c.R) + int(c.G) + int(c.B) 108 return u > 256*3/2 109 } 110 111 //---------- 112 113 func Valorize(c color.Color, v float64, auto bool) color.Color { 114 if v < -1 || v > 1 { 115 panic("!") 116 } 117 hsv := HSVModel.Convert(c).(HSV) 118 119 var u int = int(hsv.V) 120 121 //d := int(float64(hsv.V) * v) 122 d := int(255 * v) 123 if auto { 124 // auto decide to add or subtract 125 if hsv.V < 255/2 { 126 u += d 127 } else { 128 u -= d 129 } 130 } else { 131 u += d 132 } 133 134 if u > 255 { 135 hsv.V = 255 136 } else if u < 0 { 137 hsv.V = 0 138 } else { 139 hsv.V = uint8(u) 140 } 141 c2 := RgbaColor(hsv) 142 return c2 143 }