/******************************************* * Most Awesome Renderer Ever *******************************************/ #include "mare.h" namespace Render { Mare::Mare(dim_t size) : _screenSize(size), _screenBufferBackground(nullptr), _screenBufferForeground(nullptr) { int rv; _bufferDim = (_screenSize.x >> 3) * _screenSize.y; _screenBufferBackground = (uint8_t*)malloc(sizeof(uint8_t)* _bufferDim); _screenBufferForeground = (uint8_t*)malloc(sizeof(uint8_t)* _bufferDim); clearBuffer(_screenBufferForeground, _bufferDim, Color::White); clearBuffer(_screenBufferBackground, _bufferDim, Color::White); // init display DEV_Delay_ms(500); if((rv=DEV_Module_Init())!=0){ printf("Init Failed, %d\n",rv); return; } EPD_2IN9_V2_Init(); EPD_2IN9_V2_Clear(); printf("Mare render engine created\n"); } Mare::~Mare(){ for (auto &d :_drawables) { d.reset(); } for (auto &p : _pages){ p.reset(); } free(_screenBufferBackground); free(_screenBufferForeground); } void Mare::render() { clearBuffer(_screenBufferBackground, _bufferDim, Color::White); for (auto d: _drawables) { if (d != nullptr) d->render(); } EPD_2IN9_V2_Display_Partial(_screenBufferBackground); } void Mare::setPixel(uint8_t* img, uint16_t x, uint16_t y, bool value){ if (x >= _screenSize.y) return; if (y >= _screenSize.x) return; img += (sizeof(uint8_t)*y*(_screenSize.x>>3) + sizeof(uint8_t)*(x>>3)); if (value) *img &= ~(0x80 >> (x%8)); else *img |= (0x80 >> (x%8)); } void Mare::clearBuffer(uint8_t* buffer, uint16_t len, Color col){ assert(buffer != nullptr); std::memset(buffer, col == Color::White ? 0xff : 0x00, len); } }