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>
/// Percent10 Hatch Pattern
/// </summary>
/// 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
/// </summary>
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 }
};
/// <summary>
@ -48,7 +47,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary>
private static readonly bool[,] HorizontalPattern =
{
{ false, true, false, false },
{ false },
{ true },
{ false },
{ false }
};
/// <summary>
@ -56,7 +58,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary>
private static readonly bool[,] MinPattern =
{
{ false, false, false, true },
{ false },
{ false },
{ false },
{ true }
};
/// <summary>
@ -64,10 +69,7 @@ namespace ImageSharp.Drawing.Brushes
/// </summary>
private static readonly bool[,] VerticalPattern =
{
{ false },
{ true },
{ false },
{ false }
{ false, true, false, false },
};
/// <summary>
@ -75,10 +77,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary>
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 }
};
/// <summary>
@ -86,10 +88,10 @@ namespace ImageSharp.Drawing.Brushes
/// </summary>
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 }
};
/// <summary>

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

@ -30,15 +30,6 @@ namespace ImageSharp.Drawing.Brushes
/// 0
/// 0
/// </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>
/// <typeparam name="TColor">The pixel format.</typeparam>
public class PatternBrush<TColor> : IBrush<TColor>
@ -56,7 +47,18 @@ namespace ImageSharp.Drawing.Brushes
/// <param name="foreColor">Color of the fore.</param>
/// <param name="backColor">Color of the back.</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 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);

37
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<Color>(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}
});
}
}
}

Loading…
Cancel
Save