Inject platform dependency in SpriteFont.
This avoids needing to access the global Game.Renderer.
This commit is contained in:
@@ -368,22 +368,7 @@ namespace OpenRA
|
|||||||
Settings.Game.Platform = p;
|
Settings.Game.Platform = p;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var rendererPath = Path.Combine(Platform.BinDir, "OpenRA.Platforms." + p + ".dll");
|
var platform = CreatePlatform(p);
|
||||||
|
|
||||||
#if NET5_0_OR_GREATER
|
|
||||||
var loader = new AssemblyLoader(rendererPath);
|
|
||||||
var platformType = loader.LoadDefaultAssembly().GetTypes().SingleOrDefault(t => typeof(IPlatform).IsAssignableFrom(t));
|
|
||||||
|
|
||||||
#else
|
|
||||||
// NOTE: This is currently the only use of System.Reflection in this file, so would give an unused using error if we import it above
|
|
||||||
var assembly = System.Reflection.Assembly.LoadFile(rendererPath);
|
|
||||||
var platformType = assembly.GetTypes().SingleOrDefault(t => typeof(IPlatform).IsAssignableFrom(t));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (platformType == null)
|
|
||||||
throw new InvalidOperationException("Platform dll must include exactly one IPlatform implementation.");
|
|
||||||
|
|
||||||
var platform = (IPlatform)platformType.GetConstructor(Type.EmptyTypes).Invoke(null);
|
|
||||||
Renderer = new Renderer(platform, Settings.Graphics);
|
Renderer = new Renderer(platform, Settings.Graphics);
|
||||||
Sound = new Sound(platform, Settings.Sound);
|
Sound = new Sound(platform, Settings.Sound);
|
||||||
|
|
||||||
@@ -440,6 +425,26 @@ namespace OpenRA
|
|||||||
InitializeMod(modID, args);
|
InitializeMod(modID, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IPlatform CreatePlatform(string platformName)
|
||||||
|
{
|
||||||
|
var rendererPath = Path.Combine(Platform.BinDir, "OpenRA.Platforms." + platformName + ".dll");
|
||||||
|
|
||||||
|
#if NET5_0_OR_GREATER
|
||||||
|
var loader = new AssemblyLoader(rendererPath);
|
||||||
|
var platformType = loader.LoadDefaultAssembly().GetTypes().SingleOrDefault(t => typeof(IPlatform).IsAssignableFrom(t));
|
||||||
|
|
||||||
|
#else
|
||||||
|
// NOTE: This is currently the only use of System.Reflection in this file, so would give an unused using error if we import it above
|
||||||
|
var assembly = System.Reflection.Assembly.LoadFile(rendererPath);
|
||||||
|
var platformType = assembly.GetTypes().SingleOrDefault(t => typeof(IPlatform).IsAssignableFrom(t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (platformType == null)
|
||||||
|
throw new InvalidOperationException("Platform dll must include exactly one IPlatform implementation.");
|
||||||
|
|
||||||
|
return (IPlatform)platformType.GetConstructor(Type.EmptyTypes).Invoke(null);
|
||||||
|
}
|
||||||
|
|
||||||
public static void InitializeMod(string mod, Arguments args)
|
public static void InitializeMod(string mod, Arguments args)
|
||||||
{
|
{
|
||||||
// Clear static state if we have switched mods
|
// Clear static state if we have switched mods
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
float deviceScale;
|
float deviceScale;
|
||||||
|
|
||||||
public SpriteFont(string name, byte[] data, int size, int ascender, float scale, SheetBuilder builder)
|
public SpriteFont(IPlatform platform, string name, byte[] data, int size, int ascender, float scale, SheetBuilder builder)
|
||||||
{
|
{
|
||||||
if (builder.Type != SheetType.BGRA)
|
if (builder.Type != SheetType.BGRA)
|
||||||
throw new ArgumentException("The sheet builder must create BGRA sheets.", nameof(builder));
|
throw new ArgumentException("The sheet builder must create BGRA sheets.", nameof(builder));
|
||||||
@@ -36,7 +36,7 @@ namespace OpenRA.Graphics
|
|||||||
this.size = size;
|
this.size = size;
|
||||||
this.builder = builder;
|
this.builder = builder;
|
||||||
|
|
||||||
font = Game.Renderer.CreateFont(data);
|
font = platform.CreateFont(data);
|
||||||
glyphs = new Cache<char, GlyphInfo>(CreateGlyph);
|
glyphs = new Cache<char, GlyphInfo>(CreateGlyph);
|
||||||
contrastGlyphs = new Cache<(char, int), Sprite>(CreateContrastGlyph);
|
contrastGlyphs = new Cache<(char, int), Sprite>(CreateContrastGlyph);
|
||||||
dilationElements = new Cache<int, float[]>(CreateCircularWeightMap);
|
dilationElements = new Cache<int, float[]>(CreateCircularWeightMap);
|
||||||
|
|||||||
@@ -134,8 +134,9 @@ namespace OpenRA
|
|||||||
fontSheetBuilder?.Dispose();
|
fontSheetBuilder?.Dispose();
|
||||||
fontSheetBuilder = new SheetBuilder(SheetType.BGRA, 512);
|
fontSheetBuilder = new SheetBuilder(SheetType.BGRA, 512);
|
||||||
Fonts = modData.Manifest.Get<Fonts>().FontList.ToDictionary(x => x.Key,
|
Fonts = modData.Manifest.Get<Fonts>().FontList.ToDictionary(x => x.Key,
|
||||||
x => new SpriteFont(x.Value.Font, modData.DefaultFileSystem.Open(x.Value.Font).ReadAllBytes(),
|
x => new SpriteFont(
|
||||||
x.Value.Size, x.Value.Ascender, Window.EffectiveWindowScale, fontSheetBuilder));
|
platform, x.Value.Font, modData.DefaultFileSystem.Open(x.Value.Font).ReadAllBytes(),
|
||||||
|
x.Value.Size, x.Value.Ascender, Window.EffectiveWindowScale, fontSheetBuilder));
|
||||||
}
|
}
|
||||||
|
|
||||||
Window.OnWindowScaleChanged += (oldNative, oldEffective, newNative, newEffective) =>
|
Window.OnWindowScaleChanged += (oldNative, oldEffective, newNative, newEffective) =>
|
||||||
@@ -563,11 +564,6 @@ namespace OpenRA
|
|||||||
|
|
||||||
public string GLVersion => Context.GLVersion;
|
public string GLVersion => Context.GLVersion;
|
||||||
|
|
||||||
public IFont CreateFont(byte[] data)
|
|
||||||
{
|
|
||||||
return platform.CreateFont(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int DisplayCount => Window.DisplayCount;
|
public int DisplayCount => Window.DisplayCount;
|
||||||
|
|
||||||
public int CurrentDisplay => Window.CurrentDisplay;
|
public int CurrentDisplay => Window.CurrentDisplay;
|
||||||
|
|||||||
Reference in New Issue
Block a user