diff --git a/radio/src/bmp.cpp b/radio/src/bmp.cpp index ffbe8efc8..94433ccad 100644 --- a/radio/src/bmp.cpp +++ b/radio/src/bmp.cpp @@ -186,22 +186,11 @@ const pm_char * bmpLoad(uint8_t *bmp, const char *filename, const unsigned int w f_close(&bmpFile); return SDCARD_ERROR(result); } - for (uint32_t j=0; j> 4) & 0x0F] << 4; - *dst |= val ^ 0xF0; - if ((j+1)*2 >= w) break; - val = palette[buf[j] & 0x0F] << 4; - *(dst+1) |= val ^ 0xF0; - } - else { - uint8_t val = palette[(buf[j] >> 4) & 0x0F]; - *dst |= val ^ 0x0F; - if ((j+1)*2 >= w) break; - val = palette[buf[j] & 0x0F]; - *(dst+1) |= val ^ 0x0F; - } + uint8_t * dst = dest + (i/2)*w; + for (uint32_t j=0; j> ((j & 1) ? 0 : 4)) & 0x0F; + uint8_t val = palette[index] << ((i & 1) ? 4 : 0); + *dst++ |= val ^ ((i & 1) ? 0xF0 : 0x0F); } } break; diff --git a/radio/src/lcd_common.cpp b/radio/src/lcd_common.cpp index 9d538fb7a..944e550ed 100644 --- a/radio/src/lcd_common.cpp +++ b/radio/src/lcd_common.cpp @@ -537,28 +537,30 @@ void lcd_line(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, LcdFl if (dxabs >= dyabs) { /* the line is more horizontal than vertical */ - for (int i=0; i=dxabs) { y -= dxabs; py += sdy; } - px += sdx; - if ((1<<(px%8)) & pat) + if ((1<<(px%8)) & pat) { lcd_plot(px, py, att); + } + px += sdx; } } else { /* the line is more vertical than horizontal */ - for (int i=0; i= dyabs) { x -= dyabs; px += sdx; } - py += sdy; - if ((1<<(py%8)) & pat) + if ((1<<(py%8)) & pat) { lcd_plot(px, py, att); + } + py += sdy; } } } diff --git a/radio/src/tests/4b_20x20.bmp b/radio/src/tests/4b_20x20.bmp new file mode 100644 index 000000000..b5e863ba1 Binary files /dev/null and b/radio/src/tests/4b_20x20.bmp differ diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 9a8e67d74..937ee86b3 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -380,6 +380,12 @@ TEST(Lcd, lcd_bmpLoadAndDisplay) bitmap.leakCheck(); lcd_bmp(70, 2, bitmap.buffer()); } + { + TestBuffer<1000> bitmap(BITMAP_BUFFER_SIZE(20, 20)); + EXPECT_EQ(bmpLoad(bitmap.buffer(), "./tests/4b_20x20.bmp", 20, 20), (char *)0); + bitmap.leakCheck(); + lcd_bmp(120, 2, bitmap.buffer()); + } EXPECT_TRUE(checkScreenshot("lcd_bmpLoadAndDisplay")); // Test various bad BMP files, they should not display @@ -395,3 +401,43 @@ TEST(Lcd, lcd_bmpLoadAndDisplay) } } #endif + +#if defined(PCBTARANIS) +TEST(Lcd, lcd_line) +{ + int start, length, xOffset; + uint8_t pattern; + + lcd_clear(); + + start = 5; + pattern = SOLID; + length = 40; + xOffset = 0; + lcd_line(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); + lcd_line(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); + + start = 10; + pattern = DOTTED; + length = 40; + xOffset = 0; + lcd_line(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); + lcd_line(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); + + start = 55; + pattern = SOLID; + length = -40; + xOffset = 80; + lcd_line(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); + lcd_line(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); + + start = 50; + pattern = DOTTED; + length = -40; + xOffset = 80; + lcd_line(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); + lcd_line(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); + + EXPECT_TRUE(checkScreenshot("lcd_line")); +} +#endif diff --git a/radio/src/tests/lcd_bmpLoadAndDisplay_212x64.png b/radio/src/tests/lcd_bmpLoadAndDisplay_212x64.png index 70fab5d38..f56f32900 100644 Binary files a/radio/src/tests/lcd_bmpLoadAndDisplay_212x64.png and b/radio/src/tests/lcd_bmpLoadAndDisplay_212x64.png differ diff --git a/radio/src/tests/lcd_line_212x64.png b/radio/src/tests/lcd_line_212x64.png new file mode 100644 index 000000000..b1411f6aa Binary files /dev/null and b/radio/src/tests/lcd_line_212x64.png differ