Nova logo em estilo geométrico facetado
Cabeça do lobo-guará contornada sobre foto de referência, com as regiões de cor do animal real em tons de verde-azulado e o pescoço se desfazendo em estilhaços. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b9657ea856
commit
f65e7ae615
3 files changed
+122
-245
No files matched your search
@@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 100" role="img" aria-label="Guará"><defs><linearGradient id="wh" gradientUnits="userSpaceOnUse" x1="58" y1="0" x2="160" y2="100"><stop offset="0" stop-color="#3BE3CC"/> <stop offset="0.45" stop-color="#12B5A8"/> <stop offset="1" stop-color="#0B6A86"/></linearGradient><mask id="wm" maskUnits="userSpaceOnUse" x="0" y="0" width="160" height="100"><g shape-rendering="crispEdges"><rect x="80" y="0" width="81" height="100" fill="#fff"/><rect x="72.38" y="34.88" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="87.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="64.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="47.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="64.88" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="52.38" width="5.24" height="5.24" fill="#fff"/><rect x="77.38" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="62.38" width="5.24" height="5.24" fill="#fff"/><rect x="77.38" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="64.88" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="47.38" width="5.24" height="5.24" fill="#fff"/><rect x="57.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="37.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="84.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="34.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="49.88" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="64.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="37.38" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="47.38" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="77.38" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="87.38" width="5.24" height="5.24" fill="#fff"/><rect x="74.88" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="82.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="67.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="84.88" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="54.88" width="5.24" height="5.24" fill="#fff"/><rect x="77.38" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="69.88" width="5.24" height="5.24" fill="#fff"/><rect x="77.38" y="54.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="34.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="69.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="77.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="87.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="47.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="32.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="87.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="67.38" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="77.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="67.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="39.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="32.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="82.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="Line truncated
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 100" role="img" aria-label="Guará"><polygon points="146.58,7.00 144.87,10.85 147.43,12.13" fill="#38d3c1" stroke="#38d3c1" stroke-width="0.25" stroke-linejoin="round"/><polygon points="131.94,67.89 135.88,72.47 135.24,69.04" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.13,68.19 116.20,66.47 107.81,62.69" fill="#23b8aa" stroke="#23b8aa" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 144.87,10.85 146.58,7.00" fill="#38d3c0" stroke="#38d3c0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="101.86,14.48 105.07,14.27 104.21,11.27" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.92,6.14 112.34,8.28 111.92,4.43" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="37.51,61.88 38.06,58.55 35.26,59.42" fill="#16a69b" stroke="#16a69b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.44" stroke-opacity="0.44"/><polygon points="51.64,65.75 54.46,64.96 52.55,62.38" fill="#16a79b" stroke="#16a79b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.66" stroke-opacity="0.66"/><polygon points="46.20,62.56 49.71,66.06 50.53,62.99" fill="#1baea1" stroke="#1baea1" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.58" stroke-opacity="0.58"/><polygon points="48.26,63.58 45.03,60.36 44.41,64.13" fill="#12a298" stroke="#12a298" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.52" stroke-opacity="0.52"/><polygon points="61.85,68.19 62.92,72.99 65.81,67.07" fill="#13a398" stroke="#13a398" stroke-width="0.25" stroke-linejoin="round"/><polygon points="62.92,72.99 61.85,68.19 55.42,69.11" fill="#19ab9f" stroke="#19ab9f" stroke-width="0.25" stroke-linejoin="round"/><polygon points="38.33,89.93 36.63,88.22 36.63,89.93" fill="#0f9e94" stroke="#0f9e94" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.39" stroke-opacity="0.39"/><polygon points="98.42,72.35 97.37,66.47 91.80,72.47" fill="#a9f2e5" stroke="#a9f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 98.42,72.35 91.80,72.47" fill="#a6f2e5" stroke="#a6f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="98.42,72.35 92.66,77.17 100.36,80.17" fill="#aff3e7" stroke="#aff3e7" stroke-width="0.25" stroke-linejoin="round"/><polygon points="85.59,79.64 92.66,77.17 91.80,72.47" fill="#17a89c" stroke="#17a89c" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 99.65,82.45 100.36,80.17" fill="#1fb2a5" stroke="#1fb2a5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="99.65,82.45 92.66,77.17 96.80,84.95" fill="#1db0a3" stroke="#1db0a3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="133.31,53.64 131.39,55.35 133.74,59.63" fill="#109087" stroke="#109087" stroke-width="0.25" stroke-linejoin="round"/><polygon points="121.41,64.97 128.18,59.63 123.90,58.77" fill="#093f4a" stroke="#093f4a" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.07,68.61 112.13,68.19 107.81,62.69" fill="#1aaca0" stroke="#1aaca0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 135.88,72.47 131.94,67.89" fill="#093c48" stroke="#093c48" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 124.18,72.59 121.76,80.81" fill="#093e49" stroke="#093e49" stroke-width="0.25" stroke-linejoin="round"/><polygon points="124.18,72.59 118.91,75.14 121.76,80.81" fill="#093f4b" stroke="#093f4b" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 140.16,10.63 144.87,10.85" fill="#33cdbb" stroke="#33cdbb" stroke-width="0.25" stroke-linejoin="round"/><polygon points="144.01,27.53 139.52,28.60 142.08,31.60" fill="#2cc3b3" stroke="#2cc3b3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="128.18,59.63 134.60,61.77 133.74,59.63" fill="#0a414d" stroke="#0a414d" stroke-width="0.25" stroke-linejoin="round"/><polygon points="134.60,61.77 128.18,59.63 131.94,67.89" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 108.92,6.14 106.57,8.71" fill="#30c9b8" stroke="#30c9b8" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 112.34,8.28 108.92,6.14" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="104.21,11.27 109.35,9.56 106.57,8.71" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="105.07,14.27 109.35,9.56 104.21,11.27" fill="#2fc7b6" stroke="#2fc7b6" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.34,8.28 114.48,8.28 111.92,4.43" fill="#2bc2b2" stroke="#2bc2b2" stroke-width="0.25" stroke-linejoin="round"/><polygon points="116.20,66.47 116.20,60.06 107.81,62.69" fill="#25baab" stroke="#25baab" stroke-width="0.25" stroke-linejoin="round"/><polygon points="106.78,53.75 110.63,53.64 108.92,46.79" fill=Line truncated
|
||||||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 66 KiB |
@@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Guará"><defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0f766e"/><stop offset="1" stop-color="#083344"/></linearGradient><clipPath id="ic"><rect width="128" height="128" rx="29"/></clipPath></defs><rect width="128" height="128" rx="29" fill="url(#bg)"/><g clip-path="url(#ic)"><g transform="translate(-13 18) scale(0.86)"><defs><linearGradient id="ih" gradientUnits="userSpaceOnUse" x1="58" y1="0" x2="160" y2="100"><stop offset="0" stop-color="#d9fff7"/> <stop offset="0.5" stop-color="#8df1e0"/> <stop offset="1" stop-color="#3fc8cf"/></linearGradient><mask id="im" maskUnits="userSpaceOnUse" x="0" y="0" width="160" height="100"><g shape-rendering="crispEdges"><rect x="80" y="0" width="81" height="100" fill="#fff"/><rect x="67.38" y="49.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="77.38" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="62.38" width="5.24" height="5.24" fill="#fff"/><rect x="67.38" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="57.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="79.88" width="5.24" height="5.24" fill="#fff"/><rect x="74.88" y="64.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="84.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="54.88" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="84.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="67.38" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="52.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="37.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="84.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="87.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="47.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="39.88" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="67.38" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="54.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="89.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="72.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="37.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="57.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="49.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="69.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="47.38" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="57.38" width="5.24" height="5.24" fill="#fff"/><rect x="62.38" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="82.38" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="82.38" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="39.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="72.38" y="37.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="34.88" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="79.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="74.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="69.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="32.38" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="39.88" width="2.74" height="2.74" fill="#fff"/><rect x="62.38" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="67.38" y="54.88" width="2.74" height="2.74" fill="#fff"/><rect x="59.88" y="44.88" width="2.74" height="2.74" fill="#fff"/><rect x="69.88" y="42.38" width="2.74" height="2.74" fill="#fff"/><rect x="64.88" y="49.88" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="59.88" width="2.74" height="2.74" fill="#fff"/><rect x="77.38" y="62.38" width="2.74" height="2.74" fill="#fff"/><rect x="74.88" y="32.38" width="2.74" height="2.74" fill="#ffLine truncated
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Guará"><defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0f3d44"/><stop offset="1" stop-color="#062a31"/></linearGradient><clipPath id="ic"><rect width="128" height="128" rx="29"/></clipPath></defs><rect width="128" height="128" rx="29" fill="url(#bg)"/><g clip-path="url(#ic)"><g transform="translate(-48 20) scale(1.06)"><polygon points="146.58,7.00 144.87,10.85 147.43,12.13" fill="#38d3c1" stroke="#38d3c1" stroke-width="0.25" stroke-linejoin="round"/><polygon points="131.94,67.89 135.88,72.47 135.24,69.04" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="112.13,68.19 116.20,66.47 107.81,62.69" fill="#23b8aa" stroke="#23b8aa" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 144.87,10.85 146.58,7.00" fill="#38d3c0" stroke="#38d3c0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="101.86,14.48 105.07,14.27 104.21,11.27" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.92,6.14 112.34,8.28 111.92,4.43" fill="#2dc5b5" stroke="#2dc5b5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="37.51,61.88 38.06,58.55 35.26,59.42" fill="#16a69b" stroke="#16a69b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.44" stroke-opacity="0.44"/><polygon points="51.64,65.75 54.46,64.96 52.55,62.38" fill="#16a79b" stroke="#16a79b" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.66" stroke-opacity="0.66"/><polygon points="46.20,62.56 49.71,66.06 50.53,62.99" fill="#1baea1" stroke="#1baea1" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.58" stroke-opacity="0.58"/><polygon points="48.26,63.58 45.03,60.36 44.41,64.13" fill="#12a298" stroke="#12a298" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.52" stroke-opacity="0.52"/><polygon points="61.85,68.19 62.92,72.99 65.81,67.07" fill="#13a398" stroke="#13a398" stroke-width="0.25" stroke-linejoin="round"/><polygon points="62.92,72.99 61.85,68.19 55.42,69.11" fill="#19ab9f" stroke="#19ab9f" stroke-width="0.25" stroke-linejoin="round"/><polygon points="38.33,89.93 36.63,88.22 36.63,89.93" fill="#0f9e94" stroke="#0f9e94" stroke-width="0.25" stroke-linejoin="round" fill-opacity="0.39" stroke-opacity="0.39"/><polygon points="98.42,72.35 97.37,66.47 91.80,72.47" fill="#a9f2e5" stroke="#a9f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 98.42,72.35 91.80,72.47" fill="#a6f2e5" stroke="#a6f2e5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="98.42,72.35 92.66,77.17 100.36,80.17" fill="#aff3e7" stroke="#aff3e7" stroke-width="0.25" stroke-linejoin="round"/><polygon points="85.59,79.64 92.66,77.17 91.80,72.47" fill="#17a89c" stroke="#17a89c" stroke-width="0.25" stroke-linejoin="round"/><polygon points="92.66,77.17 99.65,82.45 100.36,80.17" fill="#1fb2a5" stroke="#1fb2a5" stroke-width="0.25" stroke-linejoin="round"/><polygon points="99.65,82.45 92.66,77.17 96.80,84.95" fill="#1db0a3" stroke="#1db0a3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="133.31,53.64 131.39,55.35 133.74,59.63" fill="#109087" stroke="#109087" stroke-width="0.25" stroke-linejoin="round"/><polygon points="121.41,64.97 128.18,59.63 123.90,58.77" fill="#093f4a" stroke="#093f4a" stroke-width="0.25" stroke-linejoin="round"/><polygon points="108.07,68.61 112.13,68.19 107.81,62.69" fill="#1aaca0" stroke="#1aaca0" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 135.88,72.47 131.94,67.89" fill="#093c48" stroke="#093c48" stroke-width="0.25" stroke-linejoin="round"/><polygon points="127.98,73.39 124.18,72.59 121.76,80.81" fill="#093e49" stroke="#093e49" stroke-width="0.25" stroke-linejoin="round"/><polygon points="124.18,72.59 118.91,75.14 121.76,80.81" fill="#093f4b" stroke="#093f4b" stroke-width="0.25" stroke-linejoin="round"/><polygon points="143.15,8.71 140.16,10.63 144.87,10.85" fill="#33cdbb" stroke="#33cdbb" stroke-width="0.25" stroke-linejoin="round"/><polygon points="144.01,27.53 139.52,28.60 142.08,31.60" fill="#2cc3b3" stroke="#2cc3b3" stroke-width="0.25" stroke-linejoin="round"/><polygon points="128.18,59.63 134.60,61.77 133.74,59.63" fill="#0a414d" stroke="#0a414d" stroke-width="0.25" stroke-linejoin="round"/><polygon points="134.60,61.77 128.18,59.63 131.94,67.89" fill="#0a424e" stroke="#0a424e" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 108.92,6.14 106.57,8.71" fill="#30c9b8" stroke="#30c9b8" stroke-width="0.25" stroke-linejoin="round"/><polygon points="109.35,9.56 112.34,8.28 108.92,6.14" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="104.21,11.27 109.35,9.56 106.57,8.71" fill="#31cab9" stroke="#31cab9" stroke-width="0.25" stroke-linejoin="round"/><polygon points="105.07,14.27 109.35,9.56 104.21,11.27" fill="#2fc7b6" stroke="#2fc7b6" stroke-width="0.25Line truncated
|
||||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 66 KiB |
+120
-243
@@ -1,251 +1,128 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""Gera a identidade visual do Guará.
|
"""Gera a logo do Guará em estilo geométrico facetado (low-poly).
|
||||||
|
|
||||||
Conceito: pixels de tamanhos distintos, soltos à esquerda, que se juntam numa
|
A cabeça do lobo-guará foi contornada sobre uma foto de referência, com as
|
||||||
grade cada vez mais densa até formar a cabeça de um lobo-guará à direita.
|
regiões de cor do animal real: focinho escuro subindo até entre os olhos, juba
|
||||||
|
escura na nuca, interior das orelhas e garganta claros. As facetas (Delaunay)
|
||||||
|
seguem essas regiões, e o pescoço se solta em estilhaços para a esquerda.
|
||||||
|
|
||||||
- O lobo é uma silhueta VETORIAL suave (curvas), sutil, sem serrilhado.
|
Uso: python3 scripts/make-logo.py recorte.png [saida.svg]
|
||||||
- À esquerda a silhueta é recortada por uma máscara de quadrados de tamanhos
|
Requer numpy, scipy e pillow. O ícone (guara.svg) embute esta mesma arte.
|
||||||
distintos que ficam cada vez mais densos até se fundirem no lobo inteiro.
|
|
||||||
- Partículas soltas (quadrados) completam a dissolução fora da silhueta.
|
|
||||||
|
|
||||||
Uso: python3 scripts/make-logo.py -> apps/gui/ui/guara-logo.svg e guara.svg
|
|
||||||
"""
|
"""
|
||||||
import math
|
import math, random, sys
|
||||||
import random
|
import numpy as np
|
||||||
from pathlib import Path
|
from PIL import Image
|
||||||
|
from scipy.spatial import Delaunay
|
||||||
OUT = Path(__file__).resolve().parent.parent / "apps/gui/ui"
|
OUT=[(98,382),(104,350),(110,318),(114,290),(116,262),(110,235),(100,212),
|
||||||
|
(84,178),(66,140),(54,100),(50,68),(54,44),(70,52),(98,70),(128,94),(156,118),(176,146),
|
||||||
W, H = 160.0, 100.0
|
(180,112),(190,78),(204,50),(216,32),(230,40),(252,64),(274,94),(292,120),(305,135),
|
||||||
CELL = 2.5 # módulo da grade de pixels
|
(330,138),(370,142),(420,150),(500,165),(500,460),(320,460),(300,420),(260,385),(225,372),(190,380),(150,398),(118,404),(102,396)]
|
||||||
COLS, ROWS = int(W / CELL), int(H / CELL)
|
EARS=[[(52,78),(80,96),(115,118),(150,142),(130,170),(105,185),(85,160),(65,120)],
|
||||||
|
[(222,48),(245,62),(270,95),(285,125),(255,165),(215,165),(195,130),(200,85)]]
|
||||||
# --- silhueta -------------------------------------------------------------
|
EYES=[(125,270),(200,268)]
|
||||||
# Cabeça de lobo-guará (3/4, olhando para a direita): orelhas enormes, focinho
|
ZONES=[
|
||||||
# longo e fino, e a juba escorrendo para a esquerda (é ela que se desmancha em
|
# interior claro das orelhas (com borda verde em volta)
|
||||||
# pixels). Coordenadas 0..100 na altura; x pode ser negativo (juba).
|
('pale',[(62,62),(92,78),(122,100),(150,124),(160,144),(138,166),(116,190),(98,166),(76,124),(62,92)]),
|
||||||
WOLF = [
|
('pale',[(214,50),(228,56),(248,78),(268,106),(282,128),(258,150),(226,160),(200,146),(196,112),(204,76)]),
|
||||||
(100, 57), (97.5, 54), (91, 51), (83, 48), (75, 45), (69, 41), (65, 36), (62, 29), (59, 20), (56, 11),
|
# testa um pouco mais clara entre as orelhas
|
||||||
(52.5, 4), (49, 0.5), (46, 4), (43, 13), (41, 23), (40, 32), (38, 31), (35, 22), (31, 11), (27.5, 3),
|
('brow',[(160,150),(185,148),(240,170),(270,190),(250,220),(200,230),(160,225),(130,205)]),
|
||||||
(24.5, 0.5), (22, 5), (20, 15), (19, 27), (9, 35), (-6, 45), (-20, 58), (-30, 76), (-34, 100), (-10, 100), (20, 100), (44, 100),
|
# área dos olhos, um tom mais escuro
|
||||||
(60, 100), (59.2, 95), (59.6, 89), (62, 82), (65, 78), (72, 74), (82, 71.5), (92, 69), (98.5, 66.5), (100, 63),
|
('mask',[(108,250),(140,250),(165,246),(195,250),(222,262),(220,284),(196,292),(165,282),(140,290),(112,290)]),
|
||||||
|
# juba escura na nuca
|
||||||
|
('mane',[(298,136),(500,166),(500,236),(430,214),(360,198),(318,182),(300,160)]),
|
||||||
|
# garganta clara e linha clara do lábio
|
||||||
|
('pale',[(214,350),(234,332),(266,324),(302,320),(316,344),(306,372),(274,388),(240,380),(220,370)]),
|
||||||
|
('pale',[(150,398),(186,382),(212,368),(222,374),(204,388),(166,404)]),
|
||||||
|
# focinho preto subindo pelo dorso do nariz até entre os olhos
|
||||||
|
('muzzle',[(96,384),(102,352),(108,322),(114,296),(132,284),(150,266),(164,258),(176,268),(184,294),(196,322),(206,352),(200,374),(170,392),(130,404),(104,398)]),
|
||||||
]
|
]
|
||||||
# Interior das orelhas (escuro, como no animal real).
|
|
||||||
EAR_IN = [
|
|
||||||
[(53, 9), (50, 3), (47, 10), (45, 20), (47, 27), (51, 24), (54, 15)],
|
|
||||||
[(27.5, 8), (25, 4), (23, 14), (22, 24), (25, 27), (28, 20)],
|
|
||||||
]
|
|
||||||
WX0, WSCALE = 64.0, 88.0 # nariz em x=152 (margem de 8 à direita)
|
|
||||||
Y0, YS = 6.0, 88.0 # topo das orelhas em y=6, base em y=94 # x do desenho onde wx=0 e largura de 100 unidades do lobo
|
|
||||||
|
|
||||||
|
from PIL import ImageFilter
|
||||||
def to_wolf(x, y):
|
REF = sys.argv[1] # recorte da cabeça da foto de referência (390x460), não versionado
|
||||||
return (x - WX0) * 100.0 / WSCALE, y * 100.0 / H
|
img=np.array(Image.open(REF).convert('RGB').filter(ImageFilter.MedianFilter(9)).filter(ImageFilter.GaussianBlur(4))).astype(float)
|
||||||
|
Hc,Wc=img.shape[:2]
|
||||||
|
rnd=random.Random(7)
|
||||||
def wolf_at(x, y):
|
# contorno: estende o pescoço para a esquerda (depois do espelhamento)
|
||||||
wx, wy = to_wolf(x, y)
|
C=[p for p in OUT if p[0]<=500]
|
||||||
if not _inside(WOLF, wx, wy):
|
def inside(poly,x,y):
|
||||||
return False
|
c=False; j=len(poly)-1
|
||||||
return math.hypot(wx - 71.0, wy - 49.0) >= 1.7 # olho
|
|
||||||
|
|
||||||
|
|
||||||
def ear_in(x, y):
|
|
||||||
wx, wy = to_wolf(x, y)
|
|
||||||
return any(_inside(p, wx, wy) for p in EAR_IN)
|
|
||||||
|
|
||||||
|
|
||||||
def _inside(poly, x, y):
|
|
||||||
c = False
|
|
||||||
j = len(poly) - 1
|
|
||||||
for i in range(len(poly)):
|
for i in range(len(poly)):
|
||||||
xi, yi = poly[i]
|
xi,yi=poly[i]; xj,yj=poly[j]
|
||||||
xj, yj = poly[j]
|
if (yi>y)!=(yj>y) and x<(xj-xi)*(y-yi)/(yj-yi)+xi: c=not c
|
||||||
if (yi > y) != (yj > y) and x < (xj - xi) * (y - yi) / (yj - yi) + xi:
|
j=i
|
||||||
c = not c
|
|
||||||
j = i
|
|
||||||
return c
|
return c
|
||||||
|
# pontos: contorno reamostrado + traços anatômicos + preenchimento com jitter
|
||||||
|
pts=[]
|
||||||
def smooth(t):
|
for i in range(len(C)):
|
||||||
t = max(0.0, min(1.0, t))
|
a=C[i]; b=C[(i+1)%len(C)]; n=max(1,int(math.dist(a,b)/16))
|
||||||
return t * t * (3 - 2 * t)
|
for k in range(n): pts.append((a[0]+(b[0]-a[0])*k/n, a[1]+(b[1]-a[1])*k/n))
|
||||||
|
FEAT=[(125,270),(200,268),(110,300),(160,286),(185,300),(100,383),(118,404),(150,396),(200,360),
|
||||||
|
(215,330),(260,322),(300,318),(310,350),(270,386),(140,140),(110,190),(80,120),(255,100),(270,150),(225,160),
|
||||||
def mix(c1, c2, t):
|
(205,110),(175,180),(230,230),(150,230),(300,200),(340,250),(320,170),(360,330),(400,260),(450,330),(260,280)]
|
||||||
t = max(0.0, min(1.0, t))
|
pts+=FEAT
|
||||||
a = [int(c1[i:i + 2], 16) for i in (1, 3, 5)]
|
# vértices nas bordas das regiões: as facetas seguem os contornos das cores
|
||||||
b = [int(c2[i:i + 2], 16) for i in (1, 3, 5)]
|
for k_,Z in ZONES:
|
||||||
return "#" + "".join(f"{round(p + (q - p) * t):02x}" for p, q in zip(a, b))
|
for i in range(len(Z)):
|
||||||
|
a=Z[i]; b=Z[(i+1)%len(Z)]; n=max(1,int(math.dist(a,b)/18))
|
||||||
|
for j in range(n):
|
||||||
def smooth_path(pts, dup=()):
|
q=(a[0]+(b[0]-a[0])*j/n, a[1]+(b[1]-a[1])*j/n)
|
||||||
"""Curva fechada (Catmull-Rom -> Bézier); `dup` = índices de quinas vivas."""
|
if inside(C,*q) and min(math.dist(q,p_) for p_ in pts)>6: pts.append(q)
|
||||||
P = []
|
sp=24
|
||||||
for i, p in enumerate(pts):
|
for y in np.arange(20,470,sp):
|
||||||
P.append(p)
|
for x in np.arange(20,510,sp):
|
||||||
if i in dup:
|
jx,jy=x+rnd.uniform(-8,8),y+rnd.uniform(-8,8)
|
||||||
P.append(p)
|
if inside(C,jx,jy) and min(math.dist((jx,jy),p) for p in pts)>15: pts.append((jx,jy))
|
||||||
n = len(P)
|
P=np.array(pts)
|
||||||
d = f"M{P[0][0]:.2f},{P[0][1]:.2f}"
|
tri=Delaunay(P)
|
||||||
for i in range(n):
|
def sample(t):
|
||||||
p0, p1, p2, p3 = P[(i - 1) % n], P[i], P[(i + 1) % n], P[(i + 2) % n]
|
a,b,c=P[t]
|
||||||
c1 = (p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6)
|
cols=[]
|
||||||
c2 = (p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6)
|
for _ in range(40):
|
||||||
d += f"C{c1[0]:.2f},{c1[1]:.2f} {c2[0]:.2f},{c2[1]:.2f} {p2[0]:.2f},{p2[1]:.2f}"
|
u,v=rnd.random(),rnd.random()
|
||||||
return d + "Z"
|
if u+v>1: u,v=1-u,1-v
|
||||||
|
x,y=a+(b-a)*u+(c-a)*v
|
||||||
|
x=min(max(x,0),Wc-1); y=min(max(y,0),Hc-1)
|
||||||
def tx(pts):
|
if x>380: x=380-(x-380)*0.2 # o pescoço além da foto herda a cor da borda
|
||||||
return [(WX0 + x * WSCALE / 100.0, Y0 + y * YS / 100.0) for x, y in pts]
|
cols.append(img[int(y),int(x)])
|
||||||
|
m=np.mean(cols,axis=0); return m
|
||||||
|
RAMP=["#083a45","#0f766e","#14b8a6","#5eead4","#c9faf1"]
|
||||||
def lerp(a, b, t):
|
def tone(rgb):
|
||||||
return a + (b - a) * t
|
r,g,b=rgb; L=(0.299*r+0.587*g+0.114*b)/255
|
||||||
|
TH=[0.17,0.30,0.50,0.64]
|
||||||
|
return RAMP[sum(L>t for t in TH)]
|
||||||
def build(pal, scatter=1.0, seed=5, uid="a", x_min=8.0):
|
def hx(c): return tuple(int(c[i:i+2],16) for i in (1,3,5))
|
||||||
rnd = random.Random(seed)
|
def mix(c1,c2,t):
|
||||||
wolf = tx(WOLF)
|
a,b=hx(c1),hx(c2); return "#"+"".join(f"{round(p+(q-p)*t):02x}" for p,q in zip(a,b))
|
||||||
corners = {i for i, (_, y) in enumerate(WOLF) if y >= 99.5 or y <= 0.6} # pontas e cantos vivos
|
BASE={'muzzle':("#07323c","#0d5563"),'mane':("#0b4f5c","#0f766e"),'pale':("#9ef0e2","#e3fdf8"),'face':("#0f9e94","#3fdcc8"),'brow':("#1fb9a9","#52dccb"),'mask':("#0c7d76","#139c92")}
|
||||||
body = smooth_path(wolf, dup=corners)
|
def zone_of(x,y):
|
||||||
ears = [smooth_path(tx(e)) for e in EAR_IN]
|
for k,P_ in reversed(ZONES):
|
||||||
cols, rows = int(W / CELL), int(H / CELL)
|
if inside(P_,x,y): return k
|
||||||
|
return 'face'
|
||||||
# gradiente da figura (o mesmo para a silhueta e para cada pixel => fusão sem emenda)
|
F=[]
|
||||||
gx0, gy0, gx1, gy1 = 58.0, 0.0, 160.0, 100.0
|
for t in tri.simplices:
|
||||||
stops = pal["stops"]
|
cx,cy=P[t].mean(axis=0)
|
||||||
|
if not inside(C,cx,cy): continue
|
||||||
def grad(x, y):
|
z=zone_of(cx,cy)
|
||||||
dx, dy = gx1 - gx0, gy1 - gy0
|
lo,hi=BASE[z]
|
||||||
t = max(0.0, min(1.0, ((x - gx0) * dx + (y - gy0) * dy) / (dx * dx + dy * dy)))
|
# luz vinda do alto e da frente (focinho), com variação sutil por faceta
|
||||||
for (t0, c0), (t1, c1) in zip(stops, stops[1:]):
|
light=0.55*(1-cy/470)+0.35*(1-min(1,cx/420))+rnd.uniform(-0.12,0.12)
|
||||||
if t <= t1:
|
F.append((t, mix(lo,hi,max(0,min(1,light))), cx, cy))
|
||||||
return mix(c0, c1, (t - t0) / (t1 - t0))
|
# espelha e encaixa no quadro 160x100 da logo
|
||||||
return stops[-1][1]
|
S=92/430
|
||||||
|
def T(x,y): return (150-(x-38)*S, 4+(y-30)*S)
|
||||||
X_SOLID = 80.0 # múltiplo do módulo: a partir daqui a figura é inteira e lisa
|
out=[]
|
||||||
|
for t,col,cx,cy in F:
|
||||||
def ramp(x):
|
q=[T(*P[i]) for i in t]
|
||||||
return min(1.0, max(0.0, x / X_SOLID)) ** 2.0
|
# estilhaços: o pescoço (esquerda) se solta e se desfaz
|
||||||
|
gx=T(cx,cy)[0]
|
||||||
# envelope da "cauda": nasce na largura do pescoço e se afunila para a esquerda
|
k=max(0,(78-gx)/40)
|
||||||
def envelope(x, y):
|
if k>0 and rnd.random()<min(1,k*1.25):
|
||||||
k = smooth((x + 6) / 80.0)
|
mx=sum(p[0] for p in q)/3; my=sum(p[1] for p in q)/3
|
||||||
yc = lerp(70, 62, k)
|
dx=-k*22-rnd.uniform(0,10)*k; dy=-k*6+rnd.uniform(-5,5)*k
|
||||||
hh = lerp(5, 31, k ** 1.15)
|
sc=max(0.25,1-k*0.8)
|
||||||
return math.exp(-(abs(y - yc) / hh) ** 3.0)
|
q=[(mx+dx+(p[0]-mx)*sc, my+dy+(p[1]-my)*sc) for p in q]
|
||||||
|
op=max(0.12,1-k*0.95)
|
||||||
occ = set()
|
else: op=1
|
||||||
|
out.append(f'<polygon points="{" ".join(f"{x:.2f},{y:.2f}" for x,y in q)}" fill="{col}" stroke="{col}" stroke-width="0.25" stroke-linejoin="round"{"" if op==1 else f" fill-opacity=\"{op:.2f}\" stroke-opacity=\"{op:.2f}\""}/>')
|
||||||
def free(cx, cy, n, m=0):
|
eyes="".join(f'<circle cx="{T(x,y)[0]:.2f}" cy="{T(x,y)[1]:.2f}" r="1.25" fill="#04232b"/>' for x,y in EYES)
|
||||||
return all((cx + i, cy + j) not in occ for i in range(-m, n + m) for j in range(-m, n + m))
|
open(sys.argv[2] if len(sys.argv) > 2 else 'guara-logo.svg','w').write(f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 100" role="img" aria-label="Guará">{"".join(out)}{eyes}</svg>\n')
|
||||||
|
|
||||||
def take(cx, cy, n):
|
|
||||||
for i in range(n):
|
|
||||||
for j in range(n):
|
|
||||||
occ.add((cx + i, cy + j))
|
|
||||||
|
|
||||||
mask_sq, free_sq = [], []
|
|
||||||
|
|
||||||
def emit(cx, cy, n, sz_scale, op, gap):
|
|
||||||
x0, y0 = cx * CELL, cy * CELL
|
|
||||||
size = n * CELL
|
|
||||||
sz = size * sz_scale
|
|
||||||
off = (size - sz) / 2
|
|
||||||
cxm, cym = x0 + size / 2, y0 + size / 2
|
|
||||||
inside = _inside(wolf, cxm, cym)
|
|
||||||
if inside and x0 >= 56:
|
|
||||||
# faz parte da figura lisa: vira janela da máscara
|
|
||||||
e = 0.12
|
|
||||||
mask_sq.append(f'<rect x="{x0 - e:.2f}" y="{y0 - e:.2f}" width="{size + 2 * e:.2f}" height="{size + 2 * e:.2f}" fill="#fff"/>')
|
|
||||||
else:
|
|
||||||
free_sq.append(f'<rect x="{x0 + off:.2f}" y="{y0 + off:.2f}" width="{sz:.2f}" height="{sz:.2f}" fill="{grad(cxm, cym)}" fill-opacity="{op:.2f}"/>')
|
|
||||||
|
|
||||||
# 1) campo de pixels da esquerda até a figura: tamanhos em múltiplos do módulo
|
|
||||||
order = [(cx, cy) for cy in range(rows) for cx in range(int(x_min / CELL), int(X_SOLID / CELL))]
|
|
||||||
rnd.shuffle(order)
|
|
||||||
for cx, cy in order:
|
|
||||||
x, y = (cx + 0.5) * CELL, (cy + 0.5) * CELL
|
|
||||||
r, env = ramp(x), envelope(x, y)
|
|
||||||
p = r * env
|
|
||||||
if p < 0.01 or y > 94:
|
|
||||||
continue
|
|
||||||
# blocos grandes na faixa média; sempre 1×1 colados perto da figura
|
|
||||||
n = 1
|
|
||||||
if r < 0.7:
|
|
||||||
big = rnd.random() < 0.9 * (1 - r) * env ** 0.5 * min(1.0, r * 3.2)
|
|
||||||
if big:
|
|
||||||
n = rnd.choice([2, 2, 3]) if r < 0.45 else 2
|
|
||||||
if cx + n > cols or cy + n > rows or not free(cx, cy, n, 0):
|
|
||||||
n = 1
|
|
||||||
if not free(cx, cy, 1, 0):
|
|
||||||
continue
|
|
||||||
acc = p if n == 1 else min(1.0, p * 1.6)
|
|
||||||
if r > 0.88:
|
|
||||||
acc = 1.0 if env > 0.45 else acc
|
|
||||||
if rnd.random() > acc:
|
|
||||||
continue
|
|
||||||
take(cx, cy, n)
|
|
||||||
gap_scale = 1.0 if r > 0.86 else (0.9 - 0.45 * (1 - r)) if n > 1 else rnd.choice([0.5, 0.65, 0.8, 0.9]) * (0.7 + 0.3 * r)
|
|
||||||
op = 0.38 + 0.62 * smooth(r * 1.25)
|
|
||||||
emit(cx, cy, n, gap_scale if r <= 0.86 else 1.02, op, 0)
|
|
||||||
|
|
||||||
# 2) partículas esparsas bem à esquerda e acima/abaixo da cauda (profundidade)
|
|
||||||
placed, tries, target = 0, 0, int(34 * scatter)
|
|
||||||
while placed < target and tries < 6000:
|
|
||||||
tries += 1
|
|
||||||
x = x_min + rnd.random() ** 1.3 * (70 - x_min)
|
|
||||||
cy = rnd.randrange(3, rows - 4)
|
|
||||||
cx = int(x / CELL)
|
|
||||||
y = (cy + 0.5) * CELL
|
|
||||||
env = envelope(x, y)
|
|
||||||
if env > 0.5 or not free(cx, cy, 1, 1):
|
|
||||||
continue
|
|
||||||
r = ramp(x)
|
|
||||||
# sempre perto da cauda, nunca longe demais
|
|
||||||
near = math.exp(-((abs(y - 62) - 26) / 22.0) ** 2)
|
|
||||||
if rnd.random() > 0.55 * near * (0.35 + 0.65 * r):
|
|
||||||
continue
|
|
||||||
take(cx, cy, 1)
|
|
||||||
emit(cx, cy, 1, rnd.choice([0.45, 0.6, 0.75]), 0.22 + 0.38 * r, 0)
|
|
||||||
placed += 1
|
|
||||||
|
|
||||||
ex, ey = tx([(71.0, 49.0)])[0]
|
|
||||||
hx = " ".join(f'<stop offset="{t:g}" stop-color="{c}"/>' for t, c in stops)
|
|
||||||
svg = (
|
|
||||||
"<defs>"
|
|
||||||
f'<linearGradient id="{uid}h" gradientUnits="userSpaceOnUse" x1="{gx0:g}" y1="{gy0:g}" x2="{gx1:g}" y2="{gy1:g}">{hx}</linearGradient>'
|
|
||||||
f'<mask id="{uid}m" maskUnits="userSpaceOnUse" x="0" y="0" width="{W:g}" height="{H:g}"><g shape-rendering="crispEdges">'
|
|
||||||
f'<rect x="{X_SOLID:g}" y="0" width="{W - X_SOLID + 1:g}" height="{H:g}" fill="#fff"/>'
|
|
||||||
+ "".join(mask_sq)
|
|
||||||
+ "</g></mask></defs>"
|
|
||||||
f'<g mask="url(#{uid}m)"><path d="{body}" fill="url(#{uid}h)"/>'
|
|
||||||
+ "".join(f'<path d="{e}" fill="{pal["ear"]}" fill-opacity="{pal["ear_op"]}"/>' for e in ears)
|
|
||||||
+ "</g>"
|
|
||||||
+ '<g shape-rendering="crispEdges">' + "".join(free_sq) + "</g>"
|
|
||||||
+ f'<circle cx="{ex:.2f}" cy="{ey:.2f}" r="1.35" fill="{pal["eye"]}"/>'
|
|
||||||
)
|
|
||||||
return svg
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
# Marca larga: funciona em fundo claro e escuro. Verde-azulado -> azul petróleo.
|
|
||||||
pal = dict(stops=[(0.0, "#3BE3CC"), (0.45, "#12B5A8"), (1.0, "#0B6A86")], ear="#05323a", ear_op=0.5, eye="#ecfeff")
|
|
||||||
(OUT / "guara-logo.svg").write_text(
|
|
||||||
f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {W:g} {H:g}" role="img" aria-label="Guará">' + build(pal, uid="w") + "</svg>\n"
|
|
||||||
)
|
|
||||||
# Ícone: fundo petróleo profundo, figura clara.
|
|
||||||
ipal = dict(stops=[(0.0, "#d9fff7"), (0.5, "#8df1e0"), (1.0, "#3fc8cf")], ear="#0b4a55", ear_op=0.45, eye="#083344")
|
|
||||||
(OUT / "guara.svg").write_text(
|
|
||||||
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="Guará">'
|
|
||||||
'<defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0f766e"/><stop offset="1" stop-color="#083344"/></linearGradient>'
|
|
||||||
'<clipPath id="ic"><rect width="128" height="128" rx="29"/></clipPath></defs>'
|
|
||||||
'<rect width="128" height="128" rx="29" fill="url(#bg)"/>'
|
|
||||||
'<g clip-path="url(#ic)"><g transform="translate(-13 18) scale(0.86)">' + build(ipal, scatter=0.5, seed=9, uid="i", x_min=30.0) + "</g></g></svg>\n"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
Reference in new issue
Block a user