Files
2026-09-11 12:47:00 +02:00

99 lines
3.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Erzeugt die Symbole der Erweiterung.
Gezeichnet wird achtfach vergroessert und anschliessend heruntergerechnet -
bei 42x42 Pixeln ist das der einzige Weg zu sauberen Kanten.
Aufruf: python3 tools/make_icons.py
"""
import os
from PIL import Image, ImageDraw
SCALE = 8
TARGET = 42
BIG = TARGET * SCALE
PAPER = (255, 255, 255, 255)
INK = (61, 56, 70, 255) # Rahmen und Trennlinie
TEXT = (154, 153, 150, 255) # unveraenderter Text
INSERT = (26, 95, 180, 255) # Einfuegung
DELETE = (165, 29, 45, 255) # Loeschung
BLACK = (0, 0, 0, 255)
WHITE = (255, 255, 255, 255)
# Zeilenraster: (y, Breite links, Breite rechts, Farbrolle rechts)
ROWS = (
(0.22, 1.00, 1.00, "equal"),
(0.38, 1.00, 0.85, "insert"),
(0.54, 1.00, 1.00, "equal"),
(0.70, 1.00, 0.55, "delete"),
)
def draw(colors, border):
img = Image.new("RGBA", (BIG, BIG), (0, 0, 0, 0))
pen = ImageDraw.Draw(img)
margin = int(BIG * 0.09)
box = (margin, margin, BIG - margin, BIG - margin)
radius = int(BIG * 0.08)
pen.rounded_rectangle(box, radius=radius, fill=colors["paper"],
outline=colors["ink"], width=border)
middle = BIG // 2
pen.line([(middle, margin + border), (middle, BIG - margin - border)],
fill=colors["ink"], width=max(2, border // 2))
pad = int(BIG * 0.16)
left_start, left_end = pad, middle - int(BIG * 0.06)
right_start, right_end = middle + int(BIG * 0.06), BIG - pad
height = int(BIG * 0.075)
bar_radius = height // 2
for y_rel, w_left, w_right, role in ROWS:
y = int(BIG * y_rel)
span = left_end - left_start
pen.rounded_rectangle(
(left_start, y, left_start + int(span * w_left), y + height),
radius=bar_radius, fill=colors["text"])
span = right_end - right_start
pen.rounded_rectangle(
(right_start, y, right_start + int(span * w_right), y + height),
radius=bar_radius, fill=colors[role])
return img
def save(img, path, size):
os.makedirs(os.path.dirname(path), exist_ok=True)
img.resize((size, size), Image.LANCZOS).save(path, "PNG", optimize=True)
print("%s %dx%d" % (path, size, size))
def main():
here = os.path.dirname(os.path.abspath(__file__))
root = os.path.dirname(here)
normal = draw({"paper": PAPER, "ink": INK, "text": TEXT,
"equal": TEXT, "insert": INSERT, "delete": DELETE},
border=int(BIG * 0.022))
# Hoher Kontrast: nur Schwarz und Weiss, kraeftigerer Rahmen. Die
# Unterscheidung der Zeilen traegt hier allein ueber die Laenge.
contrast = draw({"paper": WHITE, "ink": BLACK, "text": BLACK,
"equal": BLACK, "insert": BLACK, "delete": BLACK},
border=int(BIG * 0.04))
save(normal, os.path.join(root, "icon", "synopse.png"), TARGET)
save(contrast, os.path.join(root, "icon", "synopse_hc.png"), TARGET)
save(normal, os.path.join(root, "icon", "synopse-256.png"), 256)
if __name__ == "__main__":
main()