<s> import operator <EOL> import math <EOL> __version__ = "<STR_LIT>" <EOL> m = [ <EOL> [ <NUM_LIT> , - <NUM_LIT> , - <NUM_LIT> ] , <EOL> [ - <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , - <NUM_LIT> , <NUM_LIT> ] <EOL> ] <EOL> m_inv = [ <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , <EOL> [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] <EOL> ] <EOL> refX = <NUM_LIT> <EOL> refY = <NUM_LIT> <EOL> refZ = <NUM_LIT> <EOL> refU = <NUM_LIT> <EOL> refV = <NUM_LIT> <EOL> lab_e = <NUM_LIT> <EOL> lab_k = <NUM_LIT> <EOL> def husl_to_rgb ( h , s , l ) : <EOL> return lch_to_rgb ( * husl_to_lch ( [ h , s , l ] ) ) <EOL> def husl_to_hex ( h , s , l ) : <EOL> return rgb_to_hex ( husl_to_rgb ( h , s , l ) ) <EOL> def rgb_to_husl ( r , g , b ) : <EOL> return lch_to_husl ( rgb_to_lch ( r , g , b ) ) <EOL> def hex_to_husl ( hex ) : <EOL> return rgb_to_husl ( * hex_to_rgb ( hex ) ) <EOL> def huslp_to_rgb ( h , s , l ) : <EOL> return lch_to_rgb ( * huslp_to_lch ( [ h , s , l ] ) ) <EOL> def huslp_to_hex ( h , s , l ) : <EOL> return rgb_to_hex ( huslp_to_rgb ( h , s , l ) ) <EOL> def rgb_to_huslp ( r , g , b ) : <EOL> return lch_to_huslp ( rgb_to_lch ( r , g , b ) ) <EOL> def hex_to_huslp ( hex ) : <EOL> return rgb_to_huslp ( * hex_to_rgb ( hex ) ) <EOL> def lch_to_rgb ( l , c , h ) : <EOL> return xyz_to_rgb ( luv_to_xyz ( lch_to_luv ( [ l , c , h ] ) ) ) <EOL> def rgb_to_lch ( r , g , b ) : <EOL> return luv_to_lch ( xyz_to_luv ( rgb_to_xyz ( [ r , g , b ] ) ) ) <EOL> def max_chroma ( L , H ) : <EOL> hrad = math . radians ( H ) <EOL> sinH = ( math . sin ( hrad ) ) <EOL> cosH = ( math . cos ( hrad ) ) <EOL> sub1 = ( math . pow ( L + <NUM_LIT:16> , <NUM_LIT> ) / <NUM_LIT> ) <EOL> sub2 = sub1 if sub1 > <NUM_LIT> else ( L / <NUM_LIT> ) <EOL> result = float ( "<STR_LIT>" ) <EOL> for row in m : <EOL> m1 = row [ <NUM_LIT:0> ] <EOL> m2 = row [ <NUM_LIT:1> ] <EOL> m3 = row [ <NUM_LIT:2> ] <EOL> top = ( ( <NUM_LIT> * m1 + <NUM_LIT> * m2 + <NUM_LIT> * m3 ) * sub2 ) <EOL> rbottom = ( <NUM_LIT> * m3 - <NUM_LIT> * m2 ) <EOL> lbottom = ( <NUM_LIT> * m3 - <NUM_LIT> * m1 ) <EOL> bottom = ( rbottom * sinH + lbottom * cosH ) * sub2 <EOL> for t in ( <NUM_LIT:0.0> , <NUM_LIT:1.0> ) : <EOL> C = ( L * ( top - <NUM_LIT> * t ) / ( bottom + <NUM_LIT> * sinH * t ) ) <EOL> if C > <NUM_LIT:0.0> and C < result : <EOL> result = C <EOL> return result <EOL> def _hrad_extremum ( L ) : <EOL> lhs = ( math . pow ( L , <NUM_LIT> ) + <NUM_LIT> * math . pow ( L , <NUM_LIT> ) + <NUM_LIT> * L + <NUM_LIT> ) / <NUM_LIT> <EOL> rhs = <NUM_LIT> / <NUM_LIT> <EOL> sub = lhs if lhs > rhs else <NUM_LIT> * L / <NUM_LIT> <EOL> chroma = float ( "<STR_LIT>" ) <EOL> result = None <EOL> for row in m : <EOL> for limit in ( <NUM_LIT:0.0> , <NUM_LIT:1.0> ) : <EOL> [ m1 , m2 , m3 ] = row <EOL> top = - <NUM_LIT> * m3 * sub + <NUM_LIT> * m2 * sub - <NUM_LIT> * limit <EOL> bottom = <NUM_LIT> * m1 * sub - <NUM_LIT> * m3 * sub <EOL> hrad = math . atan2 ( top , bottom ) <EOL> if limit == <NUM_LIT:0.0> : <EOL> hrad += math . pi <EOL> test = max_chroma ( L , math . degrees ( hrad ) ) <EOL> if test < chroma : <EOL> chroma = test <EOL> result = hrad <EOL> return result <EOL> def max_chroma_pastel ( L ) : <EOL> H = math . degrees ( _hrad_extremum ( L ) ) <EOL> return max_chroma ( L , H ) <EOL> def dot_product ( a , b ) : <EOL> return sum ( map ( operator . mul , a , b ) ) <EOL> def f ( t ) : <EOL> if t > lab_e : <EOL> return ( math . pow ( t , <NUM_LIT:1.0> / <NUM_LIT> ) ) <EOL> else : <EOL> return ( <NUM_LIT> * t + <NUM_LIT> / <NUM_LIT> ) <EOL> def f_inv ( t ) : <EOL> if math . pow ( t , <NUM_LIT> ) > lab_e : <EOL> return ( math . pow ( t , <NUM_LIT> ) ) <EOL> else : <EOL> return ( <NUM_LIT> * t - <NUM_LIT> ) / lab_k <EOL> def from_linear ( c ) : <EOL> if c <= <NUM_LIT> : <EOL> return <NUM_LIT> * c <EOL> else : <EOL> return ( <NUM_LIT> * math . pow ( c , <NUM_LIT:1.0> / <NUM_LIT> ) - <NUM_LIT> ) <EOL> def to_linear ( c ) : <EOL> a = <NUM_LIT> <EOL> if c > <NUM_LIT> : <EOL> return ( math . pow ( ( c + a ) / ( <NUM_LIT:1.0> + a ) , <NUM_LIT> ) ) <EOL> else : <EOL> return ( c / <NUM_LIT> ) <EOL> def rgb_prepare ( triple ) : <EOL> ret = [ ] <EOL> for ch in triple : <EOL> ch = round ( ch , <NUM_LIT:3> ) <EOL> if ch < - <NUM_LIT> or ch > <NUM_LIT> : <EOL> raise Exception ( "<STR_LIT>" % ch ) <EOL> if ch < <NUM_LIT:0> : <EOL> ch = <NUM_LIT:0> <EOL> if ch > <NUM_LIT:1> : <EOL> ch = <NUM_LIT:1> <EOL> ret . append ( round ( ch * <NUM_LIT:255> + <NUM_LIT> , <NUM_LIT:0> ) ) <EOL> return ret <EOL> def hex_to_rgb ( hex ) : <EOL> if hex . startswith ( '<STR_LIT:#>' ) : <EOL> hex = hex [ <NUM_LIT:1> : ] <EOL> r = int ( hex [ <NUM_LIT:0> : <NUM_LIT:2> ] , <NUM_LIT:16> ) / <NUM_LIT> <EOL> g = int ( hex [ <NUM_LIT:2> : <NUM_LIT:4> ] , <NUM_LIT:16> ) / <NUM_LIT> <EOL> b = int ( hex [ <NUM_LIT:4> : <NUM_LIT:6> ] , <NUM_LIT:16> ) / <NUM_LIT> <EOL> return [ r , g , b ] <EOL> def rgb_to_hex ( triple ) : <EOL> [ r , g , b ] = triple <EOL> return '<STR_LIT>' % tuple ( rgb_prepare ( [ r , g , b ] ) ) <EOL> def xyz_to_rgb ( triple ) : <EOL> xyz = map ( lambda row : dot_product ( row , triple ) , m ) <EOL> return list ( map ( from_linear , xyz ) ) <EOL> def rgb_to_xyz ( triple ) : <EOL> rgbl = list ( map ( to_linear , triple ) ) <EOL> return list ( map ( lambda row : dot_product ( row , rgbl ) , m_inv ) ) <EOL> def xyz_to_luv ( triple ) : <EOL> X , Y , Z = triple <EOL> if X == Y == Z == <NUM_LIT:0.0> : <EOL> return [ <NUM_LIT:0.0> , <NUM_LIT:0.0> , <NUM_LIT:0.0> ] <EOL> varU = ( <NUM_LIT> * X ) / ( X + ( <NUM_LIT> * Y ) + ( <NUM_LIT> * Z ) ) <EOL> varV = ( <NUM_LIT> * Y ) / ( X + ( <NUM_LIT> * Y ) + ( <NUM_LIT> * Z ) ) <EOL> L = <NUM_LIT> * f ( Y / refY ) - <NUM_LIT> <EOL> if L == <NUM_LIT:0.0> : <EOL> return [ <NUM_LIT:0.0> , <NUM_LIT:0.0> , <NUM_LIT:0.0> ] <EOL> U = <NUM_LIT> * L * ( varU - refU ) <EOL> V = <NUM_LIT> * L * ( varV - refV ) <EOL> return [ L , U , V ] <EOL> def luv_to_xyz ( triple ) : <EOL> L , U , V = triple <EOL> if L == <NUM_LIT:0> : <EOL> return [ <NUM_LIT:0.0> , <NUM_LIT:0.0> , <NUM_LIT:0.0> ] <EOL> varY = f_inv ( ( L + <NUM_LIT> ) / <NUM_LIT> ) <EOL> varU = U / ( <NUM_LIT> * L ) + refU <EOL> varV = V / ( <NUM_LIT> * L ) + refV <EOL> Y = varY * refY <EOL> X = <NUM_LIT:0.0> - ( <NUM_LIT> * Y * varU ) / ( ( varU - <NUM_LIT> ) * varV - varU * varV ) <EOL> Z = ( <NUM_LIT> * Y - ( <NUM_LIT> * varV * Y ) - ( varV * X ) ) / ( <NUM_LIT> * varV ) <EOL> return [ X , Y , Z ] <EOL> def luv_to_lch ( triple ) : <EOL> L , U , V = triple <EOL> C = ( math . pow ( math . pow ( U , <NUM_LIT:2> ) + math . pow ( V , <NUM_LIT:2> ) , ( <NUM_LIT:1.0> / <NUM_LIT> ) ) ) <EOL> hrad = ( math . atan2 ( V , U ) ) <EOL> H = math . degrees ( hrad ) <EOL> if H < <NUM_LIT:0.0> : <EOL> H = <NUM_LIT> + H <EOL> return [ L , C , H ] <EOL> def lch_to_luv ( triple ) : <EOL> L , C , H = triple <EOL> Hrad = math . radians ( H ) <EOL> U = ( math . cos ( Hrad ) * C ) <EOL> V = ( math . sin ( Hrad ) * C ) <EOL> return [ L , U , V ] <EOL> def husl_to_lch ( triple ) : <EOL> H , S , L = triple <EOL> if L > <NUM_LIT> : <EOL> return [ <NUM_LIT:100> , <NUM_LIT:0.0> , H ] <EOL> if L < <NUM_LIT> : <EOL> return [ <NUM_LIT:0.0> , <NUM_LIT:0.0> , H ] <EOL> mx = max_chroma ( L , H ) <EOL> C = mx / <NUM_LIT> * S <EOL> return [ L , C , H ] <EOL> def lch_to_husl ( triple ) : <EOL> L , C , H = triple <EOL> if L > <NUM_LIT> : <EOL> return [ H , <NUM_LIT:0.0> , <NUM_LIT> ] <EOL> if L < <NUM_LIT> : <EOL> return [ H , <NUM_LIT:0.0> , <NUM_LIT:0.0> ] <EOL> mx = max_chroma ( L , H ) <EOL> S = C / mx * <NUM_LIT> <EOL> return [ H , S , L ] <EOL> def huslp_to_lch ( triple ) : <EOL> H , S , L = triple <EOL> if L > <NUM_LIT> : <EOL> return [ <NUM_LIT:100> , <NUM_LIT:0.0> , H ] <EOL> if L < <NUM_LIT> : <EOL> return [ <NUM_LIT:0.0> , <NUM_LIT:0.0> , H ] <EOL> mx = max_chroma_pastel ( L ) <EOL> C = mx / <NUM_LIT> * S <EOL> return [ L , C , H ] <EOL> def lch_to_huslp ( triple ) : <EOL> L , C , H = triple <EOL> if L > <NUM_LIT> : <EOL> return [ H , <NUM_LIT:0.0> , <NUM_LIT> ] <EOL> if L < <NUM_LIT> : <EOL> return [ H , <NUM_LIT:0.0> , <NUM_LIT:0.0> ] <EOL> mx = max_chroma_pastel ( L ) <EOL> S = C / mx * <NUM_LIT> <EOL> return [ H , S , L ] </s>
