
    <`T                      P    d  Z d Zd Zd ZddZi ddfdZd Zd	 ZddZddZ	dS )c                    d d g}dD ]}g x||<   }||         ||         ||         ||         f\  }}	}
}||	k    rIt          |           }|
|k    r|                    |
g|z             n|                    dg|z             {||	k    r|	|}	}||
}}
||
z
  |	|z
  z  }| D ]<}||         }||k    r|
}n||	k    r|}n|
||z
  |z  z   }|                    |           =t          | S )N       r   )lenextendappendzip)coordsrc1rd1rc2rd2
out_arraysjoutx1x2d1d2nscalepairxds                    4lib/python3.11/site-packages/fontTools/varLib/iup.pyiup_segmentr      sD    Tl
  Q*Q-#q63q63q63q61."b"b 2XX
6{{1BhhJJtAvJJs1u"WWr2r2 7rBw
%  dAw12gg
AA	R
AA 	a"fA::a==== 	Z    c                 6   t          |           t          |          k    sJ d | vr| S t          |           }d t          |           D             }|sdg|z  S g }t          |          }t          |          }|dk    rWd|||d         f\  }}}	}
|                    t          |||         ||	         | |	         ||
         | |
                              |                    | |                    |D ]|}||z
  dk    rT|dz   |||f\  }}}	}
|                    t          |||         ||	         | |	         ||
         | |
                              |                    | |                    |}}||dz
  k    rZ|dz   |||d         f\  }}}	}
|                    t          |||         ||	         | |	         ||
         | |
                              t          |           t          |          k    s&J t          |           t          |          f            |S )Nc                     g | ]	\  }}||
S N ).0ivs      r   
<listcomp>ziup_contour.<locals>.<listcomp>.   s    ;;;#!AQ]A]]]r   )r   r   r   r   )r   	enumerateiternextr   r   r   )deltar
   r   indicesr   itstarti1i2ri1ri2ends               r   iup_contourr3   '   s*   E

c&kk!!!!	,ZZ;;5));;; 
	
7mm	b	QJJugbk1"b#s**[2sU3ZeTWjYYZZZE%L  S5[1__AgsE3.2r3::k&B-eCj&+uUXzZZ[[[**U3Z
%%	QqSLL1Wa
2"b#s**[2sU3ZeTWjYYZZZE

c#hhUSXX 6r   c                 H   t          |          |k    r#t          |          |r|d         dz   nddz   k    sJ t          |          }||dz
  |dz
  |dz
  |dz
  gz   }g }d}|D ]>}|dz  }t          | ||         |||                   }|                    |           |}?|S Nr&   r   r            )sortedr   r3   r   )r*   r
   endsr   r   r-   r2   contours           r   	iup_deltar<   I   s    tVt1Jb!a0O!O!O!O!O[[!QqS!A#qs##		
  S(#eCi(&s*;<<'**W
%%r   c           
      P   ||z
  dk    sJ t          t          ||dz   |         ||         | |         ||         | |                             }| |dz   |         } t          |           t          |          k    sJ t          fdt	          | |          D                       S )Nr8   r   c              3   x   K   | ]4\  \  }}\  }}t          t          ||z
  ||z
                      k    V  5d S r    abscomplex)r"   r   ypq	tolerances        r   	<genexpr>z%can_iup_in_between.<locals>.<genexpr>`   sN      WWKEQq%1QC!QqS!!""i/WWWWWWr   )listr   r   allr	   )deltasr
   r#   r   rE   interps       ` r   can_iup_in_betweenrK   Y   s    	A




{6!A#a%=&)VAYq	6RS9UU
V
V
1Q-Fs6{{""""WWWW3vvCVCVWWWWWWr   r   c                 z   t          |           t          |          k    sJ t                      }| d         |d         }}| d         |d         }}t          t          |           dz
  dd          D ]G}||}
}	| |dz
           ||dz
           }}dD ]"}|
|         }|	|         }||         }||         }||         }||         }||k    r	||}}||}}n||}}||}}d}||cxk    r|k    r7n n4t          ||          |z
  |cxk    rt	          ||          |z   k    sn d}ny||k    r4||k    rt          ||z
            |k    rd}nTt          |          |k    r	 n?||k    r9||k     r||k    r||z
  |k     ||k     k    rd}n||k    r|||z   k     ||k     k    rd}|r|                    |            n$|	|
}}I|S )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 delta.
	r   r&   r   r   FT)r   setrangeminmaxr@   add)r*   r
   rE   forcedndncldlcr#   r   cr   cjdjlcjldjncjndjc1c2r   r   forces                          r   _iup_contour_bound_forced_setra   b   s:    	E

c&kk!!!!
%%
(F1IR
)VBZR
E

1b"
%
% 2 2Q	RQ!1:vac{b" ,
 ,
a	!2	!2	A3	A3	A3	A3	Sjj#B#BB#B#B 5Bnnnn"nnnnn2JJy B>>>>#b**Y*>>>>>U	Rxx
b	R"W		!	!u	R9		 	r
R	r9r)rBw77u	rR	\)rBw77u 

JJqMMM	E
 ab""r   Nc           	      h   t          |           }||}ddi}ddi}t          d|          D ]}||dz
           dz   }	|	||<   |dz
  ||<   |dz
  |v r%t          |dz
  t          ||z
  d          d          D ]8}
||
         dz   }||	k     rt          | ||
||          r|x||<   }	|
||<   |
|v r n9||fS )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   r8   )r   rN   rP   rK   )r*   r
   rR   rE   lookbackr   costschainr#   	best_costr   costs               r   _iup_contour_optimize_dpri      s    	ZZ(
Q
T
1++ 
 
QAaCj1n)%(U%(Uf__1c!H*b))2.. 	
 	
a
(Q,4
Y-eVQ9MME!HyE!H6kk	E  	ur   c                 h    t          |           }||z  }|s| S | ||z
  d         | d||z
           z   S )zxRotate list by k items forward.  Ie. item at position 0 will be
	at position k in returned list.  Negative k is allowed.N)r   )lkr   s      r   	_rot_listrm      sE     	VVa	!8	!A#$$!DQqSD'r   c                 6    z  s| S fd| D             S )Nc                      h | ]
}|z   z  S r!   r!   )r"   r$   rl   r   s     r   	<setcomp>z_rot_set.<locals>.<setcomp>   s!       !a%1   r   r!   )srl   r   s    ``r   _rot_setrr      s4    a	!8     a    r           c                 @    t                     }t          fd D                       rd g|z  S |dk    r S  d         t          fd D                       rgd g|dz
  z  z   S t           |          }|r|dz
  t          |          z
  }|dk    sJ t	           |           t	          ||          }t          |||          }t           ||          \  }}t                      |dz
  }|                    |           ||         }||k    sJ |f             fdt          |          D              t	           |            nt            z   ||z   ||          \  }}d |dz   c}	t          |dz
  d|z  dz
            D ]l}
t                      |
}||
|z
  k    r)                    ||z             ||         }||
|z
  k    )||
|z
  k    r||
         ||
|z
           z
  }||	k    r|c}	m fdt          |          D               S )Nc              3   L   K   | ]}t          t          |           k    V  d S r    r?   )r"   rC   rE   s     r   rF   z'iup_contour_optimize.<locals>.<genexpr>   s4      55!GQKI%555555r   r   r   c              3   $   K   | ]
}|k    V  d S r    r!   )r"   r   d0s     r   rF   z'iup_contour_optimize.<locals>.<genexpr>   s'      Aar   c                 ,    g | ]}|v r|         nd S r    r!   )r"   r#   r*   solutions     r   r%   z(iup_contour_optimize.<locals>.<listcomp>  )    
A
A
A1qH}}588$
A
A
Ar   r8   c                 ,    g | ]}|v r|         nd S r    r!   )r"   r#   best_solr*   s     r   r%   z(iup_contour_optimize.<locals>.<listcomp>  rz   r   )
r   rH   ra   rP   rm   rr   ri   rM   rQ   rN   )r*   r
   rE   r   rR   rl   rf   re   r#   rg   r-   rh   r|   rw   ry   s   ` `         @@@r   iup_contour_optimizer}      s   ZZ
 5555u55555 
! FF	, Ah 
!A#	 (vy
A
A  )B 	sc&kk!	
aUA%VQ&FAq!!&)%KK,% UU(!e!	<<???Qx1 	
 
8			fh/			
A
A
A
A
Aa
A
A
A%
EA2

%%
 *%+vf}fiYZ[[,%ac(IQqS!A#a%   
* 
*eee81	
UQYLLQaA 
UQY 519nn<%	**Dy#TXy
A
A
A
A
Aa
A
A
A% 	r   c                    t          |          |k    r#t          |          |r|d         dz   nddz   k    sJ t          |          }||dz
  |dz
  |dz
  |dz
  gz   }g }d}|D ]^}t          | ||dz            |||dz            |          }t          |          ||z
  dz   k    sJ |                    |           |dz   }_|S r5   )r9   r   r}   r   )	r*   r
   r:   rE   r   r   r-   r2   r;   s	            r   iup_delta_optimizer      s    tVt1Jb!a0O!O!O!O!O[[!QqS!A#qs##		
  S uSU{!3VE#a%K5H)TT'	Wuq	(	(	(	(**W
a%%%r   )r   )rs   )
r   r3   r<   rK   ra   ri   rm   rr   r}   r   r!   r   r   <module>r      s   $ $ $L     D   X X XB B B BH 46T # # # #J  ! ! !
F F F FP     r   