#pragma once #include #include /* USAGE: // when use 8bit color. Raw8 * img8 = newImage("path to sd card image."); // when use 16bit color. Raw16 * img16 = newImage("path to sd card image."); // do some drawing. // img8->draw(); // remember release it img8->release(); img16->release(); */ extern TFT_eSPI tft; template struct RawImage{ type * ptr(){ return (type *)(this + 1); } type get(int16_t x, int16_t y){ return this->ptr()[y * width() + x]; } void draw(size_t x = 0, size_t y = 0){ tft.pushImage(x, y, width(), height(), ptr()); } void release(){ delete [] this; } int16_t width(){ return _width; } int16_t height(){ return _height; } private: int16_t _width; int16_t _height; }; typedef RawImage Raw8; typedef RawImage Raw16; template RawImage * newImage(const char * path){ typedef RawImage raw; File f = SD.open(path, FILE_READ); if (!f){ return nullptr; } int32_t size = f.size(); raw * mem = (raw *)new uint8_t[size]; if (mem == nullptr){ return nullptr; } f.read(mem, size); f.close(); return mem; } template void drawImage(const char * path, size_t x = 0, size_t y = 0){ auto img = newImage(path); img->draw(x, y); img->release(); }