diff --git a/android/res/mipmap-hdpi/ic_launcher.png b/android/res/mipmap-hdpi/ic_launcher.png
index 33866dc..532599a 100644
Binary files a/android/res/mipmap-hdpi/ic_launcher.png and b/android/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/res/mipmap-mdpi/ic_launcher.png b/android/res/mipmap-mdpi/ic_launcher.png
index 5dd2044..cbbdedb 100644
Binary files a/android/res/mipmap-mdpi/ic_launcher.png and b/android/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/res/mipmap-xhdpi/ic_launcher.png b/android/res/mipmap-xhdpi/ic_launcher.png
index 4526bc4..a346e1e 100644
Binary files a/android/res/mipmap-xhdpi/ic_launcher.png and b/android/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/res/mipmap-xxhdpi/ic_launcher.png b/android/res/mipmap-xxhdpi/ic_launcher.png
index 401a2c3..8700b3e 100644
Binary files a/android/res/mipmap-xxhdpi/ic_launcher.png and b/android/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/res/mipmap-xxxhdpi/ic_launcher.png b/android/res/mipmap-xxxhdpi/ic_launcher.png
index 09c7fc1..4499799 100644
Binary files a/android/res/mipmap-xxxhdpi/ic_launcher.png and b/android/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/branding/fry3dx.icns b/branding/fry3dx.icns
new file mode 100644
index 0000000..97056f3
Binary files /dev/null and b/branding/fry3dx.icns differ
diff --git a/branding/fry3dx.ico b/branding/fry3dx.ico
index 09318c3..447b6be 100644
Binary files a/branding/fry3dx.ico and b/branding/fry3dx.ico differ
diff --git a/branding/icon.png b/branding/icon.png
index bb30490..e194f74 100644
Binary files a/branding/icon.png and b/branding/icon.png differ
diff --git a/branding/logo.png b/branding/logo.png
index 76db8f9..470db04 100644
Binary files a/branding/logo.png and b/branding/logo.png differ
diff --git a/branding/logo.svg b/branding/logo.svg
index 2ca9d95..774bfcd 100644
--- a/branding/logo.svg
+++ b/branding/logo.svg
@@ -1,34 +1,144 @@
diff --git a/content/Fry3DX/branding/icon.png b/content/Fry3DX/branding/icon.png
index bb30490..e194f74 100644
Binary files a/content/Fry3DX/branding/icon.png and b/content/Fry3DX/branding/icon.png differ
diff --git a/content/Fry3DX/branding/logo.png b/content/Fry3DX/branding/logo.png
index 76db8f9..470db04 100644
Binary files a/content/Fry3DX/branding/logo.png and b/content/Fry3DX/branding/logo.png differ
diff --git a/docs/img/icon.png b/docs/img/icon.png
index bb30490..e194f74 100644
Binary files a/docs/img/icon.png and b/docs/img/icon.png differ
diff --git a/docs/img/logo.png b/docs/img/logo.png
new file mode 100644
index 0000000..2ef7bc4
Binary files /dev/null and b/docs/img/logo.png differ
diff --git a/docs/img/logo.svg b/docs/img/logo.svg
index 2ca9d95..774bfcd 100644
--- a/docs/img/logo.svg
+++ b/docs/img/logo.svg
@@ -1,34 +1,144 @@
diff --git a/tools/branding.py b/tools/branding.py
new file mode 100644
index 0000000..10b5b02
--- /dev/null
+++ b/tools/branding.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+"""Makes every picture of the logo from branding/logo.svg (needs Inkscape):
+the app's own (content/), the Windows .ico, the macOS .icns, Android's launcher icons and
+the website's. python3 tools/branding.py"""
+import os, shutil, struct, subprocess, sys, tempfile
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+SVG = os.path.join(ROOT, "branding", "logo.svg")
+
+
+def render(size, out):
+ subprocess.run(["inkscape", SVG, "-w", str(size), "-h", str(size), "-o", out], check=True, capture_output=True)
+
+
+def ico(pngs, out): # an .ico of PNGs (Vista and newer read them)
+ data = [open(p, "rb").read() for _, p in pngs]
+ head = struct.pack("= 256 else size
+ head += struct.pack("I", 8 + len(d)) + d
+ open(out, "wb").write(b"icns" + struct.pack(">I", 8 + len(body)) + body)
+
+
+def main():
+ if not shutil.which("inkscape"):
+ sys.exit("needs inkscape")
+ with tempfile.TemporaryDirectory() as tmp:
+ sizes = {}
+ for s in (16, 24, 32, 48, 64, 72, 96, 128, 144, 192, 256, 512, 1024):
+ sizes[s] = os.path.join(tmp, f"{s}.png")
+ render(s, sizes[s])
+ copy = lambda s, *to: shutil.copyfile(sizes[s], os.path.join(ROOT, *to))
+ copy(256, "branding", "logo.png")
+ copy(64, "branding", "icon.png")
+ copy(256, "content", "Fry3DX", "branding", "logo.png")
+ copy(64, "content", "Fry3DX", "branding", "icon.png")
+ copy(64, "docs", "img", "icon.png")
+ copy(512, "docs", "img", "logo.png")
+ shutil.copyfile(SVG, os.path.join(ROOT, "docs", "img", "logo.svg"))
+ for d, s in (("mdpi", 48), ("hdpi", 72), ("xhdpi", 96), ("xxhdpi", 144), ("xxxhdpi", 192)):
+ copy(s, "android", "res", f"mipmap-{d}", "ic_launcher.png")
+ ico([(s, sizes[s]) for s in (16, 24, 32, 48, 64, 128, 256)], os.path.join(ROOT, "branding", "fry3dx.ico"))
+ icns([(s, sizes[s]) for s in (16, 32, 64, 128, 256, 512, 1024)], os.path.join(ROOT, "branding", "fry3dx.icns"))
+ print("done")
+
+
+if __name__ == "__main__":
+ main()