
    ]Mh                        d Z ddlT ddlmZ ddlmZ ddlmZmZm	Z	 ddl
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 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z!m"Z"m#Z# ddl$Z$ddl%Z% e$j&        d          Z'dZ(dZ)dZ*dZ+ G d d          Z,	 	 	 d"de(e)e+dg ddZ- ee-          d             Z.d Z/d Z0d#d Z1e2d!k    r2ddl3Z3 e1            Z4 e3j5         e6 e7e4                               dS dS )$z
Tool to find wrong contour order between different masters, and
other interpolatability (or lack thereof) issues.

Call as:
$ fonttools varLib.interpolatable font1 font2 ...
   )*)test_contour_order)test_starting_point    )RecordingPenDecomposingRecordingPenlerpRecordings)TransformPen)StatisticsPenStatisticsControlPen)OpenContourError)piecewiseLinearMapnormalizeLocation)floatToFixedToStr)	Transform)defaultdict)SimpleNamespace)wraps)pformat)sqrtatan2piNzfontTools.varLib.interpolatablegffffff?g      ?gMb`?i  c                   ,    e Zd ZdZd Zd Zd ZddZdS )Glyph)	
recordings
greenStatscontrolStatsgreenVectorscontrolVectors	nodeTypesisomorphismspointsopenContoursc                 t    || _         | j        D ]}t          | |g            |                     |           d S N)nameITEMSsetattr	_populate)self	glyphnameglyphsetitems       _/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/varLib/interpolatable.py__init__zGlyph.__init__4   sG    	J 	$ 	$DD$####x         c                     | j         D ]F}t          t          | |                    |k    r#t          | |                              d            Gd S r%   )r'   lengetattrappend)r*   ixr-   s      r.   _fill_inzGlyph._fill_in:   sY    J 	1 	1D74&&''2--d##**4000	1 	1r0   c                    || j                  }|d u | _        | j        rd S t          t          |          }	 |                    |d           n%# t
          $ r |                    |           Y nw xY w|j        | _        ~t          | j                  D ]6\  }}d |j        D             }| j	        
                    |           t          |          }t          |          }	 |                    |           |                    |           | j        
                    d           nF# t          $ r9}	| j        
                    d           |                     |           Y d }	~	d }	~	ww xY w| j        
                    |           | j        
                    |           | j        
                    t)          |                     | j        
                    t)          |                     |d         dk    r|                     |           |d         dk    sJ |d	         d
v sJ t-                      }
t/          |
d          }|                    |           | j        
                    |
j                   g }| j        
                    |           t5          |
j        |d           t5          |
j        |d           8d S )Nr,   T)outputImpliedClosingLinec                     g | ]\  }}|S  r;   ).0opargs      r.   
<listcomp>z#Glyph._populate.<locals>.<listcomp>N   s    999C999r0   Fr   addComponentmoveTo)	closePathendPath)r&   doesnt_existPerContourOrComponentPenr   draw	TypeErrorvaluer   	enumerater    r4   r   r   replayr#   r   r6   r   r   r   contour_vector_from_statsr   SimpleRecordingPointPenSegmentToPointPenr"   r!   add_isomorphisms)r*   r,   glyphperContourPenr5   contourr    r   r   er"   	converterr!   s                r.   r)   zGlyph._populate?   s   #!TM 	F0QQQ	&JJ}tJDDDD 	& 	& 	&JJ}%%%%%	&'-$T_55 (	? (	?KB997=999IN!!),,,&999J/BBBLz***|,,,!((////#   !((...b!!! O"":...$$\222$$%>z%J%JKKK&&'@'N'NOOO |~--b!!!Q<8++++R=$<<<<<,..F)&%88INN9%%% Kv|,,,L$$\222 V\<???V\<>>>>Q(	? (	?s*   A A10A1'AD,,
E/6/E**E/Nc                     |!| j         D ]}|                    |           d S | j         |                             |           d S r%   )r   rG   )r*   pencountor_idxrR   s       r.   rG   z
Glyph.draww   s[    ? " "S!!!!" " OK(--c22222r0   r%   )__name__
__module____qualname__r'   r/   r6   r)   rG   r;   r0   r.   r   r   '   s]        
E! ! !1 1 1
6? 6? 6?p3 3 3 3 3 3r0   r   F)	locations	tolerance	kinkinessupemshow_alldiscrete_axesc             #   l   VWXYZ[K   |dk    r|dz  }d|cxk    rdk    sn J |dk    r|dz  }d|k    sJ |pd  D             }|d  D             }t           ||	          \  Z}
 Zfd}|D 
]Vt                              d	V           Vfd
 D             }t          d |D                       dk    rJt	          t          | |                    D ]`\  }\  }}}|j        r|sVt          j        ||dfV  'd}t	          |j	                  D ]\  }}|sd}Vt          j
        |||dfV   |r`ad gt                     z  }|
D 	]}||         }||j        s ||V          }|$||         }||j        s6|j        W|j        }t          |          t          W          k    r?Vt          j        ||         ||         ||t          |          t          W          dfV  |Wk    rt	          t          |W                    D ]\  }\  }}||k    rt          |          t          |          k    r@Vt          j        |||         ||         ||t          |          t          |          dfV  ot	          t          ||                    D ]5\  }\  }}||k    r'Vt          j        ||||         ||         ||||d	fV  56t          ||          \  } }!| |k     rQVt          j        ||         ||         ||t#          t%          t          |!                              |!| dfV  |!||<   |j        }"|j        X|j        }#|j        Y|j        }$|j        [||         }!|!,Xr*Xfd|!D             XYfd|!D             Y[fd|!D             [g }%t          |$[          D ]z\  }&}'	 t-                      }(t#          t/          |&j        |'j                            |(_        |%                    |(           V# t4          $ r |%                    d            Y ww xY wt	          t          |"X                    D ]\  }\  })}*|)5|*3t          |)          dk    s t          |)          t          |*          k    rAt7          |||||!          \  } }+},| |k     r'Vt          j        |||         ||         ||d|+|,| d
fV  |%|         }-|-r|#|         d         dk     Y|         d         dk     k    rXt;          d           }.|-                    |.           t?          |.          }/|#|         }0Y|         }1|0d         |0d         z  }2|1d         |1d         z  }3|/d         |/d         z  }4t	          t          j         t          j!        f          D ]\  }5}6|5rtE          |2|3          }7tG          |2|3z            }7t          $                    d|6|4|7|2|3           |5s|7|z  |4dz   k    s|5rbd|7|z  z   |4k     rV	 |5r|7|4z  } n|4|7z  } n# tJ          $ r d} Y nw xY wt          $                    d|            V|6|||         ||         ||| dfV  |j&        }|j&        W||         WrWfd||         D             Wd}8|tN          z  tP          z  |z  }9t	          t          |W                    D ]L\  }\  })}*|)5|*3t          |)          dk    s t          |)          t          |*          k    rAt%          t          |)                    D ]}:|)|:         };|*|:         }<|;d         r|<d         s$|)|:dz
           }=|*|:dz
           }>|)|:dz   t          |)          z           }?|*|:dz   t          |*          z           }@|=d         r	|>d         r|=d         r	|>d         rtS          |;d          };tS          |<d          }<tS          |=d          }=tS          |>d          }>tS          |?d          }?tS          |@d          }@|;|=z
  }A|?|;z
  }B|<|>z
  }C|@|<z
  }D|Aj*        |Bj+        z  |Aj+        |Bj*        z  z
  }E|Cj*        |Dj+        z  |Cj+        |Dj*        z  z
  }F	 |EtY          |A          tY          |B          z  z  }E|FtY          |C          tY          |D          z  z  }Fn# tJ          $ r Y w xY wtY          |E          |8k    stY          |F          |8k    r|Aj*        |Bj*        z  |Aj+        |Bj+        z  z   }G|Cj*        |Dj*        z  |Cj+        |Dj+        z  z   }H|Gdk     s|Hdk     r	tY          |A          tY          |A          tY          |B          z   z  }ItY          |C          tY          |C          tY          |D          z   z  }JtY          |I|Jz
            }KtY          |K          |8k     r|;|<z   dz  }L|=|>z   dz  }M|?|@z   dz  }N|L|Mz
  }O|N|Lz
  }P|Oj*        |Pj+        z  |Oj+        |Pj*        z  z
  }Q	 |QtY          |O          tY          |P          z  z  }Qn# tJ          $ r Y  w xY wtY          |Q          ||z  z  |8k    r|QtY          |O          z  tY          |P          z  }RtY          |O|Pz             }StY          |R|Sz            }T|T|9k     rm|T|Sz  }U|U|8k    rz|8tY          |Q          |z  z  } t          $                    d |T|U|Q|K           t          $                    d|            Vt          j-        |||         ||         |||:| d!fV  N|r"Vt          j.        ||         ||         ||d"fV  	
d S )#N
   g{Gz?r   r   c                 ,    g | ]}t          |          S r;   )repr)r<   gs     r.   r?   ztest_gen.<locals>.<listcomp>   s    111!d1gg111r0   c                 @    h | ]}|                                 D ]}|S r;   keys)r<   r,   re   s      r.   	<setcomp>ztest_gen.<locals>.<setcomp>   s-    GGGx}}GG!!GGGGr0   )r`   c                     | d S |          } | d S |          ,|          |         |          } |          |          |         | S r%   r;   )ir+   	glyphsetsparentss     r.   grand_parentztest_gen.<locals>.grand_parent   s`    94AJ94aj$1i)@)H
A aj$1i)@)Hr0   zTesting glyph %sc                 0    g | ]}t          |          S r;   )r   )r<   r,   
glyph_names     r.   r?   ztest_gen.<locals>.<listcomp>   s#    KKKXU:x00KKKr0   c                     g | ]}|dS )Nr   r;   )r<   rP   s     r.   r?   ztest_gen.<locals>.<listcomp>   s    >>>eE,=,=,=,=r0   )typemaster
master_idxFT)rr   rs   rt   rR   )rr   master_1master_2master_1_idxmaster_2_idxvalue_1value_2)rr   pathru   rv   rw   rx   ry   rz   )	rr   r{   noderu   rv   rw   rx   ry   rz   )rr   ru   rv   rw   rx   ry   rz   r\   c                      g | ]
}|         S r;   r;   )r<   rk   m1Isomorphismss     r.   r?   ztest_gen.<locals>.<listcomp>9  s    !F!F!F."3!F!F!Fr0   c                      g | ]
}|         S r;   r;   )r<   rk   	m1Vectorss     r.   r?   ztest_gen.<locals>.<listcomp>:  s    <<<aYq\<<<r0   c                      g | ]
}|         S r;   r;   )r<   rk   
recording1s     r.   r?   ztest_gen.<locals>.<listcomp>;  s    >>>jm>>>r0   )
rr   rR   ru   rv   rw   rx   ry   rz   reversedr\   r8   z;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>ztolerance %g)rr   rR   ru   rv   rw   rx   r\   c                      g | ]
}|         S r;   r;   )r<   rk   m1s     r.   r?   ztest_gen.<locals>.<listcomp>  s    666be666r0   g?   z=kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g)rr   rR   ru   rv   rw   rx   rI   r\   )rr   ru   rv   rw   rx   )/find_parents_and_orderloginfor2   rJ   ziprE   InterpolatableProblemMISSINGr#   	OPEN_PATHr    
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYr   CONTOUR_ORDERlistranger!   r   r   r   r	   rI   r4   
ValueErrorr   WRONG_START_POINTr   rK   rL   UNDERWEIGHT
OVERWEIGHTmaxr   debugZeroDivisionErrorr"   DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabsKINKNOTHING)\rl   glyphsnamesignore_missingr[   r\   r]   r^   r_   r`   orderrn   	allGlyphsrt   rP   r,   r&   has_openr5   open	matchingsm1idxglyph1m0idxglyph0m0pathIxnodes1nodes2nodeIxn1n2this_tolerancematchingm0Isomorphisms	m0Vectors
recording0midRecordingc0c1rcontour0contour1proposed_pointreverserR   midStats	midVectorm0Vecm1Vecsize0size1midSize
overweightproblem_typeexpectedSizetdeviation_thresholdrk   pt0pt1pt0_prevpt1_prevpt0_nextpt1_nextd0_prevd0_nextd1_prevd1_nextsin0sin1dot0dot1r0r1r_diffmidmid_prevmid_nextmid_d0mid_d1sin_midcrossarc_len	deviationdeviation_ratiorp   r   r~   r   rm   r   s\   `                                                                                     @@@@@@r.   test_genr      s      BT		QBT		>>>>111y111E~ HGIGGG+9M  NGU       ^ ^
#Z000KKKKKKK	>>y>>>??1DD3<	9e,,4
 4
 	 	/J/$ ! 
% "$9$A&**4     H%e&899  D  5 ?"&&0#%	        FS^^+	 w	 w	Eu%F~V%5~ L
33E}u%F~V%5~ !B!B2ww#b''!! 5 @$)%L$)%L(-(-#&r77#&r77     Rxx09#b"++0F0F "% "%,F,VV'' 6{{c&kk11&(=(H(.,1%L,1%L0505+.v;;+.v;;	 	    !,5c&&6I6I,J,J % %(R88 *,A,V,2,205e05e4949/1/1
!" 
!"#    % $%, (:&&'I'I$NH	)) 5 C$)%L$)%L(-(-#'c(mm(<(<#=#=#+%3	 	    $,	%  $0N#0N+I+I*J*J !'H$$!F!F!F!FX!F!F!F<<<<8<<<	>>>>X>>>
Lj*55 . .B.$A">"(BH#E#EFFAG ''****! . . . ''-----. -6NN33- - b b((Xx $'8}}))8}}H55 :MFB	8; ;7 "I--"$9$K')(-e(-e,1,1'('5(/)7    . 'r* 7	"a 01 4)B-:JQ:NOO,d;;;HNN8,,, 9( C CI%bME%bME!!HuQx/E!!HuQx/E'lYq\9G4=1=1<5 5 + +0
L & ?+.ue+<+<L$+/+>+>L		Y(#(!!   !+/;i/G'TX./X/X( 0Y-1L94L-Lw-V-V3#- !L5AG5KNN5<|5KN#4 3 3 3123IInnEEE *,8/105e05e49491?!" !"#     BB ++6666Yu%5666A//2CCiO   -6c"bkk,B,B | |((Xx$'8}}))8}}H55 
 s8}}-- n nA"1+C"1+Cq6 !Q ! 'AH'AH'Q#h--(?@H'Q#h--(?@H{ !x{ ! { !x{ ! !3q6*C!3q6*C&4H&4H&4H&4H "HnG&nG!HnG&nG"<',69TTD"<',69TTD!Gs7|| ;;Gs7|| ;;, ! ! ! ! 4yy1}}D		A  #<',69TTD"<',69TTDaxx4!88  WWG)DEBWWG)DEB b\\F6{{Q 9/C (8 3q8H (8 3q8H 8^F%^F$kFK7&+:SSG!3v;;V#<<, ! ! ! ! 7||y9'<=BB  $c&kk1CKK?E!&6/22G #EGO 4 4I #666 &/'&9O&** %&#g,,*B%CNIIW!'   IInn==="$9$>')(-e(-e,1,1%&)7	 	    Enh  
 5 =$)%L$)%L(-(- 	 	 	 	]w	O^ ^sJ   ;APP-	,P-	XX#"X#Ab
b-,b-+"h
hhc                      t          t                    }t          | i |D ] \  }}||                             |           !|S r%   )r   r   r   r4   )argskwargsproblemsr+   problems        r.   testr   I  sQ    4  H&777 , ,	7""7++++Or0   c                     | |v rd S ||          || <   t          ||          dg           D ]}t          |j        |||           d S )N
components)r3   recursivelyAddGlyph	glyphName)r+   r,   
ttGlyphSetglyf	components        r.   r   r   Q  sh    H$Y/HYT)_lB?? M M	I/:tLLLLM Mr0   c                 t    t           j                            |           }|rt          j        |d           | S )NT)exist_ok)osr{   dirnamemakedirs)r{   r   s     r.   ensure_parent_dirr   Z  s7    good##G ,
Gd++++Kr0   c                 '  WXYZ[\ ddl }ddl}|                    dt          j                  }|                    ddd           |                    d	d
d           |                    ddt          dt          z             |                    ddt          dt          z             |                    dd
d           |                    ddd           |                    ddd           |                    ddd           |                    dd
d           |                    ddd           |                    dd
d           |                    dd t          d!d"#           |                    d$d%t          d&d'(           |                    d)d*d
d+           |                    d,d
d-           |
                    |           } dd.lm}  || j        rd/nd01           | j        r |d21           | j        r| j                                        nd}dd3lm} g }g }g }	t'                      [t(          }
t+          | j                  }t/          | j                  d4k    rd}| j        d                             d5          rdd6lm} |                    | j        d                   }d7 |j        D             | _        d8 |j        D             }	d9 |j        D             [[fd:|j        D             Zd; |j        D             YYfd<Z                                D             Zn| j        d                             d=          rdd>lm }m!}  || j        d                   }|j"        }
 ||          }d? |j        D             }d@ |D             }g | _        dA |j        D             }	dB |j        D             ZdC |j        D             YYfdDZ                                D             Zn| j        d                             dE          s!| j        d                             dF          rddGl#m$}  || j        d                   }|dH         j%        }
|dI         }i X|j        D ]}|j&        |j'        |j(        dJX|j)        <    dK}dL|v r|dL         }tU          |j+        dMd          rdN XD             XdO}nl|j,                                        D ]R\  }}X|         -                                }|                                D ]\  }}t]          ||          X|         |<   Si }t_          t`                    }dP|v r|dP         }|dQ         }|&tc          |j2        3                                          }|D ]} |j2        |          D ]}!i }"g }#tc          |!j                                                  D ]-\  }$}%|%d4         |"|$<   |#4                    |$|%d4         f           .t+          |#          }&|&|vr|5                    |"dOdKR          ||&<   tm          | ||&         ||&         |           ndS|v r|dI         j        }'|dS         j7        j8        d         }(|(j9        })|!tc          |)3                                          }|D ]k} |)|          }*|*j:        }+tU          |+dTd          h},tU          |+dTd          }-d}.tw          |*j<                  D ]?}/|/dUk    r|,=                    |-           n|/dTk    rt}          |.t~                    sJ |.}-|/}.@t          |+dV          s|+jA        jB        }0|,D ]}-|0jC        |-         }1|1jD        D ]}2|0jE        jF        |2         }3i }"g }#tw          |3jG                  D ]5\  }4}|'|4         j)        }$|jH        }%|%|"|$<   |#4                    |$|%f           6t+          |#          }&|&|vr|5                    |"dOdKR          ||&<   ||&         \||&         |          \| <   mdWg}|5                                g}i g}	dX tc          X3                                          D             Ztc          |3                                dY Z          D ]}&d[d\I                    Xfd]|&D                       z   d[z   }5|r|5d^z  }5|4                    |5           |4                    ||&                    |	4                    ta          |&                     dO| _J        g | _        |	sd_ |D             }	| j        D ]}6|6                    d`          rQddalKmL}7  |7|6          }t                      }8|N                    |8           |8j%        }
|4                    |           n3ddGl#m$}  ||6          }|dH         j%        }
|4                    |           |4                     ||6          O                    dbd4          d                    t/          |          dck     rt          Q                    dd           dS g }|D ]\}t          |de          r|5                                \n|\|4                    \fdf\3                                D                        ]| jR        rZt'          | jR                  WWfdgt          ||          D             }Wfdht          ||	          D             }	Wfdi|D             }|s&tc          t'          dj |D                                 }t'          |          }9|D ]4\t'          \3                                          }:|9|:z
  };|;r
|;D ]}<d\|<<   5Z[fdk|	D             }	| jT        pt          }=| jU        | jU        nt          }>	 t          V                    dlt/          |                     t          V                    dmt          |	                     t          ||||	|
| jJ        |=|>| jY        [n
  
        }?t_          t                    }@| j[        |j\        n!t          t          | j[                  do          }A| j_        s| j`        rMddl`}B|?D ] \  } }C|@|          4                    |C           !t          |Bb                    |@          |Ap           nd}D|?D ]\  } }E|@|          4                    |E           | |Dk    rt          dq|  dr|Ap           | }Dd}Fds|Ev r	|Eds         fn|Edt         |Edu         f}G|G|Fk    rFdv|Ev r	|Edv         fn|Edw         |Edx         f}Ht          dydzI                    |H          z  |Ap           |G}F|Ed{         t          jd        k    rt          d||Edv         z  |Ap           |Ed{         t          je        k    rt          d}|Edv         z  |Ap           |Ed{         t          jf        k    r2t          d~|Ed         |Edw         |Ed         |Edx         fz  |Ap           T|Ed{         t          jg        k    r9t          d|Ed         |Ed         |Edw         |Ed         |Edx         fz  |Ap           |Ed{         t          jh        k    r@t          d|Ed         |Ed         |Ed         |Edw         |Ed         |Edx         fz  |Ap           |Ed{         t          ji        k    r7t          d|Ed         d|Edw         dz|Ed         d|Edx         |Ap           F|Ed{         t          jj        k    r@t          d|Ed         |Ed         |Edw         |Ed         |Edx         |Ed         fz  |Ap           |Ed{         t          jk        k    r+t          d|Ed         |Edw         |Edx         fz  |Ap           |Ed{         t          jl        k    r+t          d|Ed         |Edw         |Edx         fz  |Ap           |Ed{         t          jm        k    r2t          d|Ed         |Ed         |Edw         |Edx         fz  |Ap           f|Ed{         t          jn        k    r#t          d|Edw         d|Edx         |Ap           n#|?D ] \  } }C|@|          4                    |C           !t          |@          }@dD ]}EtU          | |E          }I|It          V                    d|Ep                                |I           d4dlqmr}Jms}K |Edk    r|Jn|K}L |Lt          |I          ||          5 }M|Mt                    ||=|>           |@r|Mu                    |@           |Mv                    |@           |@s| j_        s|Mw                                 |@r(|Mx                                 |My                                 ddd           n# 1 swxY w Y   | jz        r#t          V                    d| jz                   d4dlqm{}N g }Oi }P |N|O||          5 }Q|Qt                    |dK|=|>           |@                                D ]1\  }R}S|R|Pt/          |O          <   |Qv                    |R|SidKdK           2|@s| j_        s|Qw                                 ddd           n# 1 swxY w Y   ddl|}Tt          t          | jz                  d          5 }A|A}                    d           |A}                    d           |A}                    d           tw          |O          D ]\  }U}Q|U|Pv r2|A}                    d|P|U          d~                    d                     |A}                    d~                    d                     |A}                    |T                    |Q                     |A}                    d           |A}                    d           |A}                    d           ddd           n# 1 swxY w Y   n># t           $ r0}V|Vxj        |z  c_        t                              |V            d}V~Vww xY w|@r|@S dS )z/Test for interpolatability issues between fontsr   Nzfonttools varLib.interpolatable)descriptionz--glyphsstorez&Space-separate name of glyphs to check)actionhelpz
--show-all
store_truez3Show all glyph pairs, even if no problems are foundz--tolerancez,Error tolerance. Between 0 and 1. Default %s)r  rr   r  z--kinkinessz)How aggressively report kinks. Default %sz--jsonzOutput report in JSON formatz--pdfzOutput report in PDF formatz--psz"Output report in PostScript formatz--htmlzOutput report in HTML formatz--quietz%Only exit with code 1 or 0, no outputz--outputz3Output file for the problem report; Default: stdoutz--ignore-missingz<Will not report glyphs missing from sparse masters as errorsinputsFILE+zSInput a single variable font / DesignSpace / Glyphs file, or multiple TTF/UFO files)metavarrr   nargsr  z--nameNAMEr4   zGName of the master to use in the report. If not provided, all are used.)r  rr   r  r  z-vz	--verbosezRun verbosely.z--debugzRun with debug output.)configLoggerINFOWARNING)levelDEBUG)basenamer   z.designspace)DesignSpaceDocumentc                     g | ]	}|j         
S r;   )r{   r<   rs   s     r.   r?   zmain.<locals>.<listcomp>  s    III66;IIIr0   c                     g | ]	}|j         
S r;   locationr  s     r.   r?   zmain.<locals>.<listcomp>      KKKVKKKr0   c                 <    h | ]}t          |d           |j        S )minimum)hasattrr&   r<   as     r.   ri   zmain.<locals>.<setcomp>  s9       98M8M  r0   c                 V    i | ]%}|j         v|j         |j        |j        |j        f&S r;   r&   r  defaultmaximum)r<   r  r`   s     r.   
<dictcomp>zmain.<locals>.<dictcomp>  sA       6.. AIqy9...r0   c                 (    i | ]}|j         |j        S r;   r&   mapr  s     r.   r   zmain.<locals>.<dictcomp>      EEEqQVQUEEEr0   c                 R    i | ]"\  }t          fd |D                       #S )c              3   ^   K   | ]'}t          |t                                       V  (d S r%   r   dictr<   vaxis_mappingsks     r.   	<genexpr>z"main.<locals>.<dictcomp>.<genexpr>  ;      SS1+AtM!4D/E/EFFSSSSSSr0   tupler<   vvr,  r+  s     @r.   r   zmain.<locals>.<dictcomp>  Q       Ar 5SSSSSPRSSSSS  r0   )z.glyphsz.glyphspackage)GSFontto_designspacec                     g | ]	}|j         
S r;   )font)r<   sources     r.   r?   zmain.<locals>.<listcomp>  s    CCCVV[CCCr0   c                 D    g | ]}|j         j        d |j         j        S )-)r   
familyName	styleName)r<   fs     r.   r?   zmain.<locals>.<listcomp>  s0    TTT 1 1 1163C3CDTTTr0   c                     g | ]	}|j         
S r;   r  r  s     r.   r?   zmain.<locals>.<listcomp>  r  r0   c                 B    i | ]}|j         |j        |j        |j        fS r;   r  r  s     r.   r   zmain.<locals>.<dictcomp>  s6       >?AIqy9  r0   c                 (    i | ]}|j         |j        S r;   r"  r  s     r.   r   zmain.<locals>.<dictcomp>  r$  r0   c                 R    i | ]"\  }t          fd |D                       #S )c              3   ^   K   | ]'}t          |t                                       V  (d S r%   r'  r)  s     r.   r-  z"main.<locals>.<dictcomp>.<genexpr>  r.  r0   r/  r1  s     @r.   r   zmain.<locals>.<dictcomp>  r3  r0   z.ttfz.otf)TTFontheadfvarrB   r   r   FavarVarStorec                     i | ]	}|d ddd
S )rB   r   r   rF  r;   )r<   tags     r.   r   zmain.<locals>.<dictcomp>  s$    "T"T"T3RA!(<(<"T"T"Tr0   Tgvarr   )r  
normalizedrecalcBoundsCFF2vsindexblendvstorez''c                     i | ]}|d S )rF  r;   r  s     r.   r   zmain.<locals>.<dictcomp>d  s    OOOqA{OOOr0   c                 $    t          |           | fS r%   )r2   )r*  s    r.   <lambda>zmain.<locals>.<lambda>e  s    CFFA; r0   )key' c           
   3   p   K   | ]0\  }}|d t          t          ||                   d          V  1dS )=   N)r   r   )r<   r,  r*  axisMappings      r.   r-  zmain.<locals>.<genexpr>h  sk       	 	 !Aq AA- 21k!n E Er  	 	 	 	 	 	r0   z (normalized)c                     g | ]}i S r;   r;   )r<   _s     r.   r?   zmain.<locals>.<listcomp>~  s    '''AR'''r0   z.ufo)	UFOReader.r   z9Font file does not seem to be variable. Nothing to check.getGlyphSetc                 "    i | ]}||         S r;   r;   )r<   r,  r,   s     r.   r   zmain.<locals>.<dictcomp>  s    BBBQ!Xa[BBBr0   c                 "    g | ]\  }}|v 	|S r;   r;   )r<   r&   r,   accepted_namess      r.   r?   zmain.<locals>.<listcomp>  2     
 
 
h~%% %%%r0   c                 "    g | ]\  }}|v 	|S r;   r;   )r<   r&   r  rc  s      r.   r?   zmain.<locals>.<listcomp>  rd  r0   c                     g | ]}|v |	S r;   r;   )r<   r&   rc  s     r.   r?   zmain.<locals>.<listcomp>  s#    BBB$4>+A+A+A+A+Ar0   c                 @    g | ]}|                                 D ]}|S r;   rg   )r<   r,   gns      r.   r?   zmain.<locals>.<listcomp>  s-    TTTHHMMOOTTbRTTTTr0   c                 t    g | ]4}i t          |          fd |                                D             5S )c                 $    i | ]\  }}|v 	||S r;   r;   )r<   r,  r*  r`   s      r.   r   z#main.<locals>.<listcomp>.<dictcomp>  s)    BBB1qM/A/Aq!/A/A/Ar0   )r   items)r<   locaxis_triplesr`   s     r.   r?   zmain.<locals>.<listcomp>  sa       
 		
\22	
BBBB		BBB	
  r0   zRunning on %d glyphsetszLocations: %s)	r   r   r[   r^   r   r\   r]   r_   r`   w)filezGlyph z was not compatible:rt   rw   rx   rs   ru   rv   z  Masters: %s:z, rr   z"    Glyph was missing in master %sz'    Glyph has an open path in master %sz*    Path count differs: %i in %s, %i in %sry   rz   z5    Node count differs in path %i: %i in %s, %i in %sr{   z7    Node %o incompatible in path %i: %s in %s, %s in %sr|   z    Contour order differs: z in zD    Contour %d start point differs: %s in %s, %s in %s; reversed: %srR   r   z3    Contour %d interpolation is underweight: %s, %sz2    Contour %d interpolation is overweight: %s, %sz'    Contour %d has a kink at %s: %s, %srI   z    Showing z and )pspdfzWriting %s to %s)InterpolatablePSInterpolatablePDFrp  )rl   r   )r\   r]   zWriting HTML to %s)InterpolatableSVG)show_tolerancer\   r]   )ru  show_page_numberwbs   <!DOCTYPE html>
sN   <html><body align="center" style="font-family: sans-serif; text-color: #222">
s6   <title>fonttools varLib.interpolatable report</title>
z
<h1>Glyph z</h1>
zutf-8z$<img src='data:image/svg+xml;base64,s   ' />
s   <hr>
s   </body></html>
)argparsesysArgumentParsermain__doc__add_argumentfloatDEFAULT_TOLERANCEr   str
parse_args	fontToolsr
  verboser   r   splitos.pathr  setDEFAULT_UPEMr0  r  r2   endswithfontTools.designspaceLibr  fromfilesourcesaxesrk  	glyphsLibr4  r5  upmfontTools.ttLibrC  
unitsPerEmminValuedefaultValuemaxValueaxisTagr3   tablesegmentscopyr   r   r(  sorted
variationsrh   r4   r`  r   cfftopDictIndexCharStringsprivaterJ   programadd
isinstanceintr  rQ  
otVarStoreVarDataVarRegionIndexVarRegionListRegionVarRegionAxis	PeakCoordjoinr   fontTools.ufoLibr^  r   readInforsplitr   warningr&   r   r\   r]   r   r   r   r_   r   outputstdoutr   r   quietjsonprintdumpsr   r   r   r   r   r   r   r   r   r   r   r   sort_problemsupperinterpolatablePlotrr  rs  add_title_pageadd_summaryadd_problemsdraw_cupcake	add_indexadd_table_of_contentshtmlrt  base64writeencode	b64encode	Exceptionr   error)]r   rx  ry  parserr
  r   r  fontsr   r[   r^   original_args_inputsdesignspacer  r4  r5  gsfontrC  r7  rE  axisrL  rG  r  r  fvarMappingr  rI   ttGlyphSetsrl   rK  r   r+   varlocDictrl  rJ  vallocTuplefvarAxescff2charstringscsr  	vsindicesrO  last_opr=   varStorevarDataregionIndexregion	axisIndexr&   filenamer^  r   	glyphsSetglyphSetGlyphNamesdiffrh  r\   r]   problems_genr   r=  r  r   last_glyphnameplast_master_idxsmaster_idxsmaster_namesr>   rr  rs  PlotterClassdocrt  svgsglyph_startssvgrP   glyph_problemsr  rk   rS   rc  r[  r+  rm  r`   r,   s]                                                                                          @@@@@@r.   r{  r{  a  s   OOOJJJ$$)L %  F 5    
 B    
 ;>OO	     8;LL	     +    
 *    
 1    
 +    
 4    
 B    
 K    
 b     V     k,EUVVV
	,=UVVVT""D&&&&&&L$,=I????z $7####$(K9T[   TF      EEIEEMD --
4;1;q>"">22 q	DDDDDD-66t{1~FFKII[5HIIIDKKK{7JKKKI  + 0  M   $)  L
 FEK4DEEEM   )//11  LL
 [^$$%BCC ]	88888888VDKN++F:D(.00KCC{/BCCCETTeTTTEDKKK{7JKKKI CNCS  L FEK4DEEEM   )//11  LL
 [^$$V,, J	A0G0G0O0O J	...... 6$+a.))D<*D<DK	  (}- -DL))
 J~~F|4:z488 	"T"T"T"T"TK!%JJ-1]-@-@-B-B  )&1'&:&?&?&A&A/7~~/?/?  OHe:L (+; ;K077 K#D))I~~F|F|>#DO$8$8$:$:;;F!'  I#y9  "$ (.sx~~/?/?(@(@ 6 6HC+.q6GCLJJSV}5555#(::#;66484D4D)0TPU 5E 5 5K1 ,%y':K<QSW   $ 4<,F|'4Q7".>#K$4$4$6$677F!' -S -SI$Y/B jG "))Q!?!? @I%gy!<<GG (
33 % %==%MM'22229__#-gs#;#;;;;&-G"$"7H55 ! &~8H#, S S"*"27";+2+A S SK%-%;%B;%OF&(G"$C3<V=Q3R3R 7 7	4&.y&9&A&*n/2 #

C: 6 6 6 6',SzzH'{::8<8H8H-4/316 9I 9" 9"H 5 (1':H2=h2G	2RHY//)SS0 FE%%''(EIOOF;;K;K;M;M4N4NOOOL"9>>#3#39N9NOOO 1 1hh 	 	 	 	 %-	 	 	 	 	
    ,O+DT"""Yx0111  h0000"&DDK ('''''	K ; ;V$$ 	2222229X&&D"$$DMM$?DLL......6(##D<*DLLXXh''..sA66q9::::
5zzA~~OPPPI D D4'' 	''))HHHBBBB(--//BBBCCCCy CTY
 
 
 
"%eY"7"7
 
 
	

 
 
 
"%eY"7"7
 
 
	
 CBBB%BBB WTT	TTTUUVVFI $ $ 11-- 	$ $ $#    
   I 3"3I"&."<BSIm*C	NN;;;')"4"4555.]'
 
 
 t$$ {" JJ'44c:: 	
 z O	4y K*6 8 8&IwY'..w7777djj**33333!%$0 B BLIqY'..q111 N22FyFFFQOOOO)2+/( (1,, <**/>1BC  
 #&666  (1}} x[NN"#J-:!? %
 /$))L2I2IIPQRRRR+6(y$9$AAA@1X;NUV     6&;&EEEE(S!"     6&;&FFFH !) !* !) !*	 "#	 	 	 	 	 6&;&FFFS !&	 !) !* !) !* "#
 
 
 
 
 6&;&PPPU !&	 !&	 !) !* !) !* "#     6&;&III !") !* !) !* "#	 	 	 	 	 6&;&MMMb !) !) !* !) !* !* "#     6&;&GGGQ !) !* !* "#     6&;&FFFP !) !* !* "#     6&;&@@@E !) !'
 !* !*	 "#	 	 	 	 	 6&;&CCC !"* !*
 "#   wBH '3 4 4"	7#**73333 ** 	0 	0A$""C{HH'C888OOOOOOOO/0Dyy++>OL!#&&)5   0""(I #     .OOH---  *** '
 '$$&&& 0MMOOO--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 &	-HH)49555======DL""49EJJJ 'c""(#(''	 #    .6^^-=-=  )E>.3LT+$$/',). %    
   '
 '$$&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" MMM'	22D99 -Q,---f   RSSS'oo ' 'FAsL(( E\!_ E E E L LW U UVVVGGBII'RRSSSGGF,,S11222GGI&&&GGI&&&&+,,,- - - - - - - - - - - - - - -    	&&		!
   s   UAN4 C#BAE;E/AN4 E;AE?	E?AN4 FAE?	FAAN4 GA=AIIAN4 IAIIAN4 IAII)AN4 JDAN(NAN4 N(AN,N,AN4 N/AN,N0AN4 N4AO/N?+AO*O*AO/__main__)NNFr%   )8r|  interpolatableHelpersinterpolatableTestContourOrderr   interpolatableTestStartingPointr   fontTools.pens.recordingPenr   r   r	   fontTools.pens.transformPenr
   fontTools.pens.statisticsPenr   r   fontTools.pens.momentsPenr   fontTools.varLib.modelsr   r   fontTools.misc.fixedToolsr   fontTools.misc.transformr   collectionsr   typesr   	functoolsr   pprintr   mathr   r   r   loggingr   	getLoggerr   r  r   r   r  r   r   r   r   r   r{  rX   ry  r   exitr  boolr;   r0   r.   <module>r     s    % $ $ $ > > > > > > @ @ @ @ @ @         
 5 4 4 4 4 4 L L L L L L L L 6 6 6 6 6 6 I I I I I I I I 7 7 7 7 7 7 . . . . . . # # # # # # ! ! ! ! ! !                                  				g9::    U3 U3 U3 U3 U3 U3 U3 U3t 
	G 	G G G G GT x  M M M  Q	 Q	 Q	 Q	h zJJJtvvHCHSSh  !!!!!	 r0   