/// <inheritdoc/> public override void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var _dc = dc as DrawingContext; var style = quadraticBezier.Style; if (style == null) return; double thickness = style.Thickness / _state.ZoomX; double half = thickness / 2.0; Tuple<Brush, Pen> styleCached = _styleCache.Get(style); Brush fill; Pen stroke; if (styleCached != null) { fill = styleCached.Item1; stroke = styleCached.Item2; } else { fill = CreateBrush(style.Fill); stroke = CreatePen(style, thickness); _styleCache.Set(style, Tuple.Create(fill, stroke)); } PathGeometry pg = _quadraticBezierCache.Get(quadraticBezier); if (pg != null) { var pf = pg.Figures[0]; pf.StartPoint = new Point(quadraticBezier.Point1.X + dx, quadraticBezier.Point1.Y + dy); pf.IsFilled = quadraticBezier.IsFilled; var qbs = pf.Segments[0] as QuadraticBezierSegment; qbs.Point1 = new Point(quadraticBezier.Point2.X + dx, quadraticBezier.Point2.Y + dy); qbs.Point2 = new Point(quadraticBezier.Point3.X + dx, quadraticBezier.Point3.Y + dy); qbs.IsStroked = quadraticBezier.IsStroked; } else { var pf = new PathFigure() { StartPoint = new Point(quadraticBezier.Point1.X + dx, quadraticBezier.Point1.Y + dy), IsFilled = quadraticBezier.IsFilled }; var qbs = new QuadraticBezierSegment( new Point(quadraticBezier.Point2.X + dx, quadraticBezier.Point2.Y + dy), new Point(quadraticBezier.Point3.X + dx, quadraticBezier.Point3.Y + dy), quadraticBezier.IsStroked); //bs.Freeze(); pf.Segments.Add(qbs); //pf.Freeze(); pg = new PathGeometry(); pg.Figures.Add(pf); //pg.Freeze(); _quadraticBezierCache.Set(quadraticBezier, pg); } DrawPathGeometryInternal(_dc, half, fill, stroke, quadraticBezier.IsStroked, quadraticBezier.IsFilled, pg); }
/// <inheritdoc/> public override void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { // TODO: Implement Draw quadratic bezier. }
/// <inheritdoc/> public override void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var canvas = dc as SKCanvas; using (SKPaint brush = ToSKPaintBrush(quadraticBezier.Style.Fill)) using (SKPaint pen = ToSKPaintPen(quadraticBezier.Style, _scaleToPage, _sourceDpi, _targetDpi)) using (var path = new SKPath()) { path.MoveTo( _scaleToPage(quadraticBezier.Point1.X + dx), _scaleToPage(quadraticBezier.Point1.Y + dy)); path.QuadTo( _scaleToPage(quadraticBezier.Point2.X + dx), _scaleToPage(quadraticBezier.Point2.Y + dy), _scaleToPage(quadraticBezier.Point3.X + dx), _scaleToPage(quadraticBezier.Point3.Y + dy)); DrawPathInternal(canvas, brush, pen, quadraticBezier.IsStroked, quadraticBezier.IsFilled, path); } }
/// <inheritdoc/> public override void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { if (!quadraticBezier.IsFilled && !quadraticBezier.IsStroked) return; var _dc = dc as AM.DrawingContext; AM.IBrush brush = ToBrush(quadraticBezier.Style.Fill); AM.Pen pen = ToPen(quadraticBezier.Style, _scaleToPage); var sg = new AM.StreamGeometry(); using (var sgc = sg.Open()) { sgc.BeginFigure( new A.Point(quadraticBezier.Point1.X, quadraticBezier.Point1.Y), quadraticBezier.IsFilled); sgc.QuadraticBezierTo( new A.Point(quadraticBezier.Point2.X, quadraticBezier.Point2.Y), new A.Point(quadraticBezier.Point3.X, quadraticBezier.Point3.Y)); sgc.EndFigure(false); } _dc.DrawGeometry( quadraticBezier.IsFilled ? brush : null, quadraticBezier.IsStroked ? pen : null, sg); }
/// <summary> /// /// </summary> /// <param name="quadraticBezier"></param> /// <param name="v"></param> /// <param name="threshold"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static BaseShape HitTestQuadraticBezier(XQuadraticBezier quadraticBezier, Vector2 v, double threshold, double dx, double dy) { if (ShapeBounds.GetPointBounds(quadraticBezier.Point1, threshold, dx, dy).Contains(v)) { return quadraticBezier.Point1; } if (ShapeBounds.GetPointBounds(quadraticBezier.Point2, threshold, dx, dy).Contains(v)) { return quadraticBezier.Point2; } if (ShapeBounds.GetPointBounds(quadraticBezier.Point3, threshold, dx, dy).Contains(v)) { return quadraticBezier.Point3; } if (ShapeBounds.Contains(quadraticBezier.GetPoints().ToImmutableArray(), v, dx, dy)) { return quadraticBezier; } return null; }
/// <summary> /// Draws a <see cref="XQuadraticBezier"/> shape using drawing context. /// </summary> /// <param name="dc">The native drawing context.</param> /// <param name="quadraticBezier">The <see cref="XQuadraticBezier"/> shape.</param> /// <param name="dx">The X coordinate offset.</param> /// <param name="dy">The Y coordinate offset.</param> /// <param name="db">The properties database.</param> /// <param name="r">The data record.</param> public abstract void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r);
/// <inheritdoc/> public override void Draw(object dc, XQuadraticBezier quadraticBezier, double dx, double dy, ImmutableArray<XProperty> db, XRecord r) { var _gfx = dc as Graphics; Brush brush = ToSolidBrush(quadraticBezier.Style.Fill); Pen pen = ToPen(quadraticBezier.Style, _scaleToPage); double x1 = quadraticBezier.Point1.X; double y1 = quadraticBezier.Point1.Y; double x2 = quadraticBezier.Point1.X + (2.0 * (quadraticBezier.Point2.X - quadraticBezier.Point1.X)) / 3.0; double y2 = quadraticBezier.Point1.Y + (2.0 * (quadraticBezier.Point2.Y - quadraticBezier.Point1.Y)) / 3.0; double x3 = x2 + (quadraticBezier.Point3.X - quadraticBezier.Point1.X) / 3.0; double y3 = y2 + (quadraticBezier.Point3.Y - quadraticBezier.Point1.Y) / 3.0; double x4 = quadraticBezier.Point3.X; double y4 = quadraticBezier.Point3.Y; if (quadraticBezier.IsFilled) { var path = new GraphicsPath(); path.AddBezier( _scaleToPage(x1 + dx), _scaleToPage(y1 + dy), _scaleToPage(x2 + dx), _scaleToPage(y2 + dy), _scaleToPage(x3 + dx), _scaleToPage(y3 + dy), _scaleToPage(x4 + dx), _scaleToPage(y4 + dy)); _gfx.FillPath(brush, path); } if (quadraticBezier.IsStroked) { _gfx.DrawBezier( pen, _scaleToPage(x1 + dx), _scaleToPage(y1 + dy), _scaleToPage(x2 + dx), _scaleToPage(y2 + dy), _scaleToPage(x3 + dx), _scaleToPage(y3 + dy), _scaleToPage(x4 + dx), _scaleToPage(y4 + dy)); } brush.Dispose(); pen.Dispose(); }
public void Inherits_From_BaseShape() { var target = new XQuadraticBezier(); Assert.True(target is BaseShape); }
/// <inheritdoc/> public override void LeftDown(double x, double y) { base.LeftDown(x, y); var editor = _serviceProvider.GetService<ProjectEditor>(); double sx = editor.Project.Options.SnapToGrid ? ProjectEditor.Snap(x, editor.Project.Options.SnapX) : x; double sy = editor.Project.Options.SnapToGrid ? ProjectEditor.Snap(y, editor.Project.Options.SnapY) : y; switch (_currentState) { case ToolState.None: { var style = editor.Project.CurrentStyleLibrary.Selected; _quadraticBezier = XQuadraticBezier.Create( sx, sy, editor.Project.Options.CloneStyle ? style.Clone() : style, editor.Project.Options.PointShape, editor.Project.Options.DefaultIsStroked, editor.Project.Options.DefaultIsFilled); var result = editor.TryToGetConnectionPoint(sx, sy); if (result != null) { _quadraticBezier.Point1 = result; } editor.Project.CurrentContainer.WorkingLayer.Shapes = editor.Project.CurrentContainer.WorkingLayer.Shapes.Add(_quadraticBezier); editor.Project.CurrentContainer.WorkingLayer.Invalidate(); ToStateOne(); Move(_quadraticBezier); _currentState = ToolState.One; editor.CancelAvailable = true; } break; case ToolState.One: { if (_quadraticBezier != null) { _quadraticBezier.Point2.X = sx; _quadraticBezier.Point2.Y = sy; _quadraticBezier.Point3.X = sx; _quadraticBezier.Point3.Y = sy; var result = editor.TryToGetConnectionPoint(sx, sy); if (result != null) { _quadraticBezier.Point3 = result; } editor.Project.CurrentContainer.WorkingLayer.Invalidate(); ToStateTwo(); Move(_quadraticBezier); _currentState = ToolState.Two; } } break; case ToolState.Two: { if (_quadraticBezier != null) { _quadraticBezier.Point2.X = sx; _quadraticBezier.Point2.Y = sy; var result = editor.TryToGetConnectionPoint(sx, sy); if (result != null) { _quadraticBezier.Point2 = result; } editor.Project.CurrentContainer.WorkingLayer.Shapes = editor.Project.CurrentContainer.WorkingLayer.Shapes.Remove(_quadraticBezier); Remove(); base.Finalize(_quadraticBezier); editor.Project.AddShape(editor.Project.CurrentContainer.CurrentLayer, _quadraticBezier); _currentState = ToolState.None; editor.CancelAvailable = false; } } break; } }
/// <summary> /// /// </summary> /// <param name="quadraticBezier"></param> /// <param name="selection"></param> /// <param name="selected"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static bool HitTestQadraticBezier(XQuadraticBezier quadraticBezier, Vector2[] selection, ISet<BaseShape> selected, double dx, double dy) { var points = quadraticBezier.GetPoints().ToImmutableArray(); if (ShapeBounds.Overlap(selection, points, dx, dy)) { if (selected != null) { selected.Add(quadraticBezier); return false; } else { return true; } } return false; }