Maixduino icon indicating copy to clipboard operation
Maixduino copied to clipboard

Fix color inversion inside a buffer

Open dimitre opened this issue 1 year ago • 1 comments

Maixduino use to handle flipped colors inside a image buffer. By removing a byte swap from lcd we are able now to handle colors correctly for objects and image buffer. it is now possible to make a gradient from black to white inside one image with the changes in this PR.

closes https://github.com/sipeed/Maixduino/issues/141 closes https://github.com/sipeed/Maixduino/issues/138

dimitre avatar Jun 17 '24 02:06 dimitre

We have here a minimal example to test the color fixes:

#include <Sipeed_ST7789.h>
#include <Sipeed_OV2640.h>

SPIClass spi_(SPI0);
Sipeed_ST7789 lcd(320, 240, spi_);
Sipeed_OV2640 camera(FRAMESIZE_QQVGA, PIXFORMAT_RGB565);
GFXcanvas16 canvas(160, 120);

uint16_t rgbto565(uint8_t r, uint8_t g, uint8_t b) {
	return ((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3);
}

uint16_t rgbto565(uint8_t v) {
	return rgbto565(v, v, v);
}

void setup() {
	lcd.begin(15000000, COLOR_RED);
	lcd.println("hello Sipeed Maix");
	camera.begin();
	camera.run(true);
}

void loop() {
	// This should be Green and it is another color
	canvas.fillScreen(COLOR_GREEN);
	uint8_t * img = camera.snapshot();
	for (uint16_t x=0; x<camera.width(); x++) {
		for (uint16_t y=0; y<15; y++) {
			uint32_t index = x + y * camera.width();
			uint8_t gray = x * 255 / camera.width();
			// this should be a smooth gradient from black to white. 
			camera.getRGB565()[index] = rgbto565(gray);
			canvas.getBuffer()[index] = rgbto565(gray);
		}
	}
	lcd.drawImage(0, 30, camera.width(), camera.height(), camera.getRGB565());
	lcd.drawImage(camera.width(), 30, camera.width(), camera.height(), (uint16_t*)canvas.getBuffer());
}

dimitre avatar Jun 18 '24 19:06 dimitre