Browse Source

fix pattern brushes

pull/140/head
Scott Williams 9 years ago
parent
commit
44d2736b8f
  1. 40
      src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs
  2. 29
      src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs
  3. 37
      tests/ImageSharp.Tests/Drawing/FillPatternTests.cs

40
src/ImageSharp.Drawing/Brushes/Brushes{TColor}.cs

@ -18,10 +18,9 @@ namespace ImageSharp.Drawing.Brushes
/// <summary> /// <summary>
/// Percent10 Hatch Pattern /// Percent10 Hatch Pattern
/// </summary> /// </summary>
/// note 2d arrays when configured using initalizer look inverted /// ---> x axis
/// ---> Y axis
/// ^ /// ^
/// | X - axis /// | y - axis
/// | /// |
/// see PatternBrush for details about how to make new patterns work /// see PatternBrush for details about how to make new patterns work
private static readonly bool[,] Percent10Pattern = private static readonly bool[,] Percent10Pattern =
@ -37,10 +36,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] Percent20Pattern = private static readonly bool[,] Percent20Pattern =
{ {
{ true, false, true, false }, { true, false, false, false },
{ false, false, false, false }, { false, false, true, false },
{ false, true, false, true }, { true, false, false, false },
{ false, false, false, false } { false, false, true, false }
}; };
/// <summary> /// <summary>
@ -48,7 +47,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] HorizontalPattern = private static readonly bool[,] HorizontalPattern =
{ {
{ false, true, false, false }, { false },
{ true },
{ false },
{ false }
}; };
/// <summary> /// <summary>
@ -56,7 +58,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] MinPattern = private static readonly bool[,] MinPattern =
{ {
{ false, false, false, true }, { false },
{ false },
{ false },
{ true }
}; };
/// <summary> /// <summary>
@ -64,10 +69,7 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] VerticalPattern = private static readonly bool[,] VerticalPattern =
{ {
{ false }, { false, true, false, false },
{ true },
{ false },
{ false }
}; };
/// <summary> /// <summary>
@ -75,10 +77,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] ForwardDiagonalPattern = private static readonly bool[,] ForwardDiagonalPattern =
{ {
{ true, false, false, false }, { false, false, false, true },
{ false, true, false, false },
{ false, false, true, false }, { false, false, true, false },
{ false, false, false, true } { false, true, false, false },
{ true, false, false, false }
}; };
/// <summary> /// <summary>
@ -86,10 +88,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary> /// </summary>
private static readonly bool[,] BackwardDiagonalPattern = private static readonly bool[,] BackwardDiagonalPattern =
{ {
{ false, false, false, true }, { true, false, false, false },
{ false, false, true, false },
{ false, true, false, false }, { false, true, false, false },
{ true, false, false, false } { false, false, true, false },
{ false, false, false, true }
}; };
/// <summary> /// <summary>

29
src/ImageSharp.Drawing/Brushes/PatternBrush{TColor}.cs

@ -30,15 +30,6 @@ namespace ImageSharp.Drawing.Brushes
/// 0 /// 0
/// 0 /// 0
/// </para> /// </para>
/// 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
/// </remarks> /// </remarks>
/// <typeparam name="TColor">The pixel format.</typeparam> /// <typeparam name="TColor">The pixel format.</typeparam>
public class PatternBrush<TColor> : IBrush<TColor> public class PatternBrush<TColor> : IBrush<TColor>
@ -56,7 +47,18 @@ namespace ImageSharp.Drawing.Brushes
/// <param name="foreColor">Color of the fore.</param> /// <param name="foreColor">Color of the fore.</param>
/// <param name="backColor">Color of the back.</param> /// <param name="backColor">Color of the back.</param>
/// <param name="pattern">The pattern.</param> /// <param name="pattern">The pattern.</param>
public PatternBrush(TColor foreColor, TColor backColor, Fast2DArray<bool> pattern) public PatternBrush(TColor foreColor, TColor backColor, bool[,] pattern)
: this(foreColor, backColor, new Fast2DArray<bool>(pattern))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="PatternBrush{TColor}"/> class.
/// </summary>
/// <param name="foreColor">Color of the fore.</param>
/// <param name="backColor">Color of the back.</param>
/// <param name="pattern">The pattern.</param>
internal PatternBrush(TColor foreColor, TColor backColor, Fast2DArray<bool> pattern)
{ {
Vector4 foreColorVector = foreColor.ToVector4(); Vector4 foreColorVector = foreColor.ToVector4();
Vector4 backColorVector = backColor.ToVector4(); Vector4 backColorVector = backColor.ToVector4();
@ -131,7 +133,8 @@ namespace ImageSharp.Drawing.Brushes
x = x % this.pattern.Width; x = x % this.pattern.Width;
y = y % this.pattern.Height; 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) if (opacity > Constants.Epsilon)
{ {
Vector4 backgroundVector = this.Target[targetX, targetY].ToVector4(); 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); Vector4 finalColor = Vector4BlendTransforms.PremultipliedLerp(backgroundVector, sourceVector, opacity);

37
tests/ImageSharp.Tests/Drawing/FillPatternTests.cs

@ -33,8 +33,9 @@ namespace ImageSharp.Tests.Drawing
{ {
// lets pick random spots to start checking // lets pick random spots to start checking
Random r = new Random(); Random r = new Random();
int xStride = expectedPattern.GetLength(1); var expectedPatternFast = new Fast2DArray<Color>(expectedPattern);
int yStride = expectedPattern.GetLength(0); int xStride = expectedPatternFast.Width;
int yStride = expectedPatternFast.Height;
int offsetX = r.Next(image.Width / xStride) * xStride; int offsetX = r.Next(image.Width / xStride) * xStride;
int offsetY = r.Next(image.Height / yStride) * yStride; int offsetY = r.Next(image.Height / yStride) * yStride;
for (int x = 0; x < xStride; x++) for (int x = 0; x < xStride; x++)
@ -43,7 +44,7 @@ namespace ImageSharp.Tests.Drawing
{ {
int actualX = x + offsetX; int actualX = x + offsetX;
int actualY = y + offsetY; int actualY = y + offsetY;
Color expected = expectedPattern[y, x]; // inverted pattern Color expected = expectedPatternFast[y, x]; // inverted pattern
Color actual = sourcePixels[actualX, actualY]; Color actual = sourcePixels[actualX, actualY];
if (expected != actual) if (expected != actual)
{ {
@ -187,10 +188,10 @@ namespace ImageSharp.Tests.Drawing
{ {
Test("ForwardDiagonal", Color.Blue, Brushes.ForwardDiagonal(Color.HotPink, Color.LimeGreen), Test("ForwardDiagonal", Color.Blue, Brushes.ForwardDiagonal(Color.HotPink, Color.LimeGreen),
new Color[,] { new Color[,] {
{ Color.HotPink, Color.LimeGreen, Color.LimeGreen, Color.LimeGreen}, { Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink},
{ Color.LimeGreen, Color.HotPink, Color.LimeGreen, Color.LimeGreen},
{ 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.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), Test("ForwardDiagonal_Transparent", Color.Blue, Brushes.ForwardDiagonal(Color.HotPink),
new Color[,] { new Color[,] {
{ Color.HotPink, Color.Blue, Color.Blue, Color.Blue}, { Color.Blue, Color.Blue, Color.Blue, Color.HotPink},
{ Color.Blue, Color.HotPink, Color.Blue, Color.Blue},
{ 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.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), Test("BackwardDiagonal", Color.Blue, Brushes.BackwardDiagonal(Color.HotPink, Color.LimeGreen),
new Color[,] { new Color[,] {
{ Color.LimeGreen, Color.LimeGreen, Color.LimeGreen, Color.HotPink}, { 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.HotPink, Color.LimeGreen, Color.LimeGreen}, { Color.LimeGreen, Color.LimeGreen, Color.HotPink, Color.LimeGreen},
{ Color.HotPink, Color.LimeGreen, Color.LimeGreen, 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), Test("BackwardDiagonal_Transparent", Color.Blue, Brushes.BackwardDiagonal(Color.HotPink),
new Color[,] { new Color[,] {
{ Color.Blue, Color.Blue, Color.Blue, Color.HotPink}, { 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.HotPink, Color.Blue, Color.Blue}, { Color.Blue, Color.Blue, Color.HotPink, Color.Blue},
{ Color.HotPink, Color.Blue, Color.Blue, Color.Blue} { Color.Blue, Color.Blue, Color.Blue, Color.HotPink}
}); });
} }
} }
} }

Loading…
Cancel
Save