// BitmapFrameEd - Bitmap Sprite Editor // Copyright (C) 2005 Ian Cowburn // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // $Id$ // using System; using System.ComponentModel; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; using System.Diagnostics; namespace BitmapSpriteEd { /// /// Implements a control for drawing /// [ToolboxItem(true)] public class GfxEditor : System.Windows.Forms.UserControl { private System.Windows.Forms.Label m_backCol; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label m_fgPreview; private System.Windows.Forms.ComboBox m_sizeY; private System.Windows.Forms.ComboBox m_sizeX; private System.Windows.Forms.Button m_manipButton; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label6; private System.Windows.Forms.PictureBox m_edit; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label m_recent8; private System.Windows.Forms.Label m_recent7; private System.Windows.Forms.Label m_recent4; private System.Windows.Forms.Label m_recent5; private System.Windows.Forms.Label m_recent6; private System.Windows.Forms.Label label11; private System.Windows.Forms.CheckBox m_mark; private System.Windows.Forms.Label m_recent1; private System.Windows.Forms.Label m_recent2; private System.Windows.Forms.Label m_recent3; private System.Windows.Forms.Label label13; private System.Windows.Forms.Label label14; private System.Windows.Forms.Label label12; private System.Windows.Forms.Button m_undoButton; private System.Windows.Forms.Label label15; private System.Windows.Forms.Label m_gridCol; private System.Windows.Forms.PictureBox m_preview; private System.Windows.Forms.Label m_bgPreview; private System.Windows.Forms.ComboBox m_modeList; private System.Windows.Forms.Label m_pos; public const int MAX_SIZE=32; public class FrameResizeEventArgs : EventArgs { public FrameResizeEventArgs(int width, int height) { m_width=width; m_height=height; } public int Width {get {return m_width;}} public int Height {get {return m_height;}} private int m_width; private int m_height; } public delegate void FrameResizeEventHandler(object sender, FrameResizeEventArgs e); public event FrameResizeEventHandler FrameResize; protected virtual void OnFrameResize(FrameResizeEventArgs e) { if (FrameResize!=null) { FrameResize(this,e); } } private const int SIZE=256; private Color TRANS=Color.Empty; // These MUST match the entries in the drop down list // private enum Mode { ePlot, eLine, eRectangle, eFilledRectangle, eCircle, eFilledCircle, eEllipse, eFilledEllipse, eFloodFill, eCopyPaste }; //private bool m_inEditor; private Frame m_char; private Frame m_undo; private int m_width; private int m_height; private Rectangle m_editRect; private Bitmap m_editBmp; private Rectangle m_prevRect; private Bitmap m_prevBmp; private int m_grid; private int m_mx; private int m_my; private bool m_drawing; private Mode m_mode; private Color[,] m_overlay; private int m_ox; private int m_oy; private Color m_pen; private CopyMenu m_cpMenu; private int m_cpX; private int m_cpY; private int m_cpWidth; private int m_cpHeight; private Color[,] m_cpBuff; private ManipulationMenu m_manipMenu; private Label[] m_recent; public GfxEditor() { // // InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); //m_inEditor=false; SetUndo(null); m_char=null; m_grid=8; m_mx=SIZE; m_my=SIZE; m_editRect=m_edit.ClientRectangle; m_editBmp=new Bitmap(m_editRect.Width,m_editRect.Height); m_edit.Image=m_editBmp; m_prevRect=m_edit.ClientRectangle; m_prevBmp=new Bitmap(m_prevRect.Width,m_prevRect.Height); m_preview.Image=m_prevBmp; m_drawing=false; m_mode=Mode.ePlot; m_bgPreview.BackColor=Color.FromArgb(0); if (m_editRect.Width!=SIZE && m_editRect.Height!=SIZE) { throw new Exception("GfxEditor built with bad SIZE!"); } m_modeList.SelectedIndex=0; m_cpMenu=new CopyMenu(); m_manipMenu=new ManipulationMenu(); m_recent=new Label[] {m_recent1,m_recent2,m_recent3,m_recent4, m_recent5,m_recent6,m_recent7,m_recent8}; } #region Windows Forms Designer generated code /// /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might /// not be able to load this method if it was changed manually. /// private void InitializeComponent() { this.m_pos = new System.Windows.Forms.Label(); this.m_modeList = new System.Windows.Forms.ComboBox(); this.m_bgPreview = new System.Windows.Forms.Label(); this.m_preview = new System.Windows.Forms.PictureBox(); this.m_gridCol = new System.Windows.Forms.Label(); this.label15 = new System.Windows.Forms.Label(); this.m_undoButton = new System.Windows.Forms.Button(); this.label12 = new System.Windows.Forms.Label(); this.label14 = new System.Windows.Forms.Label(); this.label13 = new System.Windows.Forms.Label(); this.m_recent3 = new System.Windows.Forms.Label(); this.m_recent2 = new System.Windows.Forms.Label(); this.m_recent1 = new System.Windows.Forms.Label(); this.m_mark = new System.Windows.Forms.CheckBox(); this.label11 = new System.Windows.Forms.Label(); this.m_recent6 = new System.Windows.Forms.Label(); this.m_recent5 = new System.Windows.Forms.Label(); this.m_recent4 = new System.Windows.Forms.Label(); this.m_recent7 = new System.Windows.Forms.Label(); this.m_recent8 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.m_edit = new System.Windows.Forms.PictureBox(); this.label6 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.m_manipButton = new System.Windows.Forms.Button(); this.m_sizeX = new System.Windows.Forms.ComboBox(); this.m_sizeY = new System.Windows.Forms.ComboBox(); this.m_fgPreview = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.m_backCol = new System.Windows.Forms.Label(); this.SuspendLayout(); // // m_pos // this.m_pos.Location = new System.Drawing.Point(208, 272); this.m_pos.Name = "m_pos"; this.m_pos.Size = new System.Drawing.Size(56, 24); this.m_pos.TabIndex = 23; this.m_pos.TextAlign = System.Drawing.ContentAlignment.TopRight; // // m_modeList // this.m_modeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.m_modeList.Items.AddRange(new object[] { "Plot", "Line", "Rectangle", "Filled Rect", "Circle", "Filled Circle", "Ellipse", "Filled Ellipse", "Flood Fill", "Copy/Paste"}); this.m_modeList.Location = new System.Drawing.Point(280, 64); this.m_modeList.MaxDropDownItems = 16; this.m_modeList.Name = "m_modeList"; this.m_modeList.Size = new System.Drawing.Size(104, 21); this.m_modeList.TabIndex = 15; this.m_modeList.SelectedIndexChanged += new System.EventHandler(this.OnModeSelect); // // m_bgPreview // this.m_bgPreview.BackColor = System.Drawing.Color.Transparent; this.m_bgPreview.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_bgPreview.Location = new System.Drawing.Point(336, 104); this.m_bgPreview.Name = "m_bgPreview"; this.m_bgPreview.Size = new System.Drawing.Size(40, 32); this.m_bgPreview.TabIndex = 18; this.m_bgPreview.Click += new System.EventHandler(this.OnBackground); // // m_preview // this.m_preview.BackColor = System.Drawing.SystemColors.Control; this.m_preview.Location = new System.Drawing.Point(288, 192); this.m_preview.Name = "m_preview"; this.m_preview.Size = new System.Drawing.Size(34, 34); this.m_preview.TabIndex = 1; this.m_preview.TabStop = false; // // m_gridCol // this.m_gridCol.BackColor = System.Drawing.Color.Lime; this.m_gridCol.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_gridCol.Location = new System.Drawing.Point(136, 272); this.m_gridCol.Name = "m_gridCol"; this.m_gridCol.Size = new System.Drawing.Size(24, 24); this.m_gridCol.TabIndex = 33; this.m_gridCol.Click += new System.EventHandler(this.OnGrid); // // label15 // this.label15.Location = new System.Drawing.Point(0, 0); this.label15.Name = "label15"; this.label15.TabIndex = 0; // // m_undoButton // this.m_undoButton.Location = new System.Drawing.Point(8, 272); this.m_undoButton.Name = "m_undoButton"; this.m_undoButton.Size = new System.Drawing.Size(72, 24); this.m_undoButton.TabIndex = 16; this.m_undoButton.Text = "Undo"; this.m_undoButton.Click += new System.EventHandler(this.OnUndo); // // label12 // this.label12.BackColor = System.Drawing.Color.White; this.label12.Location = new System.Drawing.Point(200, 144); this.label12.Name = "label12"; this.label12.Size = new System.Drawing.Size(16, 16); this.label12.TabIndex = 31; // // label14 // this.label14.BackColor = System.Drawing.Color.White; this.label14.Location = new System.Drawing.Point(152, 144); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(16, 16); this.label14.TabIndex = 29; // // label13 // this.label13.BackColor = System.Drawing.Color.White; this.label13.Location = new System.Drawing.Point(176, 144); this.label13.Name = "label13"; this.label13.Size = new System.Drawing.Size(16, 16); this.label13.TabIndex = 30; // // m_recent3 // this.m_recent3.BackColor = System.Drawing.Color.Black; this.m_recent3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent3.Location = new System.Drawing.Point(328, 248); this.m_recent3.Name = "m_recent3"; this.m_recent3.Size = new System.Drawing.Size(16, 16); this.m_recent3.TabIndex = 27; this.m_recent3.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent2 // this.m_recent2.BackColor = System.Drawing.Color.Black; this.m_recent2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent2.Location = new System.Drawing.Point(304, 248); this.m_recent2.Name = "m_recent2"; this.m_recent2.Size = new System.Drawing.Size(16, 16); this.m_recent2.TabIndex = 26; this.m_recent2.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent1 // this.m_recent1.BackColor = System.Drawing.Color.White; this.m_recent1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent1.Location = new System.Drawing.Point(280, 248); this.m_recent1.Name = "m_recent1"; this.m_recent1.Size = new System.Drawing.Size(16, 16); this.m_recent1.TabIndex = 25; this.m_recent1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_mark // this.m_mark.Checked = true; this.m_mark.CheckState = System.Windows.Forms.CheckState.Checked; this.m_mark.Location = new System.Drawing.Point(280, 136); this.m_mark.Name = "m_mark"; this.m_mark.Size = new System.Drawing.Size(96, 32); this.m_mark.TabIndex = 35; this.m_mark.Text = "Highlight Dark Colours"; this.m_mark.CheckedChanged += new System.EventHandler(this.OnMark); // // label11 // this.label11.BackColor = System.Drawing.Color.White; this.label11.Location = new System.Drawing.Point(224, 144); this.label11.Name = "label11"; this.label11.Size = new System.Drawing.Size(16, 16); this.label11.TabIndex = 32; // // m_recent6 // this.m_recent6.BackColor = System.Drawing.Color.Black; this.m_recent6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent6.Location = new System.Drawing.Point(304, 272); this.m_recent6.Name = "m_recent6"; this.m_recent6.Size = new System.Drawing.Size(16, 16); this.m_recent6.TabIndex = 30; this.m_recent6.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent5 // this.m_recent5.BackColor = System.Drawing.Color.Black; this.m_recent5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent5.Location = new System.Drawing.Point(280, 272); this.m_recent5.Name = "m_recent5"; this.m_recent5.Size = new System.Drawing.Size(16, 16); this.m_recent5.TabIndex = 29; this.m_recent5.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent4 // this.m_recent4.BackColor = System.Drawing.Color.Black; this.m_recent4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent4.Location = new System.Drawing.Point(352, 248); this.m_recent4.Name = "m_recent4"; this.m_recent4.Size = new System.Drawing.Size(16, 16); this.m_recent4.TabIndex = 28; this.m_recent4.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent7 // this.m_recent7.BackColor = System.Drawing.Color.Black; this.m_recent7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent7.Location = new System.Drawing.Point(328, 272); this.m_recent7.Name = "m_recent7"; this.m_recent7.Size = new System.Drawing.Size(16, 16); this.m_recent7.TabIndex = 31; this.m_recent7.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // m_recent8 // this.m_recent8.BackColor = System.Drawing.Color.Black; this.m_recent8.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_recent8.Location = new System.Drawing.Point(352, 272); this.m_recent8.Name = "m_recent8"; this.m_recent8.Size = new System.Drawing.Size(16, 16); this.m_recent8.TabIndex = 32; this.m_recent8.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnRecent); // // label4 // this.label4.Location = new System.Drawing.Point(280, 88); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(32, 16); this.label4.TabIndex = 10; this.label4.Text = "Left"; this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // m_edit // this.m_edit.BackColor = System.Drawing.SystemColors.Control; this.m_edit.Location = new System.Drawing.Point(8, 8); this.m_edit.Name = "m_edit"; this.m_edit.Size = new System.Drawing.Size(256, 256); this.m_edit.TabIndex = 0; this.m_edit.TabStop = false; this.m_edit.MouseEnter += new System.EventHandler(this.OnEnterEditor); this.m_edit.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove); this.m_edit.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove); this.m_edit.MouseLeave += new System.EventHandler(this.OnLeaveEditor); this.m_edit.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove); // // label6 // this.label6.Location = new System.Drawing.Point(336, 8); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(48, 16); this.label6.TabIndex = 22; this.label6.Text = "Height"; this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label7 // this.label7.Location = new System.Drawing.Point(280, 232); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(88, 16); this.label7.TabIndex = 24; this.label7.Text = "Recent Colours"; this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label1 // this.label1.Location = new System.Drawing.Point(280, 48); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(64, 16); this.label1.TabIndex = 3; this.label1.Text = "Draw Mode"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label2 // this.label2.Location = new System.Drawing.Point(280, 168); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(56, 16); this.label2.TabIndex = 21; this.label2.Text = "Preview"; this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // label3 // this.label3.Location = new System.Drawing.Point(280, 8); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(48, 16); this.label3.TabIndex = 8; this.label3.Text = "Width"; this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // m_manipButton // this.m_manipButton.Enabled = false; this.m_manipButton.Location = new System.Drawing.Point(336, 184); this.m_manipButton.Name = "m_manipButton"; this.m_manipButton.Size = new System.Drawing.Size(48, 24); this.m_manipButton.TabIndex = 38; this.m_manipButton.Text = "Manip"; this.m_manipButton.Click += new System.EventHandler(this.OnManip); // // m_sizeX // this.m_sizeX.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.m_sizeX.Enabled = false; this.m_sizeX.Items.AddRange(new object[] { "8", "16", "32"}); this.m_sizeX.Location = new System.Drawing.Point(280, 24); this.m_sizeX.Name = "m_sizeX"; this.m_sizeX.Size = new System.Drawing.Size(48, 21); this.m_sizeX.TabIndex = 36; this.m_sizeX.SelectedIndexChanged += new System.EventHandler(this.OnSizeWidth); // // m_sizeY // this.m_sizeY.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.m_sizeY.Enabled = false; this.m_sizeY.Items.AddRange(new object[] { "8", "16", "32"}); this.m_sizeY.Location = new System.Drawing.Point(336, 24); this.m_sizeY.Name = "m_sizeY"; this.m_sizeY.Size = new System.Drawing.Size(48, 21); this.m_sizeY.TabIndex = 37; this.m_sizeY.SelectedIndexChanged += new System.EventHandler(this.OnSizeHeight); // // m_fgPreview // this.m_fgPreview.BackColor = System.Drawing.Color.White; this.m_fgPreview.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_fgPreview.Location = new System.Drawing.Point(280, 104); this.m_fgPreview.Name = "m_fgPreview"; this.m_fgPreview.Size = new System.Drawing.Size(40, 32); this.m_fgPreview.TabIndex = 17; this.m_fgPreview.Click += new System.EventHandler(this.OnForeground); // // label5 // this.label5.Location = new System.Drawing.Point(336, 88); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(40, 16); this.label5.TabIndex = 12; this.label5.Text = "Right"; this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // m_backCol // this.m_backCol.BackColor = System.Drawing.Color.Black; this.m_backCol.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.m_backCol.Location = new System.Drawing.Point(168, 272); this.m_backCol.Name = "m_backCol"; this.m_backCol.Size = new System.Drawing.Size(24, 24); this.m_backCol.TabIndex = 34; this.m_backCol.Click += new System.EventHandler(this.OnPaper); // // GfxEditor // this.Controls.Add(this.m_manipButton); this.Controls.Add(this.m_sizeY); this.Controls.Add(this.m_sizeX); this.Controls.Add(this.m_mark); this.Controls.Add(this.m_backCol); this.Controls.Add(this.m_gridCol); this.Controls.Add(this.m_recent8); this.Controls.Add(this.m_recent7); this.Controls.Add(this.m_recent6); this.Controls.Add(this.m_recent5); this.Controls.Add(this.m_recent4); this.Controls.Add(this.m_recent3); this.Controls.Add(this.m_recent2); this.Controls.Add(this.m_recent1); this.Controls.Add(this.label7); this.Controls.Add(this.m_pos); this.Controls.Add(this.label6); this.Controls.Add(this.label2); this.Controls.Add(this.m_bgPreview); this.Controls.Add(this.m_fgPreview); this.Controls.Add(this.m_undoButton); this.Controls.Add(this.m_modeList); this.Controls.Add(this.label5); this.Controls.Add(this.label4); this.Controls.Add(this.label3); this.Controls.Add(this.label1); this.Controls.Add(this.m_preview); this.Controls.Add(this.m_edit); this.Name = "GfxEditor"; this.Size = new System.Drawing.Size(392, 304); this.ResumeLayout(false); } #endregion // ------------------------------------------------------- // PUBLIC INTERFACES // ------------------------------------------------------- #region Public Interfaces public int FrameWidth { get {return m_width;} } public int FrameHeight { get {return m_height;} } public Frame Frame { get {return m_char;} set { m_char=value; SetUndo(null); m_manipButton.Enabled=true; m_width=m_char.Width; m_height=m_char.Height; m_sizeX.Enabled=true; m_sizeY.Enabled=true; m_sizeX.Text=m_char.Width.ToString(); m_sizeY.Text=m_char.Height.ToString(); InitialiseOverlay(); DrawGrid(); DrawChar(); } } public Color SelectedForeground { get {return m_fgPreview.BackColor;} } public Color SelectedBackground { get {return m_bgPreview.BackColor;} } #endregion // ------------------------------------------------------- // MISC // ------------------------------------------------------- #region Misc Routines private void AddRecentColour(Color c) { foreach (Label l in m_recent) { if (l.BackColor==c) { return; } } for(int f=m_recent.Length-1;f>0;f--) { m_recent[f].BackColor=m_recent[f-1].BackColor; } m_recent[0].BackColor=c; } private void SetUndo(Frame s) { m_undo=s; m_undoButton.Enabled=(m_undo!=null); } #endregion // ------------------------------------------------------- // SPRITE/GENERAL DRAWING // ------------------------------------------------------- #region Frame/General Drawing private void Flush(ref Graphics g) { g.Flush(FlushIntention.Sync); g.Dispose(); g=null; } private void DrawGrid() { Graphics g=Graphics.FromImage(m_prevBmp); Pen p=new Pen(m_gridCol.BackColor); g.Clear(Color.Black); Flush(ref g); g=Graphics.FromImage(m_editBmp); g.Clear(m_backCol.BackColor); for(int x=0;x0) || (c.A>0 && c.A<100)) { edit.DrawRectangle(Pens.White,gx+1,gy+1,gw-3,gw-3); } } } #endregion // ------------------------------------------------------- // OVERLAY HANDLING // ------------------------------------------------------- #region Overlay Handling private void InitialiseOverlay() { if (m_char==null) { m_overlay=null; return; } m_overlay=new Color[m_char.Width,m_char.Height]; for(int y=0;yc2) { int t=c2; c2=c1; c1=t; } } private void SafePlot(int x, int y, Color col) { if (x>=0 && x=0 && ydx) { ymode=true; d=dx*2-dy; incrE=dx*2; incrNE=(dx-dy)*2; } else { ymode=false; d=dy*2-dx; incrE=dy*2; incrNE=(dy-dx)*2; } int x=x1; int y=y1; SafePlot(x,y,col); if (ymode) { while(y!=y2) { if (d<=0) { d+=incrE; y+=iy; } else { d+=incrNE; y+=iy; x+=ix; } SafePlot(x,y,col); } } else { while(x!=x2) { if (d<=0) { d+=incrE; x+=ix; } else { d+=incrNE; y+=iy; x+=ix; } SafePlot(x,y,col); } } } private void DrawRect(int x1, int y1, int x2, int y2, Color col, bool fill) { RankCoord(ref x1, ref x2); RankCoord(ref y1, ref y2); if (fill) { for(int x=x1;x<=x2;x++) for(int y=y1;y<=y2;y++) m_overlay[x,y]=col; } else { for(int x=x1;x<=x2;x++) { m_overlay[x,y1]=col; m_overlay[x,y2]=col; } for(int y=y1;y<=y2;y++) { m_overlay[x1,y]=col; m_overlay[x2,y]=col; } } } private void DrawEllipse(int ox, int oy, int radpointx, int radpointy, Color col, bool circle, bool fill) { double rx=Math.Abs(ox-radpointx)+1; double ry=Math.Abs(oy-radpointy)+1; if (circle) { rx=Math.Max(rx,ry); ry=rx; } for(double a=0;a<=Math.PI;a+=Math.PI/180) { int x=(int)(Math.Sin(a)*rx); int y=(int)(Math.Cos(a)*ry); if (fill) { for(int f=-x;f<=x;f++) SafePlot(ox+f,oy+y,col); } else { SafePlot(ox+x,oy+y,col); SafePlot(ox-x,oy+y,col); } } } private void FloodFill(int x, int y, Color col, Color bg) { if (m_overlay[x,y]==col || m_overlay[x,y]!=bg) { return; } m_overlay[x,y]=col; if (x>0) FloodFill(x-1,y,col,bg); if (y>0) FloodFill(x,y-1,col,bg); if (x=m_mx || e.Y<0 || e.Y>=m_my) { return; } int x; int y; x=e.X/m_grid; y=e.Y/m_grid; m_pos.Text=x+","+y; if (x>=m_char.Width || y>=m_char.Height) { return; } if (e.Button==MouseButtons.None) { switch(m_mode) { case Mode.eFloodFill: if (m_drawing) { OverlayFromFrame(); FloodFill(m_ox,m_oy,m_pen,m_char[m_ox,m_oy]); m_drawing=false; SetUndo(new Frame(m_char)); ApplyOverlay(); DrawChar(); } break; case Mode.eCopyPaste: switch(m_cpMenu.Mode) { case CopyMenu.EMode.eMark: if (m_drawing) { ClearOverlay(); Copy(m_ox,m_oy,x,y); DrawChar(); m_drawing=false; } break; case CopyMenu.EMode.ePaste: ClearOverlay(); Paste((int)x,(int)y,false); DrawChar(); break; case CopyMenu.EMode.ePasteTransparent: ClearOverlay(); Paste((int)x,(int)y,true); DrawChar(); break; default: break; } break; default: if (m_drawing) { m_drawing=false; SetUndo(new Frame(m_char)); ApplyOverlay(); DrawChar(); } break; } return; } if (!m_drawing) { m_ox=x; m_oy=y; m_drawing=true; if (e.Button==MouseButtons.Left) { m_pen=m_fgPreview.BackColor; } else { m_pen=m_bgPreview.BackColor; } } switch(m_mode) { case Mode.ePlot: m_overlay[x,y]=m_pen; DrawChar(); break; case Mode.eLine: ClearOverlay(); DrawLine(m_ox,m_oy,x,y,m_pen); DrawChar(); break; case Mode.eRectangle: ClearOverlay(); DrawRect(m_ox,m_oy,x,y,m_pen,false); DrawChar(); break; case Mode.eFilledRectangle: ClearOverlay(); DrawRect(m_ox,m_oy,x,y,m_pen,true); DrawChar(); break; case Mode.eCircle: ClearOverlay(); DrawEllipse(m_ox,m_oy,x,y,m_pen,true,false); DrawChar(); break; case Mode.eFilledCircle: ClearOverlay(); DrawEllipse(m_ox,m_oy,x,y,m_pen,true,true); DrawChar(); break; case Mode.eEllipse: ClearOverlay(); DrawEllipse(m_ox,m_oy,x,y,m_pen,false,false); DrawChar(); break; case Mode.eFilledEllipse: ClearOverlay(); DrawEllipse(m_ox,m_oy,x,y,m_pen,false,true); DrawChar(); break; case Mode.eFloodFill: break; case Mode.eCopyPaste: if (e.Button==MouseButtons.Right) { m_cpMenu.AllowPaste=(m_cpBuff!=null); m_cpMenu.Show(m_edit,e.X,e.Y); } else { switch(m_cpMenu.Mode) { case CopyMenu.EMode.eMark: ClearOverlay(); DrawMarkBox(m_ox,m_oy,x,y); DrawChar(); break; case CopyMenu.EMode.ePaste: case CopyMenu.EMode.ePasteTransparent: SetUndo(new Frame(m_char)); ApplyOverlay(); DrawChar(); m_drawing=false; m_cpMenu.Mode=CopyMenu.EMode.eNothing; break; default: break; } } break; } } void OnForeground(object sender, System.EventArgs e) { AlphaColourDialog d=new AlphaColourDialog("Select Colour for Left Mouse Button"); d.Color=m_fgPreview.BackColor; if (d.ShowDialog()==DialogResult.OK) { m_fgPreview.BackColor=d.Color; AddRecentColour(d.Color); } } void OnBackground(object sender, System.EventArgs e) { AlphaColourDialog d=new AlphaColourDialog("Select Colour for Right Mouse Button"); d.Color=m_bgPreview.BackColor; if (d.ShowDialog()==DialogResult.OK) { m_bgPreview.BackColor=d.Color; AddRecentColour(d.Color); } } void OnRecent(object sender, System.Windows.Forms.MouseEventArgs e) { Label l=(Label)sender; if (e.Button==MouseButtons.Left) { m_fgPreview.BackColor=l.BackColor; } else if (e.Button==MouseButtons.Right) { m_bgPreview.BackColor=l.BackColor; } } void OnGrid(object sender, System.EventArgs e) { AlphaColourDialog d=new AlphaColourDialog("Select Grid Colour"); d.AllowAlpha=false; d.Color=m_gridCol.BackColor; if (d.ShowDialog()==DialogResult.OK) { m_gridCol.BackColor=d.Color; RedrawChar(); } } void OnPaper(object sender, System.EventArgs e) { AlphaColourDialog d=new AlphaColourDialog("Select Background Colour"); d.AllowAlpha=false; d.Color=m_backCol.BackColor; if (d.ShowDialog()==DialogResult.OK) { m_backCol.BackColor=d.Color; RedrawChar(); } } void OnMark(object sender, System.EventArgs e) { RedrawChar(); } void OnManip(object sender, System.EventArgs e) { Control c=(Control)sender; bool redraw=true; m_manipMenu.Show(c,c.Width,c.Height/2); switch(m_manipMenu.Mode) { case ManipulationMenu.EMode.eMirrorHorizontal: m_char.MirrorHorizontal(); break; case ManipulationMenu.EMode.eMirrorVertical: m_char.MirrorVertical(); break; case ManipulationMenu.EMode.eRotateLeft: m_char.RotateLeft(); break; case ManipulationMenu.EMode.eRotateRight: m_char.RotateRight(); break; case ManipulationMenu.EMode.eScrollUp: m_char.Scroll(0,-1); break; case ManipulationMenu.EMode.eScrollDown: m_char.Scroll(0,1); break; case ManipulationMenu.EMode.eScrollLeft: m_char.Scroll(-1,0); break; case ManipulationMenu.EMode.eScrollRight: m_char.Scroll(1,0); break; case ManipulationMenu.EMode.eNothing: redraw=false; break; } if (redraw) { RedrawChar(); } } #endregion } }