// 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;
private AlphaColourDialog m_fromColForm;
private AlphaColourDialog m_toColForm;
private AlphaColourDialog m_edgeColForm;
private DropShadowForm m_shadowForm;
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_fromColForm=new AlphaColourDialog("Select colour to change from");
m_toColForm=new AlphaColourDialog("Select colour to change to");
m_edgeColForm=new AlphaColourDialog("Select edge colour");
m_shadowForm=new DropShadowForm();
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.eEdge:
if (m_edgeColForm.ShowDialog()==DialogResult.OK)
{
SetUndo(new Frame(m_char));
m_char.Edge(m_edgeColForm.Color);
}
break;
case ManipulationMenu.EMode.eDropShadow:
if (m_shadowForm.ShowDialog()==DialogResult.OK)
{
SetUndo(new Frame(m_char));
m_char.DropShadow(m_shadowForm.ShadowSize.DX,
m_shadowForm.ShadowSize.DY,
m_shadowForm.ShadowColour);
}
break;
case ManipulationMenu.EMode.eReplace:
if (m_fromColForm.ShowDialog()==DialogResult.OK)
{
if (m_toColForm.ShowDialog()==DialogResult.OK)
{
SetUndo(new Frame(m_char));
m_char.Replace(m_fromColForm.Color,m_toColForm.Color);
}
}
break;
case ManipulationMenu.EMode.eReplaceAll:
if (m_toColForm.ShowDialog()==DialogResult.OK)
{
SetUndo(new Frame(m_char));
m_char.Replace(m_toColForm.Color);
}
break;
case ManipulationMenu.EMode.eNothing:
redraw=false;
break;
}
if (redraw)
{
RedrawChar();
}
}
#endregion
}
}