From 9f4997caea31cb48834b13e433c290cb5f00a76a Mon Sep 17 00:00:00 2001 From: philmoz Date: Mon, 4 Sep 2023 14:10:50 +1000 Subject: [PATCH] chore(bw): Reduce FLASH used by 212x64 startup/shutdown animations (#3989) * Reduce FLASH storage of startup/shutdown animation for 212x64 LCD B&W radios. * Simplify bitmaps. * Support drawing animation bitmaps with transparency. --- radio/src/bitmaps/212x64/lock.png | Bin 1573 -> 2647 bytes radio/src/bitmaps/212x64/power.png | Bin 0 -> 2725 bytes radio/src/bitmaps/212x64/shutdown.png | Bin 3320 -> 3653 bytes radio/src/gui/212x64/lcd.cpp | 43 ++++++++++++++++------ radio/src/gui/212x64/lcd.h | 2 +- radio/src/gui/212x64/startup_shutdown.cpp | 36 +++++++++++++++--- 6 files changed, 63 insertions(+), 18 deletions(-) create mode 100755 radio/src/bitmaps/212x64/power.png diff --git a/radio/src/bitmaps/212x64/lock.png b/radio/src/bitmaps/212x64/lock.png index a3b103e94ee6c0789a345a4a2e00fb4929e61925..7d46606e3742edda25e7df5f08560b5fc3575d48 100644 GIT binary patch literal 2647 zcmbVO2~-nj9v{~OgHQyNvQTUYSh;d1BpC_eND!1DLKMV`49NthkW5Sl6OagPQ7aa# zi*12IP%MWEJg8V6cw5i1%c_;PDj;qJ2?&CKAmFhR1lrx#y_)wX^UXKE@Av=z{@0s* z;bChm%^l1E0I&=R7DnKAH`BHF5BUH5A}WaA2&&-C8UR>gYr5tEg+=xNuwWFCL}St7 zP*930D3A<|hbcOR3P%Hgk3gq_q)9MFjE55tC7(2S`aFq<$oQlvwwNYX1;U9)aGDy9 zObe4p(~_h-8A;$v^wEJhfda-LqE3;l)POoZX_^ zL8kE}G!DpQfedd?Ivu3Z-a^Hw43VeKL78M4m&~L~@D#HcAd~G$r~LxO>qZ7)(0>KX zq@WyCDwhRHD(*hj)QfMGQ2$lr^t)g6?JOK02BziQAi^K!Mj5Qc=a(8E zR3J^82>=TTAwqvi^zP#5Z8DcF_JY+xRY{VKk`Iqwby&VUsybRK+SmiV+v(REgA4-c!PD-NDDG23$-lB%}nm^M=Fd-dGBygcTc z+bcQ)!&*u@$KOn~_|%$t=j+_aBE+*CDl9+t1O$jzuX4ZIUq^R#U+fMIpUC9b28Q_N zX&f7kp@+(iKz55z>=RWkTO?q7|XG^zk(TaAo%+>?cbplW?3{XG5R zJaHt}hnNc%4iv|%J$PZb(W1b7?1SFm;mmzEvCH#UHyjK!+sWZqhE069V*Z|T^V}kw zYHDnB?c~GOk1@CIhT*4oHtDym%n$Q&4Z1K~U~w|5A>o`?&$g};gC{PRz4YmPU6C`` z-!YoqCJOlD)r>{=0nNHsksb3|6kUngJ65|g&TMJ8aVjw{{mTX`2PIW=h-%e z1@S{GcNr?&o1T}6+!YG}Kgpkd>O;yRo*nbJphdU~AW8nz*V?V1n5}+Rt62F4L(saV*IA)!IT!$V)c~2zW8IUJX|;Y| z@cfsmHVhp(?qR!^rNwg3))bUfd>qu=(C^N6aV zKJu8v?%j8-Pd7I==LAW!4z&pv#fDOB_Ate^e(Xa#*3m|GKYrDf=W4jI&+VG6sAuQi zg80O2rCwouaM2Sz($E#$-tfb~WK3GlR8K5owT-;Ye5zajVzuG36HX~8YIVSqD-kaQ zF5k`1^9$c==O=tnyKD2)(yS=g^#KIgA;zc2lVw#c+_jG1%b%vTp6*R8y>y76xmOwN zTH?y5{@jzQbr?(^96F#A1lcYjoN=45BUE_3etJaF&{zL{OdsNLhaxold8^$3I3|$iL9I9 z*W82L~l!teBwr>vDFp+97<~IMZ>hseX&(rEH>sDD?_k>Q-Z_5VDIcfEcE5aUJ z2=B?g99!IECNhpSc(+XI4actkEn=NJhSF-&DV+}~9mLI|}}KRCjh&?W2N{zP$8ws64+tD0i`5U_S98z@n_oExXjQ2`Max#s+*R fm%1$0PPLB;O2EuWdY&iC^ywEO3KP}@#C`G)s6iI$ delta 1570 zcmV+-2HpAB6r~IyiBL{Q4GJ0x0000DNk~Le0000y0000y2nGNE06P5Ha*-hye*gz` zNliru-v2$8zbt9s)`j?)VQKz#Z@b=v7)N- zFs`V$;_5@KT2XnZRh5TWarL2A#HgrPYsIQ7)>?7JiW-%NSaHP_S6p$88f&b$#)^u{ zLmr~%KBP0vWM-0?WRiC69L_@~e`n5|@BIJy&;Nbr%yqB32)?0Wfp4ssfK9+AU=y$j z*aU0>zPp0W;v@KVJox+WPqH?xaN$`rAx&U?Ctmh3fy- zb@g%d;s`mHonk-!4L@QpSY*^V4FOy{FCzPr9bpy>*%oYwI;JM>lRBm(eHPD)_XBYH zWm>dGU^9T4mrcX0(Y$P;f52uy>_7c7eYb$qC%0hZ&*O#x9jx)+;)pbK0*W3)k>{bO*M}8Dt{+?|@N)oBN#*5`eVY}(H;H@0xB*I7UwSOt_}oC= zM_zH@YSsS0j&kpFs+P7b*v1ZIV*wVTabPo``JL?BEV6xP8ws|*fBGK#Wc>(h+PCJL z4dB9AL7Zi+0g5`N)PY%Vs>=V{Pqrm}wXfQucNNYG(+4c9JFQz!?tM-bjDN$Aj$Rxg zDoLU6Zde2|STk=jiWBI0=$S6y!iR#GR1A%(&*LckG>kHDGKv6PD=t+1yDEFHebq*L z&-N6(pz&Wr(pE@Le{z51rU!WY$#&1WNowT!R&!tPBk#!XgrA1xR(?HTgJ|J~uQE zEW9hVvTea8YvWpRAF9Vd;1%A;<7gVyn1RD7C*vqK$0YMIvw2{yjHCN z;Uz?=M>e?}e+Q?hr;=wlt`2xA79Mmr(obrZZqz^#1Oc^bP4?g6;i2r=PIyPPuTHmP zJYa{jH=7L002v@vt)o=tZS$}n-G@XX0jsO4l8IYiUk93|rQo)ABKXqhV=#h=`f1l-{d^~y(HGW$XEUd?U002@{ zN)}yX(U`1VBocwc_^m6uJ#Jv?48&qF*%l=RHkOf$%}@&qiATS{rll$+8_h3GRfeP| zRU9Yr7%R2Z#A~f`mZPMDsj;Z`RePiep_YLe;?e*hisNpNduTh{g+r}YgPk3DWM%3M zq^Q(ze{H)|0)imKprlmt`8)uC=0s*JU0S4v-#axEcF`iASmb-`n^^IfDLw2L0EG3U z#f7`qT@?ByqzkN|Z4HagQx^aRC7%AkV_&kXZXf*$r=F^$sveT61u6*iWo1KuHeMPSW@1 zxKy;Tbqv5(3|0TC$|mw&9+&n9GT)j{dZM5aaN(?g5JHH(U=fw1B>B2;&1dL=xZzhG zcxal2STrWN@-VCfLqTvj98fBjWY;88sg&VY9_FTXUpk-9Lq4C^b*W|EHV?sIP^@3Y zr54p|OO*<64Gwso2fo2Wr`wTSav_M>Tw9tmZ^WB`O~58#6R-)`1Z)B}0Z*y?51n$# UCC|V8wEzGB07*qoM6N<$f(zZ`_W%F@ diff --git a/radio/src/bitmaps/212x64/power.png b/radio/src/bitmaps/212x64/power.png new file mode 100755 index 0000000000000000000000000000000000000000..0d0568c29a07c6bc3b050273856473432a1bb95d GIT binary patch literal 2725 zcmbVO2~<;88h(mB`eN7$ z6@p<9NO%DVk}xy|0j3M7G)D@R;ea87WC{_a5Xlrgi2{L+5Y-Vg{a{grDxnDSbMu&1 zhwhkIu|}hWh{VXqNJ1oqpiqSnNel*q2$G3pG9E?X)lqT{ti{XKxETp2tgS4pRo3k5_(ipUVT zMvY=gvsk5Ap;4&Cihm<|_V}L^pwZ=WXLbChEi&1x3bn>P0(E0LAis%L`$s7eq93AG zgsTLIdjx7G&ghL2Vyh5Xqfq%P6w(>4d}mC?kf{V3#+C~UByyt@cE7rUxWO8PiA8xM z<4I&Z$nXbg5QPeno$N^@2n0VsxeB2~6g3N_;6XZ`Lh?6K>;zHh_9XBZD4I7ySOfo8 zuuuSr6e<~vx-5~wAqY_^55Zz)0|~JeQiTdtj9N#TvVzNnIC8ZHmJ1M$8xxCqO^`^0 z5Q!=hF`TF%9u!fjcq*07z{7k;5HFyBFjYXMi6{tT=DwRk5N_ml=DzU%yzirupydTi zf43ZC(HWBh@{*`gx}v6QVh6H!dL@-$rt$!S1;+elVg*KG5g~T^v*dS2;DgvmF@g&H z4|IQksTCqkB&{oR=14o;IaXH(F(9LWsL*!`x zQlX8iil#OLfcXI&H&=h&k$XHJuhrb;UxuCDVou_REne-)<+`uE(&JjSxkH$#DX4N8 zv);1LysYyfn{dg-%-qL1Xf!*2VWyec`xWt4&Z9{j9F|JTJ5+eYU*MEB0LIqurRh6f z=sa)!)cdOT+?#W>k*<5^5HptVs>}M9V`CAv%TMUq3waLKNhUzeWsl5cL|~`zl zu3NS$d1i6w*10;g$OD_qs(u@9a_~TKf$mcGkoHmU6=+?826{E59W3v8J??_>-B|db zyIxEMZtdMoPIE{P0(5W*6EiHhLI3_0j ztjMbCo#72{t(B>2&9S7V70*i)soC>f0pNVMISa$F2#!HKCf<&O?A!MTfa>Vzp1D2F z*VA($>6MZ$?rdsmGQ1f`X>Mp}7#UHgRVe9y!f{U9+=@MWPt-XtCp-K2w-+zk#XW3m z!%FHxi*!2OmC4D;a_=165_!okNxjs`KmB*c>~d)oRb~&(F)VlkqcrZT*i9jNG~7k+y&(76=aSZ`*nvK3i9}{SlqX zjERWwNK(<)xHaqb$u=C(3d^eYq02mn1;Ed$tfAH)7V@v;=Jwr9*}yA){wh2?oL632 zx__i=DKj@K>&Q#Z#?;$2923hbe&On*)XIuIr~Y16R%WB_)j-iq#M;CqAYf(kN9MZr zA+qfOlnsk(xw$9$RZx1wjZcC8rW>9 zfr3BYY%4PX@;)~Vw*F9B>5(~fr#&+hm*&A{n=JlL>SP#y9cDWRhr{&@^wkN;b-Gn1 zmW2+NzH(`l)0m>z*x-xo!}l)&Ew7_@S{x6mF1>p7!phwRPZe_c3jQbVh1aitZM)0i zt8MFX_199#$$jezOG*NQgS`zEBNKP;#@9C1oFPg+Jqn|3;LktGzp(i3SrMH?`nGW^ zTG>TGjKm!tjsQK~J1gD!DZh?&t5>tpgifrksoAi8{qU;0I~HBA*z!$Y9{yxi#{E!o z+Su6G@W(k@KWp^!D?FBbS6CW6km;FpB?x~nATUt!y?&nS&y(-=H6IMEvi8F(kgMh8 zlcT-$w{PF>=n#Tdm0NQTVLR~~cRzf;`r&+LQ*fVU7j1Cac`(kf%((%atfhR?elzy$ z`}eW#W)sa1&SZ#AYPV(f3}pBB%g480OuPxSr!0RoXN`QP@kf&5?(LS(+H>e1-$h`H literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/212x64/shutdown.png b/radio/src/bitmaps/212x64/shutdown.png index 8f3307020596d9d0825cca242c7fd61327722662..ebfc8ac73b0b3e503fdd44f0a660058a3bbc27b8 100755 GIT binary patch literal 3653 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 diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 19274805a..c75427d3c 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -1008,7 +1008,7 @@ void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, co } } -void lcdDrawRleBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, coord_t width) +void lcdDrawRleBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, coord_t width, bool overlay) { RleBitmap pic(img, offset); @@ -1024,19 +1024,40 @@ void lcdDrawRleBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, for (uint8_t row=0; row= DISPLAY_END) return; - uint8_t b = pic.getNext(); - if (y & 1) { - *p = (*p & 0x0f) + ((b & 0x0f) << 4); - if ((p+LCD_W) < DISPLAY_END) { - *(p+LCD_W) = (*(p+LCD_W) & 0xf0) + ((b & 0xf0) >> 4); + if (overlay) { + for (coord_t i=0; i= DISPLAY_END) return; + uint8_t b = pic.getNext(); + if (y & 1) { + if (b & 0x0f) + *p = (*p & 0x0f) + ((b & 0x0f) << 4); + if ((p+LCD_W) < DISPLAY_END && b & 0xf0) { + *(p+LCD_W) = (*(p+LCD_W) & 0xf0) + ((b & 0xf0) >> 4); + } } + else { + if (b & 0x0f) + *p = (*p & 0xf0) + (b & 0x0f); + if (b & 0xf0) + *p = (*p & 0x0f) + (b & 0xf0); + } + p++; } - else { - *p = b; + } else { + for (coord_t i=0; i= DISPLAY_END) return; + uint8_t b = pic.getNext(); + if (y & 1) { + *p = (*p & 0x0f) + ((b & 0x0f) << 4); + if ((p+LCD_W) < DISPLAY_END) { + *(p+LCD_W) = (*(p+LCD_W) & 0xf0) + ((b & 0xf0) >> 4); + } + } + else { + *p = b; + } + p++; } - p++; } pic.goToNextRow(); pic.skip(offset); diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index fd4a4254c..975295282 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -164,7 +164,7 @@ void drawTelemetryTopBar(); void lcdDraw1bitBitmap(coord_t x, coord_t y, const unsigned char * img, uint8_t idx, LcdFlags att=0); void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset=0, coord_t width=0); -void lcdDrawRleBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset=0, coord_t width=0); +void lcdDrawRleBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset=0, coord_t width=0, bool overlay=false); #define LCD_ICON(x, y, icon) lcdDrawRleBitmap(x, y, icons, icon) diff --git a/radio/src/gui/212x64/startup_shutdown.cpp b/radio/src/gui/212x64/startup_shutdown.cpp index c855fefcc..61944cd8a 100644 --- a/radio/src/gui/212x64/startup_shutdown.cpp +++ b/radio/src/gui/212x64/startup_shutdown.cpp @@ -22,8 +22,14 @@ #include "opentx.h" -#define ANIMATIONS_BITMAP_WIDTH 60 -#define ANIMATIONS_BITMAP_HEIGHT 60 +#define ANIMATIONS_BITMAP_WIDTH 30 +#define ANIMATIONS_BITMAP_HEIGHT 30 + +#define POWER_BITMAP_WIDTH 40 +#define POWER_BITMAP_HEIGHT 40 + +#define SLEEP_BITMAP_WIDTH 60 +#define SLEEP_BITMAP_HEIGHT 60 const unsigned char bmp_lock[] = { @@ -33,11 +39,28 @@ const unsigned char bmp_lock[] = { const unsigned char bmp_shutdown[] = { #include "shutdown.lbm" }; +const int8_t bmp_shutdown_xo[] = { + 0, 0, -ANIMATIONS_BITMAP_WIDTH, -ANIMATIONS_BITMAP_WIDTH +}; +const int8_t bmp_shutdown_yo[] = { + -ANIMATIONS_BITMAP_HEIGHT, 0, 0, -ANIMATIONS_BITMAP_HEIGHT +}; + +const unsigned char bmp_power[] = { +#include "power.lbm" +}; const unsigned char bmp_sleep[] = { #include "sleep.lbm" }; +static void drawAnimation(uint8_t idx) +{ + lcdDrawRleBitmap((LCD_W - POWER_BITMAP_WIDTH) / 2, (LCD_H - POWER_BITMAP_HEIGHT) / 2, bmp_power); + for (uint8_t i = 0; i <=idx; i += 1) + lcdDrawRleBitmap((LCD_W / 2) + bmp_shutdown_xo[i], (LCD_H / 2) + bmp_shutdown_yo[i], bmp_shutdown, i * ANIMATIONS_BITMAP_WIDTH, ANIMATIONS_BITMAP_WIDTH, true); +} + void drawStartupAnimation(uint32_t duration, uint32_t totalDuration) { if (totalDuration == 0) @@ -49,9 +72,9 @@ void drawStartupAnimation(uint32_t duration, uint32_t totalDuration) lcdClear(); if (index == 0) - lcdDrawRleBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_lock, 0, ANIMATIONS_BITMAP_WIDTH); + lcdDrawRleBitmap((LCD_W - POWER_BITMAP_WIDTH) / 2, (LCD_H - POWER_BITMAP_HEIGHT) / 2, bmp_lock); else - lcdDrawRleBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_shutdown, (index - 1) * ANIMATIONS_BITMAP_WIDTH, ANIMATIONS_BITMAP_WIDTH); + drawAnimation(index - 1); lcdRefresh(); } @@ -66,7 +89,8 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char lcdRefreshWait(); lcdClear(); - lcdDrawRleBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_shutdown, (3 - index) * ANIMATIONS_BITMAP_WIDTH, ANIMATIONS_BITMAP_WIDTH); + drawAnimation(3 - index); + if (message) { lcdDrawText((LCD_W - getTextWidth(message)) / 2, LCD_H - 2*FH, message); } @@ -78,7 +102,7 @@ void drawSleepBitmap() { lcdRefreshWait(); lcdClear(); - lcdDrawRleBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_sleep, 0); + lcdDrawRleBitmap((LCD_W - SLEEP_BITMAP_WIDTH) / 2, (LCD_H - SLEEP_BITMAP_HEIGHT) / 2, bmp_sleep); lcdRefresh(); lcdRefreshWait(); }