
    <`B                     F   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 Zd ZddZ G d de          Zd ZddZedk    rXddlZddlZ eej                  dk    r ej         e                        ej         ej                    j                   dS dS )z%Variation fonts interpolation models.)	nonNoneallNoneallEqual
allEqualTosubListnormalizeValuenormalizeLocationsupportScalarVariationModel    )noRound   )VariationModelErrorc                     d | D             S )Nc                     g | ]}||S N .0ls     7lib/python3.11/site-packages/fontTools/varLib/models.py
<listcomp>znonNone.<locals>.<listcomp>   s    ,,,!amAmmm    r   lsts    r   r   r      s    ,,s,,,,r   c                 4    t          d | D                       S )Nc              3      K   | ]}|d u V  	d S r   r   r   s     r   	<genexpr>zallNone.<locals>.<genexpr>   s&      &&QqDy&&&&&&r   allr   s    r   r   r      s    &&#&&&&&&r   Nc                      t           fd|D                       S             t          fd|D                       S )Nc              3   $   K   | ]
}|k    V  d S r   r   )r   itemrefs     r   r   zallEqualTo.<locals>.<genexpr>   s'      //43$;//////r   c              3   6   K   | ]} |          k    V  d S r   r   )r   r"   mappedmappers     r   r   zallEqualTo.<locals>.<genexpr>    s0      66$v%666666r   r   )r#   r   r&   r%   s   ` `@r   r   r      s`    ~////3//////VC[[F66666#666666r   c                     | sdS t          |           }	 t          |          }n# t          $ r Y dS w xY wt          |||          S )NT)r&   )iternextStopIterationr   )r   r&   itfirsts       r   r   r   #   sc     t	cBR   tteR////s   % 
33c                 z    t          |           t          |          k    sJ d t          ||           D             S )Nc                     g | ]	\  }}||
S r   r   )r   r   ts      r   r   zsubList.<locals>.<listcomp>0   s!    ///$!QQ/A///r   lenzip)truthr   s     r   r   r   .   s;    u::S!!!!//#c5//////r   c           	          |\  }}}||cxk    r|k    sn t          d|dd|dd|d          t          t          | |          |          } | |k    rd} n| |k     r| |z
  ||z
  z  } n| |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,         )
ValueErrormaxmin)vtriplelowerdefaultuppers        r   r   r   3   s     #E7EW%%%%%%%%:9: :$9: :-29: :
 
 	
 	C5MM5!!AG||	
W[Wu_-[UW_-Hr   c                     i }|                                 D ]4\  }}|                     ||d                   }t          ||          ||<   5|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   )itemsgetr   )locationaxesouttagr:   r9   s         r   r   r   L   sV    L Czz|| - -VLLfQi((!!V,,CJr   Tc                 J   d}|                                 D ]\  }\  }}}|r8|dk    r||k    s||k    r|dk     r|dk    r,|                     |d          }n|| v sJ | |         }||k    rX||k    s||k    rd} n$||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.
    >>> 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
    g      ?r5   )r?   r@   )	rA   supportotscalaraxisr;   peakr=   r9   s	            r   r	   r	   y   s    , F&-mmoo 3 3""udE 	s{{t||te||s{{us{{T3''AA8####A99::!FEt88q5yTE\22FFq5yTE\22FFMr   c                       e Zd ZdZddZ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dS )r
   a`  
	Locations must be in normalized space.  Ie. base master
	is at origin (0).
	>>> 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                    k    rt          d           _        ||ng  _        d D                                   j                  }t          |           _         fdD              _        fd j        D              _	         
                                 i  _        d S )Nc              3   r   K   | ]2}t          t          |                                                    V  3d S r   )tuplesortedr?   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>   s:      ??5		**++??????r   zLocations must be unique.c                 J    g | ] }d  |                                 D             !S )c                 &    i | ]\  }}|d k    ||S r5   r   r   kr9   s      r   
<dictcomp>z6VariationModel.__init__.<locals>.<listcomp>.<dictcomp>   s#    ???tq!a3hhahhhr   r?   r   locs     r   r   z+VariationModel.__init__.<locals>.<listcomp>   s/    UUUC??syy{{???UUUr   )	axisOrder)keyc                 D    g | ]}j                             |          S r   	locationsindexr   r   selfs     r   r   z+VariationModel.__init__.<locals>.<listcomp>   )    CCCA,,Q//CCCr   c                 :    g | ]}                     |          S r   r^   r   r   r]   s     r   r   z+VariationModel.__init__.<locals>.<listcomp>   %    JJJayq11JJJr   )r1   setr   origLocationsrY   getMasterLocationsSortKeyFuncrO   r]   mappingreverseMapping_computeMasterSupports
_subModels)r`   r]   rY   keyFuncs   ``  r   __init__zVariationModel.__init__   s    s??Y?????@@C	NNRR%&ABBB&&/&;UU9UUU	44 5 
 
  	w777 DCCCCCCJJJJ4>JJJ##%%%r   c                    d |vr| |fS t          d |D                       }| j                            |          }|2t          t	          || j                  | j                  }|| j        |<   |t	          ||          fS )Nc              3      K   | ]}|d uV  	d S r   r   r   r9   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>   s&      11aATM111111r   )rN   rl   r@   r
   r   rg   rY   )r`   r?   rZ   subModels       r   getSubModelzVariationModel.getSubModel   s    u;11511111?&&s++%gc43E&F&FWWH#+DOC e,,,,r   c                 L   i | vrt          d          i }| D ]|}t          |          dk    rt          t          |                    }||         }||vrdh||<   |||         vsJ d|d|d|            ||                             |           }d } |||          }|S )NzBase master not found.r   r5   zValue "z" in axisPoints["z"] -->  c                       d  fd}|S )Nc                 &    | dk     rdn	| dk    rdndS )Nr   r   r   )r9   s    r   signzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.sign  s     UUrra!ee:r   c           	          t                     }fd                                 D             } fdD             }|                    fdt                                                     D                        |t          |           t          fd|D                       t          |          t           fd|D                       t           fd|D                       fS )Nc                 6    g | ]\  }}|v 	||         v |S r   r   )r   rI   value
axisPointss      r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>  sA       #ez))ez$7G.G.G .G.G.Gr   c                     g | ]}|v |	S r   r   r   rI   rX   s     r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>  s    IIITS[[t[[[r   c                     g | ]}|v|	S r   r   r   rI   rY   s     r   r   z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>  s#    RRRdD	<Q<QT<Q<Q<Qr   c              3   N   K   | ]}|v r                     |          nd V   dS )i   Nrc   r   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>  sR          261B1B	---     r   c              3   :   K   | ]} |                   V  d S r   r   )r   rI   rX   rx   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>  s@        ,0SY     r   c              3   B   K   | ]}t          |                   V  d S r   )absr~   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>  s>        +/CI     r   )r1   r?   extendrO   keysrN   )rX   rankonPointAxesorderedAxesrY   r|   rx   s   `   r   rZ   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key	  sd   3xx   '*yy{{  
 JIII	III""RRRRfSXXZZ&8&8RRR   %%%    $/     +&&     4?         3>     r   r   )r|   rY   rZ   rx   s   `` @r   getKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey  s>    ; ; ;      6 Jr   )r   r1   r)   r(   add)r]   rY   r|   rX   rI   r{   r   rets           r   rh   z,VariationModel.getMasterLocationsSortKeyFunc   s    Y%&>???
 
	( 
	(C3xx1}}S		??DIE:%%$'5
4 Z-----;@55$$$

S .--t  ''''	 	 	B fZ++
r   c                      fd|D             } fd|D              _         d  j         D              fdD              _        fd j        D              _        i  _        |S )Nc                      g | ]
}|         S r   r   )r   idxmaster_lists     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>,  s    888K$888r   c                 *    g | ]}j         |         S r   )rg   )r   r   r`   s     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>-  s!    III#d05IIIr   c                 J    g | ] }d  |                                 D             !S )c                 &    i | ]\  }}|d k    ||S rR   r   rS   s      r   rU   z<VariationModel.reorderMasters.<locals>.<listcomp>.<dictcomp>/  s#    666daQ#XXQXXXr   rV   rW   s     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>.  s<     
 
 
;>66ciikk666
 
 
r   c                 D    g | ]}j                             |          S r   r\   r_   s     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>1  ra   r   c                 :    g | ]}                     |          S r   rc   rd   s     r   r   z1VariationModel.reorderMasters.<locals>.<listcomp>2  re   r   )rg   ri   r]   rj   rl   )r`   r   ri   new_listr]   s   ``  @r   reorderMasterszVariationModel.reorderMasters)  s     9888888IIIIIII
 
BFBT
 
 
	 DCCCCCCJJJJ4>JJJr   c                 ~   g | _         |                                 }t          |          D ]|\  }}t          |                                          }|d |         D ]/}t          |                                                              |          s8d}|                                D ]>\  }\  }}	}
||vs-||         d         |	k    s|||         d         cxk     r|
k     sn d} n?|si }d}|                                D ]g}||         d         }||v sJ ||         \  }}}
||
}}||k     r|}||z
  ||z
  z  }n||k     r|}||z
  |
|z
  z  }nO||k    ri }|}||k    r|||f||<   h|                                D ]
\  }}|||<   1| j                             |           ~|                                  d S )NTr   Frw   )	supports_locationsToRegions	enumeraterf   r   issubsetr?   append_computeDeltaWeights)r`   regionsiregionlocAxesprev_regionrelevantrI   r;   rJ   r=   bestAxes	bestRatiovallocVnewLowernewUpperratior:   s                      r   rk   z%VariationModel._computeMasterSupports6  sK   **,,"7++ 2	) 2	)IAv&++--((G&rr{ .* .*;++--..77@@ 28,,..  .D.5$;..#D)!,44 ;t#4Q#7????%????#(  	',,.. D DD%d+A.C6>>>>)/&E4).hHTzz#&!$t =#&!$t = !y((#%$)		))*2D()C$,NN$4$4 * *LD&#)F4LL*M  ((((!!#####r   c           	         | j         }i }i }|D ]j}|                                D ]S\  }}t          ||                    ||                    ||<   t	          ||                    ||                    ||<   Tkg }|D ]V}i }	|                                D ](\  }
}|dk    rd|||
         f|	|
<   ||
         |df|	|
<   )|                    |	           W|S )Nr   )r]   r?   r8   r@   r7   r   )r`   r]   minVmaxVr   rT   r9   r   rX   r   rI   r   s               r   r   z"VariationModel._locationsToRegionsn  s	   N	  	1 	1A		 1 11a!Q00Qa!Q00Q1  	# 	#CF!iikk 9 9
d!88$%tT$Z#8F4LL$(Ja#8F4LLNN6""""r   c                     g | _         t          | j                  D ]Z\  }}i }t          | j        d |                   D ]\  }}t	          ||          }|r|||<   | j                             |           [d S r   )deltaWeightsr   r]   r   r	   r   )r`   r   rX   deltaWeightjrF   rH   s          r   r   z#VariationModel._computeDeltaWeights  s    // 	2 	2FAsK'bqb(9:: , ,
7&sG44 ,%+KN$$[1111	2 	2r   roundc                f   t          |          t          | j                  k    sJ | j        }g }t          | j                  D ]k\  }}|||                  }|                                D ]%\  }}	|	dk    r|||         z  }|||         |	z  z  }&|                     ||                     l|S )Nr   )r1   r   rj   r   r?   r   )
r`   masterValuesr   ri   rC   r   weightsdeltar   weights
             r   	getDeltaszVariationModel.getDeltas  s    <  C(9$:$:::::%#D$566 	% 	%JAw ,E$]]__ - -	6Q;;SVOEESVf_,EEJJuuU||$$$$
r   c                n    |                      |          \  }}|                    ||          |j        fS Nr   )rs   r   r   )r`   r?   r   models       r   getDeltasAndSupportsz#VariationModel.getDeltasAndSupports  s6    ''..uuE22ENBBr   c                 *    fd| j         D             S )Nc                 0    g | ]}t          |          S r   )r	   )r   rF   rX   s     r   r   z-VariationModel.getScalars.<locals>.<listcomp>  s#    IIIc7++IIIr   )r   )r`   rX   s    `r   
getScalarszVariationModel.getScalars  s    IIII4=IIIIr   c                     d }t          |           t          |          k    sJ t          | |          D ]\  }}|s||z  }||}||z  }|S r   r0   )deltasscalarsr9   r   rH   contributions         r   interpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars  sr    6{{c'll**** 11 	" 	"ME6  6>Ly \!r   c                 X    |                      |          }|                     ||          S r   )r   r   )r`   rX   r   r   s       r   interpolateFromDeltasz$VariationModel.interpolateFromDeltas  s)    //#&&33FGDDDr   c                \    |                      ||          }|                     ||          S r   )r   r   )r`   rX   r   r   r   s        r   interpolateFromMastersz%VariationModel.interpolateFromMasters  s-    E::))#v666r   c                \    |                      ||          }|                     ||          S r   )r   r   )r`   r   r   r   r   s        r    interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars  s-    E::33FGDDDr   r   )__name__
__module____qualname____doc__rn   rs   staticmethodrh   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
      sj       ) )V   (- - - ;= 2 2 2 \2h  6$ 6$ 6$p  ,	2 	2 	2 07      4; C C C C CJ J J   \E E E BI 7 7 7 7 7 PW E E E E E E Er   r
   c                     |                                 }|s S  |v r|          S t          |          } |k     r ||         z   |z
  S t          |          } |k    r ||         z   |z
  S t           fd|D                       }t           fd|D                       }||         }||         }|||z
   |z
  z  ||z
  z  z   S )Nc              3   (   K   | ]}|k     |V  d S r   r   rS   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>  '      %%!q1uuAuuuu%%r   c              3   (   K   | ]}|k    |V  d S r   r   rS   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>  r   r   )r   r8   r7   )r9   ri   r   rT   abvavbs   `       r   piecewiseLinearMapr     s    <<>>D DyyqzD		A1uu71:~!!D		A1uu71:~!!%%%%t%%%%%A%%%%t%%%%%A	B	BbQU#q1u---r   c                   
 ddl m} ddl}|                    dt          j                  }|                    dddd	
           |                    d          }|                    dddt                     |                    ddddd           |	                    |           }  || j
                   ddlm} | j        rddlm}  |            }|                    | j                   d |j        D             }t#          d            ||           |                                 t#          d           d |j        D             } ||           nJd t'          t)          d          t)          d           d!z             D             

fd"| j        D             }t-          |          }	t#          d#            ||	j                   t#          d$            ||	j                   dS )%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)DesignSpaceDocumentc                     g | ]	}|j         
S r   rA   r   ss     r   r   zmain.<locals>.<listcomp>      000q
000r   zOriginal locations:zNormalized locations:c                     g | ]	}|j         
S r   r   r   s     r   r   zmain.<locals>.<listcomp>  r   r   c                 ,    g | ]}t          |          S r   )chr)r   cs     r   r   zmain.<locals>.<listcomp>  s    >>>1A>>>r   AZr   c                     g | ]<}t          t          d  |                    d          D                                 =S )c              3   4   K   | ]}t          |          V  d S r   )floatrq   s     r   r   z"main.<locals>.<listcomp>.<genexpr>  s(      ;;E!HH;;;;;;r   ,)dictr2   split)r   r   rB   s     r   r   zmain.<locals>.<listcomp>   sQ     
 
 
BCDT;;aggcll;;;<<==
 
 
r   zSorted locations:z	Supports:)	fontToolsr   argparseArgumentParsermainr   add_argumentadd_mutually_exclusive_groupstr
parse_argsloglevelr   designspacefontTools.designspaceLibr   readsourcesprint	normalizerangeordr]   r
   r   )argsr   r   parsergroupr   r   doclocsr   rB   s             @r   r   r     sf   &&&&&&OOO$$!L %  F /	     ///>>E	t_m#NNN	U     T""DLt}%%%% 
@@@@@@!!##!"""00CK000#$$$t%&&&00CK000t>>c#hhC1 = =>>>
 
 
 
GK~
 
 
 4  E	

F5?	+
F5>r   __main__r   )T)r   __all__fontTools.misc.roundToolsr   errorsr   r   r   r   r   r   r   r   r	   objectr
   r   r   r   doctestsysr1   argvexittestmodfailedr   r   r   <module>r     s   + +
 
 
 . - - - - - ' ' ' ' ' '- - -' ' '7 7 7 70 0 0 00 0 0
  2* * *Z- - - -`SE SE SE SE SEV SE SE SEl. . .(5 5 5 5p z
s38}}qCH_W_%&&&&& r   