U
    DvfW                     @   s   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 ddlmZmZ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ZddlZddlZddlZedZG dd de Z!G dd dZ"G dd de"Z#G dd de#Z$G dd de#Z%G dd de"Z&dS )   )*    )TTFont)LerpGlyphSet)RecordingPenDecomposingRecordingPenRecordingPointPen)ControlBoundsPen)CairoPen)SegmentToPointPenPointToSegmentPenReverseContourPointPen)PerContourOrComponentPenSimpleRecordingPointPen)cycle)wraps)BytesIONzfontTools.varLib.interpolatablec                   @   s   e Zd Zdd Zdd ZdS )OverridingDictc                 C   s
   || _ d S Nparent_dict)selfr    r   G/tmp/pip-unpacked-wheel-qlge9rch/fontTools/varLib/interpolatablePlot.py__init__    s    zOverridingDict.__init__c                 C   s
   | j | S r   r   )r   keyr   r   r   __missing__#   s    zOverridingDict.__missing__N)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c                	   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZ d
Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(d Z)d!Z*d"Z+dYd$d%Z,d&d' Z-d(d) Z.d*d+ Z/d,d#d#d-d.d/Z0d,d#d#d-d0d1Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5d,d,d:d;d<Z6d,d,d:d=d>Z7d?d?d@d?dAd#d#d#dBdCdDZ8d?d?d#dEdFdGZ9d?d?d@dHdIdJdKZ:d?d?d@dHddLdMdNZ;d?d?d@dOdPdQZ<d?d?d@d#d#dRdSdTZ=dUdV Z>dZdWdXZ?d#S )[InterpolatablePlotg      @i  g@      r   )333333?r#   r#   )皙?r$   r$   )?r%   r%         ?)皙?r'   r'   )皙?r(   r(   )r   r'   r   ffffff?   )r   r&   r   r)      )r   r%   r   r)      )r   r   r   r)   )r   r   r   r)   	   )r   r   r   r)      ))r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   皙?z#Your font's good! Have a cupcake...)r   r&   r   )r#   r   r#   a  
                          ,@.
                        ,@.@@,.
                  ,@@,.@@@.  @.@@@,.
                ,@@. @@@.     @@. @@,.
        ,@@@.@,.@.              @.  @@@@,.@.@@,.
   ,@@.@.     @@.@@.            @,.    .@' @'  @@,
 ,@@. @.          .@@.@@@.  @@'                  @,
,@.  @@.                                          @,
@.     @,@@,.     ,                             .@@,
@,.       .@,@@,.         .@@,.  ,       .@@,  @, @,
@.                             .@. @ @@,.    ,      @
 @,.@@.     @,.      @@,.      @.           @,.    @'
  @@||@,.  @'@,.       @@,.  @@ @,.        @'@@,  @'
     \\@@@@'  @,.      @'@@@@'   @@,.   @@@' //@@@'
      |||||||| @@,.  @@' |||||||  |@@@|@||  ||
       \\\\\\\  ||@@@||  |||||||  |||||||  //
        |||||||  ||||||  ||||||   ||||||  ||
         \\\\\\  ||||||  ||||||  ||||||  //
          ||||||  |||||  |||||   |||||  ||
           \\\\\  |||||  |||||  |||||  //
            |||||  ||||  |||||  ||||  ||
             \\\\  ||||  ||||  ||||  //
              ||||||||||||||||||||||||
)r   r#   r#   z\_(")_/z
 o
/|\
/ \
z
 o
/O\
/ \
z \o/ Nc                 K   s   || _ || _|pdd |D | _i | _| D ]*\}}t| |sLtd| t| || q.| jd | j	d  | _
| jd | j	d  | jd  | j | _d S )Nc                 S   s   g | ]}t |qS r   )repr).0gr   r   r   
<listcomp>u   s     z/InterpolatablePlot.__init__.<locals>.<listcomp>zUnknown keyword argument: %s      r*   )out	glyphsetsnamestocitemshasattr	TypeErrorsetattrwidthpadpanel_widthheight	font_sizetitle_font_sizepanel_height)r   r6   r7   r8   kwargskvr   r   r   r   r   s    
"zInterpolatablePlot.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__   s    zInterpolatablePlot.__enter__c                 C   s   d S r   r   r   typevalue	tracebackr   r   r   __exit__   s    zInterpolatablePlot.__exit__c                 C   s   |  j d7  _ d S )Nr   )page_numberrH   r   r   r   	show_page   s    zInterpolatablePlot.show_pageTshow_tolerance	tolerance	kinkinessc             	   C   s   | j }| jd| j   }| jd| j   }| }}	| jd||	d|| jd |	| j7 }	dd l}
|D ]}tj|}|	| j	| j  7 }	| j|||	d|d |	| j	| j  7 }	z@|

t|d  }| jd	| || |	|d
 |	| j	7 }	W n tk
r   Y nX |drt|}d|kr|d nd }|rdD ]P\}}||}|d krLq,| jd||f || |	|d
 |	| j	| j  7 }	q,q\|dr\ddlm} ||}dD ]>\}}| jd|t||f || |	|d
 |	| j	| j  7 }	qq\| j|||d |   d S )Nr5   r4   zProblem report for:Txyboldr>   rB   r   )rV   rW   rX   r>   rbzsha1: %srV   rW   r>   z.ttfname))Family name)   r"   r   )Version)   z%s: %s)z.glyphsz.glyphspackage)GSFont))r\   Z
familyName)ZVersionMajorZversionMajor)ZVersionMinorZ_versionMinorrQ   )r?   r>   rA   
draw_labelrC   hashlibospathbasenamerB   sha1openread	hexdigestIsADirectoryErrorendswithr   ZgetFirstDebugNameZ	glyphsLibr`   getattrdraw_legendrP   )r   filesrR   rS   rT   r?   r>   rA   rV   rW   rb   fileZ	base_filehZttFontr[   whatZnameIDsnr`   ffieldr   r   r   add_title_page   sr    




   
  z!InterpolatablePlot.add_title_pagec          
      C   s  t | j}| j}| j| j | jd  }| jd| j  }|| jd  }|| jd  }	|rz| jd|	||d || j| j 8 }| jd|	||d ||| jd  |d| j | j |j	| j
  |  | jr|j	| j  || j |  |j| j  |  || j| j 8 }| jd|	||d ||| jd  |d| j | j | j
r\|j	| j
  |  | jr|j	| j  || j |  |j| jd	 | jf  |  || j| j 8 }| jd
|	||d | j|||| jd  | j| j| jd || j| j 8 }| jd|	||d | j|||| jd  | j| jd || j| j 8 }| jd|	||d | j|||| jd  | j| jd || j| j 8 }| jd|	||d | j||| jd  || jd  | j d || j| j 8 }| jd|	||d | j|||| jd  | j| j!d || j| j 8 }| jd|	||d | j||| jd  || jd  | j!d || j| j 8 }| jd|||dd || j| j 8 }|d k	r| jd| |	||d || j| j 8 }|d k	r| jd| |	||d || j| j 8 }| jd|||dd || j| j 8 }d S )Nr4   r+   z,Tolerance: badness; closer to zero the worserZ   zUnderweight contoursr)   g      ?z/Colored contours: contours with the wrong orderr   zKink artifactr&   )rV   rW   diameterstroke_widthcolorz!Point causing kink in the contour)rV   rW   rv   rx   z!Suggested new contour start pointz4Contour start point in contours with wrong directionr#   rV   rW   rx   z5Contour start point when the first two points overlapz!Contour start point and directionzLegend:TrV   rW   r>   rX   z!Kink-reporting aggressiveness: %gzError tolerance: %gzParameters:)"cairoContextsurfacer?   rA   rB   r>   ra   	rectangleset_source_rgb
fill_colorfill_preservestroke_colorset_line_widthrw   stroke_preserveset_source_rgbaweight_issue_contour_colorfillcontour_colorscontour_alphadraw_circlekink_circle_sizekink_circle_stroke_widthkink_circle_colordraw_dotkink_point_sizekink_point_colorcorrected_start_point_sizecorrected_start_point_color
draw_arrowstart_arrow_lengthwrong_start_point_colorstart_point_color)
r   rR   rS   rT   crrV   rW   r>   ZxxZxxxr   r   r   rm      s       "   "

zInterpolatablePlot.draw_legendc              	   C   sR  | j }| jd| j   }| jd| j   }| }}| jd||d|| jd || j7 }tt}t| D ]$\}}|D ]}	||	d  	| qpqdd|kr|d= t|dd	 d
D ]}
|| j
7 }| jd|
t||
 f |||dd || j
7 }t||
 D ]R}|| j
 |kr|   | j
| }| j||d|  ||d|  d || j
7 }qq|   d S )Nr5   r4   zSummary of problemsTrU   rK   Znothingc                 S   s
   t j|  S r   )InterpolatableProblemZseverityrV   r   r   r   <lambda>r      z0InterpolatablePlot.add_summary.<locals>.<lambda>r   z%s: %drz   rZ   )r?   r>   rA   ra   rC   defaultdictsetsortedr:   addrB   lenrP   )r   problemsr?   r>   rA   rV   rW   Zglyphs_per_problem	glyphnameproblemproblem_typer   r   r   add_summaryY  sN    
 



"zInterpolatablePlot.add_summaryc                 C   s   | j }| jd| j   }| jd| j   }| }}| j|||d|| jd || j| j  7 }d }|D ]\}	\}
}|
|krtq^|
}|| j |kr|   | j| }| j|
|d|  ||d|  d | jt|	||d| dd || j7 }q^|   d S )	Nr4   TrU   r_   rZ   r+   r   )rV   rW   r>   align)r?   r>   rA   ra   rC   rB   rP   str)r   titler:   r?   r>   rA   rV   rW   Zlast_glyphnameZpage_nor   r   r   r   r   _add_listing  s2         
"zInterpolatablePlot._add_listingc                 C   s   |  dt| j  d S )NzTable of contentsr   r   r9   r:   rH   r   r   r   add_table_of_contents  s    z(InterpolatablePlot.add_table_of_contentsc                 C   s"   |  dt| j dd d d S )NZIndexc                 S   s   | d d S )Nr   r   r   r   r   r   r   r     r   z.InterpolatablePlot.add_index.<locals>.<lambda>r   r   rH   r   r   r   	add_index  s    zInterpolatablePlot.add_indexrR   show_page_numberc          
      C   s   |  D ]\}}d }g }|D ]h}d|kr0|d n|d |d f}	|	|krT|| q|rv| j||||d |   g }|	}|| q|r| j||||d |   qd S )N
master_idxmaster_1_idxmaster_2_idxr   )r:   appendadd_problemrP   )
r   r   rR   r   glyphZglyph_problemsZlast_mastersZcurrent_glyph_problemspZmastersr   r   r   add_problems  s<    

zInterpolatablePlot.add_problemsc          7         s	  t ttfkrg f| j| j< d d tdd D }tfdd|D srdtdd D t	
d	  d
d krdnd}fdd|D }tjkrt fddt| jD }|d| | j}	| j}
| jd  |	|
| jdd| jd tdd D }|dk rL|rL| jd| |	|
| jd| j  ddd |
| j| j 7 }
| jd |	|
| jd| j  | jdd |
| j| jd  7 }
g }t|D ]\}}| j| }| j| }| j||	|
| j| jdd |
| j| j 7 }
|  d k	r|| j| ||	|
d n| j| j|	|
d |
| j| j | j 7 }
qt dd |D r(| j| j | j }	| j}
|
| j| jd  7 }
|
| j| j 7 }
| j|d  }| j|d  }| jd|	|
| j| jdd |
| j| j 7 }
t!||}| j| ddigd d D  d |	|
t|d! |
| j| j | j 7 }
t d"d |D r| jd#|	|
| j| jdd |
| j| j 7 }
t"|}t"|}t#t$|d$}t#t$|d$|  %| |  % D ]6}|d tj&krfd%dd d& D }|_'qD ]V}|d tj(kr|j'|d'  }j'|d'  }t) }t*|d(}|+| t) }t*|d(}|+| |d& }|d) rt) }t,|} |+|  |}t-|j'd | }|j'd d }!|j'd*d  }"|j'dd* }#|#|d  |#d |  }#|!|# |" |_'t$ }$t.|$d}|+| t$ }%t.|%d}|+| |$j'|_'|%j'|_'||j'|d' < |j'|d' < qD ]n}|d tj/krH|j'|d'  }j'|d'  }t) }t*|d(}|+| t) }t*|d(}|+| |d+ }&|&d }'|j'|' d d }(|j'|' d d })|&d t-|j'd  d }*|j'|* d d }+|j'|* d d },|&d t-|j'd  d }-|j'|- d d }.|j'|- d d }/t0|( }(t0|) })t0|+ }+t0|, },t0|. }.t0|/ }/t1|(|+ t1|.|+  }0t1|)|, t1|/|,  }1|0|1 d }2|+|2|.|+   }(|,|2|/|,   })|j'|' d |(j2|(j3ff|j'|' d dd   |j'|' d f|j'|'< |j'|' d |)j2|)j3ff|j'|' d dd   |j'|' d f|j'|'< t$ }$t.|$d}|+| t$ }%t.|%d}|+| |$j'|_'|%j'|_'qHt$ }3t$ }4|j'D ]}5|3j'4|5j' q̈j'D ]}5|4j'4|5j' q|3j+|3_%|4j+|4_%|3| < |4| < z.t!||}| j| dd,id |	|
t|d! W n( t5k
rt   | j| j|	|
d Y nX |
| j| j 7 }
nP| j}6tj6|kr| j7}6n&tj8|kr| j9}6ntj:|kr| j;}6| j|6|	|
d |	r| jt<| jd| j=| j | j | j| jdd- d S ).Nr   rK   c                 s   s   | ]}|d  V  qdS rK   Nr   r1   r   r   r   r   	<genexpr>  s     z1InterpolatablePlot.add_problem.<locals>.<genexpr>c                 3   s   | ]}| kV  qd S r   r   r1   ptr   r   r   r     s     z, c                 S   s   h | ]}|d  qS rK   r   r   r   r   r   	<setcomp>  s     z1InterpolatablePlot.add_problem.<locals>.<setcomp>zDrawing %s: %sr   )r   )r   r   c                    s   g | ]} d  | qS )r   r   )r1   rF   )r   r   r   r3     s     z2InterpolatablePlot.add_problem.<locals>.<listcomp>c                 3   s"   | ]\}}|  d k	r|V  qd S r   r   )r1   im)r   r   r   r     s     zGlyph name: T)rV   rW   rx   r   rX   rB   c                 s   s   | ]}| d dV  qdS )rS   r   N)getr1   r   r   r   r   r     s     r   ztolerance: %.2fr4   )rV   rW   r>   r   rX   z
Problems: )rV   rW   r>   rx   rX   r&   )rV   rW   rx   r>   r   )rV   rW   c                 s   s.   | ]&}|t jt jt jt jt jt jfkV  qd S r   )r   NOTHINGWRONG_START_POINTCONTOUR_ORDERKINKUNDERWEIGHT
OVERWEIGHTr   r   r   r   r     s   
zmidway interpolationmidwayc                 S   s(   g | ] }|d  t jt jt jfkr|qS r   )r   r   r   r   r   r   r   r   r3   A  s   rV   rW   scalec                 s   s"   | ]}|t jt jt jfkV  qd S r   )r   r   r   r   r   r   r   r   r   S  s   zproposed fixglyphsetc                    s   g | ]} j | qS r   )rL   )r1   r   )perContourPen2r   r   r3   u  s    value_2contourFreversedrL   Zfixed)rV   rW   r>   rx   r   )>rK   listtupler9   rO   r   alljoinr   loginfor   MISSINGnext	enumerater7   insertr?   ra   
head_colorrC   minr>   rB   r8   label_colorr@   r   
draw_glyphdraw_emoticonshrugrD   anyr   r   r   r   drawr   rL   r   r   r   replayr   r   r   r   complexabsrealimagextend
ValueErrorr   underweightr   
overweightr   yayr   rA   )7r   r   r   rR   r   problem_typesZmaster_keysZmaster_indicesZsample_glyphrV   rW   rS   Zscaleswhichr   r   r[   Z	glyphset1Z	glyphset2Zmidway_glyphsetZoverriding1Zoverriding2ZperContourPen1r   Zfixed_contoursZwrongContour1ZwrongContour2Zpoints1	converterZpoints2Zproposed_startZnew_points2ZreversedPenZ	beginPathZendPathZptsZsegment1Zsegment2r   jZpt0Zpt1Zj_prevZpt0_prevZpt1_prevZj_nextZpt0_nextZpt1_nextZr0Zr1Zr_midZfixed1Zfixed2r   emoticonr   )r   r   r   r   r   r     s   

	





  


















"
"








	zInterpolatablePlot.add_problemr   )r   r   r   F)rV   rW   rx   r   rX   r>   rA   rB   c                C   s  |d kr| j }|d kr| j}|	d kr*| j}	t| j}
|
dtj|rJtjntj	 |

|	 |
 }|	|	 |d  }	|

|	 |
 }|
j|  |
|}|j |kr|	||j  9 }	|

|	 |
 }|
|}|||j  |  }||d  }|
|| |
| d S )Nz@cairo:r4   r   )r>   rA   rB   r{   r|   r}   select_font_faceFONT_SLANT_NORMALZFONT_WEIGHT_BOLDFONT_WEIGHT_NORMALset_font_sizefont_extentsr   text_extentsmove_to	show_text)r   labelrV   rW   rx   r   rX   r>   rA   rB   r   r   extentsZlabel_xZlabel_yr   r   r   ra     s8    






zInterpolatablePlot.draw_labelr   c          "   	      s  t |ttfkr|g}tdd |D }|d d  tdd |D t fddD s`d || }	t }
|	|
 t|}|	| t	|}|
| |j}|d krd}|d	 |d  }|d
 |d  }|r|d kr| j| }nt|| j| }|r"|d kr| j| }nt|| j| }|d kr0d}t| j}||| || j||  d	 | j||  d	  |||  ||d  |d
   | jr|j| j  ||d |d || || j|  |  | js| jrZt||}|
| | jr& tjkr&|j| j  |  | jrR|j| j  || j |  |!  |"  tj#ksrtj$krt%t|d}|

| |D ]N}|d tj#tj$fkr|j&|d  }|
t|| |j'| j(  |)  qtfddtj*tj+tj,hD r|-tj. |j&D ]8\}}|s$q|d \}}|/|| |0|| q|j'| j1  || j2|  |  |j&D ]D\}}|sqv|d d D ]"\}}|/|| |0|| qqv|j'| j3  || j4|  |  |j&D ]\}}|sn|dkr|j/|d   n|dkrN|D ]\}}|0|| q|5  |j/|d   nX|dkr|j0|d   |5  |j/|d   |j0|d	   |5  |j/|d   nqq|j'| j6  || j7|  |  d }|D ]}|d tj8kr|d }t9| j:}t%t|d}|

| t;|j&D ]N\}}|| |kr6qt<|}|
t|| |j'|| j=f  |)  qq|D ] }|d tj*tj>fkr|?d}|d k	rT|dkrTd|krTt%t|d}|
| t@ }tA|d}|j&|d kr|n||  
| |j&|d  d }|B  |j|  |d| d|  | jC|| jD| jEd |F  |dksj|?dsr| jG}n| jH}d }d}|B  |j&D ]$\}}|dkr|d }q|d krq|dkr|} n|d } |d ks||kr|B  tI| }tI|  } tJ| | }!||jK|jL |!rh|MtNO| jL|jL | jK|jK  |d| d|  | jP||d n&|d| d|  | jC|| jD|d |F  |d k	r qd }|d7 }q|F  |d tjQkrt|?d}t%t|d}|
| t@ }tA|d}|j&|d kr|n||  
| |j&|d  d }|B  |j|  |d| d|  |rx| jR|| jS| jT| jUd n| jC|| jV| jWd |F  qt|S )Nc                 s   s   | ]}|d  dkV  qdS )rK   r   Nr   r   r   r   r   r   M  s     z0InterpolatablePlot.draw_glyph.<locals>.<genexpr>r   rK   c                 s   s   | ]}|d  V  qdS r   r   r   r   r   r   r   O  s     c                 3   s   | ]}| kV  qd S r   r   r   r   r   r   r   P  s     mixed)r   r   r   r   r4   r5   r   r   r   c                 3   s   | ]}| kV  qd S r   r   )r1   t)r   r   r   r     s   r   )moveToZlineToZqCurveToZcurveTor   F)rv   rx   r   r  Z	closePath)rx   rL   )rv   rw   rx   )XrK   r   r   r   r   r   r   r   r   r	   r   boundsr@   r   rD   r{   r|   r}   	translater   border_colorr   r~   r   border_widthstroker   r   r
   r   Z	OPEN_PATHr   rw   r   new_pathr   r   r   rL   r   r   r   r   Z
NODE_COUNTZNODE_INCOMPATIBILITYset_line_capLINE_CAP_ROUNDr   line_tooncurve_node_coloroncurve_node_diameteroffcurve_node_coloroffcurve_node_diameterZnew_sub_pathhandle_colorhandle_widthr   r   r   r   r   r   r   r   r   r   saver   r   r   restorer   r   r   r   r   r   rotatemathatan2r   r   r   r   r   r   r   r   )"r   r   r   r   r   rV   rW   r   r   r   Z	recordingZdecomposedRecordingZ	boundsPenr  Zglyph_widthZglyph_heightr   ZpenZperContourPenr   r   segmentargsZmatchingcolorsr   rx   idxZpointsr   ZtargetPointZfirst_ptZ	second_ptlengthr   )r   r   r   r   I  s   












 


 









 


zInterpolatablePlot.draw_glyph
   )rV   rW   rx   rv   c                C   sh   |   || |tj ||| ||| t|dkrJ|d }|j|  |	  |
  d S )Nr5   r   )r  r   r  r{   r	  r   r
  r   r   r  r  )r   r   rV   rW   rx   rv   r   r   r   r   [  s    

zInterpolatablePlot.draw_dot)rV   rW   rx   rv   rw   c                C   sl   |   || |tj ||||d ddtj  t|dkrN|d }|j	|  |
  |  d S )Nr4   r   r5   r  )r  r   r  r{   ZLINE_CAP_SQUAREZarcr  pir   r   r  r  )r   r   rV   rW   rx   rv   rw   r   r   r   r   g  s    

zInterpolatablePlot.draw_circlery   c                C   s   |   t|dkr|d }|j|  || j| | |dd || j | j d  || j | jd  |  |  |	  d S )Nr5   r  r   r/   )
r  r   r   r  r   r   r
  Z
close_pathr   r  )r   r   rV   rW   rx   r   r   r   r   t  s"    

zInterpolatablePlot.draw_arrowrV   rW   rx   r>   rA   c                C   s4  |d kr| j }|d kr| j}| }t| j}|j|  || j |	dtj
tj d}d}	| }
|
d }|
d }|D ]"}||}t||j}|	|7 }	q||sd S ||| t|| ||	 }||||  d ||	|  d  ||| |d| |D ](}|dd || |d| qd S )Nz@cairo:monospacer   r4   )r>   rA   
splitlinesr{   r|   r}   r   r   rB   r   r   r   r   r   maxZ	x_advancer  r   r   r   r   )r   textrV   rW   rx   r>   rA   r   
text_widthZtext_heightr   Zfont_font_sizeZfont_ascentliner   r   r   r   r   	draw_text  sH    
  

 
zInterpolatablePlot.draw_textc              
   C   sv   | j | j| j| j| j| jd| j  dd| jd | j| j| j| j| j | jd| j  | j	d| j  | j | j
d d S )Nr4   r&   T)rV   rW   rx   r>   r   rX   rB   )rV   rW   r>   rA   rx   )ra   no_issues_labelr?   no_issues_label_colorr>   rC   r$  cupcakerB   rA   cupcake_colorrH   r   r   r   draw_cupcake  s$    
zInterpolatablePlot.draw_cupcakec                 C   s    | j |||| j| j| jd d S )Nr  )r$  emoticon_colorr@   rD   )r   r   rV   rW   r   r   r   r     s    z InterpolatablePlot.draw_emoticon)N)r   r   )@r   r   r   r>   rA   r?   rC   rB   rO   r   r   r  r  r   r   rw   r  r  r  r  r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r%  r&  r(  r'  r*  r   r   r   r   r   rI   rN   rP   ru   rm   r   r   r   r   r   r   ra   r   r   r   r   r$  r)  r   r   r   r   r   r    '   s   
  F 	.#   X/      &r    c                       s$   e Zd Zdd Z fddZ  ZS )InterpolatablePostscriptLikec                 C   s   | j   d S r   )r}   finishrJ   r   r   r   rN     s    z%InterpolatablePostscriptLike.__exit__c                    s   t    | j  d S r   )superrP   r}   rH   	__class__r   r   rP     s    
z&InterpolatablePostscriptLike.show_page)r   r   r   rN   rP   __classcell__r   r   r.  r   r+    s   r+  c                   @   s   e Zd Zdd ZdS )InterpolatablePSc                 C   s   t | j| j| j| _| S r   )r{   Z	PSSurfacer6   r>   rA   r}   rH   r   r   r   rI     s    zInterpolatablePS.__enter__Nr   r   r   rI   r   r   r   r   r1    s   r1  c                   @   s   e Zd Zdd ZdS )InterpolatablePDFc                 C   s:   t | j| j| j| _| jt jd | jt jd | S )Nzfonttools varLib.interpolatable )	r{   Z
PDFSurfacer6   r>   rA   r}   Zset_metadataZPDF_METADATA_CREATORZPDF_METADATA_CREATE_DATErH   r   r   r   rI     s     zInterpolatablePDF.__enter__Nr2  r   r   r   r   r3    s   r3  c                       s,   e Zd Zdd Zdd Z fddZ  ZS )InterpolatableSVGc                 C   s"   t  | _t| j| j| j| _| S r   )r   sinkr{   
SVGSurfacer>   rA   r}   rH   r   r   r   rI     s    zInterpolatableSVG.__enter__c                 C   s   | j d k	r|   d S r   )r}   rP   rJ   r   r   r   rN     s    
zInterpolatableSVG.__exit__c                    sH   t    | j  | j| j  t | _t	
| j| j| j| _d S r   )r-  rP   r}   r,  r6   r   r6  getvaluer   r{   r7  r>   rA   rH   r.  r   r   rP     s
    

zInterpolatableSVG.show_page)r   r   r   rI   rN   rP   r0  r   r   r.  r   r5    s   r5  )'ZinterpolatableHelpersZfontTools.ttLibr   ZfontTools.ttLib.ttGlyphSetr   ZfontTools.pens.recordingPenr   r   r   ZfontTools.pens.boundsPenr	   ZfontTools.pens.cairoPenr
   ZfontTools.pens.pointPenr   r   r   Z&fontTools.varLib.interpolatableHelpersr   r   	itertoolsr   	functoolsr   ior   r{   r  rc   logging	getLoggerr   dictr   r    r+  r1  r3  r5  r   r   r   r   <module>   s<   
         /	
