mirror of
https://github.com/amerkoleci/Vortice.Win32.git
synced 2026-01-14 16:16:04 +08:00
Initial WIC support (WIP)
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user