o
    AeDM                     @   s   d Z g dZddlmZ ddlmZ dd Zdd	 Zd ddZd ddZ	dd Z
d!ddZd!ddZd"ddZG dd deZdd Zd ddZedkrkdd
lZdd
lZeejdkraee  ee j d
S d
S )#z%Variation fonts interpolation models.)normalizeValuenormalizeLocationsupportScalarVariationModel    )noRound   )VariationModelErrorc                 C   s   dd | D S )Nc                 S   s   g | ]}|d ur|qS N .0lr
   r
   X/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/fontTools/varLib/models.py
<listcomp>       znonNone.<locals>.<listcomp>r
   lstr
   r
   r   nonNone   s   r   c                 C   s   t dd | D S )Nc                 s   s    | ]}|d u V  qd S r	   r
   r   r
   r
   r   	<genexpr>       zallNone.<locals>.<genexpr>allr   r
   r
   r   allNone   s   r   Nc                    s>   d u rt fdd|D S  t  fdd|D S )Nc                 3   s    | ]} |kV  qd S r	   r
   r   item)refr
   r   r      r   zallEqualTo.<locals>.<genexpr>c                 3   s    | ]	} |kV  qd S r	   r
   r   )mappedmapperr
   r   r          r   )r   r   r   r
   )r   r   r   r   
allEqualTo   s   r   c                 C   s@   | sdS t | }zt|}W n
 ty   Y dS w t|||dS )NT)r   )iternextStopIterationr   )r   r   itfirstr
   r
   r   allEqual   s   r%   c                 C   s(   t | t |ks
J dd t|| D S )Nc                 S   s   g | ]\}}|r|qS r
   r
   )r   r   tr
   r
   r   r   +   r   zsubList.<locals>.<listcomp>lenzip)truthr   r
   r
   r   subList)   s   r+   Fc              
   C   s   |\}}}||  kr|ks n t d|dd|dd|d|s*tt| ||} | |ks2||kr4dS | |k r<||ksD| |krL||krL| | ||  S | |krT||ksm| |k r\||ksmJ d|  d| d| d| d	| | ||  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upperr
   r
   r   r   .   s2   

 r   c                 C   s<   i }|  D ]\}}| ||d }t|||d||< q|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   )r3   )itemsgetr   )locationaxesr3   outtagr2   r1   r
   r
   r   r   M   s
   'r   Tc                 C   s  |r
|du r
t dd}| D ]\}\}}}	|r7|dkrq||ks&||	kr'q|dk r0|	dkr0q| |d}
n
|| v s=J | | }
|
|krFq|r|| \}}|
|k ry||kry||kri||	k ri||
|	 ||	  9 }q||k rx||
| ||  9 }qn*||
k r||	kr||kr||k r||
| ||  9 }q||k r||
|	 ||	  9 }q|
|ks|	|
krd} |S |
|k r||
| ||  9 }q||
|	 ||	  9 }q|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
    Nz2axisRanges must be passed when extrapolate is Trueg      ?r,   )	TypeErrorr7   r8   )r9   supportZotr3   
axisRangesscalaraxisr4   peakr6   r1   axisMinaxisMaxr
   r
   r   r   {   sR   "r   c                   @   s   e Zd ZdZd#ddZdd Zedd	 Zeg fd
dZdd Z	dd Z
dd Zdd ZedddZedddZdd Zedd Zdd Zeddd Zedd!d"ZdS )$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}]
    NFc                    s   t tdd  D t  krtd _|d ur|ng _|_|r) nd _dd  D  j jd}t	 |d_
fdd D _ fd	dj
D _  i _d S )
Nc                 s   s     | ]}t t| V  qd S r	   )tuplesortedr7   r   r
   r
   r   r      s    z*VariationModel.__init__.<locals>.<genexpr>zLocations must be unique.c                 S      g | ]}d d |  D qS )c                 S      i | ]\}}|d kr||qS r,   r
   r   kr1   r
   r
   r   
<dictcomp>      z6VariationModel.__init__.<locals>.<listcomp>.<dictcomp>r7   r   locr
   r
   r   r     rM   z+VariationModel.__init__.<locals>.<listcomp>	axisOrder)keyc                       g | ]} j |qS r
   	locationsindexr   selfr
   r   r     r   c                       g | ]}  |qS r
   rW   r   rV   r
   r   r         )r(   setr   origLocationsrR   r3   computeAxisRangesr?   getMasterLocationsSortKeyFuncrF   rV   mappingreverseMapping_computeMasterSupports
_subModels)rY   rV   rR   r3   ZkeyFuncr
   )rV   rY   r   __init__   s   
zVariationModel.__init__c                 C   sb   d |vr| |fS t dd |D }| j|}|d u r*tt|| j| j}|| j|< |t||fS )Nc                 s   s    | ]}|d uV  qd S r	   r
   r   r1   r
   r
   r   r     r   z-VariationModel.getSubModel.<locals>.<genexpr>)rE   re   r8   r   r+   r_   rR   )rY   r7   rS   ZsubModelr
   r
   r   getSubModel  s   
zVariationModel.getSubModelc                 C   sb   i }dd | D }| D ]#}|D ]}| |d}| |||f\}}t||t||f||< qq|S )Nc                 S   s   h | ]}|  D ]}|qqS r
   )keys)r   rP   rA   r
   r
   r   	<setcomp>  rM   z3VariationModel.computeAxisRanges.<locals>.<setcomp>r   )r8   r0   r/   )rV   r?   ZallAxesrP   rA   valuerC   rD   r
   r
   r   r`     s   z VariationModel.computeAxisRangesc                 C   s   i | vrt di }| D ]2}t|dkrqtt|}|| }||vr(dh||< ||| vs7J d|||f || | qdd }|||}|S )NzBase master not found.r   r,   z&Value "%s" in axisPoints["%s"] -->  %sc                    s   dd  fdd}|S )Nc                 S   s   | dk rdS | dkrdS dS )Nr   r   r
   r1   r
   r
   r   sign8  s   zJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.signc              	      s   t  }fdd  D } fddD }|fddt  D  |t | tfdd|D t|t fdd|D t fdd|D fS )	Nc                    s(   g | ]\}}| v r| | v r|qS r
   r
   )r   rA   rk   )
axisPointsr
   r   r   =  s    
z]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>c                    s   g | ]}| v r|qS r
   r
   r   rA   rP   r
   r   r   B  r   c                    s   g | ]}| vr|qS r
   r
   rp   rQ   r
   r   r   D  r   c                 3   s&    | ]}| v r  |nd V  qdS )i   Nr[   rp   rQ   r
   r   r   I  s
    
z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>c                 3   s    | ]	} | V  qd S r	   r
   rp   )rP   rn   r
   r   r   N      
c                 3   s    | ]	}t  | V  qd S r	   )absrp   rq   r
   r   r   Q  rr   )r(   r7   extendrF   ri   rE   )rP   ZrankZonPointAxesZorderedAxesrR   ro   rn   rq   r   rS   ;  s*   
zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyr
   )ro   rR   rS   r
   ru   r   getKey7  s   z<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey)r   r(   r!   r    add)rV   rR   ro   rP   rA   rk   rv   retr
   r
   r   ra   &  s$   


!z,VariationModel.getMasterLocationsSortKeyFuncc                    sj   fdd|D }fdd|D _ dd j D  fdd D _ fddjD _i _|S )Nc                    s   g | ]} | qS r
   r
   r   idx)master_listr
   r   r   ^      z1VariationModel.reorderMasters.<locals>.<listcomp>c                    s   g | ]} j | qS r
   )r_   ry   rX   r
   r   r   _  r]   c                 S   rG   )c                 S   rH   rI   r
   rJ   r
   r
   r   rL   a  rM   z<VariationModel.reorderMasters.<locals>.<listcomp>.<dictcomp>rN   rO   r
   r
   r   r   `  s    c                    rT   r
   rU   r   rX   r
   r   r   c  r   c                    rZ   r
   r[   r   r\   r
   r   r   d  r]   )r_   rb   rV   rc   re   )rY   r{   rb   Znew_listr
   )rV   r{   rY   r   reorderMasters[  s   zVariationModel.reorderMastersc                 C   s  g | _ |  }t|D ]\}}t| }|d | D ]}t| |kr&qd}| D ]"\}\}}	}
|| d |	ksN||| d   k rI|
k sNn d} qOq,|sRqi }d}| D ]L}|| d }||v shJ || \}}}
||
}}||k r|}|| ||  }n||k r|}|| |
|  }nqZ||kri }|}||kr|||f||< qZ| D ]\}}|||< qq| j | q|   d S )NTr   Frl   )supports_locationsToRegions	enumerater^   ri   r7   append_computeDeltaWeights)rY   regionsiregionZlocAxesZprev_regionZrelevantrA   r4   rB   r6   ZbestAxesZ	bestRatiovallocVZnewLowerZnewUpperratior2   r
   r
   r   rd   h  sZ   	

z%VariationModel._computeMasterSupportsc                 C   s   | j }i }i }|D ]!}| D ]\}}t||||||< t||||||< qq	g }|D ])}i }	| D ]\}
}|dkrId|||
 f|	|
< q7||
 |df|	|
< q7||	 q/|S )Nr   )rV   r7   r0   r8   r/   r   )rY   rV   ZminVZmaxVr   rK   r1   r   rP   r   rA   r   r
   r
   r   r     s"   z"VariationModel._locationsToRegionsc                 C   s`   g | _ t| jD ]%\}}i }t| jd | D ]\}}t||}|r&|||< q| j | qd S r	   )deltaWeightsr   rV   r~   r   r   )rY   r   rP   ZdeltaWeightjr>   r@   r
   r
   r   r     s   
z#VariationModel._computeDeltaWeightsroundc          
      C   s   t |t | jksJ | j}g }t| jD ]-\}}|||  }| D ]\}}	|	dkr2||| 8 }q#||| |	 8 }q#||| q|S )Nr   )r(   r   rc   r   r7   r   )
rY   masterValuesr   rb   r;   r   weightsdeltar   weightr
   r
   r   	getDeltas  s   zVariationModel.getDeltasc                C   s"   |  |\}}|j||d|jfS Nr   )rh   r   r~   )rY   r7   r   modelr
   r
   r   getDeltasAndSupports  s   z#VariationModel.getDeltasAndSupportsc                    s    fddj D S )Nc                    s    g | ]}t  |jjd qS ))r3   r?   )r   r3   r?   )r   r>   rP   rY   r
   r   r     s    z-VariationModel.getScalars.<locals>.<listcomp>)r~   )rY   rP   r
   r   r   
getScalars  s   zVariationModel.getScalarsc                 C   sT   d }t | t |ksJ t| |D ]\}}|sq|| }|d u r#|}q||7 }q|S r	   r'   )deltasscalarsr1   r   r@   Zcontributionr
   r
   r   interpolateFromDeltasAndScalars  s   
z.VariationModel.interpolateFromDeltasAndScalarsc                 C   s   |  |}| ||S r	   )r   r   )rY   rP   r   r   r
   r
   r   interpolateFromDeltas  s   
z$VariationModel.interpolateFromDeltasc                C   s   | j ||d}| ||S r   )r   r   )rY   rP   r   r   r   r
   r
   r   interpolateFromMasters     z%VariationModel.interpolateFromMastersc                C   s   | j ||d}| ||S r   )r   r   )rY   r   r   r   r   r
   r
   r    interpolateFromMastersAndScalars  r   z/VariationModel.interpolateFromMastersAndScalars)NF)__name__
__module____qualname____doc__rf   rh   staticmethodr`   ra   r}   rd   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r      s(    
-


48
r   c                    s   |  }|s S  |v r|  S t|} |k r  ||  | S t|} |kr0 ||  | S t fdd|D }t fdd|D }|| }|| }|||  |  ||   S )Nc                 3   s    | ]	}| k r|V  qd S r	   r
   r   rK   rm   r
   r   r     r   z%piecewiseLinearMap.<locals>.<genexpr>c                 3   s    | ]	}| kr|V  qd S r	   r
   r   rm   r
   r   r     r   )ri   r0   r/   )r1   rb   ri   rK   abvaZvbr
   rm   r   piecewiseLinearMap  s    r   c           
         s\  ddl m} ddl}|jdtjd}|jdddd	d
 |jdd}|jdddtd |jdddddd |	| } || j
d ddlm} | jr|ddlm} | }|| j dd |jD }td || |  td dd |jD }|| ndd ttd td!d" D   fd#d| jD }t|}	td$ ||	j td% ||	j dS )&z*Normalize locations on a given designspacer   )configLoggerNzfonttools varLib.models)descriptionz
--loglevelZLEVELINFOz Logging level (defaults to INFO))metavarr5   helpT)requiredz-dz--designspaceZDESIGNSPACE)r   typez-lz--locationsZLOCATION+zFMaster locations as comma-separate coordinates. One must be all zeros.)r   nargsr   )level)pprint)DesignSpaceDocumentc                 S      g | ]}|j qS r
   r9   r   sr
   r
   r   r   .      zmain.<locals>.<listcomp>zOriginal locations:zNormalized locations:c                 S   r   r
   r   r   r
   r
   r   r   3  r   c                 S   s   g | ]}t |qS r
   )chr)r   cr
   r
   r   r   6  r|   AZr   c              	      s*   g | ]}t t d d |dD qS )c                 s   s    | ]}t |V  qd S r	   )floatrg   r
   r
   r   r   8  r   z"main.<locals>.<listcomp>.<genexpr>,)dictr)   splitr   r:   r
   r   r   7  s    zSorted locations:z	Supports:)Z	fontToolsr   argparseArgumentParsermainr   add_argumentadd_mutually_exclusive_groupstr
parse_argsZloglevelr   ZdesignspaceZfontTools.designspaceLibr   readsourcesprint	normalizerangeordrV   r   r~   )
argsr   r   parsergroupr   r   docZlocsr   r
   r   r   r   
  sX   

 

r   __main__r	   )F)TFN)r   __all__ZfontTools.misc.roundToolsr   errorsr   r   r   r   r%   r+   r   r   r   objectr   r   r   r   doctestsysr(   argvexittestmodfailedr
   r
   r
   r   <module>   s.    




.Q  ,
8