Tables.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * Copyright (c) 2020, Srimanta Barua <srimanta.barua1@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Span.h>
  8. namespace TTF {
  9. enum class IndexToLocFormat {
  10. Offset16,
  11. Offset32,
  12. };
  13. class Head {
  14. public:
  15. static Optional<Head> from_slice(const ReadonlyBytes&);
  16. u16 units_per_em() const;
  17. i16 xmin() const;
  18. i16 ymin() const;
  19. i16 xmax() const;
  20. i16 ymax() const;
  21. u16 lowest_recommended_ppem() const;
  22. IndexToLocFormat index_to_loc_format() const;
  23. private:
  24. enum class Offsets {
  25. UnitsPerEM = 18,
  26. XMin = 36,
  27. YMin = 38,
  28. XMax = 40,
  29. YMax = 42,
  30. LowestRecPPEM = 46,
  31. IndexToLocFormat = 50,
  32. };
  33. enum class Sizes {
  34. Table = 54,
  35. };
  36. Head(const ReadonlyBytes& slice)
  37. : m_slice(slice)
  38. {
  39. }
  40. ReadonlyBytes m_slice;
  41. };
  42. class Hhea {
  43. public:
  44. static Optional<Hhea> from_slice(const ReadonlyBytes&);
  45. i16 ascender() const;
  46. i16 descender() const;
  47. i16 line_gap() const;
  48. u16 advance_width_max() const;
  49. u16 number_of_h_metrics() const;
  50. private:
  51. enum class Offsets {
  52. Ascender = 4,
  53. Descender = 6,
  54. LineGap = 8,
  55. AdvanceWidthMax = 10,
  56. NumberOfHMetrics = 34,
  57. };
  58. enum class Sizes {
  59. Table = 36,
  60. };
  61. Hhea(const ReadonlyBytes& slice)
  62. : m_slice(slice)
  63. {
  64. }
  65. ReadonlyBytes m_slice;
  66. };
  67. class Maxp {
  68. public:
  69. static Optional<Maxp> from_slice(const ReadonlyBytes&);
  70. u16 num_glyphs() const;
  71. private:
  72. enum class Offsets {
  73. NumGlyphs = 4
  74. };
  75. enum class Sizes {
  76. TableV0p5 = 6,
  77. };
  78. Maxp(const ReadonlyBytes& slice)
  79. : m_slice(slice)
  80. {
  81. }
  82. ReadonlyBytes m_slice;
  83. };
  84. struct GlyphHorizontalMetrics {
  85. u16 advance_width;
  86. i16 left_side_bearing;
  87. };
  88. class Hmtx {
  89. public:
  90. static Optional<Hmtx> from_slice(const ReadonlyBytes&, u32 num_glyphs, u32 number_of_h_metrics);
  91. GlyphHorizontalMetrics get_glyph_horizontal_metrics(u32 glyph_id) const;
  92. private:
  93. enum class Sizes {
  94. LongHorMetric = 4,
  95. LeftSideBearing = 2
  96. };
  97. Hmtx(const ReadonlyBytes& slice, u32 num_glyphs, u32 number_of_h_metrics)
  98. : m_slice(slice)
  99. , m_num_glyphs(num_glyphs)
  100. , m_number_of_h_metrics(number_of_h_metrics)
  101. {
  102. }
  103. ReadonlyBytes m_slice;
  104. u32 m_num_glyphs { 0 };
  105. u32 m_number_of_h_metrics { 0 };
  106. };
  107. class Name {
  108. public:
  109. enum class Platform {
  110. Unicode = 0,
  111. Macintosh = 1,
  112. Windows = 3,
  113. };
  114. enum class MacintoshLanguage {
  115. English = 0,
  116. };
  117. enum class WindowsLanguage {
  118. EnglishUnitedStates = 0x0409,
  119. };
  120. static Optional<Name> from_slice(const ReadonlyBytes&);
  121. String family_name() const { return string_for_id(NameId::FamilyName); }
  122. String subfamily_name() const { return string_for_id(NameId::SubfamilyName); }
  123. String typographic_family_name() const { return string_for_id(NameId::TypographicFamilyName); }
  124. String typographic_subfamily_name() const { return string_for_id(NameId::TypographicSubfamilyName); }
  125. private:
  126. enum class NameId {
  127. Copyright = 0,
  128. FamilyName = 1,
  129. SubfamilyName = 2,
  130. UniqueIdentifier = 3,
  131. FullName = 4,
  132. VersionString = 5,
  133. PostscriptName = 6,
  134. Trademark = 7,
  135. Manufacturer = 8,
  136. Designer = 9,
  137. Description = 10,
  138. TypographicFamilyName = 16,
  139. TypographicSubfamilyName = 17,
  140. };
  141. Name(const ReadonlyBytes& slice)
  142. : m_slice(slice)
  143. {
  144. }
  145. String string_for_id(NameId id) const;
  146. ReadonlyBytes m_slice;
  147. };
  148. }