diff --git a/lib/WellspringCS b/lib/WellspringCS index ac63d6c9..f8872bae 160000 --- a/lib/WellspringCS +++ b/lib/WellspringCS @@ -1 +1 @@ -Subproject commit ac63d6c9b2d773792f8c3e5dafe760dd8769a4bf +Subproject commit f8872bae59e394b0f8a35224bb39ab8fd041af97 diff --git a/src/Graphics/Font/Packer.cs b/src/Graphics/Font/Packer.cs index 8f0fe665..3395a39b 100644 --- a/src/Graphics/Font/Packer.cs +++ b/src/Graphics/Font/Packer.cs @@ -12,6 +12,8 @@ namespace MoonWorks.Graphics.Font public Font Font { get; } + private byte[] StringBytes; + private bool IsDisposed; public unsafe Packer(GraphicsDevice graphicsDevice, Font font, float fontSize, uint textureWidth, uint textureHeight, uint padding = 1) @@ -19,6 +21,7 @@ namespace MoonWorks.Graphics.Font Font = font; Handle = Wellspring.Wellspring_CreatePacker(Font.Handle, fontSize, textureWidth, textureHeight, 0, padding); Texture = Texture.CreateTexture2D(graphicsDevice, textureWidth, textureHeight, TextureFormat.R8, TextureUsageFlags.Sampler); + StringBytes = new byte[128]; } public unsafe bool PackFontRanges(params FontRange[] fontRanges) @@ -43,6 +46,38 @@ namespace MoonWorks.Graphics.Font commandBuffer.SetTextureData(Texture, pixelDataPointer, Texture.Width * Texture.Height); } + public unsafe void TextBounds( + string text, + float x, + float y, + HorizontalAlignment horizontalAlignment, + VerticalAlignment verticalAlignment, + out Wellspring.Rectangle rectangle + ) { + var byteCount = System.Text.Encoding.UTF8.GetByteCount(text); + + if (StringBytes.Length < byteCount) + { + System.Array.Resize(ref StringBytes, byteCount); + } + + fixed (char* chars = text) + fixed (byte* bytes = StringBytes) + { + System.Text.Encoding.UTF8.GetBytes(chars, text.Length, bytes, byteCount); + Wellspring.Wellspring_TextBounds( + Handle, + x, + y, + (Wellspring.HorizontalAlignment) horizontalAlignment, + (Wellspring.VerticalAlignment) verticalAlignment, + (IntPtr) bytes, + (uint) byteCount, + out rectangle + ); + } + } + protected virtual void Dispose(bool disposing) { if (!IsDisposed)