ZoneBuilder/Source/Core/Data/CameraTextureImage.cs

120 lines
3.6 KiB
C#

#region ================== Namespaces
using System;
using System.Drawing;
using System.IO;
using CodeImp.DoomBuilder.ZDoom;
#endregion
namespace CodeImp.DoomBuilder.Data
{
public class CameraTextureImage : ImageData
{
#region ================== Constructor / Disposer
// Constructor
public CameraTextureImage(CameraTextureData data)
{
// Initialize
this.UseColorCorrection = false;
this.worldpanning = data.WorldPanning;
SetName(data.Name);
// Get width and height from image
this.width = data.Width;
this.height = data.Height;
scale.x = data.ScaleX;
scale.y = data.ScaleY;
// We have no destructor
GC.SuppressFinalize(this);
}
#endregion
#region ================== Methods
// This loads the image
protected override void LocalLoadImage()
{
// Leave when already loaded
if(this.IsImageLoaded) return;
lock(this)
{
bitmap = new Bitmap(width, height);
int w = Math.Max(2, Math.Min(width, height) / 24); // line width
int o = w / 2; // line center offset
int l = w * 3; // line length
name = name.ToUpperInvariant();
using(Graphics g = Graphics.FromImage(bitmap))
{
// Fill bg
g.FillRectangle(Brushes.Black, 0, 0, width, height);
// Draw corners
Color color = General.Colors.BrightColors[General.Random(0, General.Colors.BrightColors.Length - 1)].ToColor();
using(var pen = new Pen(color, w))
{
g.DrawLines(pen, new[] { new Point(l, o), new Point(o, o), new Point(o, l) }); // TL
g.DrawLines(pen, new[] { new Point(width - l, o), new Point(width - o, o), new Point(width - o, l) }); // TR
g.DrawLines(pen, new[] { new Point(l, height - o), new Point(o, height - o), new Point(o, height - l) }); // BL
g.DrawLines(pen, new[] { new Point(width - l, height - o), new Point(width - o, height - o), new Point(width - o, height - l) }); // BR
}
// Calculate required font size
const string rec = "\u25CFREC";
float targetwidth = Math.Max(l * 2, 22);
SizeF fontsize = g.MeasureString(rec, General.MainWindow.Font);
float scaleratio = Math.Min(targetwidth / fontsize.Height, targetwidth / fontsize.Width);
// Draw "REC" text
using(Font font = new Font(General.MainWindow.Font.FontFamily, General.MainWindow.Font.Size * scaleratio))
{
using(var brush = new SolidBrush(Color.Red))
{
g.DrawString(rec, font, brush, new RectangleF(l / 2, l / 2 - w / 2, fontsize.Width * scaleratio, fontsize.Height * scaleratio));
}
}
// Calculate required font size
targetwidth = Math.Min(width, height);
targetwidth -= targetwidth / 6;
fontsize = g.MeasureString(name, General.MainWindow.Font);
scaleratio = Math.Min(targetwidth / fontsize.Height, targetwidth / fontsize.Width);
// Draw texture name
using(Font font = new Font(General.MainWindow.Font.FontFamily, General.MainWindow.Font.Size * scaleratio))
{
using(var brush = new SolidBrush(color))
{
StringFormat sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
g.DrawString(name, font, brush, new RectangleF(0, 0, width, height), sf);
}
}
}
// Pass on to base
base.LocalLoadImage();
}
}
//mxd
protected override void SetName(string name)
{
if(!General.Map.Config.UseLongTextureNames)
{
if(name.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH) name = name.Substring(0, DataManager.CLASIC_IMAGE_NAME_LENGTH);
name = name.ToUpperInvariant();
}
base.SetName(name);
this.virtualname = "[CAMERA TEXTURES]" + Path.AltDirectorySeparatorChar + name;
}
#endregion
}
}