Fix RGB565 for certain resolutions
Some checks failed
CMake / Linux (push) Has been cancelled
MicroPython / pico_plus2_rp2350_psram (PIMORONI_PICO_PLUS2 PSRAM) (push) Has been cancelled

This commit is contained in:
Mike Bell 2024-10-13 20:34:04 +01:00
parent 58dba1f0bf
commit d67479563f

View file

@ -160,18 +160,35 @@ void __scratch_x("display") DVHSTX::gfx_dma_handler() {
if (line_bytes_per_pixel == 2) {
uint16_t* src_ptr = (uint16_t*)&frame_buffer_display[y * 2 * (timing_mode->h_active_pixels >> h_repeat_shift)];
for (int i = 0; i < timing_mode->h_active_pixels >> 1; i += 2) {
uint32_t val = (uint32_t)(*src_ptr++) * 0x10001;
*dst_ptr++ = val;
*dst_ptr++ = val;
if (h_repeat_shift == 2) {
for (int i = 0; i < timing_mode->h_active_pixels >> 1; i += 2) {
uint32_t val = (uint32_t)(*src_ptr++) * 0x10001;
*dst_ptr++ = val;
*dst_ptr++ = val;
}
}
else {
for (int i = 0; i < timing_mode->h_active_pixels >> 1; ++i) {
uint32_t val = (uint32_t)(*src_ptr++) * 0x10001;
*dst_ptr++ = val;
}
}
}
else if (line_bytes_per_pixel == 1) {
uint8_t* src_ptr = &frame_buffer_display[y * (timing_mode->h_active_pixels >> h_repeat_shift)];
for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) {
uint32_t val = (uint32_t)(*src_ptr++) * 0x01010101;
*dst_ptr++ = val;
}
if (h_repeat_shift == 2) {
for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) {
uint32_t val = (uint32_t)(*src_ptr++) * 0x01010101;
*dst_ptr++ = val;
}
}
else {
for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) {
uint32_t val = ((uint32_t)(*src_ptr++) * 0x0101);
val |= ((uint32_t)(*src_ptr++) * 0x01010000);
*dst_ptr++ = val;
}
}
}
else if (line_bytes_per_pixel == 4) {
uint8_t* src_ptr = &frame_buffer_display[y * (timing_mode->h_active_pixels >> h_repeat_shift)];