reader.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright ©2021 The star-tex Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE-STAR-TEX file.
  4. package tfm
  5. import (
  6. "io"
  7. "modernc.org/knuth/font/fixed"
  8. "modernc.org/knuth/internal/iobuf"
  9. )
  10. func newReader(r io.Reader) (*iobuf.Reader, error) {
  11. p, err := io.ReadAll(r)
  12. if err != nil {
  13. return nil, err
  14. }
  15. return iobuf.NewReader(p), nil
  16. }
  17. func readStr(r *iobuf.Reader, max int) string {
  18. n := int(r.ReadU8())
  19. if n > max {
  20. return ""
  21. }
  22. raw := r.ReadBuf(max - 1)
  23. return string(raw[:n])
  24. }
  25. func readHeader(r *iobuf.Reader, hdr *fileHeader) error {
  26. const hdrSize = 12 * 2
  27. if len(r.Bytes()) < hdrSize {
  28. return io.ErrUnexpectedEOF
  29. }
  30. hdr.lf = r.ReadU16()
  31. hdr.lh = r.ReadU16()
  32. hdr.bc = r.ReadU16()
  33. hdr.ec = r.ReadU16()
  34. hdr.nw = r.ReadU16()
  35. hdr.nh = r.ReadU16()
  36. hdr.nd = r.ReadU16()
  37. hdr.ni = r.ReadU16()
  38. hdr.nl = r.ReadU16()
  39. hdr.nk = r.ReadU16()
  40. hdr.ne = r.ReadU16()
  41. hdr.np = r.ReadU16()
  42. return nil
  43. }
  44. func readCharInfos(r *iobuf.Reader, n int) []glyphInfo {
  45. if len(r.Bytes()) < n*4 {
  46. return nil
  47. }
  48. out := make([]glyphInfo, n)
  49. for i := range out {
  50. out[i].raw[0] = r.ReadU8()
  51. out[i].raw[1] = r.ReadU8()
  52. out[i].raw[2] = r.ReadU8()
  53. out[i].raw[3] = r.ReadU8()
  54. }
  55. return out
  56. }
  57. func readFWs(r *iobuf.Reader, n int) []fixed.Int12_20 {
  58. if len(r.Bytes()) < n*4 {
  59. return nil
  60. }
  61. out := make([]fixed.Int12_20, n)
  62. for i := range out {
  63. out[i] = fixed.Int12_20(r.ReadU32())
  64. }
  65. return out
  66. }
  67. func readLigKerns(r *iobuf.Reader, n int) []ligKernCmd {
  68. if len(r.Bytes()) < n*4 {
  69. return nil
  70. }
  71. out := make([]ligKernCmd, n)
  72. for i := range out {
  73. out[i].raw[0] = r.ReadU8()
  74. out[i].raw[1] = r.ReadU8()
  75. out[i].raw[2] = r.ReadU8()
  76. out[i].raw[3] = r.ReadU8()
  77. }
  78. return out
  79. }
  80. func readExtens(r *iobuf.Reader, n int) []extensible {
  81. if len(r.Bytes()) < n*4 {
  82. return nil
  83. }
  84. out := make([]extensible, n)
  85. for i := range out {
  86. out[i].raw[0] = r.ReadU8()
  87. out[i].raw[1] = r.ReadU8()
  88. out[i].raw[2] = r.ReadU8()
  89. out[i].raw[3] = r.ReadU8()
  90. }
  91. return out
  92. }