BitmapFontContentReader.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 spacingHoriz = reader.ReadSByte();
  25. var spacingVert = reader.ReadSByte();
  26. var characterCount = reader.ReadInt32();
  27. var characters = new Dictionary<int, BitmapFontCharacter>();
  28. for (int i = 0; i < characterCount; i++)
  29. {
  30. var id = reader.ReadUInt32();
  31. var page = reader.ReadByte();
  32. var x = reader.ReadUInt16();
  33. var y = reader.ReadUInt16();
  34. var width = reader.ReadUInt16();
  35. var height = reader.ReadUInt16();
  36. var xOffset = reader.ReadInt16();
  37. var yOffset = reader.ReadInt16();
  38. var xAdvance = reader.ReadInt16();
  39. var characterRegion = new Texture2DRegion(textures[page], x, y, width, height);
  40. var character = new BitmapFontCharacter((char)id, characterRegion, xOffset, yOffset, xAdvance);
  41. characters.Add(character.Character, character);
  42. }
  43. var kerningCount = reader.ReadInt32();
  44. for (int i = 0; i < kerningCount; i++)
  45. {
  46. var first = reader.ReadUInt32();
  47. var second = reader.ReadUInt32();
  48. var amount = reader.ReadInt16();
  49. if (characters.TryGetValue((int)first, out var character))
  50. {
  51. character.Kernings[(int)second] = amount;
  52. }
  53. }
  54. return new BitmapFont(
  55. fontName,
  56. fontSize,
  57. lineHeight,
  58. spacingHoriz,
  59. spacingVert,
  60. characters.Values
  61. );
  62. }
  63. }