o
    teK                     @   sb  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZ G dd dejZeed	d
d Zd(ddZeed	dd Zeed	dd Zeejdd Zeejdd ZG dd dejZG dd dejZeed	dd Zdd Ze	ded eed	d!d" Zeed	d#d$ Zeed	d%d& Zd'S ))    )psCharStrings)ttLib)NullPen)otRound)deprecateFunction)_add_method
_uniq_sortc                   @   s   e Zd Zdd Zdd ZdS )_ClosureGlyphsT2Decompilerc                 C   s   t j| || || _d S N)r   SimpleT2Decompiler__init__
components)selfr   
localSubrsglobalSubrs r   DD:\Projects\ConvertPro\env\Lib\site-packages\fontTools/subset/cff.pyr   
   s   
z#_ClosureGlyphsT2Decompiler.__init__c           
      C   sd   |   }t|dkr0ddlm} |dd  \}}}}|| }|| }	| j| | j|	 d S d S )N   r   )StandardEncoding)ZpopalllenZ$fontTools.encodings.StandardEncodingr   r   add)
r   indexargsr   ZadxZadyZbcharZacharZ	baseGlyphZaccentGlyphr   r   r   
op_endchar   s   z%_ClosureGlyphsT2Decompiler.op_endcharN)__name__
__module____qualname__r   r   r   r   r   r   r	   	   s    r	   zCFF c                 C   s   | j }t|dksJ || d  }|j}|j}|rPt }|D ]}||vr'q || }t|jdg }	t||	|j	}
|

| q ||j8 }|j| |}|sd S d S )N   r   Subrs)cffr   keysCharStringsglyphssetgetattrprivater	   r   executeupdate)r   sr    fontZglyphSetZ	decomposer   gglsubrs
decompilerr   r   r   closure_glyphs   s$   
r/   Fc           
      C   s   | j |\}}|s|r||rg  d S dg d S t| dr,| jd ur,| j| j}n| j}|j}|j}t }	|	|	 |j
|krL|j
| dg|_d S dg|_d S )NendcharFDArray)r"   getItemAndSelectorZ
setProgramhasattrr1   PrivatedefaultWidthXnominalWidthXr   Zdrawwidthprogram)
r*   Z	glyphNameisCFF2ignoreWidthcZfdSelectIndexr&   ZdfltWdXZnmnlWdXpenr   r   r   _empty_charstring3   s   

r=   c                 C   sp   | j }|jd d |_|jr(|js(|jdk}| D ]}|| }t|d|d q| D ]	}|| }d|_q,dS )Nr   z.notdef)r9   r   T)r    Z	fontNamesZnotdef_glyphZnotdef_outlinemajorr!   r=   ZEncoding)r   r*   optionsr    r9   fontnamer   r   r   prune_pre_subsetG   s   
rA   c                    sf  | j }| D ]}|| }|j}|j|j|jD ]}|vr!q||\}}q|jr{fddt	|jD }	|j
  fdd|	D  _ ` `t|dr^|jd _fdd|	D _i }
t	|	D ]\}}|j| }||jv rv||
|< qd|
|_nfdd|j D |_fdd|jD |_t|j|_|jjr|jd	k}|jD ]
}t|||d
d qqd
S )Nc                    s   g | ]
\}}| v r|qS r   r   ).0ir+   r#   r   r   
<listcomp>l   s    z!subset_glyphs.<locals>.<listcomp>c                       g | ]} j | qS r   itemsrB   rC   )csir   r   rE   n       FDSelectc                    rF   r   )gidArrayrI   )selr   r   rE   s   rK   c                    s   i | ]\}}| v r||qS r   r   )rB   r+   vrD   r   r   
<dictcomp>{   s    z!subset_glyphs.<locals>.<dictcomp>c                    s   g | ]}| v r|qS r   r   )rB   r+   rD   r   r   rE   |   s    r   T)r9   r:   )r    r!   r"   r#   unionZglyphs_emptiedcharsetr2   ZcharStringsAreIndexed	enumerateZcharStringsIndexrH   fileoffsetsr3   rL   formatrM   ZcharStringsr   Z	numGlyphsr?   Zretain_gidsr>   r=   )r   r)   r    r@   r*   csr+   r;   _indicesZnewCharStringsZ
indicesIdxZ
charsetIdxr9   r   )rJ   r#   rN   r   subset_glyphs\   sD   





rZ   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   ZcallsubrZ	callgsubr)	r8   ranger   
isinstanceint_usedr   	_old_bias	_new_bias)r   r-   ZgsubrsprC   r   r   r   subset_subroutines   s   *
rb   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 )N   r   r0   r7   z5CFF2 CharStrings must not have an initial width value)ZhintmaskZcntrmaskr   )_hints	deletionsr8   reversedhas_hint	last_hintappendr3   r7   r&   r5   insertr6   has_hintmaskr   )r   hintsra   idxrC   r   r   r   
drop_hints   s8   
rn   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_MarkingT2Decompilerc                 C   s:   t j| ||| ||fD ]}|rt|dst |_qd S )Nr^   )r   r   r   r3   r$   r^   )r   r   r   r&   r-   r   r   r   r      s   z_MarkingT2Decompiler.__init__c                 C   ,   | j j| jd | j  tj| | d S N)r   r^   r   operandStack	localBiasr   r   op_callsubrr   r   r   r   r   ru         z _MarkingT2Decompiler.op_callsubrc                 C   rp   rq   )r   r^   r   rs   
globalBiasr   r   op_callgsubrrv   r   r   r   ry      rw   z!_MarkingT2Decompiler.op_callgsubrN)r   r   r   r   ru   ry   r   r   r   r   ro      s    ro   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   )rg   rh   last_checkedstatusrk   re   r   r   r   r   r      s   
z%_DehintingT2Decompiler.Hints.__init__N)r   r   r   r   r   r   r   r   Hints   s    r~   Nc                 C   s$   || _ tj| |||| || _d S r
   )_cssr   T2WidthExtractorr   r&   )r   cssr   r   r6   r5   r&   r   r   r   r      s
   

z_DehintingT2Decompiler.__init__c                 C   s   t |dr|jnd }|  |_tj| | |j}|js|jr%| j	| |j
dkrNt|jt|jd D ]}t|j| trDd|_
 nd|_
q5t|j|_|rX|j|jksZJ d S d S )Nrd   rc   r   )r3   rd   r~   r   r   r'   rg   rk   r   r   r|   r[   r{   r   r8   r\   str__dict__)r   Z
charStringZ	old_hintsrl   rC   r   r   r   r'      s"   

z_DehintingT2Decompiler.executec                 C   4   | j | jd | j  }tj| | | || d S rq   )r   rs   rt   r   r   ru   processSubrr   r   subrr   r   r   ru   
     z"_DehintingT2Decompiler.op_callsubrc                 C   r   rq   )r   rs   rx   r   r   ry   r   r   r   r   r   ry     r   z#_DehintingT2Decompiler.op_callgsubrc                 C      t j| | | | d S r
   )r   r   op_hstemprocessHintrv   r   r   r   r        z_DehintingT2Decompiler.op_hstemc                 C   r   r
   )r   r   op_vstemr   rv   r   r   r   r     r   z_DehintingT2Decompiler.op_vstemc                 C   r   r
   )r   r   
op_hstemhmr   rv   r   r   r   r     r   z!_DehintingT2Decompiler.op_hstemhmc                 C   r   r
   )r   r   
op_vstemhmr   rv   r   r   r   r      r   z!_DehintingT2Decompiler.op_vstemhmc                 C      t j| |}| | |S r
   )r   r   op_hintmaskprocessHintmaskr   r   rvr   r   r   r   $     
z"_DehintingT2Decompiler.op_hintmaskc                 C   r   r
   )r   r   op_cntrmaskr   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 )Nrr   Trc   r   r   )callingStackrd   rk   r|   r[   r{   r\   r8   r   rg   rh   )r   r   rW   rl   rC   r   r   r   r   .  s   


z&_DehintingT2Decompiler.processHintmaskc                 C   s&   | j d }|j}d|_||_||_d S )Nrr   T)r   rd   rg   rh   r{   )r   r   rW   rl   r   r   r   r   ?  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 )Nrr   rc   r   Tr   )r   rd   r|   r[   r{   r\   r8   r   rg   rh   re   ri   max)r   r   r   rW   rl   Z
subr_hintsrC   r   r   r   r   F  s(   





z"_DehintingT2Decompiler.processSubrr
   )r   r   r   objectr~   r   r'   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   rz      s     
	rz   c                    s   | j }| D ]2}|| }|j}t|dr9|j}t|jfdd|jD |_|j  fddD  _ `	 `
q|jrA|  |jsJ|   dS |jsQ|   dS )NrL   c                    s   g | ]}  |qS r   )r   )rB   ss)rY   r   r   rE   o  rK   z%prune_post_subset.<locals>.<listcomp>c                    s   g | ]} | qS r   r   rI   )arrr   r   rE   q  s    T)r    r!   r"   r3   rL   r   rM   r1   rH   rT   rU   desubroutinizeZhintingremove_hintsremove_unused_subroutines)r   ZttfFontr?   r    r@   r*   rW   rN   r   )r   rY   r   prune_post_subsetd  s(   

r   c                 C   s2   t | dr| jsd| jv r| jd= | `d S d S d S )Nr   )r3   r   ZrawDict)Zprivate_dictr   r   r   _delete_empty_subrs  s
   
r   z)use 'CFFFontSet.desubroutinize()' instead)categoryc                 C   s   | j   d S r
   )r    r   r}   r   r   r   r     s   r   c              	   C   s  | j }| D ]t}|| }|j}t }|jD ],}||\}}|  t|jdg }	t	||	|j
|jj|jj|j}
|
| |
j|_q|D ]}|  qE~g }t|dr`|dd |jD  n||j |D ]}dD ]}t||ryt||d  qlqhq|   d S )Nr   r1   c                 s   s    | ]}|j V  qd S r
   )r4   rB   fdr   r   r   	<genexpr>  s    zremove_hints.<locals>.<genexpr>)Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZ	StemSnapHZ	StemSnapVZStdHWZStdVWZ	ForceBoldZLanguageGroupZExpansionFactor)r    r!   r"   r$   rR   r2   Z	decompiler%   r&   rz   r   r6   r5   r'   r7   rn   r3   extendr1   ri   r4   setattrr   )r   r    r@   r*   rW   r   r+   r;   rX   r-   r.   Z
charstringZ	all_privsZprivkr   r   r   r     sD   





r   c                    s   | j }| D ]}|| }|j}|jD ]}||\}}t|jdg  t |j|j}|	| q|j
g}	t|drF|	dd |jD  nt|jdrW|jjrW|	|jj t  |	D ] t dsht  _t j _t  _t j _q]|jD ]}||\}}t|jdg  | |j
 q|	D ]B  |j
krt|dst|jdr|jj}
ng }
n }
 fdd jD  _t drǈ `t d	rΈ ` jD ]	}||
|j
 qqt|dr|jD ]}t|j qnt|j |	D ]  ` ` `qqd S )
Nr   r1   c                 s   s,    | ]}t |jd r|jjr|jjV  qdS )r   N)r3   r4   r   r   r   r   r   r     s    

z,remove_unused_subroutines.<locals>.<genexpr>r^   c                    rF   r   rG   rI   r-   r   r   rE     rK   z-remove_unused_subroutines.<locals>.<listcomp>rT   rU   )r    r!   r"   rR   r2   r%   r&   ro   r   r'   ZGlobalSubrsr3   r   r1   r4   r   ri   r$   r^   r   r   ZcalcSubrBiasr_   r`   rb   rH   rT   rU   r   )r   r    r@   r*   rW   r+   r;   rX   r.   Z	all_subrsZlocal_subrsr   r   r   r   r   r     sd   













r   N)F) ZfontTools.miscr   Z	fontToolsr   ZfontTools.pens.basePenr   ZfontTools.misc.roundToolsr   ZfontTools.misc.loggingToolsr   ZfontTools.subset.utilr   r   r   r	   ZgetTableClassr/   r=   rA   rZ   ZT2CharStringrb   rn   ro   r   rz   r   r   DeprecationWarningr   r   r   r   r   r   r   <module>   sB    



*

& 

C