[NUI] Adjust directory (#903)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / XamlBinding / ColorTypeConverter.cs
1 using System;
2 using System.ComponentModel;
3 using System.Globalization;
4 using Tizen.NUI.Xaml;
5
6 namespace Tizen.NUI.Binding
7 {
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
13     {
14         // Supported inputs
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)
21         {
22             if (value != null)
23             {
24                 value = value.Trim();
25                 if (value.StartsWith("#", StringComparison.Ordinal))
26                 {
27                     return FromHex(value);
28                 }
29
30                 string[] parts = value.Split(',');
31                 if (parts.Length == 1) //like Red or Color.Red
32                 {
33                     parts = value.Split('.');
34                     if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
35                     {
36                         string color = parts[parts.Length - 1];
37                         switch (color)
38                         {
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;
48                         }
49                     }
50                 }
51                 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
52                 {
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));
57                 }
58             }
59
60             throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
61         }
62
63         static uint ToHex(char c)
64         {
65             ushort x = (ushort)c;
66             if (x >= '0' && x <= '9')
67                 return (uint)(x - '0');
68
69             x |= 0x20;
70             if (x >= 'a' && x <= 'f')
71                 return (uint)(x - 'a' + 10);
72             return 0;
73         }
74
75         static uint ToHexD(char c)
76         {
77             var j = ToHex(c);
78             return (j << 4) | j;
79         }
80
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)
84         {
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);
90         }
91
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)
95         {
96             return FromRgba(r, g, b, 255);
97         }
98
99         static Color FromHex(string hex)
100         {
101             // Undefined
102             if (hex.Length < 3)
103                 return Color.Black;
104             int idx = (hex[0] == '#') ? 1 : 0;
105
106             switch (hex.Length - idx)
107             {
108                 case 3: //#rgb => ffrrggbb
109                     var t1 = ToHexD(hex[idx++]);
110                     var t2 = ToHexD(hex[idx++]);
111                     var t3 = ToHexD(hex[idx]);
112
113                     return FromRgb((int)t1, (int)t2, (int)t3);
114
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);
121
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])));
126
127                 case 8: //#aarrggbb
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])),
132                             (int)a1);
133
134                 default: //everything else will result in unexpected results
135                     return Color.Black;
136             }
137         }
138     }
139 }