mirror of
https://github.com/alexandrebobkov/ESP-Nodes.git
synced 2024-10-05 20:47:50 -04:00
83 lines
2.4 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|
|
}
|