From b878dc673674c9e4669f77f1f927e14d3a240f78 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Fri, 9 Jan 2015 20:11:30 +0100 Subject: [PATCH] Fixes #1987: first pixel not drawn by Lua lcd.drawLine(), bmpLoad() last column not loaded for some bitmap widths, gtests added (ported from master) --- radio/src/bmp.cpp | 21 ++------ radio/src/lcd_common.cpp | 14 +++--- radio/src/tests/4b_20x20.bmp | Bin 0 -> 358 bytes radio/src/tests/lcd.cpp | 46 ++++++++++++++++++ .../tests/lcd_bmpLoadAndDisplay_212x64.png | Bin 1342 -> 1352 bytes radio/src/tests/lcd_line_212x64.png | Bin 0 -> 454 bytes 6 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 radio/src/tests/4b_20x20.bmp create mode 100644 radio/src/tests/lcd_line_212x64.png 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 0000000000000000000000000000000000000000..b5e863ba16308003315a133fc609edc301c15805 GIT binary patch literal 358 zcmZ?rO=DyLgEAng0mLFu%*en37XJVwg}5PD04xF{8W 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 70fab5d38c6f3e15879900c384e79395892ad40e..f56f32900c72ff99d748795950cadc202a0651f0 100644 GIT binary patch delta 1205 zcmV;m1WNn93djnONPp`|L_t(|ob8;ick((I$MfEERiaZJEY(yOT}>@R&U5xhaFAnm z2fNu-x4P)o7EN`dugF<%Pl5gngm?RX)Rsb;9X>oyo+RC${eDjXFu^~j2LOIA|2ALV z?RK@6BuU=h-qg>_<+66Q8b{BsYNR1x-}JuMXiXqN5Df0z^MAa-?|o!i-D<&f@a%Rs}*BxHk;`f>i-zg3uvcBK0-*6Bw3aPLE!toZQHf0%^t*Yd^{e5 zAb5Iu5<-j_DEN7_%crEtvh4Ns^;|yk9sDj@IGIccA;;r!v)S0T?fX9GeB_8pha3m~ z3fc<}-}i+OrGG}p>-}lvgxhRUF zC~8+5GB2fcu~$$2Ix7l((+y zGRD+<8Do>lBuSDy&t2Eml7;UNDjqHLSm$#bXFi_~yMN7WHd85>5OO-5EXyK97tP&=s7{`$5>#OV`M!xL9y>LcYVGnh?VCyxD9_>iQckDSEX9MJbr3X_jS#5H%yr^ISziLVrk66jDl6DR-1lajsxB1YVmFLa$rX zBA;bhVHj3pUiE0u#iTZp>2%6D4}u^`lAU^sU-TI9QF zwpEk7vgTDSVHieHR7zG9#rZDCfPImUUksRcPg<5*n#~*kQN6#vm!VXhJoxzdIGs-A zDt~mI=ZC`~&-2n$RgpAzTU%b~9+I(#aZg(0s~sJ!(L8f+g;Kg&t&$|!?RIIJs<|Cw zj4@_emStItv7#u15U%Umwk@SR50)3HPUf1=JYPJF4F&H*OWNITx6PSX`8W8}qLjY8 zyrgOR_4SqKxiXIs!Wg5J+P3XDPMKtd5PxcSu1n9|i-}vW3xaF>Y4%1%nyP<65S&-L zWBgO71J9OaQA!zOs`9-yq&SWnPGr@L>9rs?xCBA496%@eNX5UZd{yVh`zNJLl4Se? zAG*#H^y(J!4WR4ZuFAi)#_F7JVNS~ zx%gdzf*R>}s%5*~hGAH193S%@mWv^fd@BeGN7DN|pQ=V{jI4PdoQA^rr~b+JLECx0 zd&WN_fp+=L{crtKX_4>w`MG;vza$L6LS2lCe6k!W5q* Tiphx400000NkvXXu0mjf;A>>I delta 1194 zcmV;b1XcUU3cd=ENPpo;L_t(|ob8;ick(*MfZxmC`pdiB zuF{eu$?NN@{(8AwR<54M(aWnNQWLOm`rPlp1k!^B`8>}%9Dfc%2*+`B%X+;&zoFi? z)oR5#pUq}t4D~;Z=mkcnK|Uf%k|fKrAP9Wlw{5#}wcdj`j*rJ<5Cl(8Pg2Su0|k#q zvwT{bEX!VAUM}UMui$sp!pUSpM91TCv)S0T?fbqEV&I4gbKIlQTyXflFQqIsYTxyK zzxO$-05K^p|xjYuo`h{*FiAw(R<75Unfx324Q&h^i7&L@*ek|cSa zyRJLREPQ`Z@r*);bw0;&=JR>K$INCkJp~id>2$Izi+_lsC`!|`Uxzh}6`U^nLD(CY zwvkVBwcu!pl+v=SIF9o?*Wpu#!z{~e+a9+TuBm~H^aHNaO}>FJ#$4Au9*;?q=(2-z zu9S+RNC@%M6fA$R67b;SSQyw|lTvz~H=E5EW4fhOFbIN91$7&S7pJi8Ms$mO>-BoO z-H!5LDSxGu@;nL(Ax4RU+LelMBTk^0i^rmad?T7y^79q^uADF1VPS9D%6AL%N-7F6 z#u#H-K`Ete+vSRkQtEU%DW#^VJx)zT3+3O8bzEJ&b$OAYbL^XodRBy%EOPYPCv|WVhR;X{vKO&N=7YvMkH8IOj!C zNGV;{wQXA|br~$La-Pi9pLxD|7#j-Shd=dyXr)wT<_&_NQgB@6Qe8>Y^z-vG&vR`X z5pm8LW43KOj&ok>>fJf2Eqbmlh}7IubAM<1w-$WuL9=}H|IF`FJ{rS6ec;)$EXEk; zTvxu|4JnS}niE+SV>&I!^;Qt_^`Mn}bmrf=eCN&$_fIL6B+2j(e2jITpi{SyuLo`S zcDLK@W&U@b^9{`Zh=?(!*ZGEYG788A??Z=!1#SErI2s{Dr`6+|a`n9g1xKXYsehL3 zb{mFarEz%7`>|XNf%K&yEF4JZ^L(81%SP?rqrMn5yKs;CE8mCF&hy@5FaQh3Vo>C(ya4szJ|3`eAowp;BLM&UaoZ0N)gPGa)CqVzn&m6g zKK)_a3Z0Gw_v4qOlE09K?KJ>y2LW=E(F9=~ARjOWf-s}`$T^vIy=DfXY*muZ5ggLEv-2i)H5@TJv;E0;F0NGx zl9Mw}{I%$l_NnlRXV^QX-|*CNiKoeDKL1_2_1eGJ7M6cQc23J*yOiF3`4R4RFv^E0mE(FwnIKZSNaZ@wR7cT7V*+0G_&&Sdp<|7S6? qC;xe4