2 * Copyright(c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 using System.Collections.Generic;
18 using System.Globalization;
23 using Tizen.NUI.Binding;
25 using Tizen.NUI.Xaml.Build.Tasks;
27 namespace Tizen.NUI.Xaml.Core.XamlC
29 internal class PositionTypeConverter : ICompiledTypeConverter
31 IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params double[] args)
33 foreach (var d in args)
34 yield return Instruction.Create(OpCodes.Ldc_R8, d);
36 yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference((XamlTask.nuiAssemblyName, XamlTask.nuiNameSpace, "Position"),
37 parameterTypes: args.Select(a => ("mscorlib", "System", "Single")).ToArray()));
40 private IEnumerable<Instruction> ConvertToPoint(string value, ILContext context, BaseNode node)
42 var module = context.Body.Method.Module;
47 return GenerateIL(module, 0.0);
49 return GenerateIL(module, 1.0);
51 return GenerateIL(module, 0.0);
53 return GenerateIL(module, 1.0);
55 return GenerateIL(module, 0.5);
57 return GenerateIL(module, 0.0, 0.0, 0.5);
59 return GenerateIL(module, 0.5, 0.0, 0.5);
61 return GenerateIL(module, 1.0, 0.0, 0.5);
63 return GenerateIL(module, 0.0, 0.5, 0.5);
65 return GenerateIL(module, 0.5, 0.5, 0.5);
67 return GenerateIL(module, 1.0, 0.5, 0.5);
69 return GenerateIL(module, 0.0, 1.0, 0.5);
71 return GenerateIL(module, 0.5, 1.0, 0.5);
73 return GenerateIL(module, 1.0, 1.0, 0.5);
76 throw new XamlParseException($"Cannot convert \"{value}\" into Position", node);
79 public IEnumerable<Instruction> ConvertFromString(string value, ILContext context, BaseNode node)
81 var module = context.Body.Method.Module;
83 var thickness = value.Split(',');
85 foreach (var thick in thickness)
87 if (thick.EndsWith("dp") || thick.EndsWith("px"))
93 if (3 == thickness.Length)
97 if (double.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out x) &&
98 double.TryParse(thickness[1], NumberStyles.Number, CultureInfo.InvariantCulture, out y) &&
99 double.TryParse(thickness[2], NumberStyles.Number, CultureInfo.InvariantCulture, out z))
100 return GenerateIL(module, x, y, z);
102 else if (2 == thickness.Length)
106 if (double.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out x) &&
107 double.TryParse(thickness[1], NumberStyles.Number, CultureInfo.InvariantCulture, out y))
108 return GenerateIL(module, x, y, 0);
110 else if (1 == thickness.Length)
112 if (value.Contains("."))
114 string[] parts = value.Split('.');
115 if (parts.Length == 2 && (parts[0].Trim() == "ParentOrigin" || parts[0].Trim() == "PivotPoint"))
117 string position = parts[parts.Length - 1].Trim();
118 return ConvertToPoint(position, context, node);
123 return ConvertToPoint(value, context, node);
127 throw new XamlParseException($"Cannot convert \"{value}\" into Position", node);
131 internal class Position2DTypeConverter : ICompiledTypeConverter
133 IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params int[] args)
135 foreach (var d in args)
136 yield return Instruction.Create(OpCodes.Ldc_I4, d);
138 yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference((XamlTask.nuiAssemblyName, XamlTask.nuiNameSpace, "Position2D"),
139 parameterTypes: args.Select(a => ("mscorlib", "System", "Int32")).ToArray()));
142 public IEnumerable<Instruction> ConvertFromString(string value, ILContext context, BaseNode node)
144 var module = context.Body.Method.Module;
146 if (!string.IsNullOrEmpty(value))
149 var thickness = value.Split(',');
151 foreach (var thick in thickness)
153 if (thick.EndsWith("dp") || thick.EndsWith("px"))
159 if (int.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out x) &&
160 int.TryParse(thickness[1], NumberStyles.Number, CultureInfo.InvariantCulture, out y))
161 return GenerateIL(module, x, y);
164 throw new XamlParseException($"Cannot convert \"{value}\" into Position2D", node);