a
    <`0%                     @   sz  d Z ddlmZmZmZ ddlmZ ddlmZ ddl	Z	ddl
Z
dZdZdZz0zddlmZ W n eyx   ddlZY n0 W n ey   dZY n0 d	ZG d
d deZG dd deZd8ddZd9ddZdZdZd:ddZd;ddZdd Zdd Zdd Zd<d d!Zd"Z e
j!d#e
j"d$Z#d%Z$d&Z%d'Z&e
!d(Z'd)d* Z(d+d, Z)d-d. Z*d/d0 Z+e
!d1Z,d2d3 Z-d4d5 Z.d6d7 Z/dS )=a  fontTools.t1Lib.py -- Tools for PostScript Type 1 fonts (Python2 only)

Functions for reading and writing raw Type 1 data:

read(path)
	reads any Type 1 font file, returns the raw data and a type indicator:
	'LWFN', 'PFB' or 'OTHER', depending on the format of the file pointed
	to by 'path'.
	Raises an error when the file does not contain valid Type 1 data.

write(path, data, kind='OTHER', dohex=False)
	writes raw Type 1 data to the file pointed to by 'path'.
	'kind' can be one of 'LWFN', 'PFB' or 'OTHER'; it defaults to 'OTHER'.
	'dohex' is a flag which determines whether the eexec encrypted
	part should be written as hexadecimal or binary, but only if kind
	is 'OTHER'.
    )bytechrbyteord	bytesjoin)eexec)getMacCreatorAndTypeNZjvrz1.0b2)Res   c                   @   s   e Zd ZdS )T1ErrorN)__name__
__module____qualname__ r   r   7lib/python3.9/site-packages/fontTools/t1Lib/__init__.pyr	   (       r	   c                   @   sD   e Zd ZdZdddZdddZd	d
 Zdd Zdd Zdd Z	dS )T1FontzkType 1 font class.

	Uses a minimal interpeter that supports just about enough PS to parse
	Type 1 fonts.
	asciiNc                 C   sf   |d u rt |\| _}nD|dkr,t|| _n0|dkr@t|| _n|dkrTt|| _nt||| _d S )NLWFNPFBOTHER)readdatareadLWFNreadPFB	readOther
ValueErrorencoding)selfpathr   kind_r   r   r   __init__3   s    zT1Font.__init__Fc                 C   s   t ||  || d S N)writegetData)r   r   typedohexr   r   r   saveAs@   s    zT1Font.saveAsc                 C   s   | j S r!   )r   r   r   r   r   r#   C   s    zT1Font.getDatac                 C   s   | d S )a^  Return a generic GlyphSet, which is a dict-like object
		mapping glyph names to glyph objects. The returned glyph objects
		have a .draw() method that supports the Pen protocol, and will
		have an attribute named 'width', but only *after* the .draw() method
		has been called.

		In the case of Type 1, the GlyphSet is simply the CharStrings dict.
		CharStringsr   r'   r   r   r   getGlyphSetH   s    	zT1Font.getGlyphSetc                 C   s   t | ds|   | j| S )Nfont)hasattrparser*   )r   keyr   r   r   __getitem__S   s    
zT1Font.__getitem__c           
      C   s   ddl m} ddl m} || j| j| _| jd }| jd dd}|dksRJ | jd d }| D ]2\}}t	
|d	\}}|j||d  |d
||< qhtt|D ]2}	t	
||	 d	\}}|j||d  |d
||	< q| `d S )Nr   )psLib)psCharStringsr(   ZPrivatelenIV   ZSubrsi  )subrs)fontTools.miscr/   r0   Zsuckfontr   r   r*   getitemsr   decryptZT1CharStringrangelen)
r   r/   r0   ZcharStringsr1   r3   Z	glyphNameZ
charStringRir   r   r   r,   X   s     
zT1Font.parse)r   N)F)
r
   r   r   __doc__r    r&   r#   r)   r.   r,   r   r   r   r   r   +   s   

r   Fc                 C   s`   t j| \}}| }t| \}}|dkr:t| |dfS |dkrPt| |dfS t| dfS dS )z,reads any Type 1 font file, returns raw datar   z.pfbr   r   N)osr   splitextlowerr   r   r   r   )r   
onlyHeaderr   extZcreatortypr   r   r   r   l   s    r   r   c                 C   s   t | | }zt|  W n tjy2   Y n0 d}zh|dkrNt| | n |dkrbt| | nt| || d}W |rtszt|  W q tjy   Y q0 n.|rtszt|  W n tjy   Y n0 0 d S )Nr   r   r   r   )	assertType1upperr=   removeerror	writeLWFNwritePFB
writeOtherDEBUG)r   r   r   r%   errr   r   r   r"   x   s0    r"   i  P   c              	   C   s  ddl m} || }zg }|dg D ]}t|jd }t|jd dkrRtd|dv r|rj|dkrj q||jdd  q&|d	v r qq&|d
krt| d}||  W d   q1 s0    Y  q&|dkrq&tdt	| q&W |
  n
|
  0 t|}t| |S )z)reads an LWFN font file, returns raw datar   )ResourceReaderPOSTr   zcorrupt LWFN filer      rP   N)      r2   rbbad chunk code: )ZfontTools.misc.macResrM   r5   r   r   r	   appendopenr   reprcloser   rC   )r   r@   rM   readerr   rescodefr   r   r   r      s0    .r   c                 C   s   g }t | d}|dtdkr*tdt|d}|dv rtt|d}||}t||kshJ || n|dkrqntdt| |rqqW d	   n1 s0    Y  t	|}t
| |S )
z'reads a PFB font file, returns raw datarS   r      zcorrupt PFB filerO   r2   rQ   rT   N)rV   r   r   r	   r   stringToLongr9   rU   rW   r   rC   )r   r@   r   r\   r[   Zchunklenchunkr   r   r   r      s$    
"r   c                 C   s   t | d}| }W d   n1 s(0    Y  t| t|}g }|D ]6\}}|rvt|dd rv|t| qJ|| qJt|S )z'reads any (font) file, returns raw datarS   Nr2   )rV   r   rC   findEncryptedChunksisHexrU   deHexStringr   )r   r\   r   chunksisEncryptedr_   r   r   r   r      s    &r   c           	   	   C   s   t | ddd t | d}zt | d}t|}|D ]d\}}|rJd}nd}|r8t t|d |d td   }|d|d	 |td d  }|d }qNq8t td
d }|d|d	 W t 	| nt 	| 0 d S )NZjustr   r   rP   i  r    rN    rR   )
r   ZFSpCreateResFileZFSOpenResFileZ
UseResFiler`   ZResourcer   LWFNCHUNKSIZEZAddResourceZCloseResFile)	r   r   ZresRefZresIDrc   rd   r_   r[   rZ   r   r   r   rG      s$    
"rG   c                 C   s   t |}t| dt}|D ]H\}}|r*d}nd}|tdt|  |tt| || q|tdtd  W d    n1 s0    Y  d S )NwbrP   r   r]   rQ   )r`   rV   r"   r   longToStringr9   )r   r   rc   r\   rd   r_   r[   r   r   r   rH      s    rH   c           	   	   C   s   t |}t| d}td }|D ]b\}}|r2d}nd}|dkrx|rx|r|t|d |  |d ||d  }qBq || q W d    n1 s0    Y  d S )Nrh   rP   r      )r`   rV   HEXLINELENGTHr"   r   Z	hexString)	r   r   r%   rc   r\   Z
hexlinelenrd   r_   r[   r   r   r   rI      s    
rI      currentfile eexecs   (0[ 	
]*){512})flagss   currentfile closefiles   %-- eexec starts   %-- eexec ends   [0-9A-Fa-f]*$c                 C   s   t | d uS r!   )_ishexREmatch)textr   r   r   ra     s    ra   c                 C   s  t | }g } |D ]\}}|rt|d d r4t|}t|d\}}|dd  }|tt d d tkr|tt d d tkrtd|d tt d  d }| t	| t
  q|tt d d tkr| |d tt d   q| | qt| S )	Nr2   q  r   rP   zinvalid end of eexec partrj   )r`   ra   rb   r   r7   r9   EEXECINTERNALENDr	   rU   EEXECBEGINMARKEREEXECENDMARKER
EEXECBEGINr   )r   rc   rd   r_   Z	decryptedr:   r   r   r   decryptType1   s$    rx   c           	      C   s   g }|  t}|dk rq|tt d }t| |}|d u rDtd| }| ||d  }t|d d rtt|}t	
|d\}}| t}|dk rtd|d| d | f |d|d |tt d  f | |d  } q|d| f |S )Nr   r   zcan't find end of eexec partrP   r2   rq   )findrw   r9   EEXECENDsearchr	   startra   rb   r   r7   rt   rU   )	r   rc   ZeBeginZendMatchZeEndZ
cypherTextZ	plainTextr:   Z	eEndLocalr   r   r   r`   5  s*    

"r`   c                 C   s   t t|  S r!   )r   rb   r   split)Z	hexstringr   r   r   rb   M  s    rb   s   /FontType\s+1\s+defc                 C   sV   dD ]}| d t | |kr q*qtdt| s<td| ddk rRtd| S )N)s   %!PS-AdobeFonts   %!FontType1znot a PostScript fontznot a Type 1 fontrl   r   znot an encrypted Type 1 font)r9   r	   _fontType1REr{   ry   )r   headr   r   r   rC   U  s    
rC   c                 C   s6   d}t dD ]$}|t| d|d > @ |d ? 7 }q|S )Nr   r2         )r8   r   )Zlongsr;   r   r   r   ri   e  s    "ri   c                 C   sB   t | dkrtdd}tdD ]}|t| | |d > 7 }q |S )Nr2   zstring must be 4 bytes longr   r   )r9   r   r8   r   )r   lr;   r   r   r   r^   k  s    r^   )F)r   F)F)F)F)0r<   ZfontTools.misc.py23r   r   r   r4   r   ZfontTools.misc.macCreatorTyper   r=   re
__author____version__rJ   ZCarbonr   ImportErrorZhaveMacSupport	Exceptionr	   objectr   r   r"   rg   rk   r   r   r   rG   rH   rI   rw   compileMrz   rt   ru   rv   rn   ra   rx   r`   rb   r~   rC   ri   r^   r   r   r   r   <module>   sT   
A






