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; uint16_t b , g, r;
for (uint32_t cnt=0; cnt<len; cnt++) { for (uint32_t cnt=0; cnt<len; cnt++) {
red = *in++;
grn = *in++;
blu = *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; b = (blu >> 3) & 0x1f;
g = ((grn >> 2) & 0x3f) << 5; g = ((grn >> 2) & 0x3f) << 5;
r = ((red >> 3) & 0x1f) << 11; r = ((red >> 3) & 0x1f) << 11;

View File

@ -503,7 +503,7 @@ void DisplayText(void)
if (ep) { if (ep) {
*ep=0; *ep=0;
ep++; ep++;
Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos); Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos, false);
cp=ep; cp=ep;
} }
} }
@ -1540,20 +1540,39 @@ void CmndDisplayRows(void)
/*********************************************************************************************\ /*********************************************************************************************\
* optional drivers * 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 ESP32
#ifdef JPEG_PICTS #ifdef JPEG_PICTS
#include "img_converters.h" #include "img_converters.h"
#include "esp_jpg_decode.h" #include "esp_jpg_decode.h"
bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale); 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); 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 // JPEG_PICTS
#endif // ESP32 #endif // ESP32
#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) #if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) && defined(USE_DISPLAY)
extern FS *fsp; extern FS *fsp;
#define XBUFF_LEN 128 #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; if (!renderer) return;
File fp; File fp;
char *ending = strrchr(file,'.'); char *ending = strrchr(file,'.');
@ -1602,11 +1621,10 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
// jpeg files on ESP32 with more memory // jpeg files on ESP32 with more memory
#ifdef ESP32 #ifdef ESP32
#ifdef JPEG_PICTS #ifdef JPEG_PICTS
if (psramFound()) {
fp=fsp->open(file,FILE_READ); fp=fsp->open(file,FILE_READ);
if (!fp) return; if (!fp) return;
uint32_t size = fp.size(); uint32_t size = fp.size();
uint8_t *mem = (uint8_t *)heap_caps_malloc(size+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); uint8_t *mem = (uint8_t *)special_malloc(size+4);
if (mem) { if (mem) {
uint8_t res=fp.read(mem, size); uint8_t res=fp.read(mem, size);
if (res) { if (res) {
@ -1614,22 +1632,30 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
uint16_t ysize; uint16_t ysize;
if (mem[0]==0xff && mem[1]==0xd8) { if (mem[0]==0xff && mem[1]==0xd8) {
get_jpeg_size(mem, size, &xsize, &ysize); get_jpeg_size(mem, size, &xsize, &ysize);
//Serial.printf(" x,y %d - %d\n",xsize, ysize ); //Serial.printf(" x,y,fs %d - %d - %d\n",xsize, ysize, size );
if (xsize && ysize) { if (xsize && ysize) {
uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); uint8_t *out_buf = (uint8_t *)special_malloc((xsize*ysize*3)+4);
if (out_buf) { if (out_buf) {
uint16_t *pixb = (uint16_t *)special_malloc((xsize*2)+4);
if (pixb) {
uint8_t *ob=out_buf; uint8_t *ob=out_buf;
jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE); if (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); renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize);
for(int32_t j=0; j<pixels; j++) { for(int32_t j=0; j<ysize; j++) {
uint16_t rbuff[XBUFF_LEN*2]; if (inverted==false) {
rgb888_to_565(ob, rbuff, XBUFF_LEN); rgb888_to_565(ob, pixb, xsize);
ob+=XBUFF_LEN*3; } else {
renderer->pushColors(rbuff,XBUFF_LEN,true); rgb888_to_565i(ob, pixb, xsize);
}
ob+=xsize*3;
renderer->pushColors(pixb, xsize, true);
OsWatchLoop(); OsWatchLoop();
} }
renderer->setAddrWindow(0,0,0,0); renderer->setAddrWindow(0,0,0,0);
}
free(out_buf);
free(pixb);
} else {
free(out_buf); free(out_buf);
} }
} }

View File

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

View File

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

View File

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