Initial WIC support (WIP)

This commit is contained in:
Amer Koleci
2022-09-16 11:11:23 +02:00
parent c6c5061fbf
commit e62b972d02
30 changed files with 23549 additions and 273 deletions

View File

@@ -21,7 +21,7 @@ public static class Program
"Graphics.Direct3D12.json",
"Graphics.Direct3D.Dxc.json",
"Graphics.Direct2D.Common.json",
//"Graphics.Imaging.json",
"Graphics.Imaging.json",
//"Graphics.DirectWrite.json",
};
@@ -68,6 +68,11 @@ public static class Program
{ "System.Com.ISequentialStream", "Com.ISequentialStream" },
{ "System.Com.IStream", "Com.IStream" },
{ "System.Com.IMalloc", "Com.IMalloc" },
{ "System.Com.IEnumUnknown", "Com.IEnumUnknown" },
{ "System.Com.IEnumString", "Com.IEnumString" },
{ "System.Com.StructuredStorage.PROPVARIANT", "Com.Variant" },
{ "System.Com.StructuredStorage.PROPBAG2", "Com.PropertyBagMetadata" },
{ "System.Com.StructuredStorage.IPropertyBag2", "Com.IPropertyBag2" },
{ "Graphics.Gdi.HMONITOR", "IntPtr" },
{ "Graphics.Gdi.HDC", "IntPtr" },
@@ -599,6 +604,10 @@ public static class Program
"InvalidNumRenderTargets",
"SetRenderTargets",
"CreateSharedResource",
"ExifColorSpace",
"NoCache",
"CacheOnDemand",
"CacheOnLoad",
};
private static readonly HashSet<string> s_preserveCaps = new(StringComparer.OrdinalIgnoreCase)
@@ -677,6 +686,11 @@ public static class Program
// Dxc
{ "DXC_OUT_KIND", "DXC_OUT" },
// WIC
{ "WICColorContextType", "WICColorContext" },
{ "WICBitmapCreateCacheOption", "WICBitmap" },
{ "WICDecodeOptions", "WICDecodeMetadata" },
};
private static readonly Dictionary<string, string> s_knownEnumValueNames = new()
@@ -817,6 +831,9 @@ public static class Program
{ "IDxcValidator2::ValidateWithDebug::Flags", "DxcValidatorFlags" },
{ "IDxcVersionInfo::GetFlags::pFlags", "DxcVersionInfoFlags" },
{ "IDxcVersionInfo2::GetFlags::pFlags", "DxcVersionInfoFlags" },
// WIC
{ "IWICImagingFactory::CreateDecoderFromFilename::dwDesiredAccess", "NativeFileAccess" },
};
private static readonly HashSet<string> s_visitedEnums = new();
@@ -851,6 +868,7 @@ public static class Program
}
// Generate docs
//DocGenerator.Generate(new[] { "WIC" }, Path.Combine(outputPath, "Imaging.xml"));
//DocGenerator.Generate(new[] { "DWRITE" }, Path.Combine(outputPath, "DirectWrite.xml"));
//DocGenerator.Generate(new[] { "D3D" }, Path.Combine(outputPath, "Direct3D.xml"));
//DocGenerator.Generate(new[] { "DXGI" }, Path.Combine(outputPath, "Dxgi.xml"));
@@ -1119,6 +1137,15 @@ public static class Program
continue;
}
// PROPVARIANT
//if (comType.Name == "IWICEnumMetadataItem" ||
// comType.Name == "IWICMetadataReader" ||
// comType.Name == "IWICMetadataBlockReader" ||
// comType.Name == "IWICMetadataBlockWriter")
//{
// continue;
//}
if (!regionWritten)
{
writer.WriteLine("#region COM Types");
@@ -1259,9 +1286,25 @@ public static class Program
private static void GenerateEnum(CodeWriter writer, ApiType enumType, bool autoGenerated)
{
string csTypeName = GetDataTypeName(enumType.Name, out string enumPrefix);
string csTypeName;
string enumPrefix = string.Empty;
if (enumType.Name.StartsWith("WIC"))
{
csTypeName = enumType.Name;
if (s_knownTypesPrefixes.TryGetValue(enumType.Name, out string? knowPrefix))
{
enumPrefix = knowPrefix!;
}
}
else
{
csTypeName = GetDataTypeName(enumType.Name, out enumPrefix);
AddCsMapping(writer.Api, enumType.Name, csTypeName);
}
string baseTypeName = GetTypeName(enumType.IntegerBase);
AddCsMapping(writer.Api, enumType.Name, csTypeName);
if (!autoGenerated)
{
@@ -1300,6 +1343,11 @@ public static class Program
baseTypeName = "byte";
}
if (enumType.Name == "WICColorContextType")
{
}
using (writer.PushBlock($"public enum {csTypeName} : {baseTypeName}"))
{
if (isFlags &&
@@ -1360,6 +1408,11 @@ public static class Program
private static string GetEnumItemName(ApiType enumType, ApiEnumValue enumItem, string enumPrefix)
{
if (string.IsNullOrEmpty(enumPrefix))
{
return enumItem.Name;
}
string enumValueName = GetPrettyFieldName(enumItem.Name, enumPrefix);
// D3D11 has some enum name "issues"
@@ -1635,7 +1688,6 @@ public static class Program
List<KeyValuePair<ApiFunction, string>> methodsToGenerate)
{
string csTypeName = comType.Name;
//AddCsMapping(writer.Api, comType.Name, csTypeName);
writer.WriteLine($"/// <include file='../{writer.DocFileName}.xml' path='doc/member[@name=\"{comType.Name}\"]/*' />");
@@ -1719,8 +1771,14 @@ public static class Program
vtblIndex = 3;
}
bool needNewLine = false;
foreach (KeyValuePair<ApiFunction, string> methodPair in methodsToGenerate)
{
if (needNewLine)
{
writer.WriteLine();
}
ApiFunction method = methodPair.Key;
string docName = methodPair.Value;
@@ -1738,7 +1796,7 @@ public static class Program
string parameterType = string.Empty;
if (method.Name == "Compile" && parameter.Name == "pArguments")
if (method.Name == "GetFrame" && parameter.Name == "ppIBitmapFrame")
{
}
@@ -1787,6 +1845,13 @@ public static class Program
parameterType += "*";
}
}
else if (parameter.Attrs.Any(item => item is string str && str == "RetVal"))
{
if (!IsPrimitive(parameter.Type))
{
parameterType += "*";
}
}
parameterName = CleanupName(parameterName);
@@ -1858,8 +1923,8 @@ public static class Program
writer.Write("return ");
writer.WriteLine($"((delegate* unmanaged[Stdcall]<{comType.Name}*, {argumentTypesString}>)(lpVtbl[{vtblIndex}]))(({comType.Name}*)Unsafe.AsPointer(ref this){argumentNamesString});");
}
writer.WriteLine();
needNewLine = true;
vtblIndex++;
}
}