color.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <stdint.h>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <string>
  5. #include "color.hpp"
  6. namespace cx_light {
  7. color::color() {
  8. this->red = 0;
  9. this->green = 0;
  10. this->blue = 0;
  11. }
  12. color::~color() {}
  13. color color::from_hex(long hex) {
  14. color target;
  15. target.red = ((hex & 0xFF0000) >> 16);
  16. target.green = ((hex & 0x00FF00) >> 8);
  17. target.blue = ((hex & 0x0000FF) >> 0);
  18. return target;
  19. }
  20. color color::from_rgb(uint8_t red, uint8_t green, uint8_t blue) {
  21. color target;
  22. target.red = red;
  23. target.green = green;
  24. target.blue = blue;
  25. return target;
  26. }
  27. color color::from_white(long temperature) {
  28. color target;
  29. temperature = temperature / 100;
  30. if (temperature <= 66) {
  31. target.red = 255;
  32. target.blue = 0;
  33. float green = 99.4708025861 * log(temperature) - 161.1195681661;
  34. green = green > 255 ? 255 : green;
  35. green = green < 0 ? 0 : green;
  36. target.green = green;
  37. if (temperature > 19) {
  38. float blue = temperature - 10;
  39. blue = 138.5177312231 * log(blue) - 305.0447927307;
  40. blue = blue > 255 ? 255 : blue;
  41. blue = blue < 0 ? 0 : blue;
  42. target.blue = blue;
  43. }
  44. return target;
  45. }
  46. float red = 329.698727446 * pow(temperature - 60, -0.1332047592);
  47. red = red > 255 ? 255 : red;
  48. red = red < 0 ? 0 : red;
  49. target.red = red;
  50. float green = 288.1221695283 * pow(temperature - 60, -0.0755148492 );
  51. green = green > 255 ? 255 : green;
  52. green = green < 0 ? 0 : green;
  53. target.green = green;
  54. target.blue = 255;
  55. return target;
  56. }
  57. void color::set_source(const Cairo::RefPtr<Cairo::Context> &context) {
  58. context->set_source_rgb(
  59. this->get_normalized_red(),
  60. this->get_normalized_green(),
  61. this->get_normalized_blue()
  62. );
  63. }
  64. uint8_t color::get_red() {
  65. return this->red;
  66. }
  67. uint8_t color::get_green() {
  68. return this->green;
  69. }
  70. uint8_t color::get_blue() {
  71. return this->blue;
  72. }
  73. double color::get_normalized_red() {
  74. return ((double) this->red / 255);
  75. }
  76. double color::get_normalized_green() {
  77. return ((double) this->green / 255);
  78. }
  79. double color::get_normalized_blue() {
  80. return ((double) this->blue / 255);
  81. }
  82. }