From 1e88de5eba860a6441b13aa0d90161b340cc3746 Mon Sep 17 00:00:00 2001 From: MaxED Date: Wed, 30 Mar 2016 23:25:03 +0000 Subject: [PATCH] Classic modes: rewritten and optimized some parts of text label rendering logic. Internal, API: TextLabels can now display multi-line text, their font can be changed, they can have a background. --- Source/Core/Builder.csproj | 2 - Source/Core/General/MapManager.cs | 6 - Source/Core/Rendering/D3DDevice.cs | 34 +- Source/Core/Rendering/IRenderer2D.cs | 1 + Source/Core/Rendering/PixelColor.cs | 6 + Source/Core/Rendering/Renderer2D.cs | 106 ++- Source/Core/Rendering/TextFont.cs | 3 +- Source/Core/Rendering/TextLabel.cs | 254 +++++-- Source/Core/Resources/Font.cfg | 710 ------------------ Source/Core/Resources/Font.png | Bin 20550 -> 0 bytes Source/Core/Windows/IMainForm.cs | 2 + Source/Core/Windows/MainForm.cs | 15 + .../ClassicModes/BaseClassicMode.cs | 2 +- .../BuilderModes/ClassicModes/SectorsMode.cs | 65 +- .../BuilderModes/General/LineLengthLabel.cs | 11 +- 15 files changed, 344 insertions(+), 873 deletions(-) delete mode 100644 Source/Core/Resources/Font.cfg delete mode 100644 Source/Core/Resources/Font.png diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj index 6ed4ac3..15f4f41 100644 --- a/Source/Core/Builder.csproj +++ b/Source/Core/Builder.csproj @@ -1368,9 +1368,7 @@ Designer ThingsFiltersForm.cs - - UpdateForm.cs diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index 640fda1..ae36337 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -2533,12 +2533,6 @@ namespace CodeImp.DoomBuilder return io.GetType() == t; } - //mxd - public SizeF GetTextSize(string text, float scale) - { - return graphics.Font.GetTextSize(text, scale); - } - //mxd [BeginAction("snapvertstogrid")] private void SnapSelectedMapElementsToGrid() diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs index 888dfb1..3ad542f 100644 --- a/Source/Core/Rendering/D3DDevice.cs +++ b/Source/Core/Rendering/D3DDevice.cs @@ -57,8 +57,6 @@ namespace CodeImp.DoomBuilder.Rendering private ShaderManager shaders; private Surface backbuffer; private Surface depthbuffer; - private TextFont font; - private ResourceImage fonttexture; // Disposing private bool isdisposed; @@ -75,8 +73,6 @@ namespace CodeImp.DoomBuilder.Rendering internal ShaderManager Shaders { get { return shaders; } } internal Surface BackBuffer { get { return backbuffer; } } internal Surface DepthBuffer { get { return depthbuffer; } } - internal TextFont Font { get { return font; } } - internal Texture FontTexture { get { return fonttexture.Texture; } } internal Filter PostFilter { get { return postfilter; } } internal Filter MipGenerateFilter { get { return mipgeneratefilter; } } @@ -100,18 +96,16 @@ namespace CodeImp.DoomBuilder.Rendering // Disposer public void Dispose() { - // Not already disposed? - if (!isdisposed) - { - // Clean up - foreach (ID3DResource res in resources) res.UnloadResource(); - if (shaders != null) shaders.Dispose(); - rendertarget = null; - if (backbuffer != null) backbuffer.Dispose(); - if (depthbuffer != null) depthbuffer.Dispose(); - if (font != null) font.Dispose(); - if (fonttexture != null) fonttexture.Dispose(); - if (device != null) device.Dispose(); + // Not already disposed? + if(!isdisposed) + { + // Clean up + foreach(ID3DResource res in resources) res.UnloadResource(); + if(shaders != null) shaders.Dispose(); + rendertarget = null; + if(backbuffer != null) backbuffer.Dispose(); + if(depthbuffer != null) depthbuffer.Dispose(); + if(device != null) device.Dispose(); if (ObjectTable.Objects.Count > 1) //mxd. Direct3D itself is not disposed while the editor is running { @@ -290,14 +284,6 @@ namespace CodeImp.DoomBuilder.Rendering // Create shader manager shaders = new ShaderManager(this); - // Font - postfilter = Filter.Box; // Only for the font. This will be reset in SetupSettings (see below) - font = new TextFont(); - fonttexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Font.png"); - fonttexture.LoadImage(); - fonttexture.MipMapLevels = 2; - fonttexture.CreateTexture(); - // Initialize settings SetupSettings(); diff --git a/Source/Core/Rendering/IRenderer2D.cs b/Source/Core/Rendering/IRenderer2D.cs index 6ae6863..ed14180 100644 --- a/Source/Core/Rendering/IRenderer2D.cs +++ b/Source/Core/Rendering/IRenderer2D.cs @@ -76,6 +76,7 @@ namespace CodeImp.DoomBuilder.Rendering void RenderArrows(ICollection line); //mxd void RenderArrows(ICollection line, bool transformcoords); //mxd void RenderText(TextLabel text); + void RenderText(List labels); //mxd void RenderGeometry(FlatVertex[] vertices, ImageData texture, bool transformcoords); void RenderHighlight(FlatVertex[] vertices, int color); //mxd void RedrawSurface(); diff --git a/Source/Core/Rendering/PixelColor.cs b/Source/Core/Rendering/PixelColor.cs index a94b303..aee5061 100644 --- a/Source/Core/Rendering/PixelColor.cs +++ b/Source/Core/Rendering/PixelColor.cs @@ -208,6 +208,12 @@ namespace CodeImp.DoomBuilder.Rendering { return "[A=" + a + ", R=" + r + ", G=" + g + ", B=" + b + "]"; } + + //mxd + public bool Equals(PixelColor other) + { + return (r == other.r && g == other.g && b == other.b && a == other.a); + } #endregion } diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index e5e5ad8..ceeb3bf 100644 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -1678,34 +1678,90 @@ namespace CodeImp.DoomBuilder.Rendering } // This renders text - public void RenderText(TextLabel text) + public void RenderText(TextLabel label) { - // Update the text if needed - text.Update(translatex, translatey, scale, -scale); - - // Text is created? - if(text.VertexBuffer != null) - { - // Set renderstates for rendering - graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); - graphics.Device.SetRenderState(RenderState.ZEnable, false); - graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true); - graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); - graphics.Device.SetRenderState(RenderState.TextureFactor, -1); - graphics.Device.SetRenderState(RenderState.FogEnable, false); - graphics.Shaders.Display2D.Texture1 = graphics.FontTexture; - SetWorldTransformation(false); - graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, true); - graphics.Device.SetStreamSource(0, text.VertexBuffer, 0, FlatVertex.Stride); + //mxd. Update the text if needed + RectangleF bbox = label.Update(translatex, translatey, scale, -scale); - // Draw - graphics.Shaders.Display2D.Begin(); - graphics.Shaders.Display2D.BeginPass(1); //mxd - //graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, text.NumFaces >> 1); //mxd. Seems to be working fine without this line, soooo... - graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, text.NumFaces); - graphics.Shaders.Display2D.EndPass(); - graphics.Shaders.Display2D.End(); + //mxd. Have graphics / on screen? + if(label.VertexBuffer == null || (bbox.Right < 0.1f) || (bbox.Left > windowsize.Width) || (bbox.Bottom < 0.1f) || (bbox.Top > windowsize.Height)) + return; + + // Set renderstates for rendering + graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); + graphics.Device.SetRenderState(RenderState.ZEnable, false); + graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true); + graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); + graphics.Device.SetRenderState(RenderState.TextureFactor, -1); + graphics.Device.SetRenderState(RenderState.FogEnable, false); + graphics.Shaders.Display2D.Texture1 = label.Texture; + SetWorldTransformation(false); + graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, true); + graphics.Device.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride); + + // Draw + graphics.Shaders.Display2D.Begin(); + graphics.Shaders.Display2D.BeginPass(1); //mxd + graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); + graphics.Shaders.Display2D.EndPass(); + graphics.Shaders.Display2D.End(); + } + + //mxd. This renders text + public void RenderText(List labels) + { + // Update labels + int skipped = 0; + foreach(TextLabel label in labels) + { + // Update the text if needed + RectangleF bbox = label.Update(translatex, translatey, scale, -scale); + + // Have graphics / on screen? + if(label.VertexBuffer == null || (bbox.Right < 0.1f) || (bbox.Left > windowsize.Width) || (bbox.Bottom < 0.1f) || (bbox.Top > windowsize.Height)) + { + label.SkipRendering = true; + skipped++; + } + else + { + label.SkipRendering = false; + } } + + if(labels.Count == skipped) return; + + // Set renderstates for rendering + graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); + graphics.Device.SetRenderState(RenderState.ZEnable, false); + graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true); + graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false); + graphics.Device.SetRenderState(RenderState.TextureFactor, -1); + graphics.Device.SetRenderState(RenderState.FogEnable, false); + SetWorldTransformation(false); + graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, true); + + // Begin drawing + graphics.Shaders.Display2D.Begin(); + graphics.Shaders.Display2D.BeginPass(1); + + foreach(TextLabel label in labels) + { + // Text is created? + if(!label.SkipRendering) + { + graphics.Shaders.Display2D.Texture1 = label.Texture; + graphics.Shaders.Display2D.ApplySettings(); + graphics.Device.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride); + + // Draw + graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); + } + } + + // Finish drawing + graphics.Shaders.Display2D.EndPass(); + graphics.Shaders.Display2D.End(); } // This renders a rectangle with given border size and color diff --git a/Source/Core/Rendering/TextFont.cs b/Source/Core/Rendering/TextFont.cs index feb0451..a9da6de 100644 --- a/Source/Core/Rendering/TextFont.cs +++ b/Source/Core/Rendering/TextFont.cs @@ -13,7 +13,7 @@ */ #endregion - +/* #region ================== Namespaces using System; @@ -245,3 +245,4 @@ namespace CodeImp.DoomBuilder.Rendering #endregion } } +*/ \ No newline at end of file diff --git a/Source/Core/Rendering/TextLabel.cs b/Source/Core/Rendering/TextLabel.cs index f53eaaf..12a8a93 100644 --- a/Source/Core/Rendering/TextLabel.cs +++ b/Source/Core/Rendering/TextLabel.cs @@ -17,11 +17,15 @@ #region ================== Namespaces using System; -using System.Text; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.IO; using System.Drawing; using SlimDX.Direct3D9; using SlimDX; using CodeImp.DoomBuilder.Geometry; +using Font = System.Drawing.Font; #endregion @@ -37,22 +41,24 @@ namespace CodeImp.DoomBuilder.Rendering // The text is stored as a polygon in a vertex buffer private VertexBuffer textbuffer; - private int numfaces; - private int capacity; + private Texture texture; + private Font font; //mxd // Text settings private string text; private RectangleF rect; + private RectangleF absview; //mxd private bool transformcoords; private PixelColor color; private PixelColor backcolor; - private float scale; private TextAlignmentX alignx; private TextAlignmentY aligny; - private SizeF size; + private SizeF textsize; + private bool drawbg; //mxd // This keeps track if changes were made private bool updateneeded; + private bool textureupdateneeded; //mxd private float lasttranslatex = float.MinValue; private float lasttranslatey; private float lastscalex; @@ -73,16 +79,18 @@ namespace CodeImp.DoomBuilder.Rendering public float Height { get { return rect.Height; } set { rect.Height = value; updateneeded = true; } } public float Right { get { return rect.Right; } set { rect.Width = value - rect.X + 1f; updateneeded = true; } } public float Bottom { get { return rect.Bottom; } set { rect.Height = value - rect.Y + 1f; updateneeded = true; } } - public string Text { get { return text; } set { if(text != value.ToUpperInvariant()) { text = value.ToUpperInvariant(); updateneeded = true; } } } + public string Text { get { return text; } set { if(text != value) { text = value; textureupdateneeded = true; } } } + public Font Font { get { return font; } set { font = value; textureupdateneeded = true; } } //mxd public bool TransformCoords { get { return transformcoords; } set { transformcoords = value; updateneeded = true; } } - public SizeF TextSize { get { return size; } } - public float Scale { get { return scale; } set { scale = value; updateneeded = true; } } + public SizeF TextSize { get { return textsize; } } public TextAlignmentX AlignX { get { return alignx; } set { alignx = value; updateneeded = true; } } public TextAlignmentY AlignY { get { return aligny; } set { aligny = value; updateneeded = true; } } - public PixelColor Color { get { return color; } set { color = value; updateneeded = true; } } - public PixelColor Backcolor { get { return backcolor; } set { backcolor = value; updateneeded = true; } } + public PixelColor Color { get { return color; } set { if(!color.Equals(value)) { color = value; textureupdateneeded = true; } } } + public PixelColor Backcolor { get { return backcolor; } set { if(!backcolor.Equals(value)) { backcolor = value; textureupdateneeded = true; } } } + public bool DrawBackground { get { return drawbg; } set { if(drawbg != value) { drawbg = value; textureupdateneeded = true; } } } //mxd + internal Texture Texture { get { return texture; } } //mxd internal VertexBuffer VertexBuffer { get { return textbuffer; } } - internal int NumFaces { get { return numfaces; } } + internal bool SkipRendering; //mxd // Disposing public bool IsDisposed { get { return isdisposed; } } @@ -92,20 +100,19 @@ namespace CodeImp.DoomBuilder.Rendering #region ================== Constructor / Disposer // Constructor - public TextLabel(int capacity) + public TextLabel() { // Initialize this.text = ""; + this.font = new Font(General.MainWindow.Font.FontFamily, (float)Math.Round(General.MainWindow.Font.SizeInPoints * 1.25f), FontStyle.Regular); //mxd this.rect = new RectangleF(0f, 0f, 1f, 1f); this.color = new PixelColor(255, 255, 255, 255); - this.backcolor = new PixelColor(0, 0, 0, 0); - this.scale = 10f; + this.backcolor = new PixelColor(255, 0, 0, 0); this.alignx = TextAlignmentX.Center; this.aligny = TextAlignmentY.Top; - this.size = new SizeF(0f, 0f); + this.textsize = new SizeF(); this.updateneeded = true; - this.numfaces = 0; - this.capacity = capacity; + this.textureupdateneeded = true; //mxd // Register as resource General.Map.Graphics.RegisterResource(this); @@ -136,46 +143,50 @@ namespace CodeImp.DoomBuilder.Rendering #region ================== Methods // This updates the text if needed - internal void Update(float translatex, float translatey, float scalex, float scaley) + internal RectangleF Update(float translatex, float translatey, float scalex, float scaley) { // Check if transformation changed and needs to be updated - if(transformcoords) + if(transformcoords && (translatex != lasttranslatex || translatey != lasttranslatey || + scalex != lastscalex || scaley != lastscaley)) { - if(translatex != lasttranslatex || translatey != lasttranslatey || - scalex != lastscalex || scaley != lastscaley) + lasttranslatex = translatex; //mxd + lasttranslatey = translatey; //mxd + lastscalex = scalex; //mxd + lastscaley = scaley; //mxd + updateneeded = true; + } + + //mxd. Update texture if needed + if(textureupdateneeded) + { + // Get rid of old texture + if(texture != null) { - lasttranslatex = translatex; //mxd - lasttranslatey = translatey; //mxd - lastscalex = scalex; //mxd - lastscaley = scaley; //mxd - updateneeded = true; + texture.Dispose(); + texture = null; } + + // Create label image + Bitmap img = CreateLabelImage(text, font, color, backcolor, drawbg); + textsize = img.Size; + + // Create texture + MemoryStream memstream = new MemoryStream((img.Size.Width * img.Size.Height * 4) + 4096); + img.Save(memstream, ImageFormat.Bmp); + memstream.Seek(0, SeekOrigin.Begin); + + texture = Texture.FromStream(General.Map.Graphics.Device, memstream, (int)memstream.Length, + img.Size.Width, img.Size.Height, 1, Usage.None, Format.Unknown, + Pool.Managed, General.Map.Graphics.PostFilter, General.Map.Graphics.MipGenerateFilter, 0); } // Update if needed - if(updateneeded) + if(updateneeded || textureupdateneeded) { // Only build when there are any vertices if(text.Length > 0) { - // Do we have to make a new buffer? - if((textbuffer == null) || (text.Length > capacity)) - { - // Dispose previous - if(textbuffer != null) textbuffer.Dispose(); - - // Determine new capacity - if(capacity < text.Length) capacity = text.Length; - - // Create the buffer - textbuffer = new VertexBuffer(General.Map.Graphics.Device, - capacity * 12 * FlatVertex.Stride, - Usage.Dynamic | Usage.WriteOnly, - VertexFormat.None, Pool.Default); - } - // Transform? - RectangleF absview; if(transformcoords) { // Calculate absolute coordinates @@ -183,24 +194,21 @@ namespace CodeImp.DoomBuilder.Rendering Vector2D rb = new Vector2D(rect.Right, rect.Bottom); lt = lt.GetTransformed(translatex, translatey, scalex, scaley); rb = rb.GetTransformed(translatex, translatey, scalex, scaley); - absview = new RectangleF(lt.x, lt.y, rb.x - lt.x, rb.y - lt.y); + absview = new RectangleF((float)Math.Round(lt.x), (float)Math.Round(lt.y), rb.x - lt.x, rb.y - lt.y); } else { // Fixed coordinates absview = rect; } - - // Calculate text dimensions - size = General.Map.Graphics.Font.GetTextSize(text, scale); // Align the text horizontally float beginx = 0; switch(alignx) { case TextAlignmentX.Left: beginx = absview.X; break; - case TextAlignmentX.Center: beginx = absview.X + (absview.Width - size.Width) * 0.5f; break; - case TextAlignmentX.Right: beginx = absview.X + absview.Width - size.Width; break; + case TextAlignmentX.Center: beginx = absview.X + (absview.Width - textsize.Width) * 0.5f; break; + case TextAlignmentX.Right: beginx = absview.X + absview.Width - textsize.Width; break; } // Align the text vertically @@ -208,63 +216,149 @@ namespace CodeImp.DoomBuilder.Rendering switch(aligny) { case TextAlignmentY.Top: beginy = absview.Y; break; - case TextAlignmentY.Middle: beginy = absview.Y + (absview.Height - size.Height) * 0.5f; break; - case TextAlignmentY.Bottom: beginy = absview.Y + absview.Height - size.Height; break; + case TextAlignmentY.Middle: beginy = absview.Y + (absview.Height - textsize.Height) * 0.5f; break; + case TextAlignmentY.Bottom: beginy = absview.Y + absview.Height - textsize.Height; break; } - // Get the ASCII bytes for the text - byte[] textbytes = Encoding.ASCII.GetBytes(text); + // Do we have to make a new buffer? + if(textbuffer == null) + { + // Create the buffer + textbuffer = new VertexBuffer(General.Map.Graphics.Device, 4 * FlatVertex.Stride, + Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default); + } - // Lock the buffer - DataStream stream = textbuffer.Lock(0, capacity * 12 * FlatVertex.Stride, - LockFlags.Discard | LockFlags.NoSystemLock); - - // Go for all chars in text to create the backgrounds - float textx = beginx; - foreach(byte b in textbytes) - General.Map.Graphics.Font.SetupVertices(stream, b, scale, backcolor.ToInt(), - ref textx, beginy, size.Height, 0.5f); - - // Go for all chars in text to create the text - textx = beginx; - foreach(byte b in textbytes) - General.Map.Graphics.Font.SetupVertices(stream, b, scale, color.ToInt(), - ref textx, beginy, size.Height, 0.0f); + //mxd. Lock the buffer + using(DataStream stream = textbuffer.Lock(0, 4 * FlatVertex.Stride, LockFlags.Discard | LockFlags.NoSystemLock)) + { + FlatQuad quad = new FlatQuad(PrimitiveType.TriangleStrip, beginx, beginy, beginx + textsize.Width, beginy + textsize.Height); + stream.WriteRange(quad.Vertices); + } // Done filling the vertex buffer textbuffer.Unlock(); - stream.Dispose(); - - // Calculate number of triangles - numfaces = text.Length * 4; } else { // No faces in polygon - numfaces = 0; - size = new SizeF(0f, 0f); + if(textbuffer != null) textbuffer.Dispose(); //mxd + textsize = new SizeF(); } // Text updated updateneeded = false; + textureupdateneeded = false; //mxd } + + return absview; //mxd + } + + //mxd + private static Bitmap CreateLabelImage(string text, Font font, PixelColor color, PixelColor backcolor, bool drawbg) + { + PointF textorigin = new PointF(4, 3); + RectangleF textrect = new RectangleF(textorigin, General.Interface.MeasureString(text, font)); + textrect.Width = (float)Math.Round(textrect.Width); + textrect.Height = (float)Math.Round(textrect.Height); + RectangleF bgrect = new RectangleF(0, 0, textrect.Width + textorigin.X * 2, textrect.Height + textorigin.Y * 2); + + Bitmap result = new Bitmap((int)bgrect.Width, (int)bgrect.Height); + using(Graphics g = Graphics.FromImage(result)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + g.CompositingQuality = CompositingQuality.HighQuality; + + // Draw text + using(StringFormat sf = new StringFormat()) + { + sf.FormatFlags = StringFormatFlags.NoWrap; + sf.Alignment = StringAlignment.Center; + sf.LineAlignment = StringAlignment.Center; + + // Draw text with BG + if(drawbg) + { + GraphicsPath p = new GraphicsPath(); + float radius = textorigin.X; + const float outlinewidth = 1; + + RectangleF pathrect = bgrect; + pathrect.Width -= 1; + pathrect.Height -= 1; + + // Left line + p.AddLine(pathrect.Left, pathrect.Bottom - radius + outlinewidth, pathrect.Left, pathrect.Top + radius); + p.AddArc(pathrect.Left, pathrect.Top, radius, radius, 180, 90); + + // Top line + p.AddLine(pathrect.Left + radius, pathrect.Top, pathrect.Right - radius, pathrect.Top); + p.AddArc(pathrect.Right - radius, pathrect.Top, radius, radius, 270, 90); + + // Right line + p.AddLine(pathrect.Right, pathrect.Top + radius, pathrect.Right, pathrect.Bottom - radius); + p.AddArc(pathrect.Right - radius, pathrect.Bottom - radius, radius, radius, 0, 90); + + // Bottom line + p.AddLine(pathrect.Left + radius, pathrect.Bottom, pathrect.Left + radius, pathrect.Bottom); + p.AddArc(pathrect.Left, pathrect.Bottom - radius, radius, radius, 90, 90); + + // Fill'n'draw bg + using(SolidBrush brush = new SolidBrush(color.ToColor())) + g.FillPath(brush, p); + + using(Pen pen = new Pen(backcolor.ToColor(), outlinewidth)) + g.DrawPath(pen, p); + + // Draw text + using(SolidBrush brush = new SolidBrush(backcolor.ToColor())) + g.DrawString(text, font, brush, textrect, sf); + } + // Draw text with outline + else + { + RectangleF pathrect = textrect; + pathrect.Inflate(1, 3); + + GraphicsPath p = new GraphicsPath(); + p.AddString(text, font.FontFamily, (int)font.Style, g.DpiY * font.Size / 72f, pathrect, sf); + + // Draw'n'fill text + using(Pen pen = new Pen(backcolor.ToColor(), 3)) + g.DrawPath(pen, p); + + using(SolidBrush brush = new SolidBrush(color.ToColor())) + g.FillPath(brush, p); + } + } + } + + return result; } // This unloads the resources public void UnloadResource() { // Clean up - if(textbuffer != null) textbuffer.Dispose(); - textbuffer = null; + if(textbuffer != null) + { + textbuffer.Dispose(); + textbuffer = null; + } + + if(texture != null) //mxd + { + texture.Dispose(); + texture = null; + } // Need to update before we can render updateneeded = true; + textureupdateneeded = true; //mxd } // This (re)loads the resources - public void ReloadResource() - { - } + public void ReloadResource() { } #endregion } diff --git a/Source/Core/Resources/Font.cfg b/Source/Core/Resources/Font.cfg deleted file mode 100644 index 8a0f9fd..0000000 --- a/Source/Core/Resources/Font.cfg +++ /dev/null @@ -1,710 +0,0 @@ -count = 64; - -chars -{ - - 65 - { - width = 26; - height = 42; - u1 = 0.011719f; - v1 = -0.003906f; - u2 = 0.078125f; - v2 = 0.195313f; - } - - - 66 - { - width = 26; - height = 42; - u1 = 0.082031f; - v1 = -0.003906f; - u2 = 0.148438f; - v2 = 0.195313f; - } - - - 67 - { - width = 26; - height = 42; - u1 = 0.152344f; - v1 = -0.003906f; - u2 = 0.21875f; - v2 = 0.195313f; - } - - - 68 - { - width = 26; - height = 42; - u1 = 0.222656f; - v1 = -0.003906f; - u2 = 0.289063f; - v2 = 0.195313f; - } - - - 69 - { - width = 24; - height = 42; - u1 = 0.292969f; - v1 = -0.003906f; - u2 = 0.355469f; - v2 = 0.195313f; - } - - - 70 - { - width = 22; - height = 42; - u1 = 0.359375f; - v1 = -0.003906f; - u2 = 0.417969f; - v2 = 0.195313f; - } - - - 71 - { - width = 28; - height = 42; - u1 = 0.421875f; - v1 = -0.003906f; - u2 = 0.492188f; - v2 = 0.195313f; - } - - - 72 - { - width = 28; - height = 42; - u1 = 0.496094f; - v1 = -0.003906f; - u2 = 0.566406f; - v2 = 0.195313f; - } - - - 73 - { - width = 13; - height = 42; - u1 = 0.570313f; - v1 = -0.003906f; - u2 = 0.611328f; - v2 = 0.195313f; - } - - - 74 - { - width = 22; - height = 42; - u1 = 0.615234f; - v1 = -0.003906f; - u2 = 0.673828f; - v2 = 0.195313f; - } - - - 75 - { - width = 28; - height = 42; - u1 = 0.677734f; - v1 = -0.003906f; - u2 = 0.748047f; - v2 = 0.195313f; - } - - - 76 - { - width = 22; - height = 42; - u1 = 0.751953f; - v1 = -0.003906f; - u2 = 0.810547f; - v2 = 0.195313f; - } - - - 77 - { - width = 31; - height = 42; - u1 = 0.814453f; - v1 = -0.003906f; - u2 = 0.890625f; - v2 = 0.195313f; - } - - - 78 - { - width = 28; - height = 42; - u1 = 0.894531f; - v1 = -0.003906f; - u2 = 0.964844f; - v2 = 0.195313f; - } - - - 79 - { - width = 28; - height = 42; - u1 = 0.011719f; - v1 = 0.183594f; - u2 = 0.082031f; - v2 = 0.382813f; - } - - - 80 - { - width = 24; - height = 42; - u1 = 0.085938f; - v1 = 0.183594f; - u2 = 0.148438f; - v2 = 0.382813f; - } - - - 81 - { - width = 28; - height = 42; - u1 = 0.152344f; - v1 = 0.183594f; - u2 = 0.222656f; - v2 = 0.382813f; - } - - - 82 - { - width = 26; - height = 42; - u1 = 0.226563f; - v1 = 0.183594f; - u2 = 0.292969f; - v2 = 0.382813f; - } - - - 83 - { - width = 24; - height = 42; - u1 = 0.296875f; - v1 = 0.183594f; - u2 = 0.359375f; - v2 = 0.382813f; - } - - - 84 - { - width = 24; - height = 42; - u1 = 0.363281f; - v1 = 0.183594f; - u2 = 0.425781f; - v2 = 0.382813f; - } - - - 85 - { - width = 28; - height = 42; - u1 = 0.429688f; - v1 = 0.183594f; - u2 = 0.5f; - v2 = 0.382813f; - } - - - 86 - { - width = 26; - height = 42; - u1 = 0.503906f; - v1 = 0.183594f; - u2 = 0.570313f; - v2 = 0.382813f; - } - - - 87 - { - width = 33; - height = 42; - u1 = 0.574219f; - v1 = 0.183594f; - u2 = 0.654297f; - v2 = 0.382813f; - } - - - 88 - { - width = 26; - height = 42; - u1 = 0.658203f; - v1 = 0.183594f; - u2 = 0.724609f; - v2 = 0.382813f; - } - - - 89 - { - width = 26; - height = 42; - u1 = 0.728516f; - v1 = 0.183594f; - u2 = 0.794922f; - v2 = 0.382813f; - } - - - 90 - { - width = 24; - height = 42; - u1 = 0.798828f; - v1 = 0.183594f; - u2 = 0.861328f; - v2 = 0.382813f; - } - - - 48 - { - width = 22; - height = 42; - u1 = 0.865234f; - v1 = 0.183594f; - u2 = 0.923828f; - v2 = 0.382813f; - } - - - 49 - { - width = 22; - height = 42; - u1 = 0.927734f; - v1 = 0.183594f; - u2 = 0.986328f; - v2 = 0.382813f; - } - - - 50 - { - width = 22; - height = 42; - u1 = 0.011719f; - v1 = 0.371094f; - u2 = 0.070313f; - v2 = 0.570313f; - } - - - 51 - { - width = 22; - height = 42; - u1 = 0.074219f; - v1 = 0.371094f; - u2 = 0.132813f; - v2 = 0.570313f; - } - - - 52 - { - width = 22; - height = 42; - u1 = 0.136719f; - v1 = 0.371094f; - u2 = 0.195313f; - v2 = 0.570313f; - } - - - 53 - { - width = 22; - height = 42; - u1 = 0.199219f; - v1 = 0.371094f; - u2 = 0.257813f; - v2 = 0.570313f; - } - - - 54 - { - width = 22; - height = 42; - u1 = 0.261719f; - v1 = 0.371094f; - u2 = 0.320313f; - v2 = 0.570313f; - } - - - 55 - { - width = 22; - height = 42; - u1 = 0.324219f; - v1 = 0.371094f; - u2 = 0.382813f; - v2 = 0.570313f; - } - - - 56 - { - width = 22; - height = 42; - u1 = 0.386719f; - v1 = 0.371094f; - u2 = 0.445313f; - v2 = 0.570313f; - } - - - 57 - { - width = 22; - height = 42; - u1 = 0.449219f; - v1 = 0.371094f; - u2 = 0.507813f; - v2 = 0.570313f; - } - - - 32 - { - width = 12; - height = 42; - u1 = 0.511719f; - v1 = 0.371094f; - u2 = 0.550781f; - v2 = 0.570313f; - } - - - 33 - { - width = 12; - height = 42; - u1 = 0.554688f; - v1 = 0.371094f; - u2 = 0.59375f; - v2 = 0.570313f; - } - - - 64 - { - width = 25; - height = 42; - u1 = 0.597656f; - v1 = 0.371094f; - u2 = 0.662109f; - v2 = 0.570313f; - } - - - 35 - { - width = 22; - height = 42; - u1 = 0.666016f; - v1 = 0.371094f; - u2 = 0.724609f; - v2 = 0.570313f; - } - - - 36 - { - width = 22; - height = 42; - u1 = 0.728516f; - v1 = 0.371094f; - u2 = 0.787109f; - v2 = 0.570313f; - } - - - 37 - { - width = 33; - height = 42; - u1 = 0.791016f; - v1 = 0.371094f; - u2 = 0.871094f; - v2 = 0.570313f; - } - - - 94 - { - width = 22; - height = 42; - u1 = 0.875f; - v1 = 0.371094f; - u2 = 0.933594f; - v2 = 0.570313f; - } - - - 38 - { - width = 29; - height = 42; - u1 = 0.011719f; - v1 = 0.558594f; - u2 = 0.083984f; - v2 = 0.757813f; - } - - - 42 - { - width = 19; - height = 42; - u1 = 0.087891f; - v1 = 0.558594f; - u2 = 0.140625f; - v2 = 0.757813f; - } - - - 40 - { - width = 13; - height = 42; - u1 = 0.144531f; - v1 = 0.558594f; - u2 = 0.185547f; - v2 = 0.757813f; - } - - - 41 - { - width = 13; - height = 42; - u1 = 0.189453f; - v1 = 0.558594f; - u2 = 0.230469f; - v2 = 0.757813f; - } - - - 95 - { - width = 17; - height = 42; - u1 = 0.234375f; - v1 = 0.558594f; - u2 = 0.283203f; - v2 = 0.757813f; - } - - - 43 - { - width = 22; - height = 42; - u1 = 0.287109f; - v1 = 0.558594f; - u2 = 0.345703f; - v2 = 0.757813f; - } - - - 61 - { - width = 22; - height = 42; - u1 = 0.349609f; - v1 = 0.558594f; - u2 = 0.408203f; - v2 = 0.757813f; - } - - - 45 - { - width = 12; - height = 42; - u1 = 0.412109f; - v1 = 0.558594f; - u2 = 0.451172f; - v2 = 0.757813f; - } - - - 91 - { - width = 13; - height = 42; - u1 = 0.455078f; - v1 = 0.558594f; - u2 = 0.496094f; - v2 = 0.757813f; - } - - - 93 - { - width = 13; - height = 42; - u1 = 0.5f; - v1 = 0.558594f; - u2 = 0.541016f; - v2 = 0.757813f; - } - - - 58 - { - width = 12; - height = 42; - u1 = 0.544922f; - v1 = 0.558594f; - u2 = 0.583984f; - v2 = 0.757813f; - } - - - 59 - { - width = 12; - height = 42; - u1 = 0.587891f; - v1 = 0.558594f; - u2 = 0.626953f; - v2 = 0.757813f; - } - - - 39 - { - width = 10; - height = 42; - u1 = 0.630859f; - v1 = 0.558594f; - u2 = 0.666016f; - v2 = 0.757813f; - } - - - 34 - { - width = 17; - height = 42; - u1 = 0.669922f; - v1 = 0.558594f; - u2 = 0.71875f; - v2 = 0.757813f; - } - - - 44 - { - width = 12; - height = 42; - u1 = 0.722656f; - v1 = 0.558594f; - u2 = 0.761719f; - v2 = 0.757813f; - } - - - 46 - { - width = 12; - height = 42; - u1 = 0.765625f; - v1 = 0.558594f; - u2 = 0.804688f; - v2 = 0.757813f; - } - - - 60 - { - width = 22; - height = 42; - u1 = 0.808594f; - v1 = 0.558594f; - u2 = 0.867188f; - v2 = 0.757813f; - } - - - 62 - { - width = 22; - height = 42; - u1 = 0.871094f; - v1 = 0.558594f; - u2 = 0.929688f; - v2 = 0.757813f; - } - - - 47 - { - width = 10; - height = 42; - u1 = 0.933594f; - v1 = 0.558594f; - u2 = 0.96875f; - v2 = 0.757813f; - } - - - 63 - { - width = 21; - height = 42; - u1 = 0.011719f; - v1 = 0.746094f; - u2 = 0.068359f; - v2 = 0.945313f; - } - - - 92 - { - width = 10; - height = 42; - u1 = 0.072266f; - v1 = 0.746094f; - u2 = 0.107422f; - v2 = 0.945313f; - } - -} - diff --git a/Source/Core/Resources/Font.png b/Source/Core/Resources/Font.png deleted file mode 100644 index c7986dcb6113311232afd1d744c15fdedebc5967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20550 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 /// This moves the focus to the editing display. diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 4169daf..9a5759b 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -173,6 +173,9 @@ namespace CodeImp.DoomBuilder.Windows //mxd private System.Timers.Timer blinkTimer; private bool editformopen; + + //mxd. Misc drawing + private Graphics graphics; #endregion @@ -288,6 +291,9 @@ namespace CodeImp.DoomBuilder.Windows //mxd. Hints hintsPanel = new HintsPanel(); hintsDocker = new Docker("hints", "Help", hintsPanel); + + //mxd. Graphics + graphics = Graphics.FromHwndInternal(windowptr); } #endregion @@ -4231,5 +4237,14 @@ namespace CodeImp.DoomBuilder.Windows } #endregion + + #region ================== Graphics (mxd) + + public SizeF MeasureString(string text, Font font) + { + return graphics.MeasureString(text, font); + } + + #endregion } } \ No newline at end of file diff --git a/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs b/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs index c7a8283..4797702 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs @@ -367,7 +367,7 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd [BeginAction("togglehighlight")] - public void ToggleHighlight() + public virtual void ToggleHighlight() { BuilderPlug.Me.UseHighlight = !BuilderPlug.Me.UseHighlight; General.Interface.DisplayStatus(StatusType.Action, "Highlight is now " + (BuilderPlug.Me.UseHighlight ? "ON" : "OFF") + "."); diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs index 1374a0f..d25a3e7 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs @@ -138,11 +138,12 @@ namespace CodeImp.DoomBuilder.BuilderModes if(labels != null) { // Dispose old labels - foreach(KeyValuePair lbl in labels) - foreach(TextLabel l in lbl.Value) l.Dispose(); + foreach(TextLabel[] lbl in labels.Values) + foreach(TextLabel l in lbl) l.Dispose(); } // Make text labels for sectors + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); //mxd labels = new Dictionary(General.Map.Map.Sectors.Count); foreach(Sector s in General.Map.Map.Sectors) { @@ -151,13 +152,12 @@ namespace CodeImp.DoomBuilder.BuilderModes for(int i = 0; i < s.Labels.Count; i++) { Vector2D v = s.Labels[i].position; - labelarray[i] = new TextLabel(20); + labelarray[i] = new TextLabel(); labelarray[i].TransformCoords = true; labelarray[i].Rectangle = new RectangleF(v.x, v.y, 0.0f, 0.0f); labelarray[i].AlignX = TextAlignmentX.Center; labelarray[i].AlignY = TextAlignmentY.Middle; - labelarray[i].Scale = 14f; - labelarray[i].Color = General.Colors.Highlight.WithAlpha(255); + labelarray[i].Color = c; labelarray[i].Backcolor = General.Colors.Background.WithAlpha(255); } labels.Add(s, labelarray); @@ -192,6 +192,7 @@ namespace CodeImp.DoomBuilder.BuilderModes if(BuilderPlug.Me.ViewSelectionNumbers) { + List torender = new List(orderedselection.Count); foreach(Sector s in orderedselection) { // Render labels @@ -202,9 +203,10 @@ namespace CodeImp.DoomBuilder.BuilderModes // Render only when enough space for the label to see float requiredsize = (l.TextSize.Height / 2) / renderer.Scale; - if(requiredsize < s.Labels[i].radius) renderer.RenderText(l); + if(requiredsize < s.Labels[i].radius) torender.Add(l); } } + renderer.RenderText(torender); } //mxd. Render effect labels @@ -221,9 +223,10 @@ namespace CodeImp.DoomBuilder.BuilderModes //mxd private void RenderEffectLabels(Dictionary labelsGroup) { + List torender = new List(labelsGroup.Count); foreach(KeyValuePair group in labelsGroup) { - // Render labels + // Pick which text variant to use TextLabel[] labelarray = labels[group.Key]; for(int i = 0; i < group.Key.Labels.Count; i++) { @@ -231,10 +234,10 @@ namespace CodeImp.DoomBuilder.BuilderModes l.Color = General.Colors.InfoLine; // Render only when enough space for the label to see - float requiredsize = (General.Map.GetTextSize(group.Value[0], l.Scale).Width) / renderer.Scale; + float requiredsize = (General.Interface.MeasureString(group.Value[0], l.Font).Width / 2) / renderer.Scale; if(requiredsize > group.Key.Labels[i].radius) { - requiredsize = (General.Map.GetTextSize(group.Value[1], l.Scale).Width) / renderer.Scale; + requiredsize = (General.Interface.MeasureString(group.Value[1], l.Font).Width / 2) / renderer.Scale; l.Text = (requiredsize > group.Key.Labels[i].radius ? "+" : group.Value[1]); } else @@ -242,9 +245,12 @@ namespace CodeImp.DoomBuilder.BuilderModes l.Text = group.Value[0]; } - renderer.RenderText(l); + torender.Add(l); } } + + // Render labels + renderer.RenderText(torender); } //mxd @@ -286,8 +292,8 @@ namespace CodeImp.DoomBuilder.BuilderModes string[] result = new[] { string.Empty, string.Empty }; if(s.Effect != 0 && s.Tag != 0) { - result[0] = tagstr + "; " + effectstr; - result[1] = tagstrshort + " " + effectstrshort; + result[0] = tagstr + Environment.NewLine + effectstr; + result[1] = tagstrshort + Environment.NewLine + effectstrshort; } else if(s.Effect != 0) { @@ -413,14 +419,16 @@ namespace CodeImp.DoomBuilder.BuilderModes if((highlighted != null) && !highlighted.IsDisposed) { TextLabel[] labelarray = labels[highlighted]; - foreach(TextLabel l in labelarray) l.Color = General.Colors.Selection; + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); + foreach(TextLabel l in labelarray) l.Color = c; } // Change label color if((s != null) && !s.IsDisposed) { TextLabel[] labelarray = labels[s]; - foreach(TextLabel l in labelarray) l.Color = General.Colors.Highlight; + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Selection : General.Colors.Highlight); + foreach(TextLabel l in labelarray) l.Color = c; } // If we're changing associations, then we @@ -485,11 +493,12 @@ namespace CodeImp.DoomBuilder.BuilderModes { //mxd string selectedCount = General.Map.Map.SelectedSectorsCount.ToString(); + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); TextLabel[] labelarray = labels[s]; foreach(TextLabel l in labelarray) { l.Text = selectedCount; - l.Color = General.Colors.Selection; + l.Color = c; } UpdateEffectLabels(); @@ -545,6 +554,7 @@ namespace CodeImp.DoomBuilder.BuilderModes { // Go for all labels in all selected sectors ICollection orderedselection = General.Map.Map.GetSelectedSectors(true); + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); //mxd int index = 0; foreach(Sector s in orderedselection) { @@ -554,7 +564,7 @@ namespace CodeImp.DoomBuilder.BuilderModes // Make sure the text and color are right int labelnum = index + 1; l.Text = labelnum.ToString(); - l.Color = General.Colors.Selection; + l.Color = c; } index++; } @@ -826,7 +836,8 @@ namespace CodeImp.DoomBuilder.BuilderModes // Update overlay TextLabel[] labelarray = labels[highlighted]; - foreach(TextLabel l in labelarray) l.Color = General.Colors.Highlight; + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Selection : General.Colors.Highlight); + foreach(TextLabel l in labelarray) l.Color = c; UpdateOverlaySurfaces(); //mxd UpdateOverlay(); renderer.Present(); @@ -1333,6 +1344,26 @@ namespace CodeImp.DoomBuilder.BuilderModes base.OnRedoEnd(); //mxd } + //mxd + public override void ToggleHighlight() + { + // Update label colors + PixelColor c = (BuilderPlug.Me.UseHighlight ? General.Colors.Selection : General.Colors.Highlight); + foreach(TextLabel[] labelarray in labels.Values) + foreach(TextLabel l in labelarray) l.Color = c; + + // Update highlighted label color + if((highlighted != null) && !highlighted.IsDisposed) + { + TextLabel[] labelarray = labels[highlighted]; + c = (BuilderPlug.Me.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); + foreach(TextLabel l in labelarray) l.Color = c; + } + + // Pass to base + base.ToggleHighlight(); + } + //mxd private void RenderComment(Sector s) { diff --git a/Source/Plugins/BuilderModes/General/LineLengthLabel.cs b/Source/Plugins/BuilderModes/General/LineLengthLabel.cs index 1ced737..728c7c0 100644 --- a/Source/Plugins/BuilderModes/General/LineLengthLabel.cs +++ b/Source/Plugins/BuilderModes/General/LineLengthLabel.cs @@ -29,8 +29,6 @@ namespace CodeImp.DoomBuilder.BuilderModes { #region ================== Constants - private const int TEXT_CAPACITY = 15; - private const float TEXT_SCALE = 14f; private const string VALUE_FORMAT = "0"; #endregion @@ -105,12 +103,11 @@ namespace CodeImp.DoomBuilder.BuilderModes // Initialization private void Initialize() { - label = new TextLabel(TEXT_CAPACITY); + label = new TextLabel(); label.AlignX = TextAlignmentX.Center; label.AlignY = TextAlignmentY.Middle; label.Color = General.Colors.Highlight; label.Backcolor = General.Colors.Background; - label.Scale = TEXT_SCALE; label.TransformCoords = true; } @@ -133,8 +130,8 @@ namespace CodeImp.DoomBuilder.BuilderModes float length = delta.GetLength(); if(showangle) { - int displayangle = General.ClampAngle((int)Math.Round(Angle2D.RadToDeg(delta.GetAngle())) - 90); - label.Text = "l:" + length.ToString(VALUE_FORMAT) + "; a:" + displayangle; + int displayangle = General.ClampAngle((int)Math.Round(Angle2D.RadToDeg(delta.GetAngle()))); + label.Text = "L:" + length.ToString(VALUE_FORMAT) + "; A:" + displayangle; } else { @@ -194,7 +191,7 @@ namespace CodeImp.DoomBuilder.BuilderModes { Vector2D perpendicular = (end - start).GetPerpendicular(); float angle = perpendicular.GetAngle(); - SizeF textsize = General.Map.GetTextSize(label.Text, label.Scale); + SizeF textsize = General.Interface.MeasureString(label.Text, label.Font); float offset = textsize.Width * Math.Abs((float)Math.Sin(angle)) + textsize.Height * Math.Abs((float)Math.Cos(angle)); perpendicular = perpendicular.GetNormal().GetScaled(offset / 2.0f / General.Map.Renderer2D.Scale); start += perpendicular;