public static IImageProvider Generate(IImageProvider objectMaskSource, LinearGradient gradient, Size size, IReadOnlyList <ILensBlurKernel> kernels)
        {
            var backgroundSource = new GradientImageSource(size, gradient);
            var blendEffect      = new BlendEffect(backgroundSource, objectMaskSource, BlendFunction.Lighten);

            return(new IndexRemappingEffect(blendEffect, kernels.Count + 2));
        }
        public RadialGradientImageSourceEffectProcessor()
        {
            Name = "Radial Gradient";

            m_radialGradient = new RadialGradient(new Point(0.5, 0.5), new EllipseRadius(0.5, 0.5));
            m_radialGradient.Stops = new[]
                         {
                             new GradientStop{Offset=0.0, Color=Colors.Red},
                             new GradientStop{Offset=0.5, Color=Colors.Green},
                             new GradientStop{Offset=1.0, Color=Colors.Cyan}
                         };

            m_gradientImageSource = new GradientImageSource(new Size(800,500), m_radialGradient);

            SetupEffectCategory(m_gradientImageSource);
      
            m_propertyDescriptions = new Dictionary<string, PropertyDescription>();
            m_propertyDescriptions.Add("CenterX", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("CenterY", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("RadiuxX", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("RadiuxY", new PropertyDescription(0, 1.0, 0.5));

            AddEditors();

            m_centerX = 0.5;
            m_centerY = 0.5;          
            m_radiusX = 0.5;
            m_radiusY = 0.5;
         
        }
        public LinearGradientImageSourceEffectProcessor()
        {
            Name = "Linear Gradient";

            m_endX = 1.0;
            m_endY = 1.0;

            m_linearGradient       = new LinearGradient(new Point(0.0, 0.0), new Point(1.0, 1.0));
            m_linearGradient.Stops = new[]
            {
                new GradientStop {
                    Offset = 0.0, Color = Colors.Red
                },
                new GradientStop {
                    Offset = 0.5, Color = Colors.Green
                },
                new GradientStop {
                    Offset = 1.0, Color = Colors.Cyan
                }
            };

            m_gradientImageSource = new GradientImageSource(new Size(800, 500), m_linearGradient);

            SetupEffectCategory(m_gradientImageSource);

            m_propertyDescriptions = new Dictionary <string, PropertyDescription>();
            m_propertyDescriptions.Add("StartX", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("StartY", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("EndX", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("EndY", new PropertyDescription(-1.0, 2.0, 0));

            AddEditors();
        }
        public LinearGradientImageSourceEffectProcessor()
        {
            Name = "Linear Gradient";

            m_endX = 1.0;
            m_endY = 1.0;

            m_linearGradient = new LinearGradient(new Point(0.0, 0.0), new Point(1.0, 1.0));
            m_linearGradient.Stops = new[]
                         {
                             new GradientStop{Offset=0.0, Color=Colors.Red},
                             new GradientStop{Offset=0.5, Color=Colors.Green},
                             new GradientStop{Offset=1.0, Color=Colors.Cyan}
                         };

            m_gradientImageSource = new GradientImageSource(new Size(800,500), m_linearGradient);

            SetupEffectCategory(m_gradientImageSource);

            m_propertyDescriptions = new Dictionary<string, PropertyDescription>();
            m_propertyDescriptions.Add("StartX", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("StartY", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("EndX", new PropertyDescription(-1.0, 2.0, 0));
            m_propertyDescriptions.Add("EndY", new PropertyDescription(-1.0, 2.0, 0));

            AddEditors();   

             
        }
Exemple #5
0
        public RadialGradientImageSourceEffectProcessor()
        {
            Name = "Radial Gradient";

            m_radialGradient       = new RadialGradient(new Point(0.5, 0.5), new EllipseRadius(0.5, 0.5));
            m_radialGradient.Stops = new[]
            {
                new GradientStop {
                    Offset = 0.0, Color = Colors.Red
                },
                new GradientStop {
                    Offset = 0.5, Color = Colors.Green
                },
                new GradientStop {
                    Offset = 1.0, Color = Colors.Cyan
                }
            };

            m_gradientImageSource = new GradientImageSource(new Size(800, 500), m_radialGradient);

            SetupEffectCategory(m_gradientImageSource);

            m_propertyDescriptions = new Dictionary <string, PropertyDescription>();
            m_propertyDescriptions.Add("CenterX", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("CenterY", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("RadiuxX", new PropertyDescription(0, 1.0, 0.5));
            m_propertyDescriptions.Add("RadiuxY", new PropertyDescription(0, 1.0, 0.5));

            AddEditors();

            m_centerX = 0.5;
            m_centerY = 0.5;
            m_radiusX = 0.5;
            m_radiusY = 0.5;
        }
        protected override MaybeTask <IImageProvider> GetEffectInternalAsync(IImageProvider source, Size sourceSize, Size renderSize)
        {
            var current = source;

            var gradientImageSource = new GradientImageSource(sourceSize, new RadialGradient(new Point(0.5, 0.3), new EllipseRadius(1.0, 0),
                                                                                             new[] {
                new GradientStop()
                {
                    Color = Color.FromArgb(255, 255, 255, 255), Offset = 0
                },
                new GradientStop()
                {
                    Color = Color.FromArgb(255, 255, 255, 255), Offset = 0.1
                },
                new GradientStop()
                {
                    Color = Color.FromArgb(255, 0, 0, 0), Offset = 0.101
                },
                new GradientStop()
                {
                    Color = Color.FromArgb(255, 16, 16, 16), Offset = 0.8
                },
            }
                                                                                             ));

            var lensblur = new LensBlurEffect(source, gradientImageSource,
                                              new ILensBlurKernel[]
            {
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 1),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 2),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 3),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 4),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 5),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 6),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 7),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 8),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 9),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 10),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 11),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 12),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 13),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 14),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 15),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 20),
                new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 25),
            });

            lensblur.BlendKernelWidth       = 10;
            lensblur.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
            // TODO lower quality in preview mode.
            lensblur.Quality = 1.0;

            return(new MaybeTask <IImageProvider>(lensblur));
        }
        public LandscapeBackgroundDoF()
        {
            Name = "LandscapeBackgroundDoF";

            var radialGradient = new RadialGradient(new Point(0.5, 0.3), new EllipseRadius(0.2, 0.4)) 
                { Stops = new [] { 
                            new GradientStop() {Color = foreground, Offset = 0}, 
                            new GradientStop() {Color = foreground, Offset = 0.5}, 
                            new GradientStop() {Color = background, Offset = 0.51}, 
                            new GradientStop() {Color = background, Offset = 0.9} 
                    } 
                };

            m_scribbles = new GradientImageSource(new Size(500, 500), radialGradient);

            //Editors.Add(new EnumEditorViewModel<LandscapeBackgroundDoF, DepthOfFieldQuality>("Quality", this, (effect) =>
            //{
            //    if (effect.m_effectEffect == null) return DepthOfFieldQuality.Preview;
            //    return effect.m_effectEffect.Quality;
            //}, (effect, value) =>
            //{
            //    if (effect.m_effectEffect == null)
            //        return;
            //    effect.m_effectEffect.Quality = value;
            //}));

            Editors.Add(new RangeEditorViewModelEx<LandscapeBackgroundDoF>("Strength above horizon", 0, 1.0, this, (effect) =>
            {
                if (effect.m_effectEffect == null) return 1.0;
                return effect.m_effectEffect.StrengthAboveHorizon;
            }, (effect, value) =>
            {
                if (effect.m_effectEffect == null)
                    return;
                effect.m_effectEffect.StrengthAboveHorizon = value;
            }));

            Editors.Add(new RangeEditorViewModelEx<LandscapeBackgroundDoF>("Strength below horizon", 0, 1.0, this, (effect) =>
            {
                if (effect.m_effectEffect == null) return 1.0;
                return effect.m_effectEffect.StrengthBelowHorizon;
            }, (effect, value) =>
            {
                if (effect.m_effectEffect == null)
                    return;
                effect.m_effectEffect.StrengthBelowHorizon = value;
            }));
        }
        protected override MaybeTask<IImageProvider> GetEffectInternalAsync(IImageProvider source, Size sourceSize, Size renderSize)
        {
            var current = source;

           var gradientImageSource =  new GradientImageSource(sourceSize, new RadialGradient(new Point(0.5, 0.3), new EllipseRadius(1.0, 0),
             new[] { 
                            new GradientStop() { Color = Color.FromArgb(255, 255, 255, 255), Offset = 0 }, 
                            new GradientStop() { Color = Color.FromArgb(255, 255, 255, 255), Offset = 0.1 }, 
                            new GradientStop() { Color = Color.FromArgb(255, 0, 0, 0), Offset = 0.101 }, 
                            new GradientStop() { Color = Color.FromArgb(255, 16, 16, 16), Offset = 0.8 }, 
                     }
                 ));

            var lensblur = new LensBlurEffect(source, gradientImageSource,
                new ILensBlurKernel[] 
                { 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 1), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 2), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 3), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 4), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 5), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 6), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 7), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 8),
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 9),                 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 10),
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 11),
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 12),
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 13),
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 14), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 15), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 20), 
                    new LensBlurPredefinedKernel(LensBlurPredefinedKernelShape.Hexagon, 25), 
                    
                });

            lensblur.BlendKernelWidth = 10;
            lensblur.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
            // TODO lower quality in preview mode.
            lensblur.Quality = 1.0;

            return new MaybeTask<IImageProvider>(lensblur);
        }
Exemple #9
0
        protected override bool TryPrepareLensBlurProperties()
        {
            var kernelCount = Quality == DepthOfFieldQuality.Full ? 5 : 1;

            m_edge1KernelGenerator.KernelCount = kernelCount;
            m_edge2KernelGenerator.KernelCount = kernelCount;

            var sourceSize = GetSourceSize();

            m_edge1KernelGenerator.SourceSize = sourceSize;
            m_edge2KernelGenerator.SourceSize = sourceSize;

            var kernels = LensBlurEffect.Kernels;

            var kernelGeneratorsAreDirty = m_edge1KernelGenerator.IsDirty || m_edge2KernelGenerator.IsDirty;

            var  kernelBands         = m_edge2KernelGenerator.GetKernelBands(m_edge1KernelGenerator.GetKernelBands());
            bool blurShouldBeApplied = kernelBands.Count > 0;

            if (IsDirty || kernelGeneratorsAreDirty)
            {
                kernels = kernelBands.Select(band => band.Kernel).ToList();

                if (kernels.Count > 0)
                {
                    LensBlurEffect.Kernels = kernels;
                    blurShouldBeApplied    = true;
                }
            }

            if (blurShouldBeApplied && (IsDirty || kernelGeneratorsAreDirty || m_focusBand.IsDirty))
            {
                var gradient = LensTiltFocusGradientGenerator.GenerateGradient(FocusBand, sourceSize, m_edge1KernelGenerator, m_edge2KernelGenerator, false);
                KernelMapSource = new GradientImageSource(GetKernelMapSize(), gradient);

                LensBlurEffect.KernelMapType          = LensBlurKernelMapType.Continuous;
                LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
            }

            m_focusBand.Reset();

            return(blurShouldBeApplied);
        }
        protected override bool TryPrepareLensBlurProperties()
        {
            m_kernelGenerator.KernelCount = (Quality == DepthOfFieldQuality.Preview)
                                ? 1
                                : 5;

            m_kernelGenerator.SourceSize = GetSourceSize();
            m_kernelGenerator.Strength   = Strength;

            var  kernelGeneratorIsDirty = m_kernelGenerator.IsDirty;
            var  kernelBands            = m_kernelGenerator.GetKernelBands();
            bool blurShouldBeApplied    = kernelBands.Count > 0;

            if (IsDirty || m_focusArea.IsDirty || kernelGeneratorIsDirty)
            {
                if (kernelBands.Count > 0)
                {
                    var gradient = EllipticFocusGradientGenerator.GenerateGradient(m_focusArea.Value, m_kernelGenerator);
                    KernelMapSource = new GradientImageSource(GetKernelMapSize(), gradient);

                    if (IsDirty || m_strength.IsDirty)
                    {
                        LensBlurEffect.Kernels = kernelBands.Select(band => band.Kernel).ToList();

                        LensBlurEffect.BlendKernelWidth       = LensBlurEffect.Kernels.Max(w => w.Size) / 2;
                        LensBlurEffect.KernelMapType          = LensBlurKernelMapType.Continuous;
                        LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
                    }
                }
            }

            m_strength.Reset();
            m_focusArea.Reset();

            return(blurShouldBeApplied);
        }
        public static Task<List<IImageProcessor>> CreateEffects()
        {
            // This seems to take 150-200 ms minimum, so better do it on the thread pool.
            return Task.Run(async () =>
                 {

                     var imageProcessors = new List<IImageProcessor>();
                     EffectProcessor effectViewModel = null;

                     var source = await PreloadedImages.Man;

                     imageProcessors.Add(new EffectProcessor("Antique", new AntiqueEffect()));
                     imageProcessors.Add(new EffectProcessor("Auto Enhance", new AutoEnhanceEffect()));
                     imageProcessors.Add(new EffectProcessor("Auto Levels", new AutoLevelsEffect()));
                     imageProcessors.Add(new BlendEffectProcessor());
                     imageProcessors.Add(new EffectProcessor("Blur", new BlurEffect()));
                     imageProcessors.Add(new EffectProcessor("Brightness Effect", new BrightnessEffect()));
                     imageProcessors.Add(new EffectProcessor("Cartoon", new CartoonEffect()));                   
                     imageProcessors.Add(new EffectProcessor("ChromaKey", new ChromaKeyEffect()));    
                     imageProcessors.Add(new EffectProcessor("ColorAdjust", new ColorAdjustEffect()));
                     imageProcessors.Add(new EffectProcessor("ColorBoost", new ColorBoostEffect(1.0)));
                     imageProcessors.Add(new EffectProcessor("Colorization", new ColorizationEffect()));
                     imageProcessors.Add(new EffectProcessor("Color Swap", new ColorSwapEffect(Windows.UI.Color.FromArgb(255, 255, 0, 0), Windows.UI.Color.FromArgb(255, 0, 255, 0), 0.8, false, true)));                 
                     imageProcessors.Add(new EffectProcessor("Contrast", new ContrastEffect(0.5)));
                     imageProcessors.Add(new CropEffectProcessor());
                     imageProcessors.Add(new CurveProcessor());
                     imageProcessors.Add(new EffectProcessor("Despeckle", new DespeckleEffect(DespeckleLevel.Low)));
                     imageProcessors.Add(new EffectProcessor("Emboss", new EmbossEffect(0.5)));
                     imageProcessors.Add(new EffectProcessor("Exposure", new ExposureEffect(ExposureMode.Natural, 0.5)));
                     imageProcessors.Add(new EffectProcessor("Flip", new FlipEffect(FlipMode.Both)));                  
                     imageProcessors.Add(new EffectProcessor("Fog", new FogEffect()));
                     imageProcessors.Add(new EffectProcessor("Foundation", new FoundationEffect()));
                     imageProcessors.Add(new EffectProcessor("GaussianNoise", new GaussianNoiseEffect(1.0)));

                     var gradient = new RadialGradient(new Point(0.5, 0.5), new EllipseRadius(0.5, 0.5));
                     gradient.Stops = new[]
                         {
                                  new GradientStop{Offset=0.0, Color=Colors.Red},
                                  new GradientStop{Offset=1.0, Color=Colors.Cyan}
                              };

                     var gradientImageSource = new GradientImageSource(new Size(800, 500), gradient);

                     imageProcessors.Add(new EffectProcessor("Grayscale", new GrayscaleEffect()));
                     imageProcessors.Add(new EffectProcessor("Grayscale Negative", new GrayscaleNegativeEffect()));
                     imageProcessors.Add(new HSLProcessor());
                     imageProcessors.Add(new EffectProcessor("HdrEffect", new HdrEffect()));
                     imageProcessors.Add(new EffectProcessor("HueSaturationEffect", new HueSaturationEffect()));
                
                     effectViewModel = new EffectProcessor("Levels", new LevelsEffect(), true, true);
                     {
                         RangeEditorViewModelEx<LevelsEffect> blackEditor = null;
                         RangeEditorViewModelEx<LevelsEffect> grayEditor = null;
                         RangeEditorViewModelEx<LevelsEffect> whiteEditor = null;

                               blackEditor = new RangeEditorViewModelEx<LevelsEffect>(
                                   "Black",
                                   0.0,
                                   1.0,
                                   effectViewModel,
                                   effect => effect.Black,
                                   (effect, value) =>
                                   {
                                       effect.Black = value;
                                       if (grayEditor.Value < value) grayEditor.Value = value;
                                       if (whiteEditor.Value < value) whiteEditor.Value = value;
                                   });

                               grayEditor = new RangeEditorViewModelEx<LevelsEffect>(
                                   "Gray",
                                   0.0,
                                   1.0,
                                   effectViewModel,
                                   effect => effect.Gray,
                                   (effect, value) =>
                                   {
                                       effect.Gray = value;
                                       if (blackEditor.Value > value) blackEditor.Value = value;
                                       if (whiteEditor.Value < value) whiteEditor.Value = value;
                                   });

                               whiteEditor = new RangeEditorViewModelEx<LevelsEffect>(
                                   "White",
                                   0.0,
                                   1.0,
                                   effectViewModel,
                                   effect => effect.White,
                                   (effect, value) =>
                                   {
                                       effect.White = value;
                                       if (blackEditor.Value > value) blackEditor.Value = value;
                                       if (grayEditor.Value > value) grayEditor.Value = value;
                                   });

                               effectViewModel.Editors.Add(blackEditor);
                               effectViewModel.Editors.Add(grayEditor);
                               effectViewModel.Editors.Add(whiteEditor); 
                     }
                     imageProcessors.Add(effectViewModel);
                     imageProcessors.Add(new LinearGradientImageSourceEffectProcessor());
                     imageProcessors.Add(new EffectProcessor("Local Boost Automatic", new LocalBoostAutomaticEffect(8)));
                     imageProcessors.Add(new EffectProcessor("LocalBoost", new LocalBoostEffect()));
                     imageProcessors.Add(new EffectProcessor("Lomo", new LomoEffect()));
                     imageProcessors.Add(new EffectProcessor("Magic Pen", new MagicPenEffect()));
                     imageProcessors.Add(new EffectProcessor("Milky", new MilkyEffect()));
                     imageProcessors.Add(new EffectProcessor("Mirror", new MirrorEffect()));
                     imageProcessors.Add(new EffectProcessor("Mono Color", new MonoColorEffect(Windows.UI.Color.FromArgb(255, 255, 0, 0), 0.8)));
                     imageProcessors.Add(new EffectProcessor("Moonlight", new MoonlightEffect(21)));
                     imageProcessors.Add(new EffectProcessor("Negative", new NegativeEffect()));
                     imageProcessors.Add(new EffectProcessor("Noise", new NoiseEffect(NoiseLevel.Maximum)));
                     imageProcessors.Add(new EffectProcessor("Oily", new OilyEffect(OilBrushSize.Medium)));                 
                     imageProcessors.Add(new EffectProcessor("Paint", new PaintEffect(4)));
                     imageProcessors.Add(new EffectProcessor("Posterize", new PosterizeEffect(10)));
                     imageProcessors.Add(new RadialGradientImageSourceEffectProcessor());
                     imageProcessors.Add(new ReframingEffectProcessor());
                     imageProcessors.Add(new EffectProcessor("Rotation", new RotationEffect()));
                     imageProcessors.Add(new RgbLevelsEffectProcessor());
                     imageProcessors.Add(new RgbMixerEffectProcessor());
                     imageProcessors.Add(new SaturationLightnessProcessor());
                     imageProcessors.Add(new EffectProcessor("Sharpness", new SharpnessEffect(0.2)));                     
                     imageProcessors.Add(new EffectProcessor("Sepia", new SepiaEffect()));
                     imageProcessors.Add(new EffectProcessor("Sketch", new Lumia.Imaging.Artistic.SketchEffect(SketchMode.Color)));               
                     imageProcessors.Add(new EffectProcessor("Solarize", new SolarizeEffect(0.8)));
                     imageProcessors.Add(new SplitToneEffectProcessor());
                     imageProcessors.Add(new SpotlightEffectProcessor());
                     imageProcessors.Add(new EffectProcessor("Stamp", new StampEffect(5, 200.0 / 255.0)));
                     imageProcessors.Add(new EffectProcessor("Temperature and Tint", new TemperatureAndTintEffect(50.0 / 255.0, 50.0 / 255.0)));
                     imageProcessors.Add(new EffectProcessor("Vibrance", new VibranceEffect()));
                     imageProcessors.Add(new EffectProcessor("Vignetting", new VignettingEffect(0.8, Windows.UI.Color.FromArgb(255, 255, 0, 0))));
                     imageProcessors.Add(new EffectProcessor("Watercolor", new WatercolorEffect(0.8, 0.8)));
                     imageProcessors.Add(new EffectProcessor("Warping", new WarpingEffect(WarpMode.Twister, 0.8)));
                     imageProcessors.Add(new EffectProcessor("White Balance", new WhiteBalanceEffect(WhitePointCalculationMode.Maximum, Color.FromArgb(1,219,213,199))));
                     imageProcessors.Add(new EffectProcessor("Whiteboard Enhancement", new WhiteboardEnhancementEffect(WhiteboardEnhancementMode.Hard), canRenderAtPreviewSize: false));
                   
                     //GlamMe effects
                     imageProcessors.Add(new BWEffect());
                     imageProcessors.Add(new ElegantEffect());
                     imageProcessors.Add(new RetroEffect());
                     imageProcessors.Add(new VintageEffect());                   
                     imageProcessors.Add(new MintEffect());                 
                     imageProcessors.Add(new OldPosterEffect());                 
                     imageProcessors.Add(new LensBlureSampleEffect());
                     imageProcessors.Add(new GlamMeLomoEffect());
                     imageProcessors.Add(new FreshEffect());                    
                     imageProcessors.Add(new LightEffect());

                     // Creative Studio Effects
                     imageProcessors.Add(new BWloEffect());
                     imageProcessors.Add(new IndoorEffect());                    
                     imageProcessors.Add(new SunsetEffect());                    
                     imageProcessors.Add(new BWHiEffect());
                     imageProcessors.Add(new BWCopperEffect());
                     imageProcessors.Add(new LoSatWarmEffect());

              //       imageProcessors.Add(new BlockTiltDoF());
              //       imageProcessors.Add(new EllipseTiltDoF());
              //       imageProcessors.Add(new LandscapeBackgroundDoF());                
              //         imageProcessors.Add(new LensBlurProcessor()); // Special command editor             

                     return imageProcessors;

                 });
        }
		protected override bool TryPrepareLensBlurProperties()
		{
			m_kernelGenerator.KernelCount = (Quality == DepthOfFieldQuality.Preview)
				? 1
				: 5;

			m_kernelGenerator.SourceSize = GetSourceSize();
			m_kernelGenerator.Strength = Strength;

            var kernelGeneratorIsDirty = m_kernelGenerator.IsDirty;
            var kernelBands = m_kernelGenerator.GetKernelBands();
            bool blurShouldBeApplied = kernelBands.Count > 0;

            if (IsDirty || m_focusArea.IsDirty || kernelGeneratorIsDirty)
			{
				if (kernelBands.Count > 0)
				{

					var gradient = EllipticFocusGradientGenerator.GenerateGradient(m_focusArea.Value, m_kernelGenerator);
					KernelMapSource = new GradientImageSource(GetKernelMapSize(), gradient);

					if (IsDirty || m_strength.IsDirty)
					{

						LensBlurEffect.Kernels = kernelBands.Select(band => band.Kernel).ToList();

						LensBlurEffect.BlendKernelWidth = LensBlurEffect.Kernels.Max(w => w.Size) / 2;
						LensBlurEffect.KernelMapType = LensBlurKernelMapType.Continuous;
						LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
					}
				}
			}

			m_strength.Reset();
			m_focusArea.Reset();

			return blurShouldBeApplied;
		}
        public static Task <List <IImageProcessor> > CreateEffects()
        {
            // This seems to take 150-200 ms minimum, so better do it on the thread pool.
            return(Task.Run(async() =>
            {
                var imageProcessors = new List <IImageProcessor>();
                EffectProcessor effectViewModel = null;

                var source = await PreloadedImages.Man;

                imageProcessors.Add(new EffectProcessor("Antique", new AntiqueEffect()));
                imageProcessors.Add(new EffectProcessor("Auto Enhance", new AutoEnhanceEffect()));
                imageProcessors.Add(new EffectProcessor("Auto Levels", new AutoLevelsEffect()));
                imageProcessors.Add(new BlendEffectProcessor());
                imageProcessors.Add(new EffectProcessor("Blur", new BlurEffect()));
                imageProcessors.Add(new EffectProcessor("Brightness Effect", new BrightnessEffect()));
                imageProcessors.Add(new EffectProcessor("Cartoon", new CartoonEffect()));
                imageProcessors.Add(new EffectProcessor("ChromaKey", new ChromaKeyEffect()));
                imageProcessors.Add(new EffectProcessor("ColorAdjust", new ColorAdjustEffect()));
                imageProcessors.Add(new EffectProcessor("ColorBoost", new ColorBoostEffect(1.0)));
                imageProcessors.Add(new EffectProcessor("Colorization", new ColorizationEffect()));
                imageProcessors.Add(new EffectProcessor("Color Swap", new ColorSwapEffect(Windows.UI.Color.FromArgb(255, 255, 0, 0), Windows.UI.Color.FromArgb(255, 0, 255, 0), 0.8, false, true)));
                imageProcessors.Add(new EffectProcessor("Contrast", new ContrastEffect(0.5)));
                imageProcessors.Add(new CropEffectProcessor());
                imageProcessors.Add(new CurveProcessor());
                imageProcessors.Add(new EffectProcessor("Despeckle", new DespeckleEffect(DespeckleLevel.Low)));
                imageProcessors.Add(new EffectProcessor("Emboss", new EmbossEffect(0.5)));
                imageProcessors.Add(new EffectProcessor("Exposure", new ExposureEffect(ExposureMode.Natural, 0.5)));
                imageProcessors.Add(new EffectProcessor("Flip", new FlipEffect(FlipMode.Both)));
                imageProcessors.Add(new EffectProcessor("Fog", new FogEffect()));
                imageProcessors.Add(new EffectProcessor("Foundation", new FoundationEffect()));
                imageProcessors.Add(new EffectProcessor("GaussianNoise", new GaussianNoiseEffect(1.0)));

                var gradient = new RadialGradient(new Point(0.5, 0.5), new EllipseRadius(0.5, 0.5));
                gradient.Stops = new[]
                {
                    new GradientStop {
                        Offset = 0.0, Color = Colors.Red
                    },
                    new GradientStop {
                        Offset = 1.0, Color = Colors.Cyan
                    }
                };

                var gradientImageSource = new GradientImageSource(new Size(800, 500), gradient);

                imageProcessors.Add(new EffectProcessor("Grayscale", new GrayscaleEffect()));
                imageProcessors.Add(new EffectProcessor("Grayscale Negative", new GrayscaleNegativeEffect()));
                imageProcessors.Add(new HSLProcessor());
                imageProcessors.Add(new EffectProcessor("HdrEffect", new HdrEffect()));
                imageProcessors.Add(new EffectProcessor("HueSaturationEffect", new HueSaturationEffect()));

                effectViewModel = new EffectProcessor("Levels", new LevelsEffect(), true, true);
                {
                    RangeEditorViewModelEx <LevelsEffect> blackEditor = null;
                    RangeEditorViewModelEx <LevelsEffect> grayEditor = null;
                    RangeEditorViewModelEx <LevelsEffect> whiteEditor = null;

                    blackEditor = new RangeEditorViewModelEx <LevelsEffect>(
                        "Black",
                        0.0,
                        1.0,
                        effectViewModel,
                        effect => effect.Black,
                        (effect, value) =>
                    {
                        effect.Black = value;
                        if (grayEditor.Value < value)
                        {
                            grayEditor.Value = value;
                        }
                        if (whiteEditor.Value < value)
                        {
                            whiteEditor.Value = value;
                        }
                    });

                    grayEditor = new RangeEditorViewModelEx <LevelsEffect>(
                        "Gray",
                        0.0,
                        1.0,
                        effectViewModel,
                        effect => effect.Gray,
                        (effect, value) =>
                    {
                        effect.Gray = value;
                        if (blackEditor.Value > value)
                        {
                            blackEditor.Value = value;
                        }
                        if (whiteEditor.Value < value)
                        {
                            whiteEditor.Value = value;
                        }
                    });

                    whiteEditor = new RangeEditorViewModelEx <LevelsEffect>(
                        "White",
                        0.0,
                        1.0,
                        effectViewModel,
                        effect => effect.White,
                        (effect, value) =>
                    {
                        effect.White = value;
                        if (blackEditor.Value > value)
                        {
                            blackEditor.Value = value;
                        }
                        if (grayEditor.Value > value)
                        {
                            grayEditor.Value = value;
                        }
                    });

                    effectViewModel.Editors.Add(blackEditor);
                    effectViewModel.Editors.Add(grayEditor);
                    effectViewModel.Editors.Add(whiteEditor);
                }
                imageProcessors.Add(effectViewModel);
                imageProcessors.Add(new LinearGradientImageSourceEffectProcessor());
                imageProcessors.Add(new EffectProcessor("Local Boost Automatic", new LocalBoostAutomaticEffect(8)));
                imageProcessors.Add(new EffectProcessor("LocalBoost", new LocalBoostEffect()));
                imageProcessors.Add(new EffectProcessor("Lomo", new LomoEffect()));
                imageProcessors.Add(new EffectProcessor("Magic Pen", new MagicPenEffect()));
                imageProcessors.Add(new EffectProcessor("Milky", new MilkyEffect()));
                imageProcessors.Add(new EffectProcessor("Mirror", new MirrorEffect()));
                imageProcessors.Add(new EffectProcessor("Mono Color", new MonoColorEffect(Windows.UI.Color.FromArgb(255, 255, 0, 0), 0.8)));
                imageProcessors.Add(new EffectProcessor("Moonlight", new MoonlightEffect(21)));
                imageProcessors.Add(new EffectProcessor("Negative", new NegativeEffect()));
                imageProcessors.Add(new EffectProcessor("Noise", new NoiseEffect(NoiseLevel.Maximum)));
                imageProcessors.Add(new EffectProcessor("Oily", new OilyEffect(OilBrushSize.Medium)));
                imageProcessors.Add(new EffectProcessor("Paint", new PaintEffect(4)));
                imageProcessors.Add(new EffectProcessor("Posterize", new PosterizeEffect(10)));
                imageProcessors.Add(new RadialGradientImageSourceEffectProcessor());
                imageProcessors.Add(new ReframingEffectProcessor());
                imageProcessors.Add(new EffectProcessor("Rotation", new RotationEffect()));
                imageProcessors.Add(new RgbLevelsEffectProcessor());
                imageProcessors.Add(new RgbMixerEffectProcessor());
                imageProcessors.Add(new SaturationLightnessProcessor());
                imageProcessors.Add(new EffectProcessor("Sharpness", new SharpnessEffect(0.2)));
                imageProcessors.Add(new EffectProcessor("Sepia", new SepiaEffect()));
                imageProcessors.Add(new EffectProcessor("Sketch", new Lumia.Imaging.Artistic.SketchEffect(SketchMode.Color)));
                imageProcessors.Add(new EffectProcessor("Solarize", new SolarizeEffect(0.8)));
                imageProcessors.Add(new SplitToneEffectProcessor());
                imageProcessors.Add(new SpotlightEffectProcessor());
                imageProcessors.Add(new EffectProcessor("Stamp", new StampEffect(5, 200.0 / 255.0)));
                imageProcessors.Add(new EffectProcessor("Temperature and Tint", new TemperatureAndTintEffect(50.0 / 255.0, 50.0 / 255.0)));
                imageProcessors.Add(new EffectProcessor("Vibrance", new VibranceEffect()));
                imageProcessors.Add(new EffectProcessor("Vignetting", new VignettingEffect(0.8, Windows.UI.Color.FromArgb(255, 255, 0, 0))));
                imageProcessors.Add(new EffectProcessor("Watercolor", new WatercolorEffect(0.8, 0.8)));
                imageProcessors.Add(new EffectProcessor("Warping", new WarpingEffect(WarpMode.Twister, 0.8)));
                imageProcessors.Add(new EffectProcessor("White Balance", new WhiteBalanceEffect(WhitePointCalculationMode.Maximum, Color.FromArgb(1, 219, 213, 199))));
                imageProcessors.Add(new EffectProcessor("Whiteboard Enhancement", new WhiteboardEnhancementEffect(WhiteboardEnhancementMode.Hard), canRenderAtPreviewSize: false));

                //GlamMe effects
                imageProcessors.Add(new BWEffect());
                imageProcessors.Add(new ElegantEffect());
                imageProcessors.Add(new RetroEffect());
                imageProcessors.Add(new VintageEffect());
                imageProcessors.Add(new MintEffect());
                imageProcessors.Add(new OldPosterEffect());
                imageProcessors.Add(new LensBlureSampleEffect());
                imageProcessors.Add(new GlamMeLomoEffect());
                imageProcessors.Add(new FreshEffect());
                imageProcessors.Add(new LightEffect());

                // Creative Studio Effects
                imageProcessors.Add(new BWloEffect());
                imageProcessors.Add(new IndoorEffect());
                imageProcessors.Add(new SunsetEffect());
                imageProcessors.Add(new BWHiEffect());
                imageProcessors.Add(new BWCopperEffect());
                imageProcessors.Add(new LoSatWarmEffect());

                //       imageProcessors.Add(new BlockTiltDoF());
                //       imageProcessors.Add(new EllipseTiltDoF());
                //       imageProcessors.Add(new LandscapeBackgroundDoF());
                //         imageProcessors.Add(new LensBlurProcessor()); // Special command editor

                return imageProcessors;
            }));
        }
		protected override bool TryPrepareLensBlurProperties()
		{
			var kernelCount = Quality == DepthOfFieldQuality.Full ? 5 : 1;
			m_edge1KernelGenerator.KernelCount = kernelCount;
			m_edge2KernelGenerator.KernelCount = kernelCount;

			var sourceSize = GetSourceSize();
			m_edge1KernelGenerator.SourceSize = sourceSize;
			m_edge2KernelGenerator.SourceSize = sourceSize;

			var kernels = LensBlurEffect.Kernels;

			var kernelGeneratorsAreDirty = m_edge1KernelGenerator.IsDirty || m_edge2KernelGenerator.IsDirty;

            var kernelBands = m_edge2KernelGenerator.GetKernelBands(m_edge1KernelGenerator.GetKernelBands());
            bool blurShouldBeApplied = kernelBands.Count > 0;

			if (IsDirty || kernelGeneratorsAreDirty)
			{
				kernels = kernelBands.Select(band => band.Kernel).ToList();

				if (kernels.Count > 0)
				{
					LensBlurEffect.Kernels = kernels;
				    blurShouldBeApplied = true;
				}
			}
            
			if (blurShouldBeApplied && (IsDirty || kernelGeneratorsAreDirty || m_focusBand.IsDirty))
			{
				var gradient = LensTiltFocusGradientGenerator.GenerateGradient(FocusBand, sourceSize, m_edge1KernelGenerator, m_edge2KernelGenerator, false);
				KernelMapSource = new GradientImageSource(GetKernelMapSize(), gradient);

				LensBlurEffect.KernelMapType = LensBlurKernelMapType.Continuous;
				LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
			}

			m_focusBand.Reset();

			return blurShouldBeApplied;
		}
        public LandscapeBackgroundDoF()
        {
            Name = "LandscapeBackgroundDoF";

            var radialGradient = new RadialGradient(new Point(0.5, 0.3), new EllipseRadius(0.2, 0.4))
            {
                Stops = new [] {
                    new GradientStop()
                    {
                        Color = foreground, Offset = 0
                    },
                    new GradientStop()
                    {
                        Color = foreground, Offset = 0.5
                    },
                    new GradientStop()
                    {
                        Color = background, Offset = 0.51
                    },
                    new GradientStop()
                    {
                        Color = background, Offset = 0.9
                    }
                }
            };

            m_scribbles = new GradientImageSource(new Size(500, 500), radialGradient);

            //Editors.Add(new EnumEditorViewModel<LandscapeBackgroundDoF, DepthOfFieldQuality>("Quality", this, (effect) =>
            //{
            //    if (effect.m_effectEffect == null) return DepthOfFieldQuality.Preview;
            //    return effect.m_effectEffect.Quality;
            //}, (effect, value) =>
            //{
            //    if (effect.m_effectEffect == null)
            //        return;
            //    effect.m_effectEffect.Quality = value;
            //}));

            Editors.Add(new RangeEditorViewModelEx <LandscapeBackgroundDoF>("Strength above horizon", 0, 1.0, this, (effect) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return(1.0);
                }
                return(effect.m_effectEffect.StrengthAboveHorizon);
            }, (effect, value) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return;
                }
                effect.m_effectEffect.StrengthAboveHorizon = value;
            }));

            Editors.Add(new RangeEditorViewModelEx <LandscapeBackgroundDoF>("Strength below horizon", 0, 1.0, this, (effect) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return(1.0);
                }
                return(effect.m_effectEffect.StrengthBelowHorizon);
            }, (effect, value) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return;
                }
                effect.m_effectEffect.StrengthBelowHorizon = value;
            }));
        }
		public static IImageProvider Generate(IImageProvider objectMaskSource, LinearGradient gradient, Size size, IReadOnlyList<ILensBlurKernel> kernels)
		{
			var backgroundSource = new GradientImageSource(size, gradient);
            var blendEffect = new BlendEffect(backgroundSource, objectMaskSource, BlendFunction.Lighten);
            return new IndexRemappingEffect(blendEffect, kernels.Count + 2);
		}