#pragma once #include #include "./Geometry.h" #include class Display; class Surface { public: Surface(Display* dpy, const VirtualCoordinates& start, const VirtualCoordinates& end); Surface(Display* dpy, const VirtualCoordinates& start, const VirtualCoordinates& end, uint8_t rotation); Surface& operator=(const CRGB& color); Surface& operator+=(const CRGB& color); template Surface& operator|=(const T& val) { paintWith([&](CRGB& pixel) { pixel |= val; }); return *this; } using Shader = std::function; using BrushFunc = std::function; void paintWith(BrushFunc func); void paintShader(Shader shader); const PhysicalCoordinates start; const PhysicalCoordinates end; const VirtualCoordinates virtStart; const VirtualCoordinates virtEnd; private: Display* m_display; uint8_t m_rotation = 0; };