diff --git a/src/imageJPEG.cpp b/src/imageJPEG.cpp index e514791..3040507 100644 --- a/src/imageJPEG.cpp +++ b/src/imageJPEG.cpp @@ -1,29 +1,21 @@ #include #include -//#include -#include // JPEG decoder library +#include #include "imageJPEG.h" #include "display.h" -//#define DEBUG = 1 - File tmpFileBuffer; -bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap); +void renderMcuBlock(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap); -static constexpr int MAX_WIDTH = 640; -static constexpr uint8_t BLOCK_SIZE = 16; +static constexpr int MAX_WIDTH = 640; // TODO get info from display +static constexpr uint8_t BLOCK_SIZE = 16; // max MCU block size static uint32_t blockDelta[BLOCK_SIZE * MAX_WIDTH + 1]; -//static int16_t curRowDeltaJ[MAX_WIDTH + 1]; - -unsigned int pixelCount = 0; - #define minimum(a, b) (((a) < (b)) ? (a) : (b)) void setupImageJPEG() { Serial.println("setupJPEG"); - } void jpegOpenFramebuffer() @@ -39,7 +31,6 @@ void jpegOpenFramebuffer() } memset(blockDelta, 0, sizeof(blockDelta)); - pixelCount = 0; } void jpegWriteFramebuffer(int offset, uint8_t bitmap[], int c) @@ -51,9 +42,6 @@ void jpegWriteFramebuffer(int offset, uint8_t bitmap[], int c) } } -//==================================================================================== -// Print information about the image -//==================================================================================== void jpegInfo() { Serial.println(F("===============")); @@ -78,12 +66,8 @@ void jpegInfo() Serial.println(F("===============")); } -//==================================================================================== -// Decode and paint onto the TFT screen -//==================================================================================== void renderJPEG(int xpos, int ypos) { - // retrieve infomration about the image uint16_t *pImg; uint16_t mcu_w = JpegDec.MCUWidth; @@ -130,24 +114,10 @@ void renderJPEG(int xpos, int ypos) else win_h = min_h; - // calculate how many pixels must be drawn - //uint32_t mcu_pixels = win_w * win_h; - // draw image block if it will fit on the screen if ((mcu_x + win_w) <= display.width() && (mcu_y + win_h) <= display.height()) { - // TODO - //display.drawRGBBitmap(mcu_x, mcu_y, pImg, win_w, win_h); - tft_output(mcu_x, mcu_y, win_w, win_h, pImg); - - /* - // open a window onto the screen to paint the pixels into - //TFTscreen.setAddrWindow(mcu_x, mcu_y, mcu_x + win_w - 1, mcu_y + win_h - 1); - TFTscreen.setAddrWindow(mcu_x, mcu_y, mcu_x + win_w - 1, mcu_y + win_h - 1); - // push all the image block pixels to the screen - while (mcu_pixels--) - TFTscreen.pushColor(*pImg++); // Send to TFT 16 bits at a time - */ + renderMcuBlock(mcu_x, mcu_y, win_w, win_h, pImg); } // stop drawing blocks if the bottom of the screen has been reached @@ -196,19 +166,18 @@ void jpegFlushFramebuffer() } } -void on_drawPixel(uint32_t x, uint32_t y, uint32_t color) +void renderMcuBlockPixel(uint32_t x, uint32_t y, uint32_t color) { // collect all mcu blocks for current row uint32_t blockPageY = y - ((y / JpegDec.MCUHeight) * JpegDec.MCUHeight); blockDelta[(blockPageY * MAX_WIDTH) + x] = color; - // full mcu row complete + // full mcu row is complete now if (x == JpegDec.width -1 && (y +1) % JpegDec.MCUHeight == 0) { // MCU block sizes: 8x8, 16x8 or 16x16 uint32_t originOffsetY = ((y / JpegDec.MCUHeight) * JpegDec.MCUHeight); - //Serial.printf("render block: y: %d - %d \n", originOffsetY, originOffsetY + JpegDec.MCUHeight); for (uint16_t _y = 0; _y < JpegDec.MCUHeight; _y++) { @@ -218,7 +187,6 @@ void on_drawPixel(uint32_t x, uint32_t y, uint32_t color) uint32_t originY = originOffsetY + _y; uint32_t originColor = blockDelta[(_y * MAX_WIDTH) + _x]; - // beste farbe uint8_t r = ((((originColor >> 11) & 0x1F) * 527) + 23) >> 6; uint8_t g = ((((originColor >> 5) & 0x3F) * 259) + 33) >> 6; uint8_t b = (((originColor & 0x1F) * 527) + 23) >> 6; @@ -231,91 +199,15 @@ void on_drawPixel(uint32_t x, uint32_t y, uint32_t color) // clean buffer memset(blockDelta, 0, sizeof(blockDelta)); } - - - pixelCount++; - // TODO bessere lösung finden ! - // MCU größen: 8x8, 16x8 or 16x16 - if (false && pixelCount == 10240) // 10240 / 640 = JpegDec.MCUWidth * JpegDec.MCUSPerRow - { - // new block - uint32_t originOffsetY = ((y / 16) * 16); - //Serial.println("new block"); - - for (uint16_t _y = 0; _y <= BLOCK_SIZE; _y++) - { - for (uint16_t _x = 0; _x < MAX_WIDTH; _x++) - { - uint32_t originX = _x; - uint32_t originY = originOffsetY + _y + (blockPageY * 16); - uint8_t originColor = blockDelta[(_y * MAX_WIDTH) + _x]; - - uint8_t blue = originColor & 0x001F; // 5 bits blue - uint8_t green = originColor & 0x07E0; // 6 bits green - uint8_t red = originColor & 0xF800; // 5 bits red - - if (false && originX <= 70) - { - //uint8_t r = ((((originColor >> 11) & 0x1F) * 527) + 23) >> 6; - //uint8_t g = ((((originColor >> 5) & 0x3F) * 259) + 33) >> 6; - //uint8_t b = (((originColor & 0x1F) * 527) + 23) >> 6; - uint8_t r = red; - uint8_t g = green; - uint8_t b = blue; - - Serial.print("Pixel @ y: "); - Serial.print(y); - Serial.print(" x: "); - Serial.print(x); - - Serial.print(" Color, R:"); - Serial.print(r); - Serial.print(", G:"); - Serial.print(g); - Serial.print(", B:"); - Serial.println(b); - } - - uint8_t rgba[4] = {red, green, blue, 0}; - ImageProcessPixel(originX, originY, rgba); - } - } - - // clean buffer - //memset(blockDelta, 0, sizeof(blockDelta)); - - pixelCount = 0; - } } -// This next function will be called during decoding of the jpeg file to -// render each block to the TFT. If you use a different TFT library -// you will need to adapt this function to suit. -bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap) +void renderMcuBlock(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap) { - //Serial.printf("tft_output, x: %d, y: %d, w: %d, h: %d\n", x, y, w, h); - - if (false && y == 0) - { - //tft_output: x = 0 y = 0 w = 16 h = 16 - //tft_output: x = 16 y = 0 w = 16 h = 16 - //tft_output: x = 384 y = 0 w = 6 h = 16 - //tft_output: x = 0 y = 16 w = 16 h = 16 - Serial.print("tft_output: x = "); - Serial.print(x); - Serial.print(" y = "); - Serial.print(y); - Serial.print(" w = "); - Serial.print(w); - Serial.print(" h = "); - Serial.println(h); - } - // Stop further decoding as image is running off bottom of screen if (y >= display.height()) { Serial.println("y is out of display range!"); - return 0; + return; } int16_t _y = y; @@ -323,63 +215,7 @@ bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap) { for (int16_t i = 0; i < w; i++) { - // debug - /* - if (false && _y == 10 && x + i <= 130) - { - uint32_t originColor = bitmap[j * w + i]; - -/* -geht - uint8_t b = (originColor & 0x001F); // 5 bits blue - uint8_t g = (originColor & 0x07E0) >> 5; // 6 bits green - uint8_t r = (originColor & 0xF800) >> 11; // 5 bits red - - Serial.print("Pixel @ y: "); - Serial.print(_y); - Serial.print(" x: "); - Serial.print(x + i); - - Serial.print(" Color, R:"); - Serial.print(r * 255 / 31); - Serial.print(", G:"); - Serial.print(g * 255 / 63); - Serial.print(", B:"); - Serial.print(b * 255 / 31); -* - //Serial.print(", color:"); - //Serial.println(originColor); - - - // geht auch - uint8_t r = ((((originColor >> 11) & 0x1F) * 527) + 23) >> 6; - uint8_t g = ((((originColor >> 5) & 0x3F) * 259) + 33) >> 6; - uint8_t b = (((originColor & 0x1F) * 527) + 23) >> 6; - Serial.print("Pixel @ y: "); - Serial.print(_y); - Serial.print(" x: "); - Serial.print(x + i); - - Serial.print(" Color, R:"); - Serial.print(r); - Serial.print(", G:"); - Serial.print(g); - Serial.print(", B:"); - Serial.println(b); - -/* - unsigned _r = (originColor & 0xF800) >> 8; // rrrrr... ........ -> rrrrr000 - unsigned _g = (originColor & 0x07E0) >> 3; // .....ggg ggg..... -> gggggg00 - unsigned _b = (originColor & 0x1F) << 3; // ............bbbbb -> bbbbb000 - Serial.printf("r: %d, g: %d, b: %d\n", _r, _g, _b); - - } - */ - - on_drawPixel(x + i, _y, bitmap[j * w + i]); + renderMcuBlockPixel(x + i, _y, bitmap[j * w + i]); } } - - // Return 1 to decode next block - return 1; } \ No newline at end of file