
    jkez,                        d dl mZmZmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZmZ d dlZd dlZ ej,                  d      Zd	 Z G d
 de      Z G d de      Z G d de      Zd Zd Zd Zd Zd Z d Z!	 d dl"m#Z# eZ$d Z(d Z)d Z*dZ+d Z,d Z-d Z.d%dZ/ G d  d!      Z0 G d" d#      Z1d&d$Z2y# e%$ r 	 d dl&m'Z' e Z$n# e%$ r e!Z$Y nw xY wY Ow xY w)'    )AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2piNzfontTools.varLib.interpolatablec                     | | d | d|  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 )lks     H/usr/lib/python3/dist-packages/fontTools/varLib/interpolatableHelpers.pyrot_listr      s     aRS6AcrF?    c                   >    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d	 Z
y)PerContourPenNc                 h    t        j                  | |       || _        || _        d | _        g | _        y N)r   __init__	_glyphset_Pen_penvalue)selfPenglyphsets      r   r   zPerContourPen.__init__   s.    x(!		
r   c                 Z    | j                          | j                  j                  |       y r   )_newItemr   moveTo)r!   p0s     r   _moveTozPerContourPen._moveTo   s    		r   c                 :    | j                   j                  |       y r   )r   lineTo)r!   p1s     r   _lineTozPerContourPen._lineTo    s    		r   c                 <    | j                   j                  ||       y r   )r   qCurveTo)r!   r+   p2s      r   _qCurveToOnezPerContourPen._qCurveToOne#   s    		2r"r   c                 >    | j                   j                  |||       y r   )r   curveTo)r!   r+   r/   p3s       r   _curveToOnezPerContourPen._curveToOne&   s    		"b"%r   c                 F    | j                   j                          d | _         y r   )r   	closePathr!   s    r   
_closePathzPerContourPen._closePath)   s    			r   c                 F    | j                   j                          d | _         y r   )r   endPathr7   s    r   _endPathzPerContourPen._endPath-   s    			r   c                 h    | j                         x| _        }| j                  j                  |       y r   )r   r   r    append)r!   pens     r   r%   zPerContourPen._newItem1   s&    ))+%	C

#r   r   )__name__
__module____qualname__r   r(   r,   r0   r4   r8   r;   r%   r   r   r   r   r      s*    #&r   r   c                       e Zd Zd Zy)PerContourOrComponentPenc                 b    | j                          | j                  d   j                  ||       y )N)r%   r    addComponent)r!   	glyphNametransformations      r   rF   z%PerContourOrComponentPen.addComponent7   s#    

2##I~>r   N)r?   r@   rA   rF   r   r   r   rC   rC   6   s    ?r   rC   c                   *    e Zd Zd ZddZddZddZy)SimpleRecordingPointPenc                     g | _         y r   )r    r7   s    r   r   z SimpleRecordingPointPen.__init__=   s	    
r   Nc                      y r   r   )r!   
identifierkwargss      r   	beginPathz!SimpleRecordingPointPen.beginPath@       r   c                      y r   r   r7   s    r   r:   zSimpleRecordingPointPen.endPathC   rP   r   c                 R    | j                   j                  ||df       y df       y )NFT)r    r=   )r!   ptsegmentTypes      r   addPointz SimpleRecordingPointPen.addPointF   s&    

2(;uFGFGr   r   )returnN)r?   r@   rA   r   rO   r:   rU   r   r   r   rJ   rJ   <   s    Hr   rJ   c                 L    d}t        | |      D ]  \  }}||z
  }|||z  z  } |S Nr   )zipv0v1sx0x1ds         r   vdiff_hypot2ra   J   s=    	Ab"+ BG	QU
 Hr   c                     d}t        | |      D ]@  \  }}||z
  }||j                  |j                  z  |j                  |j                  z  z   z  }B |S rX   )rY   realimagrZ   s         r   vdiff_hypot2_complexre   R   sW    	Ab"+ /BG	QVVaff_qvv../
 Hr   c                 >     t         fdt        |      D              S )Nc              3   4   K   | ]  \  }}|   |     y wr   r   ).0ijGs      r   	<genexpr>z matching_cost.<locals>.<genexpr>]   s     741aqtAw7s   )sum	enumerate)rk   matchings   ` r   matching_costrp   \   s    79X#6777r   c                     t        |       }t        |       \  }}|t        t        |            k(  j	                         sJ t        |      t        | |      fS r   )lenlinear_sum_assignmentlistrangeallrp   )rk   nrowscolss       r   )min_cost_perfect_bipartite_matching_scipyrz   `   sN    AA&q)JD$DqN"''))):}Q---r   c                     t        |       }d g|z  }t               j                  |       D ]
  \  }}|||<    |t        | |      fS r   )rr   Munkrescomputerp   )rk   rw   ry   rowcols        r   +min_cost_perfect_bipartite_matching_munkresr   g   sQ    AA6A:DI%%a( SS	q$'''r   c                    t        |       }|dkD  rt        d      t        j                  t	        |            }t        t        |            }t        | |      }|D ]!  }t        | |      }||k  st        |      |}}# ||fS )N   z4Install Python module 'munkres' or 'scipy >= 0.17.0')rr   	Exception	itertoolspermutationsru   rt   nextrp   )rk   rw   r   best	best_costpcosts          r   .min_cost_perfect_bipartite_matching_bruteforcer   o   s    AA1uNOO ))%(3L\"#Da&I ,Q")"1gt)D, ?r   )rs   )r|   c                     t        t        | j                              }t        || j                        | j                  | j
                  | j                  dz  | j                  dz  | j                  |z  fS )N   )	r   absarear   meanXmeanYstddevXstddevYcorrelation)statssizes     r   contour_vector_from_statsr      sb     EJJ D$$D  r   c                   	 t        |       }t        t        |            }| D cg c]  }|D cg c]  }t        ||       c} c}}	t	        	      \  }}t        	fdt        |      D              }|||fS c c}w c c}}w )Nc              3   .   K   | ]  }|   |     y wr   r   )rh   ri   costss     r   rl   z'matching_for_vectors.<locals>.<genexpr>   s     6a6s   )rr   rt   ru   ra   #min_cost_perfect_bipartite_matchingrm   )
m0m1rw   identity_matchingr[   r\   ro   rp   identity_costr   s
            @r   matching_for_vectorsr      sz    BAU1X;=>RR0rl2r"0>E 	,E26U1X66M]M11 1>s   	B A;B ;B c                 @    d}t        |       D ]  \  }}|dz  |z  } |S )Nr      )reversed)pointsbitsrS   bs       r   points_characteristic_bitsr      s1    D&! A	QKr      c                    g }| s|S | D cg c]  \  }}t        |  } }}t        |       }t        dk(  sJ | j                  | d t        dz
          t        |       t        k  r.| j                  | d t        dz
          t        |       t        k  r.t	        |      D ]  }| |   }|j                  |       | |dz      }||z
  }|j                  |dz         | |dz      }	|	|z
  }
|j                  |
|z
         |j                  |
j                  z  |j                  |
j                  z  z
  }t        t        t        |            |      }|j                  |dz          |S c c}}w )Nr   r      r   )complexrr   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendru   r=   rc   rd   r   r   r   )r   vectorrS   _rw   ri   r'   r+   d0r/   d1crosss               r   points_complex_vectorr      sb   F(./ur1grl/F/FA/1444
MM&C?!CDE
f+<
<fGCaGHI f+<
<1X ! AYb AE]"Wb1f AE]"Wb2g "''!BGGbgg$55c%j)51eai +!. M; 0s   E!c                 n   t        |       }t        |       }|r| d d d   } t        |       }n|}t        |       }t        |      |z  dk(  sJ t        |      |z  }d|z  dz
  }t        |      D ]E  }	|||	z
  z  |z  ||	z	  z  }
|
|k(  s|j	                  t        ||	 |z        |r|dz
  |	z
  n|	|f       G y )NrE   r   r   )r   rr   r   ru   r=   r   )r   isomorphismsreversereference_bitsrw   r   r   multmaskri   r   s              r   add_isomorphismsr      s    /7NFA
 ")&1"6*Fv;?av;!DFa<D1X q1uo%$!)4&1"t),7a!eai7Sr   c                 X  
 d gt        t        t        |       dz
              z   }t        t        t        |                   }|rId t        |      D        }|r&t	        |      }t        j                  d|||          nd}t        j                  d       	 ddlm	} t        t        |            D cg c]  }dgt        |      z   }}t               }	|D ]!  
|	j                  
j                                # t        |	      }	|D 

cg c]  
t        
fd|	D               }}
t        j                   t        t        |            d      D ]  \  }}t#        ||   ||         ||   |<     ||      }|j%                         \  }}t'        t              }t)        ||      D ]-  \  }}||   j+                  |       ||   j+                  |       / d gt        |      z  }g }t               }t-        |g      }|rc|j/                         }|j+                  |       |j1                  |       t        ||         D ]  }||vs|||<   |j1                  |        |rct4        j                  d	|       t4        j                  d
|       ||fS c c}w c c}
w # t2        $ r Y Ew xY w)Nr   c              3   h   K   | ]*  \  }}t        d  |j                         D              s'| , yw)c              3   &   K   | ]	  }|d k(    ywr   Nr   )rh   vs     r   rl   z3find_parents_and_order.<locals>.<genexpr>.<genexpr>   s     :Va16:Vs   N)rv   values)rh   ri   r   s      r   rl   z)find_parents_and_order.<locals>.<genexpr>   s'     Wtq!s:V188::V7VWs   (22z!Base master index %s, location %sr   zNo base master location found)minimum_spanning_treec              3   B   K   | ]  }j                  |d         ywr   )get)rh   r   r   s     r   rl   z)find_parents_and_order.<locals>.<genexpr>  s     7QQUU1a[7s   r   zParents: %sz	Order: %s)rt   ru   rr   rn   r   logginginfowarningscipy.sparse.csgraphr   setupdatekeyssortedtupler   combinationsra   nonzeror   rY   addr   popleftr=   ImportErrorlog)	glyphsets	locationsparentsorderbasesbaser   r   graphaxesr   vectorsri   rj   treerx   ry   r~   r   visitedqueues             `          r   find_parents_and_orderr      sl   ftE#i.1"4566Gs9~&'EWy3W;DLL<dIdOTDOO;<"	B38Y3HIaaS3y>)IEI5D &AFFH%&$<DAJKAu7$77KGK!..uS^/DaH C1*71:wqzBaC )/DJD$$EdO $Sc
s#c
s#$
 fs9~-GEeG4&MEMMOAQa) (A'%&
Q(	  	(e$E>G J
 L2  		s8   J 4J
AJ J'D J J 
J 	J)(J)c                    | j                   }| j                  }| j                  }||z
  dz  dz  ||z  z   dz  }||z   dz  |z   }||z   dz  |z
  }|dk7  rt        ||z
  |      n||k  r	t        dz  nd}t               }	|dk  rd}|rf|	j                  | j                   | j                         }	|	j                  |       }	|	j                  dt        |      z  dt        |      z        }	|	S |	j                  t        |      t        |            }	|	j                  |      }	|	j                  | j                  | j                        }	|	S )N      ?r   r   r   )	varianceX
covariance	varianceYr   r   r
   	translater   r   rotatescaler   )
r   inversear   cdeltalambda1lambda2thetatranss
             r   transform_from_statsr   .  s9   AAA1um!AE)c1E1ume#G1ume#G%&!VE'A+q!a!e"s(EKE{ u{{l;eV$AW-q4=/@A L	 DM4=9U#U[[9Lr   c                       e Zd ZddZd Zy)LerpGlyphSetc                 .    || _         || _        || _        y r   )	glyphset1	glyphset2factor)r!   r   r   r   s       r   r   zLerpGlyphSet.__init__R  s    ""r   c                     t        ||       S r   )	LerpGlyph)r!   	glyphnames     r   __getitem__zLerpGlyphSet.__getitem__W  s    D))r   Nr   )r?   r@   rA   r   r   r   r   r   r   r   Q  s    
*r   r   c                       e Zd Zd Zd Zy)r   c                      || _         || _        y r   )r#   r   )r!   r   r#   s      r   r   zLerpGlyph.__init__\  s     "r   c                    t        | j                  j                        }| j                  j                  | j                     j	                  |       t        | j                  j
                        }| j                  j
                  | j                     j	                  |       | j                  j                  }t        |j                  |j                        D ]l  \  \  }}\  }}||k7  rt        d|d|      t        ||      D 	
cg c]!  \  \  }	}
\  }}|	||	z
  |z  z   |
||
z
  |z  z   f# }}}
}	} t        ||      |  n y c c}}}
}	w )NzMismatching operations: , )r	   r#   r   r   drawr   r   rY   r    
ValueErrorgetattr)r!   r>   
recording1
recording2r   op1args1op2args2r_   y1x2y2mid_argss                 r   r   zLerpGlyph.draw`  s1   ,T]]-D-DE
/44Z@,T]]-D-DE
/44Z@%%*-j.>.>
@P@P*Q 	)&LS%,3cz S#!NOO +.eU*; &HRhr2 rBw&(("R6/A*ABH  GCx(	)s   &E	N)r?   r@   rA   r   r   r   r   r   r   r   [  s    #)r   r   c                 x   t               }|j                  }t        | j                  |j                        D ]x  \  \  }}\  }}||k7  rt        d|d|      |dk(  r|}	n<t        ||      D 
cg c]!  \  \  }
}\  }}|
||
z
  |z  z   |||z
  |z  z   f# }	}}}
}|j	                  ||	f       z |S c c}}}}
w )NzMismatched operations: r   rF   )r   r    rY   r  r=   )r  r  r   r>   r    r  r  r  r  r  r_   r	  r
  r  s                 r   lerp_recordingsr  q  s    
.CIIE&)**:*:J<L<L&M 
&"elsE#:SIJJ. H +.eU*; &HRhr2 rBw&(("R6/A*ABH  	c8_%
& Js   2&B4)Fr   )3fontTools.pens.basePenr   r   r   fontTools.pens.pointPenr   r   fontTools.pens.recordingPenr   r	   fontTools.misc.transformr
   collectionsr   r   mathr   r   r   r   r   r   	getLoggerr   r   r   rC   rJ   ra   re   rp   rz   r   r   scipy.optimizers   r   r   munkresr|   r   r   r   r   r   r   r   r   r   r   r  r   r   r   <module>r     s   G G G M . * * *  g9:G D?} ?H. H8.("
4*S'2 () $!H64n F* *) ),[  

	
# 8 	,  
: 	,


s6   B? ?CCCCCCCC