[NUI] Change GetDefaultWindow() to static func (#900)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / XamlBinding / ColorTypeConverter.cs
1 using System;
2 using System.Globalization;
3
4 namespace Tizen.NUI.Binding
5 {
6     [Xaml.ProvideCompiled("Tizen.NUI.Xaml.Core.XamlC.ColorTypeConverter")]
7     [Xaml.TypeConversion(typeof(Color))]
8     internal class ColorTypeConverter : TypeConverter
9     {
10         // Supported inputs
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)
15         {
16             if (value != null)
17             {
18                 value = value.Trim();
19                 if (value.StartsWith("#", StringComparison.Ordinal))
20                 {
21                     return FromHex(value);
22                 }
23
24                 string[] parts = value.Split(',');
25                 if (parts.Length == 1) //like Red or Color.Red
26                 {
27                     parts = value.Split('.');
28                     if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
29                     {
30                         string color = parts[parts.Length - 1];
31                         switch (color)
32                         {
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;
42                         }
43                     }
44                 }
45                 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
46                 {
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));
51                 }
52             }
53
54             throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
55         }
56
57         static uint ToHex(char c)
58         {
59             ushort x = (ushort)c;
60             if (x >= '0' && x <= '9')
61                 return (uint)(x - '0');
62
63             x |= 0x20;
64             if (x >= 'a' && x <= 'f')
65                 return (uint)(x - 'a' + 10);
66             return 0;
67         }
68
69         static uint ToHexD(char c)
70         {
71             var j = ToHex(c);
72             return (j << 4) | j;
73         }
74
75         public static Color FromRgba(int r, int g, int b, int a)
76         {
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);
82         }
83
84         public static Color FromRgb(int r, int g, int b)
85         {
86             return FromRgba(r, g, b, 255);
87         }
88
89         static Color FromHex(string hex)
90         {
91             // Undefined
92             if (hex.Length < 3)
93                 return Color.Black;
94             int idx = (hex[0] == '#') ? 1 : 0;
95
96             switch (hex.Length - idx)
97             {
98                 case 3: //#rgb => ffrrggbb
99                     var t1 = ToHexD(hex[idx++]);
100                     var t2 = ToHexD(hex[idx++]);
101                     var t3 = ToHexD(hex[idx]);
102
103                     return FromRgb((int)t1, (int)t2, (int)t3);
104
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);
111
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])));
116
117                 case 8: //#aarrggbb
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])),
122                             (int)a1);
123
124                 default: //everything else will result in unexpected results
125                     return Color.Black;
126             }
127         }
128     }
129 }