From 93ac9c657ce285c5daa5a3ea6ed8c91b50e0281c Mon Sep 17 00:00:00 2001 From: Ian C Date: Sat, 30 Jul 2005 01:55:41 +0000 Subject: Development checkin --- GfxEditor.cs | 1398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1398 insertions(+) create mode 100644 GfxEditor.cs (limited to 'GfxEditor.cs') diff --git a/GfxEditor.cs b/GfxEditor.cs new file mode 100644 index 0000000..c564a52 --- /dev/null +++ b/GfxEditor.cs @@ -0,0 +1,1398 @@ +// 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_fgPreview; + private System.Windows.Forms.ComboBox m_modeList; + private System.Windows.Forms.Label m_recent8; + private System.Windows.Forms.Label m_recent1; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label m_recent3; + private System.Windows.Forms.Label m_recent5; + private System.Windows.Forms.Label m_recent6; + private System.Windows.Forms.Label m_recent7; + private System.Windows.Forms.Label m_bgPreview; + private System.Windows.Forms.Label m_recent2; + private System.Windows.Forms.ComboBox m_sizeY; + private System.Windows.Forms.CheckBox m_mark; + private System.Windows.Forms.PictureBox m_preview; + private System.Windows.Forms.Label m_gridCol; + private System.Windows.Forms.PictureBox m_edit; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label m_pos; + private System.Windows.Forms.Label m_recent4; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Button m_undoButton; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox m_sizeX; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label m_backCol; + + public const int MAX_SIZE=32; + + 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 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_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_backCol = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.m_sizeX = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.m_undoButton = new System.Windows.Forms.Button(); + this.label15 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.m_recent4 = new System.Windows.Forms.Label(); + this.m_pos = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.m_edit = new System.Windows.Forms.PictureBox(); + this.m_gridCol = new System.Windows.Forms.Label(); + this.m_preview = new System.Windows.Forms.PictureBox(); + this.m_mark = new System.Windows.Forms.CheckBox(); + this.m_sizeY = new System.Windows.Forms.ComboBox(); + this.m_recent2 = new System.Windows.Forms.Label(); + this.m_bgPreview = new System.Windows.Forms.Label(); + this.m_recent7 = new System.Windows.Forms.Label(); + this.m_recent6 = new System.Windows.Forms.Label(); + this.m_recent5 = new System.Windows.Forms.Label(); + this.m_recent3 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.m_recent1 = new System.Windows.Forms.Label(); + this.m_recent8 = new System.Windows.Forms.Label(); + this.m_modeList = new System.Windows.Forms.ComboBox(); + this.m_fgPreview = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // 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); + // + // 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; + // + // 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; + // + // 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; + // + // 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); + // + // 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_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); + // + // label15 + // + this.label15.Location = new System.Drawing.Point(0, 0); + this.label15.Name = "label15"; + this.label15.TabIndex = 0; + // + // 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; + // + // 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_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; + // + // 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; + // + // 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; + // + // 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); + // + // 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); + // + // 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_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); + // + // 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_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_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_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_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_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); + // + // 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_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_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); + // + // 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_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); + // + // GfxEditor + // + 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_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(); + } + + #endregion + } +} -- cgit v1.2.3