ESP-Nodes/ESP32-IDF_ePaper/main/GxEPD.cpp
Alexandre B c4158aee6f libs
2024-02-18 23:16:44 -05:00

83 lines
2.4 KiB
C++

// 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 <pgmspace.h>
#else
#include <avr/pgmspace.h>
#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);
}
}
}
}