diff --git a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs index 39477d2817..7bbf98700d 100644 --- a/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs +++ b/src/Gtk/Perspex.Cairo/Media/DrawingContext.cs @@ -119,35 +119,10 @@ namespace Perspex.Cairo.Media public void DrawGeometry(Perspex.Media.Brush brush, Perspex.Media.Pen pen, Perspex.Media.Geometry geometry) { var impl = geometry.PlatformImpl as StreamGeometryImpl; - var clone = new Queue(impl.Operations); using (var pop = this.PushTransform(impl.Transform)) { - while (clone.Count > 0) - { - var current = clone.Dequeue(); - - if (current is BeginOp) - { - var bo = current as BeginOp; - this.context.MoveTo(bo.Point.ToCairo()); - } - else if (current is LineToOp) - { - var lto = current as LineToOp; - this.context.LineTo(lto.Point.ToCairo()); - } - else if (current is EndOp) - { - if (((EndOp)current).IsClosed) - this.context.ClosePath(); - } - else if (current is CurveToOp) - { - var cto = current as CurveToOp; - this.context.CurveTo(cto.Point.ToCairo(), cto.Point2.ToCairo(), cto.Point3.ToCairo()); - } - } + this.context.AppendPath(impl.Path); if (brush != null) { diff --git a/src/Gtk/Perspex.Cairo/Media/StreamGeometryContextImpl.cs b/src/Gtk/Perspex.Cairo/Media/StreamGeometryContextImpl.cs index ff9dacca08..b0948ea680 100644 --- a/src/Gtk/Perspex.Cairo/Media/StreamGeometryContextImpl.cs +++ b/src/Gtk/Perspex.Cairo/Media/StreamGeometryContextImpl.cs @@ -28,17 +28,17 @@ namespace Perspex.Cairo.Media public void BeginFigure(Point startPoint, bool isFilled) { - this.impl.Operations.Enqueue(new BeginOp { Point = startPoint, IsFilled = isFilled }); + this.context.MoveTo(startPoint.ToCairo()); } public void BezierTo(Point point1, Point point2, Point point3) { - this.impl.Operations.Enqueue(new CurveToOp { Point = point1, Point2 = point2, Point3 = point3 }); + this.context.CurveTo(point1.ToCairo(), point2.ToCairo(), point3.ToCairo()); } public void LineTo(Point point) { - this.impl.Operations.Enqueue(new LineToOp { Point = point }); + this.context.LineTo(point.ToCairo()); } private Cairo.Context context; @@ -46,38 +46,12 @@ namespace Perspex.Cairo.Media public void EndFigure(bool isClosed) { - this.impl.Operations.Enqueue(new EndOp { IsClosed = isClosed }); - - var clone = new Queue(this.impl.Operations); - - while (clone.Count > 0) - { - var current = clone.Dequeue(); + if (isClosed) + this.context.ClosePath(); - if (current is BeginOp) - { - var bo = current as BeginOp; - context.MoveTo(bo.Point.ToCairo()); - } - else if (current is LineToOp) - { - var lto = current as LineToOp; - context.LineTo(lto.Point.ToCairo()); - } - else if (current is EndOp) - { - if (((EndOp)current).IsClosed) - context.ClosePath(); - } - else if (current is CurveToOp) - { - var cto = current as CurveToOp; - context.CurveTo(cto.Point.ToCairo(), cto.Point2.ToCairo(), cto.Point3.ToCairo()); - } - } - - var extents = context.StrokeExtents(); + var extents = this.context.StrokeExtents(); this.impl.Bounds = new Rect(extents.X, extents.Y, extents.Width, extents.Height); + this.impl.Path = this.context.CopyPath(); } public void Dispose() diff --git a/src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs b/src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs index cf423dbc17..7e5b37ea5d 100644 --- a/src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs +++ b/src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs @@ -13,57 +13,23 @@ namespace Perspex.Cairo.Media using Splat; using System.Collections.Generic; - public enum CairoGeometryType - { - Begin, - ArcTo, - LineTo, - End - } - - public class BeginOp : GeometryOp - { - public Point Point { get; set; } - public bool IsFilled { get; set; } - } - - public class EndOp : GeometryOp - { - public bool IsClosed { get; set; } - } - - public class LineToOp : GeometryOp - { - public Point Point { get; set; } - } - - public class CurveToOp : GeometryOp - { - public Point Point { get; set; } - public Point Point2 { get; set; } - public Point Point3 { get; set; } - } - - public abstract class GeometryOp - { - } - public class StreamGeometryImpl : IStreamGeometryImpl { public StreamGeometryImpl() { - this.Operations = new Queue(); + this.impl = new StreamGeometryContextImpl(this); } - public StreamGeometryImpl(Queue ops) + public StreamGeometryImpl(Cairo.Path path) { - this.Operations = ops; + this.impl = new StreamGeometryContextImpl(this); + this.Path = path; } - - public Queue Operations + + public Cairo.Path Path { get; - private set; + set; } public Rect Bounds @@ -72,7 +38,8 @@ namespace Perspex.Cairo.Media set; } - // TODO: Implement + private StreamGeometryContextImpl impl; + private Matrix transform = Matrix.Identity; public Matrix Transform { @@ -91,7 +58,7 @@ namespace Perspex.Cairo.Media public IStreamGeometryImpl Clone() { - return new StreamGeometryImpl(this.Operations); + return new StreamGeometryImpl(this.Path); } public Rect GetRenderBounds(double strokeThickness) @@ -101,7 +68,7 @@ namespace Perspex.Cairo.Media public IStreamGeometryContextImpl Open() { - return new StreamGeometryContextImpl(this); + return this.impl; } } }