Browse Source

Added Line and LineGeometry for line drawing.

pull/393/head
Ivan Kochurkin 11 years ago
parent
commit
b6c66c67e0
  1. 9
      samples/TestApplicationShared/MainWindow.cs
  2. 1
      src/Perspex.Controls/Perspex.Controls.csproj
  3. 36
      src/Perspex.Controls/Shapes/Line.cs
  4. 42
      src/Perspex.SceneGraph/Media/LineGeometry.cs
  5. 1
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  6. 1
      tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj
  7. 43
      tests/Perspex.RenderTests/Shapes/LineTests.cs
  8. BIN
      tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png

9
samples/TestApplicationShared/MainWindow.cs

@ -688,6 +688,15 @@ namespace TestApplication
[Canvas.LeftProperty] = 130,
[Canvas.TopProperty] = 79,
},
new Line
{
Width = 90,
Height = 70,
Stroke = Brushes.Red,
StrokeThickness = 2,
[Canvas.LeftProperty] = 30,
[Canvas.TopProperty] = 120
}
}
},
}

1
src/Perspex.Controls/Perspex.Controls.csproj

@ -47,6 +47,7 @@
<Compile Include="Platform\PlatformManager.cs" />
<Compile Include="SelectionMode.cs" />
<Compile Include="Separator.cs" />
<Compile Include="Shapes\Line.cs" />
<Compile Include="SystemDialog.cs" />
<Compile Include="Generators\ITreeItemContainerGenerator.cs" />
<Compile Include="Generators\ItemContainers.cs" />

36
src/Perspex.Controls/Shapes/Line.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Perspex.Media;
namespace Perspex.Controls.Shapes
{
public class Line : Shape
{
private Geometry _geometry;
private Size _geometrySize;
public override Geometry DefiningGeometry
{
get
{
if (_geometry == null || _geometrySize != Bounds.Size)
{
var rect = new Rect(Bounds.Size).Deflate(StrokeThickness);
_geometry = new LineGeometry(rect.TopLeft, rect.BottomRight);
_geometrySize = Bounds.Size;
}
return _geometry;
}
}
protected override Size MeasureOverride(Size availableSize)
{
return new Size(StrokeThickness, StrokeThickness);
}
}
}

42
src/Perspex.SceneGraph/Media/LineGeometry.cs

@ -0,0 +1,42 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Platform;
namespace Perspex.Media
{
/// <summary>
/// Represents the geometry of a line.
/// </summary>
public class LineGeometry : Geometry
{
/// <summary>
/// Initializes a new instance of the <see cref="LineGeometry"/> class.
/// </summary>
/// <param name="startPoint">The start point.</param>
/// <param name="endPoint">The end point.</param>
public LineGeometry(Point startPoint, Point endPoint)
{
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
IStreamGeometryImpl impl = factory.CreateStreamGeometry();
using (IStreamGeometryContextImpl context = impl.Open())
{
context.BeginFigure(startPoint, true);
context.LineTo(endPoint);
context.EndFigure(true);
}
PlatformImpl = impl;
}
/// <inheritdoc/>
public override Rect Bounds => PlatformImpl.Bounds;
/// <inheritdoc/>
public override Geometry Clone()
{
return new LineGeometry(Bounds.TopLeft, Bounds.BottomRight);
}
}
}

1
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -70,6 +70,7 @@
<Compile Include="Media\GradientBrush.cs" />
<Compile Include="Media\GradientSpreadMethod.cs" />
<Compile Include="Media\GradientStop.cs" />
<Compile Include="Media\LineGeometry.cs" />
<Compile Include="Media\RadialGradientBrush.cs" />
<Compile Include="Media\LinearGradientBrush.cs" />
<Compile Include="Media\MediaExtensions.cs" />

1
tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj

@ -76,6 +76,7 @@
<Compile Include="Controls\ImageTests.cs" />
<Compile Include="Controls\BorderTests.cs" />
<Compile Include="Media\LinearGradientBrushTests.cs" />
<Compile Include="Shapes\LineTests.cs" />
<Compile Include="Shapes\PathTests.cs" />
<Compile Include="Shapes\EllipseTests.cs" />
<Compile Include="Shapes\RectangleTests.cs" />

43
tests/Perspex.RenderTests/Shapes/LineTests.cs

@ -0,0 +1,43 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Controls;
using Perspex.Controls.Shapes;
using Perspex.Media;
using Xunit;
#if PERSPEX_CAIRO
namespace Perspex.Cairo.RenderTests.Shapes
#elif PERSPEX_SKIA
namespace Perspex.Skia.RenderTests
#else
namespace Perspex.Direct2D1.RenderTests.Shapes
#endif
{
public class LineTests : TestBase
{
public LineTests()
: base(@"Shapes\Line")
{
}
[Fact]
public void Circle_1px_Stroke()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Line
{
Stroke = Brushes.Black,
StrokeThickness = 1,
}
};
RenderToFile(target);
CompareImages();
}
}
}

BIN
tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Loading…
Cancel
Save