04/16 Upload codebase
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""
|
||||
Generate PassKeeper extension icons (16×16, 48×48, 128×128 PNG).
|
||||
|
||||
Requires Pillow (already a project dependency via qrcode[pil]):
|
||||
python extension/make_icons.py
|
||||
"""
|
||||
import os
|
||||
import math
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
SIZES = [16, 48, 128]
|
||||
OUT_DIR = os.path.join(os.path.dirname(__file__), 'icons')
|
||||
BG_COLOR = '#1a73e8' # Google-blue background
|
||||
FG_COLOR = '#ffffff' # White lock
|
||||
|
||||
|
||||
def draw_icon(size: int) -> Image.Image:
|
||||
img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# Rounded-rectangle background
|
||||
pad = max(1, size // 10)
|
||||
draw.rounded_rectangle(
|
||||
[pad, pad, size - pad - 1, size - pad - 1],
|
||||
radius=max(2, size // 6),
|
||||
fill=BG_COLOR,
|
||||
)
|
||||
|
||||
# ── Lock body (rectangle with rounded bottom) ──────────────────────────
|
||||
bx = size * 0.28
|
||||
by = size * 0.50
|
||||
bw = size * 0.44
|
||||
bh = size * 0.36
|
||||
draw.rounded_rectangle(
|
||||
[bx, by, bx + bw, by + bh],
|
||||
radius=max(1, int(size * 0.07)),
|
||||
fill=FG_COLOR,
|
||||
)
|
||||
|
||||
# Keyhole
|
||||
kr = max(1, int(size * 0.07))
|
||||
kx = size / 2
|
||||
ky = by + bh * 0.40
|
||||
draw.ellipse([kx - kr, ky - kr, kx + kr, ky + kr], fill=BG_COLOR)
|
||||
# Small stem below the hole
|
||||
stem_w = max(1, int(size * 0.06))
|
||||
draw.rectangle(
|
||||
[kx - stem_w, ky, kx + stem_w, ky + bh * 0.30],
|
||||
fill=BG_COLOR,
|
||||
)
|
||||
|
||||
# ── Shackle (arc) ──────────────────────────────────────────────────────
|
||||
sw = max(1, int(size * 0.09)) # stroke width
|
||||
slm = size * 0.28 # left margin of shackle oval
|
||||
srm = size * 0.72 # right margin
|
||||
st = size * 0.15 # top of shackle
|
||||
sb = size * 0.58 # bottom of shackle (overlaps lock body top)
|
||||
|
||||
# Draw as thick arc by layering concentric arcs
|
||||
for offset in range(sw):
|
||||
f = offset / max(sw - 1, 1)
|
||||
draw.arc(
|
||||
[slm + offset, st + offset, srm - offset, sb - offset],
|
||||
start=180, end=0,
|
||||
fill=FG_COLOR,
|
||||
width=1,
|
||||
)
|
||||
|
||||
# Simpler approach: draw white arc with width parameter (Pillow 8+)
|
||||
try:
|
||||
draw.arc(
|
||||
[slm, st, srm, sb],
|
||||
start=180, end=0,
|
||||
fill=FG_COLOR,
|
||||
width=sw,
|
||||
)
|
||||
except TypeError:
|
||||
pass # older Pillow — arcs from the loop above are sufficient
|
||||
|
||||
return img
|
||||
|
||||
|
||||
def main():
|
||||
os.makedirs(OUT_DIR, exist_ok=True)
|
||||
for s in SIZES:
|
||||
path = os.path.join(OUT_DIR, f'icon{s}.png')
|
||||
draw_icon(s).save(path, 'PNG')
|
||||
print(f' OK {path}')
|
||||
print('Icons generated.')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user