summaryrefslogtreecommitdiff
path: root/GfxEditor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'GfxEditor.cs')
-rw-r--r--GfxEditor.cs1077
1 files changed, 1077 insertions, 0 deletions
diff --git a/GfxEditor.cs b/GfxEditor.cs
new file mode 100644
index 0000000..d67b19e
--- /dev/null
+++ b/GfxEditor.cs
@@ -0,0 +1,1077 @@
+// BitmapFontEd
+// 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 BitmapFontEd
+{
+ /// <summary>
+ /// Implements a control for drawing
+ /// </summary>
+ [ToolboxItem(true)]
+ public class GfxEditor : System.Windows.Forms.UserControl
+ {
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button m_undoButton;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label m_fgPreview;
+ private System.Windows.Forms.NumericUpDown m_sizeX;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label m_bgPreview;
+ private System.Windows.Forms.PictureBox m_edit;
+ private System.Windows.Forms.NumericUpDown m_sizeY;
+ private System.Windows.Forms.ComboBox m_modeList;
+ private System.Windows.Forms.PictureBox m_preview;
+
+ private const uint 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 BitmapChar m_char;
+ private BitmapChar m_undo;
+ private uint m_width;
+ private uint m_height;
+
+ private bool m_ignoreSize;
+
+ private Rectangle m_editRect;
+ private Bitmap m_editBmp;
+ private Rectangle m_prevRect;
+ private Bitmap m_prevBmp;
+
+ private uint m_grid;
+ private uint m_mx;
+ private uint m_my;
+ private Color m_gridCol;
+
+ private bool m_drawing;
+ private Mode m_mode;
+ private Color[,] m_overlay;
+ private uint m_ox;
+ private uint m_oy;
+ private Color m_pen;
+
+ private CopyMenu m_cpMenu;
+ private uint m_cpX;
+ private uint m_cpY;
+ private uint m_cpWidth;
+ private uint m_cpHeight;
+ private Color[,] m_cpBuff;
+
+ public GfxEditor()
+ {
+ //
+ // InitializeComponent() call is required for Windows Forms designer support.
+ //
+ InitializeComponent();
+
+ //m_inEditor=false;
+
+ m_char=null;
+ m_grid=8;
+ m_grid=8;
+ m_mx=SIZE;
+ m_my=SIZE;
+ m_gridCol=Color.LightGreen;
+
+ m_ignoreSize=false;
+
+ 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;
+
+ 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();
+ }
+
+ #region Windows Forms Designer generated code
+ /// <summary>
+ /// 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.
+ /// </summary>
+ private void InitializeComponent() {
+ this.m_preview = new System.Windows.Forms.PictureBox();
+ this.m_modeList = new System.Windows.Forms.ComboBox();
+ this.m_sizeY = new System.Windows.Forms.NumericUpDown();
+ this.m_edit = new System.Windows.Forms.PictureBox();
+ this.m_bgPreview = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.m_sizeX = new System.Windows.Forms.NumericUpDown();
+ this.m_fgPreview = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.m_undoButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.m_sizeY)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.m_sizeX)).BeginInit();
+ this.SuspendLayout();
+ //
+ // m_preview
+ //
+ this.m_preview.BackColor = System.Drawing.SystemColors.Control;
+ this.m_preview.Location = new System.Drawing.Point(288, 208);
+ 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_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_sizeY
+ //
+ this.m_sizeY.CausesValidation = false;
+ this.m_sizeY.Location = new System.Drawing.Point(336, 24);
+ this.m_sizeY.Maximum = new System.Decimal(new int[] {
+ 32,
+ 0,
+ 0,
+ 0});
+ this.m_sizeY.Minimum = new System.Decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.m_sizeY.Name = "m_sizeY";
+ this.m_sizeY.ReadOnly = true;
+ this.m_sizeY.Size = new System.Drawing.Size(48, 21);
+ this.m_sizeY.TabIndex = 20;
+ this.m_sizeY.Value = new System.Decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.m_sizeY.ValueChanged += new System.EventHandler(this.OnSize);
+ this.m_sizeY.Leave += new System.EventHandler(this.OnSize);
+ //
+ // 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_bgPreview
+ //
+ this.m_bgPreview.BackColor = System.Drawing.Color.Black;
+ this.m_bgPreview.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.m_bgPreview.Location = new System.Drawing.Point(336, 120);
+ this.m_bgPreview.Name = "m_bgPreview";
+ this.m_bgPreview.Size = new System.Drawing.Size(40, 40);
+ this.m_bgPreview.TabIndex = 18;
+ this.m_bgPreview.Click += new System.EventHandler(this.OnBackground);
+ //
+ // 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;
+ //
+ // m_sizeX
+ //
+ this.m_sizeX.CausesValidation = false;
+ this.m_sizeX.Location = new System.Drawing.Point(280, 24);
+ this.m_sizeX.Maximum = new System.Decimal(new int[] {
+ 32,
+ 0,
+ 0,
+ 0});
+ this.m_sizeX.Minimum = new System.Decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.m_sizeX.Name = "m_sizeX";
+ this.m_sizeX.ReadOnly = true;
+ this.m_sizeX.Size = new System.Drawing.Size(48, 21);
+ this.m_sizeX.TabIndex = 19;
+ this.m_sizeX.Value = new System.Decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.m_sizeX.ValueChanged += new System.EventHandler(this.OnSize);
+ this.m_sizeX.Leave += new System.EventHandler(this.OnSize);
+ //
+ // 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, 120);
+ this.m_fgPreview.Name = "m_fgPreview";
+ this.m_fgPreview.Size = new System.Drawing.Size(40, 40);
+ this.m_fgPreview.TabIndex = 17;
+ this.m_fgPreview.Click += new System.EventHandler(this.OnForeground);
+ //
+ // label4
+ //
+ this.label4.Location = new System.Drawing.Point(280, 96);
+ 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, 96);
+ 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_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);
+ //
+ // 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, 176);
+ 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;
+ //
+ // GfxEditor
+ //
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.m_sizeY);
+ this.Controls.Add(this.m_sizeX);
+ 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);
+ ((System.ComponentModel.ISupportInitialize)(this.m_sizeY)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.m_sizeX)).EndInit();
+ this.ResumeLayout(false);
+ }
+ #endregion
+
+ // -------------------------------------------------------
+ // PUBLIC INTERFACES
+ // -------------------------------------------------------
+ #region Public Interfaces
+
+ public Color GridColour
+ {
+ set {m_gridCol=value;}
+ }
+
+ public Size CharSize
+ {
+ get {return new Size((int)m_width,(int)m_height);}
+ }
+
+ public BitmapChar BitmapChar
+ {
+ get {return m_char;}
+ set
+ {
+ m_char=value;
+ m_ignoreSize=true;
+ m_sizeX.Value=Convert.ToDecimal(m_char.Width);
+ m_sizeY.Value=Convert.ToDecimal(m_char.Height);
+ m_ignoreSize=false;
+ InitialiseOverlay();
+ DrawChar();
+ }
+ }
+
+ #endregion
+
+ // -------------------------------------------------------
+ // SPRITE/GENERAL DRAWING
+ // -------------------------------------------------------
+ #region Sprite/General Drawing
+
+ private void Flush(ref Graphics g)
+ {
+ g.Flush(FlushIntention.Flush);
+ g.Dispose();
+ g=null;
+ }
+
+ private void DrawGrid()
+ {
+ Graphics g=Graphics.FromImage(m_editBmp);
+ Pen p=new Pen(m_gridCol);
+
+ g.Clear(Color.Black);
+ Flush(ref g);
+
+ g=Graphics.FromImage(m_prevBmp);
+
+ g.Clear(Color.Black);
+ Flush(ref g);
+
+ g=Graphics.FromImage(m_editBmp);
+
+ for(int x=0;x<m_width+1;x++)
+ {
+ g.DrawLine(p,x*m_grid,0,x*m_grid,m_my);
+ }
+
+ for(int y=0;y<m_height+1;y++)
+ {
+ g.DrawLine(p,0,y*m_grid,m_mx,y*m_grid);
+ }
+
+ Flush(ref g);
+
+ m_edit.Invalidate();
+ m_preview.Invalidate();
+ }
+
+ private void DrawChar()
+ {
+ if (m_char==null)
+ {
+ return;
+ }
+
+ Graphics editg=Graphics.FromImage(m_editBmp);
+ Graphics prevg=Graphics.FromImage(m_prevBmp);
+
+ for(uint x=0;x<m_char.Width;x++)
+ for(uint y=0;y<m_char.Height;y++)
+ if (m_overlay[x,y]==TRANS)
+ CharPlot(editg,prevg,x,y,m_char[x,y]);
+ else
+ CharPlot(editg,prevg,x,y,m_overlay[x,y]);
+
+ Flush(ref editg);
+ Flush(ref prevg);
+
+ m_edit.Invalidate();
+ m_preview.Invalidate();
+ }
+
+ private void CharPlot(Graphics edit, Graphics prev,
+ uint x, uint y, Color c)
+ {
+ SolidBrush p=new SolidBrush(c);
+
+ edit.FillRectangle(p,x*m_grid+1,y*m_grid+1,m_grid-1,m_grid-1);
+ prev.FillRectangle(p,1+x,1+y,1,1);
+ }
+ #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(uint y=0;y<m_char.Height;y++)
+ for(uint x=0;x<m_char.Width;x++)
+ m_overlay[x,y]=TRANS;
+ }
+
+ private void ClearOverlay()
+ {
+ if (m_overlay==null)
+ {
+ return;
+ }
+
+ for(uint y=0;y<m_char.Height;y++)
+ for(uint x=0;x<m_char.Width;x++)
+ m_overlay[x,y]=TRANS;
+ }
+
+ private void ApplyOverlay()
+ {
+ for(uint y=0;y<m_char.Height;y++)
+ for(uint x=0;x<m_char.Width;x++)
+ {
+ if (m_overlay[x,y]!=TRANS)
+ m_char[x,y]=m_overlay[x,y];
+
+ m_overlay[x,y]=TRANS;
+ }
+ }
+
+ private void OverlayFromSprite()
+ {
+ for(uint y=0;y<m_char.Height;y++)
+ for(uint x=0;x<m_char.Width;x++)
+ m_overlay[x,y]=m_char[x,y];
+ }
+
+ #endregion
+
+ // -------------------------------------------------------
+ // COPY/PASTE ROUTINES
+ // -------------------------------------------------------
+ #region Copy/Paste
+
+ private void DrawMarkBox(uint x1, uint y1,uint x2, uint y2)
+ {
+ RankCoord(ref x1, ref x2);
+ RankCoord(ref y1, ref y2);
+
+ for(uint x=x1;x<=x2;x++)
+ {
+ m_overlay[x,y1]=m_gridCol;
+ m_overlay[x,y2]=m_gridCol;
+ }
+
+ for(uint y=y1;y<=y2;y++)
+ {
+ m_overlay[x1,y]=m_gridCol;
+ m_overlay[x2,y]=m_gridCol;
+ }
+ }
+
+ private void Copy(uint x1, uint y1, uint x2, uint y2)
+ {
+ RankCoord(ref x1, ref x2);
+ RankCoord(ref y1, ref y2);
+
+ m_cpX=x1;
+ m_cpY=y1;
+ m_cpWidth=x2-x1+1;
+ m_cpHeight=y2-y1+1;
+
+ m_cpBuff=new Color[m_cpWidth,m_cpHeight];
+
+ for(uint x=0;x<m_cpWidth;x++)
+ for(uint y=0;y<m_cpHeight;y++)
+ m_cpBuff[x,y]=m_char[x1+x,y1+y];
+
+ m_drawing=false;
+ m_cpMenu.Mode=CopyMenu.EMode.eNothing;
+ }
+
+ private void Paste(int x, int y, bool trans)
+ {
+ switch (m_cpMenu.Gravity)
+ {
+ case CopyMenu.EGravity.eTopLeft:
+ break;
+
+ case CopyMenu.EGravity.eTopRight:
+ x-=(int)m_cpWidth;
+ break;
+
+ case CopyMenu.EGravity.eBottomLeft:
+ y-=(int)m_cpHeight;
+ break;
+
+ case CopyMenu.EGravity.eBottomRight:
+ x-=(int)m_cpWidth;
+ y-=(int)m_cpHeight;
+ break;
+
+ case CopyMenu.EGravity.eCentre:
+ x-=(int)m_cpWidth/2;
+ y-=(int)m_cpHeight/2;
+ break;
+ }
+
+ for(int w=0;w<m_cpWidth;w++)
+ for(int h=0;h<m_cpHeight;h++)
+ if (!trans || m_cpBuff[w,h]!=m_bgPreview.BackColor)
+ SafePlot(x+w,y+h,m_cpBuff[w,h]);
+ }
+
+ #endregion
+
+ // -------------------------------------------------------
+ // DRAWING ROUTINES
+ // -------------------------------------------------------
+ #region Drawing Routines
+
+ private void RankCoord(ref uint c1, ref uint c2)
+ {
+ if (c1>c2)
+ {
+ uint t=c2;
+ c2=c1;
+ c1=t;
+ }
+ }
+
+ private void SafePlot(int x, int y, Color col)
+ {
+ if (x>=0 && x<m_char.Width && y>=0 && y<m_char.Height)
+ m_overlay[x,y]=col;
+ }
+
+ private void DrawLine(uint ux1, uint uy1,
+ uint ux2, uint uy2,
+ Color col)
+ {
+ int x1=(int)ux1;;
+ int y1=(int)uy1;
+ int x2=(int)ux2;
+ int y2=(int)uy2;
+
+ int dx=x2-x1;
+ int dy=y2-y1;
+
+ int ix=Math.Sign(dx);
+ int iy=Math.Sign(dy);
+
+ dx=Math.Abs(dx);
+ dy=Math.Abs(dy);
+
+ int incrE;
+ int incrNE;
+ int d;
+ bool ymode;
+
+ if (dy>dx)
+ {
+ 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(uint x1, uint y1,
+ uint x2, uint y2,
+ Color col, bool fill)
+ {
+ RankCoord(ref x1, ref x2);
+ RankCoord(ref y1, ref y2);
+
+ if (fill)
+ {
+ for(uint x=x1;x<=x2;x++)
+ for(uint y=y1;y<=y2;y++)
+ m_overlay[x,y]=col;
+ }
+ else
+ {
+ for(uint x=x1;x<=x2;x++)
+ {
+ m_overlay[x,y1]=col;
+ m_overlay[x,y2]=col;
+ }
+
+ for(uint y=y1;y<=y2;y++)
+ {
+ m_overlay[x1,y]=col;
+ m_overlay[x2,y]=col;
+ }
+ }
+ }
+
+ private void DrawEllipse(uint originx, uint originy,
+ uint radpointx, uint radpointy,
+ Color col, bool circle, bool fill)
+ {
+ int ox=(int)originx;
+ int oy=(int)originy;
+ double rx=Math.Abs(ox-(int)radpointx)+1;
+ double ry=Math.Abs(oy-(int)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(uint x, uint 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_char.Width-1)
+ FloodFill(x+1,y,col,bg);
+
+ if (y<m_char.Height-1)
+ FloodFill(x,y+1,col,bg);
+ }
+
+ #endregion
+
+ // -------------------------------------------------------
+ // CALLBACKS
+ // -------------------------------------------------------
+ #region Callbacks
+
+ void OnDrawMode(object sender, System.EventArgs e)
+ {
+ m_mode=(Mode)m_modeList.SelectedIndex;
+ }
+
+ void OnSize(object sender, System.EventArgs e)
+ {
+ if (m_ignoreSize)
+ {
+ return;
+ }
+
+ m_width=Convert.ToUInt32(m_sizeX.Value);
+ m_height=Convert.ToUInt32(m_sizeY.Value);
+
+ if (m_char!=null)
+ {
+ m_undo=new BitmapChar(m_char);
+ m_char.Resize(m_width,m_height);
+ InitialiseOverlay();
+ }
+
+ m_grid=Math.Min(SIZE/m_width,SIZE/m_height);
+
+ m_mx=m_width*m_grid;
+ m_my=m_height*m_grid;
+
+ DrawGrid();
+ DrawChar();
+ }
+
+ void OnEnterEditor(object sender, System.EventArgs e)
+ {
+ //m_inEditor=true;
+ }
+
+ void OnLeaveEditor(object sender, System.EventArgs e)
+ {
+ //m_inEditor=false;
+
+ if (m_drawing && m_mode==Mode.ePlot)
+ {
+ m_undo=new BitmapChar(m_char);
+ ApplyOverlay();
+ }
+
+ m_drawing=false;
+
+ ClearOverlay();
+ DrawChar();
+ }
+
+ void OnModeSelect(object sender, System.EventArgs e)
+ {
+ m_mode=(Mode)m_modeList.SelectedIndex;
+ }
+
+ void OnUndo(object sender, System.EventArgs e)
+ {
+ if (m_undo!=null)
+ {
+ BitmapChar s=m_char;
+ BitmapChar=m_undo;
+ m_undo=s;
+ }
+ }
+
+ void OnMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
+ {
+ if (m_char==null || e.X<0 || e.X>=m_mx || e.Y<0 || e.Y>=m_my)
+ {
+ return;
+ }
+
+ uint x;
+ uint y;
+
+ x=(uint)e.X/m_grid;
+ y=(uint)e.Y/m_grid;
+
+ if (x>=m_char.Width || y>=m_char.Height)
+ {
+ return;
+ }
+
+ if (e.Button==MouseButtons.None)
+ {
+ switch(m_mode)
+ {
+ case Mode.eFloodFill:
+ if (m_drawing)
+ {
+ OverlayFromSprite();
+ FloodFill(m_ox,m_oy,m_pen,m_char[m_ox,m_oy]);
+ m_drawing=false;
+ m_undo=new BitmapChar(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;
+ m_undo=new BitmapChar(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:
+ m_undo=new BitmapChar(m_char);
+ ApplyOverlay();
+ DrawChar();
+ m_drawing=false;
+ m_cpMenu.Mode=CopyMenu.EMode.eNothing;
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ void OnForeground(object sender, System.EventArgs e)
+ {
+ ColorDialog d=new ColorDialog();
+
+ d.Color=m_fgPreview.BackColor;
+
+ if (d.ShowDialog()==DialogResult.OK)
+ {
+ m_fgPreview.BackColor=d.Color;
+ }
+ }
+
+ void OnBackground(object sender, System.EventArgs e)
+ {
+ ColorDialog d=new ColorDialog();
+
+ d.Color=m_bgPreview.BackColor;
+
+ if (d.ShowDialog()==DialogResult.OK)
+ {
+ m_bgPreview.BackColor=d.Color;
+ }
+ }
+
+ #endregion
+
+ }
+}