diff options
Diffstat (limited to 'Output.cs')
-rw-r--r-- | Output.cs | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/Output.cs b/Output.cs new file mode 100644 index 0000000..b62e221 --- /dev/null +++ b/Output.cs @@ -0,0 +1,273 @@ +// Base plugin for GfxEd8 +// Copyright (C) 2004 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.IO; +using GfxEdInterface; + +namespace GfxEdBasePlugin +{ + /// <summary> + /// Description of Output. + /// </summary> + internal class Output + { + public Output(uint max_colours, int depth, + bool has_pal, bool adjust_pal) + { + m_maxcol=max_colours; + m_depth=depth; + m_haspal=has_pal; + m_adjpal=adjust_pal; + } + + public void Assembly(TextWriter str, Sprite spr) + { + string name=ValidName(spr.Name); + + str.WriteLine("; Definition for "+spr.Name); + str.WriteLine(";"); + + if (m_haspal) + { + for(uint f=1;f<m_maxcol;f++) + { + str.WriteLine(name.ToUpper() +"_COL" + f + "\t equ " + + (spr.Pal(f)-(m_adjpal ? 1:0))); + } + } + + str.Write(name+":"); + + int col=0; + uint x=0; + uint y=0; + uint b; + + while(GetByte(ref x, ref y, out b, spr)) + { + if ((col%8)==0) + { + str.WriteLine(); + str.Write("\tdb\t"); + } + else + { + str.Write(','); + } + + str.Write(b); + + col++; + } + + str.WriteLine(); + str.WriteLine(); + } + + public void AssemblyShifted(TextWriter str, Sprite spr, int shift) + { + if (spr.Width!=8 || m_depth!=1) + { + throw new Exception("Can only pre-shift byte wide mono sprites"); + } + + string name=ValidName(spr.Name); + + if (shift==0) + { + str.WriteLine("; Definitions for "+spr.Name); + str.WriteLine(";"); + } + + str.Write(name+":"); + + int col=0; + uint x=0; + uint y=0; + uint b; + + while(GetByte(ref x, ref y, out b, spr)) + { + if ((col%4)==0) + { + str.WriteLine(); + str.Write("\tdb\t"); + } + else + { + str.Write(','); + } + + str.Write(b>>shift); + str.Write(','); + str.Write((b<<(8-shift))&0xff); + + col++; + } + + str.WriteLine(); + str.WriteLine(); + } + + public void Basic(ref int line, TextWriter str, Sprite spr) + { + str.WriteLine((line++)+" REM Sprite " + ValidName(spr.Name)); + str.WriteLine((line++)+" REM Colour"); + str.Write((line++)+" DATA "); + + for(uint f=1;f<m_maxcol;f++) + { + if (f>1) + { + str.Write(","); + } + + str.Write(spr.Pal(f).ToString()); + } + + str.WriteLine(); + + int col=0; + uint x=0; + uint y=0; + uint b; + + str.Write((line++)+" REM Sprite data"); + + while(GetByte(ref x, ref y, out b, spr)) + { + if ((col%8)==0) + { + str.WriteLine(); + str.Write((line++)+" DATA "); + } + else + { + str.Write(','); + } + + str.Write(b); + + col++; + } + + str.WriteLine(); + } + + public void C(TextWriter str, Sprite spr) + { + string name=ValidName(spr.Name); + int col=0; + uint x=0; + uint y=0; + uint b; + + if (m_haspal) + { + for(uint f=1;f<m_maxcol;f++) + { + str.WriteLine("#define " + name.ToUpper() + + "_COL" + f + "\t" + + (spr.Pal(f)-(m_adjpal ? 1:0))); + } + } + + str.WriteLine("static unsigned char "+name+"[]="); + str.WriteLine("{"); + + while(GetByte(ref x, ref y, out b, spr)) + { + if ((col%8)==0) + { + str.WriteLine(); + str.Write("\t"); + } + + if (col>0) + { + str.Write(','); + } + + str.Write(b); + + col++; + } + + str.WriteLine(); + str.WriteLine("};"); + str.WriteLine(); + } + + private string ValidName(string s) + { + string n=""; + + foreach (char c in s) + { + if (Char.IsLetterOrDigit(c) || c=='_') + n+=c; + } + + if (n.Length==0) + { + n="empty_name"; + } + + return n; + } + + // ------------------------------------------------ + // PRIVATE + // + private uint m_maxcol; + private int m_depth; + private bool m_haspal; + private bool m_adjpal; + + private bool GetByte(ref uint x, ref uint y, out uint b, Sprite s) + { + b=0; + + if (x==0 && y==s.Height) + { + return false; + } + + int bit=8-m_depth; + + while(bit>=0) + { + uint v=s[x,y]; + + b|=(v<<bit); + + if (++x==s.Width) + { + x=0; + y++; + } + + bit-=m_depth; + } + + return true; + } + } +} |