Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }