Cribbed from: https://github.com/lucasb-eyer/go-colorful/blob/master/colors.go h is hue s is saturation v is value All values are expected to range from 0 to 1
(h, s, v float64)
| 484 | // v is value |
| 485 | // All values are expected to range from 0 to 1 |
| 486 | func NewColorFromHSV(h, s, v float64) Color { |
| 487 | |
| 488 | if s > 1 { |
| 489 | s = 1 |
| 490 | } else if s < 0 { |
| 491 | s = 0 |
| 492 | } |
| 493 | |
| 494 | if v > 1 { |
| 495 | v = 1 |
| 496 | } else if v < 0 { |
| 497 | v = 0 |
| 498 | } |
| 499 | |
| 500 | for h > 1 { |
| 501 | h-- |
| 502 | } |
| 503 | |
| 504 | for h < 0 { |
| 505 | h++ |
| 506 | } |
| 507 | |
| 508 | Hp := h * 6 |
| 509 | C := v * s |
| 510 | X := C * (1.0 - math.Abs(math.Mod(Hp, 2.0)-1.0)) |
| 511 | |
| 512 | m := v - C |
| 513 | r, g, b := 0.0, 0.0, 0.0 |
| 514 | |
| 515 | switch { |
| 516 | case 0.0 <= Hp && Hp < 1.0: |
| 517 | r = C |
| 518 | g = X |
| 519 | case 1.0 <= Hp && Hp < 2.0: |
| 520 | r = X |
| 521 | g = C |
| 522 | case 2.0 <= Hp && Hp < 3.0: |
| 523 | g = C |
| 524 | b = X |
| 525 | case 3.0 <= Hp && Hp < 4.0: |
| 526 | g = X |
| 527 | b = C |
| 528 | case 4.0 <= Hp && Hp < 5.0: |
| 529 | r = X |
| 530 | b = C |
| 531 | case 5.0 <= Hp && Hp <= 6.0: |
| 532 | r = C |
| 533 | b = X |
| 534 | } |
| 535 | |
| 536 | return Color{uint8((m + r) * 255), uint8((m + g) * 255), uint8((m + b) * 255), 255} |
| 537 | } |
| 538 | |
| 539 | func (color Color) RGBA() (uint8, uint8, uint8, uint8) { |
| 540 | return color[0], color[1], color[2], color[3] |