TDW.cs 1.9 KB

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