[DEV] change mode of color ==> advence interface and conversion

This commit is contained in:
Edouard DUPIN 2014-07-03 21:03:26 +02:00
parent cfc4d435b4
commit a33d198b7c
7 changed files with 748 additions and 447 deletions

View File

@ -10,35 +10,11 @@
#include <etk/tool.h>
#include <etk/Color.h>
#include <etk/debug.h>
#include <etk/stdTools.h>
#include <string>
#include <sstream>
#include <stdexcept>
static bool strnCmpNoCase(const char * _input1, const char * _input2, int32_t _maxLen) {
int32_t iii=0;
while ( '\0' != *_input1
&& '\0' != *_input2
&& iii < _maxLen) {
char in1 = *_input1;
char in2 = *_input2;
if (in1 != in2) {
if (in1 <= 'Z' && in1 >= 'A') {
in1 = in1 - 'A' + 'a';
}
if (in2 <= 'Z' && in2 >= 'A') {
in2 = in2 - 'A' + 'a';
}
if (in1 != in2) {
return false;
}
}
iii++;
_input1++;
_input2++;
}
return true;
}
typedef struct {
const char * colorName;
etk::Color<> color;
@ -47,344 +23,328 @@ typedef struct {
static int32_t getColorSize();
static const colorList_ts* getColorList();
namespace etk {
template<> void Color<uint8_t>::set(float _r, float _g, float _b, float _a) {
m_r = (uint8_t)(_r*255.0f);
m_g = (uint8_t)(_g*255.0f);
m_b = (uint8_t)(_b*255.0f);
m_a = (uint8_t)(_a*255.0f);
}
template<> void Color<float>::set(float _r, float _g, float _b, float _a) {
m_r = _r;
m_g = _g;
m_b = _b;
m_a = _a;
}
template<> void Color<uint8_t>::set(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a) {
m_r = _r;
m_g = _g;
m_b = _b;
m_a = _a;
}
template<> void Color<float>::set(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a) {
m_r = ((float)_r)/255.0f;
m_g = ((float)_g)/255.0f;
m_b = ((float)_b)/255.0f;
m_a = ((float)_a)/255.0f;
}
template<> uint32_t Color<uint8_t>::get() const {
return (((uint32_t)m_r)<<24)
+ (((uint32_t)m_g)<<16)
+ (((uint32_t)m_b)<<8)
+ (uint32_t)m_a;
}
template<> uint32_t Color<float>::get() const {
return Color<uint8_t>(*this).get();
}
template<> Color<uint8_t>::Color(const std::string& _input) :
m_r(255),
m_g(255),
m_b(255),
m_a(255) {
const char* inputData = _input.c_str();
size_t len = _input.size();
if( len >=1
&& inputData[0] == '#') {
if(len == 4) {
int32_t red=0, green=0, blue=0;
if (sscanf(inputData + 1, "%1x%1x%1x", &red, &green, &blue) == 3) {
m_r = (red | red << 4);
m_g = (green | green << 4);
m_b = (blue | blue << 4);
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\"");
}
} else if (len==5) {
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(inputData + 1, "%1x%1x%1x%1x", &red, &green, &blue, &alpha) == 4) {
m_r = (red | red << 4);
m_g = (green | green << 4);
m_b = (blue | blue << 4);
m_a = (alpha | alpha << 4);
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\"");
}
} else if (len == 7) {
int32_t red=0, green=0, blue=0;
if (sscanf(inputData + 1, "%2x%2x%2x", &red, &green, &blue) == 3) {
m_r = red;
m_g = green;
m_b = blue;
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\"");
}
} else if (len == 9) {
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(inputData + 1, "%2x%2x%2x%2x", &red, &green, &blue, &alpha) == 4) {
m_r = red;
m_g = green;
m_b = blue;
m_a = alpha;
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\"");
}
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\" ==> unknown methode ...");
}
} else if( len >= 4
&& inputData[0] == 'r'
&& inputData[1] == 'g'
&& inputData[2] == 'b'
&& inputData[3] == '(' ) {
int32_t red=0, green=0, blue=0, alpha=0;
float fred=0, fgreen=0, fblue=0, falpha=0;
if (sscanf(inputData + 4, "%u,%u,%u,%u", &red, &green, &blue, &alpha) == 4) {
m_r = etk_min(0xFF, red);
m_g = etk_min(0xFF, green);
m_b = etk_min(0xFF, blue);
m_a = etk_min(0xFF, alpha);
} else if (sscanf(inputData + 4, "%u,%u,%u", &red, &green, &blue) == 3) {
m_r = etk_min(0xFF, red);
m_g = etk_min(0xFF, green);
m_b = etk_min(0xFF, blue);
} else if (sscanf(inputData + 4, "%f%%,%f%%,%f%%,%f%%", &fred, &fgreen, &fblue, &falpha) == 4) {
fred = etk_avg(0.0, fred, 1.0);
fgreen = etk_avg(0.0, fgreen, 1.0);
fblue = etk_avg(0.0, fblue, 1.0);
falpha = etk_avg(0.0, falpha, 1.0);
m_r = (uint8_t)(fred * 255.);
m_g = (uint8_t)(fgreen * 255.);
m_b = (uint8_t)(fblue * 255.);
m_a = (uint8_t)(falpha * 255.);
} else if (sscanf(inputData + 4, "%f%%,%f%%,%f%%", &fred, &fgreen, &fblue) == 3) {
fred = etk_avg(0.0, fred, 1.0);
fgreen= etk_avg(0.0, fgreen, 1.0);
fblue = etk_avg(0.0, fblue, 1.0);
m_r = (uint8_t)(fred * 255.);
m_g = (uint8_t)(fgreen * 255.);
m_b = (uint8_t)(fblue * 255.);
} else {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\" ==> unknown methode ...");
}
etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input) {
TK_INFO("parseStringStartWithSharp('" << _input << "'");
size_t len = _input.size();
etk::Color<uint8_t, 4> outputValue(0,0,0,0);
if(len == 3) {
int32_t red=0, green=0, blue=0;
if (sscanf(_input.c_str(), "%1x%1x%1x", &red, &green, &blue) == 3) {
outputValue.setR(red | red << 4);
outputValue.setG(green | green << 4);
outputValue.setB(blue | blue << 4);
} else {
bool findIt = false;
// direct named color ...
for (int32_t iii=0; iii<getColorSize(); iii++) {
if (strnCmpNoCase(getColorList()[iii].colorName, inputData, strlen(getColorList()[iii].colorName)) == true) {
findIt = true;
*this = getColorList()[iii].color;
// stop searching
break;
}
}
// not find color ...
if (findIt == false) {
TK_ERROR(" pb in parsing the color : \"" << inputData << "\" not find ...");
}
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
TK_VERBOSE("Parse color : \"" << inputData << "\" ==> " << *this);
}
template<> Color<float>::Color(const std::string& _input) {
etk::Color<uint8_t> tmpColor(_input);
*this = tmpColor;
}
};
std::ostream& etk::operator <<(std::ostream& _os, const etk::Color<uint8_t>& _obj) {
_os << "#";
_os << (std::to_string<uint32_t>(_obj.get(), std::hex)).c_str();
return _os;
}
std::ostream& etk::operator <<(std::ostream& _os, const etk::Color<float>& _obj)
{
_os << "rgba(";
_os << _obj.r();
_os << ",";
_os << _obj.g();
_os << ",";
_os << _obj.b();
_os << ",";
_os << _obj.a();
_os << ")";
return _os;
}
std::ostream& etk::operator <<(std::ostream& _os, const std::vector<etk::Color<uint8_t> >& _obj) {
for (size_t iii = 0; iii < _obj.size(); ++iii) {
if (iii != 0) {
_os << " ";
} else if (len==5) {
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%1x%1x%1x%1x", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(red | red << 4);
outputValue.setG(green | green << 4);
outputValue.setB(blue | blue << 4);
outputValue.setA(alpha | alpha << 4);
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
_os << _obj[iii];
}
return _os;
}
std::ostream& etk::operator <<(std::ostream& _os, const std::vector<etk::Color<float> >& _obj) {
for (size_t iii = 0; iii < _obj.size(); ++iii) {
if (iii != 0) {
_os << " ";
} else if (len == 7) {
int32_t red=0, green=0, blue=0;
if (sscanf(_input.c_str(), "%2x%2x%2x", &red, &green, &blue) == 3) {
outputValue.setR(red);
outputValue.setG(green);
outputValue.setB(blue);
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
_os << _obj[iii];
} else if (len == 9) {
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%2x%2x%2x%2x", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(red);
outputValue.setG(green);
outputValue.setB(blue);
outputValue.setA(alpha);
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return _os;
return outputValue;
}
etk::Color<uint8_t, 4> etk::parseStringStartWithRGBGen(const std::string& _input) {
TK_INFO("parseStringStartWithRGB('" << _input << "'");
etk::Color<uint8_t, 4> outputValue(0,0,0,0);
int32_t red=0, green=0, blue=0, alpha=0;
float fred=0, fgreen=0, fblue=0, falpha=0;
if (sscanf(_input.c_str(), "%u,%u,%u,%u", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(std::min(0xFF, red));
outputValue.setG(std::min(0xFF, green));
outputValue.setB(std::min(0xFF, blue));
outputValue.setA(std::min(0xFF, alpha));
} else if (sscanf(_input.c_str(), "%u,%u,%u", &red, &green, &blue) == 3) {
outputValue.setR(std::min(0xFF, red));
outputValue.setG(std::min(0xFF, green));
outputValue.setB(std::min(0xFF, blue));
} else if (sscanf(_input.c_str(), "%f%%,%f%%,%f%%,%f%%", &fred, &fgreen, &fblue, &falpha) == 4) {
fred = std::avg(0.0f, fred, 1.0f);
fgreen = std::avg(0.0f, fgreen, 1.0f);
fblue = std::avg(0.0f, fblue, 1.0f);
falpha = std::avg(0.0f, falpha, 1.0f);
outputValue.setR((uint8_t)(fred * 255.f));
outputValue.setG((uint8_t)(fgreen * 255.f));
outputValue.setB((uint8_t)(fblue * 255.f));
outputValue.setR((uint8_t)(falpha * 255.f));
} else if (sscanf(_input.c_str(), "%f%%,%f%%,%f%%", &fred, &fgreen, &fblue) == 3) {
fred = std::avg(0.0f, fred, 1.0f);
fgreen= std::avg(0.0f, fgreen, 1.0f);
fblue = std::avg(0.0f, fblue, 1.0f);
outputValue.setR((uint8_t)(fred * 255.f));
outputValue.setG((uint8_t)(fgreen * 255.f));
outputValue.setB((uint8_t)(fblue * 255.f));
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return outputValue;
}
const etk::Color<> etk::color::none((uint32_t)0x00000000);
const etk::Color<> etk::color::aliceBlue((uint32_t)0xF0F8FFFF);
const etk::Color<> etk::color::antiqueWhite((uint32_t)0xFAEBD7FF);
const etk::Color<> etk::color::aqua((uint32_t)0x00FFFFFF);
const etk::Color<> etk::color::aquamarine((uint32_t)0x7FFFD4FF);
const etk::Color<> etk::color::azure((uint32_t)0xF0FFFFFF);
const etk::Color<> etk::color::beige((uint32_t)0xF5F5DCFF);
const etk::Color<> etk::color::bisque((uint32_t)0xFFE4C4FF);
const etk::Color<> etk::color::black((uint32_t)0x000000FF);
const etk::Color<> etk::color::blanchedAlmond((uint32_t)0xFFEBCDFF);
const etk::Color<> etk::color::blue((uint32_t)0x0000FFFF);
const etk::Color<> etk::color::blueViolet((uint32_t)0x8A2BE2FF);
const etk::Color<> etk::color::brown((uint32_t)0xA52A2AFF);
const etk::Color<> etk::color::burlyWood((uint32_t)0xDEB887FF);
const etk::Color<> etk::color::cadetBlue((uint32_t)0x5F9EA0FF);
const etk::Color<> etk::color::chartreuse((uint32_t)0x7FFF00FF);
const etk::Color<> etk::color::chocolate((uint32_t)0xD2691EFF);
const etk::Color<> etk::color::coral((uint32_t)0xFF7F50FF);
const etk::Color<> etk::color::cornflowerBlue((uint32_t)0x6495EDFF);
const etk::Color<> etk::color::cornsilk((uint32_t)0xFFF8DCFF);
const etk::Color<> etk::color::crimson((uint32_t)0xDC143CFF);
const etk::Color<> etk::color::cyan((uint32_t)0x00FFFFFF);
const etk::Color<> etk::color::darkBlue((uint32_t)0x00008BFF);
const etk::Color<> etk::color::darkCyan((uint32_t)0x008B8BFF);
const etk::Color<> etk::color::darkGoldenRod((uint32_t)0xB8860BFF);
const etk::Color<> etk::color::darkGray((uint32_t)0xA9A9A9FF);
const etk::Color<> etk::color::darkGrey((uint32_t)0xA9A9A9FF);
const etk::Color<> etk::color::darkGreen((uint32_t)0x006400FF);
const etk::Color<> etk::color::darkKhaki((uint32_t)0xBDB76BFF);
const etk::Color<> etk::color::darkMagenta((uint32_t)0x8B008BFF);
const etk::Color<> etk::color::darkOliveGreen((uint32_t)0x556B2FFF);
const etk::Color<> etk::color::darkorange((uint32_t)0xFF8C00FF);
const etk::Color<> etk::color::darkOrchid((uint32_t)0x9932CCFF);
const etk::Color<> etk::color::darkRed((uint32_t)0x8B0000FF);
const etk::Color<> etk::color::darkSalmon((uint32_t)0xE9967AFF);
const etk::Color<> etk::color::darkSeaGreen((uint32_t)0x8FBC8FFF);
const etk::Color<> etk::color::darkSlateBlue((uint32_t)0x483D8BFF);
const etk::Color<> etk::color::darkSlateGray((uint32_t)0x2F4F4FFF);
const etk::Color<> etk::color::darkSlateGrey((uint32_t)0x2F4F4FFF);
const etk::Color<> etk::color::darkTurquoise((uint32_t)0x00CED1FF);
const etk::Color<> etk::color::darkViolet((uint32_t)0x9400D3FF);
const etk::Color<> etk::color::deepPink((uint32_t)0xFF1493FF);
const etk::Color<> etk::color::deepSkyBlue((uint32_t)0x00BFFFFF);
const etk::Color<> etk::color::dimGray((uint32_t)0x696969FF);
const etk::Color<> etk::color::dimGrey((uint32_t)0x696969FF);
const etk::Color<> etk::color::dodgerBlue((uint32_t)0x1E90FFFF);
const etk::Color<> etk::color::fireBrick((uint32_t)0xB22222FF);
const etk::Color<> etk::color::floralWhite((uint32_t)0xFFFAF0FF);
const etk::Color<> etk::color::forestGreen((uint32_t)0x228B22FF);
const etk::Color<> etk::color::fuchsia((uint32_t)0xFF00FFFF);
const etk::Color<> etk::color::gainsboro((uint32_t)0xDCDCDCFF);
const etk::Color<> etk::color::ghostWhite((uint32_t)0xF8F8FFFF);
const etk::Color<> etk::color::gold((uint32_t)0xFFD700FF);
const etk::Color<> etk::color::goldenRod((uint32_t)0xDAA520FF);
const etk::Color<> etk::color::gray((uint32_t)0x808080FF);
const etk::Color<> etk::color::grey((uint32_t)0x808080FF);
const etk::Color<> etk::color::green((uint32_t)0x008000FF);
const etk::Color<> etk::color::greenYellow((uint32_t)0xADFF2FFF);
const etk::Color<> etk::color::honeyDew((uint32_t)0xF0FFF0FF);
const etk::Color<> etk::color::hotPink((uint32_t)0xFF69B4FF);
const etk::Color<> etk::color::indianRed ((uint32_t)0xCD5C5CFF);
const etk::Color<> etk::color::indigo ((uint32_t)0x4B0082FF);
const etk::Color<> etk::color::ivory((uint32_t)0xFFFFF0FF);
const etk::Color<> etk::color::khaki((uint32_t)0xF0E68CFF);
const etk::Color<> etk::color::lavender((uint32_t)0xE6E6FAFF);
const etk::Color<> etk::color::lavenderBlush((uint32_t)0xFFF0F5FF);
const etk::Color<> etk::color::lawnGreen((uint32_t)0x7CFC00FF);
const etk::Color<> etk::color::lemonChiffon((uint32_t)0xFFFACDFF);
const etk::Color<> etk::color::lightBlue((uint32_t)0xADD8E6FF);
const etk::Color<> etk::color::lightCoral((uint32_t)0xF08080FF);
const etk::Color<> etk::color::lightCyan((uint32_t)0xE0FFFFFF);
const etk::Color<> etk::color::lightGoldenRodYellow((uint32_t)0xFAFAD2FF);
const etk::Color<> etk::color::lightGray((uint32_t)0xD3D3D3FF);
const etk::Color<> etk::color::lightGrey((uint32_t)0xD3D3D3FF);
const etk::Color<> etk::color::lightGreen((uint32_t)0x90EE90FF);
const etk::Color<> etk::color::lightPink((uint32_t)0xFFB6C1FF);
const etk::Color<> etk::color::lightSalmon((uint32_t)0xFFA07AFF);
const etk::Color<> etk::color::lightSeaGreen((uint32_t)0x20B2AAFF);
const etk::Color<> etk::color::lightSkyBlue((uint32_t)0x87CEFAFF);
const etk::Color<> etk::color::lightSlateGray((uint32_t)0x778899FF);
const etk::Color<> etk::color::lightSlateGrey((uint32_t)0x778899FF);
const etk::Color<> etk::color::lightSteelBlue((uint32_t)0xB0C4DEFF);
const etk::Color<> etk::color::lightYellow((uint32_t)0xFFFFE0FF);
const etk::Color<> etk::color::lime((uint32_t)0x00FF00FF);
const etk::Color<> etk::color::limeGreen((uint32_t)0x32CD32FF);
const etk::Color<> etk::color::linen((uint32_t)0xFAF0E6FF);
const etk::Color<> etk::color::magenta((uint32_t)0xFF00FFFF);
const etk::Color<> etk::color::maroon((uint32_t)0x800000FF);
const etk::Color<> etk::color::mediumAquaMarine((uint32_t)0x66CDAAFF);
const etk::Color<> etk::color::mediumBlue((uint32_t)0x0000CDFF);
const etk::Color<> etk::color::mediumOrchid((uint32_t)0xBA55D3FF);
const etk::Color<> etk::color::mediumPurple((uint32_t)0x9370D8FF);
const etk::Color<> etk::color::mediumSeaGreen((uint32_t)0x3CB371FF);
const etk::Color<> etk::color::mediumSlateBlue((uint32_t)0x7B68EEFF);
const etk::Color<> etk::color::mediumSpringGreen((uint32_t)0x00FA9AFF);
const etk::Color<> etk::color::mediumTurquoise((uint32_t)0x48D1CCFF);
const etk::Color<> etk::color::mediumVioletRed((uint32_t)0xC71585FF);
const etk::Color<> etk::color::midnightBlue((uint32_t)0x191970FF);
const etk::Color<> etk::color::mintCream((uint32_t)0xF5FFFAFF);
const etk::Color<> etk::color::mistyRose((uint32_t)0xFFE4E1FF);
const etk::Color<> etk::color::moccasin((uint32_t)0xFFE4B5FF);
const etk::Color<> etk::color::navajoWhite((uint32_t)0xFFDEADFF);
const etk::Color<> etk::color::navy((uint32_t)0x000080FF);
const etk::Color<> etk::color::oldLace((uint32_t)0xFDF5E6FF);
const etk::Color<> etk::color::olive((uint32_t)0x808000FF);
const etk::Color<> etk::color::oliveDrab((uint32_t)0x6B8E23FF);
const etk::Color<> etk::color::orange((uint32_t)0xFFA500FF);
const etk::Color<> etk::color::orangeRed((uint32_t)0xFF4500FF);
const etk::Color<> etk::color::orchid((uint32_t)0xDA70D6FF);
const etk::Color<> etk::color::paleGoldenRod((uint32_t)0xEEE8AAFF);
const etk::Color<> etk::color::paleGreen((uint32_t)0x98FB98FF);
const etk::Color<> etk::color::paleTurquoise((uint32_t)0xAFEEEEFF);
const etk::Color<> etk::color::paleVioletRed((uint32_t)0xD87093FF);
const etk::Color<> etk::color::papayaWhip((uint32_t)0xFFEFD5FF);
const etk::Color<> etk::color::peachPuff((uint32_t)0xFFDAB9FF);
const etk::Color<> etk::color::peru((uint32_t)0xCD853FFF);
const etk::Color<> etk::color::pink((uint32_t)0xFFC0CBFF);
const etk::Color<> etk::color::plum((uint32_t)0xDDA0DDFF);
const etk::Color<> etk::color::powderBlue((uint32_t)0xB0E0E6FF);
const etk::Color<> etk::color::purple((uint32_t)0x800080FF);
const etk::Color<> etk::color::red((uint32_t)0xFF0000FF);
const etk::Color<> etk::color::rosyBrown((uint32_t)0xBC8F8FFF);
const etk::Color<> etk::color::royalBlue((uint32_t)0x4169E1FF);
const etk::Color<> etk::color::saddleBrown((uint32_t)0x8B4513FF);
const etk::Color<> etk::color::salmon((uint32_t)0xFA8072FF);
const etk::Color<> etk::color::sandyBrown((uint32_t)0xF4A460FF);
const etk::Color<> etk::color::seaGreen((uint32_t)0x2E8B57FF);
const etk::Color<> etk::color::seaShell((uint32_t)0xFFF5EEFF);
const etk::Color<> etk::color::sienna((uint32_t)0xA0522DFF);
const etk::Color<> etk::color::silver((uint32_t)0xC0C0C0FF);
const etk::Color<> etk::color::skyBlue((uint32_t)0x87CEEBFF);
const etk::Color<> etk::color::slateBlue((uint32_t)0x6A5ACDFF);
const etk::Color<> etk::color::slateGray((uint32_t)0x708090FF);
const etk::Color<> etk::color::slateGrey((uint32_t)0x708090FF);
const etk::Color<> etk::color::snow((uint32_t)0xFFFAFAFF);
const etk::Color<> etk::color::springGreen((uint32_t)0x00FF7FFF);
const etk::Color<> etk::color::steelBlue((uint32_t)0x4682B4FF);
const etk::Color<> etk::color::tan((uint32_t)0xD2B48CFF);
const etk::Color<> etk::color::teal((uint32_t)0x008080FF);
const etk::Color<> etk::color::thistle((uint32_t)0xD8BFD8FF);
const etk::Color<> etk::color::tomato((uint32_t)0xFF6347FF);
const etk::Color<> etk::color::turquoise((uint32_t)0x40E0D0FF);
const etk::Color<> etk::color::violet((uint32_t)0xEE82EEFF);
const etk::Color<> etk::color::wheat((uint32_t)0xF5DEB3FF);
const etk::Color<> etk::color::white((uint32_t)0xFFFFFFFF);
const etk::Color<> etk::color::whiteSmoke((uint32_t)0xF5F5F5FF);
const etk::Color<> etk::color::yellow((uint32_t)0xFFFF00FF);
const etk::Color<> etk::color::yellowGreen((uint32_t)0x9ACD32FF);
etk::Color<double, 4> etk::parseStringStartWithRGB(const std::string& _input) {
TK_INFO("parseStringStartWithRGB('" << _input << "'");
etk::Color<double, 4> outputValue(0,0,0,0);
double fred=0, fgreen=0, fblue=0, falpha=0;
if (sscanf(_input.c_str(), "%lf%%,%lf%%,%lf%%,%lf%%", &fred, &fgreen, &fblue, &falpha) == 4) {
outputValue.setR(fred);
outputValue.setG(fgreen);
outputValue.setB(fblue);
outputValue.setA(falpha);
} else if (sscanf(_input.c_str(), "%lf%%,%lf%%,%lf%%", &fred, &fgreen, &fblue) == 3) {
outputValue.setR(fred);
outputValue.setG(fgreen);
outputValue.setB(fblue);
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return outputValue;
}
etk::Color<uint32_t, 4> etk::parseStringStartWithRGBUnsigned32(const std::string& _input) {
etk::Color<uint32_t, 4> outputValue(0,0,0,0);
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%u,%u,%u,%u", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(red);
outputValue.setG(green);
outputValue.setB(blue);
outputValue.setA(alpha);
} else if (sscanf(_input.c_str(), "%u,%u,%u", &red, &green, &blue) == 3) {
outputValue.setR(red);
outputValue.setG(green);
outputValue.setB(blue);
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return outputValue;
}
etk::Color<uint16_t, 4> etk::parseStringStartWithRGBUnsigned16(const std::string& _input) {
etk::Color<uint16_t, 4> outputValue(0,0,0,0);
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%u,%u,%u,%u", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(std::min(0xFFFF, red));
outputValue.setG(std::min(0xFFFF, green));
outputValue.setB(std::min(0xFFFF, blue));
outputValue.setA(std::min(0xFFFF, alpha));
} else if (sscanf(_input.c_str(), "%u,%u,%u", &red, &green, &blue) == 3) {
outputValue.setR(std::min(0xFFFF, red));
outputValue.setG(std::min(0xFFFF, green));
outputValue.setB(std::min(0xFFFF, blue));
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return outputValue;
}
etk::Color<uint8_t, 4> etk::parseStringStartWithRGBUnsigned8(const std::string& _input) {
etk::Color<uint8_t, 4> outputValue(0,0,0,0);
int32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%u,%u,%u,%u", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(std::min(0xFF, red));
outputValue.setG(std::min(0xFF, green));
outputValue.setB(std::min(0xFF, blue));
outputValue.setA(std::min(0xFF, alpha));
} else if (sscanf(_input.c_str(), "%u,%u,%u", &red, &green, &blue) == 3) {
outputValue.setR(std::min(0xFF, red));
outputValue.setG(std::min(0xFF, green));
outputValue.setB(std::min(0xFF, blue));
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
return outputValue;
}
etk::Color<uint8_t, 4> etk::parseStringColorNamed(const std::string& _input) {
// direct named color ...
for (int32_t iii=0; iii<getColorSize(); iii++) {
if (std::compare_no_case(getColorList()[iii].colorName, _input) == true) {
return getColorList()[iii].color;
}
}
TK_ERROR(" pb in parsing the color : '" << _input << "' not find ...");
return etk::Color<uint8_t, 4>(0,0,0,0);
}
template<> uint32_t etk::Color<uint8_t, 4>::get() const {
return (((uint32_t)m_element[0])<<24)
+ (((uint32_t)m_element[1])<<16)
+ (((uint32_t)m_element[2])<<8)
+ (uint32_t)m_element[3];
}
const etk::Color<> etk::color::none(0x00, 0x00, 0x00, 0x00);
const etk::Color<> etk::color::aliceBlue(0xF0, 0xF8, 0xFF, 0xFF);
const etk::Color<> etk::color::antiqueWhite(0xFA, 0xEB, 0xD7, 0xFF);
const etk::Color<> etk::color::aqua(0x00, 0xFF, 0xFF, 0xFF);
const etk::Color<> etk::color::aquamarine(0x7F, 0xFF, 0xD4, 0xFF);
const etk::Color<> etk::color::azure(0xF0, 0xFF, 0xFF, 0xFF);
const etk::Color<> etk::color::beige(0xF5, 0xF5, 0xDC, 0xFF);
const etk::Color<> etk::color::bisque(0xFF, 0xE4, 0xC4, 0xFF);
const etk::Color<> etk::color::black(0x00, 0x00, 0x00, 0xFF);
const etk::Color<> etk::color::blanchedAlmond(0xFF, 0xEB, 0xCD, 0xFF);
const etk::Color<> etk::color::blue(0x00, 0x00, 0xFF, 0xFF);
const etk::Color<> etk::color::blueViolet(0x8A, 0x2B, 0xE2, 0xFF);
const etk::Color<> etk::color::brown(0xA5, 0x2A, 0x2A, 0xFF);
const etk::Color<> etk::color::burlyWood(0xDE, 0xB8, 0x87, 0xFF);
const etk::Color<> etk::color::cadetBlue(0x5F, 0x9E, 0xA0, 0xFF);
const etk::Color<> etk::color::chartreuse(0x7F, 0xFF, 0x00, 0xFF);
const etk::Color<> etk::color::chocolate(0xD2, 0x69, 0x1E, 0xFF);
const etk::Color<> etk::color::coral(0xFF, 0x7F, 0x50, 0xFF);
const etk::Color<> etk::color::cornflowerBlue(0x64, 0x95, 0xED, 0xFF);
const etk::Color<> etk::color::cornsilk(0xFF, 0xF8, 0xDC, 0xFF);
const etk::Color<> etk::color::crimson(0xDC, 0x14, 0x3C, 0xFF);
const etk::Color<> etk::color::cyan(0x00, 0xFF, 0xFF, 0xFF);
const etk::Color<> etk::color::darkBlue(0x00, 0x00, 0x8B, 0xFF);
const etk::Color<> etk::color::darkCyan(0x00, 0x8B, 0x8B, 0xFF);
const etk::Color<> etk::color::darkGoldenRod(0xB8, 0x86, 0x0B, 0xFF);
const etk::Color<> etk::color::darkGray(0xA9, 0xA9, 0xA9, 0xFF);
const etk::Color<> etk::color::darkGrey(0xA9, 0xA9, 0xA9, 0xFF);
const etk::Color<> etk::color::darkGreen(0x00, 0x64, 0x00, 0xFF);
const etk::Color<> etk::color::darkKhaki(0xBD, 0xB7, 0x6B, 0xFF);
const etk::Color<> etk::color::darkMagenta(0x8B, 0x00, 0x8B, 0xFF);
const etk::Color<> etk::color::darkOliveGreen(0x55, 0x6B, 0x2F, 0xFF);
const etk::Color<> etk::color::darkorange(0xFF, 0x8C, 0x00, 0xFF);
const etk::Color<> etk::color::darkOrchid(0x99, 0x32, 0xCC, 0xFF);
const etk::Color<> etk::color::darkRed(0x8B, 0x00, 0x00, 0xFF);
const etk::Color<> etk::color::darkSalmon(0xE9, 0x96, 0x7A, 0xFF);
const etk::Color<> etk::color::darkSeaGreen(0x8F, 0xBC, 0x8F, 0xFF);
const etk::Color<> etk::color::darkSlateBlue(0x48, 0x3D, 0x8B, 0xFF);
const etk::Color<> etk::color::darkSlateGray(0x2F, 0x4F, 0x4F, 0xFF);
const etk::Color<> etk::color::darkSlateGrey(0x2F, 0x4F, 0x4F, 0xFF);
const etk::Color<> etk::color::darkTurquoise(0x00, 0xCE, 0xD1, 0xFF);
const etk::Color<> etk::color::darkViolet(0x94, 0x00, 0xD3, 0xFF);
const etk::Color<> etk::color::deepPink(0xFF, 0x14, 0x93, 0xFF);
const etk::Color<> etk::color::deepSkyBlue(0x00, 0xBF, 0xFF, 0xFF);
const etk::Color<> etk::color::dimGray(0x69, 0x69, 0x69, 0xFF);
const etk::Color<> etk::color::dimGrey(0x69, 0x69, 0x69, 0xFF);
const etk::Color<> etk::color::dodgerBlue(0x1E, 0x90, 0xFF, 0xFF);
const etk::Color<> etk::color::fireBrick(0xB2, 0x22, 0x22, 0xFF);
const etk::Color<> etk::color::floralWhite(0xFF, 0xFA, 0xF0, 0xFF);
const etk::Color<> etk::color::forestGreen(0x22, 0x8B, 0x22, 0xFF);
const etk::Color<> etk::color::fuchsia(0xFF, 0x00, 0xFF, 0xFF);
const etk::Color<> etk::color::gainsboro(0xDC, 0xDC, 0xDC, 0xFF);
const etk::Color<> etk::color::ghostWhite(0xF8, 0xF8, 0xFF, 0xFF);
const etk::Color<> etk::color::gold(0xFF, 0xD7, 0x00, 0xFF);
const etk::Color<> etk::color::goldenRod(0xDA, 0xA5, 0x20, 0xFF);
const etk::Color<> etk::color::gray(0x80, 0x80, 0x80, 0xFF);
const etk::Color<> etk::color::grey(0x80, 0x80, 0x80, 0xFF);
const etk::Color<> etk::color::green(0x00, 0x80, 0x00, 0xFF);
const etk::Color<> etk::color::greenYellow(0xAD, 0xFF, 0x2F, 0xFF);
const etk::Color<> etk::color::honeyDew(0xF0, 0xFF, 0xF0, 0xFF);
const etk::Color<> etk::color::hotPink(0xFF, 0x69, 0xB4, 0xFF);
const etk::Color<> etk::color::indianRed (0xCD, 0x5C, 0x5C, 0xFF);
const etk::Color<> etk::color::indigo (0x4B, 0x00, 0x82, 0xFF);
const etk::Color<> etk::color::ivory(0xFF, 0xFF, 0xF0, 0xFF);
const etk::Color<> etk::color::khaki(0xF0, 0xE6, 0x8C, 0xFF);
const etk::Color<> etk::color::lavender(0xE6, 0xE6, 0xFA, 0xFF);
const etk::Color<> etk::color::lavenderBlush(0xFF, 0xF0, 0xF5, 0xFF);
const etk::Color<> etk::color::lawnGreen(0x7C, 0xFC, 0x00, 0xFF);
const etk::Color<> etk::color::lemonChiffon(0xFF, 0xFA, 0xCD, 0xFF);
const etk::Color<> etk::color::lightBlue(0xAD, 0xD8, 0xE6, 0xFF);
const etk::Color<> etk::color::lightCoral(0xF0, 0x80, 0x80, 0xFF);
const etk::Color<> etk::color::lightCyan(0xE0, 0xFF, 0xFF, 0xFF);
const etk::Color<> etk::color::lightGoldenRodYellow(0xFA, 0xFA, 0xD2, 0xFF);
const etk::Color<> etk::color::lightGray(0xD3, 0xD3, 0xD3, 0xFF);
const etk::Color<> etk::color::lightGrey(0xD3, 0xD3, 0xD3, 0xFF);
const etk::Color<> etk::color::lightGreen(0x90, 0xEE, 0x90, 0xFF);
const etk::Color<> etk::color::lightPink(0xFF, 0xB6, 0xC1, 0xFF);
const etk::Color<> etk::color::lightSalmon(0xFF, 0xA0, 0x7A, 0xFF);
const etk::Color<> etk::color::lightSeaGreen(0x20, 0xB2, 0xAA, 0xFF);
const etk::Color<> etk::color::lightSkyBlue(0x87, 0xCE, 0xFA, 0xFF);
const etk::Color<> etk::color::lightSlateGray(0x77, 0x88, 0x99, 0xFF);
const etk::Color<> etk::color::lightSlateGrey(0x77, 0x88, 0x99, 0xFF);
const etk::Color<> etk::color::lightSteelBlue(0xB0, 0xC4, 0xDE, 0xFF);
const etk::Color<> etk::color::lightYellow(0xFF, 0xFF, 0xE0, 0xFF);
const etk::Color<> etk::color::lime(0x00, 0xFF, 0x00, 0xFF);
const etk::Color<> etk::color::limeGreen(0x32, 0xCD, 0x32, 0xFF);
const etk::Color<> etk::color::linen(0xFA, 0xF0, 0xE6, 0xFF);
const etk::Color<> etk::color::magenta(0xFF, 0x00, 0xFF, 0xFF);
const etk::Color<> etk::color::maroon(0x80, 0x00, 0x00, 0xFF);
const etk::Color<> etk::color::mediumAquaMarine(0x66, 0xCD, 0xAA, 0xFF);
const etk::Color<> etk::color::mediumBlue(0x00, 0x00, 0xCD, 0xFF);
const etk::Color<> etk::color::mediumOrchid(0xBA, 0x55, 0xD3, 0xFF);
const etk::Color<> etk::color::mediumPurple(0x93, 0x70, 0xD8, 0xFF);
const etk::Color<> etk::color::mediumSeaGreen(0x3C, 0xB3, 0x71, 0xFF);
const etk::Color<> etk::color::mediumSlateBlue(0x7B, 0x68, 0xEE, 0xFF);
const etk::Color<> etk::color::mediumSpringGreen(0x00, 0xFA, 0x9A, 0xFF);
const etk::Color<> etk::color::mediumTurquoise(0x48, 0xD1, 0xCC, 0xFF);
const etk::Color<> etk::color::mediumVioletRed(0xC7, 0x15, 0x85, 0xFF);
const etk::Color<> etk::color::midnightBlue(0x19, 0x19, 0x70, 0xFF);
const etk::Color<> etk::color::mintCream(0xF5, 0xFF, 0xFA, 0xFF);
const etk::Color<> etk::color::mistyRose(0xFF, 0xE4, 0xE1, 0xFF);
const etk::Color<> etk::color::moccasin(0xFF, 0xE4, 0xB5, 0xFF);
const etk::Color<> etk::color::navajoWhite(0xFF, 0xDE, 0xAD, 0xFF);
const etk::Color<> etk::color::navy(0x00, 0x00, 0x80, 0xFF);
const etk::Color<> etk::color::oldLace(0xFD, 0xF5, 0xE6, 0xFF);
const etk::Color<> etk::color::olive(0x80, 0x80, 0x00, 0xFF);
const etk::Color<> etk::color::oliveDrab(0x6B, 0x8E, 0x23, 0xFF);
const etk::Color<> etk::color::orange(0xFF, 0xA5, 0x00, 0xFF);
const etk::Color<> etk::color::orangeRed(0xFF, 0x45, 0x00, 0xFF);
const etk::Color<> etk::color::orchid(0xDA, 0x70, 0xD6, 0xFF);
const etk::Color<> etk::color::paleGoldenRod(0xEE, 0xE8, 0xAA, 0xFF);
const etk::Color<> etk::color::paleGreen(0x98, 0xFB, 0x98, 0xFF);
const etk::Color<> etk::color::paleTurquoise(0xAF, 0xEE, 0xEE, 0xFF);
const etk::Color<> etk::color::paleVioletRed(0xD8, 0x70, 0x93, 0xFF);
const etk::Color<> etk::color::papayaWhip(0xFF, 0xEF, 0xD5, 0xFF);
const etk::Color<> etk::color::peachPuff(0xFF, 0xDA, 0xB9, 0xFF);
const etk::Color<> etk::color::peru(0xCD, 0x85, 0x3F, 0xFF);
const etk::Color<> etk::color::pink(0xFF, 0xC0, 0xCB, 0xFF);
const etk::Color<> etk::color::plum(0xDD, 0xA0, 0xDD, 0xFF);
const etk::Color<> etk::color::powderBlue(0xB0, 0xE0, 0xE6, 0xFF);
const etk::Color<> etk::color::purple(0x80, 0x00, 0x80, 0xFF);
const etk::Color<> etk::color::red(0xFF, 0x00, 0x00, 0xFF);
const etk::Color<> etk::color::rosyBrown(0xBC, 0x8F, 0x8F, 0xFF);
const etk::Color<> etk::color::royalBlue(0x41, 0x69, 0xE1, 0xFF);
const etk::Color<> etk::color::saddleBrown(0x8B, 0x45, 0x13, 0xFF);
const etk::Color<> etk::color::salmon(0xFA, 0x80, 0x72, 0xFF);
const etk::Color<> etk::color::sandyBrown(0xF4, 0xA4, 0x60, 0xFF);
const etk::Color<> etk::color::seaGreen(0x2E, 0x8B, 0x57, 0xFF);
const etk::Color<> etk::color::seaShell(0xFF, 0xF5, 0xEE, 0xFF);
const etk::Color<> etk::color::sienna(0xA0, 0x52, 0x2D, 0xFF);
const etk::Color<> etk::color::silver(0xC0, 0xC0, 0xC0, 0xFF);
const etk::Color<> etk::color::skyBlue(0x87, 0xCE, 0xEB, 0xFF);
const etk::Color<> etk::color::slateBlue(0x6A, 0x5A, 0xCD, 0xFF);
const etk::Color<> etk::color::slateGray(0x70, 0x80, 0x90, 0xFF);
const etk::Color<> etk::color::slateGrey(0x70, 0x80, 0x90, 0xFF);
const etk::Color<> etk::color::snow(0xFF, 0xFA, 0xFA, 0xFF);
const etk::Color<> etk::color::springGreen(0x00, 0xFF, 0x7F, 0xFF);
const etk::Color<> etk::color::steelBlue(0x46, 0x82, 0xB4, 0xFF);
const etk::Color<> etk::color::tan(0xD2, 0xB4, 0x8C, 0xFF);
const etk::Color<> etk::color::teal(0x00, 0x80, 0x80, 0xFF);
const etk::Color<> etk::color::thistle(0xD8, 0xBF, 0xD8, 0xFF);
const etk::Color<> etk::color::tomato(0xFF, 0x63, 0x47, 0xFF);
const etk::Color<> etk::color::turquoise(0x40, 0xE0, 0xD0, 0xFF);
const etk::Color<> etk::color::violet(0xEE, 0x82, 0xEE, 0xFF);
const etk::Color<> etk::color::wheat(0xF5, 0xDE, 0xB3, 0xFF);
const etk::Color<> etk::color::white(0xFF, 0xFF, 0xFF, 0xFF);
const etk::Color<> etk::color::whiteSmoke(0xF5, 0xF5, 0xF5, 0xFF);
const etk::Color<> etk::color::yellow(0xFF, 0xFF, 0x00, 0xFF);
const etk::Color<> etk::color::yellowGreen(0x9A, 0xCD, 0x32, 0xFF);
static const colorList_ts listOfColor[] = {
{ "none", etk::color::none},
@ -547,3 +507,42 @@ static int32_t getColorSize()
static const int32_t tmpp = sizeof(listOfColor) / sizeof(colorList_ts);
return tmpp;
}
namespace etk {
#include "Color_8_bits.cxx"
#include "Color_16_bits.cxx"
#include "Color_32_bits.cxx"
#include "Color_float.cxx"
#include "Color_double.cxx"
};
/*
template<> Color<float,4>::Color(const etk::Color<uint8_t, 4>& _obj) {
if (MY_TYPE_SIZE >= 1) {
if (MY_TYPE_SIZE_2 >= 1) {
m_element[0] = (float)_obj.m_element[0] / 255.0f;
}
}
if (MY_TYPE_SIZE >= 2) {
if (MY_TYPE_SIZE_2 >= 2) {
m_element[1] = (float)_obj.m_element[1] / 255.0f;
} else {
m_element[1] = 0;
}
}
if (MY_TYPE_SIZE >= 3) {
if (MY_TYPE_SIZE_2 >= 3) {
m_element[2] = (float)_obj.m_element[2] / 255.0f;
} else {
m_element[2] = 0;
}
}
if (MY_TYPE_SIZE >= 4) {
if (MY_TYPE_SIZE_2 >= 4) {
m_element[3] = (float)_obj.m_element[3] / 255.0f;
} else {
m_element[3] = 0;
}
}
}
*/

View File

@ -31,12 +31,9 @@ namespace etk {
*
* @template-param MY_TYPE Type of the internal template value. The generic value is uint8_t and float
*/
template<class MY_TYPE=uint8_t> class Color {
template<typename MY_TYPE=uint8_t, int MY_TYPE_SIZE=4> class Color {
private:
MY_TYPE m_r; //!< Red color value.
MY_TYPE m_g; //!< Green color value.
MY_TYPE m_b; //!< Blue color value
MY_TYPE m_a; //!< Alpha blending value.
MY_TYPE m_element[MY_TYPE_SIZE]; //!< all the color.
public:
/**
* @brief Constructor. It does not initialise element of class.
@ -49,51 +46,27 @@ namespace etk {
* @param[in] _b Blue color.
* @param[in] _a Alpha blending.
*/
Color(double _r, double _g, double _b, double _a=255) {
set((float)_r, (float)_g, (float)_b, (float)_a);
};
/**
* @previous
*/
Color(float _r, float _g, float _b, float _a=255) {
Color(MY_TYPE _r, MY_TYPE _g, MY_TYPE _b, MY_TYPE _a) {
set(_r, _g, _b, _a);
};
/**
* @previous
*/
Color(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a=255) {
set(_r, _g, _b, _a);
//! @previous
Color(MY_TYPE _r, MY_TYPE _g, MY_TYPE _b) {
set(_r, _g, _b);
};
/**
* @previous
*/
Color(int _r, int _g, int _b, int _a=255) {
set(_r, _g, _b, _a);
//! @previous
Color(MY_TYPE _r, MY_TYPE _g) {
set(_r, _g);
};
/**
* @brief Constructor with the single integer input.
* @note Not forger the alpha blending at the end
* @param[in] _input rgba integer value : 0xrrggbbaa >> 0x99AF6DFF
*/
Color(uint32_t _input) {
set((uint8_t)((_input&0xFF000000)>>24),
(uint8_t)((_input&0x00FF0000)>>16),
(uint8_t)((_input&0x0000FF00)>>8),
(uint8_t)((_input&0x000000FF)));
//! @previous
Color(MY_TYPE _r) {
set(_r);
};
/**
* @brief Copy contructor or convert contructor
* @param[in] _obj Element to copy in this new color class.
*/
Color(const etk::Color<float>& _obj) {
set(_obj.r(), _obj.g(), _obj.b(), _obj.a());
};
/**
* @previous
*/
Color(const etk::Color<uint8_t>& _obj) {
set(_obj.r(), _obj.g(), _obj.b(), _obj.a());
};
template<typename MY_TYPE_2, int MY_TYPE_SIZE_2>
Color(const etk::Color<MY_TYPE_2, MY_TYPE_SIZE_2>& _obj);
/**
* @brief String extractor constructor.
* @param[in] _input Color string to parse. it can be : "#rrggbb", "rgb", "rrggbbaa", "rgba", "blueviolet" ...
@ -104,11 +77,10 @@ namespace etk {
* @param[in] _input Color object to set in this class.
* @return reference on this element.
*/
Color<MY_TYPE>& operator=(const etk::Color<MY_TYPE>& _input) {
m_r = _input.m_r;
m_g = _input.m_g;
m_b = _input.m_b;
m_a = _input.m_a;
Color<MY_TYPE,MY_TYPE_SIZE>& operator=(const etk::Color<MY_TYPE,MY_TYPE_SIZE>& _input) {
for (size_t iii=0; iii<MY_TYPE_SIZE; ++iii) {
m_element[iii] = _input.m_element[iii];
}
return *this;
};
/**
@ -117,12 +89,11 @@ namespace etk {
* @return true This is not the same color
* @return false This is the same color.
*/
bool operator!= (const etk::Color<MY_TYPE>& _obj) const {
if( m_r != _obj.m_r
|| m_g != _obj.m_g
|| m_b != _obj.m_b
|| m_a != _obj.m_a) {
return true;
bool operator!= (const etk::Color<MY_TYPE,MY_TYPE_SIZE>& _obj) const {
for (size_t iii=0; iii<MY_TYPE_SIZE; ++iii) {
if(m_element[iii] != _obj.m_element[iii]) {
return true;
}
}
return false;
}
@ -132,12 +103,11 @@ namespace etk {
* @return true This is the same color.
* @return false The color are different.
*/
bool operator== (const etk::Color<MY_TYPE>& _obj) const {
if( m_r != _obj.m_r
|| m_g != _obj.m_g
|| m_b != _obj.m_b
|| m_a != _obj.m_a) {
return false;
bool operator== (const etk::Color<MY_TYPE,MY_TYPE_SIZE>& _obj) const {
for (size_t iii=0; iii<MY_TYPE_SIZE; ++iii) {
if(m_element[iii] != _obj.m_element[iii]) {
return false;
}
}
return true;
}
@ -153,16 +123,65 @@ namespace etk {
* @param[in] _b Blue color.
* @param[in] _a Alpha blending.
*/
void set(float _r, float _g, float _b, float _a=255);
void set(MY_TYPE _r, MY_TYPE _g, MY_TYPE _b, MY_TYPE _a) {
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
}
if (MY_TYPE_SIZE >= 2) {
m_element[1] = _g;
}
if (MY_TYPE_SIZE >= 3) {
m_element[2] = _b;
}
if (MY_TYPE_SIZE >= 4) {
m_element[3] = _a;
}
};
//! @previous
void set(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a=255);
void set(MY_TYPE _r, MY_TYPE _g, MY_TYPE _b) {
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
}
if (MY_TYPE_SIZE >= 2) {
m_element[1] = _g;
}
if (MY_TYPE_SIZE >= 3) {
m_element[2] = _b;
}
if (MY_TYPE_SIZE >= 4) {
m_element[3] = 0;
}
};
//! @previous
void set(int _r, int _g, int _b, int _a=255) {
set((uint8_t)(etk_avg(0,_r,255)),
(uint8_t)(etk_avg(0,_g,255)),
(uint8_t)(etk_avg(0,_b,255)),
(uint8_t)(etk_avg(0,_a,255)) );
}
void set(MY_TYPE _r, MY_TYPE _g) {
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
}
if (MY_TYPE_SIZE >= 2) {
m_element[1] = _g;
}
if (MY_TYPE_SIZE >= 3) {
m_element[2] = 0;
}
if (MY_TYPE_SIZE >= 4) {
m_element[3] = 0;
}
};
//! @previous
void set(MY_TYPE _r) {
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
}
if (MY_TYPE_SIZE >= 2) {
m_element[1] = 0;
}
if (MY_TYPE_SIZE >= 3) {
m_element[2] = 0;
}
if (MY_TYPE_SIZE >= 4) {
m_element[3] = 0;
}
};
/**
* @brief Convert the color in an hexedecimal string ("0xFEDCBA98")
* @return The formated string
@ -186,66 +205,282 @@ namespace etk {
* @return The red color.
*/
MY_TYPE r() const {
return m_r;
if (MY_TYPE_SIZE >= 1) {
return m_element[0];
} else {
return 0;
}
};
/**
* @brief Get green color.
* @return The green color.
*/
MY_TYPE g() const {
return m_g;
if (MY_TYPE_SIZE >= 2) {
return m_element[1];
} else {
return 0;
}
};
/**
* @brief Get blue color.
* @return The blue color.
*/
MY_TYPE b() const {
return m_b;
if (MY_TYPE_SIZE >= 3) {
return m_element[2];
} else {
return 0;
}
};
/**
* @brief Get alpha blending.
* @return The alpha blending.
*/
MY_TYPE a() const {
return m_a;
if (MY_TYPE_SIZE >= 4) {
return m_element[3];
} else {
return 0;
}
};
/**
* @brief Set red color.
* @param[in] _r The red color to set.
*/
void setR(MY_TYPE _r) {
m_r=_r;
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
}
};
/**
* @brief Set green color.
* @param[in] _g The green color to set.
*/
void setG(MY_TYPE _g) {
m_g=_g;
if (MY_TYPE_SIZE >= 2) {
m_element[1] = _g;
}
};
/**
* @brief Set blue color.
* @param[in] _b The blue color to set.
*/
void setB(MY_TYPE _b) {
m_b=_b;
if (MY_TYPE_SIZE >= 3) {
m_element[2] = _b;
}
};
/**
* @brief Set alpha blending.
* @param[in] _a The alpha blending to set.
*/
void setA(MY_TYPE _a) {
m_a=_a;
if (MY_TYPE_SIZE >= 4) {
m_element[3] = _a;
}
};
};
etk::Color<uint8_t, 4> parseStringStartWithSharp(const std::string& _input);
etk::Color<uint8_t, 4> parseStringStartWithRGBGen(const std::string& _input);
etk::Color<double, 4> parseStringStartWithRGB(const std::string& _input);
etk::Color<uint32_t, 4> parseStringStartWithRGBUnsigned32(const std::string& _input);
etk::Color<uint16_t, 4> parseStringStartWithRGBUnsigned16(const std::string& _input);
etk::Color<uint8_t, 4> parseStringStartWithRGBUnsigned8(const std::string& _input);
etk::Color<uint8_t, 4> parseStringColorNamed(const std::string& _input);
template<> uint32_t Color<uint8_t, 4>::get() const;
template<typename MY_TYPE, int MY_TYPE_SIZE> uint32_t Color<MY_TYPE, MY_TYPE_SIZE>::get() const {
Color<uint8_t, 4> tmp(*this);
return tmp.get();
}
template<typename MY_TYPE, int MY_TYPE_SIZE> Color<MY_TYPE, MY_TYPE_SIZE>::Color(const std::string& _input) {
const char* inputData = _input.c_str();
size_t len = _input.size();
if( len >=1
&& inputData[0] == '#') {
Color<uint8_t, 4> value = etk::parseStringStartWithSharp(std::string(_input, 1));
*this = value;
} else if(std::start_with(_input, "rgb(", false) == true) {
Color<uint8_t, 4> value = etk::parseStringStartWithRGBGen(std::string(_input, 4, _input.size()-1));
*this = value;
} else if(std::start_with(_input, "rgb[FLOAT](", false) == true) {
Color<double, 4> value = etk::parseStringStartWithRGB(std::string(_input, 11, _input.size()-1));
*this = value;
} else if(std::start_with(_input, "rgb[DOUBLE](", false) == true) {
Color<double, 4> value = etk::parseStringStartWithRGB(std::string(_input, 12, _input.size()-1));
*this = value;
} else if(std::start_with(_input, "rgb[U32](", false) == true) {
Color<uint32_t, 4> value = etk::parseStringStartWithRGBUnsigned32(std::string(_input, 9, _input.size()-1));
*this = value;
} else if(std::start_with(_input, "rgb[U16](", false) == true) {
Color<uint16_t, 4> value = etk::parseStringStartWithRGBUnsigned16(std::string(_input, 9, _input.size()-1));
*this = value;
} else if(std::start_with(_input, "rgb[U8](", false) == true) {
Color<uint8_t, 4> value = etk::parseStringStartWithRGBUnsigned8(std::string(_input, 8, _input.size()-1));
*this = value;
} else {
Color<uint8_t, 4> value = etk::parseStringColorNamed(_input);
*this = value;
}
};
//! @not-in-doc
std::ostream& operator <<(std::ostream& _os, const Color<uint8_t>& _obj);
template<int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const Color<uint8_t, MY_TYPE_SIZE>& _obj) { // RGB & RGBA 8 bits
if (MY_TYPE_SIZE >= 3) {
_os << "#";
_os << (std::to_string<uint32_t, 2>(_obj.r(), std::hex)).c_str();
if (MY_TYPE_SIZE >= 2) {
_os << (std::to_string<uint32_t, 2>(_obj.g(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 3) {
_os << (std::to_string<uint32_t, 2>(_obj.b(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 4) {
_os << (std::to_string<uint32_t, 2>(_obj.a(), std::hex)).c_str();
}
} else {
if (MY_TYPE_SIZE >= 2) {
_os << "be";
} else {
_os << "Mono";
}
_os << "[U8](";
_os << "0x" << (std::to_string<uint32_t, 2>(_obj.r(), std::hex)).c_str();
if (MY_TYPE_SIZE >= 2) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 2>(_obj.g(), std::hex)).c_str();
}
_os << ")";
}
return _os;
}
//! @not-in-doc
std::ostream& operator <<(std::ostream& _os, const Color<float>& _obj);
template<int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const Color<uint16_t, MY_TYPE_SIZE>& _obj) { // RGB & RGBA 8 bits
if (MY_TYPE_SIZE >= 4) {
_os << "rgba";
} else if (MY_TYPE_SIZE >= 3) {
_os << "rgb";
} else if (MY_TYPE_SIZE >= 2) {
_os << "be";
} else {
_os << "Mono";
}
_os << "[U16](";
_os << "0x" << (std::to_string<uint32_t, 4>(_obj.r(), std::hex)).c_str();
if (MY_TYPE_SIZE >= 2) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 4>(_obj.g(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 3) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 4>(_obj.b(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 4) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 4>(_obj.a(), std::hex)).c_str();
}
_os << ")";
return _os;
}
//! @not-in-doc
std::ostream& operator <<(std::ostream& _os, const std::vector<Color<uint8_t> >& _obj);
template<int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const Color<uint32_t, MY_TYPE_SIZE>& _obj) { // RGB & RGBA 8 bits
if (MY_TYPE_SIZE >= 4) {
_os << "rgba";
} else if (MY_TYPE_SIZE >= 3) {
_os << "rgb";
} else if (MY_TYPE_SIZE >= 2) {
_os << "be";
} else {
_os << "Mono";
}
_os << "[U32](";
_os << "0x" << (std::to_string<uint32_t, 8>(_obj.r(), std::hex)).c_str();
if (MY_TYPE_SIZE >= 2) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 8>(_obj.g(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 3) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 8>(_obj.b(), std::hex)).c_str();
}
if (MY_TYPE_SIZE >= 4) {
_os << ",";
_os << "0x" << (std::to_string<uint32_t, 8>(_obj.a(), std::hex)).c_str();
}
_os << ")";
return _os;
}
//! @not-in-doc
std::ostream& operator <<(std::ostream& _os, const std::vector<Color<float> >& _obj);
template<int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const Color<float, MY_TYPE_SIZE>& _obj) { // RGB float & RGBA float
if (MY_TYPE_SIZE >= 4) {
_os << "rgba";
} else if (MY_TYPE_SIZE >= 3) {
_os << "rgb";
} else if (MY_TYPE_SIZE >= 2) {
_os << "be";
} else {
_os << "Mono";
}
_os << "[FLOAT](";
_os << _obj.r();
if (MY_TYPE_SIZE >= 2) {
_os << ",";
_os << _obj.g();
}
if (MY_TYPE_SIZE >= 3) {
_os << ",";
_os << _obj.b();
}
if (MY_TYPE_SIZE >= 4) {
_os << ",";
_os << _obj.a();
}
_os << ")";
return _os;
}
//! @not-in-doc
template<int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const Color<double, MY_TYPE_SIZE>& _obj) { // RGB & RGBA 8 bits
if (MY_TYPE_SIZE >= 4) {
_os << "rgba";
} else if (MY_TYPE_SIZE >= 3) {
_os << "rgb";
} else if (MY_TYPE_SIZE >= 2) {
_os << "be";
} else {
_os << "Mono";
}
_os << "[double](";
_os << _obj.r();
if (MY_TYPE_SIZE >= 2) {
_os << ",";
_os << _obj.g();
}
if (MY_TYPE_SIZE >= 3) {
_os << ",";
_os << _obj.b();
}
if (MY_TYPE_SIZE >= 4) {
_os << ",";
_os << _obj.a();
}
_os << ")";
return _os;
}
//! @not-in-doc
template<typename MY_TYPE, int MY_TYPE_SIZE> std::ostream& operator <<(std::ostream& _os, const std::vector<Color<MY_TYPE, MY_TYPE_SIZE> >& _obj) {
for (size_t iii = 0; iii < _obj.size(); ++iii) {
if (iii != 0) {
_os << " ";
}
_os << _obj[iii];
}
return _os;
};
/**
* @brief List of all native define colors ...
*/

View File

@ -194,8 +194,8 @@ template<class CLASS_TYPE> class RegExpNode {
* @param[in] _max The maximum appear time.
*/
void setMult(uint32_t _min, uint32_t _max) {
m_multipleMin = etk_max(_min, 0);
m_multipleMax = etk_max(_max, 1);
m_multipleMin = std::max(_min, (uint32_t)0);
m_multipleMax = std::max(_max, (uint32_t)1);
}
protected:
/**

View File

@ -130,7 +130,7 @@ namespace etk
{
if (m_size != obj.m_size) {
//TK_CRITICAL("add 2 Matrix with différent size ... ==> generate the max size of all the 2 matrix");
etk::Matrix<T> tmpMatrix(etk_max(m_size.x,obj.m_size.x), etk_max(m_size.y,obj.m_size.y));
etk::Matrix<T> tmpMatrix(std::max(m_size.x,obj.m_size.x), std::max(m_size.y,obj.m_size.y));
for (int32_t jjj=0; jjj< m_size.y; jjj++) {
T* tmpPointer = tmpMatrix[jjj];
T* tmpPointerIn = (*this)[jjj];
@ -171,7 +171,7 @@ namespace etk
{
if (m_size != obj.m_size) {
//TK_CRITICAL("less 2 Matrix with différent size ... ==> generate the max size of all the 2 matrix");
etk::Matrix<T> tmpMatrix(etk_max(m_size.x,obj.m_size.x), etk_max(m_size.y,obj.m_size.y));
etk::Matrix<T> tmpMatrix(std::max(m_size.x,obj.m_size.x), std::max(m_size.y,obj.m_size.y));
for (int32_t jjj=0; jjj< m_size.y; jjj++) {
T* tmpPointer = tmpMatrix[jjj];
T* tmpPointerIn = (*this)[jjj];
@ -459,7 +459,7 @@ namespace etk
void identity()
{
// copy data for the same size :
for (int32_t iii=0; iii< etk_min(m_size.x, m_size.y); iii++) {
for (int32_t iii=0; iii< std::mim(m_size.x, m_size.y); iii++) {
(*this)(iii,iii) = (T)1;
}
};

View File

@ -14,6 +14,8 @@
#include <sstream>
#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
namespace u32char {
extern const char32_t Null; //!< '\0'
@ -109,14 +111,22 @@ namespace std {
//! @previous
std::u32string to_u32string(long double _val);
template<class T> std::string to_string(T t, std::ios_base & (*f)(std::ios_base&)) {
template<class T, int size=0> std::string to_string(T t, std::ios_base & (*f)(std::ios_base&)) {
std::ostringstream oss;
oss << f << t;
if (size==0) {
oss << f << t;
} else {
oss << std::setw(size) << std::setfill('0') << f << t;
}
return oss.str();
}
template<class T> std::u32string to_u32string(T t, std::ios_base & (*f)(std::ios_base&)) {
template<class T, int size=0> std::u32string to_u32string(T t, std::ios_base & (*f)(std::ios_base&)) {
std::ostringstream oss;
oss << f << t;
if (size==0) {
oss << f << t;
} else {
oss << std::setw(size) << std::setfill('0') << f << t;
}
return std::to_u32string(oss.str());
}
@ -209,6 +219,10 @@ namespace std {
void sort(std::vector<std::u32string *>& _list);
//! @previous
void sort(std::vector<std::string *>& _list);
template <class T> const T& avg(const T& a, const T& b, const T& c) {
return std::min(std::max(a,b),c);
}
};
namespace std {

View File

@ -40,11 +40,6 @@
#define UINT64_MAX (__UINT64_C(18446744073709551615))
#endif
#endif
#define etk_min(elemA,elemB) (((elemA)<(elemB)) ? (elemA) : (elemB))
#define etk_max(elemA,elemB) (((elemA)<(elemB)) ? (elemB) : (elemA))
#define etk_avg(minimim,elem,maximum) (((minimim)>(elem)) ? (minimim) : ((maximum)<(elem)) ? (maximum) : (elem))
#include <etk/stdTools.h>
typedef float float_t;

View File

@ -14,6 +14,7 @@
#include <etk/os/FSNode.h>
#include <etk/archive/Archive.h>
#include <etk/log.h>
#include <etk/Color.h>
#undef __class__
#define __class__ "etktest"
@ -131,6 +132,62 @@ void testDimension() {
exit(0);
}
*/
void testColor() {
TK_INFO("==> test of COLOR (START)");
etk::Color<uint8_t, 4> colorRGBA8(0x52,0x0F, 0x65, 0x44);
etk::Color<uint16_t, 4> colorRGBA16(0x52,0x0F, 0x65, 0x44);
etk::Color<uint32_t, 4> colorRGBA32(0x52,0x0F, 0x65, 0x44);
etk::Color<float, 4> colorRGBAF(0.1,0.2, 0.8, 1.0);
etk::Color<uint8_t, 3> colorRGB8(0x52,0x0F, 0x65);
etk::Color<uint16_t, 3> colorRGB16(0x52,0x0F, 0x65);
etk::Color<uint32_t, 3> colorRGB32(0x52,0x0F, 0x65);
etk::Color<float, 3> colorRGBF(0.1,0.2, 0.8);
etk::Color<uint8_t, 1> colorMono8(0x52);
etk::Color<uint16_t, 1> colorMono16(0x52);
etk::Color<uint32_t, 1> colorMono32(0x52);
etk::Color<float, 1> colorMonoF(5200.22);
etk::Color<double, 1> colorMonoD(520000.22);
/*
etk::Color<uint8_t, 4> colorRGBA8__("#520F6544");
etk::Color<uint16_t, 4> colorRGBA16__("rgba(0x52, 0x0F, 0x65, 0x44)");
etk::Color<uint32_t, 4> colorRGBA32__("rgba(0x52,0x0F, 0x65, 0x44)");
etk::Color<float, 4> colorRGBAF__("rgba(0.1,0.2, 0.8, 1.0)");
etk::Color<uint8_t, 3> colorRGB8__("rgba(0x52,0x0F, 0x65)");
etk::Color<uint16_t, 3> colorRGB16__("rgba(0x52,0x0F, 0x65)");
etk::Color<uint32_t, 3> colorRGB32__("rgba(0x52,0x0F, 0x65)");
etk::Color<float, 3> colorRGBF__("rgba(0.1,0.2, 0.8)");
etk::Color<uint8_t, 1> colorMono8__("mono(0x52)");
etk::Color<uint16_t, 1> colorMono16__("mono(0x52)");
etk::Color<uint32_t, 1> colorMono32__("mono(0x52)");
etk::Color<float, 1> colorMonoF__("mono(5200.22)");
etk::Color<double, 1> colorMonoD__("mono(520000.22)");
*/
etk::Color<float, 4> colorRGBAf__(colorRGBA8);
etk::Color<uint32_t, 2> colorXX332__(colorRGBA8);
TK_INFO("Create a color : RGBA 8 : " << colorRGBA8);
TK_INFO("Create a color : RGBA 8 : " << colorRGBAf__ << " (converted)");
TK_INFO("Create a color : XX 32 : " << colorXX332__ << " (converted)");
TK_INFO("Create a color : RGBA 16 : " << colorRGBA16);
TK_INFO("Create a color : RGBA 32 : " << colorRGBA32);
TK_INFO("Create a color : RGBA float : " << colorRGBAF);
TK_INFO("Create a color : RGB 8 : " << colorRGB8);
TK_INFO("Create a color : RGB 16 : " << colorRGB16);
TK_INFO("Create a color : RGB 32 : " << colorRGB32);
TK_INFO("Create a color : RGB float : " << colorRGBF);
TK_INFO("Create a color : MONO 8 : " << colorMono8);
TK_INFO("Create a color : MONO 16 : " << colorMono16);
TK_INFO("Create a color : MONO 32 : " << colorMono32);
TK_INFO("Create a color : MONO float : " << colorMonoF);
TK_INFO("Create a color : MONO double : " << colorMonoD);
TK_INFO("==> test of Color (STOP)");
exit(0);
}
int main(int argc, const char *argv[]) {
// the only one init for etk:
etk::log::setLevel(etk::log::logLevelDebug);
@ -143,6 +200,7 @@ int main(int argc, const char *argv[]) {
testFSNode();
//testDimension();
testArchive();
testColor();
return 0;
}