diff --git a/OpenRA.Game/Graphics/SpriteFont.cs b/OpenRA.Game/Graphics/SpriteFont.cs index c9e7ddcd88..af409a0910 100644 --- a/OpenRA.Game/Graphics/SpriteFont.cs +++ b/OpenRA.Game/Graphics/SpriteFont.cs @@ -23,12 +23,12 @@ namespace OpenRA.Graphics static SheetBuilder builder; readonly int size; - string name; + + readonly Func lineWidth; public SpriteFont(string name, int size) { this.size = size; - this.name = name; face = new Face(library, name); face.SetPixelSizes((uint)size, (uint)size); @@ -39,12 +39,14 @@ namespace OpenRA.Graphics // TODO: SheetBuilder state is leaked between mod switches if (builder == null) builder = new SheetBuilder(SheetType.BGRA); + Func characterWidth = character => glyphs[Pair.New(character, Color.White)].Advance; + lineWidth = line => line.Sum(characterWidth); - PrecacheColor(Color.White); - PrecacheColor(Color.Red); + PrecacheColor(Color.White, name); + PrecacheColor(Color.Red, name); } - void PrecacheColor(Color c) + void PrecacheColor(Color c, string name) { using (new PerfTimer("PrecacheColor {0} {1}px {2}".F(name, size, c.Name))) for (var n = (char)0x20; n < (char)0x7f; n++) @@ -91,7 +93,7 @@ namespace OpenRA.Graphics public int2 Measure(string text) { var lines = text.Split('\n'); - return new int2((int)Math.Ceiling(lines.Max(s => s.Sum(a => glyphs[Pair.New(a, Color.White)].Advance))), lines.Length * size); + return new int2((int)Math.Ceiling(lines.Max(lineWidth)), lines.Length * size); } Cache, GlyphInfo> glyphs; diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 3242c5c117..867ce36010 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -46,12 +46,15 @@ namespace OpenRA.Graphics readonly Dictionary palettes = new Dictionary(); readonly TerrainRenderer terrainRenderer; readonly Lazy devTrait; + readonly Func createPaletteReference; internal WorldRenderer(World world) { World = world; Viewport = new Viewport(this, world.Map); + createPaletteReference = CreatePaletteReference; + foreach (var pal in world.TraitDict.ActorsWithTrait()) pal.Trait.LoadPalettes(this); @@ -69,7 +72,7 @@ namespace OpenRA.Graphics return new PaletteReference(name, palette.GetPaletteIndex(name), pal, palette); } - public PaletteReference Palette(string name) { return palettes.GetOrAdd(name, CreatePaletteReference); } + public PaletteReference Palette(string name) { return palettes.GetOrAdd(name, createPaletteReference); } public void AddPalette(string name, ImmutablePalette pal) { palette.AddPalette(name, pal, false); } public void AddPalette(string name, ImmutablePalette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); } public void ReplacePalette(string name, IPalette pal) { palette.ReplacePalette(name, pal); palettes[name].Palette = pal; } diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 018cfde7c9..0251d4dd21 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -157,20 +157,19 @@ namespace OpenRA.Mods.Common.Traits return notVisibleEdges; var cell = uv.ToCPos(map); - Func isCellVisible = c => isVisible(c.ToMPos(map)); // If a side is shrouded then we also count the corners var edge = Edges.None; - if (!isCellVisible(cell + new CVec(0, -1))) edge |= Edges.Top; - if (!isCellVisible(cell + new CVec(1, 0))) edge |= Edges.Right; - if (!isCellVisible(cell + new CVec(0, 1))) edge |= Edges.Bottom; - if (!isCellVisible(cell + new CVec(-1, 0))) edge |= Edges.Left; + if (!isVisible((cell + new CVec(0, -1)).ToMPos(map))) edge |= Edges.Top; + if (!isVisible((cell + new CVec(1, 0)).ToMPos(map))) edge |= Edges.Right; + if (!isVisible((cell + new CVec(0, 1)).ToMPos(map))) edge |= Edges.Bottom; + if (!isVisible((cell + new CVec(-1, 0)).ToMPos(map))) edge |= Edges.Left; var ucorner = edge & Edges.AllCorners; - if (!isCellVisible(cell + new CVec(-1, -1))) edge |= Edges.TopLeft; - if (!isCellVisible(cell + new CVec(1, -1))) edge |= Edges.TopRight; - if (!isCellVisible(cell + new CVec(1, 1))) edge |= Edges.BottomRight; - if (!isCellVisible(cell + new CVec(-1, 1))) edge |= Edges.BottomLeft; + if (!isVisible((cell + new CVec(-1, -1)).ToMPos(map))) edge |= Edges.TopLeft; + if (!isVisible((cell + new CVec(1, -1)).ToMPos(map))) edge |= Edges.TopRight; + if (!isVisible((cell + new CVec(1, 1)).ToMPos(map))) edge |= Edges.BottomRight; + if (!isVisible((cell + new CVec(-1, 1)).ToMPos(map))) edge |= Edges.BottomLeft; // RA provides a set of frames for tiles with shrouded // corners but unshrouded edges. We want to detect this