From 17cd87e7580acfb4f2998c0b11bb8225c31ff29e Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Mon, 29 May 2017 12:06:48 +0800 Subject: [PATCH] Subpixel rendering! Scaling looks be-a-utiful now. --- components/tme-esp32/mipi_lcd.c | 73 +++++++++++++++++++++++++++++---- flashrom.sh | 4 +- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/components/tme-esp32/mipi_lcd.c b/components/tme-esp32/mipi_lcd.c index 1a2a6ab..1d64291 100644 --- a/components/tme-esp32/mipi_lcd.c +++ b/components/tme-esp32/mipi_lcd.c @@ -153,6 +153,68 @@ DispPacket initPackets[]={ {0,0,0,{0}} }; +//Returns 0-1024 +int findMacVal(uint8_t *data, int x, int y) { + int a,b,c,d; + int v=0; + int rx=x/32; + int ry=y/32; + + if (ry>=342) return 0; + + a=data[ry*(512/8)+rx/8]&(1<<(7-(rx&7))); + rx++; + b=data[ry*(512/8)+rx/8]&(1<<(7-(rx&7))); + rx--; ry++; + if (ry<342) { + c=data[ry*(512/8)+rx/8]&(1<<(7-(rx&7))); + rx++; + d=data[ry*(512/8)+rx/8]&(1<<(7-(rx&7))); + } else { + c=1; + d=1; + } + + if (!a) v+=(31-(x&31))*(31-(y&31)); + if (!b) v+=(x&31)*(31-(y&31)); + if (!c) v+=(31-(x&31))*(y&31); + if (!d) v+=(x&31)*(y&31); + + return v; +} + + +// Even pixels: a +// RRBB +// GG +// +// Odd pixels: b +// GG +// RRBB +// +// Even lines start with an even pixel, odd lines with an odd pixel. +// +// Due to the weird buildup, a horizontal subpixel actually is 1/3rd real pixel wide! + +int findPixelVal(uint8_t *data, int x, int y) { + int sx=(x*51); //32th is 512/320 -> scale 512 mac screen to 320 width + int sy=(y*51); + //sx and sy are now 27.5 fixed point values for the 'real' mac-like components + int r,g,b; + if (((x+y)&1)) { + //pixel a + r=findMacVal(data, sx, sy); + b=findMacVal(data, sx+(51/3)*2, sy); + g=findMacVal(data, sx+(51/3), sy+(51/2)); + } else { + //pixel b + r=findMacVal(data, sx, sy+10); + b=findMacVal(data, sx+(51/3)*2, sy+(51/1)); + g=findMacVal(data, sx+(51/3), sy); + } + return ((r>>5)<<0)|((g>>4)<<5)|((b>>5)<<11); +} + volatile static uint8_t *currFbPtr=NULL; SemaphoreHandle_t dispSem = NULL; @@ -184,17 +246,12 @@ void IRAM_ATTR displayTask(void *arg) { for (int j=0; j<320; j++) { uint8_t *p=&img[1]; for (int i=0; i<320; i++) { - if (myData[i/8]&(1<<(7-(i&7)))) { - *p++=0; - *p++=0; - } else { - *p++=0xFF; - *p++=0xFF; - } + int v=findPixelVal(myData, i, j); + *p++=(v&0xff); + *p++=(v>>8); } mipiDsiSendLong(0x39, img, sizeof(img)+4); img[0]=0x3c; - myData+=(512/8); } } } diff --git a/flashrom.sh b/flashrom.sh index 1722948..3c011a0 100755 --- a/flashrom.sh +++ b/flashrom.sh @@ -1,5 +1,5 @@ #!/bin/bash #python /home/jeroen/esp8266/esp32/esp-idf/bin/esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud 115200 write_flash -z -fs 32m 0x100000 doom1-cut.wad -#python /home/jeroen/esp8266/esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port "/dev/ttyUSB1" --baud $((921600/2)) --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x100000 rom.bin -python /home/jeroen/esp8266/esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud $((921600/2)) --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x100000 rom320240.bin +python /home/jeroen/esp8266/esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud $((921600/2)) --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x100000 rom.bin +#python /home/jeroen/esp8266/esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port "/dev/ttyUSB0" --baud $((921600/2)) --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x100000 rom320240.bin