#ifndef _library__customfont__hpp__included__ #define _library__customfont__hpp__included__ #include #include #include #include #include #include #include "framebuffer.hpp" struct font_glyph_data { font_glyph_data(); font_glyph_data(std::istream& s); unsigned width; unsigned height; unsigned stride; std::vector glyph; //Bitpacked, element breaks between rows. void render(framebuffer& fb, int32_t x, int32_t y, premultiplied_color fg, premultiplied_color bg, premultiplied_color hl) const; void render(framebuffer& fb, int32_t x, int32_t y, premultiplied_color fg, premultiplied_color bg, premultiplied_color hl) const; }; struct custom_font { public: custom_font(); custom_font(const std::string& file); void add(const std::u32string& key, const font_glyph_data& glyph) throw(std::bad_alloc); std::u32string best_ligature_match(const std::u32string& codepoints, size_t start) const throw(std::bad_alloc); const font_glyph_data& lookup_glyph(const std::u32string& key) const throw(); unsigned get_rowadvance() const throw() { return rowadvance; } private: std::map glyphs; unsigned rowadvance; }; #endif