BitmapFontContentReader.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright (c) Craftwork Games. All rights reserved.
  2. // Licensed under the MIT license.
  3. // See LICENSE file in the project root for full license information.
  4. using System.Collections.Generic;
  5. using Microsoft.Xna.Framework.Content;
  6. using Microsoft.Xna.Framework.Graphics;
  7. using MonoGame.Extended.BitmapFonts;
  8. using MonoGame.Extended.Graphics;
  9. namespace MonoGame.Extended.Content.ContentReaders;
  10. public class BitmapFontContentReader : ContentTypeReader<BitmapFont>
  11. {
  12. protected override BitmapFont Read(ContentReader reader, BitmapFont existingInstance)
  13. {
  14. var textureCount = reader.ReadInt32();
  15. var textures = new Texture2D[textureCount];
  16. for (int i = 0; i < textureCount; i++)
  17. {
  18. var textureName = reader.ReadString();
  19. textures[i] = reader.ContentManager.Load<Texture2D>(reader.GetRelativeAssetName(textureName));
  20. }
  21. var fontName = reader.ReadString();
  22. var fontSize = reader.ReadInt16();
  23. var lineHeight = reader.ReadUInt16();
  24. var characterCount = reader.ReadInt32();
  25. var characters = new Dictionary<int, BitmapFontCharacter>();
  26. for (int i = 0; i < characterCount; i++)
  27. {
  28. var id = reader.ReadUInt32();
  29. var page = reader.ReadByte();
  30. var x = reader.ReadUInt16();
  31. var y = reader.ReadUInt16();
  32. var width = reader.ReadUInt16();
  33. var height = reader.ReadUInt16();
  34. var xOffset = reader.ReadInt16();
  35. var yOffset = reader.ReadInt16();
  36. var xAdvance = reader.ReadInt16();
  37. var characterRegion = new Texture2DRegion(textures[page], x, y, width, height);
  38. var character = new BitmapFontCharacter((char)id, characterRegion, xOffset, yOffset, xAdvance);
  39. characters.Add(character.Character, character);
  40. }
  41. var kerningCount = reader.ReadInt32();
  42. for (int i = 0; i < kerningCount; i++)
  43. {
  44. var first = reader.ReadUInt32();
  45. var second = reader.ReadUInt32();
  46. var amount = reader.ReadInt16();
  47. if (characters.TryGetValue((int)first, out var character))
  48. {
  49. character.Kernings.Add((int)second, amount);
  50. }
  51. }
  52. return new BitmapFont(fontName, fontSize, lineHeight, characters.Values);
  53. }
  54. }