a
    ׶aC                     @   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rdd
lZdd
lZeejdkre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   g/Users/vegardjervell/Documents/master/model/venv/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 )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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rd} 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} qq^|sq8i }d}| D ]}|| d }||v sJ || \}}}
||
 }}||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newUpperZ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rd|||
 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'   rw   rT   rn   r3   rp   )
rM   masterValuesrz   rS   r7   rs   weightsdeltarx   Zweightr   r   r   	getDeltas  s    zVariationModel.getDeltasc                C   s"   |  |\}}|j||d|jfS Nry   )rY   r~   rl   )rM   r3   rz   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{   rz   r   r   r   r   interpolateFromMasters  s    z%VariationModel.interpolateFromMastersc                C   s   | j ||d}| ||S r   )r~   r   )rM   r{   r   rz   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rd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