From 44d2736b8fe59d15c37511bc7a86640c02e96cbc Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 17 Mar 2017 15:28:19 +0000 Subject: [PATCH] fix pattern brushes --- .../Brushes/Brushes{TColor}.cs | 40 ++++++++++--------- .../Brushes/PatternBrush{TColor}.cs | 29 ++++++++------ .../Drawing/FillPatternTests.cs | 37 +++++++++-------- 3 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs b/src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs index d77a6d594..6e092bf18 100644 --- a/src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs +++ b/src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs @@ -18,10 +18,9 @@ namespace ImageSharp.Drawing.Brushes /// /// Percent10 Hatch Pattern /// - /// note 2d arrays when configured using initalizer look inverted - /// ---> Y axis + /// ---> x axis /// ^ - /// | X - axis + /// | y - axis /// | /// see PatternBrush for details about how to make new patterns work private static readonly bool[,] Percent10Pattern = @@ -37,10 +36,10 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] Percent20Pattern = { - { true, false, true, false }, - { false, false, false, false }, - { false, true, false, true }, - { false, false, false, false } + { true, false, false, false }, + { false, false, true, false }, + { true, false, false, false }, + { false, false, true, false } }; /// @@ -48,7 +47,10 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] HorizontalPattern = { - { false, true, false, false }, + { false }, + { true }, + { false }, + { false } }; /// @@ -56,7 +58,10 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] MinPattern = { - { false, false, false, true }, + { false }, + { false }, + { false }, + { true } }; /// @@ -64,10 +69,7 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] VerticalPattern = { - { false }, - { true }, - { false }, - { false } + { false, true, false, false }, }; /// @@ -75,10 +77,10 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] ForwardDiagonalPattern = { - { true, false, false, false }, - { false, true, false, false }, + { false, false, false, true }, { false, false, true, false }, - { false, false, false, true } + { false, true, false, false }, + { true, false, false, false } }; /// @@ -86,10 +88,10 @@ namespace ImageSharp.Drawing.Brushes /// private static readonly bool[,] BackwardDiagonalPattern = { - { false, false, false, true }, - { false, false, true, false }, + { true, false, false, false }, { false, true, false, false }, - { true, false, false, false } + { false, false, true, false }, + { false, false, false, true } }; /// diff --git a/src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs b/src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs index a143d6f31..9ebaf811a 100644 --- a/src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs +++ b/src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs @@ -30,15 +30,6 @@ namespace ImageSharp.Drawing.Brushes /// 0 /// 0 /// - /// Warning when use array initializer across multiple lines the bools look inverted i.e. - /// new bool[,]{ - /// {true, false, false}, - /// {false,true, false} - /// } - /// would be - /// 10 - /// 01 - /// 00 /// /// The pixel format. public class PatternBrush : IBrush @@ -56,7 +47,18 @@ namespace ImageSharp.Drawing.Brushes /// Color of the fore. /// Color of the back. /// The pattern. - public PatternBrush(TColor foreColor, TColor backColor, Fast2DArray pattern) + public PatternBrush(TColor foreColor, TColor backColor, bool[,] pattern) + : this(foreColor, backColor, new Fast2DArray(pattern)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Color of the fore. + /// Color of the back. + /// The pattern. + internal PatternBrush(TColor foreColor, TColor backColor, Fast2DArray pattern) { Vector4 foreColorVector = foreColor.ToVector4(); Vector4 backColorVector = backColor.ToVector4(); @@ -131,7 +133,8 @@ namespace ImageSharp.Drawing.Brushes x = x % this.pattern.Width; y = y % this.pattern.Height; - return this.pattern[x, y]; + // 2d array index at row/column + return this.pattern[y, x]; } } @@ -156,7 +159,9 @@ namespace ImageSharp.Drawing.Brushes if (opacity > Constants.Epsilon) { Vector4 backgroundVector = this.Target[targetX, targetY].ToVector4(); - Vector4 sourceVector = this.patternVector[targetX % this.pattern.Height, targetX % this.pattern.Width]; + + // 2d array index at row/column + Vector4 sourceVector = this.patternVector[targetY % this.pattern.Height, targetX % this.pattern.Width]; Vector4 finalColor = Vector4BlendTransforms.PremultipliedLerp(backgroundVector, sourceVector, opacity); diff --git a/tests/ImageSharp.Tests/Drawing/FillPatternTests.cs b/tests/ImageSharp.Tests/Drawing/FillPatternTests.cs index d3c1877ab..56066a7aa 100644 --- a/tests/ImageSharp.Tests/Drawing/FillPatternTests.cs +++ b/tests/ImageSharp.Tests/Drawing/FillPatternTests.cs @@ -33,8 +33,9 @@ namespace ImageSharp.Tests.Drawing { // lets pick random spots to start checking Random r = new Random(); - int xStride = expectedPattern.GetLength(1); - int yStride = expectedPattern.GetLength(0); + var expectedPatternFast = new Fast2DArray(expectedPattern); + int xStride = expectedPatternFast.Width; + int yStride = expectedPatternFast.Height; int offsetX = r.Next(image.Width / xStride) * xStride; int offsetY = r.Next(image.Height / yStride) * yStride; for (int x = 0; x < xStride; x++) @@ -43,7 +44,7 @@ namespace ImageSharp.Tests.Drawing { int actualX = x + offsetX; int actualY = y + offsetY; - Color expected = expectedPattern[y, x]; // inverted pattern + Color expected = expectedPatternFast[y, x]; // inverted pattern Color actual = sourcePixels[actualX, actualY]; if (expected != actual) { @@ -187,10 +188,10 @@ namespace ImageSharp.Tests.Drawing { Test("ForwardDiagonal", Color.Blue, Brushes.ForwardDiagonal(Color.HotPink, Color.LimeGreen), new Color[,] { - { Color.HotPink, Color.LimeGreen, Color.LimeGreen, Color.LimeGreen}, - { Color.LimeGreen, Color.HotPink, Color.LimeGreen, Color.LimeGreen}, + { Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink}, { Color.LimeGreen, Color.LimeGreen, Color.HotPink, Color.LimeGreen}, - { Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink} + { Color.LimeGreen, Color.HotPink, Color.LimeGreen, Color.LimeGreen}, + { Color.HotPink, Color.LimeGreen, Color.LimeGreen, Color.LimeGreen} }); } @@ -199,10 +200,10 @@ namespace ImageSharp.Tests.Drawing { Test("ForwardDiagonal_Transparent", Color.Blue, Brushes.ForwardDiagonal(Color.HotPink), new Color[,] { - { Color.HotPink, Color.Blue, Color.Blue, Color.Blue}, - { Color.Blue, Color.HotPink, Color.Blue, Color.Blue}, + { Color.Blue, Color.Blue, Color.Blue, Color.HotPink}, { Color.Blue, Color.Blue, Color.HotPink, Color.Blue}, - { Color.Blue, Color.Blue, Color.Blue, Color.HotPink} + { Color.Blue, Color.HotPink, Color.Blue, Color.Blue}, + { Color.HotPink, Color.Blue, Color.Blue, Color.Blue} }); } @@ -211,10 +212,10 @@ namespace ImageSharp.Tests.Drawing { Test("BackwardDiagonal", Color.Blue, Brushes.BackwardDiagonal(Color.HotPink, Color.LimeGreen), new Color[,] { - { Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink}, - { Color.LimeGreen, Color.LimeGreen, Color.HotPink, Color.LimeGreen}, - { Color.LimeGreen, Color.HotPink, Color.LimeGreen, Color.LimeGreen}, - { Color.HotPink, Color.LimeGreen, Color.LimeGreen, Color.LimeGreen} + { Color.HotPink, Color.LimeGreen, Color.LimeGreen, Color.LimeGreen}, + { Color.LimeGreen, Color.HotPink, Color.LimeGreen, Color.LimeGreen}, + { Color.LimeGreen, Color.LimeGreen, Color.HotPink, Color.LimeGreen}, + { Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink} }); } @@ -223,13 +224,11 @@ namespace ImageSharp.Tests.Drawing { Test("BackwardDiagonal_Transparent", Color.Blue, Brushes.BackwardDiagonal(Color.HotPink), new Color[,] { - { Color.Blue, Color.Blue, Color.Blue, Color.HotPink}, - { Color.Blue, Color.Blue, Color.HotPink, Color.Blue}, - { Color.Blue, Color.HotPink, Color.Blue, Color.Blue}, - { Color.HotPink, Color.Blue, Color.Blue, Color.Blue} + { Color.HotPink, Color.Blue, Color.Blue, Color.Blue}, + { Color.Blue, Color.HotPink, Color.Blue, Color.Blue}, + { Color.Blue, Color.Blue, Color.HotPink, Color.Blue}, + { Color.Blue, Color.Blue, Color.Blue, Color.HotPink} }); } - - } }