)Ejr<x ddlZn#eef$r ddlmZYnwxYwejZddlmZmZm Z ddl m Z m Z ee e fZ ee e fZee ZeeZe edfZeeZee ZdZejejejejejejejejejejej dede d ed e d ef d Zd ededefdZd edededefdZejejejejejejejejejejed edede de de f dZejejejejejejejeje d%d edede defdZ ejejejejejejeejeddfd edede de fdZ!de"defdZ#deded efd!Z$ d&d edede defd#Z% d&d ededede def d$Z&dS)'N)cython)SequenceTupleUnion)IntegralReal) jnx1x2d1d2scalexdcoordsrc1rd1rc2rd2cddg}dD]}gx||<}||||||||f\}} } } || krIt|} | | kr|| g| zn|dg| z{|| kr| |} }| | } } | | z | |z z } |D]>}||}||kr| }n|| kr| }n ||z | z}| |z}||?t|S)zGiven two reference coordinates `rc1` & `rc2` and their respective delta vectors `rd1` & `rd2`, returns interpolated deltas for the set of coordinates `coords`.Nrr)lenextendappendzip)rrrrr out_arraysr outr r rrr rpairrrnudges FC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/varLib/iup.py iup_segmentr$sF*J $$  1 QQQQ7BB 88F ARxx B4!8$$$$ A37###  77BBbR"W%  DQABwwbR5(J JJqMMMM% (  deltasreturnc 6t|t|ksJd|vr|St|}dt|D}|sdg|zSg}t|}t|}|dkrWd|||df\}}} } |t ||||| || || || ||||D]|} | |z dkrT|dz| || f\}}} } |t ||||| || || || ||| | }}||dz krZ|dz|||df\}}} } |t ||||| || || || t|t|ks&Jt|t|f|S)zFor the contour given in `coords`, interpolate any missing delta values in delta vector `deltas`. Returns fully filled-out delta vector.Ncg|] \}}|| SN).0ivs r# ziup_contour..gs@@@TQ!-q---r%)rrrr)r enumerateiternextrr$r) r&rr indicesr itstarti1i2ri1ri2ends r# iup_contourr<[sT v;;#f++ % % % % 6  F A@@Yv..@@@G x!| C gB HHE zzeUGBK7BS r"u vc{F3KfSk     JJve}   ;??$qy#uc9 BC JJ2b5M6#;s VC[&QT+    6#; A~~ 19a :BS r"u vc{F3KfSk     v;;#c(( " " "S[[#c(($; " " " Jr%endscHt||kr#t||r |ddznddzksJt|}||dz |dz |dz |dz gz}g}d}|D]>}|dz }t||||||}|||}?|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.r0rr)sortedrr<r)r&rr=r r r6r;contours r# iup_deltarDs $<<4  CKKD4ODHqLLaST3T$T$T$T T F A 1q5!a%QA. .D C E qfU3Y/c 1BCC 7 Jr%)r-r rypqr-r tolerancec||z dksJt||dz|||||||||}||dz|}tfdt||DS)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.rArc3xK|]4\\}}\}}tt||z ||z kV5dSr*abscomplex)r,rrErFrGrHs r# z%can_iup_in_between..sb FQFQ GAE1q5 ! !""i/r%)r$allr)r&rr-r rHinterps ` r#can_iup_in_betweenrQs. q5A:::: A *F1Ivay&)VTUY W WF AEAI F !&&11  r%)cjdjlcjldjncjndjforceforcedct|t|ksJt|}t}tt|dz ddD]}||dz ||dz }}||||} }|||z dz|||z dz} } dD]`} | | } || }|| }|| }| | }| | }||kr ||}}||}}n||}}||}}d}||kr,t||z |krt||krd}n|| cxkr|kr7nn4t |||z |cxkrt |||zksnd}n||kr| |kr=t||kr)t||z |kr||z |k||kkrd}nz_rot_set..hs! # # #AQUaK # # #r%r+)rvrsr s ``r#_rot_setrzds7FA  # # # # # # # ##r%c t}tfdDrdg|zS|dkrSd t fdDr gdg|dz zzSt|}|r|dz t|z }|dksJt |t ||}t |||}t ||\}}t|dz }||||}| d|ks J|ffdt|Dt | nt z||z||\}}d|dzc } t|dz t|dz D]l} t| }|| |z kr)||z||}|| |z k)|| |z kr|| || |z z } | | kr| c } m| ks J| f fdt|DS) 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. c3LK|]}tt|kVdSr*rK)r,rFrHs r#rNz'iup_contour_optimize..zs4 9 9Q3w{  y ( 9 9 9 9 9 9r%Nrrc3$K|] }|kV dSr*r+)r,rd0s r#rNz'iup_contour_optimize..s' # #q27 # # # # # #r%r0c,g|]}|vr|ndSr*r+)r,r-r&solutions r#r/z(iup_contour_optimize..)III1qH}}&))$IIIr%c,g|]}|vr|ndSr*r+)r,r-best_solr&s r#r/z(iup_contour_optimize..rr%) rrOrgr^rurzrqr[r_remover\)r&rrHr rYrsrpror-rhr6rjrrrs` ` @@@r#iup_contour_optimizerks F A  9 9 9 9& 9 9 999vz Avv  B # # # #F # # ###'ttfA&&&+669 E EF:JUc&kk !Avvvv61%%61%%&!Q''0 RR u55 Em LLOOOaAm  !!!FH#5!!!IIIIIaIII6A2&& 0 VOVf_fi  u#AE)1q5#e**q.11 9 9EuuHAeai-- QU###!Heai--EAI~~U|eEAI&669$$*2D'Hi !!!FH#5!!!IIIIIaIII Mr%ct||kr#t||r |ddznddzksJt|}||dz |dz |dz |dz gz}g}d}|D]^}t|||dz|||dz|}t|||z dzksJ|||dz}_|S)aFor 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. r0rrr?r@rA)rBrrr) r&rr=rHr r r6r;rCs r#iup_delta_optimizers $<<4  CKKD4ODHqLLaST3T$T$T$T T F A 1q5!a%QA. .D C E& 537? #VEC!GO%rs&MMMM $&&&%%%%%%%%& ? #""""""" tTz  tTz   VT\" |, h    j j } } } } - m m   0 0 &0-30:@0GM000  0f1+1]1}1111h )6>H4 j j m m m m     * } }    *    EFNN N#0N=ANNNN  Nb j jm :  m 355 )) ) ) )  ))))X#######$$$$$$$EHbb b#0b=AbbbbbR       s