Font.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/MappedFile.h>
  8. #include <AK/RefCounted.h>
  9. #include <AK/RefPtr.h>
  10. #include <AK/String.h>
  11. #include <AK/Types.h>
  12. #include <LibGfx/Bitmap.h>
  13. #include <LibGfx/Size.h>
  14. namespace Gfx {
  15. // FIXME: Make a MutableGlyphBitmap buddy class for FontEditor instead?
  16. class GlyphBitmap {
  17. public:
  18. GlyphBitmap() = default;
  19. GlyphBitmap(const unsigned* rows, IntSize size)
  20. : m_rows(rows)
  21. , m_size(size)
  22. {
  23. }
  24. const unsigned* rows() const { return m_rows; }
  25. unsigned row(unsigned index) const { return m_rows[index]; }
  26. bool bit_at(int x, int y) const { return row(y) & (1 << x); }
  27. void set_bit_at(int x, int y, bool b)
  28. {
  29. auto& mutable_row = const_cast<unsigned*>(m_rows)[y];
  30. if (b)
  31. mutable_row |= 1 << x;
  32. else
  33. mutable_row &= ~(1 << x);
  34. }
  35. IntSize size() const { return m_size; }
  36. int width() const { return m_size.width(); }
  37. int height() const { return m_size.height(); }
  38. private:
  39. const unsigned* m_rows { nullptr };
  40. IntSize m_size { 0, 0 };
  41. };
  42. class Glyph {
  43. public:
  44. Glyph(const GlyphBitmap& glyph_bitmap, int left_bearing, int advance, int ascent)
  45. : m_glyph_bitmap(glyph_bitmap)
  46. , m_left_bearing(left_bearing)
  47. , m_advance(advance)
  48. , m_ascent(ascent)
  49. {
  50. }
  51. Glyph(RefPtr<Bitmap> bitmap, int left_bearing, int advance, int ascent)
  52. : m_bitmap(bitmap)
  53. , m_left_bearing(left_bearing)
  54. , m_advance(advance)
  55. , m_ascent(ascent)
  56. {
  57. }
  58. bool is_glyph_bitmap() const { return !m_bitmap; }
  59. GlyphBitmap glyph_bitmap() const { return m_glyph_bitmap; }
  60. RefPtr<Bitmap> bitmap() const { return m_bitmap; }
  61. int left_bearing() const { return m_left_bearing; }
  62. int advance() const { return m_advance; }
  63. int ascent() const { return m_ascent; }
  64. private:
  65. GlyphBitmap m_glyph_bitmap;
  66. RefPtr<Bitmap> m_bitmap;
  67. int m_left_bearing;
  68. int m_advance;
  69. int m_ascent;
  70. };
  71. class Font : public RefCounted<Font> {
  72. public:
  73. virtual NonnullRefPtr<Font> clone() const = 0;
  74. virtual ~Font() {};
  75. virtual u8 presentation_size() const = 0;
  76. virtual u16 weight() const = 0;
  77. virtual Glyph glyph(u32 code_point) const = 0;
  78. virtual bool contains_glyph(u32 code_point) const = 0;
  79. virtual u8 glyph_width(size_t ch) const = 0;
  80. virtual int glyph_or_emoji_width(u32 code_point) const = 0;
  81. virtual u8 glyph_height() const = 0;
  82. virtual int x_height() const = 0;
  83. virtual u8 min_glyph_width() const = 0;
  84. virtual u8 max_glyph_width() const = 0;
  85. virtual u8 glyph_fixed_width() const = 0;
  86. virtual u8 baseline() const = 0;
  87. virtual u8 mean_line() const = 0;
  88. virtual int width(const StringView&) const = 0;
  89. virtual int width(const Utf8View&) const = 0;
  90. virtual int width(const Utf32View&) const = 0;
  91. virtual String name() const = 0;
  92. virtual bool is_fixed_width() const = 0;
  93. virtual u8 glyph_spacing() const = 0;
  94. virtual size_t glyph_count() const = 0;
  95. virtual String family() const = 0;
  96. virtual String variant() const = 0;
  97. virtual String qualified_name() const = 0;
  98. virtual const Font& bold_variant() const = 0;
  99. };
  100. }