#ifndef _customfont__hpp__included__ #define _customfont__hpp__included__ #include #include #include #include #include #include #include "framebuffer.hpp" class ligature_key { public: ligature_key(const std::vector& key) throw(std::bad_alloc); const std::vector& get() const throw() { return ikey; } size_t length() const throw() { return ikey.size(); } bool operator<(const ligature_key& key) const throw(); bool operator<=(const ligature_key& key) const throw() { return !(key < *this); } bool operator==(const ligature_key& key) const throw(); bool operator!=(const ligature_key& key) const throw() { return !(key == *this); } bool operator>=(const ligature_key& key) const throw() { return !(*this < key); } bool operator>(const ligature_key& key) const throw() { return key < *this; } private: std::vector ikey; }; 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 ligature_key& key, const font_glyph_data& glyph) throw(std::bad_alloc); ligature_key best_ligature_match(const std::vector& codepoints, size_t start) const throw(std::bad_alloc); const font_glyph_data& lookup_glyph(const ligature_key& key) const throw(); unsigned get_rowadvance() const throw() { return rowadvance; } private: std::map glyphs; unsigned rowadvance; }; #endif