2 using System.Globalization;
4 namespace Tizen.NUI.Binding
6 [Xaml.ProvideCompiled("Tizen.NUI.Xaml.Core.XamlC.ColorTypeConverter")]
7 [Xaml.TypeConversion(typeof(Color))]
8 internal class ColorTypeConverter : TypeConverter
11 // HEX #rgb, #argb, #rrggbb, #aarrggbb
12 // float array 0.5,0.5,0.5,0.5
13 // Predefined color case insensitive
14 public override object ConvertFromInvariantString(string value)
19 if (value.StartsWith("#", StringComparison.Ordinal))
21 return FromHex(value);
24 string[] parts = value.Split(',');
25 if (parts.Length == 1) //like Red or Color.Red
27 parts = value.Split('.');
28 if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
30 string color = parts[parts.Length - 1];
33 case "Black": return Color.Black;
34 case "White": return Color.White;
35 case "Red": return Color.Red;
36 case "Green": return Color.Green;
37 case "Blue": return Color.Blue;
38 case "Yellow": return Color.Yellow;
39 case "Magenta": return Color.Magenta;
40 case "Cyan": return Color.Cyan;
41 case "Transparent": return Color.Transparent;
45 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
47 return new Color(Single.Parse(parts[0].Trim(), CultureInfo.InvariantCulture),
48 Single.Parse(parts[1].Trim(), CultureInfo.InvariantCulture),
49 Single.Parse(parts[2].Trim(), CultureInfo.InvariantCulture),
50 Single.Parse(parts[3].Trim(), CultureInfo.InvariantCulture));
54 throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
57 static uint ToHex(char c)
60 if (x >= '0' && x <= '9')
61 return (uint)(x - '0');
64 if (x >= 'a' && x <= 'f')
65 return (uint)(x - 'a' + 10);
69 static uint ToHexD(char c)
75 public static Color FromRgba(int r, int g, int b, int a)
77 float red = (float)r / 255;
78 float green = (float)g / 255;
79 float blue = (float)b / 255;
80 float alpha = (float)a / 255;
81 return new Color(red, green, blue, alpha);
84 public static Color FromRgb(int r, int g, int b)
86 return FromRgba(r, g, b, 255);
89 static Color FromHex(string hex)
94 int idx = (hex[0] == '#') ? 1 : 0;
96 switch (hex.Length - idx)
98 case 3: //#rgb => ffrrggbb
99 var t1 = ToHexD(hex[idx++]);
100 var t2 = ToHexD(hex[idx++]);
101 var t3 = ToHexD(hex[idx]);
103 return FromRgb((int)t1, (int)t2, (int)t3);
105 case 4: //#argb => aarrggbb
106 var f1 = ToHexD(hex[idx++]);
107 var f2 = ToHexD(hex[idx++]);
108 var f3 = ToHexD(hex[idx++]);
109 var f4 = ToHexD(hex[idx]);
110 return FromRgba((int)f2, (int)f3, (int)f4, (int)f1);
112 case 6: //#rrggbb => ffrrggbb
113 return FromRgb((int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
114 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
115 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx])));
118 var a1 = ToHex(hex[idx++]) << 4 | ToHex(hex[idx++]);
119 return FromRgba((int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
120 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
121 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx])),
124 default: //everything else will result in unexpected results