2 using System.ComponentModel;
3 using System.Globalization;
6 namespace Tizen.NUI.Binding
8 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
9 [EditorBrowsable(EditorBrowsableState.Never)]
10 [ProvideCompiled("Tizen.NUI.Xaml.Core.XamlC.ColorTypeConverter")]
11 [TypeConversion(typeof(Color))]
12 public class ColorTypeConverter : TypeConverter
15 // HEX #rgb, #argb, #rrggbb, #aarrggbb
16 // float array 0.5,0.5,0.5,0.5
17 // Predefined color case insensitive
18 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
19 [EditorBrowsable(EditorBrowsableState.Never)]
20 public override object ConvertFromInvariantString(string value)
25 if (value.StartsWith("#", StringComparison.Ordinal))
27 return FromHex(value);
30 string[] parts = value.Split(',');
31 if (parts.Length == 1) //like Red or Color.Red
33 parts = value.Split('.');
34 if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
36 string color = parts[parts.Length - 1];
39 case "Black": return Color.Black;
40 case "White": return Color.White;
41 case "Red": return Color.Red;
42 case "Green": return Color.Green;
43 case "Blue": return Color.Blue;
44 case "Yellow": return Color.Yellow;
45 case "Magenta": return Color.Magenta;
46 case "Cyan": return Color.Cyan;
47 case "Transparent": return Color.Transparent;
51 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
53 return new Color(Single.Parse(parts[0].Trim(), CultureInfo.InvariantCulture),
54 Single.Parse(parts[1].Trim(), CultureInfo.InvariantCulture),
55 Single.Parse(parts[2].Trim(), CultureInfo.InvariantCulture),
56 Single.Parse(parts[3].Trim(), CultureInfo.InvariantCulture));
60 throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
63 static uint ToHex(char c)
66 if (x >= '0' && x <= '9')
67 return (uint)(x - '0');
70 if (x >= 'a' && x <= 'f')
71 return (uint)(x - 'a' + 10);
75 static uint ToHexD(char c)
81 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
82 [EditorBrowsable(EditorBrowsableState.Never)]
83 public static Color FromRgba(int r, int g, int b, int a)
85 float red = (float)r / 255;
86 float green = (float)g / 255;
87 float blue = (float)b / 255;
88 float alpha = (float)a / 255;
89 return new Color(red, green, blue, alpha);
92 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
93 [EditorBrowsable(EditorBrowsableState.Never)]
94 public static Color FromRgb(int r, int g, int b)
96 return FromRgba(r, g, b, 255);
99 static Color FromHex(string hex)
104 int idx = (hex[0] == '#') ? 1 : 0;
106 switch (hex.Length - idx)
108 case 3: //#rgb => ffrrggbb
109 var t1 = ToHexD(hex[idx++]);
110 var t2 = ToHexD(hex[idx++]);
111 var t3 = ToHexD(hex[idx]);
113 return FromRgb((int)t1, (int)t2, (int)t3);
115 case 4: //#argb => aarrggbb
116 var f1 = ToHexD(hex[idx++]);
117 var f2 = ToHexD(hex[idx++]);
118 var f3 = ToHexD(hex[idx++]);
119 var f4 = ToHexD(hex[idx]);
120 return FromRgba((int)f2, (int)f3, (int)f4, (int)f1);
122 case 6: //#rrggbb => ffrrggbb
123 return FromRgb((int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
124 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
125 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx])));
128 var a1 = ToHex(hex[idx++]) << 4 | ToHex(hex[idx++]);
129 return FromRgba((int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
130 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
131 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx])),
134 default: //everything else will result in unexpected results