a
    Qh                     @   sV  d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlZddlZeeZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdgd Zdeg edd< deg edd< deg edd< deg edd< eed< eedksJ edd Zeed< eed< edd Zeed < eed!< eed< g d"Zd#d$ e eD Z!d%Z"d&d' Z#g d(Z$d)d* Z%e%d+Z&e%d,Z'e%d-Z(ej)fd.d/Z*ed!ed0 Z+d1d2 Z,G d3d4 d4e-Z.G d5d6 d6e/Z0g d7Z1G d8d9 d9e0Z2G d:d; d;e2Z3G d<d= d=e3Z4G d>d? d?e/Z5G d@dA dAe5Z6G dBdC dCe/Z7dDdE Z8dS )FzwpsCharStrings.py -- module implementing various kinds of CharStrings:
CFF dictionary data and Type1/Type2 CharStrings.
    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)bytechrbyteord	bytesjoinstrjoin)	BoundsPenNc                 C   sb   |dkr"|t || f}|d }n|}z| j| }W n tyN   d |f Y S 0 | |}||fS )N      )r   	operatorsKeyErrorhandle_operator)selfb0dataindexopoperatorvalue r   U/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/misc/psCharStrings.pyread_operator   s    

r   c                 C   s   |d |fS )N   r   r   r   r   r   r   r   r   	read_byte"   s    r   c                 C   s(   t || }|d d | d |d fS )N      l   r   r   r   r   r   r   b1r   r   r   read_smallInt1&   s    r#   c                 C   s*   t || }|d  d | d |d fS )N   r   r   r   r    r!   r   r   r   read_smallInt2+   s    r%   c                 C   s&   t d|||d  \}||d fS )N>h   structunpackr   r   r   r   r   r   r   r   read_shortInt0   s    r,   c                 C   s&   t d|||d  \}||d fS )N>l   r(   r+   r   r   r   read_longInt5   s    r/   c                 C   s.   t d|||d  \}t|dd|d fS )Nr-   r.      precisionBits)r)   r*   r   r+   r   r   r   read_fixed1616:   s    r3   c                 C   s   t sJ t|fS N)NotImplementedErrorNotImplementedr   r   r   r   read_reserved?   s    r7   c                 C   sf   d}t || }|d }|d@ d? }|d@ }|dkr6qZ|t|  }|dkrLqZ|t|  }qt||fS )N r      r.      )r   realNibblesfloat)r   r   r   r   numberbZnibble0Znibble1r   r   r   read_realNumberD   s    r?   r          r   r.   r$               )0123456789.EE-N-c                 C   s   i | ]\}}||qS r   r   ).0ivr   r   r   
<dictcomp>w       rW      c                 C   s~   i }i }| D ]h}t |dkr.|d ||d < n|dd  ||d < t|d trb|d ||d < q|d f||d < q||fS )Nr'   r   r   )len
isinstancetuple)ZoperatorListoperZopcitemr   r   r   buildOperatorDict|   s    r_   )4r   Zhstem   Zvstemr.   Zvmoveto   Zrlineto   Zhlineto   Zvlineto   Z	rrcurveto
   Zcallsubr   return   endchar)r:   vsindex)r0   blend)   Zhstemhm)   hintmask)   cntrmask   Zrmoveto   Zhmoveto)   Zvstemhm)   Z
rcurveline)   Z
rlinecurve)   Z	vvcurveto)   Z	hhcurveto)rD   Z	callgsubrrE   Z	vhcurveto   Z	hvcurveto)r   r   ignore))r   rb   and))r   r.   or))r   re   not))r   rk   store))r   	   abs))r   rm   add))r   ro   sub)r   r   div))r      load))r   rr   neg))r   r:   eq))r   rv   drop))r   ry   put))r   r|   get))r   r~   Zifelse))r   r   random))r   r   mul))r   r   sqrt))r   r   dup))r   rC   exch))r   rD   r   ))r   rE   Zroll))r   "   Zhflex))r   #   flex))r   $   Zhflex1))r   %   Zflex1c                 C   sd   | dkrt d}t d}n.| dkr0d }t d}n| dks<J t d}d }|t tjtj|fdd}|S )	NcffrC   rD   t1rB   t2c                 S   s  d|   krdkr&n n|| d }nd|   kr:dkrdn n&| d } || d? d || d@  }nd	|   krxd
krn n(|  d } || d? d || d@  }nd|d urd|   krdkrn n||d|  }n4|d u rt d |d|d|  }n||d|  }|S )Nik   r   r   k  rk   r   rB   iir$   i i  r&   zk4-byte T2 number got passed to the IntType handler. This should happen only when reading in old XML files.
r-   )logwarning)r   
fourByteOpr   packr*   	twoByteOpcoder   r   r   	encodeInt   s"    
 	z getIntEncoder.<locals>.encodeInt)r   r)   r   r*   )formatr   r   r   r   r   r   getIntEncoder   s     


%r   r   r   r   c                 C   s6   t | dd}|d@ dkr$t|d? S d|d| S dS )zFor T2 onlyr0   r1   i  r      r-   N)r   encodeIntT2)fr   r   r   r   r   encodeFixed   s    r   r:   c                 C   s4  | dkrt S d|  }|d d dkr2|dd  }n|d d dkrTd|dd   }n|d	r|d
}d|t|t| f }n|d}|d}|dkr
|dkr
|d | }||d | }t||d d  }|t| }|dkrd||f }nd|||f }|dr>|dd\}	}d|	|d
t|f }g }
|r|d }|dd  }|dkr|d d }|dkr|dd  }d}n|dkr|dd  }|d
r|dd  }|
	t
|  qB|
	d t|
d r|
	d td}tdt|
dD ]&}|t|
| d> |
|d  B  }q|S )Ng        z%.8Gr'   z0.r   rb   z-0.rS   Z000rF   z%sE%drP   rQ   z%s%s0z%s%sE%d)z.0z-.0z%s%sE-%dr   rR   +r:   rE   r.   )realZeroBytesendswithrstriprZ   findint
startswithsplitlstripappendrealNibblesDictr   range)r   sZsignificantDigitsdotIndexZeIndexZintegerPartZfractionalPartexponentZnewExponentsignZnibblescc2drU   r   r   r   encodeFloat  sX    








$r   c                   @   s   e Zd ZdS )CharStringCompileErrorN)__name__
__module____qualname__r   r   r   r   r   ?  s   r   c                   @   sZ  e Zd ZdTddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! ZeZd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dS )USimpleT2DecompilerNc                 C   s8   || _ t|| _|| _t|| _|| _|| _|   d S r4   )
localSubrscalcSubrBias	localBiasglobalSubrs
globalBiasprivateblenderreset)r   r   r   r   r   r   r   r   __init__D  s    

zSimpleT2Decompiler.__init__c                 C   s(   g | _ g | _d| _d| _d| _d| _d S Nr   )callingStackoperandStack	hintCounthintMaskBytes
numRegionsvsIndexr   r   r   r   r   M  s    zSimpleT2Decompiler.resetc                 C   s   | j | | }|r$g }|j}ndd }| jj}d}||\}}}|d u rRq|| |rd| }	t| |	d }
|
d ur|
|}|r|\}}|| q|   q8|| q8|r|| | j d= d S )Nc                 S   s   d S r4   r   )xr   r   r   <lambda>\  rX   z,SimpleT2Decompiler.execute.<locals>.<lambda>r   Zop_r   )r   r   needsDecompilationr   getTokengetattrpopall
setProgram)r   
charStringr   programZpushToProgramZpushToStackr   token
isOperatorZhandlerNamehandlerrvr   r   r   r   executeU  s2    



zSimpleT2Decompiler.executec                 C   s   | j d }| j d= |S Nr   r   r   r   r   r   r   popt  s    
zSimpleT2Decompiler.popc                 C   s    | j d d  }g | j d d < |S r4   r   r   stackr   r   r   r   y  s    zSimpleT2Decompiler.popallc                 C   s   | j | d S r4   )r   r   r   r   r   r   push~  s    zSimpleT2Decompiler.pushc                 C   s
   | j rd S r4   r   r   r   r   r   r   	op_return  s    zSimpleT2Decompiler.op_returnc                 C   s   d S r4   r   r   r   r   r   
op_endchar  s    zSimpleT2Decompiler.op_endcharc                 C   s   d S r4   r   r   r   r   r   	op_ignore  s    zSimpleT2Decompiler.op_ignorec                 C   s&   |   }| j|| j  }| | d S r4   )r   r   r   r   r   r   	subrIndexZsubrr   r   r   op_callsubr  s    zSimpleT2Decompiler.op_callsubrc                 C   s&   |   }| j|| j  }| | d S r4   )r   r   r   r   r   r   r   r   op_callgsubr  s    zSimpleT2Decompiler.op_callgsubrc                 C   s   |    d S r4   
countHintsr   r   r   r   op_hstem  s    zSimpleT2Decompiler.op_hstemc                 C   s   |    d S r4   r   r   r   r   r   op_vstem  s    zSimpleT2Decompiler.op_vstemc                 C   s   |    d S r4   r   r   r   r   r   
op_hstemhm  s    zSimpleT2Decompiler.op_hstemhmc                 C   s   |    d S r4   r   r   r   r   r   
op_vstemhm  s    zSimpleT2Decompiler.op_vstemhmc                 C   s>   | j s|   | jd d | _ | jd || j \}}||fS )Nri   rk   r   )r   r   r   r   getBytes)r   r   r   r   r   r   op_hintmask  s
    zSimpleT2Decompiler.op_hintmaskc                 C   s    |   }| jt|d  | _d S Nr'   )r   r   rZ   r   argsr   r   r   r     s    zSimpleT2Decompiler.countHintsc                 C   s   t d S r4   r5   r   r   r   r   op_and  s    zSimpleT2Decompiler.op_andc                 C   s   t d S r4   r	  r   r   r   r   op_or  s    zSimpleT2Decompiler.op_orc                 C   s   t d S r4   r	  r   r   r   r   op_not  s    zSimpleT2Decompiler.op_notc                 C   s   t d S r4   r	  r   r   r   r   op_store  s    zSimpleT2Decompiler.op_storec                 C   s   t d S r4   r	  r   r   r   r   op_abs  s    zSimpleT2Decompiler.op_absc                 C   s   t d S r4   r	  r   r   r   r   op_add  s    zSimpleT2Decompiler.op_addc                 C   s   t d S r4   r	  r   r   r   r   op_sub  s    zSimpleT2Decompiler.op_subc                 C   s   t d S r4   r	  r   r   r   r   op_div  s    zSimpleT2Decompiler.op_divc                 C   s   t d S r4   r	  r   r   r   r   op_load  s    zSimpleT2Decompiler.op_loadc                 C   s   t d S r4   r	  r   r   r   r   op_neg  s    zSimpleT2Decompiler.op_negc                 C   s   t d S r4   r	  r   r   r   r   op_eq  s    zSimpleT2Decompiler.op_eqc                 C   s   t d S r4   r	  r   r   r   r   op_drop  s    zSimpleT2Decompiler.op_dropc                 C   s   t d S r4   r	  r   r   r   r   op_put  s    zSimpleT2Decompiler.op_putc                 C   s   t d S r4   r	  r   r   r   r   op_get  s    zSimpleT2Decompiler.op_getc                 C   s   t d S r4   r	  r   r   r   r   	op_ifelse  s    zSimpleT2Decompiler.op_ifelsec                 C   s   t d S r4   r	  r   r   r   r   	op_random  s    zSimpleT2Decompiler.op_randomc                 C   s   t d S r4   r	  r   r   r   r   op_mul  s    zSimpleT2Decompiler.op_mulc                 C   s   t d S r4   r	  r   r   r   r   op_sqrt  s    zSimpleT2Decompiler.op_sqrtc                 C   s   t d S r4   r	  r   r   r   r   op_dup  s    zSimpleT2Decompiler.op_dupc                 C   s   t d S r4   r	  r   r   r   r   op_exch  s    zSimpleT2Decompiler.op_exchc                 C   s   t d S r4   r	  r   r   r   r   op_index  s    zSimpleT2Decompiler.op_indexc                 C   s   t d S r4   r	  r   r   r   r   op_roll  s    zSimpleT2Decompiler.op_rollc           
      C   s   | j dkr| j | _ |  }|| j d  }| jd u rJ| j||  d = nvt| j| }||  }}||k r|| j  }| j|| }| | j|}	| j|  |	7  < |}|d7 }qdg | j|d < d S Nr   r   )r   r   getNumRegionsr   r   r   rZ   r   )
r   r   	numBlendsZnumOpsZargiZend_argsZtupleiZnext_tideltasdeltar   r   r   op_blend  s$    



zSimpleT2Decompiler.op_blendc                 C   s    |   }|| _| j|| _d S r4   )r   r   r   r!  r   )r   r   vir   r   r   
op_vsindex  s    zSimpleT2Decompiler.op_vsindex)NN)-r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  Zop_cntrmaskr   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   C  sT   
	r   )r`   ra   rc   rd   rf   rh   rj   )r   	closepathrl   rn   )r   Zhsbwrq   r{   r}   r   r   )r   Z
dotsection))r   r   Zvstem3))r   r'   Zhstem3))r   rg   Zseac))r   ri   Zsbwr   ))r   r0   Zcallothersubr))r      r   ))r   !   Zsetcurrentpointc                   @   sP   e Zd ZdddZdd ZdddZd	d
 Zdd Zdd Zdd Z	dd Z
dS )T2WidthExtractorNc                 C   s"   t | |||| || _|| _d S r4   )r   r   nominalWidthXdefaultWidthX)r   r   r   r,  r-  r   r   r   r   r   r   +  s    	zT2WidthExtractor.__init__c                 C   s   t |  d| _d| _d S r   )r   r   gotWidthwidthr   r   r   r   r   8  s    
zT2WidthExtractor.resetr   c                 C   s`   |   }| js\|t|d A rN| jd us0J d| j|d  | _|dd  }n| j| _d| _|S )Nr'   z5CFF2 CharStrings must not have an initial width valuer   r   )r   r.  rZ   r-  r,  r/  )r   evenOddr  r   r   r   popallWidth=  s    zT2WidthExtractor.popallWidthc                 C   s    |   }| jt|d  | _d S r  )r1  r   rZ   r  r   r   r   r   L  s    zT2WidthExtractor.countHintsc                 C   s   |    d S r4   r1  r   r   r   r   
op_rmovetoP  s    zT2WidthExtractor.op_rmovetoc                 C   s   |  d d S Nr   r2  r   r   r   r   
op_hmovetoS  s    zT2WidthExtractor.op_hmovetoc                 C   s   |  d d S r4  r2  r   r   r   r   
op_vmovetoV  s    zT2WidthExtractor.op_vmovetoc                 C   s   |    d S r4   r2  r   r   r   r   r   Y  s    zT2WidthExtractor.op_endchar)NN)r   )r   r   r   r   r   r1  r   r3  r5  r6  r   r   r   r   r   r+  *  s     

r+  c                       s  e Zd ZdjddZdd Z fddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3ddde Z4dfdg Z5dhdi Z6  Z7S )kT2OutlineExtractorNc              	   C   s&   t | |||||| || _d| _d S r   )r+  r   pen	subrLevel)r   r8  r   r   r,  r-  r   r   r   r   r   r   ^  s    
	zT2OutlineExtractor.__init__c                 C   s    t |  d| _d| _d| _d S )Nr   r   r   )r+  r   currentPoint	sawMoveTor9  r   r   r   r   r   t  s    
zT2OutlineExtractor.resetc                    s>   |  j d7  _ t | |  j d8  _ | j dkr:|   d S Nr   r   )r9  superr   endPath)r   r   	__class__r   r   r   z  s
    
zT2OutlineExtractor.executec                 C   s,   | j \}}||d  ||d  f}|| _ |S r   )r;  )r   pointr   yr   r   r   
_nextPoint  s    
zT2OutlineExtractor._nextPointc                 C   s   | j | | d| _d S r4  )r8  moveTorD  r<  r   rB  r   r   r   rMoveTo  s    zT2OutlineExtractor.rMoveToc                 C   s&   | j s| d | j| | d S Nr:  )r<  rG  r8  lineTorD  rF  r   r   r   rLineTo  s    
zT2OutlineExtractor.rLineToc                 C   s6   | j s| d | j}| j|||||| d S rH  )r<  rG  rD  r8  curveTo)r   pt1pt2pt3Z	nextPointr   r   r   rCurveTo  s    
zT2OutlineExtractor.rCurveToc                 C   s   | j r| j  d| _ d S r   )r<  r8  	closePathr   r   r   r   rP    s    
zT2OutlineExtractor.closePathc                 C   s   | j r|   d S r4   )r<  rP  r   r   r   r   r?    s    zT2OutlineExtractor.endPathc                 C   s   |    | |   d S r4   r?  rG  r1  r   r   r   r   r3    s    zT2OutlineExtractor.op_rmovetoc                 C   s$   |    | | dd df d S r=  rQ  r   r   r   r   r5    s    zT2OutlineExtractor.op_hmovetoc                 C   s$   |    | d| dd f d S r   rQ  r   r   r   r   r6    s    zT2OutlineExtractor.op_vmovetoc           
   	   C   sh   |    |  }|rdddlm} |\}}}}|| }| j|d || }	| j|	dddd||f d S )Nr   StandardEncodingr   r   r   r   r   r   r   )r?  r1  $fontTools.encodings.StandardEncodingrS  r8  addComponent)
r   r   r  rS  adxadybcharachar	baseGlyphaccentGlyphr   r   r   r     s    zT2OutlineExtractor.op_endcharc                 C   s<   |   }tdt|dD ]}|||d  }| | qd S )Nr   r'   )r   r   rZ   rJ  )r   r   r  rU   rB  r   r   r   
op_rlineto  s    zT2OutlineExtractor.op_rlinetoc                 C   s   |  d d S r4  alternatingLinetor   r   r   r   
op_hlineto  s    zT2OutlineExtractor.op_hlinetoc                 C   s   |  d d S r   r^  r   r   r   r   
op_vlineto  s    zT2OutlineExtractor.op_vlinetoc           
      C   sX   |   }tdt|dD ]:}|||d  \}}}}}}	| ||f||f||	f qdS )z${dxa dya dxb dyb dxc dyc}+ rrcurvetor   rg   N)r   r   rZ   rO  )
r   r   r  rU   dxadyadxbdybdxcdycr   r   r   op_rrcurveto  s    zT2OutlineExtractor.op_rrcurvetoc           
      C   sn   |   }tdt|d dD ]:}|||d  \}}}}}}	| ||f||f||	f q| |dd  dS )z-{dxa dya dxb dyb dxc dyc}+ dxd dyd rcurveliner   r'   rg   N)r   r   rZ   rO  rJ  )
r   r   r  rU   rd  re  rf  rg  dxddydr   r   r   op_rcurveline  s
    z T2OutlineExtractor.op_rcurvelinec                 C   sv   |   }|dd }tdt|dD ]}| |||d   q$|dd \}}}}}	}
| ||f||f|	|
f dS )z-{dxa dya}+ dxb dyb dxc dyc dxd dyd rlinecurveNir   r'   )r   r   rZ   rJ  rO  )r   r   r  ZlineArgsrU   rd  re  rf  rg  rj  rk  r   r   r   op_rlinecurve  s    z T2OutlineExtractor.op_rlinecurvec           	      C   s~   |   }t|d r*|d }|dd }nd}tdt|dD ]:}|||d  \}}}}| ||f||fd|f d}q>dS )z!dx1? {dya dxb dyb dyc}+ vvcurvetor'   r   r   Nr.   r   rZ   r   rO  )	r   r   r  dx1rU   rc  rd  re  rg  r   r   r   op_vvcurveto  s    zT2OutlineExtractor.op_vvcurvetoc           	      C   s~   |   }t|d r*|d }|dd }nd}tdt|dD ]:}|||d  \}}}}| ||f||f|df d}q>dS )z!dy1? {dxa dxb dyb dxc}+ hhcurvetor'   r   r   Nr.   rn  )	r   r   r  dy1rU   rb  rd  re  rf  r   r   r   op_hhcurveto  s    zT2OutlineExtractor.op_hhcurvetoc                 C   s*   |   }|r&| |}|r| |}qdS )zdy1 dx2 dy2 dx3 {dxa dxb dyb dyc dyd dxe dye dxf}* dyf? vhcurveto (30)
        {dya dxb dyb dxc dxd dxe dye dyf}+ dxf? vhcurveto
        N)r   vcurvetohcurvetor   r   r  r   r   r   op_vhcurveto  s
    
zT2OutlineExtractor.op_vhcurvetoc                 C   s*   |   }|r&| |}|r| |}qdS )zpdx1 dx2 dy2 dy3 {dya dxb dyb dxc dxd dxe dye dyf}* dxf?
        {dxa dxb dyb dyc dyd dxe dye dxf}+ dyf?
        N)r   rt  rs  ru  r   r   r   op_hvcurveto%  s
    
zT2OutlineExtractor.op_hvcurvetoc                 C   sd   |   \}}}}}}}d }	 }
 }}| }| ||	f||f||
f | ||f||f||f d S r   r   rO  )r   r   ro  dx2dy2dx3dx4dx5dx6rq  dy3dy4dy6dy5r   r   r   op_hflex2  s
    zT2OutlineExtractor.op_hflexc                 C   sZ   |   \}}}}}}}}	}
}}}}| ||f||f||f | ||	f|
|f||f d S r4   rx  )r   r   ro  rq  ry  rz  r{  r  r|  r  r}  r  r~  r  fdr   r   r   op_flex9  s    "zT2OutlineExtractor.op_flexc              	   C   sp   |   \	}}}}}}}}	}
d }}|| | | |	  }| ||f||f||f | ||f||	f|
|f d S r   rx  )r   r   ro  rq  ry  rz  r{  r|  r}  r  r~  r  r  r  r   r   r   	op_hflex1>  s
    zT2OutlineExtractor.op_hflex1c                 C   s   |   \}}}}}}}}	}
}}|| | | |
 }|| | |	 | }t|t|krb|}| }n
| }|}| ||f||f||f | ||	f|
|f||f d S r4   )r   r   rO  )r   r   ro  rq  ry  rz  r{  r  r|  r  r}  r  Zd6dxdyr~  r  r   r   r   op_flex1F  s    zT2OutlineExtractor.op_flex1c                 C   s   t d S r4   r	  r   r   r   r   r
  T  s    zT2OutlineExtractor.op_andc                 C   s   t d S r4   r	  r   r   r   r   r  W  s    zT2OutlineExtractor.op_orc                 C   s   t d S r4   r	  r   r   r   r   r  Z  s    zT2OutlineExtractor.op_notc                 C   s   t d S r4   r	  r   r   r   r   r  ]  s    zT2OutlineExtractor.op_storec                 C   s   t d S r4   r	  r   r   r   r   r  `  s    zT2OutlineExtractor.op_absc                 C   s   t d S r4   r	  r   r   r   r   r  c  s    zT2OutlineExtractor.op_addc                 C   s   t d S r4   r	  r   r   r   r   r  f  s    zT2OutlineExtractor.op_subc                 C   sB   |   }|   }|| }|| }||kr4| | n
| | d S r4   )r   r   )r   r   Znum2Znum1d1d2r   r   r   r  i  s    zT2OutlineExtractor.op_divc                 C   s   t d S r4   r	  r   r   r   r   r  s  s    zT2OutlineExtractor.op_loadc                 C   s   t d S r4   r	  r   r   r   r   r  v  s    zT2OutlineExtractor.op_negc                 C   s   t d S r4   r	  r   r   r   r   r  y  s    zT2OutlineExtractor.op_eqc                 C   s   t d S r4   r	  r   r   r   r   r  |  s    zT2OutlineExtractor.op_dropc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_putc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_getc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_ifelsec                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_randomc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_mulc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_sqrtc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_dupc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_exchc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_indexc                 C   s   t d S r4   r	  r   r   r   r   r    s    zT2OutlineExtractor.op_rollc                 C   s<   |   }|D ]*}|r|df}nd|f}| | | }qd S r   )r   rJ  )r   isHorizontalr  argrB  r   r   r   r_    s    

z$T2OutlineExtractor.alternatingLinetoc                 C   s\   |d d \}}}}|dd  }t |dkr:|d }g }nd}| d|f||f||f |S Nr.   r   r   rZ   rO  )r   r  rc  rd  re  rf  rg  r   r   r   rs    s    zT2OutlineExtractor.vcurvetoc                 C   s\   |d d \}}}}|dd  }t |dkr:|d }g }nd}| |df||f||f |S r  r  )r   r  rb  rd  re  rg  rf  r   r   r   rt    s    zT2OutlineExtractor.hcurveto)NN)8r   r   r   r   r   r   rD  rG  rJ  rO  rP  r?  r3  r5  r6  r   r]  r`  ra  rh  rl  rm  rp  rr  rv  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_  rs  rt  __classcell__r   r   r@  r   r7  ]  sl     
	


r7  c                   @   s   e Zd Zdd Zdd Zdd Zd-dd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,S ).T1OutlineExtractorc                 C   s   || _ || _|   d S r4   )r8  subrsr   )r   r8  r  r   r   r   r     s    zT1OutlineExtractor.__init__c                 C   s    d| _ d| _d| _t|  d S r   )flexingr/  sbxr7  r   r   r   r   r   r     s    zT1OutlineExtractor.resetc                 C   s   | j r| j  d| _ d S r   )r<  r8  r?  r   r   r   r   r?    s    
zT1OutlineExtractor.endPathr   c                 C   s   |   S r4   r   )r   r0  r   r   r   r1    s    zT1OutlineExtractor.popallWidthc                 C   s$   | j }|d |d  |d< |d< d S )Nri  r   r   r   r   r   r   r     s    zT1OutlineExtractor.exchc                 C   s$   | j r
d S |   | |   d S r4   )r  r?  rG  r   r   r   r   r   r3    s    zT1OutlineExtractor.op_rmovetoc                 C   s6   | j r| d d S |   | |  d df d S r   )r  r   r?  rG  r   r   r   r   r   r5    s
    
zT1OutlineExtractor.op_hmovetoc                 C   s>   | j r| d |   d S |   | d|  d f d S r   )r  r   r   r?  rG  r   r   r   r   r   r6    s    
zT1OutlineExtractor.op_vmovetoc                 C   s   |    d S r4   )rP  r   r   r   r   op_closepath  s    zT1OutlineExtractor.op_closepathc                 C   s   |   }|\}}||f| _d S r4   )r   r;  )r   r   r  r   rC  r   r   r   op_setcurrentpoint  s    z%T1OutlineExtractor.op_setcurrentpointc                 C   s   |    d S r4   )r?  r   r   r   r   r     s    zT1OutlineExtractor.op_endcharc                 C   s,   |   \}}|| _|| _|| jd f| _d S r4  )r   r/  r  r;  )r   r   r  Zwxr   r   r   op_hsbw  s    zT1OutlineExtractor.op_hsbwc                 C   s   |    d S r4   r  r   r   r   r   op_sbw  s    zT1OutlineExtractor.op_sbwc                 C   s    |   }| j| }| | d S r4   )r   r  r   r   r   r   r   r     s    
zT1OutlineExtractor.op_callsubrc                 C   sJ   |   }|   }|dkr0|dkr0|   d| _n|dkrF|dkrFd| _d S )Nr   rb   r   )r   doFlexr  )r   r   r   nArgsr   r   r   op_callothersubr  s    z#T1OutlineExtractor.op_callothersubrc                 C   s   d S r4   r   r   r   r   r   op_pop  s    zT1OutlineExtractor.op_popc                 C   s4  |   }|   }|    |   }|   }|   }|   }|   }|   }|   }	|   }
|   }|   }|   }|   }|   }|   }| ||  | ||  | | | | | |
 | |	 | d  | | | | | | | | | | | | | d  | | | | d S r4   )r   r   rh  )r   ZfinalyZfinalxZp3yZp3xZbcp4yZbcp4xZbcp3yZbcp3xZp2yZp2xZbcp2yZbcp2xZbcp1yZbcp1xZrpyZrpxr   r   r   r    sB    












zT1OutlineExtractor.doFlexc                 C   s   |    d S r4   r  r   r   r   r   op_dotsectionE  s    z T1OutlineExtractor.op_dotsectionc                 C   s   |    d S r4   r  r   r   r   r   	op_hstem3H  s    zT1OutlineExtractor.op_hstem3c           
   	   C   sh   ddl m} |  \}}}}}|| }| j|d || }	|| j | }| j|	dddd||f dS )zasb adx ady bchar achar seacr   rR  rT  r   N)rU  rS  r   r8  rV  r  )
r   r   rS  ZasbrW  rX  rY  rZ  r[  r\  r   r   r   op_seacK  s    zT1OutlineExtractor.op_seacc                 C   s   |    d S r4   r  r   r   r   r   	op_vstem3V  s    zT1OutlineExtractor.op_vstem3N)r   )r   r   r   r   r   r?  r1  r   r3  r5  r6  r  r  r   r  r  r   r  r  r  r  r  r  r  r   r   r   r   r    s*   
	*r  c                   @   s   e Zd ZeZee\ZZe	Z
eZd%ddZd&ddZdd Zdd	 Zd
d Zdd Zd'ddZdd Zd(ddZdd Zdd Zdd ZeeefddZdd Zdd  Zd)d!d"Zd#d$ Z dS )*T2CharStringNc                 C   s:   |d u rg }|| _ || _|| _|d ur*|ng | _d | _d S r4   )bytecoder   r   r   _cur_vsindex)r   r  r   r   r   r   r   r   r   `  s    zT2CharString.__init__c                 C   sN   | j }|d usJ |d ur"|| _n | jd u rBt|dr<|jnd| _|| jS )Nrt   r   )r   r  hasattrrt   r!  )r   rt   pdr   r   r   r!  i  s    
zT2CharString.getNumRegionsc                 C   s6   | j d u rd| jjt| f S d| jjt| f S d S )Nz<%s (source) at %x>z<%s (bytecode) at %x>)r  rA  r   idr   r   r   r   __repr__r  s    
zT2CharString.__repr__c                 C   s   t S r4   )r   r   r   r   r   r   x  s    zT2CharString.getIntEncoderc                 C   s   t S r4   )r   r   r   r   r   getFixedEncoder{  s    zT2CharString.getFixedEncoderc                 C   s:   |   sd S t| jdg }| || j| j}||  d S NSubrs)r   r   r   decompilerClassr   r   )r   r  
decompilerr   r   r   	decompile~  s
    zT2CharString.decompilec              	   C   sF   t | jdg }| ||| j| jj| jj| j|}||  |j| _d S r  )r   r   outlineExtractorr   r,  r-  r   r/  )r   r8  r   r  	extractorr   r   r   draw  s    	
zT2CharString.drawc                 C   s   t |}| | |jS r4   )r
   r  bounds)r   glyphSet	boundsPenr   r   r   
calcBounds  s    
zT2CharString.calcBoundsFc           
      C   s  | j d urd S | j}| j}|r<|rV|d dv rV|d d }n|rVt|d tsVtdg }|  }|  }d}t|}||k rD|| }	|d }t|	trz|	dd ||	 D  W n t
y   td|	 Y n0 |	d	v r|||  |d }qvt|	tr|||	 qvt|	tr.|||	 qvdsvJ d
t|	 qvzt|}W n  typ   t|  Y n0 | | d S )Nr   )rp   rs   z@T2CharString or Subr has items on the stack after last operator.r   r   c                 s   s   | ]}t |V  qd S r4   )r   )rT   r>   r   r   r   	<genexpr>  rX   z'T2CharString.compile.<locals>.<genexpr>zillegal operator: %srx   rz   zunsupported type: %s)r  opcodesr   r[   strr   r   r  rZ   extendr   r   r   r<   typer   	TypeErrorr   errorsetBytecode)
r   isCFF2r  r   r  r   r   rU   endr   r   r   r   compile  sL    




zT2CharString.compilec                 C   s
   | j d uS r4   )r  r   r   r   r   r     s    zT2CharString.needsDecompilationc                 C   s   || _ d | _d S r4   )r   r  )r   r   r   r   r   r     s    zT2CharString.setProgramc                 C   s   || _ d | _d S r4   )r  r   )r   r  r   r   r   r    s    zT2CharString.setBytecodec           	      C   s   | j d urR||| j krdS || j | }|d }| j| }|| || j |\}}n$||| jkrddS | j| }|d }||t}|||fS )N)Nr   r   r   )r  operandEncodingr   r  )	r   r   rZ   r   r[   r   r   r   r   r   r   r   r     s    



zT2CharString.getTokenc                 C   sP   | j d ur&|| }| j || }|}n| j| }|d }t||ksHJ ||fS r4  )r  r   rZ   )r   r   nBytesZnewIndexbytesr   r   r   r    s    

zT2CharString.getBytesc                 C   s   |S r4   r   )r   r   r   r   r   r     s    zT2CharString.handle_operatorc                 C   s  ddl m} | jd ur$|| j nd}g }| |\}}}|d u rFq|r|dv r| |\}}}g }	|D ]}
|	|t|
d qjt|	}d|||g }nd||g }|	| |
  g }q,t|trt|dd}nt|}|| q,|rd|}|	| d S )Nr   )
num2binaryr  rk    r0   r1   )fontTools.misc.textToolsr  r  dumphexr   r   r   r	   joinwritenewliner[   r<   r   r  )r   	xmlWriterttFontr  r   r  r   r   ZhintMaskbitsbyteliner   r   r   toXML  s6    



zT2CharString.toXMLc                 C   s6  ddl m}m} |dr,| || d S t|}| }g }t|}d}||k r(|| }	|d }zt|	}	W n t	y   zt
|	dd}	W nx t	y
   ||	 |	dv r|| }
d}tdt|
d	D ] }|t||
||d	   }q|| |d }Y n0 ||	 Y qL0 ||	 qL| | d S )
Nr   )
binary2numreadHexrawr   r0   r1   r  rX   rk   )r  r  r  r   r  r	   r   rZ   r   
ValueErrorr   r   r   r   r   )r   nameattrscontentr  r  r   r  rU   r   maskZ	maskBytesjr   r   r   fromXML  s:    




zT2CharString.fromXML)NNNN)N)N)F)N)!r   r   r   t2OperandEncodingr  r_   t2Operatorsr   r  r   r  r7  r  r   r!  r  r   r  r  r  r  r  r   r   r  rZ   r   r[   r   r  r   r  r  r   r   r   r   r  Z  s*   
	
	

,
&r  c                       sN   e Zd ZeZee\ZZd fdd	Z	dd Z
dd Zdd	 Zd
d Z  ZS )T1CharStringNc                    s   t  || || _d S r4   )r>  r   r  )r   r  r   r  r@  r   r   r   :  s    zT1CharString.__init__c                 C   s   t S r4   )encodeIntT1r   r   r   r   r   >  s    zT1CharString.getIntEncoderc                 C   s   dd }d S )Nc                 S   s   t dd S )Nz8Type 1 charstrings don't support floating point operands)r  )r   r   r   r   r   B  s    z1T1CharString.getFixedEncoder.<locals>.encodeFixedr   )r   r   r   r   r   r  A  s    zT1CharString.getFixedEncoderc                 C   sJ   | j d u rd S g }d}| |\}}}|d u r0q<|| q| | d S r   )r  r   r   r   )r   r   r   r   r   r   r   r   r  E  s    
zT1CharString.decompilec                 C   s"   t || j}||  |j| _d S r4   )r  r  r   r/  )r   r8  r  r   r   r   r  Q  s    
zT1CharString.draw)NNN)r   r   r   t1OperandEncodingr  r_   t1Operatorsr   r  r   r   r  r  r  r  r   r   r@  r   r  6  s   r  c                   @   sr   e Zd ZeZdddZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )DictDecompilerNc                 C   s   g | _ || _i | _|| _d S r4   )r   stringsdictparent)r   r  r  r   r   r   r   Z  s    zDictDecompiler.__init__c                 C   s   t | jdksJ d| jS )Nr   znon-empty stack)rZ   r   r  r   r   r   r   getDict`  s    zDictDecompiler.getDictc                 C   sb   d}t |}| jj}||k r^t|| }|d }| j| }|| |||\}}|d ur|| qd S r   )rZ   r   r   r   r  )r   r   r   ZlenDatar   r   r   r   r   r   r   r  d  s    
zDictDecompiler.decompilec                 C   s   | j d }| j d= |S r   r   r   r   r   r   r   p  s    
zDictDecompiler.popc                 C   s   | j d d  }| j d d = |S r4   r  r  r   r   r   r   u  s    zDictDecompiler.popallc                 C   s   |\}}t |trVd}tt|d ddD ](}|| }t| d| }||f| }q*nt| d| }||}|dkr| j| n
|| j|< d S )Nr   r   r   Zarg_ru   )r[   r\   r   rZ   r   r   r  r  )r   r   ZargTyper   rU   r  Z
arghandlerr   r   r   r   z  s    
zDictDecompiler.handle_operatorc                 C   s*   t | jd tr| | j}n|  }|S r   )r[   r   listarg_blend_numberr   )r   r  outr   r   r   
arg_number  s    zDictDecompiler.arg_numberc                 C   s4   g }|   }t|}|| |d |  }|S )Nru   )r   rZ   r   r   )r   r  r  Z	blendArgs
numMastersdummyr   r   r   r    s    

zDictDecompiler.arg_blend_numberc                 C   s   | j |   S r4   )r  r   r   r  r   r   r   arg_SID  s    zDictDecompiler.arg_SIDc                 C   s   |   S r4   r  r  r   r   r   	arg_array  s    zDictDecompiler.arg_arrayc                 C   s   | j dd}| j|d }|  }|  }t|}||| ksFJ dg| }|d }d}	d}
|	|k r||	 |
 }|}
||	|  }|g||||   }|||	< |	d7 }	q`|S )a  
        There may be non-blend args at the top of the stack. We first calculate
        where the blend args start in the stack. These are the last
        numMasters*numBlends) +1 args.
        The blend args starts with numMasters relative coordinate values, the  BlueValues in the list from the default master font. This is followed by
        numBlends list of values. Each of  value in one of these lists is the
        Variable Font delta for the matching region.

        We re-arrange this to be a list of numMaster entries. Each entry starts with the corresponding default font relative value, and is followed by
        the delta values. We then convert the default values, the first item in each entry, to an absolute value.
        rt   r   r   N)r  r   r  r!  r   r   rZ   )r   r  rt   r  r"  r  ZnumArgsr   	numDeltasrU   ZprevValZnewValZmasterOffsetZ	blendListr   r   r   arg_blendList  s&    

zDictDecompiler.arg_blendListc                 C   sH   |   }g }|r$t|d tr$|}n d}|D ]}|| }|| q,|S r   )r   r[   r  r   )r   r  Z	valueListr  currentrV   r   r   r   	arg_delta  s    zDictDecompiler.arg_delta)N)r   r   r   cffDictOperandEncodingr  r   r  r  r   r   r   r  r  r  r  r  r  r   r   r   r   r  W  s   
	"r  c                 C   s,   t | }|dk rd}n|dk r$d}nd}|S )Ni  r   il  r   i   )rZ   )r  ZnSubrsbiasr   r   r   r     s    r   )9__doc__fontTools.misc.fixedToolsr   r   r   r   r  r   r   r   r	   fontTools.pens.boundsPenr
   r)   logging	getLoggerr   r   r   r   r#   r%   r,   r/   r3   r7   r?   r  rZ   r  r  r;   	enumerater   Z
maxOpStackr_   r  r   ZencodeIntCFFr  r   r   r   r   r   	Exceptionr   objectr   r  r+  r7  r  r  r  r  r   r   r   r   r   <module>   sp   

;4	4 J3  f  ]!y