Move FreeType handling into the Platform dll.

This commit is contained in:
Paul Chote
2019-03-06 20:16:58 +00:00
committed by reaperrr
parent e2a51676f7
commit 1d4576229a
8 changed files with 139 additions and 49 deletions

View File

@@ -19,6 +19,7 @@ namespace OpenRA
{
IPlatformWindow CreateWindow(Size size, WindowMode windowMode, int batchSize);
ISoundEngine CreateSound(string device);
IFont CreateFont(byte[] data);
}
public interface IHardwareCursor : IDisposable { }
@@ -129,4 +130,17 @@ namespace OpenRA
Fullscreen,
PseudoFullscreen,
}
public interface IFont : IDisposable
{
FontGlyph CreateGlyph(char c, int size, float deviceScale);
}
public struct FontGlyph
{
public int2 Offset;
public Size Size;
public float Advance;
public byte[] Data;
}
}

View File

@@ -14,18 +14,15 @@ using System.Linq;
using OpenRA.Primitives;
using OpenRA.Support;
using OpenRA.Widgets;
using SharpFont;
namespace OpenRA.Graphics
{
public sealed class SpriteFont : IDisposable
{
static readonly Library Library = new Library();
readonly int size;
readonly SheetBuilder builder;
readonly Func<string, float> lineWidth;
readonly Face face;
readonly IFont font;
readonly Cache<Pair<char, Color>, GlyphInfo> glyphs;
float deviceScale;
@@ -39,8 +36,7 @@ namespace OpenRA.Graphics
this.size = size;
this.builder = builder;
face = new Face(Library, data, 0);
face.SetPixelSizes((uint)(size * deviceScale), (uint)(size * deviceScale));
font = Game.Renderer.CreateFont(data);
glyphs = new Cache<Pair<char, Color>, GlyphInfo>(CreateGlyph, Pair<char, Color>.EqualityComparer);
@@ -55,7 +51,6 @@ namespace OpenRA.Graphics
public void SetScale(float scale)
{
deviceScale = scale;
face.SetPixelSizes((uint)(size * deviceScale), (uint)(size * deviceScale));
glyphs.Clear();
}
@@ -136,11 +131,9 @@ namespace OpenRA.Graphics
GlyphInfo CreateGlyph(Pair<char, Color> c)
{
try
{
face.LoadChar(c.First, LoadFlags.Default, LoadTarget.Normal);
}
catch (FreeTypeException)
var glyph = font.CreateGlyph(c.First, this.size, deviceScale);
if (glyph.Data == null)
{
return new GlyphInfo
{
@@ -150,44 +143,31 @@ namespace OpenRA.Graphics
};
}
face.Glyph.RenderGlyph(RenderMode.Normal);
var size = new Size((int)face.Glyph.Metrics.Width, (int)face.Glyph.Metrics.Height);
var s = builder.Allocate(size);
var s = builder.Allocate(glyph.Size);
var g = new GlyphInfo
{
Sprite = s,
Advance = (float)face.Glyph.Metrics.HorizontalAdvance,
Offset = new int2(face.Glyph.BitmapLeft, -face.Glyph.BitmapTop)
Advance = glyph.Advance,
Offset = glyph.Offset
};
// A new bitmap is generated each time this property is accessed, so we do need to dispose it.
using (var bitmap = face.Glyph.Bitmap)
var dest = s.Sheet.GetData();
var destStride = s.Sheet.Size.Width * 4;
for (var j = 0; j < s.Size.Y; j++)
{
unsafe
for (var i = 0; i < s.Size.X; i++)
{
var p = (byte*)bitmap.Buffer;
var dest = s.Sheet.GetData();
var destStride = s.Sheet.Size.Width * 4;
for (var j = 0; j < s.Size.Y; j++)
var p = glyph.Data[j * glyph.Size.Width + i];
if (p != 0)
{
for (var i = 0; i < s.Size.X; i++)
{
if (p[i] != 0)
{
var q = destStride * (j + s.Bounds.Top) + 4 * (i + s.Bounds.Left);
var pmc = Util.PremultiplyAlpha(Color.FromArgb(p[i], c.Second));
var q = destStride * (j + s.Bounds.Top) + 4 * (i + s.Bounds.Left);
var pmc = Util.PremultiplyAlpha(Color.FromArgb(p, c.Second));
dest[q] = pmc.B;
dest[q + 1] = pmc.G;
dest[q + 2] = pmc.R;
dest[q + 3] = pmc.A;
}
}
p += bitmap.Pitch;
dest[q] = pmc.B;
dest[q + 1] = pmc.G;
dest[q + 2] = pmc.R;
dest[q + 3] = pmc.A;
}
}
}
@@ -199,7 +179,7 @@ namespace OpenRA.Graphics
public void Dispose()
{
face.Dispose();
font.Dispose();
}
}

View File

@@ -76,11 +76,6 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="SharpFont">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\thirdparty\download\SharpFont.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Open.Nat">
<HintPath>..\thirdparty\download\Open.Nat.dll</HintPath>
</Reference>

View File

@@ -39,6 +39,7 @@ namespace OpenRA
readonly Stack<Rectangle> scissorState = new Stack<Rectangle>();
SheetBuilder fontSheetBuilder;
readonly IPlatform platform;
float depthScale;
float depthOffset;
@@ -51,6 +52,7 @@ namespace OpenRA
public Renderer(IPlatform platform, GraphicSettings graphicSettings)
{
this.platform = platform;
var resolution = GetResolution(graphicSettings);
Window = platform.CreateWindow(new Size(resolution.Width, resolution.Height), graphicSettings.Mode, graphicSettings.BatchSize);
@@ -290,5 +292,10 @@ namespace OpenRA
{
get { return Context.GLVersion; }
}
public IFont CreateFont(byte[] data)
{
return platform.CreateFont(data);
}
}
}