
    h:                     p    S SK r \ R                  rS SKJrJrJ	r	  S SK
JrJr  \\\4   r\\\4   r\\   r\\   r\	\S4   r\\   r\\   rSr\ R*                  \ R,                  " \ R.                  \ R.                  \ R0                  \ R0                  \ R0                  \ R0                  \ R0                  \ R0                  \ R0                  S9	S\S\S	\S
\S\4
S j5       5       rS\S\S\4S jrS\S\S\S\4S jr\ R*                  \ R8                  \ R,                  " \ R.                  \ R.                  \ R0                  \ R0                  \ R0                  \ R0                  S9\ R:                  " \5      S\S\S\S\S\4
S j5       5       5       5       r\ R,                  " \ R0                  \ R0                  \ R0                  \ R0                  \ R0                  \ R0                  \ R.                  \S9 S$S\S\S\S\4S jj5       r \ R,                  " \ R.                  \ R.                  \ R0                  \ R.                  \ R0                  \\ R0                  S9\" 5       S S4S\S\S\S\4S jj5       r!S\"S\4S jr#S\S\S \4S! jr$ S%S\S\S\S\4S" jjr% S%S\S\S\S\S\4
S# jjr&g! \\4 a
    S SKJ r    GNf = f)&    N)cython)SequenceTupleUnion)IntegralReal   )	jnx1x2d1d2scalexdcoordsrc1rd1rc2rd2c                 v   SS/nS H  n/ =XV'   nX   X6   X&   XF   4u  ppX:X  a=  [        U 5      nX:X  a  UR                  U
/U-  5        OUR                  S/U-  5        M\  X:  a  XpXpX-
  X-
  -  nU  H4  nX   nX::  a  U
nOX:  a  UnOX-
  U-  nU
U-   nUR                  U5        M6     M     [        U6 $ )zGiven two reference coordinates `rc1` & `rc2` and their respective
delta vectors `rd1` & `rd2`, returns interpolated deltas for the set of
coordinates `coords`.Nr      r   )lenextendappendzip)r   r   r   r   r   
out_arraysr
   outr   r   r   r   r   r   pairr   r   nudges                     F/var/www/html/env/lib/python3.13/site-packages/fontTools/varLib/iup.pyiup_segmentr$      s    * J  
78FAx

B4!8$

A37#7 RW%DAw 5(JJJqM% % L 
    deltasreturnc                 *   [        U 5      [        U5      :X  d   eSU ;  a  U $ [        U 5      n[        U 5       VVs/ s H  u  p4Uc  M
  UPM     nnnU(       d  S/U-  $ / n[        U5      n[        U5      nUS:w  a3  SXUS   4u  ppUR	                  [        XU
 X   X   X   X   5      5        UR                  X   5        U HS  nX-
  S:  a3  US-   XU4u  ppUR	                  [        XU
 X   X   X   X   5      5        UR                  X   5        UnMU     XS-
  :w  a6  US-   X(US   4u  ppUR	                  [        XU
 X   X   X   X   5      5        [        U 5      [        U5      :X  d   [        U 5      [        U5      45       eU$ s  snnf )zFor the contour given in `coords`, interpolate any missing
delta values in delta vector `deltas`.

Returns fully filled-out delta vector.N)r   r   r   r   )r   	enumerateiternextr   r$   r   )r&   r   r   ivindicesr    itstarti1i2ri1ri2ends                 r#   iup_contourr7   [   s    v;#f+%%%6FA&v.@.TQ!q.G@x!|
C	gBHEzeGBK7

"v{FKfk	

 JJv};?$qy#c9BCJJbM6;V[&+
 	

6;  A~ 19a
:

"v{FKfk	
 v;#c(";S[#c($;;"JK As   	F	Fendsc                    [        U5      U:X  a!  [        U5      U(       a  US   S-   OSS-   :X  d   e[        U5      nX#S-
  US-
  US-
  US-
  /-   n/ nSnU H+  nUS-  n[        XU XU 5      nUR                  U5        UnM-     U$ )zFor the outline given in `coords`, with contour endpoints given
in sorted increasing order in `ends`, interpolate any missing
delta values in delta vector `deltas`.

Returns fully filled-out delta vector.r)   r   r            )sortedr   r7   r   )r&   r   r8   r   r    r1   r6   contours           r#   	iup_deltar?      s     $<4CKDDHqLaST3T$TTTFAq5!a%QA..D
CEqf3/c1BC

7	  Jr%   )r-   r
   r   ypqr-   r
   	tolerancec                    ^ X2-
  S:  d   e[        XS-   U X   X   X   X   5      nXS-   U n [        U4S j[        X5       5       5      $ )zReturn true if the deltas for points at `i` and `j` (`i < j`) can be
successfully used to interpolate deltas for points in between them within
provided error tolerance.r<   r   c              3   j   >#    U  H(  u  u  pu  p4[        [        X-
  X$-
  5      5      T:*  v   M*     g 7fNabscomplex).0r   r@   rA   rB   rC   s        r#   	<genexpr>%can_iup_in_between.<locals>.<genexpr>   s5      1NFQFQ 	GAE15!"i/1s   03)r$   allr   )r&   r   r-   r
   rC   interps       ` r#   can_iup_in_betweenrO      sc    . 5A::A*FIvy&)VYWFEAF !&1  r%   )cjdjlcjldjncjndjforceforcedc                 P   [        U 5      [        U5      :X  d   e[        U 5      n[        5       n[        [        U 5      S-
  SS5       GHX  nXS-
     XS-
     pvX   X   pXU-
  S-      XU-
  S-      pS GH&  nX   nX   nX|   nXl   nX   nX   nUU::  a	  UUnnUUnnOUUnnUUnnSnUU:X  a$  [        UU-
  5      U:  a  [        U5      U:  a  SnOUUs=::  a  U::  a/  O  O,[	        UU5      U-
  Us=::  a  [        UU5      U-   ::  d  O  SnOoUU:w  ai  UU:  a2  [        U5      U:  a"  [        UU-
  5      U:  a  X-
  U:  UU:  :w  a  SnO1[        U5      U:  a"  [        UU-
  5      U:  a  UX-   :  UU:  :w  a  SnU(       d  GM  UR                  U5          GMV     GM[     U$ )a  The forced set is a conservative set of points on the contour that must be encoded
explicitly (ie. cannot be interpolated).  Calculating this set allows for significantly
speeding up the dynamic-programming, as well as resolve circularity in DP.

The set is precise; that is, if an index is in the returned set, then there is no way
that IUP can generate delta for that point, given `coords` and `deltas`.
r   r)   r   FT)r   setrangerH   minmaxadd)r&   r   rC   r   rW   r-   ldlcr   cndncr
   rP   rQ   rR   rS   rT   rU   c1c2r   r   rV   s                           r#   _iup_contour_bound_forced_setre      s   ( v;#f+%%%FAUF3v;?B+A1uBy&)1A	"Fq519$5BABB%C%C%C%CczcBcBBcBcBE RxrBw<)+B)0C E rRBi/2PRy9PP E
 8BwGi/ #BGy 8"$.2"527!C$(E  Gi/ #BGy 8"$r~"527!C$(Eu

1q  ,~ Mr%   )r-   r
   	best_costbest_jcostrW   rC   lookbackc           	      d   [        U 5      nUc  Un[        U[        5      nSS0nSS0n[        SU5       Hv  nXhS-
     S-   n	XU'   US-
  Xx'   US-
  U;   a  M#  [        US-
  [	        X-
  S5      S5       H3  n
Xj   S-   nX:  a  [        XXU5      (       a
  U=Xh'   n	XU'   X;   d  M2    Mt     Mx     Xv4$ )a  Straightforward Dynamic-Programming.  For each index i, find least-costly encoding of
points 0 to i where i is explicitly encoded.  We find this by considering all previous
explicit points j and check whether interpolation can fill points between j and i.

Note that solution always encodes last point explicitly.  Higher-level is responsible
for removing that restriction.

As major speedup, we stop looking further whenever we see a "forced" point.Nr)   r   r   r<   )r   r[   MAX_LOOKBACKrZ   r\   rO   )r&   r   rW   rC   ri   r   costschainr-   rf   r
   rh   s               r#   _iup_contour_optimize_dpro   %  s    2 	FA8\*HGEJE1a[a%L1$	aq5q5F?q1uc!,3R8A8a<D$6vqY$W$W'++9a{ 9 & <r%   lkc                 P    [        U 5      nX-  nU(       d  U $ XU-
  S U SX!-
   -   $ )zwRotate list by k items forward.  Ie. item at position 0 will be
at position k in returned list.  Negative k is allowed.N)r   )rp   rq   r   s      r#   	_rot_listrs   Z  s7     	AAFAUW:'AE
""r%   sr   c                 V    X-  nU(       d  U $ U  Vs1 s H
  o3U-   U-  iM     sn$ s  snf rF    )rt   rq   r   r.   s       r#   _rot_setrw   d  s/    FA!"#AUaK###s   &c                   ^^ [        U 5      n[        U4S jU  5       5      (       a  S/U-  $ US:X  a  U $ U S   m[        U4S jU  5       5      (       a  T/S/US-
  -  -   $ [        XT5      nU(       a  US-
  [        U5      -
  nUS:  d   e[	        X5      n [	        X5      n[        XEU5      n[        XUT5      u  pg[        5       nUS-
  n	U	b  UR                  U	5        Xi   n	U	b  M  UR                  S5        XH::  d   XH45       e[        U5       V	s/ s H  oU;   a  X	   OSPM     n n	[	        X* 5      n U $ [        X -   X-   UTU5      u  pgSUS-   p[        US-
  [        U5      S-
  5       HW  n[        5       nUn	XU-
  :  a!  UR                  X-  5        Xi   n	XU-
  :  a  M!  XU-
  :X  d  MB  X|   X|U-
     -
  nX::  d  MU  XpMY     XJ::  d   XJ45       e[        U5       V	s/ s H  oU
;   a  X	   OSPM     n n	U $ s  sn	f s  sn	f )zFor contour with coordinates `coords`, optimize a set of delta
values `deltas` within error `tolerance`.

Returns delta vector that has most number of None items instead of
the input delta.
c              3   L   >#    U  H  n[        [        U6 5      T:*  v   M     g 7frF   rG   )rJ   rA   rC   s     r#   rK   'iup_contour_optimize.<locals>.<genexpr>z  s     
9&Q3w{y(&s   !$Nr   r   c              3   .   >#    U  H
  nTU:H  v   M     g 7frF   rv   )rJ   r   d0s     r#   rK   rz     s     
#Fq27Fs   r)   )r   rM   re   r\   rs   rw   ro   rY   r]   removerZ   )r&   r   rC   r   rW   rq   rn   rm   solutionr-   best_solrf   r1   rh   r|   s     `           @r#   iup_contour_optimizer   k  sM    	FA
 
9&
999vz 	Av 
B

#F
###ttfA&&& +69EF  Uc&k!Avv6%6%&Q' 0	R 5EmLLOA m 	 !5F#55!@EaI1H}&)$6I62&< M3 0OV_fi
 #AE)1q5#e*q.1EuHAai-QU#H ai- AI~|eAI&66$*2i 2  !5F#55!@EaI1H}&)$6IMA J< Js   G?&Hc                 H   [        U5      U:X  a!  [        U5      U(       a  US   S-   OSS-   :X  d   e[        U5      nX$S-
  US-
  US-
  US-
  /-   n/ nSnU HF  n[        XUS-    XUS-    U5      n[        U5      Xv-
  S-   :X  d   eUR                  U5        US-   nMH     U$ )zFor the outline given in `coords`, with contour endpoints given
in sorted increasing order in `ends`, optimize a set of delta
values `deltas` within error `tolerance`.

Returns delta vector that has most number of None items instead of
the input delta.
r)   r   r   r:   r;   r<   )r=   r   r   r   )	r&   r   r8   rC   r   r    r1   r6   r>   s	            r#   iup_delta_optimizer     s     $<4CKDDHqLaST3T$TTTFAq5!a%QA..D
CE&37#VC!G%<i
 7|s{Q...

7a  Jr%   )r   )g        )'r   AttributeErrorImportErrorfontTools.misccompiledCOMPILEDtypingr   r   r   numbersr   r   _Point_Delta_PointSegment_DeltaSegment_DeltaOrNone_DeltaOrNoneSegment
_Endpointsrl   cfunclocalsintdoubler$   r7   r?   inlinereturnsrO   rY   re   ro   listrs   rw   r   r   rv   r%   r#   <module>r      s  & ?? 
 # 
tTz		tTz	  VT\"|, h
  jjjj}}}}}}}}
--mmmm
00 &0-30:@0GM0
 0f1+ 1] 1} 1h)6>H4 jjjjmmmmmmmm   	
    * }}}}
**	 EFNN#0N=ANN	Nb jjjjmm::	mm 5))) 	)
 ))X# ## #$ $ $ $ EHbb#0b=AbbR 	  	
 [ 	$ &%%&s   J# #J54J5