o
    nĎi/D                     @   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d
d Z	G dd deZ
G dd deZdd Zdd ZdddefddZdd Zdd ZdS )    )SimpleT2DecompilerT2WidthExtractorcalcSubrBiasc                 C   s   t t| S N)sortedset)l r	   W/home/jeff/fluffinator/venv/lib/python3.10/site-packages/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_cntrmask
op_rmoveto
op_hmoveto
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r5| j r3| jr3z	t| | W d S  ty2   | jd= Y d S w d S g |_	t| | |j
d d  }t|j	D ]:\}}|dksTJ ||d  dv sdJ ||d  t||d  tkspJ |d dkr||d d }|||d |< qJ| jjsd|v r|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typeintr   in_cff2indexr   )r   
charStringop_namedesubroutinizedidx	expansionr	   r	   r
   r)      s@   



z%_DesubroutinizingT2Decompiler.executec                 C   2   | j | jd | j  }t| | | || d S Nr   )r   operandStack	localBiasr   op_callsubrprocessSubrr   r0   subrr	   r	   r
   r:   D      z)_DesubroutinizingT2Decompiler.op_callsubrc                 C   r6   r7   )r   r8   
globalBiasr   op_callgsubrr;   r<   r	   r	   r
   r@   I   r>   z*_DesubroutinizingT2Decompiler.op_callgsubrc                 G   s<   d| _ | jD ]}t| |d  q| jd }t|drt d S )NFr   r   )r#   r$   r%   r(   r'   r   )r   argsr2   csr	   r	   r
   r&   N   s   


z-_DesubroutinizingT2Decompiler.stop_hint_countc                 C   s"   t | | | jr|   d S d S r   )r   r   r#   r&   r   r0   r	   r	   r
   r   V   s   z)_DesubroutinizingT2Decompiler.op_hintmaskc                 C   s.   | j d }t|ds|j||jf d S d S )Nr   r   )r(   r'   r*   appendr   )r   r0   r=   rB   r	   r	   r
   r;   [   s   

z)_DesubroutinizingT2Decompiler.processSubrr   )r   r   r   r$   r   r)   r:   r@   r&   r   r;   r	   r	   r	   r
   r      s    
(r   c                 C   s@   |    t| jdg }t|| j| j}||  | j| _| `dS )z%Desubroutinize a charstring in-place.SubrsN)	decompilegetattrr   r   r   r)   r   r+   )rB   subrs
decompilerr	   r	   r
   desubroutinizeCharStringa   s   
rJ   c                 C   s   | j D ]F}| | }|j}| D ]}t| qt|dr6|jD ]}|j}t|dr+|`d|jv r4|jd= qq|j}t|dr@|`d|jv rI|jd= q| j	
  d S )NFDArrayrE   )	fontNamesCharStringsvaluesrJ   r'   rK   PrivaterE   rawDictGlobalSubrsclear)cfffontNamefontrB   cfdpdr	   r	   r
   desubroutinizek   s*   







rY   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   r[   )r   r   r   r   rH   r	   r	   r
   r      s   z_MarkingT2Decompiler.__init__c                 C   *   | j j| jd | j  t| | d S r7   )r   r[   addr8   r9   r   r:   rC   r	   r	   r
   r:         z _MarkingT2Decompiler.op_callsubrc                 C   r\   r7   )r   r[   r]   r8   r?   r   r@   rC   r	   r	   r
   r@      r^   z!_MarkingT2Decompiler.op_callgsubrN)r   r   r   r   r:   r@   r	   r	   r	   r
   rZ      s    rZ   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    rf   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r$| j| |j	dkrMt
|jt|jd D ]}t|j| trCd|_	 nd|_	q4t|j|_|rW|j|jksYJ d S d S )N_hintsr   r   )r'   rk   rf   r   r)   r`   rd   rg   r]   rc   rangerb   lenr+   
isinstancestr__dict__)r   r1   	old_hintshintsir	   r	   r
   r)      s"   

z_DehintingT2Decompiler.executec                 C   r6   r7   )r   r8   r9   r   r:   r;   r<   r	   r	   r
   r:      r>   z"_DehintingT2Decompiler.op_callsubrc                 C   r6   r7   )r   r8   r?   r   r@   r;   r<   r	   r	   r
   r@      r>   z#_DehintingT2Decompiler.op_callgsubrc                 C      t | | | | d S r   )r   op_hstemprocessHintrC   r	   r	   r
   ru         z_DehintingT2Decompiler.op_hstemc                 C   rt   r   )r   op_vstemrv   rC   r	   r	   r
   rx      rw   z_DehintingT2Decompiler.op_vstemc                 C   rt   r   )r   
op_hstemhmrv   rC   r	   r	   r
   ry      rw   z!_DehintingT2Decompiler.op_hstemhmc                 C   rt   r   )r   
op_vstemhmrv   rC   r	   r	   r
   rz      rw   z!_DehintingT2Decompiler.op_vstemhmc                 C      t | |}| | |S r   )r   r   processHintmaskr   r0   rvr	   r	   r
   r         
z"_DehintingT2Decompiler.op_hintmaskc                 C   r{   r   )r   r   r|   r}   r	   r	   r
   r      r   z"_DehintingT2Decompiler.op_cntrmaskc                 C   st   | j d }|j}d|_|jdkr3t|j|d D ]}t|j| tr'd|_ nqd|_	|d |_
d|_|d |_d S )Nr   Tr   r   r   )r(   rk   rd   rc   rl   rb   rn   r+   ro   r`   ra   )r   r0   rB   rr   rs   r	   r	   r
   r|      s   


z&_DehintingT2Decompiler.processHintmaskc                 C   s&   | j d }|j}d|_||_||_d S )Nr   T)r(   rk   r`   ra   rb   )r   r0   rB   rr   r	   r	   r
   rv     s
   

z"_DehintingT2Decompiler.processHintc                 C   s   | j d }|j}|j}|jdkr+t|j|d D ]}t|j| tr'd|_ nq||_|jdkrE|jrDd|_|jdkr?||_	n|d |_	n|jdkrP|j
| t|j|j|_d S )Nr   r   r   Tr   )r(   rk   rc   rl   rb   rn   r+   ro   r`   ra   re   rD   max)r   r0   r=   rB   rr   
subr_hintsrs   r	   r	   r
   r;     s(   





z"_DehintingT2Decompiler.processSubrr   )r   r   r   objectrf   r   r)   r:   r@   ru   rx   ry   rz   r   r   r|   rv   r;   r	   r	   r	   r
   r_      s     
	r_   c                 C   s   | j }tdt|D ]M}|| dkr2t||d  tsJ |j||d  |j |j ||d < q
|| dkrWt||d  tsCJ |j||d  |j |j ||d < q
d S )Nr   r   r    )	r+   rl   rm   rn   r.   r[   r0   	_old_bias	_new_bias)
charstringrH   gsubrsprs   r	   r	   r
   _cs_subset_subroutines)  s   *
r   c                 C   s.  | j }|jr| j}t|jD ]	}||d |= q|jr\|jr(|j|jd ks(J | j|jd  | _| js:| jd t| dr\| j| j	j
kr\| j	j
d usPJ d| jd| j| j	j  |jrd}| j}|t|k r|| dv r|d t|kszJ |||d = qd|d7 }|t|k sjt| jsJ | ` d S )Nr   r   r"   widthz5CFF2 CharStrings must not have an initial width value)hintmaskcntrmaskr   )rk   re   r+   r,   r`   ra   rD   r'   r   r   rj   insertri   rd   rm   )r   rr   r   r4   rs   r	   r	   r
   _cs_drop_hints6  s<   
r   T)removeUnusedSubrsr   c             	   C   s   |   D ]n}| | }|j}t }| D ]%}|  t|jdg }t|||j|jj	|jj
|j}|| |j|_q|D ]}	t|	 q<~g }
t|drW|
dd |jD  n|
|j |
D ]}dD ]}t||rpt||d  qcq_q|r{t|  d S d S )NrE   rK   c                 s   s    | ]}|j V  qd S r   )rO   .0rW   r	   r	   r
   	<genexpr>  s    zremove_hints.<locals>.<genexpr>)
BlueValues
OtherBluesFamilyBluesFamilyOtherBlues	BlueScale	BlueShiftBlueFuzz	StemSnapH	StemSnapVStdHWStdVW	ForceBoldLanguageGroupExpansionFactor)keysrM   r   rN   rF   rG   r   r_   r   ri   rj   r)   r   r   r'   extendrK   rD   rO   r%   remove_unused_subroutines)rS   r   fontnamerU   rB   rh   rV   rH   rI   r   	all_privsprivkr	   r	   r
   remove_hints^  sD   




r   c                 C   s2   t | dr| jsd| jv r| jd= | `d S d S d S )NrE   )r'   rE   rP   )private_dictr	   r	   r
   _pd_delete_empty_subrs  s
   
r   c           
         s  |   D ]}| | }|j}| D ]}t|jdg  t |j|j}|| q|jg}t	|dr>|
dd |jD  nt	|jdrO|jjrO||jj t  |D ] t	 ds`t  _t j _t  _t j _qU| D ]}t|jdd  t| |j qv|D ]_  |jkrt	|dst	|jdr|jj}n"t	|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 qqt	|dr|jD ]}	t|	j qnt|j |D ]	  ` ` `qqd S )NrE   rK   c                 s   s,    | ]}t |jd r|jjr|jjV  qdS )rE   N)r'   rO   rE   r   r	   r	   r
   r     s    

z,remove_unused_subroutines.<locals>.<genexpr>r[   r   r   c                    s   g | ]} j | qS r	   )items)r   rs   rH   r	   r
   
<listcomp>  s    z-remove_unused_subroutines.<locals>.<listcomp>fileoffsets)r   rM   rN   rG   r   rZ   r   r)   rQ   r'   r   rK   rO   rE   rD   r   r[   r   r   r   r   r   rm   r   r   r   r   )
rS   r   rU   rB   rV   rI   	all_subrslocal_subrsr=   rW   r	   r   r
   r     sj   












r   N)fontTools.misc.psCharStringsr   r   r   r   	Exceptionr   r   rJ   rY   rZ   r_   r   r   boolr   r   r   r	   r	   r	   r
   <module>   s    Q
 (B