
    jke]M                     P   d Z g dZddlmZ ddlmZ d Zd Zdd	Zdd
Z	d Z
ddZddZddZ G d de      Zd ZddZedk(  r`ddlZddlZ eej,                        dkD  r ej.                   e               ej.                   ej0                         j2                         yy)z%Variation fonts interpolation models.)normalizeValuenormalizeLocationsupportScalarpiecewiseLinearMapVariationModel    )noRound   )VariationModelErrorc                 2    | D cg c]  }||	 c}S c c}w N )lstls     9/usr/lib/python3/dist-packages/fontTools/varLib/models.pynonNoner      s    ,!amA,,,s   c                 &    t        d | D              S )Nc              3   $   K   | ]  }|d u  
 y wr   r   .0r   s     r   	<genexpr>zallNone.<locals>.<genexpr>   s     &QqDy&   all)r   s    r   allNoner      s    &#&&&    Nc                 n     t         fd|D              S         t        fd|D              S )Nc              3   (   K   | ]	  }|k(    y wr   r   )r   itemrefs     r   r   zallEqualTo.<locals>.<genexpr>   s     /43$;/s   c              3   4   K   | ]  } |      k(    y wr   r   )r   r   mappedmappers     r   r   zallEqualTo.<locals>.<genexpr>   s     6$v%6   r   )r   r   r"   r!   s   ` `@r   
allEqualTor$      s3    ~/3///C[F6#666r   c                 p    | syt        |       }	 t        |      }t        |||      S # t        $ r Y yw xY w)NT)r"   )iternextStopIterationr$   )r   r"   itfirsts       r   allEqualr+      sD    	cBR eR//  s   ) 	55c                     t        |       t        |      k(  sJ t        ||       D cg c]
  \  }}|s	| c}}S c c}}w r   lenzip)truthr   r   ts       r   subListr2   *   s8    u:S!!!c5//$!QQA///s   
<<c           
      @   |\  }}}||cxk  r|k  sn t        d|dd|dd|d      |st        t        | |      |      } | |k(  s||k(  ry| |k  r||k7  s
| |kD  r||k(  r| |z
  ||z
  z  S | |kD  r||k7  s| |k  r||k(  sJ d|  d| d| d| d	       | |z
  ||z
  z  S )zNormalizes value based on a min/default/max triple.

    >>> normalizeValue(400, (100, 400, 900))
    0.0
    >>> normalizeValue(100, (100, 400, 900))
    -1.0
    >>> normalizeValue(650, (100, 400, 900))
    0.5
    z8Invalid axis values, must be minimum, default, maximum: z3.3fz,         zOoops... v=z
, triple=())
ValueErrormaxmin)vtripleextrapolatelowerdefaultuppers         r   r   r   /   s     #E7EW%%FTl"WTN"U4L:
 	
 Auu%G|u~	G(a'kew>NG%00G 0KEW,	C:eWBwir%B	C 
 G00r   c                     i }|j                         D ]+  \  }}| j                  ||d         }t        |||      ||<   - |S )a  Normalizes location based on axis min/default/max values from axes.

    >>> axes = {"wght": (100, 400, 900)}
    >>> normalizeLocation({"wght": 400}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 100}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 900}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 650}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> axes = {"wght": (0, 0, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 1.0}
    >>> axes = {"wght": (0, 1000, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': -0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 0.0}
    r	   )r;   )itemsgetr   )locationaxesr;   outtagr:   r9   s          r   r   r   N   sR    N Czz| FVLLfQi(!!VECF Jr   c                 6   |r|t        d      d}|j                         D ]  \  }\  }}}	|r/|dk(  r||kD  s||	kD  r|dk  r|	dkD  r(| j                  |d      }
n|| v sJ | |   }
|
|k(  rL|rv||   \  }}|
|k  r2||k  r-||k  r||	k  r||
|	z
  ||	z
  z  z  }y||k  rF||
|z
  ||z
  z  z  }||
k  r2||	k  r-||k  r||k  r||
|z
  ||z
  z  z  }||k  r||
|	z
  ||	z
  z  z  }|
|k  s|	|
k  rd} |S |
|k  r||
|z
  ||z
  z  z  }||
|	z
  ||	z
  z  z  } |S )a  Returns the scalar multiplier at location, for a master
    with support.  If ot is True, then a peak value of zero
    for support of an axis means "axis does not participate".  That
    is how OpenType Variation Font technology works.

    If extrapolate is True, axisRanges must be a dict that maps axis
    names to (axisMin, axisMax) tuples.

      >>> supportScalar({}, {})
      1.0
      >>> supportScalar({'wght':.2}, {})
      1.0
      >>> supportScalar({'wght':.2}, {'wght':(0,2,3)})
      0.1
      >>> supportScalar({'wght':2.5}, {'wght':(0,2,4)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)}, ot=False)
      0.375
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':3}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':-1}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':3}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      1.5
      >>> supportScalar({'wght':-1}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -0.5
    z2axisRanges must be passed when extrapolate is Trueg      ?r4   )	TypeErrorr@   rA   )rB   supportotr;   
axisRangesscalaraxisr<   peakr>   r9   axisMinaxisMaxs                r   r   r   |   s   D z)LMMF&-mmo (3""udEs{t|te|s{us{T3'A8###A9)$/GW7{u/7?te|q5yTE\::Ft^q5yTE\::F1E!1d?ut|q5yTE\::FG^q5yTE\::F:!F M	 t8q5yTE\22Fq5yTE\22FQ(3R Mr   c                       e Zd ZdZddZd Zed        Zeg fd       Zd Z	d Z
d	 Zd
 ZeddZeddZd Zed        Zd ZeddZeddZy)r   az  Locations must have the base master at the origin (ie. 0).

    If the extrapolate argument is set to True, then values are extrapolated
    outside the axis range.

      >>> from pprint import pprint
      >>> locations = [       {'wght':100},       {'wght':-100},       {'wght':-180},       {'wdth':+.3},       {'wght':+120,'wdth':.3},       {'wght':+120,'wdth':.2},       {},       {'wght':+180,'wdth':.3},       {'wght':+180},       ]
      >>> model = VariationModel(locations, axisOrder=['wght'])
      >>> pprint(model.locations)
      [{},
       {'wght': -100},
       {'wght': -180},
       {'wght': 100},
       {'wght': 180},
       {'wdth': 0.3},
       {'wdth': 0.3, 'wght': 180},
       {'wdth': 0.3, 'wght': 120},
       {'wdth': 0.2, 'wght': 120}]
      >>> pprint(model.deltaWeights)
      [{},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0, 4: 1.0, 5: 1.0},
       {0: 1.0, 3: 0.75, 4: 0.25, 5: 1.0, 6: 0.6666666666666666},
       {0: 1.0,
        3: 0.75,
        4: 0.25,
        5: 0.6666666666666667,
        6: 0.4444444444444445,
        7: 0.6666666666666667}]
    Nc                    t        t        d |D                    t        |      k7  rt        d      || _        ||ng | _        || _        |r| j                  |      nd | _        |D cg c],  }|j                         D ci c]  \  }}|dk7  s|| c}}. }}}}| j                  || j                        }t        ||      | _        |D cg c]  }| j                  j                  |       c}| _        | j                  D cg c]  }|j                  |       c}| _        | j                          i | _        y c c}}w c c}}}w c c}w c c}w )Nc              3   `   K   | ]&  }t        t        |j                                      ( y wr   )tuplesortedr@   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>   s      ?5	*+?s   ,.zLocations must be unique.r4   )	axisOrder)key)r.   setr
   origLocationsrU   r;   computeAxisRangesrJ   r@   getMasterLocationsSortKeyFuncrT   	locationsindexmappingreverseMapping_computeMasterSupports
_subModels)	selfr[   rU   r;   lockr9   keyFuncr   s	            r   __init__zVariationModel.__init__   s+   s?Y??@C	NR%&ABB&&/&;&?J$00;PTKTUUCsyy{?tq!a3had?U	U44 5 
  	w7 :CCA,,Q/C;?>>Jayq1J##% @U DJs*   ,E
EEE
"EEE
c                     d |vr| |fS t        d |D              }| j                  j                  |      }|9t        t	        || j
                        | j                        }|| j                  |<   |t	        ||      fS )Nc              3   $   K   | ]  }|d u 
 y wr   r   r   r9   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>  s     1aATM1r   )rS   r`   rA   r   r2   rX   rU   )ra   r@   rV   subModels       r   getSubModelzVariationModel.getSubModel  s{    u;1511??&&s+%gc43E3E&FWH#+DOOC e,,,r   c                    i }| D ch c]  }|j                         D ]  }|  }}}| D ]M  }|D ]F  }|j                  |d      }|j                  |||f      \  }}t        ||      t        ||      f||<   H O |S c c}}w Nr   )keysrA   r8   r7   )r[   rJ   rb   rL   allAxesvaluerN   rO   s           r   rY   z VariationModel.computeAxisRanges  s    
#,DCD4D4DD 	LC La(#->>$#G #&ug#6E78K#K
4 L	L
  Es   A=c                    i | vrt        d      i }| D ]_  }t        |      dk7  rt        t        |            }||   }||vrdh||<   |||   vsJ d|d|d|       ||   j	                  |       a d } |||      }|S )NzBase master not found.r	   r4   zValue "z" in axisPoints["z"] -->  c                       d  fd}|S )Nc                 "    | dk  rdS | dkD  rdS dS )Nr   r	   r   )r9   s    r   signzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.sign8  s    Ur:a!e::r   c           	          t               } j                         D cg c]  \  }}|v r	||   v r| }}}D cg c]	  }| v s| }}|j                  t         j	                               D cg c]	  }|vs| c}       |t        |       t        fd|D              t        |      t         fd|D              t         fd|D              fS c c}}w c c}w c c}w )Nc              3   L   K   | ]  }|v rj                  |      nd   yw)i   N)r\   )r   rL   rU   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>I  s.        261B	-Os   !$c              3   4   K   | ]  } |           y wr   r   )r   rL   rb   rt   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>N  s      ,0SYr#   c              3   :   K   | ]  }t        |           y wr   )abs)r   rL   rb   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>Q  s      +/CIs   )r.   r@   extendrT   rm   rS   )	rb   rankrL   ro   onPointAxesorderedAxesrU   
axisPointsrt   s	   `     r   rV   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key;  s   3x (+yy{#ez)ez$7G.G  
 1:ITS[tII""&,SXXZ&8RdD	<QTR %% $/  +& 4?   3>  
 JRs   C	C"	C"5	C'?C'r   )r~   rU   rV   rt   s   `` @r   getKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey7  s    ;6 Jr   )r
   r.   r'   r&   add)r[   rU   r~   rb   rL   ro   r   rets           r   rZ   z,VariationModel.getMasterLocationsSortKeyFunc&  s    Y%&>??
 
	(C3x1}S	?DIE:%$'5
4 Z--T;@$
ST-t  '
	(	B Z+
r   c                     |D cg c]  }||   	 }}|D cg c]  }| j                   |    c}| _         | j                   D cg c],  }|j                         D ci c]  \  }}|dk7  s|| c}}. }}}}|D 	cg c]  }	| j                  j                  |	       c}	| _        | j                  D 	cg c]  }	|j                  |	       c}	| _        i | _        |S c c}w c c}w c c}}w c c}}}w c c}	w c c}	w )Nr4   )rX   r@   r[   r\   r]   r^   r`   )
ra   master_listr]   idxnew_listrb   rc   r9   r[   r   s
             r   reorderMasterszVariationModel.reorderMasters[  s     188K$88AHI#d005IBFBTBT
 
;>ciik6daQ#XQT6
	 
 :CCA,,Q/C;?>>Jayq1J 9I6
 DJs4   CC$C/C)+C)0C/>"C66C;)C/c                    g | _         | j                         }t        |      D ]4  \  }}t        |j	                               }|d | D ]  }t        |j	                               |k7  r d}|j                         D ],  \  }\  }}	}
||   d   |	k(  r|||   d   cxk  r|
k  r(n d} n |sdi }d}|j	                         D ][  }||   d   }||v sJ ||   \  }}}
||
}}||k  r|}||z
  ||z
  z  }n||k  r|}||z
  |
|z
  z  }nE||kD  ri }|}||k(  sT|||f||<   ] |j                         D ]
  \  }}|||<     | j                   j                  |       7 | j                          y )NTr	   Frs   )supports_locationsToRegions	enumeraterW   rm   r@   append_computeDeltaWeights)ra   regionsiregionlocAxesprev_regionrelevantrL   r<   rM   r>   bestAxes	bestRatiovallocVnewLowernewUpperratior:   s                      r   r_   z%VariationModel._computeMasterSupportsh  s   **,"7+ 2	)IAv&++-(G&r{ .*{'')*g528,,. .D.5$#D)!,4 ;t#4Q#7?%?#(   	',,. DD%d+A.C6>)>)/&E4).hHTz#&!$t =#&!$t = !y(#%$)		)*2D()C%D( %-NN$4 *LD&#)F4L*[.*^ MM  (e2	)f 	!!#r   c           	         | j                   }i }i }|D ]X  }|j                         D ]C  \  }}t        ||j                  ||            ||<   t	        ||j                  ||            ||<   E Z g }|D ]I  }i }	|j                         D ]!  \  }
}|dkD  rd|||
   f|	|
<   ||
   |df|	|
<   # |j                  |	       K |S rl   )r[   r@   r8   rA   r7   r   )ra   r[   minVmaxVr   rc   r9   r   rb   r   rL   r   s               r   r   z"VariationModel._locationsToRegions  s    NN	  	1A	 11a!Q0Qa!Q0Q1	1
  	#CF!iik 9
d!8$%tT$Z#8F4L$(Ja#8F4L	9
 NN6"	# r   c                     g | _         t        | j                        D ]V  \  }}i }t        | j                  d |       D ]  \  }}t	        ||      }|s|||<    | j                   j                  |       X y r   )deltaWeightsr   r[   r   r   r   )ra   r   rb   deltaWeightjrH   rK   s          r   r   z#VariationModel._computeDeltaWeights  s|    / 	2FAsK'bq(9: ,
7&sG4%+KN, $$[1	2r   roundc                B   t        |      t        | j                        k(  sJ | j                  }g }t        | j                        D ]U  \  }}|||      }|j	                         D ]  \  }}	|	dk(  r	|||   z  }|||   |	z  z  }  |j                   ||             W |S )Nr	   )r.   r   r^   r   r@   r   )
ra   masterValuesr   r]   rD   r   weightsdeltar   weights
             r   	getDeltaszVariationModel.getDeltas  s    < C(9(9$::::%%#D$5$56 	%JAw ,E$]]_ -	6Q;SVOESVf_,E	-
 JJuU|$	% 
r   c                h    | j                  |      \  }}|j                  ||      |j                  fS Nr   )rj   r   r   )ra   r@   r   models       r   getDeltasAndSupportsz#VariationModel.getDeltasAndSupports  s2    ''.uuE2ENNBBr   c           	          | j                   D cg c]%  }t        ||| j                  | j                        ' c}S c c}w )N)r;   rJ   )r   r   r;   rJ   )ra   rb   rH   s      r   
getScalarszVariationModel.getScalars  sB    
  ==	
  W$*:*:t
 	
 
s   *<c                     d }t        |       t        |      k(  sJ t        | |      D ]  \  }}|s	||z  }||}||z  } |S r   r-   )deltasscalarsr9   r   rK   contributions         r   interpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars  sa    6{c'l*** 1 	"ME6 6>Ly \!	" r   c                 H    | j                  |      }| j                  ||      S r   )r   r   )ra   rb   r   r   s       r   interpolateFromDeltasz$VariationModel.interpolateFromDeltas  s#    //#&33FGDDr   c                L    | j                  ||      }| j                  ||      S r   )r   r   )ra   rb   r   r   r   s        r   interpolateFromMastersz%VariationModel.interpolateFromMasters  s'    E:))#v66r   c                L    | j                  ||      }| j                  ||      S r   )r   r   )ra   r   r   r   r   s        r    interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars  s'    E:33FGDDr   )NF)__name__
__module____qualname____doc__re   rj   staticmethodrY   rZ   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    +Z,-   ;= 2 2h6$p,	2 07  4; C
  E BI 7 PW Er   r   c                 6    |j                         }|s S  |v r|    S t        |      } |k  r ||   z   |z
  S t        |      } |kD  r ||   z   |z
  S t         fd|D              }t         fd|D              }||   }||   }|||z
   |z
  z  ||z
  z  z   S )Nc              3   .   K   | ]  }|k  s	|  y wr   r   r   rc   r9   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>       %!q1uA%   
c              3   .   K   | ]  }|kD  s	|  y wr   r   r   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>  r   r   )rm   r8   r7   )r9   r]   rm   rc   abvavbs   `       r   r   r     s    <<>DDyqzD	A1u71:~!!D	A1u71:~!!%t%%A%t%%A	B	BbQU#q1u---r   c                 `   ddl m} ddl}|j                  dt        j
                        }|j                  dddd	
       |j                  d      }|j                  dddt               |j                  ddddd       |j                  |       }  || j                         ddlm} | j                  rddlm}  |       }|j                  | j                         |j                   D cg c]  }|j"                   }	}t%        d        ||	       |j'                          t%        d       |j                   D cg c]  }|j"                   }	} ||	       nyt)        t+        d      t+        d      dz         D 
cg c]  }
t-        |
       }}
| j.                  D cg c]-  }t1        t3        |d |j5                  d       D                    / }	}t7        |	      }t%        d!        ||j.                         t%        d"        ||j8                         yc c}w c c}w c c}
w c c}w )#z*Normalize locations on a given designspacer   )configLoggerNzfonttools varLib.models)descriptionz
--loglevelLEVELINFOz Logging level (defaults to INFO))metavarr=   helpT)requiredz-dz--designspaceDESIGNSPACE)r   typez-lz--locationsLOCATION+zFMaster locations as comma-separate coordinates. One must be all zeros.)r   nargsr   )level)pprint)DesignSpaceDocumentzOriginal locations:zNormalized locations:AZr	   c              3   2   K   | ]  }t        |        y wr   )floatrh   s     r   r   zmain.<locals>.<genexpr>8  s     ;E!H;s   ,zSorted locations:z	Supports:)	fontToolsr   argparseArgumentParsermainr   add_argumentadd_mutually_exclusive_groupstr
parse_argsloglevelr   designspacefontTools.designspaceLibr   readsourcesrB   print	normalizerangeordchrr[   dictr/   splitr   r   )argsr   r   parsergroupr   r   docslocscrC   r   s                r   r   r   
  s   &$$!LL % F /	   ///>E	t_m#N	U   T"Dt}}%@!#!!"$'KK0q

00#$t%&$'KK0q

00t %c#hC1 =>1A>>GK~~
BCDT;aggcl;<=
 
 4 E	

5??	+
5>># 1
 1 ?
s   .H?H! H&"2H+__main__r   )F)TFN)r   __all__fontTools.misc.roundToolsr   errorsr
   r   r   r$   r+   r2   r   r   r   objectr   r   r   r   doctestsysr.   argvexittestmodfailedr   r   r   <module>r     s    + . '-'700
1>+\NbfEV fER	.(5p z
388}qCHH_W__%%& r   