internal static XElementBuilder BuildFilter(IFilterComponent component, CoordinatesConverter converter) { var firstAttempt = BuildFilterComponent(component, converter) .Run(FilterChainState.Initial()); var firstAttemptItems = firstAttempt.Value.ToList(); List <XElement> filterChainList; if (firstAttemptItems.Any() == true) { filterChainList = firstAttemptItems; } else { var filterComponent = Filters.Noop; filterChainList = BuildFilterComponent(filterComponent, converter) .Run(firstAttempt.State).Value.ToList(); } return (XElementBuilder.WithName("filter") .Add(filterChainList)); }
private static State <FilterChainState, IEnumerable <XElement> > BuildFilterComponent( IFilterComponent component, CoordinatesConverter converter) { if (component is ColorMatrix colorMatrix) { return(BuildColorMatrix(colorMatrix).Select(x => new[] { x }.AsEnumerable())); } if (component is GaussianBlurFilter gaussFilter) { return(BuildGaussianBlur(gaussFilter, converter) .Select(x => new[] { x }.AsEnumerable())); } if (component is DropShadowFilter dropShadowFilter) { return(BuildDropShadowFilter(dropShadowFilter, converter).Select(x => new[] { x }.AsEnumerable())); } if (component is FilterChain chain) { return(BuildFilterChain(chain, converter)); } if (component is DisplacementFilter displacementFilter) { return(BuildDisplacementFilter(displacementFilter, converter)); } if (component is TurbulenceGenerator turbulenceGenerator) { return(BuildTurbulenceGenerator(turbulenceGenerator).Select(x => new[] { x }.AsEnumerable())); } if (component is FloodGenerator floodGenerator) { return(BuildFloodGenerator(floodGenerator.Color).Select(x => new[] { x.Build() }.AsEnumerable())); } if (component is BlendFilter blendFilter) { return(BuildBlendFilter(blendFilter, converter)); } if (component is FilterSource filterSource) { return (from state in FilterChainState.SetInputToSource(filterSource.SourceType) select Enumerable.Empty <XElement>()); } if (component is MergeFilter mergeFilter) { return(BuildMergeFilter(mergeFilter, converter)); } if (component is Morphology morphology) { return(BuildMorphologyFilter(morphology, converter)); } if (component is OffsetFilter offsetFilter) { return(BuildOffsetFilter(offsetFilter, converter)); } if (component is CompositeFilter compositeFilter) { return(BuildCompositeFilter(compositeFilter, converter)); } if (component is DiffuseLightingGenerator diffuseLightingGenerator) { return(BuildDiffuseLightingGenerator(diffuseLightingGenerator, converter)); } if (component is SpecularLightingGenerator specularLightingGenerator) { return(BuildSpecularLightingGenerator(specularLightingGenerator, converter)); } throw new FilterComponentNotSupportedException(component); }