summaryrefslogtreecommitdiff
path: root/Output.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Output.cs')
-rw-r--r--Output.cs273
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;
+ }
+ }
+}