U
    »mœdDM  ã                   @   sÚ   d Z ddddg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rÖddlZddlZeejƒdkrÆe eƒ ¡ e e ¡ j¡ dS )%z%Variation fonts interpolation models.ÚnormalizeValueÚnormalizeLocationÚsupportScalarÚVariationModelé    )ÚnoRoundé   )ÚVariationModelErrorc                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|d k	r|‘qS ©N© ©Ú.0Úlr
   r
   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/varLib/models.pyÚ
<listcomp>   s      znonNone.<locals>.<listcomp>r
   ©Úlstr
   r
   r   ÚnonNone   s    r   c                 C   s   t dd„ | D ƒƒS )Nc                 s   s   | ]}|d kV  qd S r	   r
   r   r
   r
   r   Ú	<genexpr>   s     zallNone.<locals>.<genexpr>©Úallr   r
   r
   r   ÚallNone   s    r   Nc                    s>   ˆd k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      s     zallEqualTo.<locals>.<genexpr>c                 3   s   | ]}ˆ ˆ|ƒkV  qd S r	   r
   r   )ÚmappedÚmapperr
   r   r      s     r   )r   r   r   r
   )r   r   r   r   Ú
allEqualTo   s    r   c                 C   sB   | sdS t | ƒ}zt|ƒ}W n tk
r2   Y dS X t|||d�S )NT)r   )ÚiterÚnextÚStopIterationr   )r   r   ÚitÚfirstr
   r
   r   ÚallEqual   s    r"   c                 C   s(   t | ƒt |ƒkst‚dd„ t|| ƒD ƒS )Nc                 S   s   g | ]\}}|r|‘qS r
   r
   )r   r   Útr
   r
   r   r   +   s      zsubList.<locals>.<listcomp>©ÚlenÚAssertionErrorÚzip)Útruthr   r
   r
   r   ÚsubList)   s    r)   Fc              
   C   sî   |\}}}||  kr|ks@n t d|d›d|d›d|d›�ƒ‚|sTtt| |ƒ|ƒ} | |ksd||krhdS | |k rx||ksˆ| |kr˜||kr˜| | ||  S | |kr¨||ksÚ| |k r¸||ksÚtd| › d|› d|› d|› d�	ƒ‚| | ||  S dS )	zÙNormalizes 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=(ú)N)Ú
ValueErrorÚmaxÚminr&   )ÚvÚtripleÚextrapolateÚlowerÚdefaultÚupperr
   r
   r   r   .   s&    

ÿ ÿÿþ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   )r1   )ÚitemsÚgetr   )ÚlocationÚaxesr1   ÚoutÚtagr0   r/   r
   r
   r   r   M   s
    'Tc                 C   s°  |r|dkrt dƒ‚d}| ¡ D �]ˆ\}\}}}	|rp|dkr>q ||ks ||	krPq |dk rb|	dkrbq |  |d¡}
n|| ks|t‚| | }
|
|krŽq |�rX|| \}}|
|k rø||krø||krØ||	k rØ||
|	 ||	  9 }q n||k rö||
| ||  9 }q n`||
k �rX||	k�rX||k�r8||k �r8||
| ||  9 }q n ||k �rX||
|	 ||	  9 }q |
|k�sl|	|
k�rvd} �q¬|
|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*   )Ú	TypeErrorr5   r6   r&   )r7   ÚsupportZotr1   Ú
axisRangesÚscalarÚaxisr2   Úpeakr4   r/   ÚaxisMinÚaxisMaxr
   r
   r   r   {   sN    "

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 k	r8|ng ˆ_|ˆ_|rRˆ ˆ ¡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Úsortedr5   r   r
   r
   r   r   ü   s     z*VariationModel.__init__.<locals>.<genexpr>zLocations must be unique.c                 S   s   g | ]}d d„ |  ¡ D ƒ‘qS )c                 S   s   i | ]\}}|d kr||“qS ©r*   r
   ©r   Úkr/   r
   r
   r   Ú
<dictcomp>  s       z6VariationModel.__init__.<locals>.<listcomp>.<dictcomp>©r5   ©r   Úlocr
   r
   r   r     s     z+VariationModel.__init__.<locals>.<listcomp>©Ú	axisOrder)Úkeyc                    s   g | ]}ˆ j  |¡‘qS r
   ©Ú	locationsÚindexr   ©Úselfr
   r   r     s     c                    s   g | ]}ˆ   |¡‘qS r
   ©rQ   r   ©rP   r
   r   r     s     )r%   Úsetr   ÚorigLocationsrM   r1   ÚcomputeAxisRangesr=   ÚgetMasterLocationsSortKeyFuncrD   rP   ÚmappingÚreverseMappingÚ_computeMasterSupportsÚ
_subModels)rS   rP   rM   r1   ZkeyFuncr
   )rP   rS   r   Ú__init__ú   s      ÿzVariationModel.__init__c                 C   sb   d |kr| |fS t dd„ |D ƒƒ}| j |¡}|d krTtt|| jƒ| jƒ}|| j|< |t||ƒfS )Nc                 s   s   | ]}|d k	V  qd S r	   r
   ©r   r/   r
   r
   r   r     s     z-VariationModel.getSubModel.<locals>.<genexpr>)rC   r]   r6   r   r)   rW   rM   )rS   r5   rN   ZsubModelr
   r
   r   ÚgetSubModel  s    
zVariationModel.getSubModelc                 C   sb   i }dd„ | D ƒ}| D ]F}|D ]<}|  |d¡}|  |||f¡\}}t||ƒt||ƒf||< qq|S )Nc                 S   s   h | ]}|  ¡ D ]}|’qqS r
   )Úkeys)r   rK   r?   r
   r
   r   Ú	<setcomp>  s     
  z3VariationModel.computeAxisRanges.<locals>.<setcomp>r   )r6   r.   r-   )rP   r=   ZallAxesrK   r?   ÚvaluerA   rB   r
   r
   r   rX     s    z VariationModel.computeAxisRangesc                 C   s”   i | krt dƒ‚i }| D ]d}t|ƒdkr*qtt|ƒƒ}|| }||krPdh||< ||| ksnt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
   ©r/   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 | ] \}}|ˆ kr|ˆ | kr|‘qS r
   r
   )r   r?   rc   )Ú
axisPointsr
   r   r   =  s    þz]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>c                    s   g | ]}|ˆ kr|‘qS r
   r
   ©r   r?   ©rK   r
   r   r   B  s      c                    s   g | ]}|ˆ kr|‘qS r
   r
   rh   rL   r
   r   r   D  s      c                 3   s$   | ]}|ˆ krˆ   |¡nd V  qdS )i   NrT   rh   rL   r
   r   r   I  s   ÿz\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>c                 3   s   | ]}ˆˆ | ƒV  qd S r	   r
   rh   )rK   rf   r
   r   r   N  s    c                 3   s   | ]}t ˆ | ƒV  qd S r	   )Úabsrh   ri   r
   r   r   Q  s    )r%   r5   ÚextendrD   ra   rC   )rK   ZrankZonPointAxesZorderedAxes©rM   rg   rf   ri   r   rN   ;  s*    
þÿþÿÿõzIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyr
   )rg   rM   rN   r
   rl   r   ÚgetKey7  s    z<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey)r   r%   r   r   r&   Úadd)rP   rM   rg   rK   r?   rc   rm   Úretr
   r
   r   rY   &  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   ^  s     z1VariationModel.reorderMasters.<locals>.<listcomp>c                    s   g | ]}ˆ j | ‘qS r
   )rW   rp   rR   r
   r   r   _  s     c                 S   s   g | ]}d d„ |  ¡ D ƒ‘qS )c                 S   s   i | ]\}}|d kr||“qS rE   r
   rF   r
   r
   r   rH   a  s       z<VariationModel.reorderMasters.<locals>.<listcomp>.<dictcomp>rI   rJ   r
   r
   r   r   `  s    c                    s   g | ]}ˆ j  |¡‘qS r
   rO   r   rR   r
   r   r   c  s     c                    s   g | ]}ˆ   |¡‘qS r
   rT   r   rU   r
   r   r   d  s     )rW   rZ   rP   r[   r]   )rS   rr   rZ   Znew_listr
   )rP   rr   rS   r   ÚreorderMasters[  s    ÿzVariationModel.reorderMastersc                 C   sŽ  g | _ |  ¡ }t|ƒD �]h\}}t| ¡ ƒ}|d |… D �]8}t| ¡ ƒ|krPq8d}| ¡ D ]D\}\}}	}
|| d |	ks\||| d   k r–|
k s\n d} q¢q\|s¨q8i }d}| ¡ D ]œ}|| d }||ksÔt‚|| \}}}
||
 }}||k �r|}|| ||  }n ||k r¸|}|| |
|  }nq¸||k�r>i }|}||kr¸|||f||< q¸| ¡ D ]\}}|||< �q^q8| j  |¡ q|  ¡  d S )NTr   Frd   )	ÚsupportsÚ_locationsToRegionsÚ	enumeraterV   ra   r5   r&   ÚappendÚ_computeDeltaWeights)rS   ÚregionsÚiÚregionZlocAxesZprev_regionZrelevantr?   r2   r@   r4   ZbestAxesZ	bestRatioÚvalÚlocVZnewLowerZnewUpperÚratior0   r
   r
   r   r\   h  sV    ÿ 
þþ	


z%VariationModel._computeMasterSupportsc                 C   s¶   | j }i }i }|D ]B}| ¡ D ]4\}}t|| ||¡ƒ||< t|| ||¡ƒ||< qqg }|D ]R}i }	| ¡ D ]6\}
}|dkr’d|||
 f|	|
< qn||
 |df|	|
< qn| |	¡ q^|S )Nr   )rP   r5   r.   r6   r-   rw   )rS   rP   ZminVZmaxVr   rG   r/   ry   rK   r{   r?   r}   r
   r
   r   ru      s     z"VariationModel._locationsToRegionsc                 C   s`   g | _ t| jƒD ]J\}}i }t| jd |… ƒD ]\}}t||ƒ}|r.|||< q.| j  |¡ qd S r	   )ÚdeltaWeightsrv   rP   rt   r   rw   )rS   rz   rK   ZdeltaWeightÚjr<   r>   r
   r
   r   rx   ¶  s    

z#VariationModel._computeDeltaWeights©Úroundc          
      C   sŠ   t |ƒt | jƒkst‚| j}g }t| jƒD ]Z\}}|||  }| ¡ D ].\}}	|	dkrd||| 8 }qF||| |	 8 }qF| ||ƒ¡ q*|S )Nr   )r%   r   r&   r[   rv   r5   rw   )
rS   ÚmasterValuesr‚   rZ   r9   rz   ÚweightsÚdeltar€   Úweightr
   r
   r   Ú	getDeltasÁ  s    zVariationModel.getDeltasc                C   s"   |   |¡\}}|j||d�|jfS ©Nr�   )r`   r‡   rt   )rS   r5   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 ))r1   r=   )r   r1   r=   )r   r<   ©rK   rS   r
   r   r   Ô  s   ý   ÿz-VariationModel.getScalars.<locals>.<listcomp>)rt   )rS   rK   r
   r‹   r   Ú
getScalarsÓ  s    üzVariationModel.getScalarsc                 C   sT   d }t | ƒt |ƒkst‚t| |ƒD ],\}}|s0q"|| }|d krF|}q"||7 }q"|S r	   r$   )ÚdeltasÚscalarsr/   r…   r>   Zcontributionr
   r
   r   ÚinterpolateFromDeltasAndScalarsÛ  s    
z.VariationModel.interpolateFromDeltasAndScalarsc                 C   s   |   |¡}|  ||¡S r	   )rŒ   r�   )rS   rK   r�   rŽ   r
   r
   r   ÚinterpolateFromDeltasé  s    
z$VariationModel.interpolateFromDeltasc                C   s   | j ||d�}|  ||¡S rˆ   )r‡   r�   )rS   rK   rƒ   r‚   r�   r
   r
   r   ÚinterpolateFromMastersí  s    z%VariationModel.interpolateFromMastersc                C   s   | j ||d�}|  ||¡S rˆ   )r‡   r�   )rS   rƒ   rŽ   r‚   r�   r
   r
   r   Ú interpolateFromMastersAndScalarsñ  s    z/VariationModel.interpolateFromMastersAndScalars)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r^   r`   ÚstaticmethodrX   rY   rs   r\   ru   rx   r   r‡   rŠ   rŒ   r�   r�   r‘   r’   r
   r
   r
   r   r   Ì   s&   -



48
c                    s¸   |  ¡ }|sˆ S ˆ |kr |ˆ  S t|ƒ}ˆ |k r@ˆ ||  | S t|ƒ}ˆ |kr`ˆ ||  | S t‡ fdd„|D ƒƒ}t‡ fdd„|D ƒƒ}|| }|| }||| ˆ |  ||   S )Nc                 3   s   | ]}|ˆ k r|V  qd S r	   r
   ©r   rG   re   r
   r   r     s      z%piecewiseLinearMap.<locals>.<genexpr>c                 3   s   | ]}|ˆ kr|V  qd S r	   r
   r˜   re   r
   r   r     s      )ra   r.   r-   )r/   rZ   ra   rG   ÚaÚbÚvaZvbr
   re   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 ƒ}||ƒ n4d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))Úmetavarr3   Ú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   s   g | ]
}|j ‘qS r
   ©r7   ©r   Úsr
   r
   r   r   .  s     zmain.<locals>.<listcomp>zOriginal locations:zNormalized locations:c                 S   s   g | ]
}|j ‘qS r
   r©   rª   r
   r
   r   r   3  s     c                 S   s   g | ]}t |ƒ‘qS r
   )Úchr)r   Úcr
   r
   r   r   6  s     ÚAÚZr   c              	      s*   g | ]"}t tˆ d d„ | d¡D ƒƒƒ‘qS )c                 s   s   | ]}t |ƒV  qd S r	   )Úfloatr_   r
   r
   r   r   8  s     z"main.<locals>.<listcomp>.<genexpr>ú,)Údictr'   Úsplitrª   ©r8   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ÚordrP   r   rt   )
Úargsr�   rµ   ÚparserÚgroupr§   r¨   ÚdocZlocsr‰   r
   r´   r   r·   
  sX    þüû

 
ÿ
r·   Ú__main__)N)N)F)F)TFN)N)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>   s2   ü



.
Q  ,
8