
    ޺i%                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJrJrJr  S SKrS SKr\R"                  (       a  S SKJr  \\\\4   S	4   r SS
 jr " S S5      r\ " S S5      5       rg)    )annotations)Mapping)	dataclass)DesignSpaceDocument)TTFont)VariationModelnoRoundnormalizeValuepiecewiseLinearMapN)Self.c                F    [        [        U R                  5       5      5      $ )z;Create a hashable location from a dictionary-like location.)tuplesorteditems)locations    ^/var/www/piano.thomer.com/venv/lib/python3.13/site-packages/fontTools/feaLib/variableScalar.pyLocationr      s    ()**    c                  ^    \ rS rSr% SrS\S'    SS jrS r\SS j5       r	SS	 jr
SS
 jrSrg)VariableScalar   zFA scalar with different values at different points in the designspace.zdict[LocationTuple, int]valuesNc                    U=(       d    0 R                  5        VVs0 s H  u  p#[        U5      U_M     snnU l        / U l        g s  snnf N)r   r   r   axes)selflocation_valuer   values       r   __init__VariableScalar.__init__%   sK     %3$8b#?#?#A
#A X%#A
 	
s   Ac                X   / nU R                   R                  5        Hn  u  p#SR                  U VVs/ s H5  u  pEU S[        U5      R	                  5       (       a  [        U5      OU 3PM7     snn5      nUR                  SXc4-  5        Mp     SSR                  U5      -   S-   $ s  snnf )N,=z%s:%i( ))r   r   joinfloat
is_integerintappend)r   r   r   r   axcoordlocs          r   __repr__VariableScalar.__repr__.   s    #{{002OH(( &.%-	 d!%,*A*A*C*CCJOP%-C LLC</0  3 chhuo&,,s   <B&c                z   ^ [        U R                  R                  5       5      m[        U4S jTSS   5       5      $ )Nc              3  2   >#    U  H  oTS    :g  v   M     g7f)r   N ).0vr   s     r   	<genexpr>+VariableScalar.does_vary.<locals>.<genexpr>=   s     6:aq	>:s      )listr   any)r   r   s    @r   	does_varyVariableScalar.does_vary:   s1    dkk((*+66!":666r   c                2    X R                   [        U5      '   g r   )r   r   )r   r   r   s      r   	add_valueVariableScalar.add_value?   s    */HX&'r   c           	     x   [         R                  " S[        SS9  U R                  (       d  [	        S5      e[        U R                   Vs0 s H1  nUR                  UR                  UR                  UR                  4_M3     snUc  0 O[        UR                  5      Ub  UO0 S9nUR                  X5      $ s  snf )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()axis_triplesaxis_mappingsmodel_cache)warningswarnDeprecationWarningr   
ValueErrorVariableScalarBuilderaxisTagminValuedefaultValuemaxValuedictsegmentsadd_to_variation_store)r   store_builderrF   avarr,   builders         r   rR   %VariableScalar.add_to_variation_storeB   s    J		
 yy+  ( ))#B 

R[["//2;;GG# "&243F'2'>B
 --dBBs   
8B7)r   r   r   )returnbool)r   Mapping[str, float]r   r*   )NN)__name__
__module____qualname____firstlineno____doc____annotations__r   r/   propertyr;   r>   rR   __static_attributes__r3   r   r   r   r      s9    P$$%
- 7 70Cr   r   c                      \ rS rSr% SrS\S'    S\S'    S\S'    \SS	 j5       r\SS
 j5       rSS jr	SS jr
    SS jrSS jr      SS jrSS jrSS jr    SS jrSrg)rK   Z   z|A helper class for building variable scalars, or otherwise interrogating
their variation model for interpolation or similar.z%dict[str, tuple[float, float, float]]rD   z dict[str, Mapping[float, float]]rE   z/dict[tuple[LocationTuple, ...], VariationModel]rF   c           	     H   U " US   R                    Vs0 s H1  nUR                  UR                  UR                  UR                  4_M3     snUR                  S5      =nc  0 0 S9$ UR                  R                  5        VVs0 s H  u  p$X$_M	     snn0 S9$ s  snf s  snnf )NfvarrT   rC   )r   rL   rM   rN   rO   getrQ   r   )clsttfaxisrT   rQ   s        r   from_ttfVariableScalarBuilder.from_ttfj   s      K,,,D t}}d.?.?OO,  GGFO+D4  
 	
 <@==;N;N;PQ;Pdn;PQ
 	
 Rs   8BBc                   U " UR                    Vs0 s H1  nUR                  UR                  UR                  UR                  4_M3     snUR                    VVVs0 s H  nUR
                  (       d  M  UR                  UR
                   VVs0 s H  u  p4[        X2R                  UR                  UR                  45      [        UUR                  UR                  5      UR                  UR                  5      UR                  UR                  5      45      _M     snn_M     snnn0 S9$ s  snf s  snnf s  snnnf )NrC   )r   tagminimumdefaultmaximummapr
   map_forward)rg   docri   userdesigns        r   from_designspace&VariableScalarBuilder.from_designspacey   s$     HH$D 4<<t||DD$$  HH %D88 )- )1 #||T\\4<<H% ,,T\\: ,,T\\: ,,T\\:	 )1  %" -
 	

s$   8D/D:4D:BD4D:4D:c                    0 nU H+  u  p4X0R                   ;  a  [        SU< SU< 35      eXBU'   M-     U R                   R                  5        H  u  nu  pVnX2;  d  M  XbU'   M     [        U5      $ )zkValidate and fully-specify a user-space location by filling in
missing axes with their user-space defaults.zUnknown axis z in )rD   rJ   r   r   )r   r   fullaxtagr   _axis_defaults          r   _fully_specify_location-VariableScalarBuilder._fully_specify_location   sw     $LE--- E8!LMMK %
 ,0+<+<+B+B+D'E'AQ *U ,E ~r   c                    0 nU HQ  u  p4U R                   U   u  pVn[        XEXg45      nU R                  R                  U5      n	U	b  [	        X5      nXU'   MS     U$ )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).
)rD   r
   rE   rf   r   )
r   r   resultrz   r   axis_minr|   axis_max
normalizedmappings
             r   _normalize_location)VariableScalarBuilder._normalize_location   sm     $LE/3/@/@/G,HH',/QRJ((,,U3G"/
D
&5M % r   c                    UR                   R                  5        VVs/ s H  u  p#U R                  U5      U4PM     snn$ s  snnf )zrReturn a list of (fully-specified user-space location, value) pairs,
preserving order and length of scalar.values.)r   r   r}   )r   scalarr.   vals       r   _full_locations_and_values0VariableScalarBuilder._full_locations_and_values   sH     #MM//1
1 ))#.41
 	
 
s   Ac           
         [        U R                  R                  5        VVVs0 s H  u  nu  p4o2U_M     snnn5      nU R                  U5       H  u  pgXe:X  d  M  Us  $    [	        S5      es  snnnf )z+Get the default value of a variable scalar.z Default value could not be found)r   rD   r   r   rJ   )r   r   rm   r{   ro   default_locr   r   s           r   default_value#VariableScalarBuilder.default_value   su     6:6G6G6M6M6OP6O2c?A'\6OP
  $>>vFOH&  G ;<< Qs   A-c                (   U R                  U5      nU R                  U5      nU H  u  pEXB:X  d  M  Us  $    U VVs/ s H  u  peUPM	     nnnU R                  U5      nU R                  U5      R	                  X5      n	U	c  [        S5      eU	$ s  snnf )z7Interpolate the value of a scalar from a user-location.z,Insufficient number of values to interpolate)r}   r   r   modelinterpolateFromMastersrJ   )
r   r   r   pairsr.   r   r{   r   normalized_locationr   s
             r   value_at_location'VariableScalarBuilder.value_at_location   s    
 //9//7 HC
  %**E&!#E*"66x@

6"99:MV=KLL +s   Bc                V   U R                  U5      n[        S U 5       5      nU R                  R                  U5      nUb  U$ U VVs/ s H  u  pVU R	                  U5      PM     nnn[        U R                  R                  5       5      n[        XxS9=oR                  U'   U	$ s  snnf )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              3  *   #    U  H	  u  pUv   M     g 7fr   r3   )r4   r.   r{   s      r   r6   .VariableScalarBuilder.model.<locals>.<genexpr>   s     2E&##Es   )	axisOrder)	r   r   rF   rf   r   r9   rD   keysr   )
r   r   r   	cache_keycached_modelr.   r{   normalized_locationsr   r   s
             r   r   VariableScalarBuilder.model   s     //72E22	''++I6#LQRE&# 8 8 =ER**//12	.< /
 	
  +   Ss   	B%c                    [        UR                  R                  5       5      nU R                  U5      R                  U[        S9$ )zACalculate deltas and supports from this scalar's variation model.round)r9   r   r   getDeltasAndSupportsr   )r   r   r   s      r   get_deltas_and_supports-VariableScalarBuilder.get_deltas_and_supports   s8    fmm**,-zz&!66vU6KKr   c                    U R                  U5      u  p4UR                  U5        UR                  U[        S9n[	        U R                  U5      5      U4$ )zdSerialize this scalar's variation model to a store, returning the
default value and variation index.r   )r   setSupportsstoreDeltasr	   r*   r   )r   r   rS   deltassupportsindexs         r   rR   ,VariableScalarBuilder.add_to_variation_store   sW      77?!!(+))&)@ 4%%f-.55r   r3   N)rh   r   rW   r   )rs   r   rW   r   )r   LocationTuplerW   r   )r   r   rW   zdict[str, float])r   r   rW   zlist[tuple[LocationTuple, int]])r   r   rW   r*   )r   r   r   r   rW   r(   )r   r   rW   r   )r   r   )r   r   rW   ztuple[int, int])rZ   r[   r\   r]   r^   r_   classmethodrj   rv   r}   r   r   r   r   r   r   rR   ra   r3   r   r   rK   rK   Z   s    ; 87J33 A@L 
 
 
 
4 $	
$	
	(	

=$0=	,*L
6$6	6r   rK   )r   rY   rW   r   )
__future__r   collections.abcr   dataclassesr   fontTools.designspaceLibr   fontTools.ttLib.ttFontr   fontTools.varLib.modelsr   r	   r
   r   typingrG   TYPE_CHECKINGr   r   strr(   r   r   r   rK   r3   r   r   <module>r      s{    " # ! 8 )   	eCJ',- +
9C 9Cx n6 n6 n6r   