mirror of https://github.com/SixLabors/ImageSharp
4 changed files with 100 additions and 275 deletions
@ -0,0 +1,70 @@ |
|||||
|
// Copyright (c) Six Labors and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
|
using System.Numerics; |
||||
|
|
||||
|
using SixLabors.ImageSharp.Memory; |
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
using SixLabors.ImageSharp.Processing; |
||||
|
using SixLabors.Shapes; |
||||
|
|
||||
|
using Xunit; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Tests.Drawing |
||||
|
{ |
||||
|
[GroupOutput("Drawing")] |
||||
|
public class DrawComplexPolygonTests |
||||
|
{ |
||||
|
[Theory] |
||||
|
[WithBasicTestPatternImages(250, 350, PixelTypes.Rgba32, false, false, false)] |
||||
|
[WithBasicTestPatternImages(250, 350, PixelTypes.Rgba32, true, false, false)] |
||||
|
[WithBasicTestPatternImages(250, 350, PixelTypes.Rgba32, false, true, false)] |
||||
|
[WithBasicTestPatternImages(250, 350, PixelTypes.Rgba32, false, false, true)] |
||||
|
public void DrawComplexPolygon<TPixel>(TestImageProvider<TPixel> provider, bool overlap, bool transparent, bool dashed) |
||||
|
where TPixel :struct, IPixel<TPixel> |
||||
|
{ |
||||
|
var simplePath = new Polygon(new LinearLineSegment( |
||||
|
new Vector2(10, 10), |
||||
|
new Vector2(200, 150), |
||||
|
new Vector2(50, 300))); |
||||
|
|
||||
|
var hole1 = new Polygon(new LinearLineSegment( |
||||
|
new Vector2(37, 85), |
||||
|
overlap ? new Vector2(130, 40) : new Vector2(93, 85), |
||||
|
new Vector2(65, 137))); |
||||
|
IPath clipped = simplePath.Clip(hole1); |
||||
|
|
||||
|
Rgba32 colorRgba = Rgba32.White; |
||||
|
if (transparent) |
||||
|
{ |
||||
|
colorRgba.A = 150; |
||||
|
} |
||||
|
|
||||
|
Color color = colorRgba; |
||||
|
|
||||
|
string testDetails = ""; |
||||
|
if (overlap) |
||||
|
{ |
||||
|
testDetails += "_Overlap"; |
||||
|
} |
||||
|
|
||||
|
if (transparent) |
||||
|
{ |
||||
|
testDetails += "_Transparent"; |
||||
|
} |
||||
|
|
||||
|
if (dashed) |
||||
|
{ |
||||
|
testDetails += "_Dashed"; |
||||
|
} |
||||
|
|
||||
|
Pen<TPixel> pen = dashed ? Pens.Dash(color.ToPixel<TPixel>(), 5f) : Pens.Solid(color.ToPixel<TPixel>(), 5f); |
||||
|
|
||||
|
provider.RunValidatingProcessorTest( |
||||
|
x => x.Draw(pen, clipped), |
||||
|
testDetails, |
||||
|
appendPixelTypeToFileName: false, |
||||
|
appendSourceFileOrDescription: false); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,201 +0,0 @@ |
|||||
// Copyright (c) Six Labors and contributors.
|
|
||||
// Licensed under the Apache License, Version 2.0.
|
|
||||
|
|
||||
using System.Numerics; |
|
||||
|
|
||||
using SixLabors.ImageSharp.Memory; |
|
||||
using SixLabors.ImageSharp.PixelFormats; |
|
||||
using SixLabors.ImageSharp.Processing; |
|
||||
using SixLabors.Shapes; |
|
||||
|
|
||||
using Xunit; |
|
||||
|
|
||||
namespace SixLabors.ImageSharp.Tests.Drawing |
|
||||
{ |
|
||||
public class LineComplexPolygonTests : FileTestBase |
|
||||
{ |
|
||||
[Fact] |
|
||||
public void ImageShouldBeOverlayedByPolygonOutline() |
|
||||
{ |
|
||||
string path = TestEnvironment.CreateOutputDirectory("Drawing", "LineComplexPolygon"); |
|
||||
|
|
||||
var simplePath = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(10, 10), |
|
||||
new Vector2(200, 150), |
|
||||
new Vector2(50, 300))); |
|
||||
|
|
||||
var hole1 = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(37, 85), |
|
||||
new Vector2(93, 85), |
|
||||
new Vector2(65, 137))); |
|
||||
|
|
||||
using (var image = new Image<Rgba32>(500, 500)) |
|
||||
{ |
|
||||
image.Mutate(x => x.BackgroundColor(Rgba32.Blue)); |
|
||||
image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1))); |
|
||||
image.Save($"{path}/Simple.png"); |
|
||||
|
|
||||
Buffer2D<Rgba32> sourcePixels = image.GetRootFramePixelBuffer(); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[10, 10]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[200, 150]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[50, 300]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[37, 85]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[93, 85]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[65, 137]); |
|
||||
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[2, 2]); |
|
||||
|
|
||||
//inside hole
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[57, 99]); |
|
||||
|
|
||||
//inside shape
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[100, 192]); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
[Fact] |
|
||||
public void ImageShouldBeOverlayedByPolygonOutlineNoOverlapping() |
|
||||
{ |
|
||||
string path = TestEnvironment.CreateOutputDirectory("Drawing", "LineComplexPolygon"); |
|
||||
var simplePath = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(10, 10), |
|
||||
new Vector2(200, 150), |
|
||||
new Vector2(50, 300))); |
|
||||
|
|
||||
var hole1 = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(207, 25), |
|
||||
new Vector2(263, 25), |
|
||||
new Vector2(235, 57))); |
|
||||
|
|
||||
using (var image = new Image<Rgba32>(500, 500)) |
|
||||
{ |
|
||||
image.Mutate(x => x.BackgroundColor(Rgba32.Blue)); |
|
||||
image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1))); |
|
||||
image.Save($"{path}/SimpleVanishHole.png"); |
|
||||
|
|
||||
Buffer2D<Rgba32> sourcePixels = image.GetRootFramePixelBuffer(); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[10, 10]); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[200, 150]); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[50, 300]); |
|
||||
|
|
||||
//Assert.Equal(Color.HotPink, sourcePixels[37, 85]);
|
|
||||
|
|
||||
//Assert.Equal(Color.HotPink, sourcePixels[93, 85]);
|
|
||||
|
|
||||
//Assert.Equal(Color.HotPink, sourcePixels[65, 137]);
|
|
||||
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[2, 2]); |
|
||||
|
|
||||
//inside hole
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[57, 99]); |
|
||||
|
|
||||
//inside shape
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[100, 192]); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
[Fact] |
|
||||
public void ImageShouldBeOverlayedByPolygonOutlineOverlapping() |
|
||||
{ |
|
||||
string path = TestEnvironment.CreateOutputDirectory("Drawing", "LineComplexPolygon"); |
|
||||
var simplePath = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(10, 10), |
|
||||
new Vector2(200, 150), |
|
||||
new Vector2(50, 300))); |
|
||||
|
|
||||
var hole1 = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(37, 85), |
|
||||
new Vector2(130, 40), |
|
||||
new Vector2(65, 137))); |
|
||||
|
|
||||
using (var image = new Image<Rgba32>(500, 500)) |
|
||||
{ |
|
||||
image.Mutate(x => x.BackgroundColor(Rgba32.Blue)); |
|
||||
image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1))); |
|
||||
image.Save($"{path}/SimpleOverlapping.png"); |
|
||||
|
|
||||
Buffer2D<Rgba32> sourcePixels = image.GetRootFramePixelBuffer(); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[10, 10]); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[200, 150]); |
|
||||
Assert.Equal(Rgba32.HotPink, sourcePixels[50, 300]); |
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[130, 41]); |
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[2, 2]); |
|
||||
|
|
||||
//inside hole
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[57, 99]); |
|
||||
|
|
||||
//inside shape
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[100, 192]); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
[Fact] |
|
||||
public void ImageShouldBeOverlayedByPolygonOutlineDashed() |
|
||||
{ |
|
||||
string path = TestEnvironment.CreateOutputDirectory("Drawing", "LineComplexPolygon"); |
|
||||
var simplePath = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(10, 10), |
|
||||
new Vector2(200, 150), |
|
||||
new Vector2(50, 300))); |
|
||||
|
|
||||
var hole1 = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(37, 85), |
|
||||
new Vector2(93, 85), |
|
||||
new Vector2(65, 137))); |
|
||||
|
|
||||
using (var image = new Image<Rgba32>(500, 500)) |
|
||||
{ |
|
||||
image.Mutate(x => x.BackgroundColor(Rgba32.Blue)); |
|
||||
image.Mutate(x => x.Draw(Pens.Dash(Rgba32.HotPink, 5), simplePath.Clip(hole1))); |
|
||||
image.Save($"{path}/Dashed.png"); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
[Fact] |
|
||||
public void ImageShouldBeOverlayedPolygonOutlineWithOpacity() |
|
||||
{ |
|
||||
string path = TestEnvironment.CreateOutputDirectory("Drawing", "LineComplexPolygon"); |
|
||||
var simplePath = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(10, 10), |
|
||||
new Vector2(200, 150), |
|
||||
new Vector2(50, 300))); |
|
||||
|
|
||||
var hole1 = new Polygon(new LinearLineSegment( |
|
||||
new Vector2(37, 85), |
|
||||
new Vector2(93, 85), |
|
||||
new Vector2(65, 137))); |
|
||||
var color = new Rgba32(Rgba32.HotPink.R, Rgba32.HotPink.G, Rgba32.HotPink.B, 150); |
|
||||
|
|
||||
using (var image = new Image<Rgba32>(500, 500)) |
|
||||
{ |
|
||||
image.Mutate(x => x.BackgroundColor(Rgba32.Blue)); |
|
||||
image.Mutate(x => x.Draw(color, 5, simplePath.Clip(hole1))); |
|
||||
image.Save($"{path}/Opacity.png"); |
|
||||
|
|
||||
//shift background color towards forground color by the opacity amount
|
|
||||
var mergedColor = new Rgba32( |
|
||||
Vector4.Lerp(Rgba32.Blue.ToVector4(), Rgba32.HotPink.ToVector4(), 150f / 255f)); |
|
||||
|
|
||||
Buffer2D<Rgba32> sourcePixels = image.GetRootFramePixelBuffer(); |
|
||||
Assert.Equal(mergedColor, sourcePixels[10, 10]); |
|
||||
Assert.Equal(mergedColor, sourcePixels[200, 150]); |
|
||||
Assert.Equal(mergedColor, sourcePixels[50, 300]); |
|
||||
Assert.Equal(mergedColor, sourcePixels[37, 85]); |
|
||||
Assert.Equal(mergedColor, sourcePixels[93, 85]); |
|
||||
Assert.Equal(mergedColor, sourcePixels[65, 137]); |
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[2, 2]); |
|
||||
|
|
||||
//inside hole
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[57, 99]); |
|
||||
|
|
||||
//inside shape
|
|
||||
Assert.Equal(Rgba32.Blue, sourcePixels[100, 192]); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1 +1 @@ |
|||||
Subproject commit 4fe9334aa8898f67b6e3df94bc00867645c3e709 |
Subproject commit 55c250ab80f7f9fc26208b9b9d9590cbe8012446 |
||||
Loading…
Reference in new issue