B
    Jd<                 @   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   F/var/www/html/venv/lib/python3.7/site-packages/fontTools/subset/cff.pyr      s    z#_ClosureGlyphsT2Decompiler.__init__c       
      C   s`   |   }t|dkr\ddlm} |dd  \}}}}|| }|| }	| j| | j|	 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t|| d  }|j}|j}xn|rt }xD|D ]<}||krRqD|| }t|jdg }	t	||	|j
}
|
| qDW ||j8 }|j| |}q4W d S )N   r   Subrs)cffr   AssertionError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 ndg nht| drP| jd k	rP| j| j}n| j}|j}|j}t }	|	|	 |j
|kr|j
| dg|_n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   sx   | j }|jd d |_|jrT|jsT|jdk}x&| D ]}|| }t|d|d q6W x| D ]}|| }d|_q^W 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_subsetF   s    

rA   c                s~  | j }xp| D ]b}|| }|j}|j|jx&|jD ]}|krJq<||\}}q<W |jrfddt	|jD }	|j
  fdd|	D  _ ` `t|dr|jd _fdd|	D _i }
x0t	|	D ]$\}}|j| }||jkr||
|< qW |
|_nfdd|j D |_fdd|jD |_t|j|_|jjr|jd	k}x |jD ]}t|||d
d q\W qW d
S )Nc                s   g | ]\}}| kr|qS r   r   ).0ir+   )r#   r   r   
<listcomp>i   s    z!subset_glyphs.<locals>.<listcomp>c                s   g | ]} j | qS r   )items)rB   rC   )csir   r   rD   k   s    FDSelectc                s   g | ]} j | qS r   )gidArray)rB   rC   )selr   r   rD   p   s    c                s   i | ]\}}| kr||qS r   r   )rB   r+   v)r#   r   r   
<dictcomp>x   s   z!subset_glyphs.<locals>.<dictcomp>c                s   g | ]}| kr|qS r   r   )rB   r+   )r#   r   r   rD   {   s    r   T)r9   r:   )r   r!   r"   r#   unionZglyphs_emptiedcharsetr2   ZcharStringsAreIndexed	enumerateZcharStringsIndexrE   fileoffsetsr3   rG   formatrH   ZcharStringsr   Z	numGlyphsr?   Zretain_gidsr>   r=   )r   r)   r   r@   r*   csr+   r;   _indicesZnewCharStringsZ
indicesIdxZ
charsetIdxr9   r   )rF   r#   rI   r   subset_glyphsZ   sB     




rU   c             C   s   | j }xtdt|D ]}|| dkrft||d  ts<t|j||d  |j |j	 ||d < q|| dkrt||d  tst|j||d  |j |j	 ||d < qW d S )Nr   ZcallsubrZ	callgsubr)
r8   ranger   
isinstanceintr    _usedr   	_old_bias	_new_bias)r   r-   ZgsubrsprC   r   r   r   subset_subroutines   s    *r]   c             C   s6  | j }|jr4| j}x t|jD ]}||d |= qW |jr|jrT|j|jd ksTt| j|jd  | _| jsx| 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}xN|t|k r|| dkr|d t|kst|||d = q|d7 }qW t| js.t| ` d S )N   r   r0   r7   z5CFF2 CharStrings must not have an initial width value)ZhintmaskZcntrmaskr   )_hints	deletionsr8   reversedhas_hint	last_hintr    appendr3   r7   r&   r5   insertr6   has_hintmaskr   )r   hintsr\   idxrC   r   r   r   
drop_hints   s2    
ri   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_MarkingT2Decompilerc             C   s>   t j| ||| x&||gD ]}|rt|dst |_qW d S )NrY   )r   r
   r   r3   r$   rY   )r   r   r   r&   r-   r   r   r   r      s    z_MarkingT2Decompiler.__init__c             C   s,   | j j| jd | j  tj| | d S )N)r   rY   r   operandStack	localBiasr   r
   op_callsubr)r   r   r   r   r   rn      s    z _MarkingT2Decompiler.op_callsubrc             C   s,   | j j| jd | j  tj| | d S )Nrk   )r   rY   r   rl   
globalBiasr   r
   op_callgsubr)r   r   r   r   r   rp      s    z!_MarkingT2Decompiler.op_callgsubrN)r   r   r   r   rn   rp   r   r   r   r   rj      s   	rj   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   )rb   rc   last_checkedstatusrf   r`   )r   r   r   r   r      s    z%_DehintingT2Decompiler.Hints.__init__N)r   r   r   r   r   r   r   r   Hints   s   rt   Nc             C   s$   || _ tj| |||| || _d S )N)_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rJ| j	| |j
dkrx>t|jt|jd D ]$}t|j| trd|_
P qld|_
qlW t|j|_|r|j|jkstd S )Nr_   r^   r   )r3   r_   rt   r   rv   r'   rb   rf   ru   r   rs   rV   rr   r   r8   rW   str__dict__r    )r   Z
charStringZ	old_hintsrg   rC   r   r   r   r'      s    


z_DehintingT2Decompiler.executec             C   s4   | j | jd | j  }tj| | | || d S )Nrk   )r   rl   rm   r   rv   rn   processSubr)r   r   subrr   r   r   rn     s    z"_DehintingT2Decompiler.op_callsubrc             C   s4   | j | jd | j  }tj| | | || d S )Nrk   )r   rl   ro   r   rv   rp   rz   )r   r   r{   r   r   r   rp     s    z#_DehintingT2Decompiler.op_callgsubrc             C   s   t j| | | | d S )N)r   rv   op_hstemprocessHint)r   r   r   r   r   r|     s    z_DehintingT2Decompiler.op_hstemc             C   s   t j| | | | d S )N)r   rv   op_vstemr}   )r   r   r   r   r   r~     s    z_DehintingT2Decompiler.op_vstemc             C   s   t j| | | | d S )N)r   rv   
op_hstemhmr}   )r   r   r   r   r   r     s    z!_DehintingT2Decompiler.op_hstemhmc             C   s   t j| | | | d S )N)r   rv   
op_vstemhmr}   )r   r   r   r   r   r     s    z!_DehintingT2Decompiler.op_vstemhmc             C   s   t j| |}| | |S )N)r   rv   op_hintmaskprocessHintmask)r   r   rvr   r   r   r     s    
z"_DehintingT2Decompiler.op_hintmaskc             C   s   t j| |}| | |S )N)r   rv   op_cntrmaskr   )r   r   r   r   r   r   r     s    
z"_DehintingT2Decompiler.op_cntrmaskc             C   sv   | j d }|j}d|_|jdkrhxFt|j|d D ]}t|j| tr2d|_P q2W d|_	|d |_
d|_|d |_d S )Nrk   Tr^   r   r   )callingStackr_   rf   rs   rV   rr   rW   r8   rx   rb   rc   )r   r   rR   rg   rC   r   r   r   r   !  s    


z&_DehintingT2Decompiler.processHintmaskc             C   s&   | j d }|j}d|_||_||_d S )Nrk   T)r   r_   rb   rc   rr   )r   r   rR   rg   r   r   r   r}   2  s
    
z"_DehintingT2Decompiler.processHintc             C   s   | j d }|j}|j}|jdkrXx0t|j|d D ]}t|j| tr2d|_P q2W ||_|jdkr|jrd|_|jdkr||_	q|d |_	n|jdkr|j
| t|j|j|_d S )Nrk   r^   r   Tr   )r   r_   rs   rV   rr   rW   r8   rx   rb   rc   r`   rd   max)r   r   r{   rR   rg   Z
subr_hintsrC   r   r   r   rz   9  s$    




z"_DehintingT2Decompiler.processSubr)N)r   r   r   objectrt   r   r'   rn   rp   r|   r~   r   r   r   r   r   r}   rz   r   r   r   r   rq      s   
rq   c                s   | j }xp| D ]d}|| }|j}t|dr|j}t|jfdd|jD |_|j  fddD  _ `	 `
qW |jr|  |js|   n|js|   dS )NrG   c                s   g | ]}  |qS r   )r   )rB   ss)rT   r   r   rD   b  s    z%prune_post_subset.<locals>.<listcomp>c                s   g | ]} | qS r   r   )rB   rC   )arrr   r   rD   d  s    T)r   r!   r"   r3   rG   r   rH   r1   rE   rO   rP   desubroutinizeZhintingremove_hintsremove_unused_subroutines)r   ZttfFontr?   r   r@   r*   rR   rI   r   )r   rT   r   prune_post_subsetW  s$    


r   c             C   s*   t | dr&| js&d| jkr"| jd= | `d S )Nr   )r3   r   ZrawDict)Zprivate_dictr   r   r   _delete_empty_subrss  s    
r   z)use 'CFFFontSet.desubroutinize()' instead)categoryc             C   s   | j   d S )N)r   r   )r   r   r   r   r   z  s    r   c          	   C   s  | j }x| D ]}|| }|j}t }xb|jD ]X}||\}}|  t|jdg }	t	||	|j
|jj|jj|j}
|
| |
j|_q2W x|D ]}|  qW ~g }t|dr|dd |jD  n||j x0|D ](}x"dD ]}t||rt||d  qW qW qW |   d S )Nr   r1   c             s   s   | ]}|j V  qd S )N)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$   rM   r2   Z	decompiler%   r&   rq   r   r6   r5   r'   r7   ri   r3   extendr1   rd   r4   setattrr   )r   r   r@   r*   rR   rw   r+   r;   rS   r-   r.   Z
charstringZ	all_privsZprivkr   r   r   r     s6    






r   c                s:  | j }x,| D ]}|| }|j}xD|jD ]:}||\}}t|jdg  t |j|j}|	| q.W |j
g}	t|dr|	dd |jD  n"t|jdr|jjr|	|jj t  xD|	D ]< t dst  _t j _t  _t j _qW x:|jD ]0}||\}}t|jdg  | |j
 qW x|	D ]  |j
krt|ds|t|jdr||jj}
ng }
n }
 fdd jD  _t dr `t d	r `x jD ]}||
|j
 qW qHW t|drx&|jD ]}t|j qW n
t|j x|	D ]  ` ` `qW qW 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   )rB   r   r   r   r   r     s    z,remove_unused_subroutines.<locals>.<genexpr>rY   c                s   g | ]} j | qS r   )rE   )rB   rC   )r-   r   r   rD     s    z-remove_unused_subroutines.<locals>.<listcomp>rO   rP   )r   r!   r"   rM   r2   r%   r&   rj   r   r'   ZGlobalSubrsr3   r   r1   r4   r   rd   r$   rY   r   r   ZcalcSubrBiasrZ   r[   r]   rE   rO   rP   r   )r   r   r@   r*   rR   r+   r;   rS   r.   Z	all_subrsZlocal_subrsr{   r   r   )r-   r   r     sX    






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   rU   ZT2CharStringr]   ri   rj   rv   rq   r   r   DeprecationWarningr   r   r   r   r   r   r   <module>   s*   
-$ 
5