@@ -26,13 +26,40 @@ template <> void Writer::handle(const Color& col) {
26
26
handle (format_color (col));
27
27
}
28
28
29
+ int parse_hex (Char c) {
30
+ if (c >= ' 0' && c <= ' 9' ) return c - ' 0' ;
31
+ if (c >= ' A' && c <= ' F' ) return c - ' A' + 10 ;
32
+ if (c >= ' a' && c <= ' f' ) return c - ' a' + 10 ;
33
+ return -1 ;
34
+ }
35
+ int parse_hex (Char c1, Char c2) {
36
+ int x1 = parse_hex (c1);
37
+ int x2 = parse_hex (c2);
38
+ if (x1 >= 0 && x2 >= 0 ) return 16 *x1 + x2;
39
+ return -1 ;
40
+ }
29
41
30
42
optional<Color> parse_color (const String& v) {
31
43
UInt r,g,b,a;
32
44
if (wxSscanf (v.c_str (),_ (" rgb(%u,%u,%u)" ),&r,&g,&b)) {
33
45
return Color (r, g, b);
34
46
} else if (wxSscanf (v.c_str (),_ (" rgba(%u,%u,%u,%u)" ),&r,&g,&b,&a)) {
35
47
return Color (r, g, b, a);
48
+ } else if (v.size () > 0 && v[0 ] == ' #' ) {
49
+ if (v.size () == 4 ) {
50
+ int r = parse_hex (v[1 ]), g = parse_hex (v[2 ]), b = parse_hex (v[3 ]);
51
+ if (r >= 0 && g >= 0 && b >= 0 ) return Color (17 * r, 17 * g, 17 * b);
52
+ } else if (v.size () == 5 ) {
53
+ int r = parse_hex (v[1 ]), g = parse_hex (v[2 ]), b = parse_hex (v[3 ]), a = parse_hex (v[4 ]);
54
+ if (r >= 0 && g >= 0 && b >= 0 && a >= 0 ) return Color (17 * r, 17 * g, 17 * b, 17 * a);
55
+ } else if (v.size () == 7 ) {
56
+ int r = parse_hex (v[1 ], v[2 ]), g = parse_hex (v[3 ],v[4 ]), b = parse_hex (v[5 ],v[6 ]);
57
+ if (r >= 0 && g >= 0 && b >= 0 ) return Color (r, g, b);
58
+ } else if (v.size () == 9 ) {
59
+ int r = parse_hex (v[1 ], v[2 ]), g = parse_hex (v[3 ],v[4 ]), b = parse_hex (v[5 ],v[6 ]), a = parse_hex (v[7 ],v[8 ]);
60
+ if (r >= 0 && g >= 0 && b >= 0 && a >= 0 ) return Color (r, g, b, a);
61
+ }
62
+ return nullopt ;
36
63
} else if (v == _ (" transparent" )) {
37
64
return Color (0 ,0 ,0 ,0 );
38
65
} else {
@@ -41,16 +68,14 @@ optional<Color> parse_color(const String& v) {
41
68
if (c.Ok ()) {
42
69
return Color (c);
43
70
} else {
44
- return optional<Color>() ;
71
+ return nullopt ;
45
72
}
46
73
}
47
74
}
48
75
49
76
String format_color (Color col) {
50
77
if (col.Alpha () == 255 ) {
51
78
return String::Format (_ (" rgb(%u,%u,%u)" ), col.Red (), col.Green (), col.Blue ());
52
- } else if (col.Alpha () == 0 ) {
53
- return _ (" transparent" );
54
79
} else {
55
80
return String::Format (_ (" rgba(%u,%u,%u,%u)" ), col.Red (), col.Green (), col.Blue (), col.Alpha ());
56
81
}
0 commit comments