a
    èÝEb±C  ã                   @   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„ Z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.)	ÚnonNoneÚallNoneÚallEqualÚ
allEqualToÚsubListÚ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   úW/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/varLib/models.pyÚ
<listcomp>   ó    znonNone.<locals>.<listcomp>r   ©Úlstr   r   r   r      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>   r   zallNone.<locals>.<genexpr>©Úallr   r   r   r   r      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   r   r      s    r   c                 C   s@   | sdS t | ƒ}zt|ƒ}W n ty0   Y dS 0 t|||d�S )NT)r   )ÚiterÚnextÚStopIterationr   )r   r   ÚitÚfirstr   r   r   r   #   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   0   r   zsubList.<locals>.<listcomp>©ÚlenÚzip)Útruthr   r   r   r   r   .   s    r   c                 C   sŒ   |\}}}||  kr|ks@n t d|d›d|d›d|d›�ƒ‚tt| |ƒ|ƒ} | |kr^d} n*| |k rx| | ||  } n| | ||  } | 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, ç        )Ú
ValueErrorÚmaxÚmin)ÚvÚtripleÚlowerÚdefaultÚupperr   r   r   r   3   s$    	
ÿÿÿÿr   c                 C   s8   i }|  ¡ D ]&\}}|  ||d ¡}t||ƒ||< 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   )ÚitemsÚgetr   )ÚlocationÚaxesÚoutÚtagr/   r.   r   r   r   r   L   s
    &r   Tc           	      C   sÈ   d}|  ¡ D ]¶\}\}}}|rZ|dkr(q||ks||kr:q|dk rL|dkrLq|  |d¡}n|| v sfJ ‚| | }||krxq||ksˆ||kr�d} 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.
    >>> 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      ð?r*   )r3   r4   )	r5   ÚsupportZotÚscalarÚaxisr0   Úpeakr2   r.   r   r   r   r   y   s*    r   c                   @   s¦   e Zd ZdZd dd„Z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	   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                    s¦   t tdd„ ˆ D ƒƒƒt ˆ ƒkr&tdƒ‚ˆ ˆ_|d ur8|ng ˆ_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Úsortedr3   r   r   r   r   r   Ø   r   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>Þ   r   z6VariationModel.__init__.<locals>.<listcomp>.<dictcomp>©r3   ©r   Úlocr   r   r   r   Þ   r   z+VariationModel.__init__.<locals>.<listcomp>©Ú	axisOrder)Úkeyc                    s   g | ]}ˆ j  |¡‘qS r   ©Ú	locationsÚindexr   ©Úselfr   r   r   å   r   c                    s   g | ]}ˆ   |¡‘qS r   ©rK   r   ©rJ   r   r   r   æ   r   )r'   Úsetr   ÚorigLocationsrG   ÚgetMasterLocationsSortKeyFuncr>   rJ   ÚmappingÚreverseMappingÚ_computeMasterSupportsÚ
_subModels)rM   rJ   rG   ZkeyFuncr   )rJ   rM   r   Ú__init__×   s    ÿzVariationModel.__init__c                 C   sb   d |vr| |fS t dd„ |D ƒƒ}| j |¡}|d u rTtt|| jƒ| jƒ}|| j|< |t||ƒfS )Nc                 s   s   | ]}|d uV  qd S r   r   ©r   r.   r   r   r   r   î   r   z-VariationModel.getSubModel.<locals>.<genexpr>)r=   rV   r4   r	   r   rQ   rG   )rM   r3   rH   ZsubModelr   r   r   ÚgetSubModelë   s    
zVariationModel.getSubModelc                 C   s”   i | vrt dƒ‚i }| D ]d}t|ƒdkr*qtt|ƒƒ}|| }||vrPdh||< ||| vsnJ 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   Úsign  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   r;   Úvalue)Ú
axisPointsr   r   r     s   þz]VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<listcomp>c                    s   g | ]}|ˆ v r|‘qS r   r   ©r   r;   ©rE   r   r   r     r   c                    s   g | ]}|ˆ vr|‘qS r   r   r_   rF   r   r   r     r   c                 3   s$   | ]}|ˆ v rˆ   |¡nd V  qdS )i   NrN   r_   rF   r   r   r     s   ÿz\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>c                 3   s   | ]}ˆˆ | ƒV  qd S r   r   r_   )rE   r\   r   r   r     s   c                 3   s   | ]}t ˆ | ƒV  qd S r   )Úabsr_   r`   r   r   r      s   )r'   r3   Úextendr>   Úkeysr=   )rE   ZrankZonPointAxesZorderedAxes©rG   r^   r\   r`   r   rH   
  s*    
þÿþÿÿõzIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyr   )r^   rG   rH   r   rd   r   ÚgetKey  s    z<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey)r   r'   r!   r    Úadd)rJ   rG   r^   rE   r;   r]   re   Úretr   r   r   rR   õ   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   -  r   z1VariationModel.reorderMasters.<locals>.<listcomp>c                    s   g | ]}ˆ j | ‘qS r   )rQ   rh   rL   r   r   r   .  r   c                 S   s   g | ]}d d„ |  ¡ D ƒ‘qS )c                 S   s   i | ]\}}|d kr||“qS r?   r   r@   r   r   r   rB   0  r   z<VariationModel.reorderMasters.<locals>.<listcomp>.<dictcomp>rC   rD   r   r   r   r   /  s   c                    s   g | ]}ˆ j  |¡‘qS r   rI   r   rL   r   r   r   2  r   c                    s   g | ]}ˆ   |¡‘qS r   rN   r   rO   r   r   r   3  r   )rQ   rS   rJ   rT   rV   )rM   rj   rS   Znew_listr   )rJ   rj   rM   r   ÚreorderMasters*  s    ÿzVariationModel.reorderMastersc                 C   s˜  g | _ |  ¡ }t|ƒD �]r\}}t| ¡ ƒ}|d |… D �]B}t| ¡ ƒ |¡sRq8d}| ¡ D ]L\}\}}	}
||vs¢|| d |	ks^||| d   k r |
k s^n d} q¬q^|s²q8i }d}| ¡ D ]œ}|| d }||v sÞJ ‚|| \}}}
||
 }}||k �r|}|| ||  }n ||k rÂ|}|| |
|  }nqÂ||k�rHi }|}||krÂ|||f||< qÂ| ¡ D ]\}}|||< �qhq8| j  |¡ q|  ¡  d S )NTr   FrZ   )	ÚsupportsÚ_locationsToRegionsÚ	enumeraterP   rc   Úissubsetr3   ÚappendÚ_computeDeltaWeights)rM   ÚregionsÚiÚregionZlocAxesZprev_regionZrelevantr;   r0   r<   r2   ZbestAxesZ	bestRatioÚvalÚlocVZnewLowerZnewUpperÚratior/   r   r   r   rU   7  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
   )rJ   r3   r-   r4   r,   rp   )rM   rJ   ZminVZmaxVr   rA   r.   rr   rE   rt   r;   rv   r   r   r   rm   o  s     z"VariationModel._locationsToRegionsc                 C   s`   g | _ t| jƒD ]J\}}i }t| jd |… ƒD ]\}}t||ƒ}|r.|||< q.| j  |¡ qd S r   )ÚdeltaWeightsrn   rJ   rl   r   rp   )rM   rs   rE   ZdeltaWeightÚjr9   r:   r   r   r   rq   …  s    

z#VariationModel._computeDeltaWeights©Úroundc          
      C   sŠ   t |ƒt | jƒksJ ‚| j}g }t| jƒD ]Z\}}|||  }| ¡ D ].\}}	|	dkrd||| 8 }qF||| |	 8 }qF| ||ƒ¡ q*|S )Nr   )r'   rx   rT   rn   r3   rp   )
rM   ÚmasterValuesr{   rS   r7   rs   ÚweightsÚdeltary   Úweightr   r   r   Ú	getDeltas�  s    zVariationModel.getDeltasc                C   s"   |   |¡\}}|j||d�|jfS ©Nrz   )rY   r€   rl   )rM   r3   r{   Úmodelr   r   r   ÚgetDeltasAndSupportsž  s    z#VariationModel.getDeltasAndSupportsc                    s   ‡ fdd„| j D ƒS )Nc                    s   g | ]}t ˆ |ƒ‘qS r   )r   )r   r9   r`   r   r   r   £  r   z-VariationModel.getScalars.<locals>.<listcomp>)rl   )rM   rE   r   r`   r   Ú
getScalars¢  s    zVariationModel.getScalarsc                 C   sT   d }t | ƒt |ƒksJ ‚t| |ƒD ],\}}|s0q"|| }|d u 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‡   )rM   rE   r…   r†   r   r   r   ÚinterpolateFromDeltas³  s    
z$VariationModel.interpolateFromDeltasc                C   s   | j ||d�}|  ||¡S r�   )r€   rˆ   )rM   rE   r|   r{   r…   r   r   r   ÚinterpolateFromMasters·  s    z%VariationModel.interpolateFromMastersc                C   s   | j ||d�}|  ||¡S r�   )r€   r‡   )rM   r|   r†   r{   r…   r   r   r   Ú interpolateFromMastersAndScalars»  s    z/VariationModel.interpolateFromMastersAndScalars)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rW   rY   ÚstaticmethodrR   rk   rU   rm   rq   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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   rA   r[   r   r   r   Í  r   z%piecewiseLinearMap.<locals>.<genexpr>c                 3   s   | ]}|ˆ kr|V  qd S r   r   r�   r[   r   r   r   Î  r   )rc   r-   r,   )r.   rS   rc   rA   ÚaÚbÚvaZvbr   r[   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))Úmetavarr1   Ú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   ©r5   ©r   Úsr   r   r   r   ø  r   zmain.<locals>.<listcomp>zOriginal locations:zNormalized locations:c                 S   s   g | ]
}|j ‘qS r   r¡   r¢   r   r   r   r   ý  r   c                 S   s   g | ]}t |ƒ‘qS r   )Úchr)r   Úcr   r   r   r      r   ÚAÚZr   c              	      s*   g | ]"}t tˆ d d„ | d¡D ƒƒƒ‘qS )c                 s   s   | ]}t |ƒV  qd S r   )ÚfloatrX   r   r   r   r     r   z"main.<locals>.<listcomp>.<genexpr>ú,)Údictr(   Úsplitr¢   ©r6   r   r   r     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ÚordrJ   r	   rl   )
Úargsr•   r­   ÚparserÚgrouprŸ   r    ÚdocZlocsr‚   r   r¬   r   r¯   Ô  sX    þüû

 
ÿ
r¯   Ú__main__)N)N)T)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>   s*   

-
0  
8