picture buttons part 2

This commit is contained in:
gemu2015 2021-01-04 16:34:44 +01:00
parent 448daed0d1
commit 5d8b10141a
5 changed files with 83 additions and 45 deletions

View File

@ -29,9 +29,27 @@ uint8_t red, grn, blu;
uint16_t b , g, r;
for (uint32_t cnt=0; cnt<len; cnt++) {
red = *in++;
grn = *in++;
blu = *in++;
grn = *in++;
red = *in++;
b = (blu >> 3) & 0x1f;
g = ((grn >> 2) & 0x3f) << 5;
r = ((red >> 3) & 0x1f) << 11;
*out++ = (r | g | b);
}
}
void rgb888_to_565i(uint8_t *in, uint16_t *out, uint32_t len) {
uint8_t red, grn, blu;
uint16_t b , g, r;
for (uint32_t cnt=0; cnt<len; cnt++) {
blu = 255-*in++;
grn = 255-*in++;
red = 255-*in++;
b = (blu >> 3) & 0x1f;
g = ((grn >> 2) & 0x3f) << 5;
r = ((red >> 3) & 0x1f) << 11;

View File

@ -503,7 +503,7 @@ void DisplayText(void)
if (ep) {
*ep=0;
ep++;
Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos);
Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos, false);
cp=ep;
}
}
@ -1423,7 +1423,7 @@ void CmndDisplayDimmer(void)
void CmndDisplayBlinkrate(void)
{
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) {
if (!renderer)
XdspCall(FUNC_DISPLAY_BLINKRATE);
}
@ -1540,20 +1540,39 @@ void CmndDisplayRows(void)
/*********************************************************************************************\
* optional drivers
\*********************************************************************************************/
#ifdef USE_TOUCH_BUTTONS
// very limited path size, so, add .jpg
void draw_picture(char *path, uint32_t xp, uint32_t yp, uint32_t xs, uint32_t ys, bool inverted) {
char ppath[16];
strcpy(ppath, path);
uint8_t plen = strlen(path) -1;
if (ppath[plen]=='1') {
// index mode
if (inverted) {
ppath[plen] = '2';
}
inverted = false;
}
strcat(ppath, ".jpg");
Draw_RGB_Bitmap(ppath, xp, yp, inverted);
}
#endif
#ifdef ESP32
#ifdef JPEG_PICTS
#include "img_converters.h"
#include "esp_jpg_decode.h"
bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale);
char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short *width, unsigned short *height);
void rgb888_to_565(uint8_t *in, uint16_t *out, uint32_t len);
#endif // JPEG_PICTS
#endif // ESP32
#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT)
#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) && defined(USE_DISPLAY)
extern FS *fsp;
#define XBUFF_LEN 128
void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp, bool inverted ) {
if (!renderer) return;
File fp;
char *ending = strrchr(file,'.');
@ -1602,34 +1621,41 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
// jpeg files on ESP32 with more memory
#ifdef ESP32
#ifdef JPEG_PICTS
if (psramFound()) {
fp=fsp->open(file,FILE_READ);
if (!fp) return;
uint32_t size = fp.size();
uint8_t *mem = (uint8_t *)heap_caps_malloc(size+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
if (mem) {
uint8_t res=fp.read(mem, size);
if (res) {
uint16_t xsize;
uint16_t ysize;
if (mem[0]==0xff && mem[1]==0xd8) {
get_jpeg_size(mem, size, &xsize, &ysize);
//Serial.printf(" x,y %d - %d\n",xsize, ysize );
if (xsize && ysize) {
uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
if (out_buf) {
fp=fsp->open(file,FILE_READ);
if (!fp) return;
uint32_t size = fp.size();
uint8_t *mem = (uint8_t *)special_malloc(size+4);
if (mem) {
uint8_t res=fp.read(mem, size);
if (res) {
uint16_t xsize;
uint16_t ysize;
if (mem[0]==0xff && mem[1]==0xd8) {
get_jpeg_size(mem, size, &xsize, &ysize);
//Serial.printf(" x,y,fs %d - %d - %d\n",xsize, ysize, size );
if (xsize && ysize) {
uint8_t *out_buf = (uint8_t *)special_malloc((xsize*ysize*3)+4);
if (out_buf) {
uint16_t *pixb = (uint16_t *)special_malloc((xsize*2)+4);
if (pixb) {
uint8_t *ob=out_buf;
jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE);
uint16_t pixels=xsize*ysize/XBUFF_LEN;
renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize);
for(int32_t j=0; j<pixels; j++) {
uint16_t rbuff[XBUFF_LEN*2];
rgb888_to_565(ob, rbuff, XBUFF_LEN);
ob+=XBUFF_LEN*3;
renderer->pushColors(rbuff,XBUFF_LEN,true);
OsWatchLoop();
if (jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE)) {
renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize);
for(int32_t j=0; j<ysize; j++) {
if (inverted==false) {
rgb888_to_565(ob, pixb, xsize);
} else {
rgb888_to_565i(ob, pixb, xsize);
}
ob+=xsize*3;
renderer->pushColors(pixb, xsize, true);
OsWatchLoop();
}
renderer->setAddrWindow(0,0,0,0);
}
renderer->setAddrWindow(0,0,0,0);
free(out_buf);
free(pixb);
} else {
free(out_buf);
}
}

View File

@ -83,6 +83,7 @@ void EpdInitDriver29(void) {
#ifdef SHOW_SPLASH
// Welcome text
delay(100);
renderer->setTextFont(1);
renderer->DrawStringAt(50, 50, "Waveshare E-Paper Display!", COLORED,0);
renderer->Updateframe();

View File

@ -112,14 +112,8 @@ void ST7789_InitDriver(void) {
#ifdef SHOW_SPLASH
// Welcome text
renderer->setTextColor(ST7789_WHITE,ST7789_BLACK);
int fontSize = 2;
renderer->setTextFont(2);
if (Settings.display_width<240) {
fontSize = 1;
}
renderer->setTextFont(fontSize);
int fontHeight = 12 * fontSize;
renderer->DrawStringAt(30, (Settings.display_height-fontHeight)/2, "ST7789 TFT!", ST7789_WHITE,0);
renderer->DrawStringAt(30, (Settings.display_height-12)/2, "ST7789 TFT!", ST7789_WHITE,0);
delay(1000);
#endif
@ -131,8 +125,8 @@ void ST7789_InitDriver(void) {
#define SDA_2 23
#define SCL_2 32
#ifdef USE_LANBON_L8
#undef SDA_2
#undef SCL_2
#undef SDA_2
#undef SCL_2
#define SDA_2 4
#define SCL_2 0
#endif // USE_LANBON_L8

View File

@ -94,10 +94,9 @@ void ILI9341_2_InitDriver()
#ifdef SHOW_SPLASH
// Welcome text
renderer->setTextFont(2);
renderer->setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK);
renderer->DrawStringAt(20, 140, "ILI9341 TFT!", ILI9341_2_RED,0);
renderer->setTextColor(ILI9341_2_WHITE, ILI9341_2_BLACK);
renderer->DrawStringAt(30, (Settings.display_height/2)-12, "ILI9341 TFT!", ILI9341_2_WHITE, 0);
delay(1000);
renderer->clearDisplay();
#endif
color_type = COLOR_COLOR;