From c5822778bd6c21d005b4baad3f6221888103baeb Mon Sep 17 00:00:00 2001 From: Carlo Baratto Date: Wed, 19 Aug 2026 16:41:54 +0200 Subject: [PATCH] Icona in stile Sailfish OS: gradiente azzurro-blu con angoli arrotondati, libro aperto bianco con ombra e righe di testo tenui; dimensioni 86/108/128/172 installate --- harbour-calibreweb.pro | 6 +- icons/108x108/harbour-calibreweb.png | Bin 796 -> 1422 bytes icons/128x128/harbour-calibreweb.png | Bin 0 -> 1660 bytes icons/172x172/harbour-calibreweb.png | Bin 0 -> 2305 bytes icons/86x86/harbour-calibreweb.png | Bin 629 -> 1160 bytes icons/make_icons.py | 111 +++++++++++++++++---------- rpm/harbour-calibreweb.spec | 2 + 7 files changed, 79 insertions(+), 40 deletions(-) create mode 100644 icons/128x128/harbour-calibreweb.png create mode 100644 icons/172x172/harbour-calibreweb.png diff --git a/harbour-calibreweb.pro b/harbour-calibreweb.pro index 7a5b444..cc92968 100644 --- a/harbour-calibreweb.pro +++ b/harbour-calibreweb.pro @@ -44,4 +44,8 @@ icons86.path = /usr/share/icons/hicolor/86x86/apps icons86.files = $$PWD/icons/86x86/harbour-calibreweb.png icons108.path = /usr/share/icons/hicolor/108x108/apps icons108.files = $$PWD/icons/108x108/harbour-calibreweb.png -INSTALLS += icons86 icons108 +icons128.path = /usr/share/icons/hicolor/128x128/apps +icons128.files = $$PWD/icons/128x128/harbour-calibreweb.png +icons172.path = /usr/share/icons/hicolor/172x172/apps +icons172.files = $$PWD/icons/172x172/harbour-calibreweb.png +INSTALLS += icons86 icons108 icons128 icons172 diff --git a/icons/108x108/harbour-calibreweb.png b/icons/108x108/harbour-calibreweb.png index 52581d193ec574629f5512c07f83f247e47b5dd4..5e9799be804544e70ff7792793ca2c61e5374e53 100644 GIT binary patch delta 1404 zcmV-?1%vvW2967mBYy=|Nkl&u>&!6vvOoWr;s1)&835LLsCfVy%UO;t*Vz zU<;IiYBbo5l8}(tidsVqF=$n6S-H@S8WTmz53M9DY&ud4r4~@4Awd_~X=$-7{s@1- zxbY>^_P+b>dvo8p=cV6I(?vU(`{R7(oOkEGH}i-9000007=O4W?hc;0IGc~V4@rDp zR~l93p0yKl8!GPUS>7M)*5Rag(MwE>g|ZL(n#wM(~xDzkw?mkig{5_-Z}Co zL`CGwhPxxhKC-YK=OL?Dj;;wWEt0Uz@O8+tMDN;rLOBR6EOTxOvMkfvSZ?egl(6k* zAuBG9tuvEmEPt%!>?CBx%<** zoy9|S)_(*g(Ev&Dz#C@+B*jBn5?!oc2Q#(IQ#WTYQ!8d&kCJGJl$f9-8X_eoK06(G z*59GlRowFq%~0zq_PD6B8heRh5D=F{l*G<#j);i5(kZ9yONfieMTZwakGMq5Z$GGC z*Kr{dAng2e53vjKV}8H$$2I)yYFhKzCC(u&z<=ppV!FDNI+ zh#Y6wKyHRccGa=;WrMDCiW)w>=yVKDH-D2P%VT6$9X5ZHhRgWid{`75#>d%C$7ox< z@gO_1xdkgWn}ltDw5?v&PKWD~DD{0&w8r;;Cr@lIo(T?{yvPzFn{Y9lgw#Jlq^bx-*`F8qPSyN65)&&+b1xu z?A^dNDQ>Rp-N3b~PyTg@l^vgie$KV-=dF)}D`w(LVnzGMtZh#Av_)!@D`v{g-v_z} ztoDAjJ*|Db;-%#x`Z+hp|A^GrEw-WOEJX?~=JDIUP5h@<@_GGa1RXN9 zlvL_7lVct%C9$M3C2AoP2V8R$ze)si!F7oV1K+BhFi;W`hS)RCK#lM1sA>+LhBn8H z?SC@N?Wo{OBDjB8!a#;44DC%ztA7rhf;C4>9M~NGrlm+Sc?8~gyW)*+ppBWyH=l}j z<82}w%cK#QVMIjb`}<&xiK&B4S|@=SMuaTm;`&?7feEDk^opV(&hMsJtUo3gl|+xS z*S|ul#l-a6TZ~+U5=KN+)_D@rEHmA;)!0L5VMIjBUONG4mY8{GTPO#Sgmn=SmA(pT z#WMSDI9WtR2qPj|`pR)gi@=TdS|Z22C}AE;_Z@>cLv9?}UR2Dj2=ln>Wr*|RulI`+ zkg1md0000< KMNUMnLSTaV#*=S%WfL-vI^lOHsbL-dbUibg==l7H6->t9eInxg9 ztN$(J^g&hgxY04^JL=2R)i%y}o2XvDJY8s0Qrz<7>xMLRqLne9EhH0ut9v|1%Ow;dPcP>$Gmw{cJ<^xm1ou6lv_FQgx z%2$8-8s`c{)$^|e&RVV!e7)nP&{1HR2DjKQ-z{yKc6K5cD0JWGy;0R^XHPqG_0NMl z&S!5v|9<_;`_TIy>ssGdO2kUv-hAfCW^s30$wg_8?)~F;<6T}(_EvAegdODLey>Q%?;Da zwa!Q`Rnp{Ie5xieG|^+Wv+ums(_NN;QqFAE55224ZV@~5Y?Wh-eRSB`cd2}ZZ@=W| lAO5C#WUVtlFj?x)b$_<{+oXkMAHzYZ)YH|^Wt~$(695TfYK;H@ diff --git a/icons/128x128/harbour-calibreweb.png b/icons/128x128/harbour-calibreweb.png new file mode 100644 index 0000000000000000000000000000000000000000..85a5fe23e269941fcd26313d152c9a3cbf946417 GIT binary patch literal 1660 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 b0QCA7Bx*B~N?knR00000NkvXXu0mjf<%~s& literal 0 HcmV?d00001 diff --git a/icons/86x86/harbour-calibreweb.png b/icons/86x86/harbour-calibreweb.png index f08f3d0de62dae7eb30067860e1ae6be3c513331..370582266fa45d49f4d98e66f1ff50f4708efca3 100644 GIT binary patch delta 1140 zcmV-)1dIFi1c(WcBYy->NklSx8h-7=TaFqtfD1IyTiqD2Y*6YAV^ZyhLd^ zW@Qjr_)rgpOOy~rQCQ?cJ@ghu(B@WHL{K^^YFUaD6iGojj-#n<`0nkYj*NGod(VHa z&iy|a7-#05|NP(locX!VJwphBAP54*9F~I>^o|QG$FqWa$$ybdoR}VDf6v&gm#M`4 zby0@>7(Q^{+tH8}D(1oZ=%76XeZbys`v?{DFjc?cpv30C{%%{Tl-jh#x}512yXV!2 z?WI!cHZ0Nfrb}#I*Dy*IQJ)^8>P}OvyVH+S6==waRrIGSHn(F4rE1Wa>5z3ePwgOK z61^Hlv0`_%`G3%=P9A5)Njxf6tRSFQGssqKw#SQBgQUsjoaR!#VzF9HBP$k{0rNI_bel1HvekrgjpSj`(1VI45HGk(Ma7(Z`CxJ^&;y2J1U4a!j zh5S-Lh&4IMECsN)R(B%zBwO8y;CYGPJL&n@5Uf~22=}~fu@n%(KQFFbL3@4@*W?0e z&riax01BSD*=8vqgl}%##C9E6D|xKkF*Jgh(~S@yb13vdIxa2qDDd8wZUIF1BTGjC3DNW;&)( zsOZ!?z2LEI)fG^9WA|id~woi7mNhCWImU)rG3hC)9XM$LKHF z40}0JY_V~1;Y*hrI&Na{o9gpwbMn^|GVcx~6}z&s*;I%L-+<<8!sC{i31JAWd9j$& z=dvv-6>IYBx-cndPST41QiR1Sw|f)50e|LmV*cS3=5Sj60T?V0bDnWsL8yRYfk3f9 z;N?g_*z$V?JdoWJ#(Cix+6@x#+3nhU!r(e<9uy0N;)Z69b5GE&PKM6!3}!&CGu2*?d6VNakJf3o)U4=o^pR&)hCo<_?J5tmDSru@XyLT z_+Rc2v#_)-WCj1K+Qa|1X5?5I6X$Tk{t}kd4=rx!Ul^3G z(h`xF?jZZ(&;|R(l}k(K-tenUcDGDtR{ePT;@Q*MTAhXr3=1ADdfB(VoPWP2x8~HZ z&#RT)FIsh?gjwntbtPjo{Y5-;bZac;5W`^}yfj z=gBSJ=FiwEdU4l{8(YdseTB4{HY!Dl&VD@U%vQ5bkb!GE&)#G!s=qQpcjM-V2hOxL zpOd@qo;`oho5?YG+b(@AJHGvTtY`RNcfD_KzuuHsEFRgq_uaaA7b}!v!|!pqJ@zzP zsW)x*+L%>_KCDJhlDucI<=k4)xzfSq{j#QQzxIZ_DcN^peuQT5!MHCqihr4R*lbkw zWjVGbynoH{X%&|@1ztO`L$zt8Lw(DVelChvm>5d3x0n5HrIsL$DX&Em%9i_ncOoKZhR7JY*s7iqs`J_ a{DV38^iiWV%ckZq0D-5gpUXO@geCxA5FeNT diff --git a/icons/make_icons.py b/icons/make_icons.py index 5aeec93..325b233 100644 --- a/icons/make_icons.py +++ b/icons/make_icons.py @@ -1,53 +1,86 @@ #!/usr/bin/env python3 -"""Genera le icone dell'app nella struttura standard Sailfish: - icons/86x86/harbour-calibreweb.png e icons/108x108/harbour-calibreweb.png""" +"""Genera le icone dell'app in stile Sailfish OS: + sfondo a gradiente azzurro->blu con angoli molto arrotondati, + libro aperto bianco con ombra morbida e righe di testo tenui. + Dimensioni: 86, 108, 128, 172 (struttura standard hicolor).""" import os from PIL import Image, ImageDraw -BG = (46, 52, 64) # #2E3440 -ACCENT = (136, 192, 208) # #88C0D0 -PAGE = (229, 233, 240) # #E5E9F0 -SPINE = (94, 129, 172) # #5E81AC +# gradiente Sailfish: azzurro chiaro (alto) -> blu profondo (basso) +C_TOP = (94, 210, 240) # #5ED2F0 +C_BOT = (14, 111, 168) # #0E6FA8 +PAGE = (255, 255, 255) +TEXT = (120, 190, 225) # righe del testo, tenue +SPINE = (200, 225, 240) -def draw_icon(size): - img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) +def gradient(size, c1, c2): + img = Image.new("RGB", (size, size)) d = ImageDraw.Draw(img) - margin = size * 0.045 - radius = size * 0.16 - d.rounded_rectangle([margin, margin, size - margin, size - margin], - radius=radius, fill=BG) - - cx = size / 2 - top = size * 0.34 - bot = size * 0.68 - half = size * 0.16 - outer_l = size * 0.22 - outer_r = size * 0.78 - - left_page = [(cx - half, top), (cx, top), (cx, bot), (outer_l, bot + size * 0.04)] - right_page = [(cx, top), (cx + half, top), (outer_r, bot + size * 0.04), (cx, bot)] - - d.polygon(left_page, fill=ACCENT) - d.polygon(right_page, fill=ACCENT) - d.rectangle([cx - size * 0.014, top, cx + size * 0.014, bot], fill=SPINE) - - lw = max(1, int(size * 0.012)) - for y_frac in (0.45, 0.52, 0.59): - y = size * y_frac - d.line([(cx - half + size * 0.03, y), (outer_l + size * 0.06, y + size * 0.025)], - fill=PAGE, width=lw) - d.line([(cx + half - size * 0.03, y), (outer_r - size * 0.06, y + size * 0.025)], - fill=PAGE, width=lw) + for y in range(size): + t = y / (size - 1) + d.line([(0, y), (size, y)], + fill=(int(c1[0] + (c2[0] - c1[0]) * t), + int(c1[1] + (c2[1] - c1[1]) * t), + int(c1[2] + (c2[2] - c1[2]) * t))) return img +def draw_icon(size): + m = size * 0.05 + r = size * 0.22 + out = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + + # sfondo: gradiente ritagliato nel rounded rect + grad = gradient(size, C_TOP, C_BOT).convert("RGBA") + mask = Image.new("L", (size, size), 0) + ImageDraw.Draw(mask).rounded_rectangle([m, m, size - m, size - m], + radius=r, fill=255) + out.paste(grad, (0, 0), mask) + + d = ImageDraw.Draw(out) + + cx = size / 2 + top = size * 0.33 + bot = size * 0.66 + half = size * 0.15 + ol = size * 0.24 + orr = size * 0.76 + + def pages(): + return ([(cx - half, top), (cx, top), (cx, bot), (ol, bot + size * 0.035)], + [(cx, top), (cx + half, top), (orr, bot + size * 0.035), (cx, bot)]) + + lp, rp = pages() + # ombra morbida sotto il libro (rilievo stile Sailfish) + sh = size * 0.022 + shadow = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + ds = ImageDraw.Draw(shadow) + lps, rps = pages() + ds.polygon([(x, y + sh) for x, y in lps], fill=(0, 60, 100, 90)) + ds.polygon([(x, y + sh) for x, y in rps], fill=(0, 60, 100, 90)) + out.alpha_composite(shadow) + + d.polygon(lp, fill=PAGE) + d.polygon(rp, fill=PAGE) + d.rectangle([cx - size * 0.016, top, cx + size * 0.016, bot], fill=SPINE) + + # righe di testo sulle pagine + lw = max(1, int(size * 0.012)) + for yf, dy in ((0.46, 0.022), (0.53, 0.026), (0.60, 0.030)): + y = size * yf + d.line([(cx - half + size * 0.045, y), (ol + size * 0.05, y + size * dy)], + fill=TEXT, width=lw) + d.line([(cx + half - size * 0.045, y), (orr - size * 0.05, y + size * dy)], + fill=TEXT, width=lw) + return out + + def main(): - os.makedirs("icons/86x86", exist_ok=True) - os.makedirs("icons/108x108", exist_ok=True) - draw_icon(86).save("icons/86x86/harbour-calibreweb.png") - draw_icon(108).save("icons/108x108/harbour-calibreweb.png") - print("icone scritte in icons/86x86/ e icons/108x108/") + for s in (86, 108, 128, 172): + os.makedirs(f"icons/{s}x{s}", exist_ok=True) + draw_icon(s).save(f"icons/{s}x{s}/harbour-calibreweb.png") + print("icone scritte: 86, 108, 128, 172") if __name__ == "__main__": diff --git a/rpm/harbour-calibreweb.spec b/rpm/harbour-calibreweb.spec index 16b7540..d22ae37 100644 --- a/rpm/harbour-calibreweb.spec +++ b/rpm/harbour-calibreweb.spec @@ -90,5 +90,7 @@ install -m 0644 %{_builddir}/%{name}_it.qm %{buildroot}%{_datadir}/%{name}/trans %{_datadir}/applications/%{name}.desktop %{_datadir}/icons/hicolor/86x86/apps/%{name}.png %{_datadir}/icons/hicolor/108x108/apps/%{name}.png +%{_datadir}/icons/hicolor/128x128/apps/%{name}.png +%{_datadir}/icons/hicolor/172x172/apps/%{name}.png %{_datadir}/%{name}/qml %{_datadir}/%{name}/translations/%{name}*.qm