From 316f59c5fe4d57f68ef5faf96b36132b0cd93ebf Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 3 Jun 2025 16:53:35 +0100 Subject: [PATCH] Much improved icons with a white border for better visibility --- apps/openstmap/app.js | 24 ++++++++++++------------ apps/openstmap/icon_direction.png | Bin 0 -> 4327 bytes apps/openstmap/icon_place.png | Bin 0 -> 4470 bytes 3 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 apps/openstmap/icon_direction.png create mode 100644 apps/openstmap/icon_place.png diff --git a/apps/openstmap/app.js b/apps/openstmap/app.js index ae7906d1a..e8ff44a78 100644 --- a/apps/openstmap/app.js +++ b/apps/openstmap/app.js @@ -10,14 +10,14 @@ var startDrag = undefined; //< to detect a short tap when zooming var hasRecorder = require("Storage").read("recorder")!=undefined; // do we have the recorder library? var hasWaypoints = require("Storage").read("waypoints")!=undefined; // do we have the recorder library? var labelFont = g.getFonts().includes("17")?"17":"6x8:2"; -var imgLoc, ovLoc, ovSize = 34; /*Math.ceil(Math.sqrt(imgLoc[0]*imgLoc[0]+imgLoc[1]*imgLoc[1]))*/ +var imgLoc, ovLoc, ovSize = 30; /*Math.ceil(Math.sqrt(imgLoc[0]*imgLoc[0]+imgLoc[1]*imgLoc[1]))*/ var locOnscreen = undefined; // is the GPS location currently onscreen? if (Bangle.setLCDOverlay) { - // Icon for current location+direction: https://icons8.com/icon/11932/gps 24x24, 1 Bit + transparency + inverted - imgLoc = require("heatshrink").decompress(atob("jEYwINLAQk8AQl+AQn/AQcB/+AAQUD//AAQUH//gAQUP//wAQUf//4j8AvA9IA==")); + // Icon for current location + direction (icon_gps.png, 2 bit bw, transparent) + imgLoc = atob("EBiCAVVQBVVVU8VVVVPFVVVDwVVVT/FVVU/xVVUP8FVVP/xVVT/8VVQ//BVU//8VVP//FVD//wVT///FU///xUP//8FP///xD/AP8D/BQ/w/BVD8PxVU/AAVVABVVVVVVVVVVQ=="); // overlay buffer for current location, a bit bigger then image so we can rotate - ovLoc = Graphics.createArrayBuffer(ovSize,ovSize,imgLoc[2] & 0x7f,{msb:true}); + ovLoc = Graphics.createArrayBuffer(ovSize,ovSize,2,{msb:true}); } if (settings.lat !== undefined && settings.lon !== undefined && settings.scale !== undefined) { @@ -78,12 +78,12 @@ function drawPOI() { } if (!waypoints) return; g; - var img = atob("DRXCAP//APgfAAAAAFVAAVVVAVVVUFUBVFUAFVVABVVQAVRVAVQVVVUBVVUAVVVABVVAAVVQABVQAAVUAABUAACVgACJiACISIAIiIAAiIAA"); + var img = atob("ERnCAQD4/////x8AVWqqVVWoAKlVoAAClaAAAClgAqACaAJWAKgCVWAKAJVYAoAlVgCoAlYApgAqACVgAAApWAAACVWAAApVYAACVVYAApVVgACVVVgApVVWACVVVeAtVVXcDdVV3s7dVd3i3dVd3t3VVd3d1UA="); // icon_place.png optimal 2 bit + transparent g.setFont(labelFont).setFontAlign(-1,0); waypoints.forEach((wp, idx) => { if (wp.lat === undefined || wp.lon === undefined) return; var p = m.latLonToXY(wp.lat, wp.lon); - g.setColor("#fff").drawImage(img, p.x-6, p.y-18); + g.setColor("#fff").drawImage(img, p.x-8, p.y-22); g.setColor(0).drawString(wp.name, p.x+8, p.y); }); } @@ -118,19 +118,19 @@ function drawLocation() { } var p = m.latLonToXY(fix.lat, fix.lon); - ovLoc.clear(); - locOnscreen = isInside(R, p, ovLoc.getWidth(), ovLoc.getHeight()); + ovLoc.setBgColor(1).clear().setBgColor(0); + locOnscreen = isInside(R, p, ovSize, ovSize); if (locOnscreen) { // if we're onscreen, draw the course const angle = settings.dirSrc === 1 ? fix.course : Bangle.getCompass().heading; if (isNaN(angle)) { ovLoc.fillCircle(ovSize/2,ovSize/2,8); } else { - ovLoc.drawImage(imgLoc, ovLoc.getWidth()/2, ovLoc.getHeight()/2, {rotate: angle*Math.PI/180}); + ovLoc.drawImage(imgLoc, ovSize/2, ovSize/2, {rotate: angle*Math.PI/180}); } } else { // if off-screen, draw a blue circle on the edge var mx = R.w/2, my = R.h/2; var dy = p.y - (R.y+my), dx = p.x - mx; - ovLoc.fillCircle(ovSize/2,ovSize/2,16); + ovLoc.fillCircle(ovSize/2,ovSize/2,15); if (Math.abs(dx)>Math.abs(dy)) { dy = mx * dy / Math.abs(dx); dx = mx * Math.sign(dx); @@ -143,8 +143,8 @@ function drawLocation() { p.y = R.y+my+dy; } Bangle.setLCDOverlay({width:ovSize, height:ovSize, - bpp:ovLoc.getBPP(), transparent:0, - palette:new Uint16Array([0, g.toColor("#00F")]), + bpp:ovLoc.getBPP(), transparent:1, + palette:new Uint16Array([g.toColor("#FFF"), 0, 0, g.toColor("#00F")]), buffer:ovLoc.buffer }, p.x-ovSize/2, p.y-ovSize/2); diff --git a/apps/openstmap/icon_direction.png b/apps/openstmap/icon_direction.png new file mode 100644 index 0000000000000000000000000000000000000000..b58a6840f95661dd0ecc630ed2152ef284942146 GIT binary patch literal 4327 zcmeHKeNYtV89xhxq9`h!s37a9LoDvy?(N-iyS?Kh93Pi>aKTH#sHJ=-vA4$^ zHZhJ&+L|$m_z8-|Sj3J^h_S`!C{^kg7A7Kvq?1HzVp?PCppsTILSoCUig$eaoX~@I`!;H`|%S8E>y@8 zYJ@YzSA~DKuQLCoskdy!uWF0j%3Tp3U0KcZ;hKv(@(n7G-xkH>h_m?`*IU+@oSefE^gZ(lTE4SGBd5_ z%*^3xU=8&z)fjWnr^jC`Ue}`7Jxd;2(QZ9(_fS@R`TSR{OM9Z;rfSzeo@!aNBX&Vf zTg%Oxm+if67uOa>7G}f@$|@Gr$8Ko6@MOg+a(qerqg&ToFJJ%3xxc@q?!9Z49d#_M zvlX=eqwtlR$&X{w+@U;Mp(O9#uA8%Le_hh+F*6P;_nfZX9lcwh7yrEN zwf?Wkz4PB+SKnK9pyl3`;kqLjE#V{%-i3AF(~pWz3h`|5(;o+upUQ`+VBJ zzRKdSe13Fu4KqdiyY2C5UnLIqeXuGo|CIU7*DzdDm7>`Ry zvmQH823=k_buyVDE$F40av&gfP{O&5ihHNeDiDq}Dhjn0%;L=irCjbt9<14zXJa;& zGbF1>ON}xFDG1;K0*wS+PPdN=8Wj>Q1)oK+N`XiwLb*{)Z!6k4FZDz`ufQMYfI z2ob_C0UyJ2UV-zt5fPKNd;Ee?p@4d1I6s%yVi|#V`-WJ6e5iu7SA{DvmCL0X>){i! zDj~>FLf`4(v%xj0DgZu@pJzZ;C2$MN#zL^nh`-m*JEd}1Mg^R}1xz@?y%wlbbj%niv)d=oZU%@@5M0SY9GoE; z2SyX9#;$Ro8ceT8=@g7caRR6{1g*ujDVi}5`8)@wl6H>GN`zt|lny8Cgof3jY690l zJV2m&hR~sygHaQNgCI!Ykf2zG%J%Rs8n%;j(Ir6Tb(csAk#H)*YBnm=N^DeOb<% zv^b{_K$62+s7xNvf`_+xJWiuRObHP^N7NR$oLE|*O|$?YD5lm@n2y2-8?K`?T8bc( zF`UB2*n3#cQT2V+;^ILJp_b=zJ{Z4B5`|XO8c-2>3%xoyX(=Iyv?wT=36ctNk0zoE&Oo-n}x+dwG5Cao3o}8{px+cWHgp4Pr z>;Fbq)aY>vxZ%H`06Z);MjZPEJZMGOpUpAJo`~Ortw(l3$#ie-TAxfdW1e_Tk?pIG zgThF`Y{`ne6A?BWP3n`+O@N}EW>bbu-_f!QmsevmGY{{|YklHRj*#z5I@Q!zcdn+h z@UzI8y-fk?T6%BBmd0laQoeZW+J*d<)!yuP?1L+|C_mYjB29MYcIO`|XW$FV p%I5!dw&uWxUtWs4-xp6u&U-g|_M69Q^)Nk|IV;c9{PfSa{0}8nA{+n! literal 0 HcmV?d00001 diff --git a/apps/openstmap/icon_place.png b/apps/openstmap/icon_place.png new file mode 100644 index 0000000000000000000000000000000000000000..73e5dedbdd98df8c6e41f40f0d29b857351ab667 GIT binary patch literal 4470 zcmeHKeNYo;8V_js@(T-Mv79au&Z2IzoA2FA1eyfMNiaZKP}`xK-3_edi|j%IXIm+U z=e267o)wgiS1VZUontLju~lT0Dz$SWRq0saY^}9cT9nQKSHRx8;d|Pd4l~#P$joMU zpXc}d-skzf&->21e>J5g&k0!+A`l4X7*cc@;65K*kwF3AzkOBnZgA@=F=ulbga>lD zomR$1LtL?ohG;Ki6$rf7x24;+H$y>#-EqA^LE*Pmy|-fjROT5}K4m+;*LEz%UkX9B zw}yuPm~+r|`@rf$Ut4FUXWa=n*j7=0FZKF=1VrhQjUO-e3y3```8#_*(A$q4P2Q>g zA@|L9GRuzND82Sl&c4A#k2E|Kh5NO`D=--<4R(@5yhwc7m-hVH>*B0op7hczW@w!+b@GE1qT9ZMm9jzNwTmAfNnv}B% zQO!B)>xH}KMuZn!Ful>WUmumf;AK{_KHsKgE_upo^pWZgreG-|>et|Ne*MYL`K9*cw@7&bV+ptNiAQA43x! zJG*7|Cs*$1&^ebL6wX_c(``{-9JsNMG{sfUz8`!pxc2dg2LTU0sjXo_F(g zur-Ug#4nSNTog4Hh_J3ZRr8nbty;D{bXJY%^$#j{&Do_&i+akut!D_^z2IN#tFLZ& zqrST(=dtB^D=t2B5ZfFc@$Ss|{?wK9#03$Sx(x>^FSNeUb~gUoe!aWptHYaKBmLxW zS4744FB$y)+RC&w4Td*kS_dqjFS(WAT9_xd4Gett{`zGJHzQB9;Sbk^RSw0Rx_o(m za)S5q6DPjU>sjn-n6XuTcSkgqv8lE(duHdQZ}#?_X@!xaU-w??Jb!maMa_{m<(Z~v zBz=EZ;j5lLPhW3$Rnd#_yXEeBQO>E4Kzn)_(1zK@RGf6$MFi!v&?2wh1^QDUP{(^+ z1es5BkcG}=92#Nw2aQ6Ap)|rQxe+nCv~(VmQsSmFOVZ3_Nj`~D!uVAoYA+55>@-I} zUc1e~;$Dr=$BTn!-YgbEJ_whu5oQ}rkk;v@A(==fLSVg@DUt|Rg+OXIWyLdeNh1{C zO(V?XI2SG!dpsVIM=El1JFU<8(kg zCt-0GavGr!_@UAK>@K5mjNZYHr~vd3dkL2q6(M4~T|6;@<@7~>WF(-H#X?+px;FeCLpvbX!SE1YHD~BS*w2ig{C<{hKCk>fwFq+09cnNYDyUP~^#GZuY z80)xLlXBxdzH%le0>a05C!t4c_kjV*XvB3+vXD>DpwkHX@o~yYG8FE6q?IIS0ILtSXBP z#VAa!lKQA95>Ilv?F5)k#!lqYVwWS==imj$6HNw#q&%2b#_u9RVzT!LZBanRGWn+2W7bE1eys_=REX~97;Kv;tBQ$XOegIaK{ znsj|8^Lm-2#(MZ91Tbji5y21I3hKp3S5Ta2(|)2abyDCNio*q zUqkbY2T~7Dc?!dV@r!+?;T4rh7Yx4*zuFkzQi34gqQD7qxCE9cqA6dVfNR)A<`Iru z8tfh;?K)~_exVgemDDP;NTe_-wJKnlR3V2|QbGZf{Pf9W3YwMf6#ltj;*o;I{GKsdv0D5yP1HWXgiQv-4coxx z1@=Pm*k(AQ8OZmy{Ef`TZ#e`6O%F09eW&G`mTO81ObI;QUDI++Nr5SWr@QO_CRfP# z=M?P#ryvjbSV}c5-T*$d0xYYOb>QwV_^G{lQ#E)BcBQOk1p?7h{_^wI#1{c$AZIY@ z1MddRn1=>mIsW9Uz!b^pvpKEP&Y#K!zQZC-K^}(7gZRT@R_WY@0Q9LrmuOa9tod8| z+_TVZ?RQ=N12=}&oS2o`nM}a30Vk6V|9MNXDlQ==+JGeP=%{}7MtPDw!Pa~e-$1Fa`3_MD83`&5vy(r;6sp=kTdF}9Y!)Q0s3d2##fb$xhgXK&Zm z5`Rfh-nFoGO?O=l>VqAP8`B