2 using System.ComponentModel;
3 using System.Globalization;
6 namespace Tizen.NUI.XamlBinding
8 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
9 [EditorBrowsable(EditorBrowsableState.Never)]
10 [Xaml.ProvideCompiled("Tizen.NUI.Xaml.Forms.XamlC.ColorTypeConverter")]
11 [Xaml.TypeConversion(typeof(Color))]
12 public class ColorTypeConverter : TypeConverter
14 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
15 [EditorBrowsable(EditorBrowsableState.Never)]
16 public override object ConvertFromInvariantString(string value)
21 if (value.StartsWith("#", StringComparison.Ordinal))
23 return FromHex(value);
26 string[] parts = value.Split(',');
27 if (parts.Length == 1) //like Red or Color.Red
29 parts = value.Split('.');
30 if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
32 string color = parts[parts.Length - 1];
35 case "Black": return Color.Black;
36 case "White": return Color.White;
37 case "Red": return Color.Red;
38 case "Green": return Color.Green;
39 case "Blue": return Color.Blue;
40 case "Yellow": return Color.Yellow;
41 case "Magenta": return Color.Magenta;
42 case "Cyan": return Color.Cyan;
43 case "Transparent": return Color.Transparent;
47 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
49 return new Color(Single.Parse(parts[0].Trim(), CultureInfo.InvariantCulture),
50 Single.Parse(parts[1].Trim(), CultureInfo.InvariantCulture),
51 Single.Parse(parts[2].Trim(), CultureInfo.InvariantCulture),
52 Single.Parse(parts[3].Trim(), CultureInfo.InvariantCulture));
56 throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
59 static uint ToHex(char c)
62 if (x >= '0' && x <= '9')
63 return (uint)(x - '0');
66 if (x >= 'a' && x <= 'f')
67 return (uint)(x - 'a' + 10);
71 static uint ToHexD(char c)
77 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
78 [EditorBrowsable(EditorBrowsableState.Never)]
79 public static Color FromRgba(int r, int g, int b, int a)
81 float red = (float)r / 255;
82 float green = (float)g / 255;
83 float blue = (float)b / 255;
84 float alpha = (float)a / 255;
85 return new Color(red, green, blue, alpha);
88 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
89 [EditorBrowsable(EditorBrowsableState.Never)]
90 public static Color FromRgb(int r, int g, int b)
92 return FromRgba(r, g, b, 255);
95 static Color FromHex(string hex)
100 int idx = (hex[0] == '#') ? 1 : 0;
102 switch (hex.Length - idx)
104 case 3: //#rgb => ffrrggbb
105 var t1 = ToHexD(hex[idx++]);
106 var t2 = ToHexD(hex[idx++]);
107 var t3 = ToHexD(hex[idx]);
109 return FromRgb((int)t1, (int)t2, (int)t3);
111 case 4: //#argb => aarrggbb
112 var f1 = ToHexD(hex[idx++]);
113 var f2 = ToHexD(hex[idx++]);
114 var f3 = ToHexD(hex[idx++]);
115 var f4 = ToHexD(hex[idx]);
116 return FromRgba((int)f2, (int)f3, (int)f4, (int)f1);
118 case 6: //#rrggbb => ffrrggbb
119 return FromRgb((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 var a1 = ToHex(hex[idx++]) << 4 | ToHex(hex[idx++]);
125 return FromRgba((int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
126 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx++])),
127 (int)(ToHex(hex[idx++]) << 4 | ToHex(hex[idx])),
130 default: //everything else will result in unexpected results