// class GxEPD : Base Class for Display Classes for e-Paper Displays from Dalian Good Display Co., Ltd.: www.good-display.com // // based on Demo Examples from Good Display, available here: http://www.good-display.com/download_list/downloadcategoryid=34&isMode=false.html // // Author : J-M Zingg // // Version : see library.properties // // License: GNU GENERAL PUBLIC LICENSE V3, see LICENSE // // Library: https://github.com/ZinggJM/GxEPD #include "GxEPD.h" #if defined(ESP8266) || defined(ESP32) #include #else #include #endif void GxEPD::drawBitmapBM(const uint8_t *bitmap, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color, int16_t mode) { uint16_t inverse_color = (color != GxEPD_WHITE) ? GxEPD_WHITE : GxEPD_BLACK; uint16_t fg_color = (mode & bm_invert) ? inverse_color : color; uint16_t bg_color = (mode & bm_invert) ? color : inverse_color; // taken from Adafruit_GFX.cpp, modified int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte uint8_t byte = 0; if (mode & bm_transparent) { for (uint16_t j = 0; j < h; j++) { for (uint16_t i = 0; i < w; i++ ) { if (i & 7) byte <<= 1; else { #if defined(__AVR) || defined(ESP8266) || defined(ESP32) byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]); #else byte = bitmap[j * byteWidth + i / 8]; #endif } // transparent mode if (bool(mode & bm_invert) != bool(byte & 0x80)) //if (!(byte & 0x80)) { uint16_t xd = x + i; uint16_t yd = y + j; if (mode & bm_flip_x) xd = x + w - i; if (mode & bm_flip_y) yd = y + h - j; drawPixel(xd, yd, color); } } } } else { for (uint16_t j = 0; j < h; j++) { for (uint16_t i = 0; i < w; i++ ) { if (i & 7) byte <<= 1; else { #if defined(__AVR) || defined(ESP8266) || defined(ESP32) byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]); #else byte = bitmap[j * byteWidth + i / 8]; #endif } // keep using overwrite mode uint16_t pixelcolor = (byte & 0x80) ? fg_color : bg_color; uint16_t xd = x + i; uint16_t yd = y + j; if (mode & bm_flip_x) xd = x + w - i; if (mode & bm_flip_y) yd = y + h - j; drawPixel(xd, yd, pixelcolor); } } } }