[NUI] Split NUI Assemblies (#865)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Xaml / src / public / XamlBinding / ColorTypeConverter.cs
1 using System;
2 using System.ComponentModel;
3 using System.Globalization;
4 using Tizen.NUI;
5
6 namespace Tizen.NUI.XamlBinding
7 {
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
13     {
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)
17         {
18             if (value != null)
19             {
20                 value = value.Trim();
21                 if (value.StartsWith("#", StringComparison.Ordinal))
22                 {
23                     return FromHex(value);
24                 }
25
26                 string[] parts = value.Split(',');
27                 if (parts.Length == 1) //like Red or Color.Red
28                 {
29                     parts = value.Split('.');
30                     if (parts.Length == 1 || (parts.Length == 2 && parts[0] == "Color"))
31                     {
32                         string color = parts[parts.Length - 1];
33                         switch (color)
34                         {
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;
44                         }
45                     }
46                 }
47                 else if (parts.Length == 4) //like 0.5,0.5,0.5,0.5
48                 {
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));
53                 }
54             }
55
56             throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Color)}");
57         }
58
59         static uint ToHex(char c)
60         {
61             ushort x = (ushort)c;
62             if (x >= '0' && x <= '9')
63                 return (uint)(x - '0');
64
65             x |= 0x20;
66             if (x >= 'a' && x <= 'f')
67                 return (uint)(x - 'a' + 10);
68             return 0;
69         }
70
71         static uint ToHexD(char c)
72         {
73             var j = ToHex(c);
74             return (j << 4) | j;
75         }
76
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)
80         {
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);
86         }
87
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)
91         {
92             return FromRgba(r, g, b, 255);
93         }
94
95         static Color FromHex(string hex)
96         {
97             // Undefined
98             if (hex.Length < 3)
99                 return Color.Black;
100             int idx = (hex[0] == '#') ? 1 : 0;
101
102             switch (hex.Length - idx)
103             {
104                 case 3: //#rgb => ffrrggbb
105                     var t1 = ToHexD(hex[idx++]);
106                     var t2 = ToHexD(hex[idx++]);
107                     var t3 = ToHexD(hex[idx]);
108
109                     return FromRgb((int)t1, (int)t2, (int)t3);
110
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);
117
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])));
122
123                 case 8: //#aarrggbb
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])),
128                             (int)a1);
129
130                 default: //everything else will result in unexpected results
131                     return Color.Black;
132             }
133         }
134     }
135 }