in tools/codegen/exe/OutputEffectType.cs [263:373]
public static void OutputEffectHeader(Effects.Effect effect, Formatter output)
{
OutputDataTypes.OutputLeadingComment(output);
output.WriteLine("#pragma once");
output.WriteLine();
OutputVersionConditional(effect, output);
output.WriteLine("namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { namespace Effects ");
output.WriteLine("{");
output.Indent();
output.WriteLine("using namespace ::Microsoft::WRL;");
output.WriteLine("using namespace ABI::Microsoft::Graphics::Canvas;");
output.WriteLine();
output.WriteLine("class " + effect.ClassName + " : public RuntimeClass<");
output.Indent();
output.WriteLine(effect.InterfaceName + ",");
output.WriteLine("MixIn<" + effect.ClassName + ", CanvasEffect>>,");
output.WriteLine("public CanvasEffect");
output.Unindent();
output.WriteLine("{");
output.Indent();
output.WriteLine("InspectableClass(RuntimeClass_Microsoft_Graphics_Canvas_Effects_" + effect.ClassName + ", BaseTrust);");
output.WriteLine();
output.Unindent();
output.WriteLine("public:");
output.Indent();
output.WriteLine(effect.ClassName + "(ICanvasDevice* device = nullptr, ID2D1Effect* effect = nullptr);");
output.WriteLine();
output.WriteLine("static IID const& EffectId() { return " + GetEffectCLSID(effect) + "; }");
output.WriteLine();
foreach (var property in effect.Properties)
{
// Property with type string describes
// name/author/category/description of effect but not input type
if (property.Type == "string" || property.IsHidden)
continue;
var propertyMacro = property.IsArray ? "EFFECT_ARRAY_PROPERTY" : "EFFECT_PROPERTY";
output.WriteLine(propertyMacro + "(" + property.Name + ", " + property.TypeNameCpp + ");");
}
if (EffectHasVariableNumberOfInputs(effect))
{
output.WriteLine("EFFECT_SOURCES_PROPERTY();");
}
else
{
for (int i = 0; i < effect.Inputs.InputsList.Count; ++i)
{
var input = effect.Inputs.InputsList[i];
output.WriteLine("EFFECT_PROPERTY(" + input.Name + ", IGraphicsEffectSource*);");
}
}
bool hasPropertyMapping = effect.Properties.Any(IsGeneratablePropertyMapping);
bool hasHandCodedPropertyMapping = effect.Properties.Any(p => p.IsHandCoded);
if (hasPropertyMapping || hasHandCodedPropertyMapping)
{
output.WriteLine();
if (hasPropertyMapping)
output.WriteLine("EFFECT_PROPERTY_MAPPING();");
if (hasHandCodedPropertyMapping)
output.WriteLine("EFFECT_PROPERTY_MAPPING_HANDCODED();");
}
output.Unindent();
output.WriteLine("};");
if (HasStatics(effect))
{
output.WriteLine();
output.WriteLine("class " + effect.ClassName + "Factory");
output.Indent();
output.WriteLine(": public AgileActivationFactory<I" + effect.ClassName + "Statics>");
output.WriteLine(", private LifespanTracker<" + effect.ClassName + "Factory>");
output.Unindent();
output.WriteLine("{");
output.Indent();
output.WriteLine("InspectableClassStatic(RuntimeClass_Microsoft_Graphics_Canvas_Effects_" + effect.ClassName + ", BaseTrust);");
output.WriteLine();
output.Unindent();
output.WriteLine("public:");
output.Indent();
output.WriteLine("IFACEMETHODIMP ActivateInstance(IInspectable**) override;");
foreach (var customDecl in effect.Overrides.CustomStaticMethodDecl)
{
output.WriteLine(customDecl.Trim());
}
if (!string.IsNullOrEmpty(effect.Overrides.IsSupportedCheck))
{
output.WriteLine("IFACEMETHOD(get_IsSupported)(boolean* value) override;");
}
output.Unindent();
output.WriteLine("};");
}
output.Unindent();
output.WriteLine("}}}}}");
EndVersionConditional(effect, output);
}