mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-27 14:12:16 +00:00
121 lines
3.7 KiB
C#
121 lines
3.7 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
|
|||
|
}
|
|||
|
}
|