From df955958e59e4580d7c5ce4d59095ae27d15fb96 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 15:42:31 +0200 Subject: [PATCH 01/35] Adds new test of factory for loading an image from a memory stream Former-commit-id: 98343f28edb50392fcad4d871451559a441e3152 --- .../ImageFactoryUnitTests.cs | 33 +++ .../ImageProcessor.UnitTests.csproj | 202 ++++++++++++------ src/ImageProcessor_Mono.sln | 26 ++- 3 files changed, 190 insertions(+), 71 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index a63f95ff2..1fc782073 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -51,5 +51,38 @@ namespace ImageProcessor.UnitTests Assert.IsNotNull(imageFactory.Image); } } + + /// > + /// Tests the loading of image from a memory stream + /// + /// + /// The file Name. + /// + /// + /// The expected mime type. + /// + [Test] + [TestCase("Chrysanthemum.jpg", "image/jpeg")] + [TestCase("Desert.jpg", "image/jpeg")] + [TestCase("cmyk.png", "image/png")] + [TestCase("Penguins.bmp", "image/bmp")] + [TestCase("Penguins.gif", "image/gif")] + public void TestLoadImageFromMemory(string fileName, string expectedMime) + { + string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); + byte[] photoBytes = File.ReadAllBytes(testPhoto); + + // ImageProcessor + using (MemoryStream inStream = new MemoryStream(photoBytes)) + { + using (ImageFactory imageFactory = new ImageFactory()) + { + imageFactory.Load(inStream); + Assert.AreEqual(null, imageFactory.ImagePath); + Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); + Assert.IsNotNull(imageFactory.Image); + } + } + } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 81516b4b6..d5841e6c2 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -1,98 +1,177 @@  - + Debug AnyCPU - {633B1C4C-4823-47BE-9A01-A665F3118C8C} + {03CA9055-F997-428C-BF28-F50F991777C6} Library - Properties ImageProcessor.UnitTests ImageProcessor.UnitTests - v4.0 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest + + ..\ true - + v4.5 true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug + DEBUG; prompt 4 + false + false - pdbonly + full true - bin\Release\ - TRACE + bin\Release prompt 4 + false + false + + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - + + - - - - - - - - - - - - + + + {D011A778-59C8-4BFA-A770-C350216BF161} + ImageProcessor.Web_NET45 + - {3b5dd734-fb7a-487d-8ce6-55e7af9aea7e} + {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E} ImageProcessor - - - - - - + + + Images\Chrysanthemum.jpg + PreserveNewest + + + Images\Desert.jpg + PreserveNewest + + + Images\Hydrangeas.jpg + PreserveNewest + + + Images\Jellyfish.jpg + PreserveNewest + + + Images\Koala.jpg + PreserveNewest + + + Images\Lighthouse.jpg + PreserveNewest + + + Images\Penguins-200.jpg + PreserveNewest + + + Images\Penguins-8.png + PreserveNewest + + + Images\Penguins.bmp + PreserveNewest + + + Images\Penguins.gif + PreserveNewest + + + Images\Penguins.jpg + PreserveNewest + + + Images\Penguins.png + PreserveNewest + + + Images\Penguins.tif + PreserveNewest + + + Images\Tulips.jpg + PreserveNewest + + + Images\bus.jpg + PreserveNewest + + + Images\cmyk.jpg + PreserveNewest + + + Images\cmyk.png + PreserveNewest + + + Images\jrt.jpg + PreserveNewest + + + Images\meter.gif + PreserveNewest + + + Images\rocks.jpg + PreserveNewest + + + Images\rotate.jpg + PreserveNewest + + + Images\sample1.jpg + PreserveNewest + + + Images\srgb.jpg + PreserveNewest + + + Images\srgb.png + PreserveNewest + + + Images\text.png + PreserveNewest + + + Images\thor.jpg + PreserveNewest + + + Images\udendørs-374.jpg + PreserveNewest + + + Images\udendørs.jpg + PreserveNewest + - - - - - False - - - False - - - False - - - False - - - - - - + @@ -100,11 +179,4 @@ - \ No newline at end of file diff --git a/src/ImageProcessor_Mono.sln b/src/ImageProcessor_Mono.sln index 7d47a2ca6..8b1e0fb37 100644 --- a/src/ImageProcessor_Mono.sln +++ b/src/ImageProcessor_Mono.sln @@ -3,12 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 VisualStudioVersion = 12.0.30110.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C427A497-74DC-49B1-8420-D6E68354F29B}" - ProjectSection(SolutionItems) = preProject - ImageProcessor.vsmdi = ImageProcessor.vsmdi - Local.testsettings = Local.testsettings - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E656CDE-124D-4FAF-837C-0EF1E192D418}" ProjectSection(SolutionItems) = preProject .nuget\NuGet.Config = .nuget\NuGet.Config @@ -24,6 +18,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET45", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessorConsole", "ImageProcessorConsole\ImageProcessorConsole.csproj", "{7BF5274B-56A7-4B62-8105-E9BDF25BAFE7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.UnitTests", "ImageProcessor.UnitTests\ImageProcessor.UnitTests.csproj", "{03CA9055-F997-428C-BF28-F50F991777C6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Any CPU = All|Any CPU @@ -37,6 +33,24 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Any CPU.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Any CPU.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Mixed Platforms.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|x86.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|x86.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|x86.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Any CPU.Build.0 = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|x86.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|x86.Build.0 = Release|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.ActiveCfg = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.Build.0 = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Mixed Platforms.ActiveCfg = All|Any CPU From b989e58e4102de84c7391c5646bb1c65ecfbe46f Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:03:26 +0200 Subject: [PATCH 02/35] Loads all the test images + tests a few filters as well (failing for gif images) Former-commit-id: 193b0354b1e8f9e227919084076d6fd1776425d1 --- .../ImageFactoryUnitTests.cs | 106 +++++++++++------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 1fc782073..7cd124b19 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -12,6 +12,7 @@ namespace ImageProcessor.UnitTests { using System; using System.IO; + using System.Collections.Generic; using NUnit.Framework; /// @@ -25,62 +26,89 @@ namespace ImageProcessor.UnitTests /// private readonly string localPath = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); + /// + /// Lists the input files in the Images folder + /// + /// The list of files. + private static IEnumerable ListInputFiles() + { + return Directory.GetFiles("./Images"); + } + /// /// Tests the loading of image from a file /// - /// - /// The file Name. - /// - /// - /// The expected mime type. - /// [Test] - [TestCase("Chrysanthemum.jpg", "image/jpeg")] - [TestCase("Desert.jpg", "image/jpeg")] - [TestCase("cmyk.png", "image/png")] - [TestCase("Penguins.bmp", "image/bmp")] - [TestCase("Penguins.gif", "image/gif")] - public void TestLoadImageFromFile(string fileName, string expectedMime) + public void TestLoadImageFromFile() { - string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); - using (ImageFactory imageFactory = new ImageFactory()) + foreach (var fileName in ListInputFiles()) { - imageFactory.Load(testPhoto); - Assert.AreEqual(testPhoto, imageFactory.ImagePath); - Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); - Assert.IsNotNull(imageFactory.Image); + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + Assert.AreEqual(fileName, imageFactory.ImagePath); + Assert.IsNotNull(imageFactory.Image); + } } + } /// > /// Tests the loading of image from a memory stream /// - /// - /// The file Name. - /// - /// - /// The expected mime type. - /// [Test] - [TestCase("Chrysanthemum.jpg", "image/jpeg")] - [TestCase("Desert.jpg", "image/jpeg")] - [TestCase("cmyk.png", "image/png")] - [TestCase("Penguins.bmp", "image/bmp")] - [TestCase("Penguins.gif", "image/gif")] - public void TestLoadImageFromMemory(string fileName, string expectedMime) + public void TestLoadImageFromMemory() { - string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); - byte[] photoBytes = File.ReadAllBytes(testPhoto); + foreach (var fileName in ListInputFiles()) + { + byte[] photoBytes = File.ReadAllBytes(fileName); - // ImageProcessor - using (MemoryStream inStream = new MemoryStream(photoBytes)) + using (var inStream = new MemoryStream(photoBytes)) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(inStream); + Assert.AreEqual(null, imageFactory.ImagePath); + Assert.IsNotNull(imageFactory.Image); + } + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void ApplyEffectAlpha() + { + foreach (var fileName in ListInputFiles()) { - using (ImageFactory imageFactory = new ImageFactory()) + using (var imageFactory = new ImageFactory()) { - imageFactory.Load(inStream); - Assert.AreEqual(null, imageFactory.ImagePath); - Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); - Assert.IsNotNull(imageFactory.Image); + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Alpha(50); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void ApplyEffectBrightness() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Brightness(50); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); } } } From 985ef8abad586b0c8e6ee19125a189ea03ded007 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:13:23 +0200 Subject: [PATCH 03/35] Adds test for constraints resize Former-commit-id: a30d4df7acc83a74eab1ed881a010fe14b42dd1f --- .../ImageFactoryUnitTests.cs | 24 +++++++++++++++---- .../ImageProcessor.UnitTests.csproj | 4 ---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 7cd124b19..b81cff068 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -21,11 +21,6 @@ namespace ImageProcessor.UnitTests [TestFixture] public class ImageFactoryUnitTests { - /// - /// The path to the binary's folder - /// - private readonly string localPath = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); - /// /// Lists the input files in the Images folder /// @@ -112,5 +107,24 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is well resized using constraints + /// + [Test] + public void ApplyConstraints() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Constrain(new System.Drawing.Size(200, 200)); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); + } + } + } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index d5841e6c2..4bb9bf77f 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -82,10 +82,6 @@ Images\Lighthouse.jpg PreserveNewest - - Images\Penguins-200.jpg - PreserveNewest - Images\Penguins-8.png PreserveNewest From 62d774378131c278311b6e46a487ce4501fc588a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:16:34 +0200 Subject: [PATCH 04/35] Checks that the image is actually resized Former-commit-id: cf8a8931b6b28c4825283f3a6af4e8c4d087ca9e --- .../ImageFactoryUnitTests.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index b81cff068..936c32345 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -83,8 +83,7 @@ namespace ImageProcessor.UnitTests imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); imageFactory.Alpha(50); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + Assert.AreNotEqual(original, imageFactory.Image); } } } @@ -102,8 +101,7 @@ namespace ImageProcessor.UnitTests imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); imageFactory.Brightness(50); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + Assert.AreNotEqual(original, imageFactory.Image); } } } @@ -114,15 +112,17 @@ namespace ImageProcessor.UnitTests [Test] public void ApplyConstraints() { + const int maxSize = 200; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Constrain(new System.Drawing.Size(200, 200)); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.LessOrEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); } } } From 777ade778a8098c152112ba59d9354289c64547a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:52:29 +0200 Subject: [PATCH 05/35] First fix of an animated gif problem on Mono Former-commit-id: 43eebfe02b5974def03fbf40962c787c2c6cdf0a --- src/ImageProcessor/Imaging/Formats/FormatUtilities.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs index 36d2e3c07..3c6e3b3e0 100644 --- a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs +++ b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs @@ -135,12 +135,14 @@ namespace ImageProcessor.Imaging.Formats int frameCount = image.GetFrameCount(frameDimension); int last = frameCount - 1; int delay = 0; - int index = 0; List gifFrames = new List(); for (int i = 0; i < frameCount; i++) { - int thisDelay = BitConverter.ToInt32(image.GetPropertyItem(20736).Value, index); + // GDI returns a single array with all delays, while Mono returns a different array for each frame + image.SelectActiveFrame(frameDimension, i); + var times = image.GetPropertyItem(20736).Value; + int thisDelay = BitConverter.ToInt32(times, 4*i % times.Length); int toAddDelay = thisDelay * 10 < 20 ? 20 : thisDelay * 10; // Minimum delay is 20 ms // Find the frame @@ -156,7 +158,6 @@ namespace ImageProcessor.Imaging.Formats } delay += toAddDelay; - index += 4; } info.GifFrames = gifFrames; From 21e771e4d1bdb83a324c8c40fb7783966bedbf12 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 20:48:03 +0200 Subject: [PATCH 06/35] Fixes a unit test (wrong parameters order) Former-commit-id: bcfb1caf15531d47653132153ad26cef59668c0e --- src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 936c32345..f81fd1c5b 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -121,8 +121,8 @@ namespace ImageProcessor.UnitTests var original = imageFactory.Image.Clone(); imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.LessOrEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.LessOrEqual(imageFactory.Image.Width, maxSize); + Assert.LessOrEqual(imageFactory.Image.Height, maxSize); } } } From a2853ce1c23e05b9a9a78a5e599ed86158fe923a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 22:25:54 +0200 Subject: [PATCH 07/35] Re-fix of a Mono problem + modify some 'var' usage Former-commit-id: 1a96ba18689b8aa25607f3b699971f39c16132f9 --- src/ImageProcessor/ImageFactory.cs | 62 ++++++++++++++++-------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/ImageProcessor/ImageFactory.cs b/src/ImageProcessor/ImageFactory.cs index 540e34c9a..4a68a5e86 100644 --- a/src/ImageProcessor/ImageFactory.cs +++ b/src/ImageProcessor/ImageFactory.cs @@ -177,13 +177,13 @@ namespace ImageProcessor /// public ImageFactory Load(string imagePath) { - FileInfo fileInfo = new FileInfo(imagePath); + var fileInfo = new FileInfo(imagePath); if (fileInfo.Exists) { this.ImagePath = imagePath; // Open a file stream to prevent the need for lock. - using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) + using (var fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) { ISupportedImageFormat format = FormatUtilities.GetFormat(fileStream); @@ -192,7 +192,7 @@ namespace ImageProcessor throw new ImageFormatException("Input stream is not a supported format."); } - MemoryStream memoryStream = new MemoryStream(); + var memoryStream = new MemoryStream(); // Copy the stream. fileStream.CopyTo(memoryStream); @@ -240,7 +240,11 @@ namespace ImageProcessor if (this.ShouldProcess) { // Set our new image as the memory stream value. + #if !__MonoCS__ Image newImage = Image.FromStream(this.InputStream, true); + #else + Image newImage = Image.FromStream(this.InputStream); + #endif // Dispose and reassign the image. this.Image.Dispose(); @@ -275,7 +279,7 @@ namespace ImageProcessor percentage = 0; } - Alpha alpha = new Alpha { DynamicParameter = percentage }; + var alpha = new Alpha { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(alpha.ProcessImage, this); } @@ -293,7 +297,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - AutoRotate autoRotate = new AutoRotate(); + var autoRotate = new AutoRotate(); this.CurrentImageFormat.ApplyProcessor(autoRotate.ProcessImage, this); } @@ -320,7 +324,7 @@ namespace ImageProcessor percentage = 0; } - Brightness brightness = new Brightness { DynamicParameter = percentage }; + var brightness = new Brightness { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(brightness.ProcessImage, this); } @@ -340,7 +344,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - ResizeLayer layer = new ResizeLayer(size, ResizeMode.Max); + var layer = new ResizeLayer(size, ResizeMode.Max); return this.Resize(layer); } @@ -368,7 +372,7 @@ namespace ImageProcessor percentage = 0; } - Contrast contrast = new Contrast { DynamicParameter = percentage }; + var contrast = new Contrast { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(contrast.ProcessImage, this); } @@ -388,7 +392,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - CropLayer cropLayer = new CropLayer(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height, CropMode.Pixels); + var cropLayer = new CropLayer(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height, CropMode.Pixels); return this.Crop(cropLayer); } @@ -399,7 +403,7 @@ namespace ImageProcessor /// Crops the current image to the given location and size. /// /// - /// The containing the coordinates and mode to crop the image with. + /// The containing the coordinates and mode to crop the image with. /// /// /// The current instance of the class. @@ -408,7 +412,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Crop crop = new Crop { DynamicParameter = cropLayer }; + var crop = new Crop { DynamicParameter = cropLayer }; this.CurrentImageFormat.ApplyProcessor(crop.ProcessImage, this); } @@ -429,7 +433,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Filter filter = new Filter { DynamicParameter = matrixFilter }; + var filter = new Filter { DynamicParameter = matrixFilter }; this.CurrentImageFormat.ApplyProcessor(filter.ProcessImage, this); } @@ -449,11 +453,11 @@ namespace ImageProcessor { if (this.ShouldProcess) { - RotateFlipType rotateFlipType = flipVertically == false - ? RotateFlipType.RotateNoneFlipX - : RotateFlipType.RotateNoneFlipY; + RotateFlipType rotateFlipType = flipVertically + ? RotateFlipType.RotateNoneFlipY + : RotateFlipType.RotateNoneFlipX; - Flip flip = new Flip { DynamicParameter = rotateFlipType }; + var flip = new Flip { DynamicParameter = rotateFlipType }; this.CurrentImageFormat.ApplyProcessor(flip.ProcessImage, this); } @@ -496,7 +500,7 @@ namespace ImageProcessor { if (this.ShouldProcess && size > 0) { - GaussianLayer layer = new GaussianLayer(size); + var layer = new GaussianLayer(size); return this.GaussianBlur(layer); } @@ -517,7 +521,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - GaussianBlur gaussianBlur = new GaussianBlur { DynamicParameter = gaussianLayer }; + var gaussianBlur = new GaussianBlur { DynamicParameter = gaussianLayer }; this.CurrentImageFormat.ApplyProcessor(gaussianBlur.ProcessImage, this); } @@ -543,7 +547,7 @@ namespace ImageProcessor { if (this.ShouldProcess && size > 0) { - GaussianLayer layer = new GaussianLayer(size); + var layer = new GaussianLayer(size); return this.GaussianSharpen(layer); } @@ -564,7 +568,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - GaussianSharpen gaussianSharpen = new GaussianSharpen { DynamicParameter = gaussianLayer }; + var gaussianSharpen = new GaussianSharpen { DynamicParameter = gaussianLayer }; this.CurrentImageFormat.ApplyProcessor(gaussianSharpen.ProcessImage, this); } @@ -607,7 +611,7 @@ namespace ImageProcessor int width = size.Width; int height = size.Height; - ResizeLayer resizeLayer = new ResizeLayer(new Size(width, height)); + var resizeLayer = new ResizeLayer(new Size(width, height)); return this.Resize(resizeLayer); } @@ -629,7 +633,7 @@ namespace ImageProcessor { var resizeSettings = new Dictionary { { "MaxWidth", resizeLayer.Size.Width.ToString("G") }, { "MaxHeight", resizeLayer.Size.Height.ToString("G") } }; - Resize resize = new Resize { DynamicParameter = resizeLayer, Settings = resizeSettings }; + var resize = new Resize { DynamicParameter = resizeLayer, Settings = resizeSettings }; this.CurrentImageFormat.ApplyProcessor(resize.ProcessImage, this); } @@ -655,7 +659,7 @@ namespace ImageProcessor degrees = 0; } - Rotate rotate = new Rotate { DynamicParameter = degrees }; + var rotate = new Rotate { DynamicParameter = degrees }; this.CurrentImageFormat.ApplyProcessor(rotate.ProcessImage, this); } @@ -680,7 +684,7 @@ namespace ImageProcessor roundedCornerLayer.Radius = 0; } - RoundedCorners roundedCorners = new RoundedCorners { DynamicParameter = roundedCornerLayer }; + var roundedCorners = new RoundedCorners { DynamicParameter = roundedCornerLayer }; this.CurrentImageFormat.ApplyProcessor(roundedCorners.ProcessImage, this); } @@ -707,7 +711,7 @@ namespace ImageProcessor percentage = 0; } - Saturation saturate = new Saturation { DynamicParameter = percentage }; + var saturate = new Saturation { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(saturate.ProcessImage, this); } @@ -727,7 +731,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Tint tint = new Tint { DynamicParameter = color }; + var tint = new Tint { DynamicParameter = color }; this.CurrentImageFormat.ApplyProcessor(tint.ProcessImage, this); } @@ -747,7 +751,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Vignette vignette = new Vignette + var vignette = new Vignette { DynamicParameter = color.HasValue && !color.Equals(Color.Transparent) ? color.Value @@ -774,7 +778,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Watermark watermark = new Watermark { DynamicParameter = textLayer }; + var watermark = new Watermark { DynamicParameter = textLayer }; this.CurrentImageFormat.ApplyProcessor(watermark.ProcessImage, this); } @@ -796,7 +800,7 @@ namespace ImageProcessor if (this.ShouldProcess) { // ReSharper disable once AssignNullToNotNullAttribute - DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(filePath)); + var directoryInfo = new DirectoryInfo(Path.GetDirectoryName(filePath)); if (!directoryInfo.Exists) { directoryInfo.Create(); From e5b6a3481f2911b84b023bfafbb61e8ef9e66678 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 22:53:25 +0200 Subject: [PATCH 08/35] Adds a few more unit tests Former-commit-id: c782e8168d8b9b186cc0855e46bd0478019ec5d9 --- .../ImageFactoryUnitTests.cs | 122 +++++++++++++++++- 1 file changed, 119 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index f81fd1c5b..ac5de24a4 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -74,7 +74,7 @@ namespace ImageProcessor.UnitTests /// Tests that a filter is really applied by checking that the image is modified /// [Test] - public void ApplyEffectAlpha() + public void TestApplyEffectAlpha() { foreach (var fileName in ListInputFiles()) { @@ -92,7 +92,7 @@ namespace ImageProcessor.UnitTests /// Tests that a filter is really applied by checking that the image is modified /// [Test] - public void ApplyEffectBrightness() + public void TestApplyEffectBrightness() { foreach (var fileName in ListInputFiles()) { @@ -106,11 +106,85 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectContrast() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Contrast(50); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that all filters can be applied + /// + [Test] + public void TestApplyEffectFilter() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.BlackWhite); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Comic); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Gotham); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.GreyScale); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.HiSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Invert); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Lomograph); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.LoSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Polaroid); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Sepia); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + } + } + } + /// /// Tests that the image is well resized using constraints /// [Test] - public void ApplyConstraints() + public void TestResizeConstraints() { const int maxSize = 200; foreach (var fileName in ListInputFiles()) @@ -126,5 +200,47 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is well cropped + /// + [Test] + public void TestCrop() + { + const int maxSize = 20; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Crop(new System.Drawing.Rectangle(0, 0, maxSize, maxSize)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + } + } + } + + /// + /// Tests that the image is well cropped + /// + [Test] + public void TestCropWithCropLayer() + { + const int maxSize = 20; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Crop(new Imaging.CropLayer(0, 0, maxSize, maxSize, Imaging.CropMode.Pixels)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From 1ddb67078367c5f3d74499be588411993e9801ff Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 23:11:58 +0200 Subject: [PATCH 09/35] Adds a few more unit tests Former-commit-id: bca6ad3548ecf57e56eb416dcfbfd002b725b733 --- .../ImageFactoryUnitTests.cs | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index ac5de24a4..7dd09e078 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -124,6 +124,42 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectBlur() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianBlur(5); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectBlurWithLayer() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianBlur(new Imaging.GaussianLayer() { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that all filters can be applied /// @@ -242,5 +278,31 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is flipped + /// + [Test] + public void TestFlip() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Flip(true); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); + imageFactory.Reset(); + + imageFactory.Flip(false); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From 71a4fbf6ffdecbf7317a7314b36ccd3da4a9c648 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 23:22:35 +0200 Subject: [PATCH 10/35] Adds a few more unit tests Former-commit-id: ccb39e91e174833342bf502d6f12dc75b149c0bf --- .../ImageFactoryUnitTests.cs | 82 ++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 7dd09e078..60db9a8ee 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -154,7 +154,43 @@ namespace ImageProcessor.UnitTests { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.GaussianBlur(new Imaging.GaussianLayer() { Sigma = 10, Size = 5, Threshold = 2 }); + imageFactory.GaussianBlur(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSharpen() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(5); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSharpenWithLayer() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); Assert.AreNotEqual(original, imageFactory.Image); } } @@ -228,9 +264,7 @@ namespace ImageProcessor.UnitTests using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); - Assert.AreNotEqual(original, imageFactory.Image); Assert.LessOrEqual(imageFactory.Image.Width, maxSize); Assert.LessOrEqual(imageFactory.Image.Height, maxSize); } @@ -304,5 +338,47 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestResize() + { + const int newSize = 150; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Resize(new System.Drawing.Size(newSize, newSize)); + Assert.AreEqual(newSize, imageFactory.Image.Width); + Assert.AreEqual(newSize, imageFactory.Image.Height); + } + } + } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestResizeWithLayer() + { + const int newSize = 150; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Resize(new Imaging.ResizeLayer( + new System.Drawing.Size(newSize, newSize), + Imaging.ResizeMode.Stretch, + Imaging.AnchorPosition.Left, + true)); + Assert.AreEqual(newSize, imageFactory.Image.Width); + Assert.AreEqual(newSize, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From 8f1480cff62b05ed683e576b1a8bb3fca28233e3 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 00:37:38 +0200 Subject: [PATCH 11/35] Yet a few other unit tests Former-commit-id: cfc586b9f02332ec65eaea1ba0c89b6b4be6b27e --- .../ImageFactoryUnitTests.cs | 182 ++++++++++++++---- 1 file changed, 146 insertions(+), 36 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 60db9a8ee..d868b2245 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -11,8 +11,8 @@ namespace ImageProcessor.UnitTests { using System; - using System.IO; using System.Collections.Generic; + using System.IO; using NUnit.Framework; /// @@ -21,15 +21,6 @@ namespace ImageProcessor.UnitTests [TestFixture] public class ImageFactoryUnitTests { - /// - /// Lists the input files in the Images folder - /// - /// The list of files. - private static IEnumerable ListInputFiles() - { - return Directory.GetFiles("./Images"); - } - /// /// Tests the loading of image from a file /// @@ -45,10 +36,9 @@ namespace ImageProcessor.UnitTests Assert.IsNotNull(imageFactory.Image); } } - } - /// > + /// /// Tests the loading of image from a memory stream /// [Test] @@ -124,6 +114,84 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSaturation() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Saturation(50); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectTint() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Tint(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectVignette() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Vignette(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectWatermark() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Watermark(new Imaging.TextLayer + { + Font = "Arial", + FontSize = 10, + Position = new System.Drawing.Point(10, 10), + Text = "Lorem ipsum dolor" + }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that a filter is really applied by checking that the image is modified /// @@ -252,21 +320,39 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestRoundedCorners() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.RoundedCorners(new Imaging.RoundedCornerLayer(5, true, true, true, true)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that the image is well resized using constraints /// [Test] public void TestResizeConstraints() { - const int maxSize = 200; + const int MaxSize = 200; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); - Assert.LessOrEqual(imageFactory.Image.Width, maxSize); - Assert.LessOrEqual(imageFactory.Image.Height, maxSize); + imageFactory.Constrain(new System.Drawing.Size(MaxSize, MaxSize)); + Assert.LessOrEqual(imageFactory.Image.Width, MaxSize); + Assert.LessOrEqual(imageFactory.Image.Height, MaxSize); } } } @@ -277,17 +363,17 @@ namespace ImageProcessor.UnitTests [Test] public void TestCrop() { - const int maxSize = 20; + const int MaxSize = 20; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Crop(new System.Drawing.Rectangle(0, 0, maxSize, maxSize)); + imageFactory.Crop(new System.Drawing.Rectangle(0, 0, MaxSize, MaxSize)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } } @@ -298,17 +384,17 @@ namespace ImageProcessor.UnitTests [Test] public void TestCropWithCropLayer() { - const int maxSize = 20; + const int MaxSize = 20; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Crop(new Imaging.CropLayer(0, 0, maxSize, maxSize, Imaging.CropMode.Pixels)); + imageFactory.Crop(new Imaging.CropLayer(0, 0, MaxSize, MaxSize, Imaging.CropMode.Pixels)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } } @@ -345,15 +431,15 @@ namespace ImageProcessor.UnitTests [Test] public void TestResize() { - const int newSize = 150; + const int NewSize = 150; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Resize(new System.Drawing.Size(newSize, newSize)); - Assert.AreEqual(newSize, imageFactory.Image.Width); - Assert.AreEqual(newSize, imageFactory.Image.Height); + imageFactory.Resize(new System.Drawing.Size(NewSize, NewSize)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } } @@ -364,21 +450,45 @@ namespace ImageProcessor.UnitTests [Test] public void TestResizeWithLayer() { - const int newSize = 150; + const int NewSize = 150; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Resize(new Imaging.ResizeLayer( - new System.Drawing.Size(newSize, newSize), - Imaging.ResizeMode.Stretch, - Imaging.AnchorPosition.Left, - true)); - Assert.AreEqual(newSize, imageFactory.Image.Width); - Assert.AreEqual(newSize, imageFactory.Image.Height); + imageFactory.Resize(new Imaging.ResizeLayer(new System.Drawing.Size(NewSize, NewSize), Imaging.ResizeMode.Stretch, Imaging.AnchorPosition.Left)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestRotate() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Rotate(90); + Assert.AreEqual(original.Height, imageFactory.Image.Width); + Assert.AreEqual(original.Width, imageFactory.Image.Height); + } + } + } + + /// + /// Lists the input files in the Images folder + /// + /// The list of files. + private static IEnumerable ListInputFiles() + { + return Directory.GetFiles("./Images"); + } } } \ No newline at end of file From f3a5cc25ba71d64355c15a65d7b877cab7ec489d Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 00:41:53 +0200 Subject: [PATCH 12/35] Adds tests for saving the files Former-commit-id: 7893eb70f8315cf13da030fde6a4a3c9884f59aa --- .../ImageFactoryUnitTests.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index d868b2245..880871cc7 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -60,6 +60,45 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that the save method actually saves a file + /// + [Test] + public void TestSaveToDisk() + { + foreach (var fileName in ListInputFiles()) + { + var outputFileName = string.Format("./output/{0}", Path.GetFileName(fileName)); + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Save(outputFileName); + Assert.AreEqual(true, File.Exists(outputFileName)); + } + } + } + + /// + /// Tests that the save method actually writes to memory + /// + [Test] + public void TestSaveToMemory() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + using (var s = new MemoryStream()) + { + imageFactory.Save(s); + s.Seek(0, SeekOrigin.Begin); + Assert.AreEqual(true, s.Capacity > 0); + } + } + } + } + /// /// Tests that a filter is really applied by checking that the image is modified /// From 913beeaa1b7edbb19e99b5c5ddd8d4cd0c441654 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 11:09:25 +0200 Subject: [PATCH 13/35] Removes unnecessary images Former-commit-id: b7abba38c2ce512bdd6706af08fdabd25537f8b7 --- .../Images/Chrysanthemum.jpg.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id | 1 - 5 files changed, 5 deletions(-) delete mode 100644 src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id diff --git a/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id deleted file mode 100644 index d067665c9..000000000 --- a/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -757c2a628dd03b1cbe4b3ef07c153897a702b57a \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id deleted file mode 100644 index 228aac3ab..000000000 --- a/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -0b88c91336ff8073f34d21ccd683a01f0e0995da \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id deleted file mode 100644 index 74f69293c..000000000 --- a/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8150b46ab27c62ba51aaba551eef3f1a30f08de9 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id deleted file mode 100644 index ce873d473..000000000 --- a/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -6ad3b846d4697584ff601ac481b14a4d3bbb5736 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id deleted file mode 100644 index aeca7b93c..000000000 --- a/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -db4d55a332254cd6b41336c06f207682bf5a966f \ No newline at end of file From d0d48a0f329d5a978beb5241a1014bd231d2f897 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 11:33:05 +0200 Subject: [PATCH 14/35] Filters the source images a bit, in order to speed up the unit tests + descriptive name Former-commit-id: eb53b2d6eef84df94cefa75642ac5be52af4e9e2 --- .../ImageProcessor.UnitTests.csproj | 132 ++++-------------- .../Images/autorotate.jpg.REMOVED.git-id | 1 + .../cmyk-profile-euroscale.jpg.REMOVED.git-id | 1 + .../Images/cmyk.jpg.REMOVED.git-id | 1 + .../color-vision-test.gif.REMOVED.git-id | 1 + .../Images/exif-Tulips.jpg.REMOVED.git-id | 1 + .../Images/exif-rocks.jpg.REMOVED.git-id | 1 + .../format-Penguins-8bit.png.REMOVED.git-id | 1 + .../Images/format-Penguins.bmp.REMOVED.git-id | 1 + .../Images/format-Penguins.gif.REMOVED.git-id | 1 + .../Images/format-Penguins.jpg.REMOVED.git-id | 1 + .../Images/format-Penguins.png.REMOVED.git-id | 1 + .../Images/format-Penguins.tif.REMOVED.git-id | 1 + .../Images/format-animated.gif | Bin 0 -> 22525 bytes .../Images/hi-color.png | Bin 0 -> 1539 bytes .../Images/hi-contrast.jpg | Bin 0 -> 51058 bytes .../Images/hi-saturation.jpg | Bin 0 -> 33850 bytes .../profile-adobe-rgb.jpg.REMOVED.git-id | 1 + .../Images/profile-srgb.jpg.REMOVED.git-id | 1 + .../Images/size-Penguins-200.jpg | Bin 0 -> 10119 bytes .../Images/text-over-transparent.png | Bin 0 -> 7317 bytes .../Images/udendørs.jpg.REMOVED.git-id | 1 + 22 files changed, 39 insertions(+), 108 deletions(-) create mode 100644 src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-animated.gif create mode 100644 src/ImageProcessor.UnitTests/Images/hi-color.png create mode 100644 src/ImageProcessor.UnitTests/Images/hi-contrast.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/hi-saturation.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/profile-adobe-rgb.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/profile-srgb.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/size-Penguins-200.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/text-over-transparent.png create mode 100644 src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 4bb9bf77f..726d0988e 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -58,114 +58,27 @@ - - Images\Chrysanthemum.jpg - PreserveNewest - - - Images\Desert.jpg - PreserveNewest - - - Images\Hydrangeas.jpg - PreserveNewest - - - Images\Jellyfish.jpg - PreserveNewest - - - Images\Koala.jpg - PreserveNewest - - - Images\Lighthouse.jpg - PreserveNewest - - - Images\Penguins-8.png - PreserveNewest - - - Images\Penguins.bmp - PreserveNewest - - - Images\Penguins.gif - PreserveNewest - - - Images\Penguins.jpg - PreserveNewest - - - Images\Penguins.png - PreserveNewest - - - Images\Penguins.tif - PreserveNewest - - - Images\Tulips.jpg - PreserveNewest - - - Images\bus.jpg - PreserveNewest - - - Images\cmyk.jpg - PreserveNewest - - - Images\cmyk.png - PreserveNewest - - - Images\jrt.jpg - PreserveNewest - - - Images\meter.gif - PreserveNewest - - - Images\rocks.jpg - PreserveNewest - - - Images\rotate.jpg - PreserveNewest - - - Images\sample1.jpg - PreserveNewest - - - Images\srgb.jpg - PreserveNewest - - - Images\srgb.png - PreserveNewest - - - Images\text.png - PreserveNewest - - - Images\thor.jpg - PreserveNewest - - - Images\udendørs-374.jpg - PreserveNewest - - - Images\udendørs.jpg - PreserveNewest - + + + + + + + + + + + + + + + + + + + + + @@ -175,4 +88,7 @@ + + + \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id new file mode 100644 index 000000000..19785c8e5 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id @@ -0,0 +1 @@ +85a8ae18f9955def2b42ba9240bce4de1bfe5781 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id new file mode 100644 index 000000000..7747bdaae --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id @@ -0,0 +1 @@ +13492524f9d984c12adfe6183a4c1d92fb11ec4e \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id new file mode 100644 index 000000000..30b05146b --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id @@ -0,0 +1 @@ +ed725726e4ac1ffeac821664af14865a66fa933f \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id new file mode 100644 index 000000000..5c4f4195d --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id @@ -0,0 +1 @@ +35a926115b13b61dc37308f8d903b42d14f92924 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id new file mode 100644 index 000000000..84b9aff85 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id @@ -0,0 +1 @@ +54c51eb6a86f31a42433b8167470fb18dad32c7d \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id new file mode 100644 index 000000000..41c6c25df --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id @@ -0,0 +1 @@ +33b6912af301bf216ee81d82b2c3ce6c49e03021 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id new file mode 100644 index 000000000..aa9a70e0f --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id @@ -0,0 +1 @@ +c3d556d9d486b8b8b49cdbcc9c12a9d3a2db4c1f \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id new file mode 100644 index 000000000..74f69293c --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id @@ -0,0 +1 @@ +8150b46ab27c62ba51aaba551eef3f1a30f08de9 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id new file mode 100644 index 000000000..ce873d473 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id @@ -0,0 +1 @@ +6ad3b846d4697584ff601ac481b14a4d3bbb5736 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id new file mode 100644 index 000000000..ad4371113 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id @@ -0,0 +1 @@ +030ab8a685bebb796c24cc710edd9e69859164f6 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id new file mode 100644 index 000000000..78062a0e7 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id @@ -0,0 +1 @@ +a2c796fbb7de948230a22982ab74892891dd5198 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id new file mode 100644 index 000000000..5f7b97e71 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id @@ -0,0 +1 @@ +c789aaec248568c24394b05c02db4233e0c5a4eb \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-animated.gif b/src/ImageProcessor.UnitTests/Images/format-animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..03fce3f3a5b70ca8463cefdd94c00e9c7fdbab0f GIT binary patch literal 22525 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 *EHnj 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 literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/hi-contrast.jpg b/src/ImageProcessor.UnitTests/Images/hi-contrast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd2c9b90248231317b880634eac8f98f2dbdf6a7 GIT binary patch literal 51058 zcmb4p^;;Xy7j8mum*7rIi(7CFZiNO2P`przJH_3Cm6D1+r zo9}&|`v=^~{*YvLch1h7ec$(-IZyLXzX7BgD(Wf#AP@+6i~azfmH>(X5C+Eo4s^pr zA6U3pSeTet_&7M&xPm=gTI zn*c%RYcR3!u(0sJLM*YZRSx1M?t-WfK9V7983&r z&|)ZeDh$gANpO&#=bGjKthddggpJpoKKjcjU}ZIC=cbX1!U}U;P{jQq}+dp;sG4GCd)vpu>9Yl zE|*ZzJ7k*mrM~VPdQn(J;5f(z(d+oAuSQZk&09(7h%`OFP<0V}9Cv;rE+HR=+^#etPq%dqcfV0phT zHg+*G2QX@sKsNapvW4tJt(}F`I2#E0rp-|Lx2SL43KSQt{OJbYIBXS z2`DbewhEy49N2ib0&s>Bhnk8$;D`Rsqi>VSBXBf!das3Tp+U;H7^Bk~s*O-h8yP2g z$C?K#fU0%qvzQKA5jAZOz^Xb1Kpg;s)lHEP;PUWY8HWsdxtR^0#u3Vvn)A85g>_Y&+=Y|1CJ~fNO*2g#mCxag+dIZ*ypH1LncZ^wxO1;5tO7BiB%mcRI>sPFV+ClUTv1)Z^QDP`T=$GWjK!in{Lt7BNl2*kWB>(nL9jU zsO1oruK;?ls=(SvZv{3k)g%m3!GYMB$vXP{9>JOQ}QQqAbL? zm}})MOllaVKmZGcL3!9I4BPsi6yydK^GBa{0tY$22iOeQIZZ=F@OfrfeB2aSH6#JW zMyx33=U5yt1p-HI6#jc63?K{jEth7B`Pg{g_c9B67(H`C9*#q6@nLlHE^NS6%!q}s z85x!{4cdmj#^luJFX)LRj71VOgo=9Pp`D%*dgF4y0g~MmM(PO@Ve6OH(Ng_a;ZT^X$^%B0uHiappN`9tZs#bJ+qT4 zfU6|X4Jy-K3T#FW;Y-pn3gu&X*8!WFrU45=085mK^AM8j9?s!1)lh~rf>ItrU^E8f z;x3kA0^u0@UQjW#XNUl9f;h1LOUTS~0OSLLVnX#(N5-!+w6OF4T;vfe`z3$Yd=cf) z%pPF{w63=1{+Fher^r^Ko5wrI$0I4`AO3@Hbap7LsUIH~2!PlOXySjR)v=sWh{YB3 zcUQFHD+Dzg$GnvopJeoQSA?!rz`{d>z>>&_7v;dsP!khj4kapaCNyM9=_M z?&APXS|3o$A&)}05`mRUI=|#VL*YD#PpgAQpisurP|hkP;H&cg;SLlRGgL+c`GF^e zBVYjJ1(2<11gqmVw?bl~E~zQ$3}Q(NX#^614Tz$l^9gXK`1W-_ zKu=VW(^{r#8PO{l2egS~<{uBmt6vP|xLmr(!>BR?xVM&q67f-C0(p#PW!>ZRO@b_p zUZtVpUU@i+PXG;|`>G-XLaOuwHm|ira&zAR_DOCFjlQN^AwqT-1~MBe1Nrzk0PYU-@u{WUp_GfE=0$3hL+zv_h_fgv z?I9$$65!tVo&yvfg}?P`w+!de1*Hc6!Giz5fjJcRX%+^O+AbxEqa((}>D327^x^;| z)1hJ+!gL7=$@Q~kI6wUWdXjk*u9ARlsHlG(M(Z>Nlz|k72@EH$nYrS?>IUpbL%s7E z`VNP}u9q%Kow&1MI6}bpN}$mdz?BRs!HW~<3x_(4CjWnGHr@3-yF9cI7U&Z|nRJnu zmK78=4Hd>%m{G!LY()-3N6jZO^_q?8$Ye-CjYd$SR8J^TvJ?Er`{hvDx_w3KIX}Q^ z?v)~kj}Sej5g|B|y{V27cnu4yZEn;TUEM@vB7B~M%tA)`p-^!S90z(TIFzzt zF1#4~*Pq${z1qc9Mnn-Eupc_(pqZ6}MxsRDvPM94Fb9t5ZYaH@OCC=msz`zc2NQ zAnI;gtUpGUI^I8 zodjTv>ETp}KmqHw?vV5EjdcJJ7!unKV|h2!G(bDFG8RdZgpt)|1sKQx7$j~$86>B9 zhsHYOJsedFj^JUAEI2M4*taZ{-1<<%aA2E$hXVkXw?wNOPV2D#vkW`z0KGm{nR%Sc z2&E$rFvsi@U=UXXT4fC?4%)>uAq5;l!46xQ0G zOhqB%0Vi?!00j>pLM1tL#e=xM;BRT;f+T%d2=B+Sn9GQ8#s@&*fSTD-dY?nR0pe8H zP@NVNP#?g;2w6n*bU1|?=>QILj7xE}YKGUL z#GAXAw`poP4Q*-w;~1PIpz#3q;;0E6;?2dtLp$o|yls@X)VCX8A<+fu8JA+t zoaJ$&&Gjc{m6|}hgE~lo&L>dt0TleJ6mvm_6ia;SIk1}$+OpHypHvY$-Dm7cM@kS)5sY?Hu zytY&+IrY*ILRF>2BQ)Km<_u2s*Z}N?Vp-gmW1eVJLb;9b#T>km{n4odJTLu)iX)|9 zKOiEc^Nm4jIJM(H&R!_Qr{dB}Aa@DBvKl>?*7Lj%jf+5^y*yBWao%w--? zm6jtCi);EGh7pCoU53##L6|gK{8m&>4^3Tg5?B9FQXEXs{3ar*0SS~b0_>?mrBgUq zp4%V5qc~tTLm$g0}ee3rb792Xw7%c!kO7@9rZ1v75T>dG(VD&xeUssQ_d9z zxy)l^u0#@LHbB8u<F*7Pn4Se!XCL?mq1;{(pYg@CPB`%!dY-kJPp`H8z! zK}&sWD`-;e{lrl_dW(OY>No|<3&U_{tE}uF+XBUPp>?p zmT#!>*O#m#oZ1{ZhFt$cB+3s!3wwYVCg9|R1>4^riPvSw1#R39_3;TP#cG~KDLxmV zWqBE%XR%pIUusu`|C(z8xF!a}f*imH3_H-gY=VwUz`|U*Y zm-e9~xtKy>S&5jUVT-FA+F+sieb%1PCP{*b_xlQOT$O}L{>v(b4l2z1A@jbChp)o1 z_(q8Yr$+S&=NYT5MTuwp^JtDvQNsAfBZx`*PNUW+dh0v_zbuDlK}((QN16%Py;Vtc zb(A77Bcg@xtfsKC3qNH4BK~{RQbZ-<>f;iOlG(Ob-hiaNuIX8?6p`%uanYDg3MayPK7K%efjtaYD#Q04JS41qqemMc^Thk@13BMG$f7b{fSjoOB1UwS!eO^e{qCA5>(&mmlUbdTkNs~7DX;pWYQ9N zZZ`ssTnbxeduy-CK6p?z*l1=BcwZl||EJ)_t-IARG{0+EIB2u4nMq)F-X=$Giq%*# z!}nHF`l_g#ZyLUYV>?PH;%2ju1lFECafV|FIqa9e)gFD_8v3gLr!O*8E9a>5y$10N zEb`ntm5PyX6kj(q%Qvr{l5wdD&xS$BSm-5Mp`tmAep`(PbJ?2}(1eaRx=$1mUs_{$ z??V{|aC&XWqXl)wQSGvYKnDqEz+0OqLQD8qBO42sLZ_UFJJ zRT37#*P_4J-+qNa>&@DJ0D48-26aioLz(&SSie=lNYXE75ip3`fudaigJu=(3!6aX z_%y_-V_G;Cs6dp2P~PDC((G`Tl#?{GhQshWpiGPZJeD zrg8kq0a;-L<$0r%piopyG2pA`Lj(I<<0=yyzp2&&7^0)Ld{BXED8KPS=6R`8x zn_BaV@WEq;3PcC}L{Yy&U1k(HXj_qs#MP6eLK}#_cm!)r=7LKlAAdvzON(U2S{r6cZrsB(0qX~#OQ_~OC zrCUc_`d|8U`N^>*4UXPth1JU*@0(7_yS^#aq_n9L2`qK!Etp7iarv>H{TPkCrI9HJ&dWCreue(l#vX)ykrhw*UXI&6=1U70w|ASnmB;USYrloWqiv( zM-&=$nRGbb)~x?aH5pvT6=J)h6!Ta|{PbMZ?6DvPtf>7t5nSSj8K~S0T$FHS?F>$m zY~=|Y$)h?K%Bz;y2Tq|?cFqtGvV&ILknaqf%JvIRv0&g{EEytgN_mw6rG z88^u1l4fvGy{1d-nXC-O_k3Q8Hsy3cW-g3Mf3MPc4*JY^{=9E}Ms>ye&HKMT4fi$E zrSi^diWG2#r?oI8V8$+{`k(r|@n~-MDN-JLQ9V}ZFM9zj>O`Kld^9&!z4HE~NpNwq z&2oaT&E&oK)Ad*OVv`~{uXFsy#=QkmM4*sQx^m4ywbKI=!M6&l%>o^C2-lfoZZ0NS z#c@F&W!FRk(B|Lz_5(OI|oR!C078zBf&?mF4dEA)g{htHky2!306n4s8V4@TjrPXU!&@6|!Qi@2HP0?+-*3oUPT?#?rEV#gKTHoA6+4^};*!CmCN%JS$VO!S-wn_fOTkSOsmG zn8n3Q3z8b`G|6`%MJd1c*E>zdeyXfJ+m`g&9oCScd&eGSuYxBQJ_a!*-42ViiW;jS zY*Hf3HN}nY>(Yt-57w{PjuK(-*bQduvYjhDlAb*|+i{loT8nKwrhR$5;rKkTjOU2l zlAxyhis7B9wv|8hC}~CDIc7iDX|fbCmGVSsn{7hgmJm%-S$U6HO?*?#cz%e; zP<#K`ymE$PC3E|*6w5Rf@`0qI7Kfag5bm^NfYLJ&Gzsw?x3U#vdr!2RJ-5+r?>AG{EEyBgFE^&-1%31vn~+^5N=c ztt%2m`=AwPtpW&g2%ooE83GK#q(a~@qG$)eOtl@3<0T8dh~0fDW^Y{_M%=bX(Gc*2 zoKYdQ$SaD#a>>)s56{h}s$-W&l&PaaY}Y=2q5hwSSq3&yyGdQquQd9`fN?whnwg7I z-7J^7C=RT>QMeyHZ|26E@x6EBEG-Zb?tPtK$A?E65m}84V-6+OQCt2qLgy837mGxMtgzYcs@CS_Kd-v2slVQdGm2!0o+rR3gljIh zZx@qa)4$iFkDnXpX>ukrs@NtuPCn8qdE;f(;1;fYlA*cr(ll6Ew`lp{oy{@zxR~}j z_vrG{^ul%~fu^4w>wTvxm!wooZ}(pY=*n^q8JI>8u~Wp$WOkqy|4-y5vkcLk`d#$WsAOSX0}eXB`M z$S<+iON3t+UEZ~En?!!Q*q2wRI-4qY%=BOTne*w|Cit^IPwcZesxQC4zY63A#S_NK zg2|NT<5p`(czeC8|GM%MF-_^0Jpr7}N7pz%+#DRBmfEt?UN0JNIo@2HH_K)``+gC! z_YN?Xz$n8o`H`6F^IKpUozm8#Ae47$=*?whbQ%x&cf*m2$o?z+*T(`grY2L;xye&< z^nN)Ewzkr)4f$U?Jnnsk=RWt`={^B^?^POlR78>f&n9Wek+>SHmTww-INgK$B*Gon zWk=QiY{zh4nq@t>>V8aRn)wuRW%@|K|1!;JJ4CYoO4?kXZR+y8$=|c__)MMoV-Tx9 z?_{F#{DP&iUf8d<$qfM*)^zigi_N{P(}I72q&55BrGuH7iO)$y*w?Rj&ei@^ng6O# zH2u@j`Sq7l_fOZp&Nx|3)vPGS1&3`Ob%I8H6{U60LxXK~@3szIbqW_RV?6x1eMLb- zG7)vm)F_9EfpkZ+qw7>rlI?3`8a1()K33G>1Ytyz8kR$zk&nLKm)!?7=j2!W2pUI8 zYaNqZ?-^*-gASi$Hs=GLMN7JE>1 zjt(G4wHPWhEdc%%qiZ6Q!6hHWfs-~e)kmD*d6tJAWZnR*w*u~$ejuuj#Ao3IKp>?~ z=tO1dP}r30Ca9UqCJ*1yE01YfRB&|$h7NsM+lZo${~Q*L5M_Qu)!sG3Sq+MQnB;l@ zC)>=|@Y6*s>jj;xTX+aZjhwaI)>hkRoQHRcQI1*cJQh)Q{PO` zgD(!eBW{B*ZDm#4wMig5iq}CbS$FOymfSSv=aha-*?}i0CuKf5A*xC&4x>TmStCga<@ifDSo{F z{=H7sV>YDVJ5JL%y$=pfZyDI57_qATqm8L0G;;p76VACksCg~L^J)13tUjWS*`^_EqF`*O6>#dhbQc&J*C^39$9`q^L`N za!Qw9gq!osFV_23Ri#(KSBLeYtzd{vkMs#};eF2cMSHv|x@={7;vsM?y&^C%n4rNj zCXnB6Y3}6{p!WNPVj+dV(ZoLoTIDY`yMr+1j`PM3oWZ}e1~1~Vy4rzj%%le{%Tj&qpQ^b2HXc66nVWn2 zKbwm$FIV`hp;`O{h-mJ=@UYN4HSE5~B}Pt;VB5JM1fgtUau_%pf2t})`@r2-X)o({ z{DtgqAZK2bbV)9m>wzct57pVPf68Wco!+N<#>d@BWZT<0yE75Qs(4bJb|+|de92s8 zf3U3!shMn)ok)BfK5n=*8O&vBw$kmd`70&!&#)#_j()GC;4lE{uG`xXfuGf5bM;Xo z%*HOl?6=GmGwFWK!S`3e^z>T#y;|zNE(iO;{PYWNK60;rb@F^o^nF{#ardtbm12OQze7d4?EkmHYQ6=vMybOiY=Uud zhSUI#+Hwk^;;ix&X3pqM=$xe#QNo!^7Q!Q_q*osIJL@_pr)if9jAE;yu+2Pr5%G{g zz}{*A6_xgwK6S@21ZfSA$nzD>FJhg@-JLNrVIO|*$WF9jM`DZhu<4j{2e4-Z#kp=gPP%?E0I`XG8Lbl;HLY ziwE3qL3C-+@%9&UM}A29F6#kW#Zdk<9k%_?N3%^6bgrZ|n`RXc&bqB1?jh_?0NX1I z*-qNriF>JU9P7E@nbqsuxZ1mVB{>_rf01~0ZY*l@0QU&iXLw<#i0ySkB`?(r&0A4! z3Ox!5c;!;i>y8-I^OU!h>9Q8QH_Xu9Q`!zTU$-6k--BuOmZv#OKN~6UxoMn)|3Y+( znZNW~aje&LXC2(A21Tt;`eF*=`NHD7v*a5s_a9DTLzGdfIH3jI@&Q4whi5DFNFR!C zeD-$jOW2ussD00|XiAmb^S{JWwk`ISvq|?!wH35?L1MexwRSkoE@gxdR1#7QuIEN~ z?cc3`u+50a7aTXr8w$N}XV8SJ_L6fNKYREp)$Eg=OfcWESrd5OQ82@!lyt@P1TbBi z`KPnIYY?V@j5OnpH2OZF!C?18^rPD5v#CC2LUAhr%PS>ki^VqT+GmKoA{}$Je>q|e z>=Guy%;_6m^S`hsPVokiw5XrrWNZptE}uzMan{K!iu$jt-Dv`rAe)wdT_~M5JieJxmza+j z6}VQU&+>mRw1*1X%{jYSseO=GTh}eDdU-W+{X0Mxp5yBJ@=8v0PqjerN6G37TC9xC zWpks1Bbub0Hr%#n<*)z+m}TE;V+d1!`MhLxs?#6dz`NTuS<_kd+}TscvWNbc+67l# z^j*SJ^{ukeDDf|&>wn0;ZfL3yBl}PXC&tRIc4`_7@<&9&pNPzBJT6uP=Jd|r>>8JV zJ$x4LYtmG%DJJZVaQuaH(lr_{(4N@z7V{(R8!#}{lja{djX#UJLZ?3V)K|150B5=ppa zOV$c#tXO+>#R6{sB@PCscje`o&;>wCm>9jXaQgD~b9;&9)?;4_J$B7M0cMX2;P(o0 z_x!E@0uzVdg%p>~XstKybuHXNG%on*#+Tuzhn~clJv;K*i-dh*RPINRL-)VL<&PDJ z{)v8hcmX^6dfUHqxvW1@LQVKu@K@u=?Zb}fky_%J!T)JEEd5ubv8=PFRioFPq!2f-Z{f}ETx?1!w29i#pMf07Vp6vD{If$V~c3@c;GHIwE(&KP<|RP&O{`U9*9=aTi?@WlX5g^~dHZhXOr14nfqR`_Z4y;>?_G`ZB}3a7-8 zUET=7fxkHXQl-1%)z!<-h%e|I-vV*!i$N^p(h#Zwq|?%|$sS+isk@{3#%Z}-O5NSf zwlsC26s%F8uV_E-{cS??Gh43cVx1jtMF3Z_-eiVXCH;EKD+w=754XQIg7{5+l0}rC z_uk2H+zp8?T_vapZ8{6^GW2~&B#nB87*x&4j%~v*r={&0Z=e6D#UL%dF9L3*rq8xuM?0o!jIIM_~9f3f3sOlhDp|ql22YIFN((wv!gDIUdeBTqM){jV>o1ntt~~hkz$>4HOhQ1H?Bha zw&St0xCcBsr$GM&N0+siJ9eZ6&=TKZ+U0Z6AgH0K*Ebum(pe1lOZ&?9jZPTXU4^tK zx(!0(t-y>aYjv9b-Y3dXxA^>#sK(ac_x7Z$zI$s(l=ZBMFQup;h1Mj(KzMmVw4tnS<2KYwn6#xi13&jKtuc748EiwDv7ge$rAXDR?co1!x~{UMPZGY?YO zb9ITMhMhHfK}-XuM`U@*nYg_BBo{UH5-aMLvQDnln;zD$eD@+{YM;Bmu5%!HF#K5} z=jZh=XS*)p`tyWUF&{**yZne4yz5)FdSh7ExaAoooSG~fR4o3y_LT~RR9t9r$A{ML z3DAD6rt-3`>x=i!`-%Rc538T=b1Q#rm`Rx!?#}H92mU8YOQG0+fPl5b-~5U1|MV`U zp*QBE_@g4dW#5%1T&em|r<;(`^=SXSGvlM^N~grLD@bYW2Yt1Qt#gai;jN0+Lu)}& zT*;A1B~Fr^4JJx%ACJT-qtc%F+S}*UA)|V_r3vbCINqCJ&VYQ z@}&j52ltN_m}d7JZmL+1@K01Yht5_X2_IaTm;bJ%UDzmbJfnMskxlzer|+7PY{vA3=Lh8yHh zWM*){Eo1rm`p2l^WI0xUy~k*sLSo_7m{$_LvvLddCDpyZ<42DIhVMzWEM~#Q@pouDX-xf)ethyabe7kHx!uQS=d&y>PzMI z2}o7gYzxp-ap4ZyBD7-*+P<$)>yNzctbZs^mxuTUH+-Lta~{-FypOO+{tr&?|3EJQBso+;sq@^q3D{!O_qmvJ>6<6-NuK67zu48^^$pCCxGsNAC58 zGS(~$<)Hy1^(Z|iBiU(TWS_I{HljDv6hu^&Gozs=S{_=i|JKwsbtr9)QK)>dBIQp8 zfg@|1X%n5?d+RrEg^xHr)xo{W1U-hTUW_R%^;7x#@A*E&nZ9sBFwzCvfbr}EU%X&T z4Z{ZuK|D_5{^;h%Ik!Fccl*L=#g4k}Qt6tIBm3_YcsoUv=Y`(OTk!W4hO9c}R%S9^ z!}G`K$Lb=4wz%?tce`Eu6TZ0R42M zY>Y`iBc3>NdTlrMsjzx%b^UbOj*rg0PBtw12aN*e@h?MT;aMO4Ionl>>|El+XYECt zHWy-Ny46l6w1+^Vw^j{`zbqmRbErSX^OYbPwb>m4)?z#CWS$Ek#31xA%P?bi>HY!c z8vLzZ&utBD{^6;!>kS9XS3i5LBotoWLgbVQfA2RK9zvPM{Cr!y;)74* zsNHMsTn0RRxUrEH`y#9p4$Ccw2U~EMmCFB_nSC(njXEE=x%}2{RQdP>sJcB;B^RGn z(-a@1?=JW%)L8iY(rk&9e0FQ~u=;QL-gaPyWo7oo-O1(bt&nHmD97Ym-M{Z*HP*+k zHOv7^lRw>$T<*vJY3^J8)v9Ly$7Gyx?jG!V*xvkkYS;>PI#2da9V9Km?RHBO(4+G; z((GS8ocVMx_?{sCc#o4mdiiF?zU5%dg7-nYhM1D@(;v?H* zd_>>kNy+k!$X<&@{{wL%N!&U!C|Sz%4)V!$gNzKF_~xHfDVo+fvuU&?3*WHdoJ^pD z1eOSV)MfR{S51k%P2VZCdT3}}zH4-w)v7j-Y==A0t~6WjO)va>%g*2?Iz`6(^yaQp_#x#lpwJN7W?Uyfv>gx<&YlPlROF5Q&n zcNL?q+isbL&&N0gF{D}JDF_~G1PL>bGhxTOpH{8to&SD#zi2UV@1Mfm|BF_G?jdo` z+u7uGls(T}#Ll^dlNeccm>omiOi@=%o5Uzt~_7vby*w*ih1Ul1ZOz?5cEE=2Cm3 zNoAd1kTxuD*4gjIw?=M<`|B#}M}@Q$4v#Q$a3Rj_QUP6ik)Jc;@70_33cjGdYkSKZ zbN>hD>nXo4y1vqH>M{QI?p*({WU6Ss`t~Z2y;6FOJk4!T<|IgJs8y3!EZIUk=Tq_4 ze+;Y~DkGTs)Xq@0{Zr=N(+X1*!wxph z)hl%R(Jm;4CdfPUu_NOfTJy-t>tWPJ-`i3H^TiE0et+oWN5~gT<&25Jq_5!%|Kc1C zxP6VTH5VI0-W;y&x9U3+8m|W#M4umqTpT*BGTb1ZMUGf{MstesQ|VgKFS@bC0!iAt ze6$-JswJI;$9~N9==TgwsepR^^m}b=`d0dVZzf!D8dl8^VRo26#JUHVHQjToe_4Ny zx-QR1Vs_~-w0<>aW3dO*WGPt;mq6Z<2rZyX=3XAO=m9R5JZP*I56fJ5&gFaE3NE=6 zf^*NHhM3RTvv^X4XiH&5`Qbea&8u($?|fP(xaIp=RDuQ5NMeu+n99g}kH zxDip6D;M3j#Y#0EP}>n}1yjn{qa!HNiMO_2Gg|}TGCJr+Na;OPv~JWwE<@vaFl*G( z5cjr(1f?0RrM`SYW)sp=_vhetbSWyZCv0gmfm=6xaBY=b8;Lc>{^IX`G*MgUEm<&I1#aapWm*} zta~O_hYTkGc3k&Sk-dC4w17PU2t&*%cS@@hrHh8qu-l&g0s*gN-EE40+{el4@SCQ$ z{baQBubvOnAdXOlOoLD>tc}XL-R$$q47%Xb_-B%iBYVwMz`jkNRXo*m(U|c+p(ae$ z8WX9+d52x`>7#AwRkt}RQx*^YAxpuX#{1iaDE00LDr2*-s$I7Q0uMIl-Oqu~PCr#& zD455Wamz?tuCD1d*m7z{wcmEe_xiP8sAEd_p1H@V@C^5d5!0&lmDn&vw0T7xCiD+G z7c7De{eBt_%RE@DwkT*ORHo%fb(%|D*m%%HrNJ%K|9z@H=`j1Or&sQ5)?&jvk&=*kwt zFeIj#L1~ZuT=vze3;exE_Svo6FO^>wnsl;Qcmt~pPCjHfqg5}WeALE=p8&7{Pml+_rsT@ zkJSbEzjU|W{h2vz(N370eT@Fq5Tf}AHUCtgEJhw3rJSBn(O0!r0-L;`(;<3yTM|)VR zEpUwb5%Q_cw6JrQ3Q|Za=W3NC2rL-d@R(ctQ@%w4uUKqlkiU9c6CHPyVZ~@1!*sF-%}#MBNL|oWzgKp z=$N82ut(F$t!bg!H8nKXogwzD>i5Jm-2wFGO(v60@DqUlEG?<2q=~zPU+biNdbIal zOQ~1*S{w74{8>7LP4=T~`z=IXnvufPg&*%S6B4{T+&|AhTYgzIe%+tRp!>Qo&ea|> zz^jfad2uU-dr8}SU}|L3U4qp;Ak_aQn&^DC+ERlgA+`P7JYzZb=)5RIgH;;umPSwX zxGjner|hT6ibcuc>P$tXPyFTZ-*Z_NZV;jJ^yk}q?I4iWK+7w;d*Qw|qF{|JCkyMA z^o!tMk9j4A3w@h+xrif@y=!%M%fxi5j~lKc;|-C6s^pF94dfl^2hU;)Xa2CeLjJDJ zPis#ah)lf+w1==H5Tg1RQQlS^g1Jm~r~3JMBZl~HX2jmD(y`@BRLK(JN$85e+L3$YVD8`#atkd=yKKYm+XT^TxNx$Z`t*WuedVS*_ZYe$w$CsltS}m&nd@50wdLy z)+zH|&MLCjXW+eUY(0qeQ?sjQdk6Y-teWT)bipT3P6Z3KVQ35HokMH>kr2 zh51(^)>!rWYsZzJg%+wu>y2zpmYuV7Cn$;1UY&S5VBCrMcp?n=W0?t`0bzw>6u;lO=m#7F-xn&l^!q zisG8~%nG9@qVo;ZJoio9mlnb8BxoLgu%Y<28LV9jnBc7S+qj z_NtwZlg|a7e0+kKn9x7br%Tr`pQf8Gw;t0ydp3m16!5F;H0L%Dnlk zYK?uE82_Nu^4!lBJR5v67gA^{G5E%#Py1?}e6i19`5ec);-;}VK)Gr`CHt_sYx8_4 z%USG1Mq2Dn2E$*NyJVvWar1RW zK3{QRF^-4|rVoS1&%RfazC0oeTn~^bvR?U~Qxot&^IBGhd@7hOa5SaTPp!UQ{OhpP z`n(e)3NPAO?xW&1ht;#kkpNA6ts;`dKfy2K3LUsP?kCsI{|cbXa7pbd-#`HDv47lK zIezt*_tV7uSy~{A6#NpH-|_jY?~3xU;}zGmP6Z9WS5TUHldU`jG0mNN)L^Z64>DEa z3vww|nHAUkM4tX(W9Xw)L*~rE*6^;c)b`E3g$aMhLl8lqB_RW3l8+PrlfdtOUqWdn zaEiFn+6il)*F}jYk%4!U!|=hatVbD_Lkj)O+V;tv&`V)&@F%I=MJjDln|ygOz5weI z(V8GGoy1yKe>wGM6n%rb6_leD{E?Hf=%`Ej$5(4t_v56N0NsZrZcq%j?D3@m!Cgu68$k?{kHB3z% zbJ~V~E!ue-nY~`gaqPZ3|MlR3n>_gquU6egw5J4P@QaNIhxf7==@lxq$KY(G!>-!E zabeT{8Q!R|`M;o$T&5sGzZfm9Bg9W3Ttk9E73zltR{_K0`;N~>NzOMpF(zxKmuqvk zHiBBpi8Q03tX4499m_Tod~vhp%T{yCHl4|xB4yQu&5MAQb_$W&!8lCC2+Vx-zJPb? zZH{5*dYATrnpH`*bz+_V)d7na0yghJ3X$&b$TX+6UmEZC9LtgLH8<2dwkN`!8g8oF z=5`%z?w}t}^92+$W%=YFkcI6T{_*M-$P9JrZIIZ%O!XLQ5>;$G@t&oZq*Vfcfx#WA zyND-1z-{&@cvJA>80A1hHL8!s|7a)rreo$H>QCBrlj@P3C(YNW>YiuBJu76~q3uOO zohdIz&WDH?R@qtp+s0%MA(J`Tw$M#gbxIUQ*EP&<)dq5Iv)izK_^bdn_%?*Mcyw#H z)N56)Yu}yA*U6M^aZ7gE9x(3oTRVNAE2Lp*ZA>wWR_@r9T<4#PAn*W^7+u)5btf{MaFWco+bhfCPHEIOI zh?LA!Tq6gffTLf&m_@gwv2#nQ?a`TGYMT+4Uqw)yj&6ESugH)r2nC*qEwTfhjB zVXv5xXtLfuL8vL++H|jZdb7IHH)~2=cY2>&*X?b?jDP(35)V(!4K>ZP3rqE=*1@4m_hY zg8m%O#_!r{g(^lzt&`G?v(fxTC0@B5?e;&o^YWjnd&IfLC(k_mqH0ThefMDY7{BlQ z-!rYf=Xmb6zCxs27u&JaChNHG9&bJuark!JJtPungO}ItgSuQN=w+BbPWiu%`w6KO z%eaO35Q@^gkUPN^4A3mrscA;Z>d<#Q&7buc8Vr` zvAl|Pv)DA15ko_<{`%U_v`&kfqTBg70fJs>x_9rZ&#dnnfsAj@iBE4r7OKAg<<99_ zwg?z}@HyD_RZbxHx)Vy6usW-m6t-cs3u_ArzAW0_`fgCb@cr|Gy!_Gw)1jr(r*nRC z8&gS%0pnz$9kg;CGM-J3Yw0jy|F-W-gO%1`m~yBNClkC; zJw7q*7l>iy7kFJM`maynANOSDjsMq7VZBL0{YZhqd`QSvV!%9qPsjAmSO~?(&ttFE zm$gsaO`0|uevWjUW+(EXJili5F7#(qc^{C?T>BYLCurNE(*Sz$lcNNwld6$=%5*o1 zcGBXlg)%uq57;CPw$X#G$AKTUu|?{I|Nb8Uwm?b0eFSLHVNo$6oSzACVsm(>3|uYM zw6$01Xm+J~nLBUderB&{(4w2M@ogxV!J$o@JRV*rKsj`?5iT zx9r5`4i&V?d(*k{TpV>rk4HwUHqI-uaprP-3sgZhzNHMdL$_tFC8L`nwzVo&sw@P| z*FM!yA=>PfGhuCg-^q%LCa z?RmLZ8(&TD)X|plx;KPz+op^|{a#iPWZokD%aT_YGJxJ%D@KiM)cirLFt=1gwQnf= zMeh>Cvt1VVw2b&8IAWZPTOpH7VzG6I;%>uk(GT4fmX@qM^5lDqoSh_PjLLQ~fMsP=cExM%{>h&+fc!Ebm9u*J>t)xX@H4bm6oU>{XC0iV%f#t12+b3CAh3}z z`!K{u*-^#u@I`oU%<|%)!%0$4Jw7hMht163+6#!zM76O9a#5qiez@etaeurrMHM=i zRwFj>H2Vf7YW$`oc{;x+oFa+$po;WDE~KR! z<*(cBd3YE0t-V#f3^@q>29wS}cA!s5yOBQ=fMQU`>Wwg7%G_iADMh_BUsKUuo#P6r zY0uC0k}z=Tk%fq2_;EXY=nVWTx4B_O{{Z~H@h%CsLCdE7PekeP)rD@ke6#%e9ymNk zco>ElOg}JhH3E&j4k=v_d{m3l5r4K7sehI#Uk}H^$7w^lt;fn=RrhP?YvnaocYs%PPTpHeANY53B}m%S-S?U3gjG7WkPmCOL=Q5+OpwCdO@7w z#4BUVnOkvl33g(5zVM~9w6r>`^5$TiRu~U4D$g-2W%G~>ZE-IzDSRdFlIWnce?9Gb z8(HRHL~(^K@g@HNtwHQ)wL5D}=(Cmnae80l_;- z;gjk*`m}4x4)J-OI@HwGXsJ&|S|yC(fgUy&C=)GzO$r=R7l*C9Lw4=D%k9za8qv#* zp9ZZ8YyD4<>HNlsVFeab1HxsdqcvRSVi^z*gmtx->F|Ht&)TajkIrIJx3d%FGmKFq zJGh9u@L;x!^iXLd^A%w>{nG`-neu&$vF33+$a2kXGmD87>RLug7VxbD&6_H4RLzB2 zps+g#w}nzPCnsjuhA(1W{nRiH)kJhz3u~qAJU%Vug6eysc|0kQz66gCX|5EMSj$QwRX+u=baaCfP7po%G) zxictet~+&5*x9pL^DJ^Lp6A}$vT5de3s++-n~S*t!{%#O!^C!-IxmK4 zpJtb5%6X=JTSYW)OT8V#k@;pREkB0Fx)?!;(nWCc?vSs`V{w>z>F_N6N9r(mSw~Z; zgITG_(-9ehVkr^30PBA${G{b2q54WxtZwCC1(t1p>_c>X#J+6h%=SVi;t<+w1T7XX z2wR~Ecx3Xq>anzh-5hbbnmovs=IBEFzj=Ayofh}d=#24ylEta8$DVCs6Wk9s}2RSj}ml*|ejK#w9WHmmatH zh2iXvHLH@36T8t1ay^&qVkg5Rqr`zz4&~S%Un-|Z+q1D=|5q}L4hm(0G^oDgi$q|dvQy( zZQk*Dmz_5z>d#H(ztI}IvOP{W>^v?Mys7kalP}T0I%f=9elM~m?-2Nuj3Y1ePktNa zM}|rR zG&h^1j3#YXhYiH9e+{t2y`mM0Y4N&}emnT;a-4XoEV9>oz4VI(Zw zle+%^_(K=kwPKpHbLq9~smikBs}=G2TkmgEGZ~EVG)Se`n(6q^WW|e!lunW;`%r=? z`%6@PmgLrpcq^{su-p9iixm!EB0Va#j=S?=wacKZPLUcYhzF z`<&byv0O`$>!kBF(U}Nt|Z11;y}xMrMREsJEcB&UNLdaEZ`;cvCWk@7oXm0H~!n>X%QVzu1^+ccUo3AE@+( zaB!_A!)Mv44g~x$eE$H47v>1P*u-AS%^Tgvs(zXJ*oqFO5yIL1^&=FH*j|yyOvTC= zOnjO%QmtfPnbz=$6gY+c&2@%%i`}8#p0F$ihQ(%`WCDypbcgyZd-grJHzb{GUW*C7r*E6 z(CVY!(@ks0@WvdldH0_fWf~i`k-`?W@cPHJL%crF^DdBo>d!*GT6S8k{{TNT2N8+# z8G)Xcf0ROs18~DErXg<)rP>>=68t1e!`Zwg{4=CtrjzHrwf8Y6CK^^GJW5T*G#H{i zAa0Cs{3JgP>gwKnGCHi+j`!kX$2OO5m&q4P1}N(d+NM2{?2!B@qT`b;rVM8xAD2iw zeCDi35j9#RyTW72L-6>Ad%AoNhFWh;=juf7=3$$(c6rGho%LeDia!Z{5?YG3Owof8 zf;$}4r_9A~-$6be68t6n%cILDruP2;gPDL%6DIK`{$^k;=^+-ie=zvI>h(WO@A6h_ zqO(jyGK2kEZrh3*>oNXeU1OJuIWt=l8+5MF+n}3$p~!w-()7XQ)f`!?nSwDKf`bAn zYZNlwKQD=TVELSxp`Mc=b8AQsvV4Cs_riPLhmuh_%tBVKLITWBbp`e>r%HU;PRRJRn^`1$HyXqvVll{y6bW{&?7R_&Pj!C2l2KZpldhcKx@n?= zHC^i0Zm(ope9xaKsA`OJYSG!2&JstJ8TWZsv*uw5_H9F%CE{9M2GRy=U$W{P+2?B6 zq&jt>mzgi!?;*;-)M~0|Ow{0jO->4!CYNTYDztj2X^`!brbgMmXbF6atpIJ$c~Cdr z>++xmY|sYAc0)*}ehVclf&n{l))WIG$qkOV6%Y-cyvrbM@S(O-GrPX>5f-_Di)(J& z%9|;|lR!4Qt^~g`WhHm>lS5$%uUS1If=8FU@`%iH!F><)gc~R zm*%QC$K5|iK_rdblp%)&?Y01KJC@g9E^?E7Pp3_riD0O>jb-J;b)2H=Ewya%(%YqB5o8 z*k31;wV#?hYY6#!MdDoCdC1Z-LNmZ~mzE)T%wIVawS;co^Ah7FY~*U}%Y=WkZG!}Q zNwQ*y?Guvk;zazbo$s5|dJ~D6P>682d5_9xqw4^~-Y@SWcz@El+lx1*@>}sbT*-qK zu(&TZ8H#FdV7_c0_~&oJBk+yB70)@oiF$9<{7H1OJ!PV{9WN6Roqv=}5oY6&MLtj; z)~Jt#R=C}kpH2Nmt)cISGr<`6o+A;iZ=H@|x+A~OHt z73ZrRD94xAf1YMi;a7X#(8-sMIJPiz1FtIuzD+G|>xl1|`HSHgYc-bwP+uMRec71D z*mCA%MvePJNn$X)V92w}1AlqF75*4-{{X>Or?E{(^K8$>COT|( zQcQn$BLt2oXQYd|CFO?FFK=DLXbGQD$J1Z$31+k@{Ads@Uk(DMp4c;A}d{{WM=j{DyE7(+PtM00^0 zgk)pA*BE^jGwd)=gk=B>|rUoM4~PUyy&GST^{hCy_pm1ZT!d5d=N@qO=gc8s|F zm%aKA6l2W{Ogbyf%dp3R6h+P)GSrSX>X7)mB)UdF>o4HC=3-3)JB0j+i?<$-bxe7J zApWgg{oJ1S>Qf3WCjS7fO1VqTLMu)gZ$t2xXn$MDZXBMQ_1=aIS%`y(KmP!yoQJKb zR+D&#v_G#mRe0yBVp^CHiKa|pOfbWa#c)I&QG0tO%3c-dj!N-4GhH@pEzr&|xVz;Q zhTnU#yTNmb&6pFS@K}a8lvrFz_nXbyU10A0olb2U>7izX!0qy=FS`5A-q$kqMd#6+ zS*4$nXpqREmrNgPFLWwd=5T1&U~>{!Mlcg|P>wVagh62Pk#lQ!ZeLG|PBuPmS}kgJ zc$~Z$$#_!``Z)6O0`Mq|`or4RTZ(`7K4huH`2L(}HjiOlAi}|6;&UBuDQGvCh*#+_ zbmu(y?eRWVCB`~L_;!)$1Z++z56EQXLv_Ml0JdIb`q~tff7<8fu{=}J9HdbrcPD*f z=Cyq!&x<&o7QI_LZq>PTM+3#%FUqjlF0Jql-Gurd7wx?^HUVX3D%gDjTybTQwOhTQ+}* zL!v!li;LxU>dnohWy-{8W-d^nn=xk5A9-<_zKrxxg}EKZjboS?#Q~eqIeDgTFe65< z-d`gT3bt-FE#`gd97`?}?V1-Yp%|%vhKo!~yXQ#wd`N;m(1|a~Vr7Vp{{YK>{l91E z=u*!^=y=u}qu53PY#b&OtkmOwRw;Q-g~B8<8?GySTfQav>D8R`lfT6K)Zt@IAqXK8 zH}7Kjw_EbBol)IyZ2B?K-oRlK7majCyaBi`ohNmchpHyd3p0xx%jCtW50>xDyw2+= z@AP_8GlKcCE8C)$VY{L&QTCS|G}P#fxN(Ya=HT2g9kVgjD8H0fDSJBVTb{u(=FJLF zh7dMo7)$>Em-&_&;m%s`U%|a}GX&Z}f?8MurhS^au!r+_R||2cDerwv8BmHI883aM z7G^0GfJK}_?H7l{xY^Zy)|=gpCu1sA!a@{T*|@zVN8T{rBIN=6D@k{{Z+yg0X#pvy z(I;l!94ZMrlNZduggVyU`nhwO?;iwrzd*+dIb(C7FyRs$7-B;$4aU;9wnN%0N6V_E zMxeMB_v&eQnKLnm6rLGaR=kX%>zp^WqDCF>W*yd#ith@{e;JlQRs*^!LR z)F5F1S2^1nZO4Fe2eew=Q6AEi6|Nn# z_D1b)(L-Em#?8&>wwC!3=F&1`V~zoWMw}QyNDzK%8;+^PA`yl@)It$boLx!hyK4R# zlCxJ!sqLZ?K?WQkiyUoca*Hr!^qfL3c$XT_y_Q9IXtc~sVk}%jBr*u|(Vk{gsjFkld3yVAgg7jI@Q--SvP+Hv^(%u-&| z{Qm$3b}$1og3H4^+8~@4>Mde##Ic%DXzNW{w7wrh7Y)Q863~nuGri`}0gwIIm*OSp ztrZ!#u1%vf)vHU!+xiislOHJ2Xp*G$JUVhbyYZkAbb;`Ytk+sK%`e}oWYZNV)bi2D z_Kq=z6Xp>HdKZ+$VVL_dA&GyCtl*~zwaYKxs!Pbs;^T?pdOiMrN0u8KK3k#mp3uWvj3X#D&2RYgI@V57jMnz;@VSGD&Nc^%!Ngv_CxpccXh)0} z{pY$uF+an%nOYLP>Gk^Z{Csc7>ryUBHOTbR8EEp8K`{WKwB)foKyux$HQo{uA@Y*N zFJ@WkzvLvR9|m}0%?BC7f@T23Xc5Fn3AIWaiEiri2?=|usJc?#^EC%`V-MvYwq&9_ zaUYgK)R_xyxVcPxBqQ%!JgcmdR%=JUPv0|f=wV6Bxf5Zr&E6|r@@SmK9gi^b_mTx~bKYN$x^zNUH1cGzi8Ttn6zr5ntB#=#=?^ft{uS02Ud)WNV#O#phzWxf z35a^n40qwbXnRBAT^e-Vqo(&`E!@S45N93bra(qHY+)T(zFx_AS56)U#RHQ@zBEII zHcSyjfxCO-E@(`n%ReACm^~Mes&@KT)j&zbT~atB>XXo?$H|9opIXzM5n&U@b zp!0HbSU2pj>56(-N+d^$H5*8abh$)zM%`b$y>o5meECO!^v7BpxV%WD=ML=3*Kd2> z_?MwdqJGOfHBs^%HqzZ3!&)>bvLlJcy4p0Yt?v-8zl5Puu5MQNpE9~u049;iZg_qwGd zwjqlStn7lqYVPq=(DEigJ_{hUHccx#JO7T#uQSUN_hTJNEJG1jD3Z)*aChU4F z5KZ6itsRd_SBoqH_PcOUsK|mO#>Cn6E=}ZjNa*k^OBs}L`6Moq?Tqq+7x1s2S`;6> z^**K^71tx|dK09&a^(e^MxjTBWF=F8(${-S^7z^~K6O6l>2S`f)gNuqIm}vi8+^M8 zi6%}q-18$5hgVneFUaB*B>kCO`?Qg`^qCecJR=T*@?-L8iGqsLw`)U-3`^$6%p^tr zmE)(QY43JEtWGvgB?W>DZtZ@`;Wf>kq-~%Oz&l)eNVjWTUwL@so6PjY*ui#!!!a^M zN4m{#!Xmge#gaQFWJ8E^BUqY{M_GfEZRRD#t7ML-$Qb_sEo&j_$`;q=Kjm0);PWDP zGe%&g?w6O&Hm&8#AI!M8^O4;duv{?67dVtihDBr{-iUrL#7m5#>O0>p?IK*tk_Hot zH#B3i=&?(5M0hvl{7amlAF&>xS zdTHn5G=vi(m4tuR4U6}O+47Ix@}y(kM~Uk9>-6&s%bT2uhD$@2mp+biXlOA9dKhy= z^Ky^1*<2}7??1^c7XJXB*|Rc1;9!_^Ntm$hmw+QkW2#2wsxZgQTC0x?tIvc>BrFDA zVsbOYid`(+bGjk7F@90q5$xJ4Rp)tGXt(_M+|86x?DK7mV(}xwE2X9WVp`p5i0v`+ z72eNAu~*oFkI#M|Tag)9>~T5FKMjWZuz#*ZX6q}46MMZO7n&MVTr^vHyuSYci+n_V zsW;He#-^T2MWVtSqGBe}4Bi48qW=KH5+7-D!#Bp~{{US703NnERF52#cfY~1z$Rf~ z^0O1MX$};$H;V4ut+l@Jt}u&}$lY&t-A#Ugz%qv>@rIFNJ@LH6Rf+eBZxWM}wx4B^ z^c7Q$8?8?%8P}ZBj7n^rgs+DVq&&8aPrVqH=XFL4&HAmz+ zCVgmeqK(&gGV)sLKN83Od3i6ntkD?H6GkRw-h>kI%p0=8F``5Jwy#xXXYfzvulEi% zsTbDgo{LP|j^gqp?QGlum=P}6>clT}Vf)K7TvXHPb@yL$6&6vR`W{6$`!7mx*|T?O zF=D)wXMV(8U;bdhFJ*P32IdJj#BK8oKG7@h!pl|k-tsj4m&MC}PsxXfyi6{1XJC&=W2kU$ zx1|nY{6pdqQkuWA^n2fd*4Gv-0uGg&P-^4%PS!HdIp=;fmxwV&OW;rDwh zyN`M8EqVTbKR&j%vEv`4!lq2X2;iUZV2;x79}xUYq!Mb+d-O4L7Ip~65Sx{aOG&6Xu9Z+Sx~Lfgelu3f20oHb{Pq;AeP7?GZcQ3#;Q z#Vd7$oXXp~TC3=(sjp?8DwL0%X%2?X&$&PBJRF~x&i4EwzRn)629taEpFXV`Z;|p% zCDF)o#X@Wv0W(}p3Sf$#%)d*9uHKh>^FKd|q?U&ZH3VV1gBTxpFRK>W@Mf%H7~Eg2 zW!T`4GH-R(kUZV8EoG!+PTBTVIfL(Zb(II3W$d6Ev+Z}P0tuFmK>q-$A)z}J6)+Wk z*V>>9b$itBEb`6caQDsHS zYEv<`stW@ zwgESeXk6S`S%{4n5B|RvTuRW72u9+#cWx0Ihs$p=@KT!M;e5|*vpz#D7@}m?3^Ci* z>!hM~iL`|>&|9O14CdT9MR_F~=Fdz_s8I$JbkQB$pN}yYWJPmpizIbYGT>b`6iCLF z?f||+{L6&0R$KiY6pYrID9-Su%7EIZ7)yJ?D~pc?Y|=A^G&u+W%?+L*4X~hF@fU@0 z;B_6@)iWYY8XLur8X(YWL~8k)3|?#Gm@vwL{QetQVAnV*8hcoH*_t5+B#!|iJRCB?-jV{=zYGgYDPGqX4Ew0Wqx z^^Z(e{5Gz*i2neV%cA-#`j$?~va!kDpG)DE^K^43cWdV$s}=qUKNbG~=;sw=lH`qs zonRU0zLR7adu((=KEN`D)GPh1pV#!8m$bB#foDR z!q&V(ItPTILod7}y|q>8#jc-s`V~A(DY?SKG=~bD1{S1phD_Z=H(Tux!&^||qSwdd z{{Rh}noU^P>4bnsgEK2q=;DcMk7Tz=aiRV^*CN63M>E`UN5?dFLl8S!F~jKM+VV!+DrP=#Ks};T8jJ@U7qP!HkW%&F2jJ3l% z?|+j9c4{UKia^An!-!2T*rBINP5u$K&F;ptZT9Vvg9d&O z#)kD9u3{bVFTz5-5l)`>kT_ zWx}~0a~~Fh%+B?oSIcdyycxoxIP6wZUD%P%CgfUK-G*WuR@qi{^rJp4QSs_Q$0)M^ znvY%O-5yqtC*rggjF)S8Yb_ka=S#^h{yy(pWFVSerq zjlS_+_gCfdSeh?NeyscS;NrdG>$*D$;K3F+&lrcC?bi2K=IdsCdU+p9!C=bHz=v?}&mGUIqUD5R;nm!k%dOH(Aw5E3kX@i)94TdDV$u*>K3~nE5 zl#6!gWWK%B(vs)Bt#c$%H_k8B!3+ zELSsrmLyI0ZXOZvu2Yu|OGB~(oP1E)94zGp?z->Zmut(}_m;R-7}@K+zmQLi*v6fF zHeIZv$BC2>G1=NO@Q>arSDF;~o#mq1`2Cg5C&GH+Qkk2pO;%2ys zX~xAThA>y;u!MpG7dL4Aue)m0*L5BrpX1^6xvndlN%^wFaPSC5Lpe4!0doL<5dQ!O z_=@gT=c5HH%33Y2--bry%$x#Fv0+027*@3z-q9FrJjLZ+dbe*f#hB11e{EuMCs~YT z&4wJa7SVt^zR_zJnj-C0DoeZR_21BuHabHz;Uy=A0a7f>{H8Z_FfBp$qHBMH;#}xc zP>ZPizdo6KQ6-$bjiv`49vKQO>}RAYSZ^Gi_h>u667eX?b4eW^yJl%LWMV}5*t)Y( zUE@V)h0Jev@~=)Ubkk3k?nr88X-wG6=^U(}IGD*nC#|}-ZjZ&&El{NC(QWhoU)al8 z+}q5}4jZGfBNd|8T|(@O5f|PS;HL>yosG%Z!_XFJ1BVPv*gzy+$ldr?dh)$#KNA|o zqXIO^MAA@ti;zGvCNB|>rA3M;En?S0RCUQ?2_Y!U*%WoVJlq8 z!Dc#a0%h6iPSB0Wy|2uYg{l>+yPA9kcx3d#F>b>qmWixeesUnh_-$UMmvEnp`+m$+ z&gl`Rj&hJDNt@@ToMJOKF++Q;_k}R7_KWA2&m(eojnTctBaF@$D;Q3!!0?=h!>jjg zUp~z-1!U2y(MhTnF@+P_%;Pl#2)Aw$xPBOfz11SzBQJ-`^wEU)WME>mkubTa6Yz$y zq@s**8+V&@$J!DltUvh^Po7_oTMCBT8-)qoqCzG)Xrd+r+SdtdFFbvTSnGSETYyfy zSt$5iN2F;1>0mLIXD&s%{uvd%Qii>Fiap|0SI5uyubuiFqU`Kz<|h9DWKRs(j7YG> zh$F)rZa77}K4H}%@d&NcYNFs~W{j+23?pag&KyWlKu!_EEm9I4Qu2_J#9<`!$%fN4 z@-uHWE>clm`H5k=8~*@n19#pX-z~l++NCG&$Dh}Jx9}uQbZGH#>4KSt7wX#*ANHZy z^LAHg+J4L5>!}<_#0C`PxEPZ~gAghN{73U5y*U{%C8x?{zDqDg@|GIIi2ne`9~X#6 z-d>48MR70V`SdWPU`#|g2!$39>X7{OJGDrEGU-jJt1#K+Ind3^F^LRFWw5tuUxbBr zNyVI{nSj%;5V|Pk^RKxQ?f(GgU3ht;l6_1mhbRO`0CI9FgYK8*U8863Z}M|)#Blq4 zHgWivg$3@0A|ykr$~~{xI;?a@%Bez>wLW)@`ZR+raY4pqU4)9ABvHA2%2?W;?E~Z0 z!BJXB<8d7tizQoTrJ~TeB8vLd@f=#CFKXRrCdQsV}RD)2YzpYX+JLaj(MEnqewY(^5!rK1;nNUv-HmY+&xoW6x#Wz;e zG|^(zdv+4bH57USus(gPmRjgvV)+{^IA)_pV1Utx$Ce8dlJm~o&vhu&e(B%n=7#BP z*=od@ksacA(MWRguY-xj;OXfb{14D!=wcpnXV>&!Mlm@ChI4vFJu$nf2<;Co#J?|z z#L}yhg^#;JlV0?Xso=yCq7BlSGZxtKE-RPk>#Ltq2hj9-ap81iJ0IN@@@mG%(}tEe zdTF5&-jXzUAj2?~#id>$;qy^98~doA-Iu~z-JvN$vZpIcMs<{I?vKr}C8qG)MrKle z6j@p52hmJGm}_D~A?+`#HO8)s87pLELz!sf(T-5Lyno8Pt~@?_^*X1-Z6QoUl!sSh zyL17$iFsTc+0{M+B2bDnPLeC$XUC{}BjH@?bVpQVOwK%4DM(KCJKGu~bANYt-uHV- zMm!6PpD)kj=g^XOGoZ!^Ibw?tsSGt;hk4(WMR^<@NgkBc5T!)srVeH;tr8~MZh-QL z_*JVUmkKis-OSuZWyY9vH@YE>^Ca8@ls&Jz=2(PyBgXz8pNG`mxf%Fi2)o3JLkuA? zL^y@IB09uh3i3%gONAX&ZK;h0Y9=c`5^f;$Wfg=55pn?TkK!*8675y+MMZMo@!?`Y zRw8V ziJpd$fiFJT-X}AN+elLnNG;fa+OYl|Z)tj~t^}de>(BA97wvJ(_z8+$s-%RHoQWfMgyFjH8(^vp+d zCyCIr_L?5|{6dJm)z=Lu!{hV)Sj=@c`eQL>jzg2J7~tAZ+9(^+Vp;hzcxeomzJz;Gj_ap)X_qXc9P6nt4VlP)5Q`Z_f&g$M)4BGL3Q5?-Ic-H9*vF|ZJ zirU?)p_k@eQvU!8^Ivlk_l@?GM|kru6m52nBNxN0B1_3lwJgq=D61ISDK=9YB=YC2 z5?SpcuV>~+z2Ozx7_U<4c>MD*25Vk>_C}FN&O^1CkDwvtw5_)9F$j;eyHksuHy@A7 z^xOCusBH1@Xc0-_>jvI*lD0(M1#Rz|k47FlI_kJr^rj4pD31pwAP4u~)4VEx4 zVv|LeiPFnPVTlSb{{Rq6SV?&!7fN=KtK7lCCvS#$WJmeHbB!xrBfSzAv#dkmBJ8hK zdVS*Kk1c-B^W)}oj#`@O_KON2Mub*Jg!hC?bws}@ZmrYFS?FeJ<;R$ZKPJ;KM1W6J zq1|ypK4B#|9XS@}q73s$MJRC!vN20ooV8$|Z_C>Eyx!*?_BQ9dzaK9yZJt=12XZDh zu*9m=)gdlYxn`TOi5@U#{#|&)wWh>%?H%#{&{t{G=Cs~N8=BaW%1SewHoPDAp>?-; zd`rB2wPr?mOqfhU7rOXGv%k!`ML0hbn>A-TV8RjJ=dPquE4`9lwFRm;wr+GQ(e^Lt z8ySf$gs{uPmtlFi_^nuQ0Jm71n2TD`-ql?lNYahvruX7;a!J_zD2 zE^iHlovqfk*nHd9ekJs2=y+t#UVPjM-&WykEgjxv>ZhsYlQ}F_S`_Y4pfqND?TFl~ z+rv1!#PUl$P76ph0|}dBW@wOI%E7S9S$zr^j6^g?f~6R<=eYNxh|t;MO3tx1@QIbB zZz}x_9?(xG6XVvxQ%fdrn4XGaG6eU76E>~DS1+|s6-r!>hf@y~qcl)R)Q;rY8wiYges4_Pq9EQ2wRn1ZR9P-)S*X~Ps)IF$*Q2xD{F1{ zQ0QCjrykPDjv|@rp}ry2+j~_FITkOQbNjoo0^0(rii~w2Vp0c9_YTe5&sYNnNCUoHT1cd7oX;JsQVh1SiBahGYP< z7;sB6_Pyo#OlBsF{{W5$-la>dkEmc^(4mAUixwlkug^pxcNOp|E1y;pvEN{`q%lOA zms~|XLCRc{T9aQ0rC`5fgIo!0leADr=AE_Xz+Nvty&mML69SnN4^ z7^m&o#oVj>+*Ev8Vb5=wThPpEoh& zZ_K$ypZhbf5tD~AP+6QnL8$J1-M>Ei7-hL=VYP7UGppRdV^~>!oN*obupFhU= z{0Ya#&9Kf69U@Z>H=F7~hE2YIly`}Eqffk*o}1b`%3a#XFu^9d$cUpvGBYyfB3Y{L zbb*(QPP18t!(wK8V$3^xB@9047x-yL7LOa}r{D0tJp}4m*v-MfZg)7N2nDY*Em092 z;$BIvCuEJ@$i(^1c-kzy_4*rwJTXi~ z@l7L$aNe+GfM7!Se+a|)m#c%irEa# zCuDb%vNSq6=F)Ho+`3b4mM{B4D~sYK?8V!SrKj7Mp@h1RvX5R^z=;SBjH5=w>;{D*S9P^pmk~T-pI&5YwVasFsj!L5M$k)!LMJp*7+6Uu&3_ruuqeqhWG!9J6Rd4*pUv!)p2J9@*9C zYVqAMqE^aPKL#@%;XN2RqtEel7wL4ScWqMkqev)qsmkJ zA}wGaDSRZob>qhsQ{epn0Dn}@ab^Z3co@co6QYd?#Nk9PQxerHR;f#=i8~pyGhvEK z1oR*nYWrlBjEXn2ERlMZoWJIY022<*fAzRCMPcJB)J z#vSBs&zAgtzY~WLv1kttDG5>CvS$+5xWgx5b6+Vq#}DL0;_f0{0Y5O0C$r1pUfIL_ z{(qm3KNFq#7*l;9n8k-siwv$~9@4b^4sv7^{5hyDPpWPE!0h>aB)Tem4>w#k##Qj}qSPsmaLt52D{gGdh1U7ZJreSv?$=GK6L!NVBm=dK51R zmhpQ#*IKJpQH}Y%JUn;jrLW1#?#JJ7tQtc>^nL~ng$TfumJ%nc=MpWt(IOXUyIqkT z(Gj=fRI4iT&5=bW4=!TOY70aa4R_9;CL#+ zPey##9?-0INQ{CsS%_lXq)YG6#L$*bC&#acsD!I~%7ULY53J&z(fNxIHfH){=40Wz2RHMqA$^nbJ zHCr_ZqEj_XFNH&DBOQtqbZQ~8*s`Zuj99TQzo})Tcd=|tR@Icvi&)vo;&G)+9uR<^ zX~N~@ofykjdg<4c7DoO@O)>L0VFGqBQO4F4;;DzCm$Z+ohs0tk>U}Rn-%N1=7?Cjt zl7u#$@qllqm415@{iGd|x%wS zmJ`)t`QvUS+5LWH!BgSS<-Pq4%2zg03^gVv5CLkrKIq!KbBk>5rD6{f{iQh3wVD9x zK@uO~-L$+!x;Sty9qkdjn~8a$!z4;*;q;LP(S!uwygpI=a<3Yu>dM@=zcaI!0x;wr zDZ9joL~&w0=M=Yyi+OIXmVtX_!yUvP6qGzN852aA`Plt!3$yJP!nshTYu0?U^Zk8I zPFHp|I3Byh2D;~eWq9!m{f|stk%2vmjwy}Cj4n?v1NyWU^6wYDtL(2*r`=Og=JWh| zXYn{WU7Z98k;8D=nUj8w(Y1;GFNWpwlpR^w9o(`scq~&WZ5ANEOBKo~4~Vs`{dQNg z5WS~uH@}IPvuCCgcHyvOM6GkACwA2@oGowoYmN>UtH;wl{6yqsU`7#VAyjA=>s+{3 zUd@fc*&57BcjZ{r4kY6iH?^uih?k~}IB2)zzQ2Q$mS;sPG|=#QhizNpLm#|fg?Ko9 zqq3Eepu^@1_JrwHpEx7`01S10CGM*qVm@DXb5grHEMj86C(rm$$Fs`5eL8ta+}W+r zNw1j0nVhY73?3id+P#?CcbvSl_P0YC6ir@H7{mBhu*=)GgZe+YiRy1) zOf*~+$9toSUe&|=tHk4K$6Zm+wAo8z;B4eA5D0D(<`NPgy%Brdc&IhK=y}t$jqW)Z z4lhU+vqWJrA28g$eJD7t6SUpYtkId<4s#DHti9;oZ=4^!5Pg;H#Z$UdT|Sw8llYwJ zvl|xq=w}Sd#ywXd)uDEjpzQJ$9n9G*P4R3X9wXLb7DhLDuK2E4txtk^XcVq!r{Jusg_Vg3Kr;iYI~NWMjXs5& zxrHY?(nDzok3#{h0)Ec*p3g7xuVkUc?XQpL3=?naFTU0lFRGAo6{q`otzn2R)Q@F zo*U3%j5;tsm)c$!(>;kTPFoV4crHfw7`C$s?(1FpwR)pT70SmUi()Me>?gj#w(D-R zyI&IZ!Uvto#~X=G6S*_C;Odcfzh87$x)D6HmCkx@ZI0m)Ar>BtM7O!QSGF;+=9JEE zer2Of-!px+HUXo^JZS zWwRjfN~mOmKdn=dI<@^#3Nn25Du9&&eDk6b!L_>C3^`=Q}EJa4^QRY;vXGz9|1nwwzI`hslc_w-kqP03aD@|hIEDb9wD+H~!{)(== zRdAj5tojsjtt^qz;eL>`mlBx>GR(&n#?TNAZxZ>HFj#s^ibvI>Uad!w^$i>hempRI zPZ6X)?4d&*kcZ5_If#t}y@Y+J@gu#Eo@i`N(Husc<*dFml(`=IcRH*$7kE&H_h2pJ zd$mWhE5PA%=tiO0;ds@qF2vQ2!~nVt76;EuvC5 z;bHSFqw~?82x5;6x)_Ew+ARD8t}95jNQ8t)t%$vFr>|AZpF8}%cDu5+T9s(=I47R> z@mJMf!weUT60Y@k*u0g!lzJfUDZET^36^m`n1!hgy8A`?{7Z47;SBZO{{VwrTx{IP z%|n)l5;Q|#gA6Y!uLP;NyCcyT!fGK;M4p_BITU_!Gu+}_t;#FgC@4p}S{$P*vwty) zHW7qGiW$a=-5fq&*YgtaQ-^&%26|^JBL@ljv4sp=otr0e=5^M;wR4PRc5O7L5NCk` zL|=Y_ZEtH>z7hDBn+Zv#=J&s`+H%Urwg~MSI1Sl3eT$AES~ogHnAp}O^2~A@T=rcO zJucbGKM5DQy;PyYMagTX{wW-%BXfkzbW-yNR=J_utJ*D9^Qy+}Bh!0C(S+m0#p6A4 z7*N8#@qShGWgAdOnLN&r=6Wn0nTeQAEq)*7Unxi0Jr5*ku*ruhskg1A((3;JxrV*< zqwGh^?#^`cZ0K=ms=T`nuAu$Z^Ql4RcBsu>iOuvMB5Krx-K}pi3iaZnoSDv>JoJ^y zG?eTxYmMQ=5g!$+SarizE%iof&ogI*PyDW4X{&G?HZfj$@Zp+gSW4*8;}bm;NocP0 z=%bC^)~S3XOWi^@ZZDes{ZYoFvqt!)nm!c)-)uXf7wg(y2}gphj_KVT@lKScD*`w@ zj}S;bq1GRVr1zK7QRAl8`aiM3O3d415!m7kXmnOiYbFKTSXy6Lx(4v;UCnl_ zzdCs4-J-Hv&#A&OsZsH_Zw_C-OMLI!OF@vpBp^s(^3Y^3`B;4v30NAi;Ely|dquok z#k^M*vhhx&>pRJvsnJo*YtP4inky`gW+96;S&Njjqg{8s`qoIrEl*NbIc!T6XijC) z0E@k%#5}vdhk1ITO|issn4UECa;S-2s>N|~uXJe~rJ2cMc$0|`(we)Yz1d#4!1B&V zGl}9(QB0m7xVYtR=>ES7^+qR^%I1nR`4JJYi@1RWr>p#{+@g7;>~qsL%tL5xLbyb4 z7ul`Kx+Hnrjw2nxry}%?hvJhki0-l-_jzq!T8&sn%A!27P_{?TahzL9FsOvlCZf`$ zF8=_oRrjdF3t423jb3$P{ga)W(~MeVUKDuE5D0aI!&!YeVCcsl3Q8K}FXh3+hT-KE5DfysFvSTtQrO`Ep1gak4DS+R%~eYg`4$da^}&a zYatp^1qw7Xjo`Y~=8}`h_R^@Lby#<#PuY-|WU$F-4%yO|JL>kA%&UM^UF6TF99vo) z1_!5FL5)nqmzIGItsPbvc?hqYh{0j$t|rf?OA%70N7L{V#BPRomLU=(P11%C?H1MM z?Jv()RQ~|gA7%+#Gq1z32L=`*wA{6Xzh3hBQiP9PIb?J=PA}2BSmHXQBsJCXdn?B( zX!Jr^olX~xy8~3MBVx74uD4d}SB=v?jAnKiZjckZz4amN^6Ol@l_^~G#%SvB{B4+Q zXQS%#Tt4r*ypp7LPUlA>jcdX&)pjm&*7ui=RGKp-bz^FCkmhA0OU*$Em@#1#7_!l! zv{-RQ-DqS5szYxnDH%$Pl#|UICrT|@pE+;n;i6@wZ9fJiS^pE`+@eB$iY(qmHJ~M?5 zv*9jXB;>IF0CoMik7xIry0JHx)1ix4h}u~{NBH_@$r+7DP5XH+yuV*h8{~0v{)sf# zOSDQZCxu{frZCuj9Cn6Uk?{c`B6605TG51ccXzI~9mRFM=(<$r?a3)TlIiF4^UdUL zrX~?>Jr=K$^En(j%%i+F2N08jDqIZ3A@Z-d8XE|l%Cb1Rq6uN%7~(4}NyOivu%Cl)!q zSTbVq7O{LbuS$ifrPqIx5u0q^;qxyoDIO)+(#H0+SInF^q><@QBTX$e(@)2U?_9@O9+g?lSU zCFH*+I&$G`-r}<)O%FG1QCZz-n?wiq`)Cj7!^!h5k$EjufQsXJYY( zG4WUb-1G|v&R^Ak1rY!lQYB; z5%XHD1k{s!j8<*4I|ao4StM>xlt^P5ieXHX~*X?5{CUC`#awX`V^scZoB%N zoTmd}`$8Q484fTL8x5?++1xy<%&9m{rfN5zGdDrK9cd4x3~8lwepn!WNqb!<#1wb${#Rn*+U^hu`p-Z~gL zXx!wEBET^wVotY5D+nuXAygW*#z}qjc{2 zbLEx3E6DqXj(j;Lnw@4*-HM*icd1G(v z#bx#1URi*~{Ws z<;+zg5-WsvwY68SG*3LGW1O4C9yDi!4H2@T^lhv@()C7><&=(YcMx`$a$;z1W<_}0 z*|?WT#j}LuXs0m&aLud+9b2FAFJw{Y;zovl6@@tNE<-XTRB#usFT}l^H6fZj?shpX zA<_Pk*`#B}myG(YVHJeE^s3w6M~uXJfR=+7-myhf@s zjqh%!g?d%bp3f6{v066|-dzk3ZAZ^y(gfEk@Kng3mYX|}%NE2i(2H+dp`Az;w>DZd zGRTYFLI$>I1xs`4RH7s)q)i0X$_u()`U!(<{H3 zb7s!@!n>04c)Tg}vqCuY;pWUPro}c~#K*Hjg~y2x4=ShZa4xutv~t z3iuV=CGMl_)0RhBD~b!8HlVqaU6$?EubA-ePUoT$%-zW24-2DWEkn0=fiD!|dSf%D zkj3qY4&=aFqn@cRJC9S-8J!*(q*qWnQixt6xUD7SluukHbvS;L2pF-%AZIJK+xVA` zP)B|vq>$1cj4d)9U4w5gX?bhWv$@juH`3VCIk?<9qjkl>dAL=F3AvTUSjp&A^A*dF zw*#Ajvw?|p*H$AtzXw-`i#Eny8-s^k*4;rT6y@zf3eLAMuk)$4rG&f81Vn+p?z~Df`$?Jd-r7kNJO9e&X7l%-c{=U_KcqsPs`!)=gQiDvFMg2YB@(g zPo2Kn^5$k~$Mj2SXhS!k_=(1fFo0s=c(hTvVAyRqp)sl=Q3!76;s}kzR*;Rb$Gma$ zt2;Hq{5195y0gzq6H=Rf=4-99^0(stJx`lpzKAsQNn^#rBy@6aRy@30CSzia@>zLu zw0EKw{;3ID2c#=VNJVvwsKxP4O5ZD`qZrc@ zEd}(C01_zQws6Q~;v>A}9u~2}w_8}QhyCX$^i^or{{W5rH)Q=EMD2IO4~~ewZRj6cI$_jMRt-^7ZhFp z085|U>Cv`%Fu2%Pc|W(K&3sHr*|%qtmj@$@8HOAvP{fGLpL9f9c)TLKROxXyWxpPt zZ1>ck0zEM-0~*kbOmM9r!lv+CP9#5+gskK?12{*l#4XLeX?9BCD@aIJuDvFe`DM4$ zO%E0u6AJ#+B%0p+Ll(pW7=c7F2B5P%M`o#V=Ig;qn{U}ix^+@nhAV+%Iu$uBC6D2g zxE$2b6x6&7LRsJ(SVmnV5V3emSa*cAO41edE7E;0Yk2av*GH#IqsfQF(yQ%4NusCY z9L6IK1R;$cVrC;lg#r{ei54jrD8n6MFADKcrrw+Q=z42ZQCBl@tq9VOM$jZ<=_Us~ zfy&K4O)oJs59XcBh=dL!Tp<^=1g(fX!o9Vq%2}-Zyb|T%yB-WKI+aN^7pCv!(dhXT zhTs^!nB!-LU>IcHF^D@0l)RX^bYexkXS)P^Q3yqOsYb~+lI!X5@v?U2dU05&Q;!sx z*Xb{y4LI~=3IxP_HXb>LbVCw6-U#I|GQ?WO5dz+jY}Wb9dOK~_9nsxh?y};G+VuP1 zuCK*~?HIZ6%PyDa<-7P5=>GuFE|q#p2vhKa9sz+y8=>O(gfjWy)uBtl)hNwrTqW~x z%lk!#IAP!Ueq8)~pUP$ocl1e{z(yp-hT{JKw53KHGhsNz zu%;>_Z2~yk4kg8{Y(a)2+9k?ZnpJhl`exVfK9*MId1!WpNaayq#eO|9z4gfH{T_cs z>;pz#4k4v6LrL*5)@ddhVbG7N!W*NPiY241`@Ut)Sk(-vua7_0)!I2!#MiIjy?R@nqq1;88A|fH&VEoD?`Y-PH2K75W7OSymZx^v$tL8 z;9`_(!aOwPWv5$w`gpdErbMK$oHhi88!rMvMqFtER#qEAfeSuS9ag*I@h?25Ip*2u z?r!{F&ui1b@{5U(xVKAi*Crvi^h<xhSS6Fn-LMy6{T z5~wkYS9pKayQ>|NNYLUMM9d~vS~lIQ6LeQ)0^H{@4IufqJId$XuJ7Jm)iQC|=4WxT za&luAX3o3Ub8jzAIyOfKGet9wUl5}dR|i|&bgUeff&4D!lGhZ4m_nj?|f4j_~CmAmfyOSL+8XP$C2 z(Q#R6w>t_6+*a5}aW8Lm(BZ^#x=Dn>pNerMqdc_6vzJEp-K(lA+eyxg{{SMn#lAI> z^IT$kAHfa7<#FOd4rkW2eflxO;udK5*p4_nnW}$Cc$15S-LaXrv_`plmuJ$w;C$7N zn)l5vA&N^+X7cR_yvyiOrz&12mZg68LsJ#uyT3+dMe000W;rz+xm&Gl=PZvhZ*^2; zPnl-4iYu9l>#kJ6H&k5=F+CcHX`xp=s+h2y_NpuyYj%)WT*zb}CUgY1a?l+*&=7|) zx2lMBLB08qfcpsmH;U&&D0%lGv^LLMYKDippeX<#8#O8_8y#xo_NWKLbp%lE&b32q zsyse=H&D4Y`SaBStVvxfg0lZ7cHz$%ljW-x( zc2YWfA%io)lazjqn%bFfI{5YbJ=b?^`Z33FcNQrWm0u-0D z&s7{u>O9W(11a)oa}(1?5+lFvTU1BPEA#dHyR?z^Bc^9n0}yCTIS{brdkI_RFTL!q zoRj8{L}qU!@z`+%-G3 z-C*VsE538Z?ApANpw7xh_ESi}+&*x7H(heabkV!q+)Cr1V$nHxls#cw`@0!&HjpuP zcVZ^132zYc`(7n9Il5+Sz9cRdiCiOS?+GqS=NCxK3`kjvH+t_qrTV!U$C)XtcjgFPcLB{c#Bi~3oaU~`N>MRlze?lyMJ+BKH2rv=5eV_)Xq-+dVI28hTj^M!*rhtiHBnn5_rxYPkBkt!Dz6Y zyG{f&V(|{JtkSJ0JEvnRlTV3c`tRuSXFs6+jPys*#CMv&aA|p2_A{m`0L}#k-jWYUK~&>Od^GmVZ8_p z3wTMNcznyt#A#uZ_qlH`(XYYfu>BdrgAKwYC2(vk2%@x{jJUvp##_Z`>fF0dtm-?- z-0R#c-r4<+a>ZGRosFKG9C$A?d7ae@tq&NusYEw3GPt(Z+lh5@Z&PuhWn{E54-s~2 zn^}Z&tLrzyv2(hjVa3HQtz1jWI>d){K){cUI6H|IAGNGMg)ENBmw~OD(hzYdf==Q# zmBd4<;ok8s&KEYKk*b)+{&ItHKkn@tZTsJ^X%!otmPU$qNg0Xy7jw2I=$7uN>k)pp zm!VQJq;s?Q{Uy&>m_&6%8G4~e#HMK`@uN38O1C#(FPhtzp;JdGOwdl^<8i&m63%0C zA@ORi>Y6;#k)@i&-P~ykruy3UjjOdfHfJX!Y9}!_a1ytr0@iZgCoc;2s%pmvBUv?w zkqKDQ4BJ?of6}@oW1FeQbGW8B*mKfhs5X<4jpNIkakzNF?Wg0vuQb8o=<~ z?Ymc*dZUM(?s4xa%Ttrmj0k4gqe~Y>6z(lw?AuI?>hTa(= zpm(m^kPY&8WH5tkHb`_sXR3yV-Dn2P_4Of?J&%%yL_GGWQQbqY-atCHs8lw=_7-;` zh`W}}bEs^4XwIRc#oSr)Kza!fzVkDARt3uvapS7%EhcF>8PafCDT^FI0WM-(Cirwm zwjL*6gyZ;L0>#n88OX)Dd$eC7r3%%(?2+|WCN#7&;`&URh}D*a5b8A5-d=C~Y(L!W zvCdi@7L3ngSh2i$$*7Rv^9X#{nEr)){8c(|R*F82Dy`~wva{n2tQ%WUXzbqbuYlm$ z^e>ULmd2sEyfHRtk7$Uq-K@B}XQfEp!Nu6fjiS=-8oaB|Dra>jZKZKy7j_K5xkdi~ zTFc7ebF!$-+_pMw#dKCG4RwiUx;v?xXsxmB>+-KZcDfyvLvtsj#d}g_ znOj?kM3)&t$8|GvBczRR5Ro}^Yg%5_%g*VhcH=h^no8o?#1d|zD@*Y&G^rX>Hj=tX zCfbH156n+;=BXVnZDsV0fSruYN$umhj*v6pX$zM#nQqbHjmv_GhLN2MA7`Z=j$66^ z05UwXFw!!iX#_VRsb_V%qp@Pd?$a_MW00V|3N3}*t9R<}iCqjjNcD%LFzNf(p>q){ z2-z9#BNN;9$O$#Z?AGes>_3Hb(V28p-|X}pWsTX{-n8Dgd-dg3=Puz#d-|3*p&8Uj ziHnEmRx~ektzu6W4A`Qzcda7US}LZNgdR2ntJ4pcwecmcYx{mJ4+qA@s?Dn1qWj9F zb8d}{Xu3oUIhb4GB3)9sxYJyWLdV7)PId8a^LbX34RE7bA4sT93!|@9-5iYT$&Te)zvsl3%^R)zbNr;Gl3iT))c#Sk{ zRBv-)d$*s%_*beBM+wcEsjOICjmPI5_inVcdrP{YaCI4`oW+EIh0f+8?F!d&a&l&> zE-rH~S1WBBwMy%Mn$_vb9nJTEO{ z>X#2M-CpW=H&JAGrC)flW?=Q9ewJNJ4;k->;GqVYuFnmTEjMOk9 zaJKcR;aw+qvlGWgvdq!UoChKx)E>_EYuObpXM$WN0Xwn3GW1yS=M&A!yeh4UoQciF zQ#?X(yYj6T(|9lHr4g4f~x&$0ak;Us#}ii$^?xxEikjQKTI zENzI|0GWfXmy5{g%6OB2!@Ie2UmvdqlG zN|UdayE)0;O!Z42Y?0*)OL1IgD?{nbM!T@}R^Aq!BzL8VokQqaJq&Q!dJbo`-P+>) zT)#P5QmFJk%`~Eo;b|NRcueu8LJP3#XRUWGuJYskw4WoQsBCcjY-c`j1jZSato@v#e&>yO6}lKv+neLzlI0vbjn&M}8w?FN=uwe;4yfySR|!Vvej{rsjg?s4 zz7An(vLA4IwCDMu;@?ez{3u(??jj zN*hIpEL_np$#Rthv^y!A2pU9O4ahCF=w+%xyt0IoJF1A;%IO#ov$@_p2!_%hXjWxK zlZ_cr^pYS0zeq)B?&_D`SyWlRG-r;KZQDWq%!OuHV}0S114`jSdoOrz*2F89abh_m zJ_eJFailn*6T&**5}ngG#CpNfW`^w5hYX*!s5r+D0Jyq~UI` zxVVXXzskD8k#1r}(vkvZc=m|zTNuAz65Od0<^=AL()Q^sV&?|9hsCV7+?jJm3F#HW zB-1YwsFh=PoJZZ={d;S# zbYaaHa~Qje2;6Q^_T1!Fi1>A`U7Rj)0^PYF3m?SuaUAeBn66hw?hV6W-<4B3`**B^?hs#ja+TRbf zr5-vDGgT@=vdH;vDAQOh!;2h9HP|fnuhLQBtdGv(IH^2}m(z*qVR17ku-|B(GP1!! zS{`^~B^^vGPZfuXRN_Nsi2ne@ZROsTH%lWmDypWIE3*zoUuk<%JQ8<2Zg3~yOJ))! z-S)q{sV+@^lrnkNuUxWQG8Z?pfKRt1Ig4R?I?8}2W_z`jEQHy=dISz#`5`VYH*7(1 zdn%a@bpW_=uTr3$+?-GqU0Nyu^V)#(6-)q<0jN>!LIucd2WkQBw|PR1o3;K(KyS4T zSbV*&QiQNO+Q?`et;th2Dfo3Pol0k6@9`)B0ZmHyP|!2Gy-bmCl(Pn5mwNA^i`aYKq+k7;&uDnHh_&m?t<&oisS zF?mc781L!hvucR1l~#o7K8M()iiH$h)}BtrW*AW#U6``5MS+5MXxI16nHT{^#wQ{4 z@l1i9j#asE#3<2@N3w-iHhoT7VjQFpqqI0;<8ZUD%+3x>`l_-s4OA`bWDTvo@ zJL>)7U4OE2S7v32Na--_QapKhPafusd5(7bE9Xv{O!h*h&9t^FV~LB4u@><<hhV9|}tAnF+uNp>dELq_V-5`th zjIJMQ)g3Du<1^vn?)KIz6Sc*waF4pVw2`Gy$Q)FS+NM`F>u-EE{nA))I&qm{k2B^^ zVD`6!R#XwbGcq1NV8d9np%Fa2r37+y4S8eE3^uT_Z*K^Q`@74tiZbS7MaS9V zWPLPIE#fOgJ<%jkIXRfoahR5{nK%Is^jMqUn&sLsL~}4>V(|v!7Kj1b0M;)K=`Nfo z;^xdqxQi8nS&25RH;6(bt?gaeT2L`5m{VA*L5BBO1wzfYOZE6yRRbzVD-%v7rK3cY znTgQF-MyQ8%0J4!gmCSvql2uEX2rrNJHU+P4V!Eu)zu$qVpQBtZlY(-^x7=Mlf#*S zZV?A3Ce>eG2^iGLo+{ID%+TTfljfzK$*-JdEZnXqUfK3)m%4ZsF{W-Nbec;@B^(+d z!;1V2SCTksVV%!I#743{Z;#2ml*~dBx*NWs2j*X*!%b9;necH}i^##2$7W;-kmH*- zRac@|XjSBR;fS3rS?e{VFFqDVVTr4;%XiA8aNX92Sz=XPO*BFpyMyOl(O$%w)bdJE zmWP2wcBQK^WpqV?5Du&ZNLSe%u z*s)_gObRW-o_*?AaWmc&OYJ9oyh{>R$n?fmXHkdg92^o61S&;{?P*-TWlS@y?tMyF zr37N)8d*Duy&^_;ey1&4msnwAOyew5nX%DY z83CR&XR83@FRV-RF~iQY(E2WMf;r4f(oAT_(8}8kYfHJiE9q10bEi>n{W-N$7QzZUYw!(^kZ%x;Pg@ zmxrw9ZL}rccy~!%h}GgcSa_^En&^ZFy+VoN{cjTSx5)IVBsjR-C~#fQG$U?drPq5a zN|n)NS2HqK8hC}i;P1HoC8Q#`DpqE@$73!QB<-vglU5*R_n@#s2_yC20O-r%57rtsW(eyhb6i8|!Y6k$XGK z9p4iUqZ#986{-diN7>9*NzqLi<7~%^iaa(Gc;l)!2^3;kR8q((rW4v ziB+&f#vRz6=6Gz{&O$}^MPs|+GUm-rEr@hd(TL)RMrJ2#n644>m*QP1Q{rbgQKOK< zy(k1Y(IC!1a*hZyi%b$Oz5j7e5=wV zLK)tc8#_O2OIO}sp}yPnh(;zJ!=9@8lflM$pDq~ZP1xxRO`&6Q zM-FBBA~)X~SAk%iDO~r*6sHD`4t!i@ZWx5{-Su2o+NYdtW8hSFoy-QAC`2RKiGZs0QC^fGggBIPF4~p`kU--N;TB71)N9Sl?Clp_a;O7Pi;(C~6~T zcFoY+3!3NNLoL{*c466)$)Kz4WHepf?67N%6fWbl>OsVhQHyTEaan5Slel!ZJ--U8 z*&}TpuuF}^-eFjhx!RjZ-pOeJ;gD$nsTJDNHS_0(RUT)#V!OQz8H`pe$-A6ae=%;Z z(W4k>j&rXrW=0xhal+RoYW9V5se9kSmWPU1zB8rte~8^Vo0~CjT30WdkELXN94y<^?=cN3 zg@wx8QJCGEaCn#IUlNuVyl1+tUKDT`rk%#dCq<4Sya7Gfi|)q-!5i~DKiu&%>6$r? z1oj&Z`byBra7xG3jYQFxiD@jp6)f)>Xdyo{SNT?{;oVnbq^cyYb9fh| z2b{*8;*$h3dN!@A(^mz-8=gpFuPYt!;w(^@p~Wbm;v;C1`7WAj$oD7A)#)ah1`#Yo zM`_cWX?#nq3>2pFIMl1ccxaZG!o{W8qP?+2@*#a|eU-ZSUgXs}>PJQUP@#ie8HJc` z7cw1H;!tuu4r<3Aq#lrtOB96`BhZ`PLKZ5;UeK792zAp*h`~>azQD z!Fv}+&yFI@?`3g#bF!>(;xmml5wDBgI%l<2N6$SWV=V~4VHmSB^6g)514oZj=hv@e zRe^d$k08+C6S+ek4$IeD0HvA2mNSbZvx}sVF~8GbuGuS74GFCeEHQ08O#D+x+ZvXnb7L*r zoARzS@XnO7Jr!|EqOr?FH@Jn1F1wf3StI0Bl5Zo$;=5gv+K&;HH%}wbrrst*{-ub* z%#xoLW-$}HTUF5`GH8nC?E6)*%~(Yd?eeOTE=_3lWlY?g>iY-YTCssSRC|)ZUw6W& z4Uhi-Bm%4V{YV7v+XVnu-9rL))wgv}BC0C^JJC=+2xL#|LJIHIP|##fsRY!g{Sd{( zMV5JZQFsfAui8}5H`st~^kf0`Q32;n@~WpHWkdygC};;_Fo2$j0k*%b05eeqhS|D+ zGo=vdIy)B3(17giUAZ6`J2_ReKn(R|0A}s1$Oi426iig+LrK`InfST^*I#b3fOM$l z_MoueJ|4;%NN(@Ttg&US+Uq+^m|gkU|(7^QpEoN?y}LX3cjADENE`+ zU6fFz0o1F!`>55&8#3TcyccH|r-gBpE_aOVOli}NnG?O;=^AMgQ@9LQC!^Xl;7!an8cJwMq7`esS}bC4>QOr3>)KhLOvE(6 zTL*J!j3irbiLAdp3^U?BwMyy4`5q^X9OU6dBXZB1S$?XG4j9<@HE{{Ed7`>s6Az5c zQEh6CTI*MX7lTvK^w7m9ohF!RP)y;~hf!y1b9LatVVag_w-H@f`HWmZo-4$o*0o=x zRPwR;`PR(eXy%tk!y>f}*lU})+n0rSaX3X$T=!w|Hq?4qjSeR4VEMl&mERJWS{=!p zO=TmJD9+8)!^M4d8=oQ7XwH+yC+3cGS5?^43R=S|}3Rk>~@Kvsp>Pz!@) zMWEPP{YYll2iEf;p>5%+fSuRwRK>ZC-P?|;g7y=&eQKFOTGqbGhQu`LS|B_1ASSuz zpVEMC^gtEWLj&9DKzX{RLH%`91HXD29eR`lP@*l0qA+)(pblH8o&&^c0BpF?P&~it zp|IvaCVDag_C3k~P}psBGCH-pGgQ!1ScL$^`q@J&Kqd8~G^93XpxmdC164CRXj4;d zePW@6`jqa^v*JUl8$CGcp%VsrxU92U79`DeA5{$n^~j%Fw1BG7v)1t}5lwR)`R%n+ zqp4z;*_&sqP{r<8y^YL5x$1NuOw^|Hrwb+2gwbf(HS#2Gz zUT)?$(Di?C+As<+JJpVZ%Dp@(Bge$##|CM@nd$DV$~;F^QN^1$nDl3Y@NPSNF1*ph z#`ir^#JgD5oWq`VUWFbL#O}fz(}A-yyFZy6E{hp7%(KM~EHWG2+r4pAl6O5atmKRn zi1n+xuR=$XS&-44imcT3mYPJ2oKIqzavC{YEy}UO(A%F8;73=jMvcwcT@-9_;!KW_ z%Cu`)`zr8@iOK0s|_=O&-qZw)Rx}WLuhq+WtyZH58{<_4klmzLJHzLRqo9 zj{5%qGFV(q680xoXRo@}EthbOiaWmxYYximgY_Tf{2Z%625P;D|SIJF|B`g>1<$tI9|O4*i`}Gjc0;Dgo7- zyUMMZE+>A~v`Z4YBV%8*R$^r{K}04r4kxvSzp z4)sv2+*?^w1ELn>x(kCn9r*Z_GAh$_Pzl<*s(`t=(7>N%84bM#_dB76PJ2)mg}F6x zLm^9_CPPSi$U#2WLXfF|;D9#qR11QDe_a&-&yoSNQ;td+1|$Kznhi#wL_2%cA|I^{ zEdzpvM_lW*0DD>RRJR*HT7u!RyDA$SaOy$_R%i-Pq8EM{s={M!ao$kXu06Y6oyr-w z-Su{}vV!9WrxjU6Qro(gHkkLa+Mv1}#r~uhKs{r1$S#L|uTvnp3!R;=Qp1R*HcJbG z(VI6=(+jS)mZglabGe3$mNgN%{V8T?jJ9_dGJ@k{c61j3da?_Y*=C@)@4K44-IXkK zxC!OGYFJ!%Gf^yNOAN@ZqW13gl{0iZx0waeF7;$J zVY9W|!iFqOXx>yYanpH)U)?GyoaeWW@7{{YDV z`H;c~dLgtsn{BmFTx{(783n?%ZJDS+U*5`r*6!pj!?f2Rxc8Y&2qt>BQUaN%+2)5! z13p_mBpg8RcU4p%-JZ2T53#fQls4UpXRR{Jv%IOy8R@a8N*Y-X>x)?pjh`-Ib(0BJ>IpF37m_>siYadCBlHFd$yqj)MPbq zy_xQ2xdq8`x%<#v0X}`NWl?auI?!q1OA(CAH7s&uUtE@~TM5pa62;*YzVBsIHYYyv zL14R!waS|rey&i%cP6^DS|BsrS#9n>8xRSer~;&fxV@D{!JYUai)JRJb0jn>vx)(+ zRmlvr1yxEOywD2fKo0akDzhPh+V^exP^7j_hDV#a8WZII0GUz`-B6;~BB=t8cVCqN zzsU(<{R$ABihw{3w=9(c?m#@d)B(!MfXPEa-0F}Wv#Ny~S8E^#_mB;p_ijKH%ff&% zP@$3#ZM6Vaq=i9N+J?qWRSaAlv$y<`!r@(1G#6Ff3ItW}LlTHCClhQjRs079v&h1t9C z^C7XjvzDOmKBne)li5@Ne8@?e7cgh3WJzErcBZPPIIcEvXMP@3FC)*S^)j|ODHTNy%0hS8=w{-p zJM}6q3{R7)U@NTIYN50o5Q6XGfKRf#RRh@dPzt+vDrA>?Pz~!$^Fd&%w^|u&IA@ow z0$|7Dq8cUg;;90i?5GEPsGtIV2vB!+Lzq6@WGJ%941>`P2RAaL3fGDNPztQu9Z)*E zZn-i6s8StM0{WE!!9W~e)~FhQHut&!u5~~R^lsz<%C9p)M($HFkoTE18iU-=#Q=LK z0lnk{7wSMsZ)~+v6kN zBo__d@=ZY5-KvBga{S60Ld~jyjf$*-<6|1P4&<=n7`?xhKud1XkPhm9GN5kt^C$;% zZPri-TDd9*b>H<+*w~%8pcZYK03BEMPymU z7l{xGwKKI++#UXe7Y2G|R&*`UJLj4i5Ye+h50fAo878kqK&zK}5N~UjX+uFquX+mw zd@76BPVIKYGh`af$X*mG<@i+~Gqa!yYk$cARo<+CDo%h~Igks27#?5tKubS$6$L)- zNCo29fGd}U08v7M5H@gPRIQ77lR|1$6eu7e3<97{Px~qd$2zD4%7O4u2F|Bc2Op(C z51JYdKS}}XS9Jhn-N*oTAQNUt22Vr-P@&7UQU!DTs4foq`p^TvitnWXTpN``ptC{) zy?CLUv9r|$*fZ6X7aqr>Ah@0FWHwVi(n1u<8${PJq6Smsg27s#u{*=wu7G(vC<44o zGy`$?kO`gG{d}kf&qk^MXQF^(Mjg7|6aievJyigELq$M26?K#Wol_%P3ninS!3%J$ zjl8C%6Ku^^2KjEGE(k6wvqD^GXpN4jA2NVWT}qe=?d>1|qK1WEcf_fN>1%ldKTjALUADK%~Jti5&>mIHW}Bw0Q2ua8^{FjYNi3+hyg;6J%|K=E3I>?Kv1JX z3cDFl3K~dG^i;`Apdk!`pjq`Q0*U}YJ_rS$sZcgh0s#6ds19GH3OZ|5LW-UrwNear zD9VEFq_K7u^0D|Jy*qIB1H8Mhqwa=MQJDciI)xzxiyGdch4*vjB z83Nm@u>cFVQUpE-9-z+RG~wYwEQL{L$pa1>xuK9PxuLMy$V-d0!BKE$Z!&>}-S;YF zRqnL__mnh(m9;C{HOpEnY0(R9@2RDfTTF5LX*`D7LrYt5dG(a}asv1H= zA+qOG4~Fu9NC&O!??X&au?(=gzwJ~7T8Igwp^~^L1#V8MqPBYKp-A>sFc&gd6rr%M za-=2rp^}sYss%+rnHVYdC3zgwUUr~~Lg6v+((?Q{cewLmH| zxq-90Z2MFoi((*BhJgS!#Yi;(aA$NjG1!F`PW?=T4qVU&w19iu$WX3qSs{ysXoBE7 z6lR3`$O?YDkfFf{4*OcDTZ4T_E?R}TJa+wRi;lXyzRHCVpdTFdP#|`v8?r#e`F}DI z6r&=Yr=Q#?a_@}h;fIaQFzn`#?E;gY5XpbiL7Zat+)Dzj}+ z)6gC0%9&$Opn#iMTbL_?fK2}YTBeH2y+V=7wamcyY`H);ezZ1CGR-`QH||3sY9JFT zz|;cnKr{i808j&}1zIWGa9t{YV0>Ugbd9pZ@9rKia4pHcA=? zYM>g0B)7I&v}8Y8$O><*LW68jAj;g8G_(Z_ha8DeI_0rI9sd9d0hYu%6Os_Dg^&em z+Ykd$nGB)6d%}j$Q#_O)ZjUWc1v1N709BdU05knwBrg&j*^}0YIFU*g?)~Fu^0JgFL z@ye=zP|zS2&8(@AeY+43g%AfE>VPSdfHI;0|D`O*f;^+fz)B#@nkPm}V)HW5*Y5=z?@}L{N5EI8FGK#Aqv<=nezgEQRRACa0kHre1OR{?>*_!c-hdvQcK0d) znyLVOr~;^H5Dt&jfK~A-LHkM+PqokuyPePtLW!EZ6(DaiXf+yz2LAvhNKYTvQUacy z*Lncpp+?VY5Kro&8w#KVC_7OMG3L+ShQavOwL%P;vp@w(({%t>#g|fmb^4G4JsFya zE*lGC7S|I!c-pA}o~(c?M%thX*I=L?+_zOJHSr;qiltj2_fXi7Tq^CAGeaTGvp+Hb z*^&V}>~sK3{8<39KsI_iKY9UhKsI_IfjjYcR0jnL8INhz)PgODgBJ}{^BzTH`^W;h z?LbSuXbMoEfLqM2gw$#jPR~_H8%Y3fGH5j#g#-j}RKZ-{BmnzR1siV!0^oo+{U`+L zf&T!KfEfTF1Oji>5CiAMP(BI)DhAcypbu#PW!I9RK9^7i#y}O$sAwB?0C03bb!ycB zTdPF49|a0cwAiT!n?B6Y2i0v50PIE(SBiKK5vWjir*fnY3KSXY-O7*&{geRZ+=K>t zC~XGbq$t_hyO0H2teF7Wx|smIc_1BXp+c_xq$R8uGFZ2;v%6+$kb68R0;JBM5o|y$ z*Hp@5%dX@$GJKGNtJl2%SA!r6P@>?39cbAg7F6#*8Rmc)^Q}+@%Agi+#;Tmhx4i&x zP@-pUwLr_c0XZ>uARA=WKqe||KsIN$xd1(LssLxI0DHgefE(6;W0reR5y1g!6q>mz zL9=n*Kq_R0Mo0x~^&kgo^C|+J?4Sz2S^%N~c&Z9e0s$%ppb8)gXV>af2Q5?reXgh* z?R5Y))<6xh03aP-tqlv8=|DSB4MLO0Z_>16rISRq&5DqBG7E{bWFYcq??R9K)G0Kh zl{hLwwt0{S-KYWIWm!X46Oc>c+>ixXL2#?F zDlRT9-hg}*DDHBiqz2X26#z3;4TmZKx}0C@Ko!mV&;!?s7zQe!2Yrr)!mpdxbyERW zXHeCJL>3O@DE1%+eD)v{<)0J-rhE{r{budo_>< zTB3uH>6XT24OlAA+=9rKc5dZNhTi5>gRR`kXi&S>fEnt52VyXU*|um0#+2?rHf)qK tCf-y4>_!EZJCF_bAQSGO8D+C#8V~cL0NTl+kz|>GebsrI8}BF&|Jhrg_?!R$ literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/hi-saturation.jpg b/src/ImageProcessor.UnitTests/Images/hi-saturation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..909fa4fc55d43e54c2e4ef54021b1fb7275676a0 GIT binary patch literal 33850 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 literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/text-over-transparent.png b/src/ImageProcessor.UnitTests/Images/text-over-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..21ebe3883c94844039cc07ad91487339b3ed1f34 GIT binary patch literal 7317 zcmdUUS5y>TlyxCUY?6|57LlBDPKsm@kYt0<(*h{IQ zfyekYKNdGJF)V@FkRSAxc$Q$3y)ZHIW9-`@^jgqI*Xa(__UKLHjN(q^X->l!K@TA) zU0cjhA`Dcf%0jssIoLn2wkfC_PR!*6P!Kk}WcR^v;sBRWdHF{iJp^3Y4;Q*HZuv6pYCj)Hv9b(l1Cpn;U?Acolz+4!ha@6UU0cHgN;m2l<+CXhH z(1WBPsRsx_fUsd~^g{qI2zc?8lQRH_$^@u1Pt4?hKdPqK;lp|=vtGWHOGYEyl2E{# zz|2gLg%|ml_7RmN_zpNrS+FlKlU_7joP70k1OW1rsj=3cVgit4)kvgdViTFIz+N~0 zEr*@m#?97Pg_kk_tocGGZuo^77{cW6!`yEQxsULiY)JB7qv9Rw$(0*{{M~u8Q?I|i z(I|M|IybkqxjFl!U)2&kWEOG*>9g%I!?;~R<*!lat6l3{;iA^zT6mYMeIsX2i^HFUW-t$gW&q_EIE#`<*O?mi*`}^(7^%Z_JuHuRW zQ0t}OTNv>Z=MyYc3_o-5-62A;%diCOAWrQj( zY_yh{?}gA0WoGdnLnm0O7nxw6X$zTx7x^DBVQw#PM>r9l%2&esVD|Y~9J{yXoQZ_A znbDW*z1n#9;tHb3X|y`=j>6hX0S{Zd@_;?zVRw7$Rd zxUR_L`@Qd)-#v^tclpb*#kCnYQ@_o>bgd_l`G=qF(bwqBoK3{0*e2s9`-vrSj-9f1 z(WUV^uhEdp6Z$QRE%7aUhYV2_(~nt3OP>l%C?%4ft5y{>8PyoZe7Z0GI!k6WlIF2a zaaCd3B!d&J6Uw>fr*9kOQW}dMeBA8&@UGTR_)pw3e-J5*I&v@;!b_h`M?eRm_ou7L zcv?a~8BafGA}l4cpRtokp6O|7&ey~jOr1PLoc1J*CykL$$fT^iqBTlv)$+z zU?Z`oZwTOLcO|WWy$+Y?=cyZ=3-;q{&%iLZ$19YV709TGJrOf&FgpFmQHfw9!~61s zuO873Zz=o~`gWP>_~H6P#uD+Tts)LquI1_Qbn^=B3d0Jm{Z7g1!_u6RPK|a8bU2yH z;FAYd540dj$h$c^#&gC?rNpH)x(c%A)q>@&#f$~*>i*pxrAHaLT{dC4Pd!VQ13P#A zFog(VOfc?$O3$@G=J*XDF8l=$l1~1MgtwtkpDQP z`A(BO!Fj-HgKNWmzi-%a0|%9`nGw`TDds+-)KLckC^T1fMkYQ#}$XKF}W$UBSz0cp$}Sq1ZR zW~k5SS5&gkWS6s$AC8nlzMQ4+3PH@rD8^>RHk$4aKkRqTG0vXUg3v-*eIid|Jnvzyg_zGc;;Y)K z;nsu_NnV<;>q;e5Urj$8(zwGZWG|F#Ry9-GTVUMRlG+fdw)ms%EGwy+(M z>S_MkJgkrK%(abPQ48g~eR=!lb^<63KhgLAD+JhASPS>uv zvcEWUXsvH9WUdsvJ=W|&_f9uOJ$M252 z+sgvEmSpMW@NGDm2kG4WXVR5tpAXM3G!}&5qr404kxgo?AG_sSIvh&BAxGtuOo~j- zO#YZi9(`YG1kYT0OdK%=bzF!aOf6V;pfHNxx)w}vOm(LmryS6a(G4i2>bUaV%XGB6 zb(NmG_u(M!cU%ksCt1@>>yIhs?+PYHNz;$^wa5lpyKZuh{RK!RNlo8<7+B}@QV-nR zMG>u_SV(2({StyI*9azA{g@%lLN2OVCs~@=##v}fJIglx5ygq=z2!I8S_`b?AH?M? z0-v0kd~=@PjhIY@oQx&pq~(M_1+NxgEEF~c?bst%T*y6-+bDe3zH8jZ@5pt?A+1hY zd{62Zw(gs?m}S+-+Pd%g?#bVzPU;V~e`wFDZnbi4J$lpG803iBWz3aAE}eA-{-(K| zp30R`Sn51|d^17JySkZnNwSenNqU6S)4sy40Y-8 z&p(}5)I#A$M~>YjpC^&4-A&3&8itX=_H(5bWn|WsUSW2xOV!3+j`8Hu-W1*pSJTo6 zK`*EFXOI&a69w=ScxtzMa4}}DXP>@iVW4k-rR!UOn262UGxTAv|Dr$h@y8W%{mo#u zP~KaotGaXJ@ltdueQN409&X0zwY`|Y0=C{{v)4A#1%Nl)01y@l09Uuz`z`>y76yR5 z7XToe0RXg~DYjoU0f4gSvAT*$!2H3|X!86lL)h9_bIFja;~L;aD2>N-CkHU~C0t@3 zXBRis%O?U8f(d)^dhE;__S%&hh83>0^Yd`!^-X82;D;XUTq~!qiazQeA0OiYKu^e@ zJnO$uh_Me8*oqj4RmBeK?AW1@0y`LDYm+cuJOEIpy7TXu_U}XV-|*JI)0O`<@c&&7 zC|lpul7y8*gRia`C?jLd)%$rk(xX>wxLUqp4qPcH5eK0{oa+VsD~ArD#~+hw+IJ6G zH2UQ^Y@W|UJ{~~G8*It-4$V57(v(2V%5%o>M<)9KW4S#cZQ}{YSyT{O;>7GHKfbxlOd%D+UH+g=_EL-T$s`r3?cpe&9h&+0>U zG$)n`^g9oBFz8-Hl2BfJw-RejGdWJIYS?{z|H~{|)*HF_*zUqs{nLenK4+RJR`>ew zlL8$Tbad}U9kwSluV9*}5KC-qf;69yYZ?(Fw!#Us2G+=5IWl*^pnk}AdL1=a2{zEH zos!L~l+b)HZ7_XJl9V39Zo*f-cG+;q!Hf#n z03|}R_alC3D-5Baw8LF)U6M8Cq%hUd&Fs3B*ckXZwAH>G+;XfIx5IfHn2plf7K@zZ zT#y}0Jiek|30+ZWLR`MK2)G?N{%cTYWWpjp)Vkhp7bP!g(EZXo4GK08uk`-aAT45G z`|O%N9=AZkotM}ag$M46)t;K`l;_&9a3W)JZDesBCJD8rJ6euh%f(Djha`VI_^{6` z6Pndx8;~5Lpe2R^;Y#&!J`DSgWuO(4iGrhTnUGQK5WeNgM%%Nn5rVh6BQH1M)ghq1 zK@x&*6>dsGu7os$^T&ohdpmy4DR=dU(y<21p4Eq(Ha#Gen)Aj;WLYbh)5Rv$wf~q+ zU}GZ=Z`cx3ZutF1uD$OtZ-&moowT1;g8T*g_sZ~0y5Y*xv2BFnvelc)M)4P2+x7y{ zrpigyG?@{C7luN9s7O6BCRSTH*(P`$dUd_^r95sS#j27D<-~HsNftw;tufVfC&zkM zc+k@EP9Y4lVeWcs-u}b5MO;McYlPQI@sFhB9!`aU{X?B=6e9m!GnqQOa%T7+w~poN z>Pv~rqiYPK1f9@p=os|C(U8e?X3LcBMouk&moPQ+3R!)ban}pQFOF;Cy{iBzGq;)B z52$>&cyV{Fus7tuyuHi5s#-Wf?%g|i!k{t&aBuv30(EwS`Lr<#nvnMT!zx#{xow}@ zbXt#QdtJKe5c#I_HdGE|tW5JHpwk+2c@oG2TI*^JrdoxbSzcRIXro2$T9u3(>~vZ` zY4bE)k=HivmYQ}c!cwl~eq^Fr@`B+->l<`#Okl;%bitHa%^HHzkg$*~G*whXOT?gj!i;4_VgxVVD)QaI9R?7>zQTKX=*q`Q@+^y`Eaf0137cZ_ z6=NLvdFnzN)umrvvh(PT!j@jqv1D;qZUp93(bqH!If7KE?s%ceNDa_+mRz{Vy13Y5 ze+Jk`>ENsL#R4ol0V5x`@f)i2A}zYy`_b&gIEI8hjnWd@oy}T=H6E2zwFkEJRC96*}*rNUI}uRUKVr4yEj^J^?9E($ZJK*MCyO8DgjOJdR+ z=0Sp2A-0~s&T+X8$=iW^%GbyM@xV|c7MQ8vQucs{%uS5f@sCc~9nrCCZ{E^Ep-`@& zk4vC&GO=i2*HyOTM7Z+A=fnb$+#K^3Y|eARlYEg-@CA;oNqTfOz$~zp!g&t*&e#AF zcFrk;2l_K$Y!p^<$srVH$n!_(OLBtD*eX&cO(JOZTflg`T*^V`cEvN|*B6gwU zAMrG5lcZ6{qfV`>LHO8Jw+d_3zs)6^$Wy~o`;im&ZHffXD1SrLgNM4h29FTA^{lh}^@P_x9m`OLn&t=! zEDxA7;Y?wY+_qtk&(@AXh3)iu)syz$><=Uggssx0$&Kp2-nn*-3)QFDIKMy#bmk<@ zST@{X!$CWEbq=O0=@eQ?QJPwN3EGVYXNRZm`GBOjFHRTN{>H>vQEiVJRK|JEJrjoQ z4IY8^uitO|!1O&-TD&n~vNXWQem?FhYn)9W)Ji zV0@#z>BN*YvkVJ1l zASm%w5}}tTyQzEO;!tzvY?a@F23_@f8-xT0yGUb38ljpP&!P)mZd<||D#5(JIQ;Ly z#va@x(BJnE0nu_d4R1|iiM}e>@qvylUR973VGMWK2G4GfEEe|r#i?S6?j@CItvTNu z)FKRGT|fIs)kcUgP8zSBz4uot7%QZqNojMcf^`W?32SA-OrM!x4fhtrNl`R^13_-> z%5l+>&SU*-!{QB?+6KEE8*#z8aImX$_Rt88qK5yN2_7~mK1&*VyG^`%*Sxmv`?|(y zPMArv-<4$WMdn=JSB@!%qQByCKXP_y=0|ZccFvisV(w7XS`h_ImnBk&yDRiot>_L` z9iC5~@8v!6#EFXnr?Tj{4Qtc=1)-y$ah@h0B=BXeAgE+}xhdYfwJ}#X*ad8vi>*PL zIH<9x%(fVg8+Kjtq2D5?bv;iD4xdX;YqNnC0*)cned7u+EC60c ziL<>J^m3`Gonb)yV3w)Ca15ByX8la^#ds2hc4kHBf1fm!eSqK{(RG*!bONaJww;X}yY0kP$yi71)tsB7EjX@k+=Rmt51V&pt$8xbgDsew!5M<}-z3 zt#l)o?N{w%w{Om$P+y}fIcr6;{(1#Kk4K0mV=$s91DWX|M$OjD9_Ppfc?EAl{(Be- zHYM9GP1%ZIkM)_oqEz1Q%gLXJz-GP=rNg*`x=>^~rrCv(1{TroP(mTSkSP{@#pdvy z)T-R7ujQ?6UiuDhmo5qJcj!eLfgwC{*b~yRta2cD>b56}(3Q;i!0i`ngRXmaj))2o z`+j9Mm6sR#?g@+3@MYtt@p=mSvY&@U2opz{nCPFb=vRxn7hR(R`|jmna_n~DfBZG> z0KdvdkLT~c_Yo|u+;bk2bgQp{er~W^6^*af>2o!r3!84$J=ON{`^Avd=zI_=-`lz% zAMYX-TSK6FW?)5@)UWv#PDyKP`xf3sM#5@mlDSo3mmDH6xPQojO_bv*RLj}H1Kf?h zX5Ql#*T)4oQ124{yyW?SpjOo@g%I-OBZnH+TMXSn+^>*{OK-^_!%Ks;=2~neoQQ`F zAplrSruuicx&LWzhSkM?b$|Z<1O9*FVB!A(XCpquQsjT+{KM${76-Tu5rN02MPq;a P0Kj7nJ@snU7ZLvfNs}N= literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id new file mode 100644 index 000000000..0db1445a2 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id @@ -0,0 +1 @@ +4d040d9aa3519b3d2303419d1f03eebebf88e956 \ No newline at end of file From a8c29c35cd8475bd826c66b1ead7d9e337d1189e Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 11:57:53 +0200 Subject: [PATCH 15/35] Fixes test image includes Former-commit-id: ece5f07535519335d8e992d5831440c9ed9600be --- .../ImageProcessor.UnitTests.csproj | 84 ++++++++++++++----- 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 726d0988e..4fbcc99b6 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -43,7 +43,9 @@ - + + PreserveNewest + @@ -59,26 +61,66 @@ - - - - - - - - - - - - - - - - - - - - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + From b656a71168d2ebfed34dc3b38e754f657fa3637a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Wed, 25 Jun 2014 23:59:37 +0200 Subject: [PATCH 16/35] Creates a new Mono project so it can at least build (not yet run) on Xamarin/Mono Former-commit-id: 73972cac708c4e8958f0c40a99a86a0c9884eebb --- src/ImageProcessor_Mono.sln | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ImageProcessor_Mono.sln b/src/ImageProcessor_Mono.sln index 7d47a2ca6..d7e1410a8 100644 --- a/src/ImageProcessor_Mono.sln +++ b/src/ImageProcessor_Mono.sln @@ -18,6 +18,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E656C EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor", "ImageProcessor\ImageProcessor.csproj", "{3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Website_MVC_NET4", "TestWebsites\NET4\Test_Website_MVC_NET4.csproj", "{30327C08-7574-4D7E-AC95-6A58753C6855}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET4", "ImageProcessor.Web\NET4\ImageProcessor.Web_NET4.csproj", "{4F7050F2-465F-4E10-8DB2-2FB97AC6AA43}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET45", "ImageProcessor.Web\NET45\ImageProcessor.Web_NET45.csproj", "{D011A778-59C8-4BFA-A770-C350216BF161}" @@ -37,6 +39,24 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Any CPU.ActiveCfg = All|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Any CPU.Build.0 = All|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Mixed Platforms.ActiveCfg = All|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Mixed Platforms.Build.0 = All|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|x86.ActiveCfg = All|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.All|x86.Build.0 = All|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|x86.ActiveCfg = Debug|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|x86.Build.0 = Debug|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Any CPU.Build.0 = Release|Any CPU + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Mixed Platforms.Build.0 = Release|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|x86.ActiveCfg = Release|x86 + {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|x86.Build.0 = Release|x86 {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.ActiveCfg = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.Build.0 = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Mixed Platforms.ActiveCfg = All|Any CPU From 68131ae9b3f067df5777afe450a503c826caecd6 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Thu, 26 Jun 2014 00:08:55 +0200 Subject: [PATCH 17/35] Removes MVC test project from Mono solution because of heavy dependencies Former-commit-id: c4a57569c8eec272ba8ea994022eb937ef6e4d8a --- src/ImageProcessor_Mono.sln | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/ImageProcessor_Mono.sln b/src/ImageProcessor_Mono.sln index d7e1410a8..7d47a2ca6 100644 --- a/src/ImageProcessor_Mono.sln +++ b/src/ImageProcessor_Mono.sln @@ -18,8 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E656C EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor", "ImageProcessor\ImageProcessor.csproj", "{3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Website_MVC_NET4", "TestWebsites\NET4\Test_Website_MVC_NET4.csproj", "{30327C08-7574-4D7E-AC95-6A58753C6855}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET4", "ImageProcessor.Web\NET4\ImageProcessor.Web_NET4.csproj", "{4F7050F2-465F-4E10-8DB2-2FB97AC6AA43}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET45", "ImageProcessor.Web\NET45\ImageProcessor.Web_NET45.csproj", "{D011A778-59C8-4BFA-A770-C350216BF161}" @@ -39,24 +37,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Any CPU.ActiveCfg = All|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Any CPU.Build.0 = All|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Mixed Platforms.ActiveCfg = All|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|Mixed Platforms.Build.0 = All|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|x86.ActiveCfg = All|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.All|x86.Build.0 = All|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|x86.ActiveCfg = Debug|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Debug|x86.Build.0 = Debug|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Any CPU.Build.0 = Release|Any CPU - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|Mixed Platforms.Build.0 = Release|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|x86.ActiveCfg = Release|x86 - {30327C08-7574-4D7E-AC95-6A58753C6855}.Release|x86.Build.0 = Release|x86 {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.ActiveCfg = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.Build.0 = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Mixed Platforms.ActiveCfg = All|Any CPU From 28432df6c65a6121206d3e7ab7d9a8d095c72efa Mon Sep 17 00:00:00 2001 From: James South Date: Thu, 26 Jun 2014 22:30:08 +0100 Subject: [PATCH 18/35] Separating Unit Tests Hopefully rebuilding the projects will fix the AppVeyor issues. Former-commit-id: 61a12987b4f4c9324580f15b8f23b35c03876726 --- .../ImageProcessor.UnitTests.csproj | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 81516b4b6..96dfb17a2 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -65,6 +65,9 @@ ImageProcessor + + + @@ -72,6 +75,136 @@ + + + Images\1182076_e8c402e938_z.jpg + + + Images\bus.jpg + + + Images\Chrysanthemum.jpg + + + Images\circle.png + + + Images\cmyk.jpg + + + Images\cmyk.png + + + Images\color-vision-test.gif + + + Images\Desert.jpg + + + Images\emma.jpg + + + Images\falahill_design__160p.jpg + + + Images\fid11246.jpg + + + Images\fid9141.jpg + + + Images\header_1.jpg + + + Images\Hydrangeas.jpg + + + Images\Jellyfish.jpg + + + Images\jrt.jpg + + + Images\Koala.jpg + + + Images\Lighthouse.jpg + + + Images\lomo.jpg + + + Images\meter.gif + + + Images\negative.png + + + Images\negative2.png + + + Images\Penguins-200.jpg + + + Images\Penguins-8.png + + + Images\Penguins.bmp + + + Images\Penguins.gif + + + Images\Penguins.jpg + + + Images\Penguins.png + + + Images\Penguins.tif + + + Images\rocks.jpg + + + Images\rotate.jpg + + + Images\sample1.jpg + + + Images\srgb.jpg + + + Images\srgb.png + + + Images\text.png + + + Images\thor.jpg + + + Images\Tulips.jpg + + + Images\udendørs-374.jpg + + + Images\udendørs.jpg + + + Images\war_horse_quad.jpg + + + Images\WP_000009.jpg + + + + + {3b5dd734-fb7a-487d-8ce6-55e7af9aea7e} + ImageProcessor + From aca2f6e25353c2c5dc997922f602c6a0f490118e Mon Sep 17 00:00:00 2001 From: James South Date: Thu, 26 Jun 2014 22:59:30 +0100 Subject: [PATCH 19/35] Moving Images in unit test Former-commit-id: 0448d1ccf9fad7e431636cbed45e6e7a3bf28cd2 --- .../ImageProcessor.UnitTests.csproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 96dfb17a2..981d8ded5 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -206,6 +206,14 @@ ImageProcessor + + + + + + + + From 2078cdcd289f331ebb462cd68e02d7b9f7f0ee92 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 15:42:31 +0200 Subject: [PATCH 20/35] Adds new test of factory for loading an image from a memory stream Former-commit-id: d97f8846fc92eaf59c5595b9af871b246bf71b9f --- .../ImageFactoryUnitTests.cs | 33 +++ .../ImageProcessor.UnitTests.csproj | 201 ++++++++++++------ src/ImageProcessor_Mono.sln | 26 ++- 3 files changed, 190 insertions(+), 70 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index a63f95ff2..1fc782073 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -51,5 +51,38 @@ namespace ImageProcessor.UnitTests Assert.IsNotNull(imageFactory.Image); } } + + /// > + /// Tests the loading of image from a memory stream + /// + /// + /// The file Name. + /// + /// + /// The expected mime type. + /// + [Test] + [TestCase("Chrysanthemum.jpg", "image/jpeg")] + [TestCase("Desert.jpg", "image/jpeg")] + [TestCase("cmyk.png", "image/png")] + [TestCase("Penguins.bmp", "image/bmp")] + [TestCase("Penguins.gif", "image/gif")] + public void TestLoadImageFromMemory(string fileName, string expectedMime) + { + string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); + byte[] photoBytes = File.ReadAllBytes(testPhoto); + + // ImageProcessor + using (MemoryStream inStream = new MemoryStream(photoBytes)) + { + using (ImageFactory imageFactory = new ImageFactory()) + { + imageFactory.Load(inStream); + Assert.AreEqual(null, imageFactory.ImagePath); + Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); + Assert.IsNotNull(imageFactory.Image); + } + } + } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 981d8ded5..111f5e03c 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -1,67 +1,58 @@  - + Debug AnyCPU - {633B1C4C-4823-47BE-9A01-A665F3118C8C} + {03CA9055-F997-428C-BF28-F50F991777C6} Library - Properties ImageProcessor.UnitTests ImageProcessor.UnitTests - v4.0 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest + + ..\ true - + v4.5 true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug + DEBUG; prompt 4 + false + false - pdbonly + full true - bin\Release\ - TRACE + bin\Release prompt 4 + false + false + + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - + + - - - - - - - - - - - - + + + {D011A778-59C8-4BFA-A770-C350216BF161} + ImageProcessor.Web_NET45 + - {3b5dd734-fb7a-487d-8ce6-55e7af9aea7e} + {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E} ImageProcessor @@ -208,32 +199,121 @@ - - - - - + + + Images\Chrysanthemum.jpg + PreserveNewest + + + Images\Desert.jpg + PreserveNewest + + + Images\Hydrangeas.jpg + PreserveNewest + + + Images\Jellyfish.jpg + PreserveNewest + + + Images\Koala.jpg + PreserveNewest + + + Images\Lighthouse.jpg + PreserveNewest + + + Images\Penguins-200.jpg + PreserveNewest + + + Images\Penguins-8.png + PreserveNewest + + + Images\Penguins.bmp + PreserveNewest + + + Images\Penguins.gif + PreserveNewest + + + Images\Penguins.jpg + PreserveNewest + + + Images\Penguins.png + PreserveNewest + + + Images\Penguins.tif + PreserveNewest + + + Images\Tulips.jpg + PreserveNewest + + + Images\bus.jpg + PreserveNewest + + + Images\cmyk.jpg + PreserveNewest + + + Images\cmyk.png + PreserveNewest + + + Images\jrt.jpg + PreserveNewest + + + Images\meter.gif + PreserveNewest + + + Images\rocks.jpg + PreserveNewest + + + Images\rotate.jpg + PreserveNewest + + + Images\sample1.jpg + PreserveNewest + + + Images\srgb.jpg + PreserveNewest + + + Images\srgb.png + PreserveNewest + + + Images\text.png + PreserveNewest + + + Images\thor.jpg + PreserveNewest + + + Images\udendørs-374.jpg + PreserveNewest + + + Images\udendørs.jpg + PreserveNewest + - - - - - False - - - False - - - False - - - False - - - - - - + @@ -241,11 +321,4 @@ - \ No newline at end of file diff --git a/src/ImageProcessor_Mono.sln b/src/ImageProcessor_Mono.sln index 7d47a2ca6..8b1e0fb37 100644 --- a/src/ImageProcessor_Mono.sln +++ b/src/ImageProcessor_Mono.sln @@ -3,12 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 VisualStudioVersion = 12.0.30110.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C427A497-74DC-49B1-8420-D6E68354F29B}" - ProjectSection(SolutionItems) = preProject - ImageProcessor.vsmdi = ImageProcessor.vsmdi - Local.testsettings = Local.testsettings - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1E656CDE-124D-4FAF-837C-0EF1E192D418}" ProjectSection(SolutionItems) = preProject .nuget\NuGet.Config = .nuget\NuGet.Config @@ -24,6 +18,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.Web_NET45", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessorConsole", "ImageProcessorConsole\ImageProcessorConsole.csproj", "{7BF5274B-56A7-4B62-8105-E9BDF25BAFE7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageProcessor.UnitTests", "ImageProcessor.UnitTests\ImageProcessor.UnitTests.csproj", "{03CA9055-F997-428C-BF28-F50F991777C6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Any CPU = All|Any CPU @@ -37,6 +33,24 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Any CPU.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Any CPU.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|Mixed Platforms.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|x86.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.All|x86.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Debug|x86.Build.0 = Debug|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Any CPU.Build.0 = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|x86.ActiveCfg = Release|Any CPU + {03CA9055-F997-428C-BF28-F50F991777C6}.Release|x86.Build.0 = Release|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.ActiveCfg = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Any CPU.Build.0 = All|Any CPU {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E}.All|Mixed Platforms.ActiveCfg = All|Any CPU From 91948689d3b313b68e08f50b3be07d4b3939a215 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:03:26 +0200 Subject: [PATCH 21/35] Loads all the test images + tests a few filters as well (failing for gif images) Former-commit-id: a0aacc78aeb810580ff7c3e0979502c3f60c5cd3 --- .../ImageFactoryUnitTests.cs | 106 +++++++++++------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 1fc782073..7cd124b19 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -12,6 +12,7 @@ namespace ImageProcessor.UnitTests { using System; using System.IO; + using System.Collections.Generic; using NUnit.Framework; /// @@ -25,62 +26,89 @@ namespace ImageProcessor.UnitTests /// private readonly string localPath = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); + /// + /// Lists the input files in the Images folder + /// + /// The list of files. + private static IEnumerable ListInputFiles() + { + return Directory.GetFiles("./Images"); + } + /// /// Tests the loading of image from a file /// - /// - /// The file Name. - /// - /// - /// The expected mime type. - /// [Test] - [TestCase("Chrysanthemum.jpg", "image/jpeg")] - [TestCase("Desert.jpg", "image/jpeg")] - [TestCase("cmyk.png", "image/png")] - [TestCase("Penguins.bmp", "image/bmp")] - [TestCase("Penguins.gif", "image/gif")] - public void TestLoadImageFromFile(string fileName, string expectedMime) + public void TestLoadImageFromFile() { - string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); - using (ImageFactory imageFactory = new ImageFactory()) + foreach (var fileName in ListInputFiles()) { - imageFactory.Load(testPhoto); - Assert.AreEqual(testPhoto, imageFactory.ImagePath); - Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); - Assert.IsNotNull(imageFactory.Image); + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + Assert.AreEqual(fileName, imageFactory.ImagePath); + Assert.IsNotNull(imageFactory.Image); + } } + } /// > /// Tests the loading of image from a memory stream /// - /// - /// The file Name. - /// - /// - /// The expected mime type. - /// [Test] - [TestCase("Chrysanthemum.jpg", "image/jpeg")] - [TestCase("Desert.jpg", "image/jpeg")] - [TestCase("cmyk.png", "image/png")] - [TestCase("Penguins.bmp", "image/bmp")] - [TestCase("Penguins.gif", "image/gif")] - public void TestLoadImageFromMemory(string fileName, string expectedMime) + public void TestLoadImageFromMemory() { - string testPhoto = Path.Combine(this.localPath, string.Format("../../Images/{0}", fileName)); - byte[] photoBytes = File.ReadAllBytes(testPhoto); + foreach (var fileName in ListInputFiles()) + { + byte[] photoBytes = File.ReadAllBytes(fileName); - // ImageProcessor - using (MemoryStream inStream = new MemoryStream(photoBytes)) + using (var inStream = new MemoryStream(photoBytes)) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(inStream); + Assert.AreEqual(null, imageFactory.ImagePath); + Assert.IsNotNull(imageFactory.Image); + } + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void ApplyEffectAlpha() + { + foreach (var fileName in ListInputFiles()) { - using (ImageFactory imageFactory = new ImageFactory()) + using (var imageFactory = new ImageFactory()) { - imageFactory.Load(inStream); - Assert.AreEqual(null, imageFactory.ImagePath); - Assert.AreEqual(expectedMime, imageFactory.CurrentImageFormat.MimeType); - Assert.IsNotNull(imageFactory.Image); + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Alpha(50); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void ApplyEffectBrightness() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Brightness(50); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); } } } From 7bab9971295809172d9c9e36b18f126c53dc3c4e Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:13:23 +0200 Subject: [PATCH 22/35] Adds test for constraints resize Former-commit-id: dca011a62587c43e6a59054c4949f09df14dbbf1 --- .../ImageFactoryUnitTests.cs | 24 +++++++++++++++---- .../ImageProcessor.UnitTests.csproj | 4 ---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 7cd124b19..b81cff068 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -21,11 +21,6 @@ namespace ImageProcessor.UnitTests [TestFixture] public class ImageFactoryUnitTests { - /// - /// The path to the binary's folder - /// - private readonly string localPath = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); - /// /// Lists the input files in the Images folder /// @@ -112,5 +107,24 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is well resized using constraints + /// + [Test] + public void ApplyConstraints() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Constrain(new System.Drawing.Size(200, 200)); + var modified = imageFactory.Image.Clone(); + Assert.AreNotEqual(original, modified); + } + } + } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 111f5e03c..c0311d476 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -224,10 +224,6 @@ Images\Lighthouse.jpg PreserveNewest - - Images\Penguins-200.jpg - PreserveNewest - Images\Penguins-8.png PreserveNewest From 042294249307327c291fb5e73eb093faed9b611a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:16:34 +0200 Subject: [PATCH 23/35] Checks that the image is actually resized Former-commit-id: c13de5b788d5fbd4f2d2224ed575cd667c8af838 --- .../ImageFactoryUnitTests.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index b81cff068..936c32345 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -83,8 +83,7 @@ namespace ImageProcessor.UnitTests imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); imageFactory.Alpha(50); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + Assert.AreNotEqual(original, imageFactory.Image); } } } @@ -102,8 +101,7 @@ namespace ImageProcessor.UnitTests imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); imageFactory.Brightness(50); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + Assert.AreNotEqual(original, imageFactory.Image); } } } @@ -114,15 +112,17 @@ namespace ImageProcessor.UnitTests [Test] public void ApplyConstraints() { + const int maxSize = 200; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Constrain(new System.Drawing.Size(200, 200)); - var modified = imageFactory.Image.Clone(); - Assert.AreNotEqual(original, modified); + imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.LessOrEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); } } } From 8871af86b25a0ebe6bdaba7b77c3dcc9a4c49e0a Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 18:52:29 +0200 Subject: [PATCH 24/35] First fix of an animated gif problem on Mono Former-commit-id: 03c0f1246530ecead97e5346cebd197f77a72401 --- src/ImageProcessor/Imaging/Formats/FormatUtilities.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs index 36d2e3c07..3c6e3b3e0 100644 --- a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs +++ b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs @@ -135,12 +135,14 @@ namespace ImageProcessor.Imaging.Formats int frameCount = image.GetFrameCount(frameDimension); int last = frameCount - 1; int delay = 0; - int index = 0; List gifFrames = new List(); for (int i = 0; i < frameCount; i++) { - int thisDelay = BitConverter.ToInt32(image.GetPropertyItem(20736).Value, index); + // GDI returns a single array with all delays, while Mono returns a different array for each frame + image.SelectActiveFrame(frameDimension, i); + var times = image.GetPropertyItem(20736).Value; + int thisDelay = BitConverter.ToInt32(times, 4*i % times.Length); int toAddDelay = thisDelay * 10 < 20 ? 20 : thisDelay * 10; // Minimum delay is 20 ms // Find the frame @@ -156,7 +158,6 @@ namespace ImageProcessor.Imaging.Formats } delay += toAddDelay; - index += 4; } info.GifFrames = gifFrames; From ee654520687e9c45a48ef47c506f3164760350f5 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 20:48:03 +0200 Subject: [PATCH 25/35] Fixes a unit test (wrong parameters order) Former-commit-id: b691dc9582d00c8ef9b0160d69c59914a63ecb18 --- src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 936c32345..f81fd1c5b 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -121,8 +121,8 @@ namespace ImageProcessor.UnitTests var original = imageFactory.Image.Clone(); imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.LessOrEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.LessOrEqual(imageFactory.Image.Width, maxSize); + Assert.LessOrEqual(imageFactory.Image.Height, maxSize); } } } From d4914a9a7fc5d60ab6aa2b038c3c41d85f7fd759 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 22:25:54 +0200 Subject: [PATCH 26/35] Re-fix of a Mono problem + modify some 'var' usage Former-commit-id: bbd7b29020665345032768961c448c64605620f9 --- src/ImageProcessor/ImageFactory.cs | 62 ++++++++++++++++-------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/ImageProcessor/ImageFactory.cs b/src/ImageProcessor/ImageFactory.cs index 540e34c9a..4a68a5e86 100644 --- a/src/ImageProcessor/ImageFactory.cs +++ b/src/ImageProcessor/ImageFactory.cs @@ -177,13 +177,13 @@ namespace ImageProcessor /// public ImageFactory Load(string imagePath) { - FileInfo fileInfo = new FileInfo(imagePath); + var fileInfo = new FileInfo(imagePath); if (fileInfo.Exists) { this.ImagePath = imagePath; // Open a file stream to prevent the need for lock. - using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) + using (var fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) { ISupportedImageFormat format = FormatUtilities.GetFormat(fileStream); @@ -192,7 +192,7 @@ namespace ImageProcessor throw new ImageFormatException("Input stream is not a supported format."); } - MemoryStream memoryStream = new MemoryStream(); + var memoryStream = new MemoryStream(); // Copy the stream. fileStream.CopyTo(memoryStream); @@ -240,7 +240,11 @@ namespace ImageProcessor if (this.ShouldProcess) { // Set our new image as the memory stream value. + #if !__MonoCS__ Image newImage = Image.FromStream(this.InputStream, true); + #else + Image newImage = Image.FromStream(this.InputStream); + #endif // Dispose and reassign the image. this.Image.Dispose(); @@ -275,7 +279,7 @@ namespace ImageProcessor percentage = 0; } - Alpha alpha = new Alpha { DynamicParameter = percentage }; + var alpha = new Alpha { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(alpha.ProcessImage, this); } @@ -293,7 +297,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - AutoRotate autoRotate = new AutoRotate(); + var autoRotate = new AutoRotate(); this.CurrentImageFormat.ApplyProcessor(autoRotate.ProcessImage, this); } @@ -320,7 +324,7 @@ namespace ImageProcessor percentage = 0; } - Brightness brightness = new Brightness { DynamicParameter = percentage }; + var brightness = new Brightness { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(brightness.ProcessImage, this); } @@ -340,7 +344,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - ResizeLayer layer = new ResizeLayer(size, ResizeMode.Max); + var layer = new ResizeLayer(size, ResizeMode.Max); return this.Resize(layer); } @@ -368,7 +372,7 @@ namespace ImageProcessor percentage = 0; } - Contrast contrast = new Contrast { DynamicParameter = percentage }; + var contrast = new Contrast { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(contrast.ProcessImage, this); } @@ -388,7 +392,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - CropLayer cropLayer = new CropLayer(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height, CropMode.Pixels); + var cropLayer = new CropLayer(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height, CropMode.Pixels); return this.Crop(cropLayer); } @@ -399,7 +403,7 @@ namespace ImageProcessor /// Crops the current image to the given location and size. /// /// - /// The containing the coordinates and mode to crop the image with. + /// The containing the coordinates and mode to crop the image with. /// /// /// The current instance of the class. @@ -408,7 +412,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Crop crop = new Crop { DynamicParameter = cropLayer }; + var crop = new Crop { DynamicParameter = cropLayer }; this.CurrentImageFormat.ApplyProcessor(crop.ProcessImage, this); } @@ -429,7 +433,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Filter filter = new Filter { DynamicParameter = matrixFilter }; + var filter = new Filter { DynamicParameter = matrixFilter }; this.CurrentImageFormat.ApplyProcessor(filter.ProcessImage, this); } @@ -449,11 +453,11 @@ namespace ImageProcessor { if (this.ShouldProcess) { - RotateFlipType rotateFlipType = flipVertically == false - ? RotateFlipType.RotateNoneFlipX - : RotateFlipType.RotateNoneFlipY; + RotateFlipType rotateFlipType = flipVertically + ? RotateFlipType.RotateNoneFlipY + : RotateFlipType.RotateNoneFlipX; - Flip flip = new Flip { DynamicParameter = rotateFlipType }; + var flip = new Flip { DynamicParameter = rotateFlipType }; this.CurrentImageFormat.ApplyProcessor(flip.ProcessImage, this); } @@ -496,7 +500,7 @@ namespace ImageProcessor { if (this.ShouldProcess && size > 0) { - GaussianLayer layer = new GaussianLayer(size); + var layer = new GaussianLayer(size); return this.GaussianBlur(layer); } @@ -517,7 +521,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - GaussianBlur gaussianBlur = new GaussianBlur { DynamicParameter = gaussianLayer }; + var gaussianBlur = new GaussianBlur { DynamicParameter = gaussianLayer }; this.CurrentImageFormat.ApplyProcessor(gaussianBlur.ProcessImage, this); } @@ -543,7 +547,7 @@ namespace ImageProcessor { if (this.ShouldProcess && size > 0) { - GaussianLayer layer = new GaussianLayer(size); + var layer = new GaussianLayer(size); return this.GaussianSharpen(layer); } @@ -564,7 +568,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - GaussianSharpen gaussianSharpen = new GaussianSharpen { DynamicParameter = gaussianLayer }; + var gaussianSharpen = new GaussianSharpen { DynamicParameter = gaussianLayer }; this.CurrentImageFormat.ApplyProcessor(gaussianSharpen.ProcessImage, this); } @@ -607,7 +611,7 @@ namespace ImageProcessor int width = size.Width; int height = size.Height; - ResizeLayer resizeLayer = new ResizeLayer(new Size(width, height)); + var resizeLayer = new ResizeLayer(new Size(width, height)); return this.Resize(resizeLayer); } @@ -629,7 +633,7 @@ namespace ImageProcessor { var resizeSettings = new Dictionary { { "MaxWidth", resizeLayer.Size.Width.ToString("G") }, { "MaxHeight", resizeLayer.Size.Height.ToString("G") } }; - Resize resize = new Resize { DynamicParameter = resizeLayer, Settings = resizeSettings }; + var resize = new Resize { DynamicParameter = resizeLayer, Settings = resizeSettings }; this.CurrentImageFormat.ApplyProcessor(resize.ProcessImage, this); } @@ -655,7 +659,7 @@ namespace ImageProcessor degrees = 0; } - Rotate rotate = new Rotate { DynamicParameter = degrees }; + var rotate = new Rotate { DynamicParameter = degrees }; this.CurrentImageFormat.ApplyProcessor(rotate.ProcessImage, this); } @@ -680,7 +684,7 @@ namespace ImageProcessor roundedCornerLayer.Radius = 0; } - RoundedCorners roundedCorners = new RoundedCorners { DynamicParameter = roundedCornerLayer }; + var roundedCorners = new RoundedCorners { DynamicParameter = roundedCornerLayer }; this.CurrentImageFormat.ApplyProcessor(roundedCorners.ProcessImage, this); } @@ -707,7 +711,7 @@ namespace ImageProcessor percentage = 0; } - Saturation saturate = new Saturation { DynamicParameter = percentage }; + var saturate = new Saturation { DynamicParameter = percentage }; this.CurrentImageFormat.ApplyProcessor(saturate.ProcessImage, this); } @@ -727,7 +731,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Tint tint = new Tint { DynamicParameter = color }; + var tint = new Tint { DynamicParameter = color }; this.CurrentImageFormat.ApplyProcessor(tint.ProcessImage, this); } @@ -747,7 +751,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Vignette vignette = new Vignette + var vignette = new Vignette { DynamicParameter = color.HasValue && !color.Equals(Color.Transparent) ? color.Value @@ -774,7 +778,7 @@ namespace ImageProcessor { if (this.ShouldProcess) { - Watermark watermark = new Watermark { DynamicParameter = textLayer }; + var watermark = new Watermark { DynamicParameter = textLayer }; this.CurrentImageFormat.ApplyProcessor(watermark.ProcessImage, this); } @@ -796,7 +800,7 @@ namespace ImageProcessor if (this.ShouldProcess) { // ReSharper disable once AssignNullToNotNullAttribute - DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(filePath)); + var directoryInfo = new DirectoryInfo(Path.GetDirectoryName(filePath)); if (!directoryInfo.Exists) { directoryInfo.Create(); From 0712c08c594448ae0932349b0f7b9459b7f96ee9 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 22:53:25 +0200 Subject: [PATCH 27/35] Adds a few more unit tests Former-commit-id: e7407d2bc753aac4bf9f3f0acf55d160149efb68 --- .../ImageFactoryUnitTests.cs | 122 +++++++++++++++++- 1 file changed, 119 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index f81fd1c5b..ac5de24a4 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -74,7 +74,7 @@ namespace ImageProcessor.UnitTests /// Tests that a filter is really applied by checking that the image is modified /// [Test] - public void ApplyEffectAlpha() + public void TestApplyEffectAlpha() { foreach (var fileName in ListInputFiles()) { @@ -92,7 +92,7 @@ namespace ImageProcessor.UnitTests /// Tests that a filter is really applied by checking that the image is modified /// [Test] - public void ApplyEffectBrightness() + public void TestApplyEffectBrightness() { foreach (var fileName in ListInputFiles()) { @@ -106,11 +106,85 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectContrast() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Contrast(50); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that all filters can be applied + /// + [Test] + public void TestApplyEffectFilter() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.BlackWhite); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Comic); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Gotham); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.GreyScale); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.HiSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Invert); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Lomograph); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.LoSatch); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Polaroid); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + + imageFactory.Filter(Imaging.Filters.MatrixFilters.Sepia); + Assert.AreNotEqual(original, imageFactory.Image); + imageFactory.Reset(); + } + } + } + /// /// Tests that the image is well resized using constraints /// [Test] - public void ApplyConstraints() + public void TestResizeConstraints() { const int maxSize = 200; foreach (var fileName in ListInputFiles()) @@ -126,5 +200,47 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is well cropped + /// + [Test] + public void TestCrop() + { + const int maxSize = 20; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Crop(new System.Drawing.Rectangle(0, 0, maxSize, maxSize)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + } + } + } + + /// + /// Tests that the image is well cropped + /// + [Test] + public void TestCropWithCropLayer() + { + const int maxSize = 20; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Crop(new Imaging.CropLayer(0, 0, maxSize, maxSize, Imaging.CropMode.Pixels)); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(maxSize, imageFactory.Image.Width); + Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From f9561cead061b903479231882efa56399f5e464e Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 23:11:58 +0200 Subject: [PATCH 28/35] Adds a few more unit tests Former-commit-id: dbb26885a48c55480ce771d885a46d7726af0576 --- .../ImageFactoryUnitTests.cs | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index ac5de24a4..7dd09e078 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -124,6 +124,42 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectBlur() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianBlur(5); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectBlurWithLayer() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianBlur(new Imaging.GaussianLayer() { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that all filters can be applied /// @@ -242,5 +278,31 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is flipped + /// + [Test] + public void TestFlip() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Flip(true); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); + imageFactory.Reset(); + + imageFactory.Flip(false); + Assert.AreNotEqual(original, imageFactory.Image); + Assert.AreEqual(original.Width, imageFactory.Image.Width); + Assert.AreEqual(original.Height, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From eba58ebf8e0b4f004b093812d17f5aa873355978 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sat, 28 Jun 2014 23:22:35 +0200 Subject: [PATCH 29/35] Adds a few more unit tests Former-commit-id: f0987ec15552263ee8b2915d25d51514b5db2c31 --- .../ImageFactoryUnitTests.cs | 82 ++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 7dd09e078..60db9a8ee 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -154,7 +154,43 @@ namespace ImageProcessor.UnitTests { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.GaussianBlur(new Imaging.GaussianLayer() { Sigma = 10, Size = 5, Threshold = 2 }); + imageFactory.GaussianBlur(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSharpen() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(5); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSharpenWithLayer() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.GaussianSharpen(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); Assert.AreNotEqual(original, imageFactory.Image); } } @@ -228,9 +264,7 @@ namespace ImageProcessor.UnitTests using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); - Assert.AreNotEqual(original, imageFactory.Image); Assert.LessOrEqual(imageFactory.Image.Width, maxSize); Assert.LessOrEqual(imageFactory.Image.Height, maxSize); } @@ -304,5 +338,47 @@ namespace ImageProcessor.UnitTests } } } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestResize() + { + const int newSize = 150; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Resize(new System.Drawing.Size(newSize, newSize)); + Assert.AreEqual(newSize, imageFactory.Image.Width); + Assert.AreEqual(newSize, imageFactory.Image.Height); + } + } + } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestResizeWithLayer() + { + const int newSize = 150; + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Resize(new Imaging.ResizeLayer( + new System.Drawing.Size(newSize, newSize), + Imaging.ResizeMode.Stretch, + Imaging.AnchorPosition.Left, + true)); + Assert.AreEqual(newSize, imageFactory.Image.Width); + Assert.AreEqual(newSize, imageFactory.Image.Height); + } + } + } } } \ No newline at end of file From e4a74e2e5aa23ac8a2578670cbd34d34463ff517 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 00:37:38 +0200 Subject: [PATCH 30/35] Yet a few other unit tests Former-commit-id: bd37755a47b8159d62b6eeb906fe8514ec51aad2 --- .../ImageFactoryUnitTests.cs | 182 ++++++++++++++---- 1 file changed, 146 insertions(+), 36 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 60db9a8ee..d868b2245 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -11,8 +11,8 @@ namespace ImageProcessor.UnitTests { using System; - using System.IO; using System.Collections.Generic; + using System.IO; using NUnit.Framework; /// @@ -21,15 +21,6 @@ namespace ImageProcessor.UnitTests [TestFixture] public class ImageFactoryUnitTests { - /// - /// Lists the input files in the Images folder - /// - /// The list of files. - private static IEnumerable ListInputFiles() - { - return Directory.GetFiles("./Images"); - } - /// /// Tests the loading of image from a file /// @@ -45,10 +36,9 @@ namespace ImageProcessor.UnitTests Assert.IsNotNull(imageFactory.Image); } } - } - /// > + /// /// Tests the loading of image from a memory stream /// [Test] @@ -124,6 +114,84 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectSaturation() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Saturation(50); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectTint() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Tint(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectVignette() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Vignette(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestApplyEffectWatermark() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.Watermark(new Imaging.TextLayer + { + Font = "Arial", + FontSize = 10, + Position = new System.Drawing.Point(10, 10), + Text = "Lorem ipsum dolor" + }); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that a filter is really applied by checking that the image is modified /// @@ -252,21 +320,39 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that a filter is really applied by checking that the image is modified + /// + [Test] + public void TestRoundedCorners() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = imageFactory.Image.Clone(); + imageFactory.RoundedCorners(new Imaging.RoundedCornerLayer(5, true, true, true, true)); + Assert.AreNotEqual(original, imageFactory.Image); + } + } + } + /// /// Tests that the image is well resized using constraints /// [Test] public void TestResizeConstraints() { - const int maxSize = 200; + const int MaxSize = 200; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Constrain(new System.Drawing.Size(maxSize, maxSize)); - Assert.LessOrEqual(imageFactory.Image.Width, maxSize); - Assert.LessOrEqual(imageFactory.Image.Height, maxSize); + imageFactory.Constrain(new System.Drawing.Size(MaxSize, MaxSize)); + Assert.LessOrEqual(imageFactory.Image.Width, MaxSize); + Assert.LessOrEqual(imageFactory.Image.Height, MaxSize); } } } @@ -277,17 +363,17 @@ namespace ImageProcessor.UnitTests [Test] public void TestCrop() { - const int maxSize = 20; + const int MaxSize = 20; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Crop(new System.Drawing.Rectangle(0, 0, maxSize, maxSize)); + imageFactory.Crop(new System.Drawing.Rectangle(0, 0, MaxSize, MaxSize)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } } @@ -298,17 +384,17 @@ namespace ImageProcessor.UnitTests [Test] public void TestCropWithCropLayer() { - const int maxSize = 20; + const int MaxSize = 20; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); var original = imageFactory.Image.Clone(); - imageFactory.Crop(new Imaging.CropLayer(0, 0, maxSize, maxSize, Imaging.CropMode.Pixels)); + imageFactory.Crop(new Imaging.CropLayer(0, 0, MaxSize, MaxSize, Imaging.CropMode.Pixels)); Assert.AreNotEqual(original, imageFactory.Image); - Assert.AreEqual(maxSize, imageFactory.Image.Width); - Assert.LessOrEqual(maxSize, imageFactory.Image.Height); + Assert.AreEqual(MaxSize, imageFactory.Image.Width); + Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); } } } @@ -345,15 +431,15 @@ namespace ImageProcessor.UnitTests [Test] public void TestResize() { - const int newSize = 150; + const int NewSize = 150; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Resize(new System.Drawing.Size(newSize, newSize)); - Assert.AreEqual(newSize, imageFactory.Image.Width); - Assert.AreEqual(newSize, imageFactory.Image.Height); + imageFactory.Resize(new System.Drawing.Size(NewSize, NewSize)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } } @@ -364,21 +450,45 @@ namespace ImageProcessor.UnitTests [Test] public void TestResizeWithLayer() { - const int newSize = 150; + const int NewSize = 150; foreach (var fileName in ListInputFiles()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(fileName); - imageFactory.Resize(new Imaging.ResizeLayer( - new System.Drawing.Size(newSize, newSize), - Imaging.ResizeMode.Stretch, - Imaging.AnchorPosition.Left, - true)); - Assert.AreEqual(newSize, imageFactory.Image.Width); - Assert.AreEqual(newSize, imageFactory.Image.Height); + imageFactory.Resize(new Imaging.ResizeLayer(new System.Drawing.Size(NewSize, NewSize), Imaging.ResizeMode.Stretch, Imaging.AnchorPosition.Left)); + Assert.AreEqual(NewSize, imageFactory.Image.Width); + Assert.AreEqual(NewSize, imageFactory.Image.Height); } } } + + /// + /// Tests that the image is resized + /// + [Test] + public void TestRotate() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Rotate(90); + Assert.AreEqual(original.Height, imageFactory.Image.Width); + Assert.AreEqual(original.Width, imageFactory.Image.Height); + } + } + } + + /// + /// Lists the input files in the Images folder + /// + /// The list of files. + private static IEnumerable ListInputFiles() + { + return Directory.GetFiles("./Images"); + } } } \ No newline at end of file From ad744d5ab6d562dc602859c3c864529fc28cba44 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 00:41:53 +0200 Subject: [PATCH 31/35] Adds tests for saving the files Former-commit-id: bab7f1273663d36a546e323f680cac1d7c622284 --- .../ImageFactoryUnitTests.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index d868b2245..880871cc7 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -60,6 +60,45 @@ namespace ImageProcessor.UnitTests } } + /// + /// Tests that the save method actually saves a file + /// + [Test] + public void TestSaveToDisk() + { + foreach (var fileName in ListInputFiles()) + { + var outputFileName = string.Format("./output/{0}", Path.GetFileName(fileName)); + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + imageFactory.Save(outputFileName); + Assert.AreEqual(true, File.Exists(outputFileName)); + } + } + } + + /// + /// Tests that the save method actually writes to memory + /// + [Test] + public void TestSaveToMemory() + { + foreach (var fileName in ListInputFiles()) + { + using (var imageFactory = new ImageFactory()) + { + imageFactory.Load(fileName); + using (var s = new MemoryStream()) + { + imageFactory.Save(s); + s.Seek(0, SeekOrigin.Begin); + Assert.AreEqual(true, s.Capacity > 0); + } + } + } + } + /// /// Tests that a filter is really applied by checking that the image is modified /// From 2b748ce683502cfb4be9aebd760007fd41a16e44 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 11:09:25 +0200 Subject: [PATCH 32/35] Removes unnecessary images Former-commit-id: 2b75ccda89d49667260a2d21b0c5ea7754107f3a --- .../Images/Chrysanthemum.jpg.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id | 1 - src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id | 1 - 5 files changed, 5 deletions(-) delete mode 100644 src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id delete mode 100644 src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id diff --git a/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id deleted file mode 100644 index d067665c9..000000000 --- a/src/ImageProcessor.UnitTests/Images/Chrysanthemum.jpg.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -757c2a628dd03b1cbe4b3ef07c153897a702b57a \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id deleted file mode 100644 index 228aac3ab..000000000 --- a/src/ImageProcessor.UnitTests/Images/Desert.jpg.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -0b88c91336ff8073f34d21ccd683a01f0e0995da \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id deleted file mode 100644 index 74f69293c..000000000 --- a/src/ImageProcessor.UnitTests/Images/Penguins.bmp.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8150b46ab27c62ba51aaba551eef3f1a30f08de9 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id deleted file mode 100644 index ce873d473..000000000 --- a/src/ImageProcessor.UnitTests/Images/Penguins.gif.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -6ad3b846d4697584ff601ac481b14a4d3bbb5736 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id deleted file mode 100644 index aeca7b93c..000000000 --- a/src/ImageProcessor.UnitTests/Images/cmyk.png.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -db4d55a332254cd6b41336c06f207682bf5a966f \ No newline at end of file From 6ffa901479968d83ada5d48e0eaa40bbaaf89f68 Mon Sep 17 00:00:00 2001 From: Thomas Broust Date: Sun, 29 Jun 2014 11:33:05 +0200 Subject: [PATCH 33/35] Filters the source images a bit, in order to speed up the unit tests + descriptive name Former-commit-id: bcdb5097fee49ef671a3150815e1a7b4f11721fd --- .../ImageProcessor.UnitTests.csproj | 24 ++++++++++++++++++ .../Images/autorotate.jpg.REMOVED.git-id | 1 + .../cmyk-profile-euroscale.jpg.REMOVED.git-id | 1 + .../Images/cmyk.jpg.REMOVED.git-id | 1 + .../color-vision-test.gif.REMOVED.git-id | 1 + .../Images/exif-Tulips.jpg.REMOVED.git-id | 1 + .../Images/exif-rocks.jpg.REMOVED.git-id | 1 + .../format-Penguins-8bit.png.REMOVED.git-id | 1 + .../Images/format-Penguins.bmp.REMOVED.git-id | 1 + .../Images/format-Penguins.gif.REMOVED.git-id | 1 + .../Images/format-Penguins.jpg.REMOVED.git-id | 1 + .../Images/format-Penguins.png.REMOVED.git-id | 1 + .../Images/format-Penguins.tif.REMOVED.git-id | 1 + .../Images/format-animated.gif | Bin 0 -> 22525 bytes .../Images/hi-color.png | Bin 0 -> 1539 bytes .../Images/hi-contrast.jpg | Bin 0 -> 51058 bytes .../Images/hi-saturation.jpg | Bin 0 -> 33850 bytes .../profile-adobe-rgb.jpg.REMOVED.git-id | 1 + .../Images/profile-srgb.jpg.REMOVED.git-id | 1 + .../Images/size-Penguins-200.jpg | Bin 0 -> 10119 bytes .../Images/text-over-transparent.png | Bin 0 -> 7317 bytes .../Images/udendørs.jpg.REMOVED.git-id | 1 + 22 files changed, 39 insertions(+) create mode 100644 src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/format-animated.gif create mode 100644 src/ImageProcessor.UnitTests/Images/hi-color.png create mode 100644 src/ImageProcessor.UnitTests/Images/hi-contrast.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/hi-saturation.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/profile-adobe-rgb.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/profile-srgb.jpg.REMOVED.git-id create mode 100644 src/ImageProcessor.UnitTests/Images/size-Penguins-200.jpg create mode 100644 src/ImageProcessor.UnitTests/Images/text-over-transparent.png create mode 100644 src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index c0311d476..4d47bb062 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -308,6 +308,27 @@ Images\udendørs.jpg PreserveNewest + + + + + + + + + + + + + + + + + + + + + @@ -317,4 +338,7 @@ + + + \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id new file mode 100644 index 000000000..19785c8e5 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/autorotate.jpg.REMOVED.git-id @@ -0,0 +1 @@ +85a8ae18f9955def2b42ba9240bce4de1bfe5781 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id new file mode 100644 index 000000000..7747bdaae --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/cmyk-profile-euroscale.jpg.REMOVED.git-id @@ -0,0 +1 @@ +13492524f9d984c12adfe6183a4c1d92fb11ec4e \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id new file mode 100644 index 000000000..30b05146b --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/cmyk.jpg.REMOVED.git-id @@ -0,0 +1 @@ +ed725726e4ac1ffeac821664af14865a66fa933f \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id new file mode 100644 index 000000000..5c4f4195d --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/color-vision-test.gif.REMOVED.git-id @@ -0,0 +1 @@ +35a926115b13b61dc37308f8d903b42d14f92924 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id new file mode 100644 index 000000000..84b9aff85 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/exif-Tulips.jpg.REMOVED.git-id @@ -0,0 +1 @@ +54c51eb6a86f31a42433b8167470fb18dad32c7d \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id new file mode 100644 index 000000000..41c6c25df --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/exif-rocks.jpg.REMOVED.git-id @@ -0,0 +1 @@ +33b6912af301bf216ee81d82b2c3ce6c49e03021 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id new file mode 100644 index 000000000..aa9a70e0f --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins-8bit.png.REMOVED.git-id @@ -0,0 +1 @@ +c3d556d9d486b8b8b49cdbcc9c12a9d3a2db4c1f \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id new file mode 100644 index 000000000..74f69293c --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.bmp.REMOVED.git-id @@ -0,0 +1 @@ +8150b46ab27c62ba51aaba551eef3f1a30f08de9 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id new file mode 100644 index 000000000..ce873d473 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.gif.REMOVED.git-id @@ -0,0 +1 @@ +6ad3b846d4697584ff601ac481b14a4d3bbb5736 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id new file mode 100644 index 000000000..ad4371113 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.jpg.REMOVED.git-id @@ -0,0 +1 @@ +030ab8a685bebb796c24cc710edd9e69859164f6 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id new file mode 100644 index 000000000..78062a0e7 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.png.REMOVED.git-id @@ -0,0 +1 @@ +a2c796fbb7de948230a22982ab74892891dd5198 \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id new file mode 100644 index 000000000..5f7b97e71 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/format-Penguins.tif.REMOVED.git-id @@ -0,0 +1 @@ +c789aaec248568c24394b05c02db4233e0c5a4eb \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/Images/format-animated.gif b/src/ImageProcessor.UnitTests/Images/format-animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..03fce3f3a5b70ca8463cefdd94c00e9c7fdbab0f GIT binary patch literal 22525 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 *EHnj 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 literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/hi-contrast.jpg b/src/ImageProcessor.UnitTests/Images/hi-contrast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd2c9b90248231317b880634eac8f98f2dbdf6a7 GIT binary patch literal 51058 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 literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/hi-saturation.jpg b/src/ImageProcessor.UnitTests/Images/hi-saturation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..909fa4fc55d43e54c2e4ef54021b1fb7275676a0 GIT binary patch literal 33850 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 literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/text-over-transparent.png b/src/ImageProcessor.UnitTests/Images/text-over-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..21ebe3883c94844039cc07ad91487339b3ed1f34 GIT binary patch literal 7317 zcmdUUS5y>TlyxCUY?6|57LlBDPKsm@kYt0<(*h{IQ zfyekYKNdGJF)V@FkRSAxc$Q$3y)ZHIW9-`@^jgqI*Xa(__UKLHjN(q^X->l!K@TA) zU0cjhA`Dcf%0jssIoLn2wkfC_PR!*6P!Kk}WcR^v;sBRWdHF{iJp^3Y4;Q*HZuv6pYCj)Hv9b(l1Cpn;U?Acolz+4!ha@6UU0cHgN;m2l<+CXhH z(1WBPsRsx_fUsd~^g{qI2zc?8lQRH_$^@u1Pt4?hKdPqK;lp|=vtGWHOGYEyl2E{# zz|2gLg%|ml_7RmN_zpNrS+FlKlU_7joP70k1OW1rsj=3cVgit4)kvgdViTFIz+N~0 zEr*@m#?97Pg_kk_tocGGZuo^77{cW6!`yEQxsULiY)JB7qv9Rw$(0*{{M~u8Q?I|i z(I|M|IybkqxjFl!U)2&kWEOG*>9g%I!?;~R<*!lat6l3{;iA^zT6mYMeIsX2i^HFUW-t$gW&q_EIE#`<*O?mi*`}^(7^%Z_JuHuRW zQ0t}OTNv>Z=MyYc3_o-5-62A;%diCOAWrQj( zY_yh{?}gA0WoGdnLnm0O7nxw6X$zTx7x^DBVQw#PM>r9l%2&esVD|Y~9J{yXoQZ_A znbDW*z1n#9;tHb3X|y`=j>6hX0S{Zd@_;?zVRw7$Rd zxUR_L`@Qd)-#v^tclpb*#kCnYQ@_o>bgd_l`G=qF(bwqBoK3{0*e2s9`-vrSj-9f1 z(WUV^uhEdp6Z$QRE%7aUhYV2_(~nt3OP>l%C?%4ft5y{>8PyoZe7Z0GI!k6WlIF2a zaaCd3B!d&J6Uw>fr*9kOQW}dMeBA8&@UGTR_)pw3e-J5*I&v@;!b_h`M?eRm_ou7L zcv?a~8BafGA}l4cpRtokp6O|7&ey~jOr1PLoc1J*CykL$$fT^iqBTlv)$+z zU?Z`oZwTOLcO|WWy$+Y?=cyZ=3-;q{&%iLZ$19YV709TGJrOf&FgpFmQHfw9!~61s zuO873Zz=o~`gWP>_~H6P#uD+Tts)LquI1_Qbn^=B3d0Jm{Z7g1!_u6RPK|a8bU2yH z;FAYd540dj$h$c^#&gC?rNpH)x(c%A)q>@&#f$~*>i*pxrAHaLT{dC4Pd!VQ13P#A zFog(VOfc?$O3$@G=J*XDF8l=$l1~1MgtwtkpDQP z`A(BO!Fj-HgKNWmzi-%a0|%9`nGw`TDds+-)KLckC^T1fMkYQ#}$XKF}W$UBSz0cp$}Sq1ZR zW~k5SS5&gkWS6s$AC8nlzMQ4+3PH@rD8^>RHk$4aKkRqTG0vXUg3v-*eIid|Jnvzyg_zGc;;Y)K z;nsu_NnV<;>q;e5Urj$8(zwGZWG|F#Ry9-GTVUMRlG+fdw)ms%EGwy+(M z>S_MkJgkrK%(abPQ48g~eR=!lb^<63KhgLAD+JhASPS>uv zvcEWUXsvH9WUdsvJ=W|&_f9uOJ$M252 z+sgvEmSpMW@NGDm2kG4WXVR5tpAXM3G!}&5qr404kxgo?AG_sSIvh&BAxGtuOo~j- zO#YZi9(`YG1kYT0OdK%=bzF!aOf6V;pfHNxx)w}vOm(LmryS6a(G4i2>bUaV%XGB6 zb(NmG_u(M!cU%ksCt1@>>yIhs?+PYHNz;$^wa5lpyKZuh{RK!RNlo8<7+B}@QV-nR zMG>u_SV(2({StyI*9azA{g@%lLN2OVCs~@=##v}fJIglx5ygq=z2!I8S_`b?AH?M? z0-v0kd~=@PjhIY@oQx&pq~(M_1+NxgEEF~c?bst%T*y6-+bDe3zH8jZ@5pt?A+1hY zd{62Zw(gs?m}S+-+Pd%g?#bVzPU;V~e`wFDZnbi4J$lpG803iBWz3aAE}eA-{-(K| zp30R`Sn51|d^17JySkZnNwSenNqU6S)4sy40Y-8 z&p(}5)I#A$M~>YjpC^&4-A&3&8itX=_H(5bWn|WsUSW2xOV!3+j`8Hu-W1*pSJTo6 zK`*EFXOI&a69w=ScxtzMa4}}DXP>@iVW4k-rR!UOn262UGxTAv|Dr$h@y8W%{mo#u zP~KaotGaXJ@ltdueQN409&X0zwY`|Y0=C{{v)4A#1%Nl)01y@l09Uuz`z`>y76yR5 z7XToe0RXg~DYjoU0f4gSvAT*$!2H3|X!86lL)h9_bIFja;~L;aD2>N-CkHU~C0t@3 zXBRis%O?U8f(d)^dhE;__S%&hh83>0^Yd`!^-X82;D;XUTq~!qiazQeA0OiYKu^e@ zJnO$uh_Me8*oqj4RmBeK?AW1@0y`LDYm+cuJOEIpy7TXu_U}XV-|*JI)0O`<@c&&7 zC|lpul7y8*gRia`C?jLd)%$rk(xX>wxLUqp4qPcH5eK0{oa+VsD~ArD#~+hw+IJ6G zH2UQ^Y@W|UJ{~~G8*It-4$V57(v(2V%5%o>M<)9KW4S#cZQ}{YSyT{O;>7GHKfbxlOd%D+UH+g=_EL-T$s`r3?cpe&9h&+0>U zG$)n`^g9oBFz8-Hl2BfJw-RejGdWJIYS?{z|H~{|)*HF_*zUqs{nLenK4+RJR`>ew zlL8$Tbad}U9kwSluV9*}5KC-qf;69yYZ?(Fw!#Us2G+=5IWl*^pnk}AdL1=a2{zEH zos!L~l+b)HZ7_XJl9V39Zo*f-cG+;q!Hf#n z03|}R_alC3D-5Baw8LF)U6M8Cq%hUd&Fs3B*ckXZwAH>G+;XfIx5IfHn2plf7K@zZ zT#y}0Jiek|30+ZWLR`MK2)G?N{%cTYWWpjp)Vkhp7bP!g(EZXo4GK08uk`-aAT45G z`|O%N9=AZkotM}ag$M46)t;K`l;_&9a3W)JZDesBCJD8rJ6euh%f(Djha`VI_^{6` z6Pndx8;~5Lpe2R^;Y#&!J`DSgWuO(4iGrhTnUGQK5WeNgM%%Nn5rVh6BQH1M)ghq1 zK@x&*6>dsGu7os$^T&ohdpmy4DR=dU(y<21p4Eq(Ha#Gen)Aj;WLYbh)5Rv$wf~q+ zU}GZ=Z`cx3ZutF1uD$OtZ-&moowT1;g8T*g_sZ~0y5Y*xv2BFnvelc)M)4P2+x7y{ zrpigyG?@{C7luN9s7O6BCRSTH*(P`$dUd_^r95sS#j27D<-~HsNftw;tufVfC&zkM zc+k@EP9Y4lVeWcs-u}b5MO;McYlPQI@sFhB9!`aU{X?B=6e9m!GnqQOa%T7+w~poN z>Pv~rqiYPK1f9@p=os|C(U8e?X3LcBMouk&moPQ+3R!)ban}pQFOF;Cy{iBzGq;)B z52$>&cyV{Fus7tuyuHi5s#-Wf?%g|i!k{t&aBuv30(EwS`Lr<#nvnMT!zx#{xow}@ zbXt#QdtJKe5c#I_HdGE|tW5JHpwk+2c@oG2TI*^JrdoxbSzcRIXro2$T9u3(>~vZ` zY4bE)k=HivmYQ}c!cwl~eq^Fr@`B+->l<`#Okl;%bitHa%^HHzkg$*~G*whXOT?gj!i;4_VgxVVD)QaI9R?7>zQTKX=*q`Q@+^y`Eaf0137cZ_ z6=NLvdFnzN)umrvvh(PT!j@jqv1D;qZUp93(bqH!If7KE?s%ceNDa_+mRz{Vy13Y5 ze+Jk`>ENsL#R4ol0V5x`@f)i2A}zYy`_b&gIEI8hjnWd@oy}T=H6E2zwFkEJRC96*}*rNUI}uRUKVr4yEj^J^?9E($ZJK*MCyO8DgjOJdR+ z=0Sp2A-0~s&T+X8$=iW^%GbyM@xV|c7MQ8vQucs{%uS5f@sCc~9nrCCZ{E^Ep-`@& zk4vC&GO=i2*HyOTM7Z+A=fnb$+#K^3Y|eARlYEg-@CA;oNqTfOz$~zp!g&t*&e#AF zcFrk;2l_K$Y!p^<$srVH$n!_(OLBtD*eX&cO(JOZTflg`T*^V`cEvN|*B6gwU zAMrG5lcZ6{qfV`>LHO8Jw+d_3zs)6^$Wy~o`;im&ZHffXD1SrLgNM4h29FTA^{lh}^@P_x9m`OLn&t=! zEDxA7;Y?wY+_qtk&(@AXh3)iu)syz$><=Uggssx0$&Kp2-nn*-3)QFDIKMy#bmk<@ zST@{X!$CWEbq=O0=@eQ?QJPwN3EGVYXNRZm`GBOjFHRTN{>H>vQEiVJRK|JEJrjoQ z4IY8^uitO|!1O&-TD&n~vNXWQem?FhYn)9W)Ji zV0@#z>BN*YvkVJ1l zASm%w5}}tTyQzEO;!tzvY?a@F23_@f8-xT0yGUb38ljpP&!P)mZd<||D#5(JIQ;Ly z#va@x(BJnE0nu_d4R1|iiM}e>@qvylUR973VGMWK2G4GfEEe|r#i?S6?j@CItvTNu z)FKRGT|fIs)kcUgP8zSBz4uot7%QZqNojMcf^`W?32SA-OrM!x4fhtrNl`R^13_-> z%5l+>&SU*-!{QB?+6KEE8*#z8aImX$_Rt88qK5yN2_7~mK1&*VyG^`%*Sxmv`?|(y zPMArv-<4$WMdn=JSB@!%qQByCKXP_y=0|ZccFvisV(w7XS`h_ImnBk&yDRiot>_L` z9iC5~@8v!6#EFXnr?Tj{4Qtc=1)-y$ah@h0B=BXeAgE+}xhdYfwJ}#X*ad8vi>*PL zIH<9x%(fVg8+Kjtq2D5?bv;iD4xdX;YqNnC0*)cned7u+EC60c ziL<>J^m3`Gonb)yV3w)Ca15ByX8la^#ds2hc4kHBf1fm!eSqK{(RG*!bONaJww;X}yY0kP$yi71)tsB7EjX@k+=Rmt51V&pt$8xbgDsew!5M<}-z3 zt#l)o?N{w%w{Om$P+y}fIcr6;{(1#Kk4K0mV=$s91DWX|M$OjD9_Ppfc?EAl{(Be- zHYM9GP1%ZIkM)_oqEz1Q%gLXJz-GP=rNg*`x=>^~rrCv(1{TroP(mTSkSP{@#pdvy z)T-R7ujQ?6UiuDhmo5qJcj!eLfgwC{*b~yRta2cD>b56}(3Q;i!0i`ngRXmaj))2o z`+j9Mm6sR#?g@+3@MYtt@p=mSvY&@U2opz{nCPFb=vRxn7hR(R`|jmna_n~DfBZG> z0KdvdkLT~c_Yo|u+;bk2bgQp{er~W^6^*af>2o!r3!84$J=ON{`^Avd=zI_=-`lz% zAMYX-TSK6FW?)5@)UWv#PDyKP`xf3sM#5@mlDSo3mmDH6xPQojO_bv*RLj}H1Kf?h zX5Ql#*T)4oQ124{yyW?SpjOo@g%I-OBZnH+TMXSn+^>*{OK-^_!%Ks;=2~neoQQ`F zAplrSruuicx&LWzhSkM?b$|Z<1O9*FVB!A(XCpquQsjT+{KM${76-Tu5rN02MPq;a P0Kj7nJ@snU7ZLvfNs}N= literal 0 HcmV?d00001 diff --git a/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id b/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id new file mode 100644 index 000000000..0db1445a2 --- /dev/null +++ b/src/ImageProcessor.UnitTests/Images/udendørs.jpg.REMOVED.git-id @@ -0,0 +1 @@ +4d040d9aa3519b3d2303419d1f03eebebf88e956 \ No newline at end of file From 7c5627cd1dd8a9ff108f0a1a6aa5395b633b2f77 Mon Sep 17 00:00:00 2001 From: James South Date: Sun, 29 Jun 2014 11:53:20 +0100 Subject: [PATCH 34/35] Fixing tests to work on Windows. Former-commit-id: 23664e1cac0916c0cc493769b7f9ebe0de78e981 --- build/Build.bat | 2 +- .../ImageFactoryUnitTests.cs | 248 ++++++++++-------- .../ImageProcessor.UnitTests.csproj | 6 +- src/ImageProcessor/ImageFactory.cs | 4 +- .../Imaging/Formats/FormatUtilities.cs | 2 +- 5 files changed, 147 insertions(+), 115 deletions(-) diff --git a/build/Build.bat b/build/Build.bat index 513d111e3..21c4eb0a4 100644 --- a/build/Build.bat +++ b/build/Build.bat @@ -20,7 +20,7 @@ ECHO Packing the NuGet release files ..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.nuspec -Version %version% ..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Web.nuspec -Version %webversion% ..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Web.Config.nuspec -Version %webconfigversion% - +PAUSE IF ERRORLEVEL 1 GOTO :showerror diff --git a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs index 880871cc7..c5f569a39 100644 --- a/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs +++ b/src/ImageProcessor.UnitTests/ImageFactoryUnitTests.cs @@ -12,7 +12,9 @@ namespace ImageProcessor.UnitTests { using System; using System.Collections.Generic; + using System.Drawing; using System.IO; + using System.Linq; using NUnit.Framework; /// @@ -21,18 +23,23 @@ namespace ImageProcessor.UnitTests [TestFixture] public class ImageFactoryUnitTests { + /// + /// The list of images. Designed to speed up the tests a little. + /// + private IEnumerable images; + /// /// Tests the loading of image from a file /// [Test] public void TestLoadImageFromFile() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - Assert.AreEqual(fileName, imageFactory.ImagePath); + imageFactory.Load(file.FullName); + Assert.AreEqual(file.FullName, imageFactory.ImagePath); Assert.IsNotNull(imageFactory.Image); } } @@ -44,13 +51,13 @@ namespace ImageProcessor.UnitTests [Test] public void TestLoadImageFromMemory() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - byte[] photoBytes = File.ReadAllBytes(fileName); + byte[] photoBytes = File.ReadAllBytes(file.FullName); - using (var inStream = new MemoryStream(photoBytes)) + using (MemoryStream inStream = new MemoryStream(photoBytes)) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { imageFactory.Load(inStream); Assert.AreEqual(null, imageFactory.ImagePath); @@ -66,12 +73,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestSaveToDisk() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - var outputFileName = string.Format("./output/{0}", Path.GetFileName(fileName)); - using (var imageFactory = new ImageFactory()) + string outputFileName = string.Format("./output/{0}", file.Name); + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); + imageFactory.Load(file.FullName); imageFactory.Save(outputFileName); Assert.AreEqual(true, File.Exists(outputFileName)); } @@ -84,12 +91,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestSaveToMemory() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - using (var s = new MemoryStream()) + imageFactory.Load(file.FullName); + using (MemoryStream s = new MemoryStream()) { imageFactory.Save(s); s.Seek(0, SeekOrigin.Begin); @@ -105,12 +112,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectAlpha() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Alpha(50); Assert.AreNotEqual(original, imageFactory.Image); } @@ -123,12 +130,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBrightness() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Brightness(50); Assert.AreNotEqual(original, imageFactory.Image); } @@ -141,12 +148,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectContrast() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Contrast(50); Assert.AreNotEqual(original, imageFactory.Image); } @@ -159,12 +166,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSaturation() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Saturation(50); Assert.AreNotEqual(original, imageFactory.Image); } @@ -177,13 +184,13 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectTint() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); - imageFactory.Tint(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Tint(Color.FromKnownColor(KnownColor.AliceBlue)); Assert.AreNotEqual(original, imageFactory.Image); } } @@ -195,13 +202,13 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectVignette() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); - imageFactory.Vignette(System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.AliceBlue)); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Vignette(Color.FromKnownColor(KnownColor.AliceBlue)); Assert.AreNotEqual(original, imageFactory.Image); } } @@ -213,19 +220,19 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectWatermark() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Watermark(new Imaging.TextLayer - { - Font = "Arial", - FontSize = 10, - Position = new System.Drawing.Point(10, 10), - Text = "Lorem ipsum dolor" - }); + { + Font = "Arial", + FontSize = 10, + Position = new Point(10, 10), + Text = "Lorem ipsum dolor" + }); Assert.AreNotEqual(original, imageFactory.Image); } } @@ -237,12 +244,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBlur() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.GaussianBlur(5); Assert.AreNotEqual(original, imageFactory.Image); } @@ -255,12 +262,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectBlurWithLayer() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.GaussianBlur(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); Assert.AreNotEqual(original, imageFactory.Image); } @@ -273,12 +280,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSharpen() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.GaussianSharpen(5); Assert.AreNotEqual(original, imageFactory.Image); } @@ -291,12 +298,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectSharpenWithLayer() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.GaussianSharpen(new Imaging.GaussianLayer { Sigma = 10, Size = 5, Threshold = 2 }); Assert.AreNotEqual(original, imageFactory.Image); } @@ -309,12 +316,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestApplyEffectFilter() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Filter(Imaging.Filters.MatrixFilters.BlackWhite); Assert.AreNotEqual(original, imageFactory.Image); @@ -365,12 +372,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestRoundedCorners() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.RoundedCorners(new Imaging.RoundedCornerLayer(5, true, true, true, true)); Assert.AreNotEqual(original, imageFactory.Image); } @@ -384,12 +391,12 @@ namespace ImageProcessor.UnitTests public void TestResizeConstraints() { const int MaxSize = 200; - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - imageFactory.Constrain(new System.Drawing.Size(MaxSize, MaxSize)); + imageFactory.Load(file.FullName); + imageFactory.Constrain(new Size(MaxSize, MaxSize)); Assert.LessOrEqual(imageFactory.Image.Width, MaxSize); Assert.LessOrEqual(imageFactory.Image.Height, MaxSize); } @@ -403,13 +410,13 @@ namespace ImageProcessor.UnitTests public void TestCrop() { const int MaxSize = 20; - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); - imageFactory.Crop(new System.Drawing.Rectangle(0, 0, MaxSize, MaxSize)); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); + imageFactory.Crop(new Rectangle(0, 0, MaxSize, MaxSize)); Assert.AreNotEqual(original, imageFactory.Image); Assert.AreEqual(MaxSize, imageFactory.Image.Width); Assert.LessOrEqual(MaxSize, imageFactory.Image.Height); @@ -424,12 +431,12 @@ namespace ImageProcessor.UnitTests public void TestCropWithCropLayer() { const int MaxSize = 20; - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Crop(new Imaging.CropLayer(0, 0, MaxSize, MaxSize, Imaging.CropMode.Pixels)); Assert.AreNotEqual(original, imageFactory.Image); Assert.AreEqual(MaxSize, imageFactory.Image.Width); @@ -444,12 +451,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestFlip() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Flip(true); Assert.AreNotEqual(original, imageFactory.Image); Assert.AreEqual(original.Width, imageFactory.Image.Width); @@ -471,12 +478,12 @@ namespace ImageProcessor.UnitTests public void TestResize() { const int NewSize = 150; - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - imageFactory.Resize(new System.Drawing.Size(NewSize, NewSize)); + imageFactory.Load(file.FullName); + imageFactory.Resize(new Size(NewSize, NewSize)); Assert.AreEqual(NewSize, imageFactory.Image.Width); Assert.AreEqual(NewSize, imageFactory.Image.Height); } @@ -490,12 +497,12 @@ namespace ImageProcessor.UnitTests public void TestResizeWithLayer() { const int NewSize = 150; - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - imageFactory.Resize(new Imaging.ResizeLayer(new System.Drawing.Size(NewSize, NewSize), Imaging.ResizeMode.Stretch, Imaging.AnchorPosition.Left)); + imageFactory.Load(file.FullName); + imageFactory.Resize(new Imaging.ResizeLayer(new Size(NewSize, NewSize), Imaging.ResizeMode.Stretch, Imaging.AnchorPosition.Left)); Assert.AreEqual(NewSize, imageFactory.Image.Width); Assert.AreEqual(NewSize, imageFactory.Image.Height); } @@ -508,12 +515,12 @@ namespace ImageProcessor.UnitTests [Test] public void TestRotate() { - foreach (var fileName in ListInputFiles()) + foreach (FileInfo file in this.ListInputFiles()) { - using (var imageFactory = new ImageFactory()) + using (ImageFactory imageFactory = new ImageFactory()) { - imageFactory.Load(fileName); - var original = (System.Drawing.Image)imageFactory.Image.Clone(); + imageFactory.Load(file.FullName); + Image original = (Image)imageFactory.Image.Clone(); imageFactory.Rotate(90); Assert.AreEqual(original.Height, imageFactory.Image.Width); Assert.AreEqual(original.Width, imageFactory.Image.Height); @@ -521,13 +528,40 @@ namespace ImageProcessor.UnitTests } } + /// + /// Gets the files matching the given extensions. + /// + /// The . + /// The extensions. + /// A collection of + /// The extensions variable is null. + private static IEnumerable GetFilesByExtensions(DirectoryInfo dir, params string[] extensions) + { + if (extensions == null) + { + throw new ArgumentNullException("extensions"); + } + + IEnumerable files = dir.EnumerateFiles(); + return files.Where(f => extensions.Contains(f.Extension, StringComparer.OrdinalIgnoreCase)); + } + /// /// Lists the input files in the Images folder /// /// The list of files. - private static IEnumerable ListInputFiles() + private IEnumerable ListInputFiles() { - return Directory.GetFiles("./Images"); + if (this.images != null) + { + return this.images; + } + + DirectoryInfo directoryInfo = new DirectoryInfo("./Images"); + + this.images = GetFilesByExtensions(directoryInfo, new[] { ".jpg", ".jpeg", ".png", ".gif", ".tiff", ".bmp", ".webp" }); + + return this.images; } } } \ No newline at end of file diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index 4d47bb062..b020e2858 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -3,7 +3,7 @@ Debug AnyCPU - {03CA9055-F997-428C-BF28-F50F991777C6} + {633B1C4C-4823-47BE-9A01-A665F3118C8C} Library ImageProcessor.UnitTests ImageProcessor.UnitTests @@ -338,7 +338,5 @@ - - - + \ No newline at end of file diff --git a/src/ImageProcessor/ImageFactory.cs b/src/ImageProcessor/ImageFactory.cs index 4a68a5e86..03e92fdde 100644 --- a/src/ImageProcessor/ImageFactory.cs +++ b/src/ImageProcessor/ImageFactory.cs @@ -183,7 +183,7 @@ namespace ImageProcessor this.ImagePath = imagePath; // Open a file stream to prevent the need for lock. - using (var fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) + using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) { ISupportedImageFormat format = FormatUtilities.GetFormat(fileStream); @@ -192,7 +192,7 @@ namespace ImageProcessor throw new ImageFormatException("Input stream is not a supported format."); } - var memoryStream = new MemoryStream(); + MemoryStream memoryStream = new MemoryStream(); // Copy the stream. fileStream.CopyTo(memoryStream); diff --git a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs index 3c6e3b3e0..3ee8cf6cb 100644 --- a/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs +++ b/src/ImageProcessor/Imaging/Formats/FormatUtilities.cs @@ -142,7 +142,7 @@ namespace ImageProcessor.Imaging.Formats // GDI returns a single array with all delays, while Mono returns a different array for each frame image.SelectActiveFrame(frameDimension, i); var times = image.GetPropertyItem(20736).Value; - int thisDelay = BitConverter.ToInt32(times, 4*i % times.Length); + int thisDelay = BitConverter.ToInt32(times, (4 * i) % times.Length); int toAddDelay = thisDelay * 10 < 20 ? 20 : thisDelay * 10; // Minimum delay is 20 ms // Find the frame From aab05b75db866b65cc3e476e4f74ea5a747b7e8b Mon Sep 17 00:00:00 2001 From: James South Date: Sun, 29 Jun 2014 12:35:41 +0100 Subject: [PATCH 35/35] fixing unit test project file. Former-commit-id: b3947dcf2bd94e7f2b96dc4c5f952e072e7f46ff --- .../ImageProcessor.UnitTests.csproj | 349 +++--------------- 1 file changed, 57 insertions(+), 292 deletions(-) diff --git a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj index b020e2858..4cc93cb0f 100644 --- a/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj +++ b/src/ImageProcessor.UnitTests/ImageProcessor.UnitTests.csproj @@ -1,336 +1,95 @@  - + Debug AnyCPU {633B1C4C-4823-47BE-9A01-A665F3118C8C} Library + Properties ImageProcessor.UnitTests ImageProcessor.UnitTests - - + v4.0 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest ..\ true - v4.5 + true full false - bin\Debug - DEBUG; + bin\Debug\ + DEBUG;TRACE prompt 4 - false - false - full + pdbonly true - bin\Release + bin\Release\ + TRACE prompt 4 - false - false - - ..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - + + + + + + + + + + - - - - - {D011A778-59C8-4BFA-A770-C350216BF161} - ImageProcessor.Web_NET45 - - - {3B5DD734-FB7A-487D-8CE6-55E7AF9AEA7E} - ImageProcessor - + - - - - - - - - - - Images\1182076_e8c402e938_z.jpg - - - Images\bus.jpg - - - Images\Chrysanthemum.jpg - - - Images\circle.png - - - Images\cmyk.jpg - - - Images\cmyk.png - - - Images\color-vision-test.gif - - - Images\Desert.jpg - - - Images\emma.jpg - - - Images\falahill_design__160p.jpg - - - Images\fid11246.jpg - - - Images\fid9141.jpg - - - Images\header_1.jpg - - - Images\Hydrangeas.jpg - - - Images\Jellyfish.jpg - - - Images\jrt.jpg - - - Images\Koala.jpg - - - Images\Lighthouse.jpg - - - Images\lomo.jpg - - - Images\meter.gif - - - Images\negative.png - - - Images\negative2.png - - - Images\Penguins-200.jpg - - - Images\Penguins-8.png - - - Images\Penguins.bmp - - - Images\Penguins.gif - - - Images\Penguins.jpg - - - Images\Penguins.png - - - Images\Penguins.tif - - - Images\rocks.jpg - - - Images\rotate.jpg - - - Images\sample1.jpg - - - Images\srgb.jpg - - - Images\srgb.png - - - Images\text.png - - - Images\thor.jpg - - - Images\Tulips.jpg - - - Images\udendørs-374.jpg - - - Images\udendørs.jpg - - - Images\war_horse_quad.jpg - - - Images\WP_000009.jpg - - {3b5dd734-fb7a-487d-8ce6-55e7af9aea7e} ImageProcessor - - - - Images\Chrysanthemum.jpg - PreserveNewest - - - Images\Desert.jpg - PreserveNewest - - - Images\Hydrangeas.jpg - PreserveNewest - - - Images\Jellyfish.jpg - PreserveNewest - - - Images\Koala.jpg - PreserveNewest - - - Images\Lighthouse.jpg - PreserveNewest - - - Images\Penguins-8.png - PreserveNewest - - - Images\Penguins.bmp - PreserveNewest - - - Images\Penguins.gif - PreserveNewest - - - Images\Penguins.jpg - PreserveNewest - - - Images\Penguins.png - PreserveNewest - - - Images\Penguins.tif - PreserveNewest - - - Images\Tulips.jpg - PreserveNewest - - - Images\bus.jpg - PreserveNewest - - - Images\cmyk.jpg - PreserveNewest - - - Images\cmyk.png - PreserveNewest - - - Images\jrt.jpg - PreserveNewest - - - Images\meter.gif - PreserveNewest - - - Images\rocks.jpg - PreserveNewest - - - Images\rotate.jpg - PreserveNewest - - - Images\sample1.jpg - PreserveNewest - - - Images\srgb.jpg - PreserveNewest - - - Images\srgb.png - PreserveNewest - - - Images\text.png - PreserveNewest - - - Images\thor.jpg - PreserveNewest - - - Images\udendørs-374.jpg - PreserveNewest - - - Images\udendørs.jpg - PreserveNewest - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + + @@ -338,5 +97,11 @@ - + \ No newline at end of file