diff --git a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs index 5dc29999c..132950a07 100644 --- a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs +++ b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs @@ -7,7 +7,7 @@ using System.Xml.Linq; namespace Barotrauma { - public class ScalableFont + public class ScalableFont : IDisposable { private static List FontList = new List(); private static Library Lib = null; @@ -30,7 +30,7 @@ namespace Barotrauma set { size = value; - if (graphicsDevice!=null) RenderAtlas(graphicsDevice, charRanges, texDims, baseChar); + if (graphicsDevice != null) RenderAtlas(graphicsDevice, charRanges, texDims, baseChar); } } @@ -302,5 +302,15 @@ namespace Barotrauma } return retVal; } + + public void Dispose() + { + FontList.Remove(this); + foreach (Texture2D texture in textures) + { + texture.Dispose(); + } + textures.Clear(); + } } } diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs index 2b3317682..1227ee15e 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs @@ -1,4 +1,5 @@ -using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; using System.Xml.Linq; @@ -9,6 +10,8 @@ namespace Barotrauma { private Dictionary componentStyles; + private XElement configElement; + public ScalableFont Font { get; private set; } public ScalableFont SmallFont { get; private set; } public ScalableFont LargeFont { get; private set; } @@ -26,6 +29,8 @@ namespace Barotrauma { componentStyles = new Dictionary(); + GameMain.Instance.OnResolutionChanged += () => { RescaleFonts(); }; + XDocument doc; try { @@ -37,29 +42,11 @@ namespace Barotrauma DebugConsole.ThrowError("Loading style \"" + file + "\" failed", e); return; } - + configElement = doc.Root; foreach (XElement subElement in doc.Root.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { - case "font": - Font = new ScalableFont(subElement, graphicsDevice); - break; - case "smallfont": - SmallFont = new ScalableFont(subElement, graphicsDevice); - break; - case "largefont": - LargeFont = new ScalableFont(subElement, graphicsDevice); - break; - case "objectivetitle": - ObjectiveTitleFont = new ScalableFont(subElement, graphicsDevice); - break; - case "objectivename": - ObjectiveNameFont = new ScalableFont(subElement, graphicsDevice); - break; - case "videotitle": - VideoTitleFont = new ScalableFont(subElement, graphicsDevice); - break; case "cursor": CursorSprite = new Sprite(subElement); break; @@ -69,6 +56,24 @@ namespace Barotrauma case "focusindicator": FocusIndicator = new SpriteSheet(subElement); break; + case "font": + Font = LoadFont(subElement, graphicsDevice); + break; + case "smallfont": + SmallFont = LoadFont(subElement, graphicsDevice); + break; + case "largefont": + LargeFont = LoadFont(subElement, graphicsDevice); + break; + case "objectivetitle": + ObjectiveTitleFont = LoadFont(subElement, graphicsDevice); + break; + case "objectivename": + ObjectiveNameFont = LoadFont(subElement, graphicsDevice); + break; + case "videotitle": + VideoTitleFont = LoadFont(subElement, graphicsDevice); + break; default: GUIComponentStyle componentStyle = new GUIComponentStyle(subElement); componentStyles.Add(subElement.Name.ToString().ToLowerInvariant(), componentStyle); @@ -77,6 +82,54 @@ namespace Barotrauma } } + private void RescaleFonts() + { + foreach (XElement subElement in configElement.Elements()) + { + switch (subElement.Name.ToString().ToLowerInvariant()) + { + case "font": + Font.Size = GetFontSize(subElement); + break; + case "smallfont": + SmallFont.Size = GetFontSize(subElement); + break; + case "largefont": + LargeFont.Size = GetFontSize(subElement); + break; + case "objectivetitle": + ObjectiveTitleFont.Size = GetFontSize(subElement); + break; + case "objectivename": + ObjectiveNameFont.Size = GetFontSize(subElement); + break; + case "videotitle": + VideoTitleFont.Size = GetFontSize(subElement); + break; + } + } + } + + private ScalableFont LoadFont(XElement element, GraphicsDevice graphicsDevice) + { + string file = element.GetAttributeString("file", ""); + uint size = GetFontSize(element); + return new ScalableFont(file, size, graphicsDevice); + } + + private uint GetFontSize(XElement element) + { + foreach (XElement subElement in element.Elements()) + { + Point maxResolution = subElement.GetAttributePoint("maxresolution", new Point(int.MaxValue, int.MaxValue)); + if (GameMain.GraphicsWidth <= maxResolution.X && GameMain.GraphicsHeight <= maxResolution.Y) + { + return (uint)subElement.GetAttributeInt("size", 14); + } + } + return 14; + } + public GUIComponentStyle GetComponentStyle(string name) { componentStyles.TryGetValue(name.ToLowerInvariant(), out GUIComponentStyle style);