)Ej)ddlmZddlmZmZmZddlmZmZddl m Z m Z ddl m Z ddlmZmZddlmZmZmZmZddlZddlZejd ZGd d Zd Zd ZGddeZGddeZGddeZdZ dZ!dZ"dZ#dZ$dZ% ddl&m'Z'e#Z(n"#e)$r ddl*m+Z+e$Z(n #e)$re%Z(YnwxYwYnwxYwdZ,dZ-dZ.dZ/d Z0d!Z1e2d"d#Z3dS)$) LerpGlyphSet) AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen) RecordingPenDecomposingRecordingPen) Transform) defaultdictdeque)sqrtcopysignatan2piNzfontTools.varLib.interpolatablecjeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed ed ededede de de de de dedi ZdS)InterpolatableProblemnothingmissing open_path path_count node_countnode_incompatibility contour_orderwrong_start_pointkink underweight overweight N)__name__ __module__ __qualname__NOTHINGMISSING OPEN_PATH PATH_COUNT NODE_COUNTNODE_INCOMPATIBILITY CONTOUR_ORDERWRONG_START_POINTKINK UNDERWEIGHT OVERWEIGHTseverityXC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/varLib/interpolatableHelpers.pyrrsGGIJJ1#M+ DKJ 1AAaq1 aQB HHHr:rcftt|ddS)z6Sort problem groups by their most severe problem type.cBtd|dD S)Nc3tK|]3}tj|d|ddzV4dS)type tolerancerN)rr8get).0ps r; z2sort_problems....1sV+3AfI>{TUAVAVVr:r)min)_s r;zsort_problems..0s53qTr:T)keyreverse)dictsorteditems)problemss r; sort_problemsrN+sB  NN       r:c0|| d|d| zS)z{Rotate list by k items forward. Ie. item at position 0 will be at position k in returned list. Negative k is allowed.Nr9)lks r;rot_listrR;s" aRSS6AcrcF?r:c@eZdZd dZdZdZdZdZdZdZ d Z dS) PerContourPenNcZtj||||_d|_g|_dSN)r__init___Pen_penvalue)selfPenglyphsets r;rWzPerContourPen.__init__Bs.x(((   r:cb||j|dSrV)_newItemrYmoveTo)r[p0s r;_moveTozPerContourPen._moveToHs+  r:c:|j|dSrV)rYlineTo)r[p1s r;_lineTozPerContourPen._lineToLs r:c<|j||dSrV)rYqCurveTo)r[rep2s r; _qCurveToOnezPerContourPen._qCurveToOneOs  2r"""""r:c>|j|||dSrV)rYcurveTo)r[rerip3s r; _curveToOnezPerContourPen._curveToOneRs" "b"%%%%%r:cF|jd|_dSrV)rY closePathr[s r; _closePathzPerContourPen._closePathUs!  r:cF|jd|_dSrV)rYendPathrqs r;_endPathzPerContourPen._endPathYs!  r:cp|x|_}|j|dSrV)rXrYrZappend)r[pens r;r_zPerContourPen._newItem]s2))++% C #r:rV) r*r+r,rWrbrfrjrnrrrur_r9r:r;rTrTAs ###&&&r:rTceZdZdZdS)PerContourOrComponentPencp||jd||dS)N)r_rZ addComponent)r[ glyphNametransformations r;r}z%PerContourOrComponentPen.addComponentcs1  2##I~>>>>>r:N)r*r+r,r}r9r:r;rzrzbs#?????r:rzc,eZdZdZddZddZddZdS) SimpleRecordingPointPencg|_dSrV)rZrqs r;rWz SimpleRecordingPointPen.__init__is  r:Nc dSrVr9)r[ identifierkwargss r; beginPathz!SimpleRecordingPointPen.beginPathl r:returncdSrVr9rqs r;rtzSimpleRecordingPointPen.endPathorr:cF|j||dndfdS)NFT)rZrw)r[pt segmentTypes r;addPointz SimpleRecordingPointPen.addPointrs, 2 (;uuFGGGGGr:rV)rN)r*r+r,rWrrtrr9r:r;rrhse        HHHHHHr:rcPd}t||D]\}}||z }|||zz }|SNr)zipv0v1sx0x1ds r; vdiff_hypot2rvs? Ab"++B G QU  Hr:cd}t||D],\}}||z }||j|jz|j|jzzz }-|Sr)rrealimagrs r;vdiff_hypot2_complexr~sS Ab"++//B G QVaf_qv .. Hr:cTtfdt|DS)Nc3:K|]\}}||VdSrVr9)rBijGs r;rDz matching_cost..s/7741aqtAw777777r:)sum enumerate)rmatchings` r; matching_costrs. 77779X#6#6777 7 77r:ct|}t|\}}|tt|ksJtd|D}t|t ||fS)Nc34K|]}t|VdSrV)int)rBes r;rDz.s(%%1A%%%%%%r:)lenlinear_sum_assignmentlistrangeallr)rnrowscolss r;)min_cost_perfect_bipartite_matching_scipyrs AA&q))JD$ DqNN " ' ' ) ))) ) %%%%% % %D ::}Q-- --r:ct|}dg|z}t|D] \}}|||< |t||fSrV)rMunkrescomputer)rrrrowcols r;+min_cost_perfect_bipartite_matching_munkresrs] AA 6A:DII%%a((SS q$'' ''r:cDt|}|dkrtdtjt |}t t |}t||}|D])}t||}||krt ||}}*||fS)Nr$z4Install Python module 'munkres' or 'scipy >= 0.17.0')r Exception itertools permutationsrrnextr)rrrbest best_costrCcosts r;.min_cost_perfect_bipartite_matching_bruteforcers AA1uuNOOO)%((33L \"" # #Da&&I ,,Q"" )  "1ggt)D ?r:)r)rctt|j}t||j|j|j|jdz|jdz|j|zfS)Nr ) rabsarearmeanXmeanYstddevXstddevY correlation)statssizes r;contour_vector_from_statsrs[ EJ D$$$     D  r:ct|}fd|Dt\}}tfdt|D}|||fS)Nc.g|]fdDS)c0g|]}t|Sr9)r)rBrrs r; z3matching_for_vectors...s# 0 0 0rl2r"" 0 0 0r:r9)rBrm1s @r;rz(matching_for_vectors..s/ > > >R 0 0 0 0R 0 0 0 > > >r:c34K|]}||VdSrVr9)rBrcostss r;rDz'matching_for_vectors..s+66a 666666r:)r#min_cost_perfect_bipartite_matchingrr)m0rrrr identity_costrs ` @r;matching_for_vectorsrsu BA > > > >2 > > >E ,E226666U1XX66666M ]M 11r:cDd}t|D] \}}|dz|z}|S)Nrr)reversed)pointsbitsrbs r;points_characteristic_bitsrs6 D&!!A Q Kr:r"cg}|s|Sd|D}t|}tdksJ||dtdz t|tkr=||dtdz t|tk=t|D]}||}||||dz}||z }||dz||dz}||z }|||z |j|jz|j|jzz } ttt| | } || dz|S)Nc&g|]\}}t|Sr9)complex)rBrrFs r;rz)points_complex_vector..s / / /ur1grl / / /r:r"rr!r ) r$_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendrrwrrrrr) rvectorrrrared0rid1crosss r;points_complex_vectorrs F  / / / / /F F A /1 4 4 4 4 MM&C?!CCDEEE f++< < < fGCaGGHIII f++< < < 1XX!!AY bAE] "W b1fAE] "W b2g"'!BGbg$55c%jj))511 eai    Mr:ct|}t|}|r|ddd}t|}n|}t|}t||zdksJt||z}d|zdz }t|D]M} ||| z z|z|| z z} | |kr4|t || |z|r|dz | z n| |fNdS)Nr|rr)rrrrrwrR) r isomorphismsrIreference_bitsrrrmultmaskrrs r;add_isomorphismsr s/77N F A ")&11 "6 * *F v;;?a     v;;! D Fa../s5JJda1M3I3I163I3I3I3IJJr:)rrL)rBrrPrs r;rz*find_parents_and_order..,sX   1JJJJaggiiJJJJJ    r:zFound %s base masters: %szNo base master location foundr)minimum_spanning_treec6g|]}dgtzS)r)r)rBrF locationss r;rz*find_parents_and_order..:s&IIIaaS3y>>)IIIr:cHg|]tfdDS)c3DK|]}|dVdSr)rA)rBrQrPs r;rDz4find_parents_and_order...?s/77QQUU1a[[777777r:)tuple)rBrPaxess @r;rz*find_parents_and_order..?s7KKKAu7777$77777KKKr:r c$i|] \}}|v || Sr9r9rs r; z*find_parents_and_order..A0'''!Qa=>P>PAq>P>P>Pr:c$i|] \}}|v || Sr9r9rs r;rz*find_parents_and_order..Drr:T) overwritez.Not all masters are reachable; report an issuez Parents: %sz Order: %s)rrrrloginfowarningscipy.sparse.csgraphrsetupdatekeysrKr combinationsrrnonzeror addr popleftrw ImportError) glyphsetsrrparentsorderbasesrgraphrPvectorsrri_discrete_locationj_discrete_locationtreerrrrvisitedqueuers `` @r;find_parents_and_orderr'sftE#i..1"455666G s9~~&& ' 'E=%    !),,     9 HH0#e**e D D D D KK7 8 8 8-  B B B B B BIIII5Y3H3HIIIE55D & & AFFHH%%%%$<sJM MM)4fontTools.ttLib.ttGlyphSetrfontTools.pens.basePenrrrfontTools.pens.pointPenrrfontTools.pens.recordingPenr r fontTools.misc.transformr collectionsr r mathrrrrrlogging getLoggerrrrNrRrTrzrrrrrrrscipy.optimizerrr munkresrrrrrrrrrr9r:r;r$s333333GGGGGGGGGGGGGGGGGGMMMMMMMM......********************g9::8     GB?????}??? H H H H H. H H H      888...(((( 444444*S''      ###### 8 ,+    : ,++       2 2 2()$!!!H6CF#%%AAAAAAAs6#B,,C 2B;:C ;CC CC  C