in utils/SkiaSharpGenerator/Generate/Generator.cs [96:143]
private void WriteDelegate(TextWriter writer, CppTypedef del)
{
if (!(((CppPointerType)del.ElementType).ElementType is CppFunctionType function))
{
Log?.LogWarning($"Unknown delegate type {del}");
writer.WriteLine($"// TODO: {del}");
return;
}
var name = del.GetDisplayName();
Log?.LogVerbose($" {name}");
functionMappings.TryGetValue(name, out var map);
name = map?.CsType ?? CleanName(name);
writer.WriteLine($"\t// {del}");
writer.WriteLine($"\t[UnmanagedFunctionPointer (CallingConvention.Cdecl)]");
var paramsList = new List<string>();
for (var i = 0; i < function.Parameters.Count; i++)
{
var p = function.Parameters[i];
var n = string.IsNullOrEmpty(p.Name) ? $"param{i}" : p.Name;
var t = GetType(p.Type);
var cppT = GetCppType(p.Type);
if (t == "Boolean" || cppT == "bool")
t = $"[MarshalAs (UnmanagedType.I1)] bool";
if (map != null && map.Parameters.TryGetValue(i.ToString(), out var newT))
t = newT;
paramsList.Add($"{t} {n}");
}
var returnType = GetType(function.ReturnType);
if (map != null && map.Parameters.TryGetValue("-1", out var newR))
{
returnType = newR;
}
else if (returnType == "Boolean" || GetCppType(function.ReturnType) == "bool")
{
returnType = "bool";
writer.WriteLine($"\t[return: MarshalAs (UnmanagedType.I1)]");
}
writer.WriteLine($"\tinternal unsafe delegate {returnType} {name}({string.Join(", ", paramsList)});");
writer.WriteLine();
}