/// file: EllipseBorderPencil.cs /// Author: Maxime Rohmer /// Brief: A tool that paints the outline of an ellipse /// Version: 0.1.0 /// Date: 17/06/2022 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace Paint_2 { internal class EllipseBorderPencil : PaintTool { private List> _drawings; private List> _drawingsRedo; private bool _needsFullRefresh; private bool _isShiftPressed; private bool _isCtrlPressed; private PaintToolUtils Utils; private List _colors; private List _colorsRedo; private List _widths; private List _widthsRedo; private Color _color; private string _name; private int _width; public List> Drawings { get => _drawings; set => _drawings = value; } public List> DrawingsRedo { get => _drawingsRedo; set => _drawingsRedo = value; } public bool NeedsFullRefresh { get => _needsFullRefresh; set => _needsFullRefresh = value; } public List Colors { get => _colors; set => _colors = value; } public List ColorsRedo { get => _colorsRedo; set => _colorsRedo = value; } public List Widths { get => _widths; set => _widths = value; } public List WidthsRedo { get => _widthsRedo; set => _widthsRedo = value; } public bool IsShiftPressed { get => _isShiftPressed; set => _isShiftPressed = value; } public bool IsCtrlPressed { get => _isCtrlPressed; set => _isCtrlPressed = value; } public Color Color { get => _color; set => _color = value; } public string Name { get => _name; set => _name = value; } public int Width { get => _width; set => _width = value; } public EllipseBorderPencil(string name) { NeedsFullRefresh = true; Drawings = new List>(); DrawingsRedo = new List>(); Colors = new List(); ColorsRedo = new List(); Widths = new List(); WidthsRedo = new List(); Name = name; Utils = new PaintToolUtils(this); } public void Add(Point point) { List myDrawing = Drawings[Drawings.Count - 1]; if (myDrawing.Count == 0 || myDrawing.Count == 1) { myDrawing.Add(point); } else { myDrawing[1] = point; } Drawings[Drawings.Count - 1] = myDrawing; } public string PaintSVG() { string result = ""; string newLine = Environment.NewLine; int drawingCounter = 0; Size pointSize; foreach (List drawing in Drawings) { if (drawing.Count == 2) { Point start = drawing[0]; Point end = drawing[1]; List points; if (drawingCounter == Drawings.Count - 1) { points = Utils.ConvertRectangleIntoPositive(IsCtrlPressed, drawing[0], drawing[1]); } else { points = Utils.ConvertRectangleIntoPositive(false, drawing[0], drawing[1]); } start = points[0]; end = points[1]; Size size = new Size((end.X - start.X) / 2, (end.Y - start.Y) / 2); result += ""; result += newLine; } drawingCounter++; } return result; } public void Paint(Bitmap canvas) { Graphics gr = Graphics.FromImage(canvas); int drawingCounter = 0; foreach (List drawing in Drawings) { if (drawing.Count == 2) { Point start = drawing[0]; Point end = drawing[1]; List points; if (drawingCounter == Drawings.Count - 1) { points = Utils.ConvertRectangleIntoPositive(IsCtrlPressed, drawing[0], drawing[1]); } else { points = Utils.ConvertRectangleIntoPositive(false, drawing[0], drawing[1]); } start = points[0]; end = points[1]; gr.DrawEllipse(new Pen(Colors[drawingCounter], Widths[drawingCounter]), new Rectangle(start, new Size(end.X - start.X, end.Y - start.Y))); } drawingCounter++; } } public void Start(Color color, int width) { Utils.StandartStart(color, width); } public void Clear() { Utils.StandartClear(); } public void Stop() { List myDrawing = Drawings.Last(); Drawings[Drawings.Count - 1] = Utils.ConvertRectangleIntoPositive(IsCtrlPressed, myDrawing[0], myDrawing[1]); } private Bitmap PostProcessing(List Drawing, Bitmap bmp, int width, Color color) { return bmp; } public List GetLastColors(int colorNumber) { return Utils.SandartGetLastColors(colorNumber); } public override string ToString() { return Name; } public void Undo() { Utils.StandartUndo(); } public void Redo() { Utils.StandartRedo(); } public object Clone() { EllipseBorderPencil result = new EllipseBorderPencil(Name); result.Width = Width; result.Color = Color; return (Object)(result); } } }