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  }