#pragma once #if !defined(BAD_APPLE_OS_PSF_HPP_INCLUDED) #define BAD_APPLE_OS_PSF_HPP_INCLUDED #include #include namespace psf { inline const uint32_t MAGIC = 0x864ab572; struct Header { uint32_t magic; /* magic bytes to identify PSF */ uint32_t version; /* zero */ uint32_t headersize; /* offset of bitmaps in file, 32 */ uint32_t flags; /* 0 if there's no unicode table */ uint32_t numglyph; /* number of glyphs */ uint32_t bytesperglyph; /* size of each glyph */ uint32_t height; /* height in pixels */ uint32_t width; /* width in pixels */ }; class Font { private: const Header* mMemory = nullptr; size_t mSize = 0; public: Font() noexcept = default; Font(const Font&) = default; private: Font(const Header* memory, size_t size) noexcept : mMemory(memory), mSize(size) {} public: Font& operator=(const Font&) noexcept = default; [[nodiscard]] uint32_t getGlyphWidth() const noexcept { return mMemory->width; } [[nodiscard]] uint32_t getGlyphHeight() const noexcept { return mMemory->height; } template void writeGlyph(char chr, const TColor& fgColor, const TColor& bgColor, TDrawFn draw) const noexcept; public: [[nodiscard]] static bool create(const void* data, size_t size, Font& outFont) noexcept; }; template void Font::writeGlyph(char chr, const TColor& fgColor, const TColor& bgColor, TDrawFn draw) const noexcept { if (chr > mMemory->numglyph) { chr = 0; } const uint8_t* glyphData = reinterpret_cast(mMemory) + mMemory->headersize + chr * mMemory->bytesperglyph; for (unsigned y = 0; y < mMemory->height; ++y) { for (unsigned x = 0; x < mMemory->width; ++x) { const unsigned idx = y * mMemory->width + x; const unsigned byte = idx / 8; const unsigned bit = idx % 8; if (glyphData[byte] & (0b10000000 >> bit)) { draw(x, y, fgColor); } else { draw(x, y, bgColor); } } } } } #endif // !defined(BAD_APPLE_OS_PSF_HPP_INCLUDED)