protected override Rectangle DrawShape(Rectangle rect, Layer l) { Rectangle dirty; using (Context g = new Context (l.Surface)) { g.AppendPath (PintaCore.Layers.SelectionPath); g.FillRule = FillRule.EvenOdd; g.Clip (); g.Antialias = Antialias.Subpixel; dirty = rect; if (FillShape && StrokeShape) dirty = g.FillStrokedEllipse (rect, fill_color, outline_color, BrushWidth); else if (FillShape) dirty = g.FillEllipse (rect, outline_color); else dirty = g.DrawEllipse (rect, outline_color, BrushWidth); } return dirty; }
/// <summary> /// Draws the hover point, if any. /// </summary> /// <param name="g"></param> protected void DrawHoverPoint(Context g) { ShapeEngine activeEngine = ActiveShapeEngine; if (activeEngine != null) { last_control_pt_size = Math.Min(activeEngine.BrushWidth + 1, 5); } else { last_control_pt_size = Math.Min(BrushWidth + 1, 5); } double controlPointOffset = (double)last_control_pt_size / 2d; //Verify that the user isn't changing the tension of a control point and that there is a hover point to draw. if (!changing_tension && hover_point.X > -1d) { Rectangle hoverOuterEllipseRect = new Rectangle( hover_point.X - controlPointOffset * 3d, hover_point.Y - controlPointOffset * 3d, controlPointOffset * 6d, controlPointOffset * 6d); g.FillStrokedEllipse(hoverOuterEllipseRect, hover_color, hover_color, 1); g.FillStrokedEllipse(new Rectangle( hover_point.X - controlPointOffset, hover_point.Y - controlPointOffset, last_control_pt_size, last_control_pt_size), hover_color, hover_color, (int)last_control_pt_size); hoverOuterEllipseRect = hoverOuterEllipseRect.Inflate(1, 1); //Since the hover point can be outside of the active shape's bounds (hovering over a different shape), a special //invalidation call needs to be made for the hover point in order to ensure its visibility at all times. PintaCore.Workspace.Invalidate(hoverOuterEllipseRect.ToGdkRectangle()); last_hover = hoverOuterEllipseRect; last_hover = last_hover.Value.Clamp(); } }
}
protected void DrawControlPoints(Context g, bool drawHoverSelection) { ShapeEngine activeEngine = ActiveShapeEngine; if (activeEngine != null) { last_control_pt_size = Math.Min(activeEngine.BrushWidth + 1, 3); } else { last_control_pt_size = Math.Min(BrushWidth + 1, 3); } double controlPointOffset = (double)last_control_pt_size / 2d; if (activeEngine != null) { //Draw the control points for the active shape. if (drawHoverSelection) { ControlPoint selPoint = SelectedPoint; if (selPoint != null) { //Draw a ring around the selected point. g.FillStrokedEllipse( new Rectangle( selPoint.Position.X - controlPointOffset * 4d, selPoint.Position.Y - controlPointOffset * 4d, controlPointOffset * 8d, controlPointOffset * 8d), ToolControl.FillColor, ToolControl.StrokeColor, 1); } } List<ControlPoint> controlPoints = activeEngine.ControlPoints; //Determine if the shape has one or more points. if (controlPoints.Count > 0) { //Draw the control points for the shape. for (int i = 0; i < controlPoints.Count; ++i) { //Skip drawing the hovered control point. if (drawHoverSelection && hovered_pt_as_control_pt > -1 && hover_point.Distance(controlPoints[i].Position) < 1d) { continue; } //Draw each control point. g.FillStrokedEllipse( new Rectangle( controlPoints[i].Position.X - controlPointOffset, controlPoints[i].Position.Y - controlPointOffset, last_control_pt_size, last_control_pt_size), ToolControl.FillColor, ToolControl.StrokeColor, (int)last_control_pt_size); } } if (drawHoverSelection) { //Draw the hover point. DrawHoverPoint(g); } } }