#!/usr/bin/env python3
"""
Genera il velo: la sfumatura nera che sta fra la foto di una ricetta e il testo
scritto sopra.

Perche' un'immagine e non un gradiente vero: React Native 0.86 sa disegnare un
`linear-gradient` solo dietro `experimental_backgroundImage`, che la sua stessa
documentazione dice di non usare in produzione; quello stabile arriva con la
0.87. L'alternativa sarebbe expo-linear-gradient, cioe' una dipendenza nativa in
piu' su un progetto che non e' ancora mai stato compilato sul serio. Una PNG di
un pixel di larghezza, stirata, fa esattamente la stessa cosa, pesa qualche
centinaio di byte e non tocca il progetto nativo.

La curva e' la smoothstep 3t^2-2t^3: parte con derivata nulla, quindi in cima
non si vede dove comincia — la riga netta di un gradiente lineare tagliato e' il
difetto che tradisce il velo messo li' per far leggere il testo.

Al piede il nero e' pieno: e' quello che rende il contrasto indipendente dalla
fotografia sotto. Il titolo si posiziona dove la curva sta sopra 0,65, che sulla
foto bianca — il caso peggiore — da' 6,5:1, oltre la soglia di 4,5:1.

Si rilancia con: python3 scripts/genera-velo.py
"""
from pathlib import Path

from PIL import Image

ALTEZZA = 512
USCITA = Path(__file__).resolve().parent.parent / 'assets' / 'velo.png'


def smoothstep(t: float) -> float:
    return t * t * (3.0 - 2.0 * t)


def main() -> None:
    velo = Image.new('RGBA', (1, ALTEZZA), (0, 0, 0, 0))
    pixel = velo.load()
    for y in range(ALTEZZA):
        t = y / (ALTEZZA - 1)
        pixel[0, y] = (0, 0, 0, round(255 * smoothstep(t)))
    USCITA.parent.mkdir(parents=True, exist_ok=True)
    velo.save(USCITA, optimize=True)

    controlli = [(0.50, 0.500), (0.62, 0.657), (0.75, 0.844), (0.90, 0.972), (1.00, 1.000)]
    print(f'scritto {USCITA} ({USCITA.stat().st_size} byte)')
    for t, atteso in controlli:
        alpha = pixel[0, round(t * (ALTEZZA - 1))][3] / 255
        print(f'  t={t:.2f}  alpha={alpha:.3f}  (atteso {atteso:.3f})')


if __name__ == '__main__':
    main()
