From a258d6507a9d4c7ec7bd951fd51d16e67fc2b561 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 5 Feb 2019 06:43:33 +0100 Subject: mmap all the font files! Font now uses the same in-memory format as the font files we have on disk. This allows us to simply mmap() the font files and not use any additional memory for them. Very cool! :^) Hacking on this exposed a bug in file-backed VMObjects where the first client to instantiate a VMObject for a specific inode also got to decide its size. Since file-backed VMObjects always have the same size as the underlying file, this made no sense, so I removed the ability to even set a size in that case. --- SharedGraphics/Font.h | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'SharedGraphics/Font.h') diff --git a/SharedGraphics/Font.h b/SharedGraphics/Font.h index 0b560d822c..ebc64b6930 100644 --- a/SharedGraphics/Font.h +++ b/SharedGraphics/Font.h @@ -6,6 +6,38 @@ #include #include +// FIXME: Make a MutableGlyphBitmap buddy class for FontEditor instead? +class GlyphBitmap { + friend class Font; +public: + const unsigned* rows() const { return m_rows; } + unsigned row(unsigned index) const { return m_rows[index]; } + + bool bit_at(int x, int y) const { return row(y) & (1 << x); } + void set_bit_at(int x, int y, bool b) + { + auto& mutable_row = const_cast(m_rows)[y]; + if (b) + mutable_row |= 1 << x; + else + mutable_row &= ~(1 << x); + } + + Size size() const { return m_size; } + int width() const { return m_size.width(); } + int height() const { return m_size.height(); } + +private: + GlyphBitmap(const unsigned* rows, Size size) + : m_rows(rows) + , m_size(size) + { + } + + const unsigned* m_rows { nullptr }; + Size m_size; +}; + class Font : public Retainable { public: static Font& default_font(); @@ -22,7 +54,7 @@ public: ~Font(); - const CharacterBitmap& glyph_bitmap(char ch) const { return *m_bitmaps[(byte)ch]; } + GlyphBitmap glyph_bitmap(char ch) const { return GlyphBitmap(&m_rows[(byte)ch * m_glyph_height], { m_glyph_width, m_glyph_height }); } byte glyph_width() const { return m_glyph_width; } byte glyph_height() const { return m_glyph_height; } @@ -33,17 +65,14 @@ public: static void initialize(); private: - Font(const String& name, const char* const* glyphs, byte glyph_width, byte glyph_height, byte first_glyph, byte last_glyph); + Font(const String& name, unsigned* rows, byte glyph_width, byte glyph_height); String m_name; - const char* const* m_glyphs { nullptr }; - mutable RetainPtr m_bitmaps[256]; + unsigned* m_rows { nullptr }; + RetainPtr m_error_bitmap; byte m_glyph_width { 0 }; byte m_glyph_height { 0 }; - - byte m_first_glyph { 0 }; - byte m_last_glyph { 0 }; }; -- cgit v1.2.3