public static void OutputEffectHeader()

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);
        }