hostile-takeover/m/globals.cs
2014-07-06 17:47:28 -07:00

331 lines
9.8 KiB
C#

using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Collections.Specialized;
using System.Windows.Forms;
using System.Reflection;
using SpiffLib;
namespace m {
public class Globals {
public static Ini GobTemplatesIni = null;
public static PropertyGrid PropertyGrid;
public static StatusBar StatusBar;
private static ArrayList m_alsGobImages = new ArrayList();
public static Font LabelFont;
public static ArrayList Plugins = new ArrayList();
private static bool m_fKit = true;
public Globals() {
#if false
// For the time being, we can execute without gob templates.
// Fix this approach.
OpenFileDialog frmOpen = new OpenFileDialog();
frmOpen.Filter = "pp (*.*)|*.*";
frmOpen.Title = "Templates File";
if (frmOpen.ShowDialog() != DialogResult.Cancel)
GobTemplatesIni = new Ini(frmOpen.FileName);
#endif
LabelFont = new Font("Arial", 8);
}
public static void InitKit() {
try {
Ini ini = new Ini(Application.ExecutablePath.Replace(".exe", ".ini"));
Globals.SetKit(ini["General"]["Kit"].Value == bool.TrueString);
} catch {
Globals.SetKit(true);
}
}
public static bool IsKit() {
return m_fKit;
}
public static void SetKit(bool fKit) {
m_fKit = fKit;
}
public static GobImage GetGobImage(String strName, bool fTight) {
// See if it already exists
foreach (GobImage gimg in m_alsGobImages) {
if (strName == gimg.Name)
return gimg;
}
// See if it can be loaded
GobImage gimgT = GobImage.Load(strName, fTight);
if (gimgT != null)
m_alsGobImages.Add(gimgT);
return gimgT;
}
}
public class GobImage {
public String Name;
ArrayList m_alsBitmapSides = new ArrayList();
Point m_ptOriginUnscaled;
Bitmap m_bmUnscaled;
public static GobImage Load(String strName, bool fTight) {
// Load in from embedded resource
System.Reflection.Assembly ass = typeof(GobImage).Module.Assembly;
Stream stm = ass.GetManifestResourceStream("m.GobImages." + strName + ".png");
if (stm == null)
stm = ass.GetManifestResourceStream("m.GobImages." + strName + ".bmp");
if (stm == null)
throw new Exception("Cannot load image for " + strName);
Bitmap bm = new Bitmap(stm);
// Extract image and calc origin (this code is from aed)
// 2. 'Normalize' the bitmap. Normalized bitmaps are 24-bit, 'tight',
// have the proper transparent color, and an origin.
// All pixels the same color as the upper-left pixel get mapped to the
// transparent color
bm.MakeTransparent(bm.GetPixel(0, 0));
Color clrTransparent = Color.FromArgb(0xff, 0, 0xff);
SolidBrush brTransparent = new SolidBrush(clrTransparent);
Bitmap bmT = new Bitmap(bm.Width, bm.Height, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(bmT)) {
// Prep the new image by filling with the transparent color
g.FillRectangle(brTransparent, 0, 0, bm.Width, bm.Height);
// Convert the Bitmap to 24-bpp while leaving transparent pixels behind
g.DrawImageUnscaled(bm, 0, 0);
}
bm.Dispose();
bm = bmT;
int xOrigin = 0;
int yOrigin = 0;
if (fTight) {
// UNDONE: any color mapping
// Find the tight boundary of the image and create a new Bitmap with just
// that portion of the Bitmap
// OPT: this could be made faster by doing four independent edge scans
int xL = bm.Width;
int xR = 0;
int yT = bm.Height;
int yB = 0;
for (int y = 0; y < bm.Height; y++) {
for (int x = 0; x < bm.Width; x++) {
Color clr = bm.GetPixel(x, y);
if (clr != clrTransparent) {
xL = Math.Min(xL, x);
xR = Math.Max(xR, x);
yT = Math.Min(yT, y);
yB = Math.Max(yB, y);
}
}
}
int cx = xR - xL + 1;
int cy = yB - yT + 1;
xOrigin = bm.Width / 2 - xL;
yOrigin = bm.Height / 2 - yT;
bmT = new Bitmap(cx, cy);
using (Graphics g = Graphics.FromImage(bmT)) {
Rectangle rcT = new Rectangle(xL, yT, cx, cy);
g.DrawImage(bm, 0, 0, rcT, GraphicsUnit.Pixel);
}
bm.Dispose();
bm = bmT;
}
return new GobImage(strName, bm, new Point(xOrigin, yOrigin));
}
public GobImage(String strName, Bitmap bmUnscaled, Point ptOriginUnscaled) {
Name = strName;
m_bmUnscaled = bmUnscaled;
m_ptOriginUnscaled = ptOriginUnscaled;
}
BitmapSides FindBitmapSides(Size sizTile) {
BitmapSides bmsFound = null;
foreach(BitmapSides bms in m_alsBitmapSides) {
if (bms.m_sizTile == sizTile) {
bmsFound = bms;
break;
}
}
if (bmsFound == null) {
bmsFound = new BitmapSides(m_bmUnscaled, m_ptOriginUnscaled, sizTile);
m_alsBitmapSides.Add(bmsFound);
}
return bmsFound;
}
public Bitmap[] GetBitmapSides(Size sizTile) {
BitmapSides bms = FindBitmapSides(sizTile);
return bms.m_abmSides;
}
public Size GetSize(Size sizTile) {
Bitmap[] abmSides = GetBitmapSides(sizTile);
return abmSides[0].Size;
}
public Point GetOrigin(Size sizTile) {
BitmapSides bms = FindBitmapSides(sizTile);
return bms.m_ptOrigin;
}
}
public class BitmapSides {
public Size m_sizTile;
public Bitmap[] m_abmSides;
public Point m_ptOrigin;
public BitmapSides(Bitmap bmUnscaled, Point ptOriginUnscaled, Size sizTile) {
m_sizTile = sizTile;
m_abmSides = GetBitmapSides(bmUnscaled, sizTile);
float xScale = (float)sizTile.Width / 16.0f;
float yScale = (float)sizTile.Height / 16.0f;
int xNew = (int)((float)ptOriginUnscaled.X * xScale + 0.5f);
int yNew = (int)((float)ptOriginUnscaled.Y * yScale + 0.5f);
m_ptOrigin = new Point(xNew, yNew);
}
Bitmap[] GetBitmapSides(Bitmap bmUnscaled, Size sizTile) {
// Maps the blues into a new hue
Color[][] aaclr = {
new Color[] {
// gray
Color.FromArgb(116, 116, 116),
Color.FromArgb(96, 96, 96),
Color.FromArgb(64, 64, 64),
Color.FromArgb(48, 48, 48),
Color.FromArgb(32, 32, 32)
},
new Color[] {
// blue
Color.FromArgb(0, 116, 232), // (h: 149, s: 255, l: 116)
Color.FromArgb(0, 96, 196), // (h: 149, s: 255, l: 98)
Color.FromArgb(0, 64, 120), // (h: 147, s: 255, l: 60)
Color.FromArgb(0, 48, 92), // (h: 148, s: 255, l: 46)
Color.FromArgb(0, 32, 64) // (h: 149, s: 255, l: 32)
},
new Color[] {
// red (h: 6)
Color.FromArgb(232, 32, 0),
Color.FromArgb(196, 28, 0),
Color.FromArgb(128, 8, 0),
Color.FromArgb(92, 8, 0),
Color.FromArgb(64, 8, 0)
},
new Color[] {
// yellow (h: 42)
Color.FromArgb(232, 229, 0),
Color.FromArgb(196, 194, 0),
Color.FromArgb(120, 119, 0),
Color.FromArgb(92, 91, 0),
Color.FromArgb(64, 63, 0)
},
new Color[] {
// cyan
Color.FromArgb(0, 229, 232), // (h: 128, s: 255, l: 116)
Color.FromArgb(0, 194, 196), // (h: 128, s: 255, l: 98)
Color.FromArgb(0, 119, 120), // (h: 128, s: 255, l: 60)
Color.FromArgb(0, 91, 92), // (h: 128, s: 255, l: 46)
Color.FromArgb(0, 63, 64) // (h: 128, s: 255, l: 32)
},
new Color[] {
// green (h: 104)
Color.FromArgb(0, 232, 104),
Color.FromArgb(0, 196, 88),
Color.FromArgb(0, 120, 54),
Color.FromArgb(0, 92, 41),
Color.FromArgb(0, 64, 29)
},
};
// Make the side bitmaps
m_abmSides = new Bitmap[6];
double nScale = (double)sizTile.Width / 16.0;
Bitmap bmScaled = TBitmapTools.ScaleBitmap(bmUnscaled, nScale, null);
for (int i = 0; i < 6; i++) {
Bitmap bmSide = new Bitmap(bmScaled);
MapColors(bmSide, aaclr[1], aaclr[i]);
MapColors(bmSide, new Color[] { Color.FromArgb(156, 212, 248) }, new Color[] { Color.FromArgb(75, 0, 0, 0) });
// HACK: Map the transparent color manually because Mono's MakeTransparent doesn't get the job done.
MapColors(bmSide, new Color[] { Color.FromArgb(255, 0, 255) }, new Color[] { Color.FromArgb(0, 0, 0, 0) });
// bmSide.MakeTransparent(Color.FromArgb(255, 255, 0, 255));
m_abmSides[i] = bmSide;
}
return m_abmSides;
}
void MapColors(Bitmap bm, Color[] aclrFrom, Color[] aclrTo) {
for (int y = 0; y < bm.Height; y++) {
for (int x = 0; x < bm.Width; x++) {
Color clr = bm.GetPixel(x, y);
for (int n = 0; n < aclrFrom.Length; n++) {
if (clr == aclrFrom[n]) {
bm.SetPixel(x, y, aclrTo[n]);
break;
}
}
}
}
}
}
public class Helper {
static public string[] GetDisplayNames(Type typ) {
ArrayList al = new ArrayList();
FieldInfo[] afldi = typ.GetFields();
foreach (FieldInfo fldi in afldi) {
DisplayNameAttribute dna = (DisplayNameAttribute)Attribute.GetCustomAttribute(fldi, typeof(DisplayNameAttribute));
if (dna != null)
al.Add(dna.DisplayName);
}
return (string[])al.ToArray(typeof(string));
}
static public string GetDisplayName(Type typ, string strField) {
FieldInfo fldi = typ.GetField(strField);
DisplayNameAttribute dna = (DisplayNameAttribute)Attribute.GetCustomAttribute(fldi, typeof(DisplayNameAttribute));
if (dna != null)
return dna.DisplayName;
else
return strField;
}
static public string GetDisplayName(Type typ) {
DisplayNameAttribute dna = (DisplayNameAttribute)Attribute.GetCustomAttribute(typ, typeof(DisplayNameAttribute));
if (dna == null)
return null;
return dna.DisplayName;
}
static public string GetDescription(Type typ) {
DescriptionAttribute desa = (DescriptionAttribute)Attribute.GetCustomAttribute(typ, typeof(DescriptionAttribute));
if (desa == null)
return null;
return desa.Description;
}
}
}