a
    ¥Q•h¨  ã                   @   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 ƒ}nâd|   kr:dkrdn n&| d } || d? d ƒ|| d@ ƒ }n¤d	|   krxd
kr¤n n(|  d } || d? d ƒ|| d@ ƒ }nd|d urÔd|   krÀdkrÔn n||d| ƒ }n4|d u rút  d¡ |dƒ|d| ƒ }n||d| ƒ }|S )Ni•ÿÿÿék   r   r   ék  rk   r   rB   i•ûÿÿi”ÿÿÿr$   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rüd||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¬||ƒ |r¢d| }	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 rlinecurveNiúÿÿÿr   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 )z‰dy1 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ƒröz| 	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¡ nêd}g }|  |¡\}}}|d u rFqô|rÈ|dv r |  |¡\}}}g }	|D ]}
|	 |t|
ƒdƒ¡ qjt|	ƒ}d |||g ¡}nd ||g ¡}| 	|¡ | 
¡  g }q,t|tƒràt|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