#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 } }