
    <`yM                     P   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 Z
d Z G d d	ej                  Z e
 ej        d
                    d             Zd dZ e
 ej        d
                    d             Z e
 ej        d
                    d             Z e
ej                  d             Z e
ej                  d             Z G d dej                  Z G d dej                  Z G d de          Z G d dej                  Z e
 ej        d
                    d             Zd Z e
 ej        d
                    d             Z e
 ej        d
                    d             Z e
 ej        d
                    d             Z dS )!    )psCharStrings)ttLib)NullPen)otRound)VarStoreInstancerc                        fd}|S )zLReturns a decorator function that adds a new method to one or
	more classes.c                     g }D ]w}||v r|                     |           |j        dk    s
J d            t          || j                  rJ d|j        d| j        d            t          || j        |            xd S )NDefaultTablezOops, table class not found.zOops, class 'z' has method 'z'.)append__name__hasattrsetattr)methoddoneclazzclazzess      4lib/python3.11/site-packages/fontTools/subset/cff.pywrapperz_add_method.<locals>.wrapper
   s    	$ + +etmmX;;u
.N
*
*
*# +
*
*eV_-- ! ! !,1NNN!! ! ! 5&/6****	     )r   r   s   ` r   _add_methodr      s#         	r   c                 :    t          t          |                     S N)sortedset)ls    r   
_uniq_sortr      s    s1vvr   c                       e Zd Zd Zd ZdS )_ClosureGlyphsT2Decompilerc                 V    t           j                            | ||           || _        d S r   )r   SimpleT2Decompiler__init__
components)selfr#   
localSubrsglobalSubrss       r   r"   z#_ClosureGlyphsT2Decompiler.__init__   s2    "++D		   $///r   c                 
   |                                  }t          |          dk    r[ddlm} |dd          \  }}}}||         }||         }	| j                            |           | j                            |	           d S d S )N   r   )StandardEncoding)popalllen$fontTools.encodings.StandardEncodingr)   r#   add)
r$   indexargsr)   adxadybcharachar	baseGlyphaccentGlyphs
             r   
op_endcharz%_ClosureGlyphsT2Decompiler.op_endchar#   s    	$YY!^^DDDDDD !I3UE&9!%(;?y!!!?{##### ^r   N)r   
__module____qualname__r"   r7   r   r   r   r   r      s2          
$ 
$ 
$ 
$ 
$r   r   zCFF c                    | j         }t          |          dk    sJ ||                                d                  }|j        }|j        }|rt                      }|D ]P}||vr||         }t          |j        dg           }	t          ||	|j	                  }
|

                    |           Q||j        z  }|j                            |           |}|d S d S )N   r   Subrs)cffr,   keysCharStringsglyphsr   getattrprivater   r&   executeupdate)r$   sr=   fontglyphSet	decomposer#   gglsubrs
decompilers              r   closure_glyphsrM   /   s    xCACHHJJqMX uu*  ax22:w++5*:ubnMM:b*(//*)      r   Fc                    | j                             |          \  }}|s|r"|                                 |rg ndg|_        d S t	          | d          r| j        | j        |         j        }n| j        }|j        }|j        }t                      }	|
                    |	           |j        |k    r|j        |z
  dg|_        d S dg|_        d S )NendcharFDArray)r?   getItemAndSelector	decompileprogramr   rP   PrivatedefaultWidthXnominalWidthXr   drawwidth)
rF   	glyphNameisCFF2ignoreWidthcfdSelectIndexrB   dfltWdXnmnlWdXpens
             r   _empty_charstringra   E   s    $77	BBM
 k ++---+bb!)))T9 $,":\-(077\7!'!'		#&&+++W'!9-1999{1999r   c                    | j         }|j        d d         |_        |j        rC|j        s<|j        dk    }|                                D ]}||         }t          |d|           |                                D ]}||         }d|_        dS )Nr;   z.notdef)rZ   r)   T)r=   	fontNamesnotdef_glyphnotdef_outlinemajorr>   ra   Encoding)r$   rF   optionsr=   rZ   fontnames         r   prune_pre_subsetrj   Y   s    xrr" 5!7 59q=&((** 5 5h
h-4T9V44444  % %X	X$$$--r   c                 Z  
 | j         }|                                D ]}||         }|j        }|j                            |j                  |j        D ]}|vr|                    |          \  }} |j        rfdt          |j                  D             |j
        

fdD             
_        
`
`t          |d          r!|j        d_        fdD             _        fd|j                                        D             |_        n*fd|j                                        D             |_        fd|j        D             |_        t'          |j                  |_        |j        j        r(|j        d	k    }	|j        D ]}t1          |||	d
           d
S )Nc                 "    g | ]\  }}|v 	|S r   r   ).0irI   r@   s      r   
<listcomp>z!subset_glyphs.<locals>.<listcomp>|   s"    BBBCAaa6kkakkkr   c                 *    g | ]}j         |         S r   items)rm   rn   csis     r   ro   z!subset_glyphs.<locals>.<listcomp>~   s    ...	!...r   FDSelect   c                 *    g | ]}j         |         S r   )gidArray)rm   rn   sels     r   ro   z!subset_glyphs.<locals>.<listcomp>   s    555CLO555r   c                 J    i | ]\  }}|v 	|                     |           S r   r/   )rm   rI   vr@   indicess      r   
<dictcomp>z!subset_glyphs.<locals>.<dictcomp>   s<       1Q
v++ w}}Q''
++r   c                 $    i | ]\  }}|v 	||S r   r   )rm   rI   r{   r@   s      r   r}   z!subset_glyphs.<locals>.<dictcomp>   s0       1Q
v++ q
++r   c                     g | ]}|v |	S r   r   )rm   rI   r@   s     r   ro   z!subset_glyphs.<locals>.<listcomp>   s    999Q&[[![[[r   r;   T)rZ   r[   )r=   r>   r?   r@   unionglyphs_emptiedcharsetrQ   charStringsAreIndexed	enumeratecharStringsIndexrr   fileoffsetsr   rt   formatrw   charStringsr,   	numGlyphsrh   retain_gidsrf   ra   )r$   rE   r=   ri   rF   csrI   r\   _rZ   rs   r@   r|   rx   s             @@@@r   subset_glyphsr   m   s   x *@ *@X	X$"8>>!*++& < # #avoox



"
"41aa BBBB9T\22BBB7		3....g...39
xdJ 6
-C CJ5555W555CL    .&&((  2>>   .&&((  2> :999T\999$,t|$$$. Y @IM6 @ @qdAf$????? 	r   c                    | j         }t          dt          |                    D ]}||         dk    rZt          ||dz
           t                    sJ |j                            ||dz
           |j        z             |j        z
  ||dz
  <   h||         dk    rYt          ||dz
           t                    sJ |j                            ||dz
           |j        z             |j        z
  ||dz
  <   d S )Nr;   callsubr	callgsubr)	rS   ranger,   
isinstanceint_usedr/   	_old_bias	_new_bias)r$   rK   gsubrsprn   s        r   subset_subroutinesr      s    	\
3q66

 M MQqTZ
QqsVS
!
!!!!Ka!fu677%/I1QqS66t{
QqsVS
!
!!!!Lq1v(8899F<LL1QqS6M Mr   c                    | j         }|j        r&| j        }t          |j                  D ]
}||dz
  |= |j        r|j        r|j        |j        d         k    sJ | j        |j        d          | _        | j        s| j                            d           t          | d          rX| j        | j	        j
        k    rC| j	        j
        
J d            | j                            d| j        | j	        j        z
             |j        r_d}| j        }|t          |          k     rC||         dv r!|dz   t          |          k    sJ |||dz   = >|dz  }|t          |          k     Ct          | j                  sJ | ` d S )N   r   rO   rX   z5CFF2 CharStrings must not have an initial width value)hintmaskcntrmaskr;   )_hints	deletionsrS   reversedhas_hint	last_hintr   r   rX   rB   rU   insertrV   has_hintmaskr,   )r$   hintsr   idxrn   s        r   
drop_hintsr      s   		O 
l!eo&&  cQs||	N D_E5?13E E E E Eeo../$,	 "<y!!!T7 D
jDL...<%113j111L4:(BBCCC	 
!
l!	CFF

d&&&q5CFF????	!AaC%61 	
CFF

 	DL	[[[r   c                        e Zd Zd Zd Zd ZdS )_MarkingT2Decompilerc                     t           j                            | |||           ||fD ]'}|r#t          |d          st	                      |_        (d S )Nr   )r   r!   r"   r   r   r   )r$   r%   r&   rB   rK   s        r   r"   z_MarkingT2Decompiler.__init__   sm    "++D			   K(  e GE7++ %%EK r   c                     | j         j                            | j        d         | j        z              t
          j                            | |           d S N)r%   r   r.   operandStack	localBiasr   r!   op_callsubrr$   r/   s     r   r   z _MarkingT2Decompiler.op_callsubr   sI    /D-b1$.@AAA"..tU;;;;;r   c                     | j         j                            | j        d         | j        z              t
          j                            | |           d S r   )r&   r   r.   r   
globalBiasr   r!   op_callgsubrr   s     r   r   z!_MarkingT2Decompiler.op_callgsubr   sJ    T.r24?BCCC"//e<<<<<r   N)r   r8   r9   r"   r   r   r   r   r   r   r      sA          < < <= = = = =r   r   c                   z    e Zd Z G d de          ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd ZdS )_DehintingT2Decompilerc                       e Zd Zd ZdS )_DehintingT2Decompiler.Hintsc                 Z    d| _         d| _        d| _        d| _        d| _        g | _        d S )NFr   )r   r   last_checkedstatusr   r   )r$   s    r   r"   z%_DehintingT2Decompiler.Hints.__init__   s8    
 4=4> 4 4;44>>>r   N)r   r8   r9   r"   r   r   r   Hintsr      s           , $r   r   Nc                 h    || _         t          j                            | ||||           || _        d S r   )_cssr   T2WidthExtractorr"   rB   )r$   cssr%   r&   rV   rU   rB   s          r   r"   z_DehintingT2Decompiler.__init__   s=    $) ))[-@ @ @$,,,r   c                 6   t          |d          r|j        nd }|                                 |_        t          j                            | |           |j        }|j        s|j        r| j        	                    |           |j
        dk    rvt          |j        t          |j                  dz
            D ]2}t          |j        |         t                     r	d|_
         nd|_
        3t          |j                  |_        |r|j        |j        k    sJ d S d S )Nr   r   r;   )r   r   r   r   r   rC   r   r   r   r.   r   r   r   r,   rS   r   str__dict__)r$   
charString	old_hintsr   rn   s        r   rC   z_DehintingT2Decompiler.execute  s    #*:x#@#@Jjd)jjll* ((z:::

%
^ u) 9==
\Q%$c**<&=&=&ABB  q*$Q'-- U\
UU\\J.//5 /
.I.
.
.
.
./ /
.
.r   c                     | j         | j        d         | j        z            }t          j                            | |           |                     ||           d S r   )r%   r   r   r   r   r   processSubrr$   r/   subrs      r   r   z"_DehintingT2Decompiler.op_callsubr  sR    	*2.t~=	>$ ,,T59995$r   c                     | j         | j        d         | j        z            }t          j                            | |           |                     ||           d S r   )r&   r   r   r   r   r   r   r   s      r   r   z#_DehintingT2Decompiler.op_callgsubr  sS    		$+B/?	@$ --dE:::5$r   c                 p    t           j                            | |           |                     |           d S r   )r   r   op_hstemprocessHintr   s     r   r   z_DehintingT2Decompiler.op_hstem$  5     ))$6665r   c                 p    t           j                            | |           |                     |           d S r   )r   r   op_vstemr   r   s     r   r   z_DehintingT2Decompiler.op_vstem'  r   r   c                 p    t           j                            | |           |                     |           d S r   )r   r   
op_hstemhmr   r   s     r   r   z!_DehintingT2Decompiler.op_hstemhm*  5     ++D%8885r   c                 p    t           j                            | |           |                     |           d S r   )r   r   
op_vstemhmr   r   s     r   r   z!_DehintingT2Decompiler.op_vstemhm-  r   r   c                 p    t           j                            | |          }|                     |           |S r   )r   r   op_hintmaskprocessHintmaskr$   r/   rvs      r   r   z"_DehintingT2Decompiler.op_hintmask0  3    %11$>>"u	)r   c                 p    t           j                            | |          }|                     |           |S r   )r   r   op_cntrmaskr   r   s      r   r   z"_DehintingT2Decompiler.op_cntrmask4  r   r   c                    | j         d         }|j        }d|_        |j        dk    r\t	          |j        |dz
            D ]+}t          |j        |         t                    r	d|_         n,d|_	        |dz   |_
        d|_        |dz   |_        d S )Nr   Tr   r;   r   )callingStackr   r   r   r   r   r   rS   r   r   r   )r$   r/   r   r   rn   s        r   r   z&_DehintingT2Decompiler.processHintmask9  s    "
)%%
\Q%$eai00  q"*Q-%% U\
U
 ENaiEOELqy%r   c                 X    | j         d         }|j        }d|_        ||_        ||_        d S )Nr   T)r   r   r   r   r   )r$   r/   r   r   s       r   r   z"_DehintingT2Decompiler.processHintJ  s2    "
)%%.%/%r   c                    | j         d         }|j        }|j        }|j        dk    rKt          |j        |dz
            D ]+}t          |j        |         t                    r	d|_         n,||_        |j        dk    r,|j        r$d|_        |j        dk    r||_	        n0|dz
  |_	        n%|j        dk    r|j
                            |           t          |j        |j                  |_        d S )Nr   r   r;   Tr   )r   r   r   r   r   r   rS   r   r   r   r   r   max)r$   r/   r   r   r   
subr_hintsrn   s          r   r   z"_DehintingT2Decompiler.processSubrQ  s   "
)%{* \Q%$eai00  q"*Q-%% U\
U 5
\Q !EN AU__qyU_A?%   U\:#455%,,,r   r   )r   r8   r9   objectr   r"   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s           V   2   / / /0     
     
            
! ! !"  6 6 6 6 6r   r   c                       e Zd ZdS )StopHintCountEventN)r   r8   r9   r   r   r   r   r   n  s        r   r   c                   >    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
dS )_DesubroutinizingT2Decompiler)r   r   
op_rmoveto
op_hmoveto
op_vmovetoNc                 J    t           j                            | |||           d S r   )r   r!   r"   )r$   r%   r&   rB   s       r   r"   z&_DesubroutinizingT2Decompiler.__init__x  s0    "++D*k    r   c                 R   d| _         | j        D ]}t          | || j                   t	          |d          rJ| j         rA| j        r:	 t          j                            | |           n# t          $ r | j        d= Y nw xY wd S g |_
        t          j                            | |           |j        d d          }t          |j
                  D ]p\  }}|dk    sJ ||dz
           dv sJ ||dz
                       t          ||dz
                     t          k    sJ |d         dk    r
|d d         }|||dz
  |<   q| j        j        sUd|v r!|d |                    d          dz            }n0t%          |          r|d         dk    r|                    d           ||_        |`
d S )	NT_desubroutinizedr   r   r;   )r   r   returnrO   )need_hintcountstop_hintcount_opsr   stop_hint_countr   r   r   r!   rC   r   _patchesrS   r   typer   rB   in_cff2r/   r,   r   r   )r$   r   op_namedesubroutinizedr   	expansions         r   rC   z%_DesubroutinizingT2Decompiler.execute|  s   $( 0 0g
4$.////Z+,, 


  d/ %--dJ????   		2				6*"**4<<<&qqq)/ !455 * *nc9
((((
#'
"&?
?
?
?QTWXQXAY
?
?
?
sQw'
(
(C
/
/
/
/mx#2#I )?3q59		 &?""%&K'<'<Y'G'G!'K&KLOO &?2#6(#B#BH%%% /*s    A( (A=<A=c                     | j         | j        d         | j        z            }t          j                            | |           |                     ||           d S r   )r%   r   r   r   r!   r   r   r   s      r   r   z)_DesubroutinizingT2Decompiler.op_callsubr  sR    	*2.t~=	>$"..tU;;;5$r   c                     | j         | j        d         | j        z            }t          j                            | |           |                     ||           d S r   )r&   r   r   r   r!   r   r   r   s      r   r   z*_DesubroutinizingT2Decompiler.op_callgsubr  sS    		$+B/?	@$"//e<<<5$r   c                     d| _         | j        D ]}t          | |d            | j        d         }t	          |d          rt                      d S )NFr   r   )r   r   r   r   r   r   )r$   r0   r   r   s       r   r   z-_DesubroutinizingT2Decompiler.stop_hint_count  sg    $(    g
4$"R#$$ 			 r   c                     t           j                            | |           | j        r|                                  d S d S r   )r   r!   r   r   r   r   s     r   r   z)_DesubroutinizingT2Decompiler.op_hintmask  sH    "..tU;;;	  r   c                     | j         d         }t          |d          s#|j                            ||j        f           d S d S )Nr   r   )r   r   r   r   r   )r$   r/   r   r   s       r   r   z)_DesubroutinizingT2Decompiler.processSubr  sP    "	'	(	( 6;ud34555556 6r   r   )r   r8   r9   r   r"   rC   r   r   r   r   r   r   r   r   r   r   t  s           $ $ $L     
     
    
6 6 6 6 6r   r   c                   	 | j         }|                                D ]r}||         }|j        }t          |d          rQ|j        }t          |j                  		fd|j        D             |_        |j        fd	D             _        `	`
s|j        r|                                  |j        s|                                  n|j        s|                                  dS )Nrt   c                 :    g | ]}                     |          S r   rz   )rm   ssr|   s     r   ro   z%prune_post_subset.<locals>.<listcomp>  s%    ==="7=="%%===r   c                      g | ]
}|         S r   r   )rm   rn   arrs     r   ro   z%prune_post_subset.<locals>.<listcomp>  s    (((1A(((r   T)r=   r>   r?   r   rt   r   rw   rP   rr   r   r   desubroutinizehintingremove_hintsremove_unused_subroutines)
r$   ttfFontrh   r=   ri   rF   r   rx   r  r|   s
           @@r   prune_post_subsetr	    s   x  X	X$" T: 	3%%7=======3<	3(((((((39
x   	 #

  #  """r   c                 b    t          | d          r| j        sd| j        v r| j        d= | `d S d S d S )Nr<   )r   r<   rawDict)private_dicts    r   _delete_empty_subrsr    sW    L'"" <+= $$$G$   r   c                    | j         }|                                D ]}||         }|j        }|j        D ]}|                    |          \  }}|                                 t          |j        dg           }t          ||j	        |j                  }	|	
                    |           |j        |_        |`t          |d          r5|j        D ],}
|
j        }t          |d          r|`d|j        v r|j        d= -|j        }t          |d          r|`d|j        v r|j        d= |j                                         d S )Nr<   rP   )r=   r>   r?   r   rQ   rR   rA   rB   r   r&   rC   r   rS   r   rP   rT   r<   r  GlobalSubrsclear)r$   r=   ri   rF   r   rI   r\   r   rK   rL   fdpds               r   r  r    se   x  X	X$"<  a



"
"41a;;===19gr**5-eQ]AINN:a!19T9 \  r	Br7 	"*	G	 	2b' 


7r   c           
         | j         }|                                D ]U}||         }|j        }t                      }|j        D ]}|                    |          \  }}|                                 t          |j        dg           }	t          ||	|j
        |j        j        |j        j        |j                  }
|
                    |           |
j        |_        |D ]}|                                 ~g }t!          |d          r%|                    d |j        D                        n|                    |j                   |D ](}dD ]#}t!          ||          rt+          ||d            $)W|                                  d S )Nr<   rP   c              3   $   K   | ]}|j         V  d S r   )rT   rm   r  s     r   	<genexpr>zremove_hints.<locals>.<genexpr>(  s$      662BJ666666r   )
BlueValues
OtherBluesFamilyBluesFamilyOtherBlues	BlueScale	BlueShiftBlueFuzz	StemSnapH	StemSnapVStdHWStdVW	ForceBoldLanguageGroupExpansionFactor)r=   r>   r?   r   r   rQ   rR   rA   rB   r   r&   rV   rU   rC   rX   r   r   extendrP   r   rT   r   r  )r$   r=   ri   rF   r   r   rI   r\   r   rK   rL   
charstring	all_privsprivks                  r   r  r    s   x . .X	X$"  	#< 	 	a



"
"41a;;===19gr**5&sE1=						 : a177  j	 )T9 "666666666DL!!!  d7  q
 tQ T1d !!!!!r   c                    | j         }|                                D ]}||         }|j        }|j        D ]`}|                    |          \  }}t          |j        dg           t          |j        |j                  }|	                    |           a|j
        g}	t          |d          r%|	                    d |j        D                        n@t          |j        d          r+|j        j        r|	                    |j        j                   t#                    |	D ]ut          d          st#                      _        t'          j                  _        t)          j                  _        t)          j        j                  _        v|j        D ]K}|                    |          \  }}t          |j        dg           |                    |j
                   L|	D ]|j
        k    r5t          |d          s"t          |j        d          r|j        j        }
ng }
n}
fdj        D             _        t          d          r`t          d          r`j        D ]}|                    |
|j
                   t          |d          r|j        D ]}t9          |j                   nt9          |j                   |	D ]```	d S )Nr<   rP   c              3   p   K   | ]1}t          |j        d           |j        j        #|j        j        V  2dS )r<   N)r   rT   r<   r  s     r   r  z,remove_unused_subroutines.<locals>.<genexpr>G  sE      qqwrzSZ?[?[q`b`j`pqBJ$qqqqqqr   r   c                 *    g | ]}j         |         S r   rq   )rm   rn   rK   s     r   ro   z-remove_unused_subroutines.<locals>.<listcomp>e  s    666Q%+a.666r   r   r   )r=   r>   r?   r   rQ   rA   rB   r   r&   rC   r  r   r%  rP   rT   r<   r   r   r   r   r   calcSubrBiasr   r   r   rr   r   r   r  )r$   r=   ri   rF   r   rI   r\   r   rL   	all_subrslocal_subrsr   r  rK   s                @r   r  r  6  s<   x >5 >5X	X$" <  a



"
"41a19gr**5$UAM19EE:a )T9 (qqt|qqqqqqqt|W%% ($,*< (DL&'''
e**%  = =e
%
!
! %%EKEK((5;"/665?"/<<5?? < 2 2a



"
"41a19gr**5 01111  < <et4## g(F(F <%[[[[K6666%+6665;eV 
eY { < <t[$*:;;;;< T9 %\ $ $r
####$ t|$$$  5 5e{EOU__5{>5 >5r   N)F)!fontTools.miscr   	fontToolsr   fontTools.pens.basePenr   fontTools.misc.roundToolsr   fontTools.varLib.varStorer   r   r   r!   r   getTableClassrM   ra   rj   r   T2CharStringr   r   r   r   r   	Exceptionr   r   r	  r  r  r  r  r   r   r   <module>r8     sc   ( ( ( ( ( (       * * * * * * - - - - - - 7 7 7 7 7 7  "  $ $ $ $ $!A $ $ $(  U (())  *)*   (  U (())  *)&  U (())/ / *)/b ]'((M M )(M ]'((! ! )(!F= = = = ==; = = =&K6 K6 K6 K6 K6]; K6 K6 K6Z       H6 H6 H6 H6 H6M$D H6 H6 H6V  U (())  *)6    U (())  *)>  U (())1" 1" *)1"h  U (())@5 @5 *)@5 @5 @5r   