U
    #vhC                     @   s   d dl mZmZmZ dd ZG dd deZG dd deZdd	 ZG d
d deZ	G dd deZ
dd Zdd ZddedddZdd Zdd ZdS )    )SimpleT2DecompilerT2WidthExtractorcalcSubrBiasc                 C   s   t t| S N)sortedset)l r	   ?/tmp/pip-unpacked-wheel-1ufboor8/fontTools/cffLib/transforms.py
_uniq_sort   s    r   c                   @   s   e Zd ZdS )StopHintCountEventN)__name__
__module____qualname__r	   r	   r	   r
   r      s   r   c                   @   sJ   e Zd Z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S )_DesubroutinizingT2Decompiler)op_hintmaskop_cntrmaskZ
op_rmovetoZ
op_hmovetoZ
op_vmovetoNc                 C   s   t | ||| d S r   )r   __init__)self
localSubrsglobalSubrsprivater	   r	   r
   r      s    z&_DesubroutinizingT2Decompiler.__init__c                 C   s@  d| _ | jD ]}t| || j qt|drh| j rd| jrdzt| | W n tk
rb   | jd= Y nX d S g |_	t| | |j
d d  }t|j	D ]t\}}|dkst||d  dkst||d  t||d  tkst|d dkr|d d }|||d |< q| jjs2d|kr2|d |dd  }||_|`	d S )	NT_desubroutinized      )callsubr	callgsubrreturnendchar)need_hintcountstop_hintcount_opssetattrstop_hint_counthasattrcallingStackr   executer   _patchesprogramreversedAssertionErrortypeintr   Zin_cff2indexr   )r   
charStringop_nameZdesubroutinizedidxZ	expansionr	   r	   r
   r&      s:    




z%_DesubroutinizingT2Decompiler.executec                 C   s2   | j | jd | j  }t| | | || d S Nr   )r   operandStack	localBiasr   op_callsubrprocessSubrr   r-   subrr	   r	   r
   r4   D   s    z)_DesubroutinizingT2Decompiler.op_callsubrc                 C   s2   | j | jd | j  }t| | | || d S r1   )r   r2   
globalBiasr   op_callgsubrr5   r6   r	   r	   r
   r9   I   s    z*_DesubroutinizingT2Decompiler.op_callgsubrc                 G   s<   d| _ | jD ]}t| |d  q| jd }t|dr8t d S )NFr   r   )r    r!   r"   r%   r$   r   )r   argsr/   csr	   r	   r
   r#   N   s    


z-_DesubroutinizingT2Decompiler.stop_hint_countc                 C   s   t | | | jr|   d S r   )r   r   r    r#   r   r-   r	   r	   r
   r   V   s    z)_DesubroutinizingT2Decompiler.op_hintmaskc                 C   s*   | j d }t|ds&|j||jf d S )Nr   r   )r%   r$   r'   appendr   )r   r-   r7   r;   r	   r	   r
   r5   [   s    

z)_DesubroutinizingT2Decompiler.processSubr)N)r   r   r   r!   r   r&   r4   r9   r#   r   r5   r	   r	   r	   r
   r      s   
(r   c           	      C   s   | j D ]}| | }|j}| D ]@}|  t|jdg }t||j|j}|| |j	|_
|`	q t|dr|jD ]*}|j}t|dr|`d|jkrr|jd= qrq|j}t|dr|`d|jkr|jd= q| j  d S )NSubrsFDArray)Z	fontNamesCharStringsvalues	decompilegetattrr   r   r   r&   r   r(   r$   r?   Privater>   rawDictGlobalSubrsclear)	cffZfontNamefontr;   csubrs
decompilerfdpdr	   r	   r
   desubroutinizea   s.    








rO   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_MarkingT2Decompilerc                 C   s8   t | ||| ||fD ]}|rt|dst |_qd S )N_used)r   r   r$   r   rQ   )r   r   r   r   rK   r	   r	   r
   r      s    z_MarkingT2Decompiler.__init__c                 C   s*   | j j| jd | j  t| | d S r1   )r   rQ   addr2   r3   r   r4   r<   r	   r	   r
   r4      s    z _MarkingT2Decompiler.op_callsubrc                 C   s*   | j j| jd | j  t| | d S r1   )r   rQ   rR   r2   r8   r   r9   r<   r	   r	   r
   r9      s    z!_MarkingT2Decompiler.op_callgsubrN)r   r   r   r   r4   r9   r	   r	   r	   r
   rP   ~   s   rP   c                   @   s   e Zd ZG dd d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d ZdS )_DehintingT2Decompilerc                   @   s   e Zd Zdd ZdS )z_DehintingT2Decompiler.Hintsc                 C   s(   d| _ d| _d| _d| _d| _g | _d S )NFr   )has_hint	last_hintlast_checkedstatushas_hintmask	deletions)r   r	   r	   r
   r      s    z%_DehintingT2Decompiler.Hints.__init__N)r   r   r   r   r	   r	   r	   r
   Hints   s   rZ   Nc                 C   s"   || _ t| |||| || _d S r   )_cssr   r   r   )r   cssr   r   nominalWidthXdefaultWidthXr   r	   r	   r
   r      s        z_DehintingT2Decompiler.__init__c                 C   s   t |dr|jnd }|  |_t| | |j}|js<|jrH| j| |j	dkrt
|jt|jd D ]&}t|j| trd|_	 qqhd|_	qht|j|_|r|j|jkstd S )N_hintsr   r   )r$   r_   rZ   r   r&   rT   rX   r[   rR   rW   rangerV   lenr(   
isinstancestr__dict__r*   )r   r.   Z	old_hintshintsir	   r	   r
   r&      s    

z_DehintingT2Decompiler.executec                 C   s2   | j | jd | j  }t| | | || d S r1   )r   r2   r3   r   r4   r5   r6   r	   r	   r
   r4      s    z"_DehintingT2Decompiler.op_callsubrc                 C   s2   | j | jd | j  }t| | | || d S r1   )r   r2   r8   r   r9   r5   r6   r	   r	   r
   r9      s    z#_DehintingT2Decompiler.op_callgsubrc                 C   s   t | | | | d S r   )r   op_hstemprocessHintr<   r	   r	   r
   rg      s    z_DehintingT2Decompiler.op_hstemc                 C   s   t | | | | d S r   )r   op_vstemrh   r<   r	   r	   r
   ri      s    z_DehintingT2Decompiler.op_vstemc                 C   s   t | | | | d S r   )r   
op_hstemhmrh   r<   r	   r	   r
   rj      s    z!_DehintingT2Decompiler.op_hstemhmc                 C   s   t | | | | d S r   )r   
op_vstemhmrh   r<   r	   r	   r
   rk      s    z!_DehintingT2Decompiler.op_vstemhmc                 C   s   t | |}| | |S r   )r   r   processHintmaskr   r-   rvr	   r	   r
   r      s    
z"_DehintingT2Decompiler.op_hintmaskc                 C   s   t | |}| | |S r   )r   r   rl   rm   r	   r	   r
   r      s    
z"_DehintingT2Decompiler.op_cntrmaskc                 C   st   | j d }|j}d|_|jdkrft|j|d D ]}t|j| tr0d|_ qfq0d|_	|d |_
d|_|d |_d S )Nr   Tr   r   r   )r%   r_   rX   rW   r`   rV   rb   r(   rc   rT   rU   )r   r-   r;   re   rf   r	   r	   r
   rl      s    


z&_DehintingT2Decompiler.processHintmaskc                 C   s&   | j d }|j}d|_||_||_d S )Nr   T)r%   r_   rT   rU   rV   )r   r-   r;   re   r	   r	   r
   rh      s
    
z"_DehintingT2Decompiler.processHintc                 C   s   | j d }|j}|j}|jdkrVt|j|d D ]}t|j| tr0d|_ qPq0||_|jdkr|jrd|_|jdkr~||_	q|d |_	n|jdkr|j
| t|j|j|_d S )Nr   r   r   Tr   )r%   r_   rW   r`   rV   rb   r(   rc   rT   rU   rY   r=   max)r   r-   r7   r;   re   Z
subr_hintsrf   r	   r	   r
   r5     s$    




z"_DehintingT2Decompiler.processSubr)N)r   r   r   objectrZ   r   r&   r4   r9   rg   ri   rj   rk   r   r   rl   rh   r5   r	   r	   r	   r
   rS      s    
	rS   c                 C   s   | j }tdt|D ]}|| dkrdt||d  ts:t|j||d  |j |j	 ||d < q|| dkrt||d  tst|j||d  |j |j	 ||d < qd S )Nr   r   r   )
r(   r`   ra   rb   r,   r*   rQ   r-   	_old_bias	_new_bias)
charstringrK   Zgsubrsprf   r	   r	   r
   _cs_subset_subroutines$  s    *ru   c                 C   s,  | j }|jr0| j}t|jD ]}||d |= q|jr|jrP|j|jd ksPt| j|jd  | _| jst| jd t| dr| j	| j
jkr| j
jd k	std| jd| j	| j
j  |jrd}| j}|t|k r|| dkr
|d t|kst|||d = q|d7 }qt| js$t| ` d S )Nr   r   r   widthz5CFF2 CharStrings must not have an initial width value)ZhintmaskZcntrmaskr   )r_   rY   r(   r)   rT   rU   r*   r=   r$   rv   r   r^   insertr]   rX   ra   )rs   re   rt   r0   rf   r	   r	   r
   _cs_drop_hints1  s>    

 
rx   T)removeUnusedSubrsc             	   C   s   |   D ]}| | }|j}t }| D ]J}|  t|jdg }t|||j|jj	|jj
|j}|| |j|_q(|D ]}	t|	 qx~g }
t|dr|
dd |jD  n|
|j |
D ]$}dD ]}t||rt||d  qqq|rt|  d S )Nr>   r?   c                 s   s   | ]}|j V  qd S r   )rD   .0rM   r	   r	   r
   	<genexpr>  s     zremove_hints.<locals>.<genexpr>)Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZ	StemSnapHZ	StemSnapVZStdHWZStdVWZ	ForceBoldZLanguageGroupZExpansionFactor)keysr@   r   rA   rB   rC   r   rS   r   r]   r^   r&   rv   rx   r$   extendr?   r=   rD   r"   remove_unused_subroutines)rH   ry   fontnamerI   r;   r\   rJ   rK   rL   rs   Z	all_privsZprivkr	   r	   r
   remove_hintsY  s<    




r   c                 C   s*   t | dr&| js&d| jkr"| jd= | `d S )Nr>   )r$   r>   rE   )Zprivate_dictr	   r	   r
   _pd_delete_empty_subrs  s    
r   c           
         s4  |   D ]$}| | }|j}| D ],}t|jdg  t |j|j}|| q$|jg}t	|dr||
dd |jD  n"t	|jdr|jjr||jj t  |D ]8 t	 dst  _t j _t  _t j _q| D ] }t|jdd  t| |j q|D ]҉  |jkrt	|dsFt	|jdrF|jj}nDt	|drt|jdkrt	|jd jdr|jd jj}nd }n } fdd	 jD  _t	 d
r `t	 drƈ ` jD ]}t|||j q̐qt	|dr|jD ]}	t|	j qn
t|j |D ]  ` ` `qqd S )Nr>   r?   c                 s   s*   | ]"}t |jd r|jjr|jjV  qdS )r>   N)r$   rD   r>   rz   r	   r	   r
   r|     s    z,remove_unused_subroutines.<locals>.<genexpr>rQ   r   r   c                    s   g | ]} j | qS r	   )items)r{   rf   rK   r	   r
   
<listcomp>  s     z-remove_unused_subroutines.<locals>.<listcomp>fileoffsets)r}   r@   rA   rC   r   rP   r   r&   rF   r$   r~   r?   rD   r>   r=   r   rQ   r   r   rq   rr   ru   ra   r   r   r   r   )
rH   r   rI   r;   rJ   rL   Z	all_subrsZlocal_subrsr7   rM   r	   r   r
   r     sd    








r   N)ZfontTools.misc.psCharStringsr   r   r   r   	Exceptionr   r   rO   rP   rS   ru   rx   boolr   r   r   r	   r	   r	   r
   <module>   s   Q (B