#!/usr/bin/env python3
"""FARBTON UND HELLIGKEIT der Android-Oberflaeche gegen die Sollfarben
aus lib/android/ui.fi.

Warum beides und nicht nur Helligkeit: RGB(59,41,30) und RGB(30,41,59)
haben exakt dieselbe Helligkeit und sind zwei verschiedene Farben. Bei
OrientOS hat genau das eine R/B-Vertauschung durchgelassen. Jede
Sollfarbe wird deshalb EINZELN gesucht, und der Fall "gedreht" wird
ausdruecklich benannt.
"""
import sys, collections

SOLL = {
 'C_BAR':   'FFFFFF',   # die Leiste
 'C_PILL':  'F1F3F4',   # Feld der Adresszeile
 'C_TEXT':  '202124',   # Text, laut
 'C_DIM':   '5F6368',   # Text und Zeichen, leise
 'C_LINE':  'DADCE0',   # Trennlinien
 'C_BLUE':  '1A73E8',   # Ladebalken
}

def ppm(pfad):
    d = open(pfad,'rb').read()
    t=[]; i=0
    while len(t)<4:
        while i<len(d) and d[i:i+1].isspace(): i+=1
        if d[i:i+1]==b'#':
            while d[i:i+1]!=b'\n': i+=1
            continue
        j=i
        while j<len(d) and not d[j:j+1].isspace(): j+=1
        t.append(d[i:j]); i=j
    i+=1
    w,h=int(t[1]),int(t[2])
    return w,h,d[i:i+w*h*3]

pfad=sys.argv[1]
w,h,b=ppm(pfad)
z=collections.Counter()
for y in range(h):
    o=y*w*3
    for x in range(0,w,2):
        p=o+x*3
        z[(b[p],b[p+1],b[p+2])]+=1
ges=sum(z.values())
print("== %s  %dx%d ==" % (pfad.split('/')[-1],w,h))
fehler=0
for name,hx in SOLL.items():
    sr,sg,sb=int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16)
    n=z.get((sr,sg,sb),0)
    hell=0.2126*sr+0.7152*sg+0.0722*sb
    if n>0:
        print("  %-8s #%s  EXAKT, %7d Punkte (%5.2f %%)  Hell %5.1f"
              % (name,hx,n,100.0*n/ges,hell))
        continue
    nd=z.get((sb,sg,sr),0)
    if nd>0 and sr!=sb:
        print("  %-8s #%s  !!! ROT UND BLAU VERTAUSCHT (%d Punkte)" % (name,hx,nd))
        fehler+=1
        continue
    best,bd=None,10**9
    for c,k in z.items():
        d2=abs(c[0]-sr)+abs(c[1]-sg)+abs(c[2]-sb)
        if d2<bd: best,bd=c,d2
    if bd<=3:
        print("  %-8s #%s  gleich bis auf Rundung (%s, Abstand %d)" % (name,hx,best,bd))
    else:
        print("  %-8s #%s  nicht im Bild (naechste %s, Abstand %d)" % (name,hx,best,bd))
print("  ---")
print("  %d Kanalvertauschungen" % fehler)
sys.exit(1 if fehler else 0)
