Ë
    ÚÍ:j~Y  ã                  ó¸  — d Z ddlmZ g d¢ZddlmZ ddlmZ ddlm	Z	 ddl
mZ erdd	lmZmZ d
„ Zd„ Zdd„Zdd„Zd„ Z	 d	 	 	 	 	 	 	 dd„Z	 dddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Z G d„ de«      Zdd„Zdd„Zedk(  r`ddlZddlZ eej:                  «      dkD  r ej<                   e«       «        ej<                   ej>                  «       j@                  «       yy) z%Variation fonts interpolation models.é    )Úannotations)ÚnormalizeValueÚnormalizeLocationÚsupportScalarÚpiecewiseLinearMapÚVariationModel)ÚMapping)ÚTYPE_CHECKING)ÚnoRoundé   )ÚVariationModelError)r	   ÚSequencec                ó2   — | D �cg c]  }|€Œ|‘Œ	 c}S c c}w ©N© )ÚlstÚls     úl/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/fontTools/varLib/models.pyÚnonNoner      s   € ØÖ,�!˜a™mŠAÒ,Ð,ùÒ,s   …�c                ó&   — t        d„ | D «       «      S )Nc              3  ó$   K  — | ]  }|d u –— Œ
 y ­wr   r   ©Ú.0r   s     r   ú	<genexpr>zallNone.<locals>.<genexpr>   s   è ø€ Ò&˜Qˆq�DŒyÑ&ùó   ‚©Úall)r   s    r   ÚallNoner      s   € ÜÑ& #Ô&Ó&Ð&ó    Nc                ón   ‡ ‡‡— ‰€t        ˆ fd„|D «       «      S  ‰‰ «      Št        ˆˆfd„|D «       «      S )Nc              3  ó(   •K  — | ]	  }‰|k(  –— Œ y ­wr   r   )r   ÚitemÚrefs     €r   r   zallEqualTo.<locals>.<genexpr>!   s   øè ø€ Ò/ 4�3˜$•;Ñ/ùs   ƒc              3  ó4   •K  — | ]  }‰ ‰|«      k(  –— Œ y ­wr   r   )r   r"   ÚmappedÚmappers     €€r   r   zallEqualTo.<locals>.<genexpr>$   s   øè ø€ Ò6¨$ˆv™ ›Õ%Ñ6ùó   ƒr   )r#   r   r&   r%   s   ` `@r   Ú
allEqualTor(      s3   ú€ Ø€~ÜÓ/¨3Ô/Ó/Ð/á�C‹[€FÜÔ6°#Ô6Ó6Ð6r   c                óp   — | syt        | «      }	 t        |«      }t        |||¬«      S # t        $ r Y yw xY w)NT)r&   )ÚiterÚnextÚStopIterationr(   )r   r&   ÚitÚfirsts       r   ÚallEqualr/   '   sD   € ÙØÜ	ˆc‹€BðÜ�R“ˆô �e˜R¨Ô/Ð/øô ò Ùðús   �) ©	5´5c                ó„   — t        | «      t        |«      k(  sJ ‚t        || «      D ��cg c]
  \  }}|sŒ	|‘Œ c}}S c c}}w r   ©ÚlenÚzip)Útruthr   r   Úts       r   ÚsubListr6   2   s8   € Üˆu‹:œ˜S›Ò!Ð!Ð!Ü˜c 5›/×/‘$�!�QªQŠAÓ/Ð/ùÓ/s   ©
<´<Fc           
     ó@  — |\  }}}||cxk  r|k  sn t        d|d›d|d›d|d›�«      ‚|st        t        | |«      |«      } | |k(  s||k(  ry| |k  r||k7  s
| |kD  r||k(  r| |z
  ||z
  z  S | |kD  r||k7  s| |k  r||k(  sJ d| › d|› d|› d|› d�	«       ‚| |z
  ||z
  z  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=(ú))Ú
ValueErrorÚmaxÚmin)ÚvÚtripleÚextrapolateÚlowerÚdefaultÚuppers         r   r   r   7   sþ   € ð #Ñ€Eˆ7�EØ�WÔ% Ô%ÜØFØ�Tˆl˜"˜W T˜N¨"¨U°4¨Lð:ó
ð 	
ñ Ü”�A�u“˜uÓ%ˆàˆG‚|�u ’~Øà	ˆGŠ˜ Ò(¨a°'ªk¸eÀwÒ>NØ�G‘ ¨%¡Ñ0Ð0à�G’ ¨Ò 0Ø�ŠK˜E WÒ,ð	Cà˜˜˜: e W¨B¨w¨i°r¸%¸ÀÐBó	Cð 
ð �G‘ ¨¡Ñ0Ð0r   )Úvalidatec               ó`  — |rkt        | j                  «       «      t        |j                  «       «      k  s8J t        | j                  «       «      t        |j                  «       «      z
  «       ‚i }|j                  «       D ]+  \  }}| j                  ||d   «      }t	        |||¬«      ||<   Œ- |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   )r?   )ÚsetÚkeysÚitemsÚgetr   )ÚlocationÚaxesr?   rC   ÚoutÚtagr>   r=   s           r   r   r   X   s¦   € ñZ Ü�8—=‘=“?Ó#¤s¨4¯9©9«;Ó'7Ò7ð 	
¼¸X¿]¹]»_Ó9MÔPSØ�I‰I‹KóQ
ñ :
ó 	
Ð7ð €CØ—z‘z“|ò F‰ˆˆVØ�L‰L˜˜f Q™iÓ(ˆÜ! ! V¸ÔEˆˆCŠðFð €Jr   c                ó6  — |r|€t        d«      ‚d}|j                  «       D ]ô  \  }\  }}}	|r/|dk(  rŒ||kD  s||	kD  rŒ|dk  r|	dkD  rŒ(| j                  |d«      }
n|| v sJ ‚| |   }
|
|k(  rŒL|rv||   \  }}|
|k  r2||k  r-||k  r||	k  r||
|	z
  ||	z
  z  z  }Œy||k  rF||
|z
  ||z
  z  z  }Œ�||
k  r2||	k  r-||k  r||k  r||
|z
  ||z
  z  z  }Œ°||k  r||
|	z
  ||	z
  z  z  }ŒÄ|
|k  s|	|
k  rd} |S |
|k  r||
|z
  ||z
  z  z  }Œç||
|	z
  ||	z
  z  z  }Œö |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
    z2axisRanges must be passed when extrapolate is Trueg      ð?r8   )Ú	TypeErrorrG   rH   )rI   ÚsupportÚotr?   Ú
axisRangesÚscalarÚaxisr@   ÚpeakrB   r=   ÚaxisMinÚaxisMaxs                r   r   r   �   s·  € ñD �zÐ)ÜÐLÓMÐMØ€FØ&-§m¡m£oò (3Ñ"ˆÑ"ˆu�d˜EÙà�sŠ{ØØ�tŠ|˜t eš|ØØ�sŠ{˜u sš{ØØ—‘˜T 3Ó'‰Aà˜8Ñ#Ð#Ð#Ø˜‘ˆAØ�Š9ØáØ)¨$Ñ/ÑˆG�WØ�7Š{˜u¨Ò/Ø˜7’? t¨e¢|Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØØ˜t’^Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØØ˜1’ ¨EÒ!1Ø˜d’? u¨t¢|Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØØ˜G’^Ø˜q 5™y¨T°E©\Ñ:Ñ:�FØà�Š:˜ !šØˆFØð €Mð	 ˆtŠ8Ø�q˜5‘y T¨E¡\Ñ2Ñ2‰Fà�q˜5‘y T¨E¡\Ñ2Ñ2‰FðQ(3ðR €Mr   c                  óÄ   — e Zd ZdZ	 dddœd„Zd„ Zed„ «       Zeg fd„«       Zd„ Z	d	„ Z
d
„ Zd„ Zedœd„Zedœd„Zd„ Zd„ Zed„ «       Zed„ «       Zd„ Zedœd„Zedœd„Zy)r   a5  Locations must have the base master at the origin (ie. 0).

    If axis-ranges are not provided, values are assumed to be normalized to
    the range [-1, 1].

    If the extrapolate argument is set to True, then values are extrapolated
    outside the axis range.

      >>> from pprint import pprint
      >>> axisRanges = {'wght': (-180, +180), 'wdth': (-1, +1)}
      >>> 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'], axisRanges=axisRanges)
      >>> 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}]
    N)rQ   c               ó>  — |D ���cg c],  }|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}‘Œ. }}}}t        t        d„ |D «       «      «      t        |«      k7  rt        d«      ‚|| _        |�|ng | _        || _        |€J|r| j                  |«      }n6|D ��ch c]  }|j                  «       D ]  }|’Œ Œ }	}}|	D �ci c]  }|d“Œ }}|| _	        | j                  || j
                  ¬«      }
t        ||
¬«      | _        |D �cg c]  }| j                  j                  |«      ‘Œ c}| _        | j                  D �cg c]  }|j                  |«      ‘Œ c}| _        | j!                  «        i | _        y c c}}w c c}}}w c c}}w c c}w c c}w c c}w )Nr8   c              3  ó`   K  — | ]&  }t        t        |j                  «       «      «      –— Œ( y ­wr   )ÚtupleÚsortedrG   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>  s    è ø€ Ò?°”5œ §¡£	Ó*×+Ñ?ùs   ‚,.zLocations must be unique.)éÿÿÿÿr   )Ú	axisOrder)Úkey)rG   r2   rE   r   ÚorigLocationsr]   r?   ÚcomputeAxisRangesrF   rQ   ÚgetMasterLocationsSortKeyFuncr[   Ú	locationsÚindexÚmappingÚreverseMappingÚ_computeMasterSupportsÚ
_subModels)Úselfrb   r]   r?   rQ   ÚlocÚkr=   rS   ÚallAxesÚkeyFuncr   s               r   Ú__init__zVariationModel.__init__  s}  € ð LU×UÐUÀC s§y¡y£{×?™t˜q !°a¸3³h�a˜‘dÕ?ÐUˆ	ÒUäŒsÑ?°YÔ?Ó?Ó@ÄCÈ	ÃNÒRÜ%Ð&AÓBÐBà&ˆÔØ&/Ð&;™ÀˆŒØ&ˆÔØÐÙØ!×3Ñ3°IÓ>‘
à+4×L CÀÇÁÃÒL¸š4ÐL˜4ÐL�ÑLØ8?Ö@°˜d G™mÐ@�
Ð@Ø$ˆŒØ×4Ñ4Ø §¡ð 5ó 
ˆô   	¨wÔ7ˆŒð :CÖC°A˜Ÿ™×,Ñ,¨QÕ/ÒCˆŒØ;?¿>¹>ÖJ°a˜yŸ™¨qÕ1ÒJˆÔà×#Ñ#Ô%Øˆ�ùó3 @ùÔUùó MùÚ@ùò DùÚJs2   ‡FŸE=­E=²FÂ"F
Ã
FÄ"FÅFÅ=Fc                ó,  — d|vr| |fS t        d„ |D «       «      }| j                  j                  |«      }|€Pt        t	        || j
                  «      | j                  | j                  | j                  ¬«      }|| j                  |<   |t	        ||«      fS )zºReturn a sub-model and the items that are not None.

        The sub-model is necessary for working with the subset
        of items when some are None.

        The sub-model is cached.Nc              3  ó$   K  — | ]  }|d u–— Œ
 y ­wr   r   ©r   r=   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>:  s   è ø€ Ò1 a�A˜T”MÑ1ùr   ©r?   rQ   )	rZ   rg   rH   r   r6   r_   r]   r?   rQ   )rh   rG   r^   ÚsubModels       r   ÚgetSubModelzVariationModel.getSubModel1  s“   € ð �uÑØ˜�;ÐÜÑ1¨5Ô1Ó1ˆØ—?‘?×&Ñ& sÓ+ˆØÐÜ%Ü˜˜T×/Ñ/Ó0Ø—‘Ø ×,Ñ,ØŸ?™?ô	ˆHð $,ˆD�O‰O˜CÑ Øœ  eÓ,Ð,Ð,r   c                ó  — i }| D ��ch c]  }|j                  «       D ]  }|’Œ Œ }}}| D ]M  }|D ]F  }|j                  |d«      }|j                  |||f«      \  }}t        ||«      t        ||«      f||<   ŒH ŒO |S c c}}w )Nr   )rF   rH   r<   r;   )rb   rQ   ri   rS   rk   ÚvaluerU   rV   s           r   r`   z VariationModel.computeAxisRangesF  s¢   € àˆ
Ø#,×D˜C¸¿¹»ÒD°’4ÐD�4ÐDˆÑDØò 	LˆCØò L�ØŸ™  aÓ(�Ø#-§>¡>°$¸À¸Ó#GÑ �˜Ü#& u¨gÓ#6¼¸EÀ7Ó8KÐ#K�
˜4Ò ñLð	Lð
 Ðùó Es   ˆA=c                ó  — i | vrt        d«      ‚i }| D ]_  }t        |«      dk7  rŒt        t        |«      «      }||   }||vrdh||<   |||   vsJ d|›d|›d|›�«       ‚||   j	                  |«       Œa d„ } |||«      }|S )NzBase master not found.r   r8   zValue "z" in axisPoints["z"] -->  c                ó    ‡ ‡‡— d„ Šˆˆ ˆfd„}|S )Nc                ó"   — | dk  rdS | dkD  rdS dS )Nr   r\   r   r   )r=   s    r   ÚsignzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.signc  s   € Ø šU�rÐ:¨a°!ªe¨Ð:¸Ð:r   c           	     óØ  •‡ — t        ‰ «      }‰ j                  «       D ��cg c]  \  }}|‰v r	|‰|   v r|‘Œ }}}‰D �cg c]	  }|‰ v sŒ|‘Œ }}|j                  t        ‰ j	                  «       «      D �cg c]	  }|‰vsŒ|‘Œ c}«       |t        |«       t        ˆfd„|D «       «      t        |«      t        ˆ ˆfd„|D «       «      t        ˆ fd„|D «       «      fS c c}}w c c}w c c}w )Nc              3  óL   •K  — | ]  }|‰v r‰j                  |«      nd –— Œ y­w)i   N)rc   )r   rS   r]   s     €r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>t  s.   øè ø€ ò à ð 26¸Ñ1B˜	Ÿ™¨Ô-ÈÓOñùs   ƒ!$c              3  ó4   •K  — | ]  } ‰‰|   «      –— Œ y ­wr   r   )r   rS   ri   ry   s     €€r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>y  s   øè ø€ ò Ø,0™˜S ™YŸñùr'   c              3  ó:   •K  — | ]  }t        ‰|   «      –— Œ y ­wr   )Úabs)r   rS   ri   s     €r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>|  s   øè ø€ ò Ø+/œ˜C ™IŸñùs   ƒ)r2   rG   Úextendr[   rF   rZ   )	ri   ÚrankrS   ru   ÚonPointAxesÚorderedAxesr]   Ú
axisPointsry   s	   `     €€€r   r^   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyf  s  ù€ Ü˜3“x�ð (+§y¡y£{÷á#˜˜eØ˜zÑ)¨e°zÀ$Ñ7GÑ.Gò ð�ñ ð
 1:ÖI¨¸TÀSº[štÐI�ÐIØ×"Ñ"Ü&,¨S¯X©X«ZÓ&8ÖR˜d¸DÈ	Ò<Q’TÒRôð Ü˜Ó%Ð%Üó à$/ôó ô ˜+Ó&Üô Ø4?ôó ô ó Ø3>ôó ðð ùóùò
 JùâRs   ¡C¿	C"Á	C"Á5	C'Á?C'r   )rƒ   r]   r^   ry   s   `` @r   ÚgetKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKeyb  s   ú€ ò;öð6 ˆJr   )r   r2   r+   r*   Úadd)rb   r]   rƒ   ri   rS   ru   r„   Úrets           r   ra   z,VariationModel.getMasterLocationsSortKeyFuncQ  s´   € à�YÑÜ%Ð&>Ó?Ð?Øˆ
Øò 
	(ˆCÜ�3‹x˜1Š}ØÜœ˜S›	“?ˆDØ˜‘IˆEØ˜:Ñ%Ø$' 5�
˜4Ñ à˜Z¨Ñ-Ñ-ñTâ;@Â$É
ÐSóTØ-à�tÑ× Ñ  Õ'ð
	(ò	ñB �Z Ó+ˆØˆ
r   c                ó   — |D �cg c]  }||   ‘Œ	 }}|D �cg c]  }| j                   |   ‘Œ c}| _         | j                   D ���cg c],  }|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}‘Œ. }}}}|D �	cg c]  }	| j                  j                  |	«      ‘Œ c}	| _        | j                  D �	cg c]  }	|j                  |	«      ‘Œ c}	| _        i | _        |S c c}w c c}w c c}}w c c}}}w c c}	w c c}	w )Nr8   )r_   rG   rb   rc   rd   re   rg   )
rh   Úmaster_listrd   ÚidxÚnew_listri   rj   r=   rb   r   s
             r   ÚreorderMasterszVariationModel.reorderMasters†  sç   € ð 18Ö8¨�K Ó$Ð8ˆÐ8ØAHÖI¸#˜d×0Ñ0°Ó5ÒIˆÔàBF×BTÑBT÷
ð 
Ø;>˜cŸi™i›k×6‘d�a˜¨Q°#«XˆQ�‰TÕ6ð
ˆ	ò 
ð :CÖC°A˜Ÿ™×,Ñ,¨QÕ/ÒCˆŒØ;?¿>¹>ÖJ°a˜yŸ™¨qÕ1ÒJˆÔØˆŒØˆùò 9ùÚIùã6ùô
ùò DùÚJs4   …C—C$ÁC/ÁC)Á+C)Á0C/Á>"C6Â6C;Ã)C/c                óØ  — g | _         | j                  «       }t        |«      D �]4  \  }}t        |j	                  «       «      }|d | D ]ò  }t        |j	                  «       «      |k7  rŒ d}|j                  «       D ],  \  }\  }}	}
||   d   |	k(  rŒ|||   d   cxk  r|
k  rŒ(n d} n |sŒdi }d}|j	                  «       D ][  }||   d   }||v sJ ‚||   \  }}}
||
}}||k  r|}||z
  ||z
  z  }n||k  r|}||z
  |
|z
  z  }nŒE||kD  ri }|}||k(  sŒT|||f||<   Œ] |j                  «       D ]
  \  }}|||<   Œ Œô | j                   j                  |«       �Œ7 | j                  «        y )NTr   Fr\   )ÚsupportsÚ_locationsToRegionsÚ	enumeraterE   rF   rG   ÚappendÚ_computeDeltaWeights)rh   ÚregionsÚiÚregionÚlocAxesÚprev_regionÚrelevantrS   r@   rT   rB   ÚbestAxesÚ	bestRatioÚvalÚlocVÚnewLowerÚnewUpperÚratior>   s                      r   rf   z%VariationModel._computeMasterSupports“  sÜ  € ØˆŒØ×*Ñ*Ó,ˆÜ" 7Ó+ó 2	)‰IˆAˆvÜ˜&Ÿ+™+›-Ó(ˆGà& r¨˜{ò .*�ä�{×'Ñ'Ó)Ó*¨gÒ5Øà�Ø28·,±,³.ò Ñ.�DÑ.˜5 $¨à# DÑ)¨!Ñ,°Ó4Ø  ;¨tÑ#4°QÑ#7Ô?¸%Õ?à#(˜Ùðñ  Øð �Ø�	Ø'×,Ñ,Ó.ò D�DØ% dÑ+¨AÑ.�CØ 6™>Ð)˜>Ø)/°©Ñ&�E˜4 Ø).°˜h�HØ˜T’zØ#&˜Ø!$ t¡°¸±Ñ =™Ø šØ#&˜Ø!$ t¡°¸±Ñ =™ð !Ø˜yÒ(Ø#%˜Ø$)˜	Ø 	Ó)Ø*2°D¸(Ð)C˜ šð%Dð( %-§N¡NÓ$4ò *‘L�D˜&Ø#)�F˜4’Lñ*ð[.*ð^ �M‰M× Ñ  Ö(ðe2	)ðf 	×!Ñ!Õ#r   c                óâ   — | j                   }| j                  }g }|D ]O  }i }|j                  «       D ]'  \  }}|dkD  rd|||   d   f||<   Œ||   d   |df||<   Œ) |j                  |«       ŒQ |S )Nr   r   )rb   rQ   rG   r�   )rh   rb   rQ   r’   ri   r”   rS   r›   s           r   rŽ   z"VariationModel._locationsToRegionsË  s˜   € Ø—N‘Nˆ	Ø—_‘_ˆ
àˆØò 	#ˆCØˆFØ!Ÿi™i›kò B‘
��dØ˜!’8Ø$% t¨Z¸Ñ-=¸aÑ-@Ð#A�F˜4’Là$.¨tÑ$4°QÑ$7¸¸qÐ#A�F˜4’Lð	Bð
 �N‰N˜6Õ"ð	#ð ˆr   c                óî   — g | _         t        | j                  «      D ]V  \  }}i }t        | j                  d | «      D ]  \  }}t	        ||«      }|sŒ|||<   Œ | j                   j                  |«       ŒX y r   )ÚdeltaWeightsr�   rb   r�   r   r�   )rh   r“   ri   ÚdeltaWeightÚjrO   rR   s          r   r‘   z#VariationModel._computeDeltaWeightsÚ  s|   € ØˆÔÜ §¡Ó/ò 	2‰FˆAˆsØˆKä'¨¯©°b°qÐ(9Ó:ò ,‘
��7Ü& s¨GÓ4�ÚØ%+�K ’Nð,ð ×Ñ×$Ñ$ [Õ1ñ	2r   ©Úroundc               óˆ  — t        |«      t        | j                  «      k(  s%J t        |«      t        | j                  «      f«       ‚| j                  }g }t        | j                  «      D ]U  \  }}|||      }|j	                  «       D ]  \  }}	|	dk(  r	|||   z  }Œ|||   |	z  z  }Œ  |j                   ||«      «       ŒW |S )Nr   )r2   r¡   re   r�   rG   r�   )
rh   ÚmasterValuesr¥   rd   rK   r“   ÚweightsÚdeltar£   Úweights
             r   Ú	getDeltaszVariationModel.getDeltaså  sØ   € Ü�<Ó ¤C¨×(9Ñ(9Ó$:Ò:ð 	
Ü�ÓÜ�×!Ñ!Ó"ð=
ó 	
Ð:ð ×%Ñ%ˆØˆÜ# D×$5Ñ$5Ó6ò 	%‰JˆAˆwØ  ¨¡Ñ,ˆEØ$Ÿ]™]›_ò -‘	��6Ø˜Q’;Ø˜S ™V‘O‘Eà˜S ™V f™_Ñ,‘Eð	-ð
 �J‰J‘u˜U“|Õ$ð	%ð ˆ
r   c               óh   — | j                  |«      \  }}|j                  ||¬«      |j                  fS )Nr¤   )rs   r«   r�   )rh   rG   r¥   Úmodels       r   ÚgetDeltasAndSupportsz#VariationModel.getDeltasAndSupportsö  s2   € Ø×'Ñ'¨Ó.‰ˆˆuØ�‰˜u¨EˆÓ2°E·N±NÐBÐBr   c           	     ó‚   — | j                   D �cg c]%  }t        ||| j                  | j                  ¬«      ‘Œ' c}S c c}w )zûReturn scalars for each delta, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromMastersAndScalars().rq   )r�   r   r?   rQ   )rh   ri   rO   s      r   Ú
getScalarszVariationModel.getScalarsú  sB   € ð  Ÿ=™=ö	
ð ô Ø�W¨$×*:Ñ*:ÀtÇÁöò
ð 	
ùò 
s   �*<c                óH  — | j                  |«      }t        t        t        | j                  «      «      «      D ]0  \  }}|j                  «       D ]  \  }}||xx   ||   |z  z  cc<   Œ Œ2 t        t        |«      «      D �cg c]  }|| j                  |      ‘Œ }}|S c c}w )a­  Return multipliers for each master, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromValuesAndScalars().

        Note that the scalars used in interpolateFromMastersAndScalars(),
        are *not* the same as the ones returned here. They are the result
        of getScalars().)	r°   ÚreversedÚlistr�   r¡   rG   Úranger2   rd   )rh   ÚtargetLocationrK   r“   r¨   r£   rª   s          r   ÚgetMasterScalarszVariationModel.getMasterScalars  s�   € ð �o‰o˜nÓ-ˆÜ"¤4¬	°$×2CÑ2CÓ(DÓ#EÓFò 	*‰JˆAˆwØ$Ÿ]™]›_ò *‘	��6Ø�A“˜#˜a™& 6™/Ñ)”ñ*ð	*ô .3´3°s³8«_Ö=¨ˆs�4—<‘< ‘?Ó#Ð=ˆÐ=Øˆ
ùò >s   ÂBc                óˆ   — d}t        | «      t        |«      k(  sJ ‚t        | |«      D ]  \  }}|sŒ	||z  }|€|}Œ||z  }Œ |S )aV  Interpolate from values and scalars coefficients.

        If the values are master-values, then the scalars should be
        fetched from getMasterScalars().

        If the values are deltas, then the scalars should be fetched
        from getScalars(); in which case this is the same as
        interpolateFromDeltasAndScalars().
        Nr1   )ÚvaluesÚscalarsr=   ru   rR   Úcontributions         r   ÚinterpolateFromValuesAndScalarsz.VariationModel.interpolateFromValuesAndScalars  sc   € ð ˆÜ�6‹{œc '›lÒ*Ð*Ð*Ü  ¨Ó1ò 	"‰MˆE�6ÙØØ  6™>ˆLØˆyØ ‘à�\Ñ!‘ð	"ð ˆr   c                ó.   — t         j                  | |«      S )z>Interpolate from deltas and scalars fetched from getScalars().)r   r»   )Údeltasr¹   s     r   ÚinterpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars.  s   € ô ×=Ñ=¸fÀgÓNÐNr   c                óH   — | j                  |«      }| j                  ||«      S )z)Interpolate from deltas, at location loc.)r°   r¾   )rh   ri   r½   r¹   s       r   ÚinterpolateFromDeltasz$VariationModel.interpolateFromDeltas3  s#   € à—/‘/ #Ó&ˆØ×3Ñ3°F¸GÓDÐDr   c               óH   — | j                  |«      }| j                  ||«      S )z0Interpolate from master-values, at location loc.)r¶   r»   )rh   ri   r§   r¥   r¹   s        r   ÚinterpolateFromMastersz%VariationModel.interpolateFromMasters8  s%   € à×'Ñ'¨Ó,ˆØ×3Ñ3°LÀ'ÓJÐJr   c               óL   — | j                  ||¬«      }| j                  ||«      S )z²Interpolate from master-values, and scalars fetched from
        getScalars(), which is useful when you want to interpolate
        multiple master-values with the same location.r¤   )r«   r¾   )rh   r§   r¹   r¥   r½   s        r   Ú interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars=  s)   € ð —‘ °E�Ó:ˆØ×3Ñ3°F¸GÓDÐDr   )NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rm   rs   Ústaticmethodr`   ra   r‹   rf   rŽ   r‘   r   r«   r®   r°   r¶   r»   r¾   rÀ   rÂ   rÄ   r   r   r   r   r   á   sÉ   „ ñ/ðd 6;ðØJNôò<-ð* ñó ðð Ø;=ò 2ó ð2òhò6$òpò	2ð 07ô ð" 4;ô Cò

òð" ñó ðð, ñOó ðOòEð
 BIô Kð
 PWõ Er   r   c                ó6  ‡ — |j                  «       }|s‰ S ‰ |v r|‰    S t        |«      }‰ |k  r‰ ||   z   |z
  S t        |«      }‰ |kD  r‰ ||   z   |z
  S t        ˆ fd„|D «       «      }t        ˆ fd„|D «       «      }||   }||   }|||z
  ‰ |z
  z  ||z
  z  z   S )Nc              3  ó.   •K  — | ]  }|‰k  sŒ	|–— Œ y ­wr   r   ©r   rj   r=   s     €r   r   z%piecewiseLinearMap.<locals>.<genexpr>R  ó   øè ø€ Ò%�!˜q 1›uŒAÑ%ùó   ƒ
Žc              3  ó.   •K  — | ]  }|‰kD  sŒ	|–— Œ y ­wr   r   rÌ   s     €r   r   z%piecewiseLinearMap.<locals>.<genexpr>S  rÍ   rÎ   )rF   r<   r;   )r=   rd   rF   rj   ÚaÚbÚvaÚvbs   `       r   r   r   E  sÀ   ø€ Ø�<‰<‹>€DÙØˆØˆD�yØ�q‰zÐÜˆD‹	€AØˆ1‚uØ�7˜1‘:‰~ Ñ!Ð!ÜˆD‹	€AØˆ1‚uØ�7˜1‘:‰~ Ñ!Ð!äÓ%�tÔ%Ó%€AÜÓ%�tÔ%Ó%€AØ	�‰€BØ	�‰€BØ��b‘˜Q ™UÑ# q¨1¡uÑ-Ñ-Ð-r   c                ó`  — ddl m} ddl}|j                  dt        j
                  ¬«      }|j                  dddd	¬
«       |j                  d¬«      }|j                  dddt        ¬«       |j                  ddddd¬«       |j                  | «      }  || j                  ¬«       ddlm} | j                  r¥ddlm}  |«       }|j                  | j                  «       |j                   D �cg c]  }|j"                  ‘Œ }	}t%        d«        ||	«       |j'                  «        t%        d«       |j                   D �cg c]  }|j"                  ‘Œ }	} ||	«       nyt)        t+        d«      t+        d«      dz   «      D �
cg c]  }
t-        |
«      ‘Œ }}
| j.                  D �cg c]-  }t1        t3        |d„ |j5                  d «      D «       «      «      ‘Œ/ }	}t7        |	«      }t%        d!«        ||j.                  «       t%        d"«        ||j8                  «       yc c}w c c}w c c}
w c c}w )#z*Normalize locations on a given designspacer   )ÚconfigLoggerNzfonttools varLib.models)Údescriptionz
--loglevelÚLEVELÚINFOz Logging level (defaults to INFO))ÚmetavarrA   ÚhelpT)Úrequiredz-dz--designspaceÚDESIGNSPACE)rÙ   Útypez-lz--locationsÚLOCATIONú+zFMaster locations as comma-separate coordinates. One must be all zeros.)rÙ   ÚnargsrÚ   )Úlevel)Úpprint)ÚDesignSpaceDocumentzOriginal locations:zNormalized locations:ÚAÚZr   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   )Úfloatrp   s     r   r   zmain.<locals>.<genexpr>‡  s   è ø€ Ò;¨œE !ŸHÑ;ùs   ‚ú,zSorted locations:z	Supports:)Ú	fontToolsrÕ   ÚargparseÚArgumentParserÚmainrÈ   Úadd_argumentÚadd_mutually_exclusive_groupÚstrÚ
parse_argsÚloglevelrâ   ÚdesignspaceÚfontTools.designspaceLibrã   ÚreadÚsourcesrI   ÚprintÚ	normalizer´   ÚordÚchrrb   Údictr3   Úsplitr   r�   )ÚargsrÕ   rê   ÚparserÚgrouprâ   rã   ÚdocÚsÚlocsÚcrJ   r­   s                r   rì   rì   Y  sç  € å&Ûà×$Ñ$Ø!Ü—L‘Lð %ó €Fð ×ÑØØØØ/ð	 ô ð ×/Ñ/¸Ð/Ó>€EØ	×Ñ�t˜_°mÌ#ÐÔNØ	×ÑØØØØØUð ô ð ×Ñ˜TÓ"€Dá�t—}‘}Õ%Ýà×ÒÝ@á!Ó#ˆØ�‰�×!Ñ!Ô"Ø$'§K¡KÖ0˜q�—
“
Ð0ˆÐ0ÜÐ#Ô$ÙˆtŒØ�‰ŒÜÐ%Ô&Ø$'§K¡KÖ0˜q�—
“
Ð0ˆÐ0Ùˆt�ä %¤c¨#£h´°C³¸1±Ó =Ö>˜1”�A•Ð>ˆÐ>àGKÇ~Á~ö
ØBCŒD”�TÑ;¨a¯g©g°c«lÔ;Ó<Õ=ð
ˆð 
ô ˜4Ó €EÜ	Ð
ÔÙ
ˆ5�?‰?ÔÜ	ˆ+ÔÙ
ˆ5�>‰>Õùò# 1ùò
 1ùò ?ùò
s   Ã.HÄ?H!Æ H&Æ"2H+Ú__main__r   )F)r=   rç   r>   zSequence[float]r?   ÚboolÚreturnrç   )
rI   zMapping[str, float]rJ   z(Mapping[str, tuple[float, float, float]]r?   r  rC   r  r  zdict[str, float])TFN)r=   rç   rd   zMapping[float, float]r  rç   )!rÈ   Ú
__future__r   Ú__all__Úcollections.abcr	   Útypingr
   ÚfontTools.misc.roundToolsr   Úerrorsr   r   r   r   r(   r/   r6   r   r   r   Úobjectr   r   rì   rÅ   ÚdoctestÚsysr2   ÚargvÚexitÚtestmodÚfailedr   r   r   ú<module>r     s"  ðÙ +å "ò€õ $Ý  Ý -Ý 'ñ ß(ò-ò'ó7ó0ò0ð <Að1Øð1Ø%ð1Ø48ð1à
ó1ðH ð5ð
 ñ5Ø!ð5à
2ð5ð ð5ð
 ð5ð ó5ópNôbaE�Vô aEóH.ó(5ðp ˆzÒßá
ˆ3�8‰8ƒ}�qÒØˆ�‰‘“Ôà€C‡H�Hˆ_ˆW�_‰_Ó×%Ñ%Õ&ð r   