
    jkeS9                     n   	 d dl Z e j                  Zd dlmZmZm	Z	 d dl
mZmZ eeef   Zeeef   Zee   Zee   Ze	edf   Zee   Zee   ZdZe j*                   e j,                  e j.                  e j.                  e j0                  e j0                  e j0                  e j0                  e j0                  e j0                  e j0                  	      ded	ed
ededef
d              ZdededefdZdedededefdZe j*                  e j8                   e j,                  e j.                  e j.                  e j0                  e j0                  e j0                  e j0                         e j:                  e      dededededef
d                            Z e j,                  e j0                  e j0                  e j0                  e j0                  e j0                  e j0                  e j.                  e      	 d%dedededefd       Z  e j,                  e j.                  e j.                  e j0                  e j.                  e j0                  ee j0                         e       d dfdedededefd       Z!de"defdZ#d eded!efd"Z$	 d&dedededefd#Z%	 d&dededededef
d$Z&y# eef$ r d dlm Z  dZY w xY w)'    N)cythonF)SequenceTupleUnion)IntegralReal   )	jnx1x2d1d2scalexdcoordsrc1rd1rc2rd2c                    ddg}dD ]  }g x||<   }||   ||   ||   ||   f\  }}	}
}||	k(  r<t        |       }|
|k(  r|j                  |
g|z         n|j                  dg|z         b||	kD  r|	|}	}||
}}
||
z
  |	|z
  z  }| D ]3  }||   }||k  r|
}n||	k\  r|}n|
||z
  |z  z   }|j                  |       5  t        | S )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   s                    6/usr/lib/python3/dist-packages/fontTools/varLib/iup.pyiup_segmentr#      s   * J   
1QQQQ7BB8FARx

B4!8$

A37#7BB bR"W% 	DQABwb !b&E))JJqM	%> 
    deltasreturnc                 >   t        |       t        |      k(  sJ d| vr| S t        |       }t        |       D cg c]
  \  }}|	| }}}|sdg|z  S g }t        |      }t        |      }|dk7  r;d|||d   f\  }	}
}}|j	                  t        ||	|
 ||   | |   ||   | |                |j                  | |          |D ][  }||z
  dkD  r;|dz   |||f\  }	}
}}|j	                  t        ||	|
 ||   | |   ||   | |                |j                  | |          |}] ||dz
  k7  r>|dz   |||d   f\  }	}
}}|j	                  t        ||	|
 ||   | |   ||   | |                t        |       t        |      k(  sJ t        |       t        |      f       |S c c}}w )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_contourr6   W   s    v;#f+%%%6FA&v.@TQ!-q@G@x!|
C	gBHEzeUGBK7BS

r"vc{F3KfSk	

 JJve} 	;?$qy#uc9BCJJ2bM6#;sVC[&QT+
 	

6#;	 A~ 19a
:BS

r"vc{F3KfSk	
 v;#c(";S[#c($;;"JK As   
FFendsc                    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        | || |||       }|j                  |       |}. |S )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   r6   r   )r%   r   r7   r   r    r0   r5   contours           r"   	iup_deltar>      s     $<4CKDDHqLaST3T$TTTFA1q5!a%QA..D
CE qfU3/c1BC

7	 Jr$   )r,   r
   r   ypqr,   r
   	tolerancec                     ||z
  dk\  sJ t        ||dz   | ||   | |   ||   | |         }| |dz   | } t        fdt        | |      D              S )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   l   K   | ]+  \  \  }}\  }}t        t        ||z
  ||z
              k   - y wNabscomplex).0r   r?   r@   rA   rB   s        r"   	<genexpr>z%can_iup_in_between.<locals>.<genexpr>   s>      FQFQ 	GAE1q5!"i/s   14)r#   allr   )r%   r   r,   r
   rB   interps       ` r"   can_iup_in_betweenrM      st    . q5A::A*F1Ivay&)VTUYWFAEAF !&&1  r$   )cjdjlcjldjncjndjforceforcedc                 <   t        |       t        |      k(  sJ t        |       }t               }t        t        |       dz
  dd      D ]P  }| |dz
     ||dz
     }}| |   ||   }	}| ||z
  dz      |||z
  dz      }}
dD ]  }|	|   }||   }||   }||   }||   }|
|   }||k  r	||}}||}}n||}}||}}d}||k(  r"t        ||z
        |kD  rt        |      |kD  rd}n||cxk  r|k  r-n n*t	        ||      |z
  |cxk  rt        ||      |z   k  snn d}ni||k7  rd||k  r0t        |      |kD  rQt        ||z
        |kD  r@||z
  |k  ||k  k7  r2d}n/t        |      |kD  r!t        ||z
        |kD  r|||z   k  ||k  k7  rd}|s|j                  |        P S |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 `deltas`.
    r   r(   r   FT)r   setrangerG   minmaxadd)r%   r   rB   r   rU   r,   ldlcr   cndncr
   rN   rO   rP   rQ   rR   rS   c1c2r   r   rT   s                           r"   _iup_contour_bound_forced_setrc      s   ( v;#f+%%%FAUF3v;?B+ =Aq1uBay&)1A	"F1q519$5B 8	A1B1BQ%CQ%CQ%CQ%CczcBcB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"$y.2"527!C$(E  Gi/ #BGy 8"$rI~"527!C$(E

1q8	=~ Mr$   )r,   r
   	best_costbest_jcostrU   rB   lookbackc           	      Z   t        |       }||}t        |t              }ddi}ddi}t        d|      D ]r  }||dz
     dz   }	|	||<   |dz
  ||<   |dz
  |v r#t        |dz
  t	        ||z
  d      d      D ]0  }
||
   dz   }||	k  rt        | ||
||      r|x||<   }	|
||<   |
|v s0 r t ||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   r;   )r   rY   MAX_LOOKBACKrX   rZ   rM   )r%   r   rU   rB   rg   r   costschainr,   rd   r
   rf   s               r"   _iup_contour_optimize_dprm   !  s    2 	FA8\*HGEJE1a[ !a%L1$	aq5aq5F?q1uc!h,3R8 	A8a<Di$6vvq!Y$W'++a9aF{	& %<r$   lkc                 L    t        |       }||z  }|s| S | ||z
  d | d||z
   z   S )z{Rotate list by k items forward.  Ie. item at position 0 will be
    at position k in returned list.  Negative k is allowed.N)r   )rn   ro   r   s      r"   	_rot_listrq   V  s=     	AAFAQUW:'AE
""r$   sr   c                 J    ||z  }|s| S | D ch c]
  }||z   |z   c}S c c}w rE    )rr   ro   r   r-   s       r"   _rot_setru   `  s/    FA!"#AQUaK###s    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
  }	|	|j                  |	       ||	   }	|	|j                  d       ||k  s	J ||f       t        |      D 	cg c]  }	|	|v r| |	   nd } }	t	        | |       } | S t        | | z   ||z   ||      \  }}d|dz   }}
t        |dz
  t        |      dz
        D ]Y  }t               }|}	|	||z
  kD  r"|j                  |	|z         ||	   }	|	||z
  kD  r"|	||z
  k(  sB||   |||z
     z
  }||k  sV||}}
[ ||
k  s	J ||
f       t        |      D 	cg c]  }	|	|
v r| |	   nd } }	| S c c}	w c c}	w )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   F   K   | ]  }t        t        |       k    y wrE   rF   )rI   r@   rB   s     r"   rJ   z'iup_contour_optimize.<locals>.<genexpr>v  s     
9Q3w{y(
9s   !Nr   r   c              3   (   K   | ]	  }|k(    y wrE   rt   )rI   r   d0s     r"   rJ   z'iup_contour_optimize.<locals>.<genexpr>  s     
#q27
#s   r(   )r   rK   rc   rZ   rq   ru   rm   rW   r[   removerX   )r%   r   rB   r   rU   ro   rl   rk   solutionr,   best_solrd   r0   rf   ry   s     `           @r"   iup_contour_optimizer}   g  s    	FA
 
9&
99vz 	Av 
B

#F
##ttfA&&& +669EF  Uc&k!Avv61%61%&!Q' 0	Ru 5EmLLOaA m 	 !5FH#55!@EaI1qH}&)$6II6A2&< M3 0VOVf_fi
u #AE)1q5#e*q.1 
	9EuHAeai-QU#!H eai- EAI~U|eEAI&669$*2DiH
	9  !5FH#55!@EaI1qH}&)$6IIMA J< Js   G2G7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 ]G  }t        | ||dz    |||dz    |      }t        |      ||z
  dz   k(  sJ |j                  |       |dz   }I |S )a  For 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   r9   r:   r;   )r<   r   r}   r   )	r%   r   r7   rB   r   r    r0   r5   r=   s	            r"   iup_delta_optimizer     s     $<4CKDDHqLaST3T$TTTFA1q5!a%QA..D
CE &537#VEC!G%<i
 7|sU{Q...

7a Jr$   )r   )g        )'r   compiledCOMPILEDAttributeErrorImportErrorfontTools.misctypingr   r   r   numbersr   r   _Point_Delta_PointSegment_DeltaSegment_DeltaOrNone_DeltaOrNoneSegment
_Endpointsrj   cfunclocalsintdoubler#   r6   r>   inlinereturnsrM   rW   rc   rm   listrq   ru   r}   r   rt   r$   r"   <module>r      s  H 
 # 
tTz		tTz	  VT\"|, h
  jjjj}}}}}}}}
--mmmm
)) &)-3):@)GM)
 )X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 	  	
 O 	$ %H	s   J! !J43J4