From ec8b5b34100d4ef16978f77b25f0b2979455bcbb Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Mon, 17 Aug 2026 00:02:27 +0100 Subject: [PATCH] feat(android): a shield instead of a padlock, and the launch screen matches The padlock was drawn in thin blue strokes on slate: at 36 px the outline muddied and the shackle vanished. A filled white shield with a punched keyhole keeps its silhouette at every size, and says protection more plainly. The keyhole is CUT OUT rather than painted, through an even-odd fill on a single path - painting it meant keeping two files agreeing on one colour, and any drift would have read as a smudge. The launch layer is the exception: it sits flat on the system background, where a cut-out would be a hole, so there the keyhole is painted and stays entirely inside the white shield. The launch background takes the top of the app gradient instead of slate, so the launch screen dissolves into the first screen rather than cutting against it. No gradient inside the vectors: the aapt this chain uses does not know inline gradients. Co-Authored-By: Claude Opus 5 --- .../android-res/drawable-hdpi/ic_launcher.png | Bin 1135 -> 1240 bytes .../android-res/drawable-ldpi/ic_launcher.png | Bin 655 -> 711 bytes .../android-res/drawable-mdpi/ic_launcher.png | Bin 877 -> 922 bytes .../drawable-xhdpi/ic_launcher.png | Bin 1469 -> 1596 bytes .../drawable-xxhdpi/ic_launcher.png | Bin 2172 -> 2331 bytes .../drawable-xxxhdpi/ic_launcher.png | Bin 2851 -> 3041 bytes .../drawable/ic_launcher_background.xml | 13 +++-- .../drawable/ic_launcher_foreground.xml | 35 ++++++------ .../drawable/ic_launcher_monochrome.xml | 19 +++--- .../android-res/drawable/splash_vector.xml | 27 +++++---- android-client/android-res/values/colors.xml | 4 +- android-client/make-icons.ps1 | 54 ++++++++++-------- 12 files changed, 78 insertions(+), 74 deletions(-) diff --git a/android-client/android-res/drawable-hdpi/ic_launcher.png b/android-client/android-res/drawable-hdpi/ic_launcher.png index 23543918d1baeb4a086c0f304d0faa45d3034299..edbd6c124b7663ab553dd5647ab68a70aae8475d 100644 GIT binary patch delta 1170 zcmV;D1a1582-pdbR)1|tL_t(|UhSMuXcIvc#&h)OO}i_!co02V=x(hDws??U6b}l5 zhcr6{iz3t_7^q-8SV2)ia#6t+g{ojt5iNSD2dM~Z4i!|21bS#eg{mO_xvYGfY;4|c zc6O4TO|!cn{ODn4CY!G_Z{AFpNu}zP+Qs^Sq8kIM&T^{}>wn$K@7dm)UPHe_pla(% zZ&vk8R@IDxsxz}id9Uc~vZ4=m((hNd)@@67s5-mt@?kBFq8l>}8)bD$#*yChnEJ6zI zC=hcLoh@548WJS>FriHMU{7gPP9G##U^f7X;X(Q!!6uVUsaj^(`5>W8E}6l+NetqU z7{p=q7{pHG&AX3Yn4iCXGao#CWgZ#5YHr*yX5 z^Jv|W2;ZRHhjQli$!9f9sip5fep+V2RNAIQ!ZE1#z^Hlg+Cy_;@eBRlbqVIeESOC{ zD`4aq)U)@bdHT{FbH2Dlzh9t&>FAO8C(w5Y067LBZZt!)uRl26r9tEvgcogw(3|MH zG)Q6)hkwK%4y(r?d^yZ?ND%S&-Nyx5gsaFJgjvWfYaYu_(W0J;q(Quy2laN2}WC z*nZf|PduhYJ=HP>&CJfxcjxNVg~_Tm21c&XB7a=9j6ov9!q)LKH>%p$lQ~O^aK#(0 zbs)zeEEPmWgLP;B2ra_Z^z*llcWDqg24OuVDr~UPc0`q*c;aZILF5>OsTmvYB63@c ziEh!-UKjv!3<4rE8TOcIebF|ssZZ+%fINdlh8eatXni0O?6D(2>j!{5gMi;Xom#=w zZ+{+y;f$b8>j!{bgYbi&A7M*_)&<#fw`fsUNeIq1at#9L`aB^RBi>N_EK-q_($5SK z`38Y{GHXA=Z*G2e0~#P4gD`~$Z4%;}TkaGv;TU8iGAnrr!%uS0u?g28fHfC#mU@KQ zYAk=x(WXSgHwa)##?&q%EJP*!{_aI{41cmg48aud)uS*hv9hOiL!!9`*&v=E=dssb zSbAVbKvME20u0JzT^=-zCiWILa;fsUclscqL@qgs;DL1%p>$z@^I-xrH|VUte4vgk z(}!^f$5U|vymVenW8<_y+`-KZl>>D+en<<%9Yr^WDh8E$Q4B8=sDYxfCCB;sq<eqEOKZ@fjg|cWSxqRU~jT|O|98VRLBXCI7Q-aA>?~nX1KD92wK)mSK0x< kMqA5(g{SXpxK`*NZENm3+6sXR01E&B07*qoM6N<$f`D2qm;e9( delta 1064 zcmV+@1lRl63GWDyR(}LZL_t(|UhSMuNEA^V$M+~vGZs3dB5sD}&aA0xvZ)mcMI;mm z(H{au@Q|5=37Qq5M3+u^>k@eA5Ofi`bP5ke76f(5OW`Fbx=5EgPW;~NZnMANb7o!l zIlJ@T4?YO{`@J{wzWm;M^JaW67Aw+pGdbvDkLjkhSf0SWxqtT=i^r>Q8%k<>>)R8W zY0qn>^+`8vry?<|b$P?lZeP)+n{5Ym!+uUKR^e!dy}DzeSehF4UtD>VfQ;I9 z_tW*xYR$A)aAgr@ZBMOThjrkZD^3NEGex2q_67_mSPx>lX}!XQWdRbyx4UJgMp95F zG{aiPx-f$gJ%8#0a^WNgu|6@$24!DZSMwUn9!{Xt7}oHAfz;ST$Qz5`5gZ4|j%He$ zY(|3zB@yO*nN>M;Di~ui%}iY3I27(WZ9b+OiD~RmWU&_24CadxC;%l;07{?$ zlt2L}fdVKafohshI*sXZr}f;D)7UrZ7;Qr&X7?!rfq&uyb58HQU(WFde+YdGo6h0k zC(izc6e+hmgeVYXOvm_ZA_|Y5nRTbW<1(p3JRu5{y77Ss;Rj?Hh>GhGOGpB>3_T(O zfMCt1?mG?LBdpuCkF1aw$T(b=SV9n}rsXsnTf7Yi!EhV^gEk(YnoiszapDL;AjlGL zgOgWZkbf92kWJor$SfQqjt~TDAAOl=>|gd5G786F(zD-k@#(n@;ul8<0`=bgnahU$ zh2O-_qkHOOUKU}$I6@G}+t6coz7s!>)b)3A3Y40BPy9S!oRU(Yu8FtA&qE0mK%@ma z(3H+CLIH0>VRp*??#I!apYzIPe}_e_*r#j30)N5H!#c{_xKaZTlH%5Bf(1%kcuE>1 zfDjO3+NGh41cD`qw`@cAD2dq$DFouZ6ziG! zLgIKRfdY_1phIUKX38bmU)9ApH1$uha&<>8szI7Z>-i;CE5RDHSUa?*pL-f<7G;k6?iS_~!%s@voG? zcQSY>hp$^2c0r)Z##)43KJ(O}aA6q)d&{vy;lcz`TM>L1V+RIs917TqP-~xM+o53V z4|YlqY){oYt6hN%YncQ{4xG&3-B34-1Ak;kGpvc6KrD+SJWOC~tRH0myviaEMq)Zo zoUBFhl$Rn{!@A^*o!i0Aupot`z@5zl&hKy!Qj&1mXQxhZPF&y_95f(PCb;n13qFR+WB&ju-m*?;D62&P0000O*^w^ zb!U6&_#TNTu-PBlxS2NX>|7$5dPG?OlcULz*=9=~7?dgMnen-cJ+GggvM(WO+w4rh zpnkq!Om6K-wHsLJG!U2Dx--LuWv8cTAVwFB>ZU~laXB2I@xn6yxLM}YZ&&$~zMLfTV2{tOxXBtjJeB9q@18uRRb!0xX~bPx}h6 zI#BP>YdW5m6rmm<5X$1Nm$AtOetvO9Q-mS|dSBY~i$bbN#k{1~e-lFOy$Zc?;LpLYolNQrSp=2vQfg)hg~rv z0L1Lk9CZyBjmHifkOX2ePR>T6Bh^9!ak+L8fkPS%Ms1v&YbV$HQMPox22`D;HGfhx zHto!j2L{4g5_dL|2F)~J#1T43x3^sE2W=R(Z*N;jnHmY#Bh_OzHqP*jKI^Yui2ehY W28>Hv=_ZW;0000?|`ov<$8LntLIs;Ep?RJ!2}Oou+rc``*@>buo?Ga70e=a_&H2+pjDWBdZk$61 z-Ig>h&+J8#37tZf{bN7P3@nrHGlK~Ce48D1i7WVvOxT0rM$_`lVsO+~O0d(h5DZ%`X& zTo`IwycdbfS|*UzvH8N|Yfq@$85f44)7QdKaZMl6#0cj#1QqJ90D7gu$met)d_p&=NpIUx`pI~Gan5_?Dk zK2D)C9vRZQmxT_;-mC>;2$m7_M*S3Nffxcnx7%O;hMdTmA;4}H?D+AqmsPfc1$*FP zgb`;;_GSPuRKfg(nD2bK-?@~0tVmgu3ml8+?Q z%s?1>i9McMRL(U?@r1Su*y*xLpDh}C3t=g=Oql|{M~r7ST$~;v`uz6wVv09#Rl+la S6>3=k0000yMLiklY+LZq;z4>*JSYe~ z#NEjuC`uKJur*X7}+?K*> zofWGF<8{O2q94>5Up5%Ok~0fyX?!iQ&gA3H!;(S!LEYqEurf5x05I!NOb1YfIorG8I9Wk(uO*#ORMY)ex+d5$@wVijQ_;W=n60xKTn;MC*#wufGo{^lUN00 zj)nt+8neQIA%A<9h7W4U44E~l;Ui$k4l7#Y4nhrCVRr@O$B&5pQy0X@&SL>vN=#qC z=4}VX;S-m|%#&Bbi@6u?M7et15k;R#!1M%Qrtdv^E`I&~;|p8{h=WLorQ@{8WCA7* zofEeoJQd%*|DZ9(0>nZz#BbPI3XC6voeMzVX#y!m-+vK<{{=(>fyJo{dpH_ z>gqx%0l>@o4`R4+2iiDxK+Mj~Qx_k4E}(YxA&nsb?z9R-Z7XU8QmuVa>P_SO#RyBi@T2}Nim`uR# z(rFrt3mjTr-&Q9vwpTiKOePZmhRrNe1_GPJ;U)uiD>`NyOfCRRk9_Y0NS*BymB5&7 zFu4E_1>Ne9k^!Q3SSJHxwaIh@fVjL}yE{wclz#&0)nU<6rYE3DezfM~wG6nW;zCEC zNk9m&$`V6jB0cb(0Kkmn`!n@PffY?>_Fjo0BecpII)Xt%Hi*gBa-)S+_^Fy2v%odO zh4sw_$22u6PiDXV*WfUV`K+yilRjRgy`6TMH+{has0A#G#91k#9TwUvcK#D#^0)LM zRZ57CJ=(!EZXZ^5rDByn+;2v9=_!n%;t0CpbfBJ-@p`QPNrVA=t!~<-Mv?c9%$oEy bvqSI~n3flE&r@y?00000NkvXXu0mjfLL-vP delta 804 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 delta 2109 zcma)6dpOe#8{TFPEr%t%&YLfX5g~*uekRS?GOx3wK8HE&mGqjh;gyg>-jRgH$XQ9{ zb(&6+IX5CqXjs%MHp+7NeBXC{|9{Uv&vReTb>Gi(-GAKoq<7$X9^@nTXRY1iE_`LX zhARK6Ec)%tjdw%tgy7x+R>QU zJ8k7=7}56jIQXj`Pnqw|eYUthkAr$FDi7Ourkx((@?@0!fw&VGS;e}`Iig$$<`?O* z+~+AI)zIHgkk#2}EL|aZPYo9_j}7JIOgVB8(m83tR29;WQtmSVhMi1H39=?8h7*BQn6<2V6@;8-`l+bF)Fk)#d?^Z{d zd750f&w$Az*I(Xoc-2ez!f%A6)m#Km@i-k0sanYx=IVQVGQ^l{e67Ngw|Azhd3S_y zG$bi>9V-~>dm>fHVEJ1J1qKx5X@H578k zOJC+z^ER9L#7GU zs&TPoi*Fo-47QF6}s$h9^1cqmW@LO3d_+9yz0_OJK#agf<1a@m;Tn z;_0*An>DXY1T)Lbz4#F{aIDu7uh{aL{?rR$uIxkJv1z=_{t@0v-QA>-D0TXYbmOHP zKbd>y5A5!zOHL%GS^Sr`@WZ6aP)Rj$Eg)zgCCS*#a>KrwtpBL}bJdy$8ogvVTO^Tw zVz227qKAWVuB8Ve1iiPw10njFTdi|07B3%Okqt0x}Rv zqEM8Ez3|N+-Hkr6d(L(HHvir$AQhP`RMvz&SO>u<;)+rywQ9uNV z1>sz%HARJf_)`$*q%o@10(?@JbcYBPTlgbn7k0JuV8Ts{!EbDgm^42*f?TnqBcT4Y z(d$NlySU@*k_9-f+%m>DZU&TLbdZj&g?|n3@F%~HvYF%@P+46I+RDW+f@H&1xR@H4 zg&;*0rv=MxgF%tHhP^Q?4{_fM=OrP(Sq!(5E>JNnmi)Wa>NhP9X(_hB&(H4{Ex+zQ zh}t+y5$A*dG$m6rTU^9iPa>^VLb@@cItY<83|pZrs|hBs5f1KKMN6HLbuy51%ND#u zAMTPRuecvOYwJdrRYZ&2KCG#5m=fjN>`y{xw)_yM8|m5pZIG_#+rWGhn00*zimc|Q zjI83iCNQ~ZaYsMAi^!EU!83nX={MdpT0a&vtqk9G7O%CJB~dp$E5lW_VBVK93dV?@ zY#Eqz_WN(TdXBH_2>pvrqP_Kht+BH-e0m<7O47EYYIu|o?mTid*uc#Iqm4NuQoh!H h+;qv3?r>)EHUcTZ4lARLW`PdM-qz)86Xs&dzW{dv)_ni~ diff --git a/android-client/android-res/drawable-xxxhdpi/ic_launcher.png b/android-client/android-res/drawable-xxxhdpi/ic_launcher.png index ec6e195bd1f6446ebe21cc326a7ee95676b03c0e..d2a3e785e32c33805510e2dc046a30bbc64ef062 100644 GIT binary patch delta 2986 zcmZuzc{tQ-8~%-9h_OWsQud`1rXr~s$(D+-s~AhiJ}8O$jD8d1oRLg)2u;S$h>$J2 z%D#=Y8Wp9Iu`^>E!#B>kzW=`Wzx%%5_kHg7damoepB$-g(j*5^DD0xidHcKAd9rn( zi<5lEL`Ba6y;l-@%fU&wA!3*i&numjF!b<&k@TxHHVK2F3c!?@Z^|I8-ru4z57jDZ z_By%Q)gxD2EG)COqz>3>?*E+)IY5oF|MCbQ{I#KJz5c|i_rmjtf#v~eRB>9bVe)3= z;<@Q{Hu?64F`f}{tEew7R&I1A8s0tl`dtM*cBu$Fy2>s=zu7F~ke@^~e#VDl9`y?o zOM0S1LL)Ht>v3MEVws4iqXn#B7e}W*lFVPw@t@l-NSz7uWHQSNOGSDZr5x+1UJYu* zyX?CBc*?@Io@3Hrc|xDM|McyLaWcO}Y}^pmICAB(LX*ai~N8f0FTc907`@8|p+d|`kJHElH0D4w5`>ZxOh z5(me_S^zTUQCRdFIp6zcXC$`rU-)fcRnUdBv6{Sg08(c*dwEn8=dzZ4-k`3c0~$c5M?ZEK``(bATh zj1zrt9GUgC&}#g2P+sF0Y-L;QK%KkcjAHg%p}}n8@{xE?sYWrwk^o-O>LWuRVYhNv zgtgp{8z|e5#~dAkh9>p8UemPyBEz~{BFO{91j*OjLfO%CacDrn+g`Q$7Rn)n$mswy zDZ>`H2L1Q2FpCt=%77^jsdnoEqqk9rHnXoN=WS^M`x^Dx;3CvO=MK8OI^~l-Pj1&{ zyxz`-Sg$)dn`Q*&v-JHXqMGCtZ^8)X$vP(a^VdPO1brTro>mS|glML3(>?{)YH(fH zXiFkw3Uh|r<*!x2fQ3xe78nGq?2;5&2F5Id9Xl+q#UZlRHFVoR6F`Dk?z}wb=;$*i z1Q=j451R-|BE99HM*X2~ABOZ#;XS9S&A5qnwakZ9T6>^UE{$^|t`7Hj&{z+rJDK z6Lwc8c0YZ@UPC4>97HB_49oT-T2$SdmvWW|Ko)x$y~_%gdk0#noanMgrgFw&sp0JQhQjD?ry&Qhxz?zyRA8mo=$hPm-f7*=*U zgjKVMcc0P({fpWaPT1Wz%?lGtc4_tCd0@XU(MN(h^hGCDccO>vhaPK-59tvSo6@chwK|94SC?#-$*SB^iZbq>zCZi* zC97~2hEB{41jM_IZ5><;tMA2tq}KGp;<3ko#RQObR(+$5oRLu8r<@B<`44GsW4~e~ zG$y2Tu42`96fnkoC~&!}773km0eg1xv6VR8%LgXKa&b@PuN&tE16q^Dn2eM^#m2Pv zNw=D8!32I<(!CGK8_T_~2rupA-v2h-;m#+ek1>Xepf8&0G$S(7UJHspiG$z+RniLQ zJ>E3Mdmt(DcAh^xfC(+}KKkJOsW-X%MCyc17RsAF?m&!#*_W90!ci z_uXb6&~kCk9|lee9fT`9-I_gdN|uQ93xCEBdq(?^eOj_=9&-f_zbVFNDq`!eH*ETf z59*AszOt@(pk81nQm5slEm=f&-j4wB&f1Q!6q<@jJnhB@*AexK!=FtVsiFsUb^-94 zk{}~-re5{a-=X}&)s}3s`(b#Q0AqSFC-7~a{WsK|HQTBB7Db&FHT60 zMMF|lf7Cx%Vapu!`o14dOCc@5>KLzSfqXD$zAwU+^}RlI_TkEtC@BdUy$~Ub}UlrKqe&CT=WG8Uz>#(Mh91EBEu!BQ^rf_bt0~Pe}-0B;2|9|cjc(t zrqwPdLOk;e7v%4;GA)XKwDSWdy;Vnk*@tpd{wpnoTdXH>0c3e|iW6T)UiAM+fg9CW3nmbt;*52a5R zbJ_!9JN{<8Ht!kaqjr`7;j=9@KH>SUnMF@sgcDvmbD9Ygf6>%ZC5G=xa*>+l}V|w Hd(?jcfqSbH literal 2851 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 G=zjy4DPgk! diff --git a/android-client/android-res/drawable/ic_launcher_background.xml b/android-client/android-res/drawable/ic_launcher_background.xml index 0786163..dcb79f4 100644 --- a/android-client/android-res/drawable/ic_launcher_background.xml +++ b/android-client/android-res/drawable/ic_launcher_background.xml @@ -1,13 +1,16 @@ - + + android:fillColor="#1B3563" + android:pathData="M0,0 L108,0 L108,108 L0,108 Z" /> diff --git a/android-client/android-res/drawable/ic_launcher_foreground.xml b/android-client/android-res/drawable/ic_launcher_foreground.xml index 7edb508..ad67b05 100644 --- a/android-client/android-res/drawable/ic_launcher_foreground.xml +++ b/android-client/android-res/drawable/ic_launcher_foreground.xml @@ -1,29 +1,26 @@ - + peut etre rogne selon le lanceur. Le dessin occupe 31..77 en x, 29..82 + en y. + + UN SEUL CHEMIN, EN EVENODD. La serrure n'est pas peinte de la couleur du + fond, elle est EVIDEE : le fond se voit au travers. Peinte, elle imposerait + de tenir deux fichiers d'accord sur une couleur, et le moindre ecart se + verrait comme une tache. Evidee, il n'y a rien a synchroniser. + + Blanc plein plutot qu'un trait bleu : a 36 px un contour se boue, une + silhouette pleine tient. --> - - - - - - + android:fillColor="#FFFFFF" + android:fillType="evenOdd" + android:pathData="M54,29 L77,37 L77,56 C77,69.5 67,78 54,82 C41,78 31,69.5 31,56 L31,37 Z + M54,50 m-7,0 a7,7 0 1,0 14,0 a7,7 0 1,0 -14,0 Z + M51,55.5 L57,55.5 L58.6,70 L49.4,70 Z" /> diff --git a/android-client/android-res/drawable/ic_launcher_monochrome.xml b/android-client/android-res/drawable/ic_launcher_monochrome.xml index f729035..0145ab3 100644 --- a/android-client/android-res/drawable/ic_launcher_monochrome.xml +++ b/android-client/android-res/drawable/ic_launcher_monochrome.xml @@ -1,22 +1,17 @@ - + - + android:pathData="M54,29 L77,37 L77,56 C77,69.5 67,78 54,82 C41,78 31,69.5 31,56 L31,37 Z + M54,50 m-7,0 a7,7 0 1,0 14,0 a7,7 0 1,0 -14,0 Z + M51,55.5 L57,55.5 L58.6,70 L49.4,70 Z" /> diff --git a/android-client/android-res/drawable/splash_vector.xml b/android-client/android-res/drawable/splash_vector.xml index 9a2cee3..f1453bf 100644 --- a/android-client/android-res/drawable/splash_vector.xml +++ b/android-client/android-res/drawable/splash_vector.xml @@ -2,26 +2,25 @@ + le dessin occupe 103..186, bien a l'interieur. + Meme bouclier que l'icone du lanceur, a l'echelle. + + ICI LA SERRURE EST PEINTE, pas evidee : la couche de demarrage est posee + a plat sur le fond du systeme, et un evidement y ferait un trou. Elle est + entierement contenue dans le bouclier blanc, donc sa couleur n'a qu'a + trancher sur du blanc - elle ne depend d'aucun autre fichier. --> + android:fillColor="#FFFFFF" + android:pathData="M144,96.3 L185.4,110.7 L185.4,144.9 C185.4,169.2 167.4,184.5 144,191.7 C120.6,184.5 102.6,169.2 102.6,144.9 L102.6,110.7 Z" /> + android:fillColor="#1B3563" + android:pathData="M144,134.1 m-12.6,0 a12.6,12.6 0 1,0 25.2,0 a12.6,12.6 0 1,0 -25.2,0 Z" /> - + android:fillColor="#1B3563" + android:pathData="M138.6,144 L149.4,144 L152.3,170.1 L135.7,170.1 Z" /> diff --git a/android-client/android-res/values/colors.xml b/android-client/android-res/values/colors.xml index 8411c8b..a3a5529 100644 --- a/android-client/android-res/values/colors.xml +++ b/android-client/android-res/values/colors.xml @@ -3,5 +3,7 @@ ecran de demarrage blanc suivi d'une application sombre donne un flash desagreable a chaque lancement. --> - #0F172A + + #3E6394 diff --git a/android-client/make-icons.ps1 b/android-client/make-icons.ps1 index 08a9f50..c58f020 100644 --- a/android-client/make-icons.ps1 +++ b/android-client/make-icons.ps1 @@ -1,6 +1,6 @@ # Genere les icones PNG du lanceur, pour Android < 8 qui ignore les icones # adaptatives. Meme dessin que les vecteurs de android-res\drawable : -# cadenas cyan sur ardoise. +# bouclier blanc a serrure, sur le bleu de l'application. # # A relancer seulement si le dessin change ; les PNG sont suivis par git. @@ -8,8 +8,8 @@ $ErrorActionPreference = 'Stop' Add-Type -AssemblyName System.Drawing $root = Join-Path $PSScriptRoot 'android-res' -$bg = [System.Drawing.Color]::FromArgb(255, 15, 23, 42) # #0F172A -$fg = [System.Drawing.Color]::FromArgb(255, 59, 130, 246) # #3B82F6 +$bg = [System.Drawing.Color]::FromArgb(255, 27, 53, 99) # #1B3563 +$fg = [System.Drawing.Color]::FromArgb(255, 255, 255, 255) # blanc # densite -> cote en pixels, tel qu'Android les attend $sizes = @{ 'drawable-ldpi' = 36; 'drawable-mdpi' = 48; 'drawable-hdpi' = 72 @@ -38,29 +38,37 @@ foreach ($dir in $sizes.Keys) { # Echelle : le dessin vectoriel vit dans un carre de 108. $u = $n / 108.0 $brush = New-Object System.Drawing.SolidBrush $fg - $pen = New-Object System.Drawing.Pen $fg, ([float](5.5 * $u)) - $pen.StartCap = 'Round'; $pen.EndCap = 'Round' - # Anse : demi-cercle ouvert vers le bas, puis deux montants. - $g.DrawArc($pen, [float](44*$u), [float](37*$u), [float](20*$u), [float](20*$u), 180, 180) - $g.DrawLine($pen, [float](44*$u), [float](47*$u), [float](44*$u), [float](56*$u)) - $g.DrawLine($pen, [float](64*$u), [float](47*$u), [float](64*$u), [float](56*$u)) + # Bouclier : sommet, epaules, montants, puis les deux courbes qui se + # rejoignent en pointe. Memes coordonnees que ic_launcher_foreground.xml. + $s = New-Object System.Drawing.Drawing2D.GraphicsPath + $s.AddLines(@( + (New-Object System.Drawing.PointF ([float](54*$u), [float](29*$u))), + (New-Object System.Drawing.PointF ([float](77*$u), [float](37*$u))), + (New-Object System.Drawing.PointF ([float](77*$u), [float](56*$u))))) + $s.AddBezier( + [float](77*$u), [float](56*$u), [float](77*$u), [float](69.5*$u), + [float](67*$u), [float](78*$u), [float](54*$u), [float](82*$u)) + $s.AddBezier( + [float](54*$u), [float](82*$u), [float](41*$u), [float](78*$u), + [float](31*$u), [float](69.5*$u), [float](31*$u), [float](56*$u)) + $s.AddLine([float](31*$u), [float](56*$u), [float](31*$u), [float](37*$u)) + $s.CloseFigure() + $g.FillPath($brush, $s) - # Corps - $body = New-Object System.Drawing.Drawing2D.GraphicsPath - $bx = 34*$u; $by = 54*$u; $bw = 40*$u; $bh = 26*$u; $br = 4*$u - $body.AddArc([float]$bx, [float]$by, [float](2*$br), [float](2*$br), 180, 90) - $body.AddArc([float]($bx+$bw-2*$br), [float]$by, [float](2*$br), [float](2*$br), 270, 90) - $body.AddArc([float]($bx+$bw-2*$br), [float]($by+$bh-2*$br), [float](2*$br), [float](2*$br), 0, 90) - $body.AddArc([float]$bx, [float]($by+$bh-2*$br), [float](2*$br), [float](2*$br), 90, 90) - $body.CloseFigure() - $g.FillPath($brush, $body) - - # Serrure, evidee dans la couleur du fond + # Serrure, evidee dans la couleur du fond. Le vecteur y arrive par un + # remplissage pair-impair ; ici, repeindre par-dessus revient au meme, + # l'icone ancienne etant de toute facon opaque. $bgBrush = New-Object System.Drawing.SolidBrush $bg - $g.FillEllipse($bgBrush, [float](50*$u), [float](58*$u), [float](8*$u), [float](8*$u)) - $g.FillRectangle($bgBrush, [float](52.4*$u), [float](64*$u), [float](3.2*$u), [float](9*$u)) - + $g.FillEllipse($bgBrush, [float](47*$u), [float](43*$u), [float](14*$u), [float](14*$u)) + $slot = New-Object System.Drawing.Drawing2D.GraphicsPath + $slot.AddLines(@( + (New-Object System.Drawing.PointF ([float](51*$u), [float](55.5*$u))), + (New-Object System.Drawing.PointF ([float](57*$u), [float](55.5*$u))), + (New-Object System.Drawing.PointF ([float](58.6*$u), [float](70*$u))), + (New-Object System.Drawing.PointF ([float](49.4*$u), [float](70*$u))))) + $slot.CloseFigure() + $g.FillPath($bgBrush, $slot) $g.Dispose() $bmp.Save((Join-Path $out 'ic_launcher.png'), [System.Drawing.Imaging.ImageFormat]::Png) $bmp.Dispose()