Ejemplo n.º 1
0
        public async Task ImageProviderTopology()
        {
            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList       = new LayerList(backgroundImage, backgroundImage.ImageSize, new Layer[]
            {
                new Layer(LayerStyle.Multiply(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 32, 16, 8))),
                new AdjustmentLayer(LayerStyle.Screen(0.5), new ContrastEffect(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessEffect(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new GrayscaleEffect())
            });

            var layersEffect = await layerList.ToImageProvider(new Size(50, 50)).AsTask();

            var chain = GetChain(layersEffect);


            Assert.AreEqual(5, chain.Count);

            Assert.AreSame(backgroundImage, chain.FirstOrDefault());

            Assert.IsInstanceOfType(chain[1], typeof(BlendEffect)); // Layer with ColorImageSource
            Assert.IsInstanceOfType(((BlendEffect)chain[1]).ForegroundSource, typeof(ColorImageSource));

            Assert.IsInstanceOfType(chain[2], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[2]).ForegroundSource, typeof(ContrastEffect));

            Assert.IsInstanceOfType(chain[3], typeof(BrightnessEffect));
            Assert.IsInstanceOfType(chain[4], typeof(GrayscaleEffect));
        }
Ejemplo n.º 2
0
        private void CreateImageProvider()
        {
            if ((int)Math.Min(m_requestedSize.Width, m_requestedSize.Height) <= 0)
            {
                throw new ArgumentOutOfRangeException("renderSize");
            }

            if ((int)Math.Min(m_tileSize.Width, m_tileSize.Height) <= 0)
            {
                throw new ArgumentOutOfRangeException("renderSize");
            }

            int outBgWidth  = (int)m_requestedSize.Width;
            int outBgHeight = (int)m_requestedSize.Height;
            int tileWidth   = (int)((Size)m_tileSize).Width;
            int tileHeight  = (int)((Size)m_tileSize).Height;

            m_relativeTileSize = new Size(m_tileSize.Width / m_requestedSize.Width, m_tileSize.Height / m_requestedSize.Height);

            var backgroundCanvas = new ColorImageSource(new Size(outBgWidth, outBgHeight), Color.FromArgb(255, 0, 0, 0));

            m_disposables.Add(backgroundCanvas);

            m_imageProvider = backgroundCanvas;

            BlendTilesToFillCanvas(outBgWidth, outBgHeight, tileWidth, tileHeight);
        }
Ejemplo n.º 3
0
 public void LayerListCanBeCreatedWithBackgroundImageAndLayers()
 {
     var backgroundImage = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
     var layerList       = new LayerList(backgroundImage, backgroundImage.ImageSize, new Layer[]
     {
         new Layer(LayerStyle.Add(0.5), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 128, 128, 128))),
         new AdjustmentLayer(LayerStyle.Normal(), new BrightnessEffect(0.9))
     });
 }
 private LayerContext CreateFakeLayerContext(Layer layer)
 {
     var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
     var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);
     var invariants = new LayerContext.Invariants(backgroundLayer, new MaybeTask<IImageProvider>(backgroundImage), new Size(0, 0));
     var layerContext = new LayerContext(invariants, backgroundLayer, layer, 1);
     layerContext.PreviousImage = layerContext.BackgroundImage;
     return layerContext;
 }
Ejemplo n.º 5
0
        private LayerContext CreateFakeLayerContext(Layer layer)
        {
            var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
            var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);
            var invariants      = new LayerContext.Invariants(backgroundLayer, new MaybeTask <IImageProvider>(backgroundImage), new Size(0, 0));
            var layerContext    = new LayerContext(invariants, backgroundLayer, layer, 1);

            layerContext.PreviousImage = layerContext.BackgroundImage;
            return(layerContext);
        }
        public void CreateWithTaskMask()
        {
            var mask = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
            var rect = new Rect(1, 2, 3, 4);

            var layerStyle = new LayerStyle(BlendFunction.Screen, 0.7, Task.FromResult<IImageProvider>(mask), rect);
            Assert.AreEqual(BlendFunction.Screen, layerStyle.BlendFunction);
            Assert.AreEqual(0.7, layerStyle.Opacity);
            Assert.AreSame(mask, layerStyle.MaskResolver(null).Result);
            Assert.AreEqual(rect, layerStyle.TargetArea);
        }
Ejemplo n.º 7
0
        public void CreateWithTaskMask()
        {
            var mask = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
            var rect = new Rect(1, 2, 3, 4);

            var layerStyle = new LayerStyle(BlendFunction.Screen, 0.7, Task.FromResult <IImageProvider>(mask), rect);

            Assert.AreEqual(BlendFunction.Screen, layerStyle.BlendFunction);
            Assert.AreEqual(0.7, layerStyle.Opacity);
            Assert.AreSame(mask, layerStyle.MaskResolver(null).Result);
            Assert.AreEqual(rect, layerStyle.TargetArea);
        }
        public async Task GetImageProviderReturnsExpectedResultWhenCreatedWithLambda()
        {
            var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
            var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);

            var layer         = new AdjustmentLayer(LayerStyle.Normal(), context => CreateTestEffect(context));
            var imageProvider = layer.GetImageProvider(CreateFakeLayerContext(backgroundLayer, backgroundImage, layer));

            ((IImageConsumer)await imageProvider.AsTask()).Source = backgroundImage;
            Assert.IsTrue(imageProvider.IsSynchronous);
            Assert.IsNotNull(imageProvider.Result);

            var imageProviderInfo = await imageProvider.Result.GetInfoAsync();

            Assert.AreEqual(BackgroundLayerSize, imageProviderInfo.ImageSize);
        }
Ejemplo n.º 9
0
        public async Task GetImageProviderReturnsExpectedResult()
        {
            var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
            var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);

            var layer         = new AdjustmentLayer(LayerStyle.Normal(), CreateTestEffect());
            var imageProvider = layer.GetImageProvider(CreateFakeLayerContext(backgroundLayer, backgroundImage, layer));

            ((IImageConsumer)await imageProvider.AsTask()).Source = backgroundImage;
            Assert.IsTrue(imageProvider.IsSynchronous);
            Assert.IsNotNull(imageProvider.Result);

            var bitmapRenderer = new BitmapRenderer(imageProvider.Result);
            var bitmap         = await bitmapRenderer.RenderAsync();

            Assert.AreEqual(BackgroundLayerSize, bitmap.Dimensions);
        }
        public async Task ImageProviderTopologyWithNesting()
        {
            var secondaryBackgroundImage = new ColorImageSource(new Size(100, 100), Colors.RosyBrown);
            var secondaryLayerList       = new LayerList(secondaryBackgroundImage, secondaryBackgroundImage.Size, new Layer[]
            {
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessFilter(1.0), new ContrastFilter(0.1))
            });

            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList       = new LayerList(backgroundImage, backgroundImage.Size, new Layer[]
            {
                new Layer(LayerStyle.Multiply(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 32, 16, 8))),
                new AdjustmentLayer(LayerStyle.Screen(0.5), new ContrastFilter(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessFilter(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new GrayscaleFilter()),
                new AdjustmentLayer(LayerStyle.Overlay(), secondaryLayerList.ToImageProvider())
            });

            var layersEffect = await layerList.ToImageProvider(new Size(50, 50)).AsTask();

            var chain = GetChain(layersEffect);

            Assert.AreEqual(6, chain.Count);

            Assert.AreSame(backgroundImage, chain.FirstOrDefault());

            Assert.IsInstanceOfType(chain[1], typeof(BlendEffect)); // Layer with ColorImageSource
            Assert.IsInstanceOfType(((BlendEffect)chain[1]).ForegroundSource, typeof(ColorImageSource));

            Assert.IsInstanceOfType(chain[2], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[2]).ForegroundSource, typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)((BlendEffect)chain[2]).ForegroundSource).Filters.Single(), typeof(ContrastFilter));

            Assert.IsInstanceOfType(chain[3], typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)chain[3]).Filters.Single(), typeof(BrightnessFilter));

            Assert.IsInstanceOfType(chain[4], typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)chain[4]).Filters.Single(), typeof(GrayscaleFilter));

            Assert.IsInstanceOfType(chain[5], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[5]).ForegroundSource, typeof(FilterEffect));
            var filters = ((FilterEffect)((BlendEffect)chain[5]).ForegroundSource).Filters.ToArray();

            Assert.IsInstanceOfType(filters[0], typeof(BrightnessFilter));
            Assert.IsInstanceOfType(filters[1], typeof(ContrastFilter));
        }
        public async Task RenderWithBackgroundPassedInConstructor()
        {
            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList       = new LayerList(backgroundImage, backgroundImage.Size, new Layer[]
            {
                new Layer(LayerStyle.Add(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 32, 16, 8)))
            });

            var layersEffect = await layerList.ToImageProvider().AsTask();

            var renderedBitmap = await layersEffect.GetBitmapAsync(null, OutputOption.PreserveAspectRatio);

            var pixels = renderedBitmap.Buffers[0].Buffer.ToArray();

            Assert.AreEqual(135, pixels[0]);
            Assert.AreEqual(143, pixels[1]);
            Assert.AreEqual(159, pixels[2]);
            Assert.AreEqual(255, pixels[3]);
        }
Ejemplo n.º 12
0
        public async Task RenderWithBackgroundAndDifferentRenderSizePassedInToImageProvider()
        {
            var layerList = new LayerList(new Layer[]
            {
                new Layer(LayerStyle.Add(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 32, 16, 8)))
            });

            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layersEffect    = await layerList.ToImageProvider(backgroundImage, backgroundImage.Size, new Size(50, 50)).AsTask();

            var bitmap = new Bitmap(new Size(50, 50), ColorMode.Bgra8888);
            await layersEffect.GetBitmapAsync(bitmap, OutputOption.PreserveAspectRatio);

            var pixels = bitmap.Buffers[0].Buffer.ToArray();

            Assert.AreEqual(135, pixels[0]);
            Assert.AreEqual(143, pixels[1]);
            Assert.AreEqual(160, pixels[2]);
            Assert.AreEqual(255, pixels[3]);
        }
Ejemplo n.º 13
0
        private static IImageProvider2 CreateSource(Size renderSize, int grainSize)
        {
            if ((int)Math.Min(renderSize.Width, renderSize.Height) <= 0)
            {
                throw new ArgumentOutOfRangeException("renderSize");
            }

            const int smallerAxisFor5MPixels = 1728;

            double scaleFactor    = smallerAxisFor5MPixels / Math.Min(renderSize.Width, renderSize.Height);
            var    noiseImageSize = new Size(renderSize.Width * scaleFactor, renderSize.Height * scaleFactor);

            var limitedScaleFactor = Math.Max(1.0, scaleFactor);

            var colorImageSource = new ColorImageSource(noiseImageSize, Color.FromArgb(255, 128, 128, 128));

            var filterEffect = new GaussianNoiseEffect(colorImageSource, Math.Max(1, grainSize / limitedScaleFactor));

            return(filterEffect);
        }
        private static IImageProvider2 CreateSource(Size renderSize, int grainSize)
        {
            if ((int)Math.Min(renderSize.Width, renderSize.Height) <= 0)
            {
                throw new ArgumentOutOfRangeException("renderSize");
            }

            const int smallerAxisFor5MPixels = 1728;

            double scaleFactor = smallerAxisFor5MPixels / Math.Min(renderSize.Width, renderSize.Height);
            var noiseImageSize = new Size(renderSize.Width * scaleFactor, renderSize.Height * scaleFactor);

            var limitedScaleFactor = Math.Max(1.0, scaleFactor);

            var colorImageSource = new ColorImageSource(noiseImageSize, Color.FromArgb(255, 128, 128, 128));

            var filterEffect = new GaussianNoiseEffect(colorImageSource, Math.Max(1, grainSize / limitedScaleFactor));

            return filterEffect;
        }
Ejemplo n.º 15
0
        public async Task RenderWithBackgroundPassedInConstructor()
        {
            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList       = new LayerList(backgroundImage, backgroundImage.ImageSize, new Layer[]
            {
                new Layer(LayerStyle.Add(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255, 32, 16, 8)))
            });

            var layersEffect = await layerList.ToImageProvider().AsTask();

            var bitmapRenderer = new BitmapRenderer(layersEffect);
            var renderedBitmap = await bitmapRenderer.RenderAsync();

            var pixels = renderedBitmap.Buffers[0].Buffer.ToArray();

            Assert.AreEqual(136, pixels[0]);
            Assert.AreEqual(144, pixels[1]);
            Assert.AreEqual(160, pixels[2]);
            Assert.AreEqual(255, pixels[3]);
        }
Ejemplo n.º 16
0
        public void FactoryMethodsGiveCorrectMask()
        {
            var mask = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);

            Assert.AreSame(mask, LayerStyle.Normal(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Add(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Color(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Colorburn(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Colordodge(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Darken(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Difference(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Exclusion(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Hardlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Hue(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Lighten(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Lineardodge(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Linearlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Multiply(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Overlay(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Screen(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Softlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Vividlight(1.0, mask).MaskResolver(null).Result);
        }
Ejemplo n.º 17
0
 public void LayerListCanBeCreatedWithBackgroundImage()
 {
     var backgroundImage = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
     var layerList = new LayerList(backgroundImage, backgroundImage.ImageSize);
 }
Ejemplo n.º 18
0
 public void LayerListCanBeCreatedWithBackgroundImageAndLayers()
 {
     var backgroundImage = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
     var layerList = new LayerList(backgroundImage, backgroundImage.ImageSize, new Layer[]
     {
         new Layer(LayerStyle.Add(0.5), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255,128,128,128))),
         new AdjustmentLayer(LayerStyle.Normal(), new BrightnessEffect(0.9))
     });
 }
Ejemplo n.º 19
0
        public async Task RenderWithBackgroundAndDifferentRenderSizePassedInToImageProvider()
        {
            var layerList = new LayerList(new Layer[]
            {
                new Layer(LayerStyle.Add(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255,32,16,8)))
            });

            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layersEffect = await layerList.ToImageProvider(backgroundImage, backgroundImage.ImageSize, new Size(50,50)).AsTask();

            var bitmap = new Bitmap(new Size(50,50), ColorMode.Bgra8888);
            var bitmapRenderer = new BitmapRenderer(layersEffect, bitmap);
            var renderedBitmap = await bitmapRenderer.RenderAsync();

            var pixels = bitmap.Buffers[0].Buffer.ToArray();
            Assert.AreEqual(136, pixels[0]);
            Assert.AreEqual(144, pixels[1]);
            Assert.AreEqual(160, pixels[2]);
            Assert.AreEqual(255, pixels[3]);
        }
Ejemplo n.º 20
0
        public async Task ImageProviderTopology()
        {
            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList = new LayerList(backgroundImage, backgroundImage.ImageSize, new Layer[]
            {
                new Layer(LayerStyle.Multiply(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255,32,16,8))),
                new AdjustmentLayer(LayerStyle.Screen(0.5), new ContrastEffect(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessEffect(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new GrayscaleEffect())
            });

            var layersEffect = await layerList.ToImageProvider(new Size(50,50)).AsTask();

            var chain = GetChain(layersEffect);


            Assert.AreEqual(5, chain.Count);

            Assert.AreSame(backgroundImage, chain.FirstOrDefault());
            
            Assert.IsInstanceOfType(chain[1],typeof(BlendEffect)); // Layer with ColorImageSource
            Assert.IsInstanceOfType(((BlendEffect)chain[1]).ForegroundSource, typeof(ColorImageSource));
            
            Assert.IsInstanceOfType(chain[2], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[2]).ForegroundSource, typeof(ContrastEffect));
            
            Assert.IsInstanceOfType(chain[3], typeof(BrightnessEffect));
            Assert.IsInstanceOfType(chain[4], typeof(GrayscaleEffect));
        }
 public void LayerListCanBeCreatedWithBackgroundImage()
 {
     var backgroundImage = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);
     var layerList       = new LayerList(backgroundImage, backgroundImage.Size);
 }
Ejemplo n.º 22
0
        public void FactoryMethodsGiveCorrectMask()
        {
            var mask = new ColorImageSource(new Size(100, 100), Colors.AliceBlue);

            Assert.AreSame(mask, LayerStyle.Normal(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Add(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Color(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Colorburn(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Colordodge(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Darken(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Difference(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Exclusion(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Hardlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Hue(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Lighten(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Lineardodge(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Linearlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Multiply(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Overlay(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Screen(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Softlight(1.0, mask).MaskResolver(null).Result);
            Assert.AreSame(mask, LayerStyle.Vividlight(1.0, mask).MaskResolver(null).Result);
        }
        public async Task GetImageProviderReturnsExpectedResultWhenCreatedWithAsynchronousImageProvider()
        {
            var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
            var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);

            var layer = new AdjustmentLayer(LayerStyle.Normal(), CreateTestEffectAsync());
            var imageProvider = layer.GetImageProvider(CreateFakeLayerContext(backgroundLayer, backgroundImage, layer));
            ((IImageConsumer)await imageProvider.AsTask()).Source = backgroundImage;
            Assert.IsFalse(imageProvider.WasSynchronous);
            var imageProviderResult = await imageProvider.AsTask();
            Assert.IsNotNull(imageProviderResult);

            var bitmapRenderer = new BitmapRenderer(imageProvider.Result);
            var bitmap = await bitmapRenderer.RenderAsync();
            Assert.AreEqual(BackgroundLayerSize, bitmap.Dimensions);
        }
        public async Task GetImageProviderReturnsExpectedResultWhenCreatedWithLambdaReturningAsynchronousImageProvider()
        {
            var backgroundImage = new ColorImageSource(BackgroundLayerSize, Colors.AliceBlue);
            var backgroundLayer = new Layer(LayerStyle.Normal(), backgroundImage, BackgroundLayerSize);

            var layer = new AdjustmentLayer(LayerStyle.Normal(), context => CreateTestEffectAsync(context));
            var imageProvider = layer.GetImageProvider(CreateFakeLayerContext(backgroundLayer, backgroundImage, layer));
            ((IImageConsumer)await imageProvider.AsTask()).Source = backgroundImage;
            Assert.IsFalse(imageProvider.WasSynchronous);
            var imageProviderResult = await imageProvider.AsTask();
            Assert.IsNotNull(imageProviderResult);

            var imageProviderInfo = await imageProvider.Result.GetInfoAsync();
            Assert.AreEqual(BackgroundLayerSize, imageProviderInfo.ImageSize);
        }
        public async Task ImageProviderTopologyWithNesting()
        {
            var secondaryBackgroundImage = new ColorImageSource(new Size(100, 100), Colors.RosyBrown);
            var secondaryLayerList = new LayerList(secondaryBackgroundImage, secondaryBackgroundImage.Size, new Layer[]
            {
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessFilter(1.0), new ContrastFilter(0.1))
            });

            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layerList = new LayerList(backgroundImage, backgroundImage.Size, new Layer[]
            {
                new Layer(LayerStyle.Multiply(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255,32,16,8))),
                new AdjustmentLayer(LayerStyle.Screen(0.5), new ContrastFilter(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new BrightnessFilter(0.7)),
                new AdjustmentLayer(LayerStyle.Normal(), new GrayscaleFilter()),
                new AdjustmentLayer(LayerStyle.Overlay(), secondaryLayerList.ToImageProvider())
            });

            var layersEffect = await layerList.ToImageProvider(new Size(50, 50)).AsTask();

            var chain = GetChain(layersEffect);

            Assert.AreEqual(6, chain.Count);

            Assert.AreSame(backgroundImage, chain.FirstOrDefault());

            Assert.IsInstanceOfType(chain[1], typeof(BlendEffect)); // Layer with ColorImageSource
            Assert.IsInstanceOfType(((BlendEffect)chain[1]).ForegroundSource, typeof(ColorImageSource));

            Assert.IsInstanceOfType(chain[2], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[2]).ForegroundSource, typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)((BlendEffect)chain[2]).ForegroundSource).Filters.Single(), typeof(ContrastFilter));

            Assert.IsInstanceOfType(chain[3], typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)chain[3]).Filters.Single(), typeof(BrightnessFilter));

            Assert.IsInstanceOfType(chain[4], typeof(FilterEffect));
            Assert.IsInstanceOfType(((FilterEffect)chain[4]).Filters.Single(), typeof(GrayscaleFilter));

            Assert.IsInstanceOfType(chain[5], typeof(BlendEffect));
            Assert.IsInstanceOfType(((BlendEffect)chain[5]).ForegroundSource, typeof(FilterEffect));
            var filters = ((FilterEffect)((BlendEffect)chain[5]).ForegroundSource).Filters.ToArray();
            Assert.IsInstanceOfType(filters[0], typeof(BrightnessFilter));
            Assert.IsInstanceOfType(filters[1], typeof(ContrastFilter));

        }
        public async Task RenderWithBackgroundAndDifferentRenderSizePassedInToImageProvider()
        {
            var layerList = new LayerList(new Layer[]
            {
                new Layer(LayerStyle.Add(), context => new ColorImageSource(context.BackgroundLayer.ImageSize, Color.FromArgb(255,32,16,8)))
            });

            var backgroundImage = new ColorImageSource(new Size(100, 100), Color.FromArgb(255, 128, 128, 128));
            var layersEffect = await layerList.ToImageProvider(backgroundImage, backgroundImage.Size, new Size(50,50)).AsTask();

            var bitmap = new Bitmap(new Size(50,50), ColorMode.Bgra8888);
            await layersEffect.GetBitmapAsync(bitmap, OutputOption.PreserveAspectRatio);

            var pixels = bitmap.Buffers[0].Buffer.ToArray();
            Assert.AreEqual(135, pixels[0]);
            Assert.AreEqual(143, pixels[1]);
            Assert.AreEqual(159, pixels[2]);
            Assert.AreEqual(255, pixels[3]);
        }
		private void CreateImageProvider()
		{
			if ((int)Math.Min(m_requestedSize.Width, m_requestedSize.Height) <= 0)
			{
				throw new ArgumentOutOfRangeException("renderSize");
			}

			if ((int)Math.Min(m_tileSize.Width, m_tileSize.Height) <= 0)
			{
				throw new ArgumentOutOfRangeException("renderSize");
			}

			int outBgWidth = (int)m_requestedSize.Width;
			int outBgHeight = (int)m_requestedSize.Height;
			int tileWidth = (int)((Size)m_tileSize).Width;
			int tileHeight = (int)((Size)m_tileSize).Height;

			m_relativeTileSize = new Size(m_tileSize.Width / m_requestedSize.Width, m_tileSize.Height / m_requestedSize.Height);

			var backgroundCanvas = new ColorImageSource(new Size(outBgWidth, outBgHeight), Color.FromArgb(255, 0, 0, 0));
			m_disposables.Add(backgroundCanvas);

			m_imageProvider = backgroundCanvas;

			BlendTilesToFillCanvas(outBgWidth, outBgHeight, tileWidth, tileHeight);
		}