From ee43d3fb971aef5295ea70a50dac9e94b74b0bdf Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Thu, 16 Feb 2017 00:23:42 +0100 Subject: [PATCH] Projectkk2glider/issue 4449 drawline (#4464) * Gtest pattern changed * Fixes #4449: lcdDrawLine_line() was wrong for slanted lines [128x64] * Fixes #4449: lcdDrawLine_line() was wrong for slanted lines [480x272] * lcdDrawLine() coordinates check moved to Lua API --- radio/src/gui/128x64/lcd.cpp | 12 ++--- radio/src/gui/212x64/lcd.cpp | 2 - radio/src/gui/480x272/lcd.cpp | 12 ++--- radio/src/lua/api_lcd.cpp | 3 ++ radio/src/tests/lcd.cpp | 66 ++++++++++++++----------- radio/src/tests/lcdDrawLine_128x64.png | Bin 0 -> 929 bytes radio/src/tests/lcdDrawLine_212x64.png | Bin 1061 -> 1044 bytes 7 files changed, 53 insertions(+), 42 deletions(-) create mode 100644 radio/src/tests/lcdDrawLine_128x64.png diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 168d70205..52af18f53 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -636,28 +636,28 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc if (dxabs >= dyabs) { /* the line is more horizontal than vertical */ for (int i=0; i<=dxabs; i++) { + if ((1<<(px%8)) & pat) { + lcdDrawPoint(px, py, att); + } y += dyabs; if (y>=dxabs) { y -= dxabs; py += sdy; } - if ((1<<(px%8)) & pat) { - lcdDrawPoint(px, py, att); - } px += sdx; } } else { /* the line is more vertical than horizontal */ for (int i=0; i<=dyabs; i++) { + if ((1<<(py%8)) & pat) { + lcdDrawPoint(px, py, att); + } x += dxabs; if (x >= dyabs) { x -= dyabs; px += sdx; } - if ((1<<(py%8)) & pat) { - lcdDrawPoint(px, py, att); - } py += sdy; } } diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 0b4d4c6a6..6aa5c2d2c 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -420,8 +420,6 @@ void lcdDrawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att) #if !defined(BOOT) void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, LcdFlags att) { - if (lcdIsPointOutside(x1, y1) || lcdIsPointOutside(x2, y2)) return; - int dx = x2-x1; /* the horizontal distance of the line */ int dy = y2-y1; /* the vertical distance of the line */ int dxabs = abs(dx); diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index c3c58d2d4..22c4a1a9b 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -192,28 +192,28 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc if (dxabs >= dyabs) { /* the line is more horizontal than vertical */ for (int i=0; i<=dxabs; i++) { + if ((1<<(px%8)) & pat) { + lcdDrawPoint(px, py, att); + } y += dyabs; if (y>=dxabs) { y -= dxabs; py += sdy; } - if ((1<<(px%8)) & pat) { - lcdDrawPoint(px, py, att); - } px += sdx; } } else { /* the line is more vertical than horizontal */ for (int i=0; i<=dyabs; i++) { + if ((1<<(py%8)) & pat) { + lcdDrawPoint(px, py, att); + } x += dxabs; if (x >= dyabs) { x -= dyabs; px += sdx; } - if ((1<<(py%8)) & pat) { - lcdDrawPoint(px, py, att); - } py += sdy; } } diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 58d2b882f..30cd56193 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -106,6 +106,9 @@ static int luaLcdDrawLine(lua_State *L) int pat = luaL_checkinteger(L, 5); int flags = luaL_checkinteger(L, 6); + if (x1 < 0 || x1 >= LCD_W || y1 < 0 || y1 >= LCD_H || x2 < 0 || x2 >= LCD_W || y2 < 0 || y2 >= LCD_H) + return 0; + if (pat == SOLID) { if (x1 == x2) { lcdDrawSolidVerticalLine(x1, y2 >= y1 ? y1 : y1+1, y2 >= y1 ? y2-y1+1 : y2-y1-1, flags); diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 96072561c..75bd3a88c 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -404,7 +404,24 @@ TEST(Lcd, lcdDrawBitmapLoadAndDisplay) } #endif -#if defined(PCBTARANIS) && LCD_W >= 212 +#if defined(PCBTARANIS) + +void drawDiamond(int x, int y, int size) +{ + int x1 = x - size; + int x2 = x; + int x3 = x + size; + + int y1 = y - size; + int y2 = y; + int y3 = y + size; + + lcdDrawLine( x1, y2, x2, y1, SOLID, FORCE); + lcdDrawLine( x2, y1, x3, y2, SOLID, FORCE); + lcdDrawLine( x3, y2, x2, y3, SOLID, FORCE); + lcdDrawLine( x2, y3, x1, y2, SOLID, FORCE); +} + TEST(Lcd, lcdDrawLine) { int start, length, xOffset; @@ -412,60 +429,53 @@ TEST(Lcd, lcdDrawLine) lcdClear(); - start = 5; + start = 2; pattern = SOLID; length = 40; xOffset = 0; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); - start = 10; + start = 4; pattern = DOTTED; length = 40; xOffset = 0; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); - start = 55; + start = 56; pattern = SOLID; length = -40; - xOffset = 80; + xOffset = 65; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); - start = 50; + start = 54; pattern = DOTTED; length = -40; - xOffset = 80; + xOffset = 65; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); // 45 deg lines - lcdDrawLine( 35, 40, 45, 40, SOLID, FORCE ); - lcdDrawLine( 40, 35, 40, 45, SOLID, FORCE ); + lcdDrawLine( 25, 30, 35, 30, SOLID, FORCE ); + lcdDrawLine( 30, 25, 30, 35, SOLID, FORCE ); - lcdDrawLine( 20, 40, 40, 20, SOLID, FORCE ); - lcdDrawLine( 40, 20, 60, 40, SOLID, FORCE ); - lcdDrawLine( 60, 40, 40, 60, SOLID, FORCE ); - lcdDrawLine( 40, 60, 20, 40, SOLID, FORCE ); - - lcdDrawLine( 31, 39, 39, 31, SOLID, FORCE ); - lcdDrawLine( 41, 31, 49, 39, SOLID, FORCE ); - lcdDrawLine( 49, 41, 41, 49, SOLID, FORCE ); - lcdDrawLine( 39, 49, 31, 41, SOLID, FORCE ); + drawDiamond(30, 30, 10); + drawDiamond(30, 30, 20); // slanted lines - lcdDrawLine( 150, 10, 190, 10, SOLID, FORCE ); - lcdDrawLine( 150, 10, 190, 20, SOLID, FORCE ); - lcdDrawLine( 150, 10, 190, 30, SOLID, FORCE ); - lcdDrawLine( 150, 10, 190, 40, SOLID, FORCE ); - lcdDrawLine( 150, 10, 190, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 10, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 20, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 30, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 40, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 50, SOLID, FORCE ); - lcdDrawLine( 150, 10, 190, 50, SOLID, FORCE ); - lcdDrawLine( 150, 10, 180, 50, SOLID, FORCE ); - lcdDrawLine( 150, 10, 170, 50, SOLID, FORCE ); - lcdDrawLine( 150, 10, 160, 50, SOLID, FORCE ); - lcdDrawLine( 150, 10, 150, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 100, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 90, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 80, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 70, 50, SOLID, FORCE ); + lcdDrawLine( 60, 10, 60, 50, SOLID, FORCE ); EXPECT_TRUE(checkScreenshot("lcdDrawLine")); } diff --git a/radio/src/tests/lcdDrawLine_128x64.png b/radio/src/tests/lcdDrawLine_128x64.png new file mode 100644 index 0000000000000000000000000000000000000000..6be31ec7fd4a2796beb5a6ce4b598dcfaca169f6 GIT binary patch literal 929 zcmV;S177@zP){OLX9hOq__ae?&WK4fxH(Xy^U zdehf&9NR)3ezF(vbiCo0=i?dIw*Zz-q3#9E?!PlhVa2LF+k~A_*r!I{&^K>pn>J$+2=qAW&sKq8s!lW zD(_dpK%jw!)4dZJjtVe%)8j0vuG?oSyeViPYjh7JLl{0)2Xv#Zu%P*by)trDK-Eg+ zg5Ex1vd9ny+TR6favpCESW^`TlQfhA%{ssj-gn{0>fzUlVYOgayC zihc}$pBTYs+O1T@lDQs7T!g`rdPl`43%&gY>tL-5TpQ_OkW9m&kh+l&q165PADtkczDpG9Nud3 z`oX4dC456bzVl!q419f;kG>l0j$A)k7J=v(uuvf(2HX&o7o=QUSTP_DYz%m_UH>uQ zZ#wm0_xe&mG9DBI?ukV}G8O^JSOg?v5s-{UKr(&-R}pXPby%dG00000NkvXXu0mjf Dx)6zq literal 0 HcmV?d00001 diff --git a/radio/src/tests/lcdDrawLine_212x64.png b/radio/src/tests/lcdDrawLine_212x64.png index 89b45d8d10706caab71a210bd46d0e5fd0fd370b..8f14d69729012bea719f1b7935cb3ee7f025a104 100644 GIT binary patch delta 1022 zcmV+mfpw5JkHC}f z$+z!24Ise?r`;$c;`Q0haG-{ z7*0t(gAe)O=7kNS>BKkU(&tOgo&G`UY;d-c@NSNvz$agkb^-Z!3YVJ5{bM5D8E~IZ ztRcX^6tTx~q+$$+O}ln=4o=mG*=j$q-bq0G52+ve^8~J>3@4vqCfU!wnpHLbRw>Bj6B$dsA@jt3n25*tTL{!NKG4BNKUpvVf z{&kN8sDB`nPo$rGK=V>7e)*?#QP~zsK_;I_XKmL!!Vq6cJ0Hyzw)WN`imI+P=R@O0 zC7XJIP6YMqJd9U*XKU|{Ir%*56nE%;X1e=p8l8s<7WDgk@Uvv_dHlLVcTxrp`+Op* z(Js(GxOuiiYWU|N3Ik6>JI@F4FUC9(!=81@`+fk=Ns~GVLwk~bf^pQ zkI5%uypmbz-*WTxs&)OFTz4^-eK7X_;n4WEc7!pybKAd}2xRh!OnpCJ*T34P$g}Od zlz;hF^D)>8KAYKZse-R?gb_B+vN8E80KSUkK*8~-)_S~uzEiFi-)ZA`uj;JZ#5Rye}2Ne1!n4!`~l z!Qb+9XobVObx6T^|CoFtF8AA2u5iTTp?9XTxVh|u@w(Y_cZK7IK(1L7Ve*N*zRQoV z=IcI<-tac}5it2gC|?8&Jdq!gFO7kgJd!Ky^TokFU%|V-%d=RRLo}~|$w!v)Lw!DS sHz*%j2IV8mpnPN*l#eWf@{wiy2RT@8>!oWm-2eap07*qoM6N<$f_JqE!2kdN delta 1040 zcmV+r1n>Kl2&D*+B!2^QLP=Bz2ngHZPv8Im010qNS#tmY3yA;#3yA?Y$;+((00YQL zL_t(|ob8=Sj>8}jMJuhor_Yv~_5umffEjDRuKyNMp-iv_0s zopv=l@}U*hA&c{7*hBIQU$SD;ZI;XD0-5g!_TwCdqa^udS@1Lwk@=2*G1aACLYbL@ zahLSy)#cJ4^M4%yOPovd!e>Ll^5~i(BJ&*qW1PzoQ%Y|B8VbhU)3d5B=K`7U2;|I* z&V?_73YKRjA)?th-{C`0%IrrY?Qqb43#)76aNv0P5w1bRj(kFyFO3Tz);L!!j9)et zOn2NrXM@a_HUaQ2AQ6XZ7r2c1vV!|)XTI#t8vX@%<9~cN@{+C1cF|W*HS<;bbnuUu z;(TY-oqy&E>SeyhXaf9WZ(-UZ(oGYbt&+YdN|~=aj^*4x(YiO<+(y_H6x7IkgCnS( z{gW6~xO1-RpNWFvnQvf62H8*z(KL8;8wHZPoaJI}lFPbl+IPq@aIbGO(-XE?g%jm&Vk@{h5m zBduq*!>bc~{>(RMUMwH}k?_BVW_3&#ipHNg^G%r-fPbX^AD_YA#$Xe?3}@z>GH-CG zv%B^kh-N+-v#l}VArybM%(sy9Qk?t8Tf4z<&42pGehGLo-==x-SZ@83&V00CWL(aE z2^caTi+KUJ{#n&)wyVo~33f9dqj~X&4*gTed^Dq4*FTo4u=VuX$emoeak+bS5$nE7blv(v}mD1RP^!aV0k^ct@@