/ext/color/hsva/hsva.scm

http://github.com/dharmatech/abstracting · Scheme · 51 lines · 34 code · 17 blank · 0 comment · 0 complexity · ac915817762212d5c24c6dd2cc3c583a MD5 · raw file

  1. (define (hsva hue saturation value alpha)
  2. (let ((to-rgba
  3. (lambda ()
  4. (let ((hue (inexact hue))
  5. (saturation (inexact saturation))
  6. (value (inexact value))
  7. (alpha (inexact alpha)))
  8. (let ((Hi (mod (floor (/ hue 60.0)) 6.0)))
  9. (let ((f (- (/ hue 60.0) Hi))
  10. (p (* (- 1.0 saturation) value)))
  11. (let ((q (* (- 1.0 (* f saturation)) value))
  12. (t (* (- 1.0 (* (- 1.0 f) saturation)) value)))
  13. (case (exact Hi)
  14. ((0) (rgba value t p alpha))
  15. ((1) (rgba q value p alpha))
  16. ((2) (rgba p value t alpha))
  17. ((3) (rgba p q value alpha))
  18. ((4) (rgba t p value alpha))
  19. ((5) (rgba value p q alpha))))))))))
  20. (let ((message-handler
  21. (lambda (msg)
  22. (case msg
  23. ((hue) (lambda () hue))
  24. ((saturation) (lambda () saturation))
  25. ((value) (lambda () value))
  26. ((alpha) (lambda () alpha))
  27. ((hue!) (lambda (new) (set! hue new)))
  28. ((saturation!) (lambda (new) (set! saturation new)))
  29. ((value!) (lambda (new) (set! value new)))
  30. ((alpha!) (lambda (new) (set! alpha new)))
  31. ((clone) (hsva hue saturation value alpha))
  32. ((rgba) to-rgba)
  33. ((raw) (vector hue saturation value alpha))))))
  34. (vector 'hsva #f message-handler))))