#pragma once #include class LcdDisplay : public juce::Component, private juce::Timer { public: static constexpr int kCols = 80; static constexpr int kRows = 4; LcdDisplay(); void setLine (int row, const juce::String& s); void showCursor (bool show); void clear(); void paint (juce::Graphics&) override; private: void timerCallback() override; static constexpr int kRasterW = 12; static constexpr int kRasterH = 18; juce::String lines[kRows]; int cursorCol = 0; int cursorRow = 0; bool cursorVisible = false; struct GlyphCache { uint8_t rows[8] = {}; bool cached = false; }; GlyphCache glyphCache[256]; void rasterize (juce::uint32 c); uint8_t* getGlyph (juce::uint32 c); juce::Font getMonoFont() const; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LcdDisplay) };