o
    h                     @   s~  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$&dZ'dZ(dZ)dZ*dZ+G dd dZ,			d'de(e)e+dg dddZ-ee-dd Z.d d! Z/d"d# Z0d(d$d%Z1e2d&krddl3Z3e1 Z4e35e6e7e4 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                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )Glyph)	
recordings
greenStatscontrolStatsgreenVectorscontrolVectors	nodeTypesisomorphismspointsopenContoursc                 C   s,   || _ | jD ]}t| |g  q| | d S N)nameITEMSsetattr	_populate)self	glyphnameglyphsetitem r+   s/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/varLib/interpolatable.py__init__4   s   
zGlyph.__init__c                 C   s2   | j D ]}tt| ||krt| |d  qd S r"   )r$   lengetattrappend)r'   ixr*   r+   r+   r,   _fill_in:   s
   
zGlyph._fill_inc                 C   s  || j  }|d u | _| jrd S tt|d}z	|j|dd W n ty,   || Y nw |j| _~t| jD ]\}}dd |jD }| j	
| t|d}t|d}z|| || | j
d W n ty }	 z| j
d | | W Y d }	~	q7d }	~	ww | j
| | j
| | j
t| | j
t| |d dkr| | q7|d d	ksJ |d
 dv sJ t }
t|
d}|| | j
|
j g }| j
| t|
j|d t|
j|d q7d S )Nr)   T)outputImpliedClosingLinec                 S   s   g | ]\}}|qS r+   r+   ).0opargr+   r+   r,   
<listcomp>N       z#Glyph._populate.<locals>.<listcomp>Fr   addComponentmoveTo)	closePathendPath)r#   doesnt_existPerContourOrComponentPenr   draw	TypeErrorvaluer   	enumerater   r0   r
   r   replayr!   r   r2   r   r   r   contour_vector_from_statsr   SimpleRecordingPointPenSegmentToPointPenr    r   add_isomorphisms)r'   r)   glyphperContourPenr1   contourr   r   r   er    	converterr   r+   r+   r,   r&   ?   sZ   









zGlyph._populateNc                 C   s6   |d u r| j D ]}|| qd S | j | | d S r"   )r   rA   )r'   pencountor_idxrL   r+   r+   r,   rA   w   s
   
z
Glyph.drawr"   )__name__
__module____qualname__r$   r-   r2   r&   rA   r+   r+   r+   r,   r   '   s    8r   F)	locations	tolerance	kinkinessupemshow_alldiscrete_axesc          V      #   sF
   |dkr	|d9 }d|  krdksJ  J |dkr|d9 }d|ks%J |p-dd D }|d u r9dd D }t ||	d	\}
fd
d}|D ]ԉ td   fddD }tdd |D dkriqKtt||D ]6\}\}}}|jr|s tj||dfV  qqd}t|j	D ]\}}|sqd} tj
|||dfV  q|rqqqqd gt }|
D ]m}|| }|d u s|jsq|| }|d u rq|| }|d u s|jsq|j|j}t|tkr tj|| || ||t|tdfV  q|krbtt|D ]Z\}\}}||krqt|t|kr6 tj||| || ||t|t|dfV  qtt||D ]"\}\}}||kr^ tj|||| || ||||d	fV  q=q=qt||\} }!| |k r tj|| || ||ttt|!|!| dfV  |!||< |j}"|j|j}#|j|j}$|j|| }!|!d urĈrćfdd|!D fdd|!D fdd|!D g }%t|$D ])\}&}'zt }(tt|&j|'j|(_|%|( W q ty   |%d  Y qw tt|"D ] \}\})}*|)d u s|*d u st|)dkst|)t|*krqt|||||!\} }+},| |k rD tj||| || ||d|+|,| d
fV  |%| }-|-r|#| d dk | d dk krtd d}.|-|. t|.}/|#| }0| }1|0d |0d  }2|1d |1d  }3|/d |/d  }4ttj tj!fD ]i\}5}6|5rt"|2|3}7qt#|2|3 }7t$d|6|4|7|2|3 |5s|7| |4d ks|5rd|7|  |4k rz|5r|7|4 } n|4|7 } W n t%y   d} Y nw t$d|   |6||| || ||| dfV  qq|j&}|j&|| d urrfd d|| D d!}8|t' t( | }9tt|D ]\}\})}*|)d u sK|*d u sKt|)dksKt|)t|*krMq*tt|)D ]}:|)|: };|*|: }<|;d rh|<d sjqS|)|:d  }=|*|:d  }>|)|:d t|)  }?|*|:d t|*  }@|=d r|>d rqS|=d r|>d rqSt)|;d  };t)|<d  }<t)|=d  }=t)|>d  }>t)|?d  }?t)|@d  }@|;|= }A|?|; }B|<|> }C|@|< }D|Aj*|Bj+ |Aj+|Bj*  }E|Cj*|Dj+ |Cj+|Dj*  }Fz|Et,|At,|B  }E|Ft,|Ct,|D  }FW n t%y   Y qSw t,|E|8kst,|F|8kr qS|Aj*|Bj* |Aj+|Bj+  }G|Cj*|Dj* |Cj+|Dj+  }H|Gdk sB|Hdk rDqSt,|At,|At,|B  }It,|Ct,|Ct,|D  }Jt,|I|J }Kt,|K|8k rkqS|;|< d" }L|=|> d" }M|?|@ d" }N|L|M }O|N|L }P|Oj*|Pj+ |Oj+|Pj*  }Qz|Qt,|Ot,|P  }QW n t%y   Y qSw t,|Q||  |8krqS|Qt,|O t,|P }Rt,|O|P }St,|R|S }T|T|9k rӐqS|T|S }U|U|8krސqS|8t,|Q|  } t$d#|T|U|Q|K t$d|   tj-||| || |||:| d$fV  qSq*|r tj.|| || ||d%fV  qqKd S )&N
   g{Gz?r   r   c                 S   s   g | ]}t |qS r+   )repr)r5   gr+   r+   r,   r8      r9   ztest_gen.<locals>.<listcomp>c                 S   s   h | ]}|  D ]}|qqS r+   keys)r5   r)   r\   r+   r+   r,   	<setcomp>       ztest_gen.<locals>.<setcomp>rY   c                    sd   | d u rd S |  } | d u rd S |  d ur0 |  | d u r0|  } |  d ur0 |  | d u s| S r"   r+   )ir(   )	glyphsetsparentsr+   r,   grand_parent   s   ztest_gen.<locals>.grand_parentzTesting glyph %sc                    s   g | ]}t  |qS r+   )r   )r5   r)   )
glyph_namer+   r,   r8          c                 S   s   g | ]}|d urdqS )Nr   r+   )r5   rJ   r+   r+   r,   r8          )typemaster
master_idxFT)ri   rj   rk   rL   )ri   master_1master_2master_1_idxmaster_2_idxvalue_1value_2)ri   pathrl   rm   rn   ro   rp   rq   )	ri   rr   noderl   rm   rn   ro   rp   rq   )ri   rl   rm   rn   ro   rp   rq   rU   c                       g | ]} | qS r+   r+   r5   rb   )m1Isomorphismsr+   r,   r8   9  r9   c                    rt   r+   r+   ru   )	m1Vectorsr+   r,   r8   :  r9   c                    rt   r+   r+   ru   )
recording1r+   r,   r8   ;  r9   )
ri   rL   rl   rm   rn   ro   rp   rq   reversedrU   r3   z;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>ztolerance %g)ri   rL   rl   rm   rn   ro   rU   c                    rt   r+   r+   ru   )m1r+   r,   r8     r9   g?   z=kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g)ri   rL   rl   rm   rn   ro   rC   rU   )ri   rl   rm   rn   ro   )/find_parents_and_orderloginfor.   rD   zipr?   InterpolatableProblemMISSINGr!   	OPEN_PATHr   
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYr   CONTOUR_ORDERlistranger   r   r   r   r   rC   r0   
ValueErrorr   WRONG_START_POINTr
   rE   rF   UNDERWEIGHT
OVERWEIGHTmaxr   debugZeroDivisionErrorr    DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabsKINKNOTHING)Vrc   glyphsnamesignore_missingrT   rU   rV   rW   rX   rY   orderre   	allGlyphsrk   rJ   r)   r#   has_openr1   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reverserL   midStats	midVectorm0Vecm1Vecsize0size1midSize
overweightproblem_typeexpectedSizetdeviation_thresholdrb   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_ratior+   )rf   rc   rz   rv   rw   rd   rx   r,   test_gen   s  



	










(









t  r   c                  O   s2   t t}t| i |D ]\}}|| | q|S r"   )r   r   r   r0   )argskwargsproblemsr(   problemr+   r+   r,   testI  s   r   c                 C   sB   | |v rd S ||  || < t ||  dg D ]
}t|j||| qd S )N
components)r/   recursivelyAddGlyph	glyphName)r(   r)   
ttGlyphSetglyf	componentr+   r+   r,   r   Q  s   r   c                 C   s"   t j| }|rt j|dd | S )NT)exist_ok)osrr   dirnamemakedirs)rr   r   r+   r+   r,   ensure_parent_dirZ  s   r   c           W         s  ddl }ddl}|jdtjd}|jdddd |jd	d
dd |jddtdt d |jddtdt d |jdd
dd |jdddd |jdddd |jdddd |jdd
dd |jdddd |jdd
dd |jdd t	d!d"d# |jd$d%t	d&d'd( |jd)d*d
d+d |jd,d
d-d |
| } dd.lm} || jrd/nd0d1 | jr|d2d1 | jr| j nd}dd3lm} g }g }g }	t t}
t| j}t| jd4krd}| jd d5r)dd6lm} || jd }d7d8 |jD | _d9d8 |jD }	d:d; |jD fd<d=|jD d>d= |jD fd?d= D n[| jd d@rddAlm }m!} || jd }|j"}
||}dBd8 |jD }dCd8 |D }g | _dDd8 |jD }	dEd= |jD dFd= |jD fdGd= D n| jd dHs| jd dIrddJl#m$} || jd }|dK j%}
|dL }i |jD ]}|j&|j'|j(dM|j)< qdN}dO|v r|dO }t*|j+dPdrdQd= D dR}n$|j, D ]\}}| - }| D ]\}}t.||| |< qqi }t/t0}dS|v rj|dS }|dT }|du rt1|j23 }|D ]J} |j2|  D ]A}!i }"g }#t1|!j D ]\}$}%|%d4 |"|$< |#4|$|%d4 f q2t|#}&|&|vrZ|j5|"dRdNdU||&< t6| ||& ||& | q%qndV|v r0|dL j}'|dV j7j8d }(|(j9})|du rt1|)3 }|D ]} |)|  }*|*j:}+t*|+dWdh},t*|+dWd}-d}.t;|*j<D ]}/|/dXkr|,=|- n|/dWkrt>|.t?sJ |.}-|/}.qt@|+dYsѐq|+jAjB}0|,D ]V}-|0jC|- }1|1jDD ]J}2|0jEjF|2 }3i }"g }#t;|3jGD ]\}4}|'|4 j)}$|jH}%|%|"|$< |#4|$|%f qt|#}&|&|vr|j5|"dRdNdU||&< ||& ||& |  | < qqאqdZg}|5 g}i g}	d[d= t13 D t1|3 d\d] d^D ]-}&d_d`Ifdadb|&D  d_ }5|ri|5dc7 }5|4|5 |4||&  |	4t0|& qPdR| _Jg | _|	sddd8 |D }	| jD ]E}6|6derddflKmL}7 |7|6}tM }8|N|8 |8j%}
|4| nddJl#m$} ||6}|dK j%}
|4| |4||6Odgd4d  qt|dhk rtPQdi dS g }|D ]}t@|djr|5 n||4fdkd=3 D  q| jRr2t| jR  fdld8tS||D } fdmd8tS||	D }	 fdnd8|D }|s@t1tdod8 |D }t|}9|D ]t3 }:|9|: };|;r_|;D ]}<d|<< qWqFfdpd8|	D }	| jTppt}=| jUdurz| jUnt}>z7tPVdqt| tPVdrtW|	 tX||||	|
| jJ|=|>| jYds
}?t/tZ}@| j[du r|j\nt]t^| j[dt}A| j_sl| j`rddl`}B|?D ]\} }C|@|  4|C qta|Bb|@|Adu nd}D|?D ]\} }E|@|  4|E | |Dkrtadv|  dw|Adu | }Dd}Fdx|Ev r|Edx fn|Edy |Edz f}G|G|Fkr2d{|Ev r|Ed{ fn|Ed| |Ed} f}Htad~dI|H |Adu |G}F|Ed tcjdkrFtad|Ed{  |Adu q|Ed tcjekrZtad|Ed{  |Adu q|Ed tcjfkrxtad|Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjgkrtad|Ed |Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjhkrtad|Ed |Ed |Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjikrtad|Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjjkrtad|Ed |Ed |Ed| |Ed |Ed} |Ed f |Adu q|Ed tcjkkrtad|Ed |Ed| |Ed} f |Adu q|Ed tcjlkr5tad|Ed |Ed| |Ed} f |Adu q|Ed tcjmkrStad|Ed |Ed |Ed| |Ed} f |Adu q|Ed tcjnkritad|Ed| |Ed} f |Adu qn|?D ]\} }C|@|  4|C qnto|@}@dD ]n}Et*| |E}I|Idu rqtPVd|Ep |I d4dlqmr}Jms}K |Edkr|Jn|K}L|Lt^|I||d3}M|Mjt||=|>d |@r|Mu|@ |Mv|@ |@s| j_s|Mw  |@r|Mx  |My  W d   n	1 sw   Y  q| jzrtPVd| jz d4dlqm{}N g }Oi }P|N|O||d6}Q|Qjt|dN|=|>d |@ D ]\}R}S|R|Pt|O< |Qjv|R|SidNdNd q|@s;| j_s;|Qw  W d   n	1 sFw   Y  ddl|}Tt]t^| jzdS}A|A}d |A}d |A}d t;|OD ]2\}U}Q|U|Pv r|A}d|P|U  d~d |A}d~d |A}|T|Q |A}d |A}d qk|A}d W d   n	1 sw   Y  W n ty }V z|V j|7  _tP|V  d}V~Vw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   ri   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)metavarri   nargsr   z--nameNAMEr0   zGName of the master to use in the report. If not provided, all are used.)r   ri   r   r   z-vz	--verbosezRun verbosely.z--debugzRun with debug output.)configLoggerINFOWARNING)levelDEBUG)basenamer   z.designspace)DesignSpaceDocumentc                 S      g | ]}|j qS r+   )rr   r5   rj   r+   r+   r,   r8         zmain.<locals>.<listcomp>c                 S   r  r+   locationr  r+   r+   r,   r8     r  c                 S   s   h | ]
}t |d s|jqS )minimum)hasattrr#   r5   ar+   r+   r,   r_     s
    
zmain.<locals>.<setcomp>c                    s*   i | ]}|j  vr|j |j|j|jfqS r+   r#   r  defaultmaximumr	  ra   r+   r,   
<dictcomp>  s
    
zmain.<locals>.<dictcomp>c                 S      i | ]}|j |jqS r+   r#   mapr	  r+   r+   r,   r    rg   c                    *   i | ]\ } t  fd d|D qS )c                 3   "    | ]}t |t  V  qd S r"   r   dictr5   vaxis_mappingskr+   r,   	<genexpr>       "main.<locals>.<dictcomp>.<genexpr>tupler5   vvr  r  r,   r        )z.glyphsz.glyphspackage)GSFontto_designspacec                 S   r  r+   )font)r5   sourcer+   r+   r,   r8     r  c                 S   s    g | ]}d |j j|j jf qS )z%s-%s)r~   
familyName	styleName)r5   fr+   r+   r,   r8     s     c                 S   r  r+   r  r  r+   r+   r,   r8     r  c                 S   s    i | ]}|j |j|j|jfqS r+   r  r	  r+   r+   r,   r    s    c                 S   r  r+   r  r	  r+   r+   r,   r    rg   c                    r  )c                 3   r  r"   r  r  r  r+   r,   r    r  r  r  r   r"  r#  r,   r    r$  z.ttfz.otf)TTFontheadfvarr<   r   r   FavarVarStorec                 S   s   i | ]	}|d dddqS )r<   r   r   r/  r+   )r5   tagr+   r+   r,   r    s    Tgvarr   )r  
normalizedrecalcBoundsCFF2vsindexblendvstorez''c                 S   s   i | ]}|d qS )r/  r+   r	  r+   r+   r,   r  d  r  c                 S   s   t | | fS r"   )r.   )r  r+   r+   r,   <lambda>e  s    zmain.<locals>.<lambda>)key' c                 3   s0    | ]\}}d |t t| | df V  qdS )z%s=%s   N)r   r   r5   r  r  )axisMappingr+   r,   r  h  s    
zmain.<locals>.<genexpr>z (normalized)c                 S   s   g | ]}i qS r+   r+   )r5   _r+   r+   r,   r8   ~  s    z.ufo)	UFOReader.r{   z9Font file does not seem to be variable. Nothing to check.getGlyphSetc                    s   i | ]}| | qS r+   r+   )r5   r  r3   r+   r,   r    rg   c                       g | ]
\}}| v r|qS r+   r+   )r5   r#   r)   accepted_namesr+   r,   r8     
    c                    rE  r+   r+   )r5   r#   r  rF  r+   r,   r8     rH  c                    s   g | ]}| v r|qS r+   r+   )r5   r#   rF  r+   r,   r8     rh   c                 S   s   g | ]}|  D ]}|qqS r+   r]   )r5   r)   gnr+   r+   r,   r8     r`   c                    s0   g | ]}i t | fd d| D qS )c                    s   i | ]\}}| v r||qS r+   r+   r?  ra   r+   r,   r    r`   z#main.<locals>.<listcomp>.<dictcomp>)r   items)r5   loc)axis_triplesrY   r+   r,   r8     s    zRunning on %d glyphsetszLocations: %s)	r   r   rT   rW   r   rU   rV   rX   rY   w)filezGlyph z was not compatible:rk   rn   ro   rj   rl   rm   z  Masters: %s:z, ri   z"    Glyph was missing in master %sz'    Glyph has an open path in master %sz*    Path count differs: %i in %s, %i in %srp   rq   z5    Node count differs in path %i: %i in %s, %i in %srr   z7    Node %o incompatible in path %i: %s in %s, %s in %srs   z-    Contour order differs: %s in %s, %s in %szD    Contour %d start point differs: %s in %s, %s in %s; reversed: %srL   ry   z3    Contour %d interpolation is underweight: %s, %sz2    Contour %d interpolation is overweight: %s, %sz'    Contour %d has a kink at %s: %s, %srC   z    Showing %s and %s)pspdfzWriting %s to %s)InterpolatablePSInterpolatablePDFrO  )rc   r   )rU   rV   zWriting HTML to %s)InterpolatableSVG)show_tolerancerU   rV   )rT  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_UPEMr  r   r.   endswithfontTools.designspaceLibr  fromfilesourcesaxesrJ  	glyphsLibr%  r&  upmfontTools.ttLibr,  
unitsPerEmminValuedefaultValuemaxValueaxisTagr/   tablesegmentscopyr   r   r  sorted
variationsr^   r0   rD  r   cfftopDictIndexCharStringsprivaterD   programadd
isinstanceintr  r9  
otVarStoreVarDataVarRegionIndexVarRegionListRegionVarRegionAxis	PeakCoordjoinr   fontTools.ufoLibrB  r   readInforsplitr}   warningr#   r   rU   rV   r~   r   r   rX   r   outputstdoutr   r   quietjsonprintdumpsr   r   r   r   r   r   r   r   r   r   r   r   sort_problemsupperinterpolatablePlotrQ  rR  add_title_pageadd_summaryadd_problemsdraw_cupcake	add_indexadd_table_of_contentshtmlrS  base64writeencode	b64encode	Exceptionr   error)Wr   rW  rX  parserr   r   r   fontsr   rT   rW   original_args_inputsdesignspacer  r%  r&  gsfontr,  r'  r.  axisr4  r0  rs  ru  fvarMappingr  rC   ttGlyphSetsrc   r3  r   r(   varlocDictrK  r2  vallocTuplefvarAxescff2charstringscsr|  	vsindicesr7  last_opr6   varStorevarDataregionIndexregion	axisIndexr#   filenamerB  r~   	glyphsSetglyphSetGlyphNamesdiffrI  rU   rV   problems_genr   r+  r  r   last_glyphnameplast_master_idxsmaster_idxsmaster_namesr7   rQ  rR  PlotterClassdocrS  svgsglyph_startssvgrJ   glyph_problemsr  rb   rM   r+   )rG  r@  r  rL  rY   r)   r,   rZ  a  s  







$
























 














	


	

	
	

 










rZ  __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   rf  r   r   r   r   r   rZ  rQ   rX  r   exitr  boolr+   r+   r+   r,   <module>   sh    
Z   M
	
    X