#include #include #include #include #include "color.hpp" namespace cx_light { color::color() { this->red = 0; this->green = 0; this->blue = 0; } color::~color() {} color color::from_hex(long hex) { color target; target.red = ((hex & 0xFF0000) >> 16); target.green = ((hex & 0x00FF00) >> 8); target.blue = ((hex & 0x0000FF) >> 0); return target; } color color::from_rgb(uint8_t red, uint8_t green, uint8_t blue) { color target; target.red = red; target.green = green; target.blue = blue; return target; } color color::from_white(long temperature) { color target; temperature = temperature / 100; if (temperature <= 66) { target.red = 255; target.blue = 0; float green = 99.4708025861 * log(temperature) - 161.1195681661; green = green > 255 ? 255 : green; green = green < 0 ? 0 : green; target.green = green; if (temperature > 19) { float blue = temperature - 10; blue = 138.5177312231 * log(blue) - 305.0447927307; blue = blue > 255 ? 255 : blue; blue = blue < 0 ? 0 : blue; target.blue = blue; } return target; } float red = 329.698727446 * pow(temperature - 60, -0.1332047592); red = red > 255 ? 255 : red; red = red < 0 ? 0 : red; target.red = red; float green = 288.1221695283 * pow(temperature - 60, -0.0755148492 ); green = green > 255 ? 255 : green; green = green < 0 ? 0 : green; target.green = green; target.blue = 255; return target; } void color::set_source(const Cairo::RefPtr &context) { context->set_source_rgb( this->get_normalized_red(), this->get_normalized_green(), this->get_normalized_blue() ); } uint8_t color::get_red() { return this->red; } uint8_t color::get_green() { return this->green; } uint8_t color::get_blue() { return this->blue; } double color::get_normalized_red() { return ((double) this->red / 255); } double color::get_normalized_green() { return ((double) this->green / 255); } double color::get_normalized_blue() { return ((double) this->blue / 255); } }