pane.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package brlyt
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. "strings"
  7. )
  8. func (r *Root) ParsePAN(data []byte) (*XMLPane, error) {
  9. var pane Pane
  10. err := binary.Read(bytes.NewReader(data), binary.BigEndian, &pane)
  11. if err != nil {
  12. return nil, err
  13. }
  14. // Strip the null bytes from the strings
  15. name := strings.Replace(string(pane.PaneName[:]), "\x00", "", -1)
  16. userData := strings.Replace(string(pane.UserData[:]), "\x00", "", -1)
  17. xmlData := XMLPane{
  18. Name: name,
  19. UserData: userData,
  20. Flag: pane.Flag,
  21. Origin: Coord2D{X: float32(pane.Origin % 3), Y: float32(pane.Origin / 3)},
  22. Alpha: pane.Alpha,
  23. Padding: 0,
  24. Translate: Coord3D{X: pane.XTranslation, Y: pane.YTranslation, Z: pane.ZTranslation},
  25. Rotate: Coord3D{X: pane.XRotate, Y: pane.YRotate, Z: pane.ZRotate},
  26. Scale: Coord2D{X: pane.XScale, Y: pane.YScale},
  27. Width: pane.Width,
  28. Height: pane.Height,
  29. }
  30. if name == "RootPane" {
  31. r.RootPane = xmlData
  32. r.count--
  33. _, err = r.reader.Seek(8, io.SeekCurrent)
  34. if err != nil {
  35. return nil, err
  36. }
  37. r.RootPane.Children, err = r.ParseChildren()
  38. if err != nil {
  39. return nil, err
  40. }
  41. } else {
  42. // Only the Root Pane is guaranteed to have children, peek to see if this pane does.
  43. if r.HasChildren() {
  44. xmlData.Children, err = r.ParseChildren()
  45. if err != nil {
  46. return nil, err
  47. }
  48. }
  49. }
  50. return &xmlData, nil
  51. }
  52. func (r *Root) ParseBND(data []byte) (*XMLPane, error) {
  53. var pane Pane
  54. err := binary.Read(bytes.NewReader(data), binary.BigEndian, &pane)
  55. if err != nil {
  56. return nil, err
  57. }
  58. // Strip the null bytes from the strings
  59. name := strings.Replace(string(pane.PaneName[:]), "\x00", "", -1)
  60. userData := strings.Replace(string(pane.UserData[:]), "\x00", "", -1)
  61. xmlData := XMLPane{
  62. Name: name,
  63. UserData: userData,
  64. Flag: pane.Flag,
  65. Origin: Coord2D{X: float32(pane.Origin % 3), Y: float32(pane.Origin / 3)},
  66. Alpha: pane.Alpha,
  67. Padding: 0,
  68. Translate: Coord3D{X: pane.XTranslation, Y: pane.YTranslation, Z: pane.ZTranslation},
  69. Rotate: Coord3D{X: pane.XRotate, Y: pane.YRotate, Z: pane.ZRotate},
  70. Scale: Coord2D{X: pane.XScale, Y: pane.YScale},
  71. Width: pane.Width,
  72. Height: pane.Height,
  73. }
  74. if r.HasChildren() {
  75. xmlData.Children, err = r.ParseChildren()
  76. if err != nil {
  77. return nil, err
  78. }
  79. }
  80. return &xmlData, nil
  81. }
  82. func (b *BRLYTWriter) WritePane(pan XMLPane) error {
  83. header := SectionHeader{
  84. Type: SectionTypePAN,
  85. Size: 76,
  86. }
  87. var name [16]byte
  88. copy(name[:], pan.Name)
  89. var userData [8]byte
  90. copy(userData[:], pan.UserData)
  91. pane := Pane{
  92. Flag: pan.Flag,
  93. Origin: uint8(pan.Origin.X + (pan.Origin.Y * 3)),
  94. Alpha: pan.Alpha,
  95. PaneName: name,
  96. UserData: userData,
  97. XTranslation: pan.Translate.X,
  98. YTranslation: pan.Translate.Y,
  99. ZTranslation: pan.Translate.Z,
  100. XRotate: pan.Rotate.X,
  101. YRotate: pan.Rotate.Y,
  102. ZRotate: pan.Rotate.Z,
  103. XScale: pan.Scale.X,
  104. YScale: pan.Scale.Y,
  105. Width: pan.Width,
  106. Height: pan.Height,
  107. }
  108. err := write(b, header)
  109. if err != nil {
  110. return err
  111. }
  112. return write(b, pane)
  113. }
  114. func (b *BRLYTWriter) WriteBND(pan XMLPane) error {
  115. header := SectionHeader{
  116. Type: SectionTypeBND,
  117. Size: 76,
  118. }
  119. var name [16]byte
  120. copy(name[:], pan.Name)
  121. var userData [8]byte
  122. copy(userData[:], pan.UserData)
  123. pane := Pane{
  124. Flag: pan.Flag,
  125. Origin: uint8(pan.Origin.X + (pan.Origin.Y * 3)),
  126. Alpha: pan.Alpha,
  127. PaneName: name,
  128. UserData: userData,
  129. XTranslation: pan.Translate.X,
  130. YTranslation: pan.Translate.Y,
  131. ZTranslation: pan.Translate.Z,
  132. XRotate: pan.Rotate.X,
  133. YRotate: pan.Rotate.Y,
  134. ZRotate: pan.Rotate.Z,
  135. XScale: pan.Scale.X,
  136. YScale: pan.Scale.Y,
  137. Width: pan.Width,
  138. Height: pan.Height,
  139. }
  140. err := write(b, header)
  141. if err != nil {
  142. return err
  143. }
  144. return write(b, pane)
  145. }
  146. func (b *BRLYTWriter) WritePAS() error {
  147. header := SectionHeader{
  148. Type: SectionTypePAS,
  149. Size: 8,
  150. }
  151. return write(b, header)
  152. }
  153. func (b *BRLYTWriter) WritePAE() error {
  154. header := SectionHeader{
  155. Type: SectionTypePAE,
  156. Size: 8,
  157. }
  158. return write(b, header)
  159. }