TDW.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.IO;
  3. namespace OpenVIII
  4. {
  5. public class TDW : TIM2
  6. {
  7. #region Constructors
  8. public TDW(BinaryReader br, uint offset = 0)
  9. {
  10. br.BaseStream.Seek(offset, SeekOrigin.Begin);
  11. var widthPointer = br.ReadUInt32();
  12. var dataPointer = br.ReadUInt32();
  13. br.BaseStream.Seek(widthPointer + offset, SeekOrigin.Begin);
  14. GetWidths(br.ReadBytes((int)(dataPointer - widthPointer)));
  15. _Init(br, dataPointer + offset);
  16. }
  17. public TDW(byte[] buffer, uint offset = 0)
  18. {
  19. var widthPointer = BitConverter.ToUInt32(buffer, (int)(0 + offset));
  20. var dataPointer = BitConverter.ToUInt32(buffer, (int)(4 + offset));
  21. GetWidths(buffer, widthPointer + offset, dataPointer - widthPointer);
  22. _Init(buffer, dataPointer + offset);
  23. }
  24. #endregion Constructors
  25. #region Properties
  26. public byte[] CharWidths { get; private set; }
  27. #endregion Properties
  28. #region Methods
  29. private void GetWidths(byte[] buffer) => GetWidths(buffer, 0, (uint)buffer.Length);
  30. private void GetWidths(byte[] Tdw, uint offset, uint length)
  31. {
  32. if (length > int.MaxValue) return;
  33. var ms = new MemoryStream(Tdw);
  34. var os = new MemoryStream(checked((int)length * 2));
  35. //BinaryWriter and BinaryReader dispose of streams
  36. using (var bw = new BinaryWriter(os))
  37. using (var br = new BinaryReader(ms))
  38. {
  39. //bw.Write((byte)10);//width of space
  40. ms.Seek(offset, SeekOrigin.Begin);
  41. while (ms.Position < offset + length)
  42. {
  43. var b = br.ReadByte();
  44. var low = (byte)(b & 0x0F);
  45. var high = (byte)((b & 0xF0) >> 4);
  46. bw.Write(low);
  47. bw.Write(high);
  48. }
  49. CharWidths = os.ToArray();
  50. }
  51. }
  52. #endregion Methods
  53. }
  54. }