16 void AW_rgb16::rescale(uint16_t my_max) {
17 float scale =
MAX/my_max;
29 bool failed = (colorname[0] !=
'#');
32 unsigned long num = strtoul(colorname+1, const_cast<char**>(&end), 16);
33 int length = end-colorname-1;
36 case 3: R = num >> 8; G = (num >> 4) & 0xf; B = num & 0xf; rescale(0xf);
break;
37 case 6: R = num >> 16; G = (num >> 8) & 0xff; B = num & 0xff; rescale(0xff);
break;
38 case 9: R = num >> 24; G = (num >> 12) & 0xfff; B = num & 0xfff; rescale(0xfff);
break;
39 case 12: R = num >> 32; G = (num >> 16) & 0xffff; B = num & 0xffff;
break;
51 fprintf(stderr,
"Warning: Failed to interpret color '%s' - fallback to crazy pink\n", colorname);
57 const int FIXEDLEN = 1+3*4;
58 static char buffer[FIXEDLEN+1];
60 #if defined(ASSERTION_USED)
63 sprintf(buffer,
"#%04x%04x%04x", R, G, B);
79 #define TEST_ASCII_COLOR_CONVERT(i,o) TEST_EXPECT_EQUAL(AW_rgb16(i).ascii(),o)
80 #define TEST_ASCII_COLOR_IDENT(c) TEST_ASCII_COLOR_CONVERT(c,c);
82 #define TEST_NORMALIZED_CONVERSION(c) TEST_EXPECT_EQUAL(AW_rgb16(AW_rgb_normalized(AW_rgb16(c))).ascii(), c);
84 #define TEST_NORMALIZED_CONTAINS(col,expected) TEST_EXPECT_EQUAL(GBS_global_string("(%.2f,%.2f,%.2f)", \
85 (col).r(), (col).g(), (col).b()), \
88 #define TEST_DIFF_CONTAINS(diff,expected) TEST_NORMALIZED_CONTAINS(diff,expected)
116 TEST_ASCII_COLOR_CONVERT(
"#1" "2" "3",
"#1111" "2222" "3333");
117 TEST_ASCII_COLOR_CONVERT(
"#45" "67" "89",
"#4545" "6767" "8989");
118 TEST_ASCII_COLOR_CONVERT(
"#678" "9ab" "cde",
"#6786" "9ab9" "cdec");
119 TEST_ASCII_COLOR_CONVERT(
"#001" "010" "100",
"#0010" "0100" "1001");
121 TEST_ASCII_COLOR_IDENT(
"#0123456789ab");
122 TEST_ASCII_COLOR_IDENT(
"#fedcba987654");
131 TEST_NORMALIZED_CONVERSION(
"#000000000000");
132 TEST_NORMALIZED_CONVERSION(
"#0123456789ab");
133 TEST_NORMALIZED_CONVERSION(
"#ffffffffffff");
140 void TEST_rgb_diff() {
145 AW_rgb16 calc_orange = blue + blue2orange;
149 AW_rgb16 calc_blue = orange + orange2blue;
152 for (
float part = 0.1; part<1.0; part += 0.1) {
153 AW_rgb16 mix1 = orange + part * orange2blue;
154 AW_rgb16 mix2 = blue + (1-part) * blue2orange;
167 AW_rgb16 blacker = black - black2white;
178 TEST_DIFF_CONTAINS(blue2red,
"(1.00,0.00,-0.27)");
179 TEST_DIFF_CONTAINS(blue2green,
"(0.00,1.00,-0.27)");
180 TEST_DIFF_CONTAINS(blue2green.
abs(),
"(0.00,1.00,0.27)");
187 TEST_DIFF_CONTAINS(sum,
"(1.00,1.00,-0.53)");
188 TEST_DIFF_CONTAINS(abssum,
"(1.00,1.00,0.53)");
189 TEST_DIFF_CONTAINS(maxabsdiff,
"(1.00,1.00,0.27)");
198 TEST_DIFF_CONTAINS(orange2magenta,
"(0.00,-0.53,1.00)");
199 TEST_DIFF_CONTAINS(orange2cyan,
"(-1.00,0.47,1.00)");
206 TEST_DIFF_CONTAINS(sum,
"(-1.00,-0.07,2.00)");
207 TEST_DIFF_CONTAINS(abssum,
"(1.00,1.00,2.00)");
208 TEST_DIFF_CONTAINS(maxabsdiff,
"(1.00,0.53,1.00)");
225 failed = !XLookupColor(mroot->
display,
238 : AW_rgb16(col.red, col.green, col.blue);
static CONSTEXPR float MAX
char buffer[MESSAGE_BUFFERSIZE]
static AW_rgb16 convert_xcolorname(const char *xcolorname, bool &failed)
const char * ascii() const
static AW_root * SINGLETON
#define TEST_EXPECT(cond)
static AW_rgb16 CRAZY_PINK("#C0C")
#define TEST_EXPECT_EQUAL(expr, want)