o
    `i%                     @  s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlZd dlZejr;d dlmZ eeeef d	f Z	 dddZG dd dZeG dd dZdS )    )annotations)Mapping)	dataclass)DesignSpaceDocument)TTFont)VariationModelnoRoundnormalizeValuepiecewiseLinearMapN)Self.locationMapping[str, float]returnLocationTuplec                 C  s   t t|  S )z;Create a hashable location from a dictionary-like location.)tuplesorteditems)r    r   ]/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/fontTools/feaLib/variableScalar.pyLocation   s   r   c                   @  sP   e Zd ZU dZded< 	 dddZdd ZedddZdddZ	dddZ
dS )VariableScalarzFA scalar with different values at different points in the designspace.zdict[LocationTuple, int]valuesNc                 C  s"   dd |pi   D | _g | _d S )Nc                 S  s   i | ]	\}}t ||qS r   )r   ).0r   valuer   r   r   
<dictcomp>&   s    z+VariableScalar.__init__.<locals>.<dictcomp>)r   r   axes)selflocation_valuer   r   r   __init__%   s   

zVariableScalar.__init__c                 C  sP   g }| j  D ]\}}ddd |D }|d||f  qdd| d S )N,c                 S  s2   g | ]\}}| d t | rt|n| qS )=)float
is_integerint)r   axcoordr   r   r   
<listcomp>2   s     z+VariableScalar.__repr__.<locals>.<listcomp>z%s:%i( ))r   r   joinappend)r   r   r   r   locr   r   r   __repr__.   s   zVariableScalar.__repr__r   boolc                   s,   t | j  t fdd dd  D S )Nc                 3  s    | ]	}| d  kV  qdS )r   Nr   )r   vr   r   r   	<genexpr>=   s    z+VariableScalar.does_vary.<locals>.<genexpr>   )listr   anyr   r   r0   r   	does_vary:   s   zVariableScalar.does_varyr   r   r   r#   c                 C  s   || j t|< d S N)r   r   )r   r   r   r   r   r   	add_value?   s   zVariableScalar.add_valuec                 C  sb   t jdtdd | jstdtdd | jD |du ri nt|j|dur'|ni d}|| |S )	zGDeprecated: use VariableScalarBuilder.add_to_variation_store() instead.zrVariableScalar.add_to_variation_store() is deprecated. Use VariableScalarBuilder.add_to_variation_store() instead.   )
stacklevelzP.axes must be defined on variable scalar before calling add_to_variation_store()c                 S      i | ]}|j |j|j|jfqS r   axisTagminValuedefaultValuemaxValue)r   r$   r   r   r   r   P       z9VariableScalar.add_to_variation_store.<locals>.<dictcomp>Naxis_triplesaxis_mappingsmodel_cache)	warningswarnDeprecationWarningr   
ValueErrorVariableScalarBuilderdictsegmentsadd_to_variation_store)r   store_builderrE   avarbuilderr   r   r   rM   B   s"   z%VariableScalar.add_to_variation_storer7   )r   r.   )r   r   r   r#   )NN)__name__
__module____qualname____doc____annotations__r   r-   propertyr6   r8   rM   r   r   r   r   r      s   
 
	
r   c                   @  s   e Zd ZU dZded< 	 ded< 	 ded< 	 ed-ddZed.ddZd/ddZd0ddZ	d1ddZ
d2dd Zd3d"d#Zd4d%d&Zd5d'd(Zd6d*d+Zd,S )7rJ   zA helper class for building variable scalars, or otherwise interrogating
    their variation model for interpolation or similar.z%dict[str, tuple[float, float, float]]rC   z dict[str, Mapping[float, float]]rD   z/dict[tuple[LocationTuple, ...], VariationModel]rE   ttfr   r   r   c                 C  sJ   | dd |d j D |d }d u ri i dS dd |j D i dS )Nc                 S  r;   r   r<   r   axisr   r   r   r   m   rA   z2VariableScalarBuilder.from_ttf.<locals>.<dictcomp>fvarrO   c                 S  s   i | ]\}}||qS r   r   )r   rY   rL   r   r   r   r   t   s    rB   )r   getrL   r   )clsrW   rO   r   r   r   from_ttfj   s   zVariableScalarBuilder.from_ttfdocr   c                 C  s&   | dd |j D dd |j D i dS )Nc                 S  r;   r   )tagminimumdefaultmaximumrX   r   r   r   r   |   rA   z:VariableScalarBuilder.from_designspace.<locals>.<dictcomp>c                   s*   i | ]  j r j fd d j D qS )c              
     sL   i | ]"\}}t | j j jft |  j  j  jfqS r   )r	   r`   ra   rb   map_forward)r   userdesignrY   r   r   r      s    


zEVariableScalarBuilder.from_designspace.<locals>.<dictcomp>.<dictcomp>)mapr_   )r   r   rf   r   r      s    rB   )r   )r\   r^   r   r   r   from_designspacey   s   z&VariableScalarBuilder.from_designspacer   r   c                 C  sf   i }|D ]\}}|| j vrtd||f |||< q| j  D ]\}\}}}||vr.|||< qt|S )zsValidate and fully-specify a user-space location by filling in
        missing axes with their user-space defaults.zUnknown axis %s in %s)rC   rI   r   r   )r   r   fullaxtagr   _axis_defaultr   r   r   _fully_specify_location   s   

z-VariableScalarBuilder._fully_specify_locationdict[str, float]c           
      C  s\   i }|D ]'\}}| j | \}}}t||||f}| j|}	|	dur't||	}|||< q|S )zNormalize a user-space location, applying avar mappings if present.

        TODO: This only handles avar1 (per-axis piecewise linear mappings),
        not avar2 (multi-dimensional mappings).
        N)rC   r	   rD   r[   r
   )
r   r   resultrj   r   axis_minrl   axis_max
normalizedmappingr   r   r   _normalize_location   s   

z)VariableScalarBuilder._normalize_locationscalarr   list[tuple[LocationTuple, int]]c                   s    fdd|j  D S )zzReturn a list of (fully-specified user-space location, value) pairs,
        preserving order and length of scalar.values.c                   s   g | ]\}}  ||fqS r   )rm   )r   r,   valr5   r   r   r&      s    zDVariableScalarBuilder._full_locations_and_values.<locals>.<listcomp>)r   r   )r   ru   r   r5   r   _full_locations_and_values   s   
z0VariableScalarBuilder._full_locations_and_valuesr#   c                 C  sD   t dd | j D }| |D ]\}}||kr|  S qtd)z+Get the default value of a variable scalar.c                 S  s   i | ]
\}\}}}||qS r   r   )r   r_   rk   ra   r   r   r   r      s    z7VariableScalarBuilder.default_value.<locals>.<dictcomp>z Default value could not be found)r   rC   r   rx   rI   )r   ru   default_locr   r   r   r   r   default_value   s   z#VariableScalarBuilder.default_valuer!   c           	      C  sp   |  |}| |}|D ]\}}||kr|  S qdd |D }| |}| |||}|du r6td|S )z7Interpolate the value of a scalar from a user-location.c                 S  s   g | ]\}}|qS r   r   )r   rk   rw   r   r   r   r&      s    z;VariableScalarBuilder.value_at_location.<locals>.<listcomp>Nz,Insufficient number of values to interpolate)rm   rx   rt   modelinterpolateFromMastersrI   )	r   ru   r   pairsr,   rw   r   normalized_locationr   r   r   r   value_at_location   s   


z'VariableScalarBuilder.value_at_locationr   c                   sn     |}tdd |D } j|}|dur|S  fdd|D }t j }t||d } j|< |S )zReturn a variation model based on a scalar's values.

        Variable scalars with the same fully-specified user-locations will use
        the same cached variation model.c                 s  s    | ]\}}|V  qd S r7   r   r   r,   rk   r   r   r   r1      s    z.VariableScalarBuilder.model.<locals>.<genexpr>Nc                   s   g | ]	\}}  |qS r   )rt   r   r5   r   r   r&      s    z/VariableScalarBuilder.model.<locals>.<listcomp>)	axisOrder)rx   r   rE   r[   r3   rC   keysr   )r   ru   r}   	cache_keycached_modelnormalized_locationsr   r{   r   r5   r   r{      s   
zVariableScalarBuilder.modelc                 C  s"   t |j }| |j|tdS )zACalculate deltas and supports from this scalar's variation model.round)r3   r   r{   getDeltasAndSupportsr   )r   ru   r   r   r   r   get_deltas_and_supports   s   z-VariableScalarBuilder.get_deltas_and_supportstuple[int, int]c                 C  s8   |  |\}}|| |j|td}t| ||fS )zlSerialize this scalar's variation model to a store, returning the
        default value and variation index.r   )r   setSupportsstoreDeltasr   r#   rz   )r   ru   rN   deltassupportsindexr   r   r   rM      s   
z,VariableScalarBuilder.add_to_variation_storeN)rW   r   r   r   )r^   r   r   r   )r   r   r   r   )r   r   r   rn   )ru   r   r   rv   )ru   r   r   r#   )ru   r   r   r   r   r!   )ru   r   r   r   )ru   r   )ru   r   r   r   )rQ   rR   rS   rT   rU   classmethodr]   rh   rm   rt   rx   rz   r   r{   r   rM   r   r   r   r   rJ   Z   s(   
 






rJ   )r   r   r   r   )
__future__r   collections.abcr   dataclassesr   fontTools.designspaceLibr   fontTools.ttLib.ttFontr   fontTools.varLib.modelsr   r   r	   r
   typingrF   TYPE_CHECKINGr   r   strr!   r   r   r   rJ   r   r   r   r   <module>   s     
<