o
    Ðùa5%  ã                   @   sz  d Z ddlmZ ddlmZ ddlmZmZmZ ddl	Z	ddl
Z
dZdZdZzzddlmZ W n ey<   ddlZY nw W n eyI   dZY nw d	ZG d
d„ deƒZG dd„ deƒZd8dd„Zd9dd„ZdZdZd8dd„Zd8dd„Zdd„ Zdd„ Zdd„ Zd8d 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'.
é    )Úeexec)ÚgetMacCreatorAndType)ÚbytechrÚbyteordÚ	bytesjoinNZjvrz1.0b2)ÚResé   c                   @   s   e Zd ZdS )ÚT1ErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú:/usr/lib/python3/dist-packages/fontTools/t1Lib/__init__.pyr	   (   s    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 |ƒ\| _}n"|dkrt|ƒ| _n|dkr t|ƒ| _n|dkr*t|ƒ| _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s)J ‚| jd d }| ¡ D ]\}}t	 
|d	¡\}}|j||d … |d
||< q4tt|ƒƒD ]}	t	 
||	 d	¡\}}|j||d … |d
||	< qT| `d S )Nr   )ÚpsLib)ÚpsCharStringsr'   ZPrivateÚlenIVé   ZSubrsiê  )Úsubrs)ÚfontTools.miscr.   r/   Zsuckfontr   r   r)   ÚgetÚitemsr   ÚdecryptZT1CharStringÚrangeÚlen)
r   r.   r/   ZcharStringsr0   r2   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r(t| |ƒdfS t| ƒdfS )z,reads any Type 1 font file, returns raw datar   z.pfbr   r   )Ú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y   Y nw d}z9|dkr't| |ƒ n|dkr1t| |ƒ nt| ||ƒ d}W |rRtsTzt | ¡ W d S  tjyQ   Y d S w d S d S |rltsmzt | ¡ W w  tjyk   Y w w w w )Nr   r   r   r   )	ÚassertType1Úupperr=   ÚremoveÚerrorÚ	writeLWFNÚwritePFBÚ
writeOtherÚDEBUG)r   r   r   r$   Úerrr   r   r   r!   x   s8   ÿÿýÿýr!   iÐ  éP   c              	   C   s  ddl m} || ƒ}zog }| dg ¡D ]`}t|jd ƒ}t|jd ƒdkr)tdƒ‚|dv r@|r5|dkr5 n?| |jdd… ¡ q|d	v rF n.|d
krgt| dƒ}| | ¡ ¡ W d  ƒ n1 saw   Y  q|dkrlqtdt	|ƒ ƒ‚W | 
¡  n| 
¡  w t|ƒ}t|ƒ |S )z)reads an LWFN font file, returns raw datar   )ÚResourceReaderÚPOSTr   zcorrupt LWFN file©r   é   rP   N)é   é   r1   Úrbúbad chunk code: )ZfontTools.misc.macResrM   r4   r   r   r	   ÚappendÚopenr   ÚreprÚcloser   rC   )r   r@   rM   Úreaderr   ÚresÚcodeÚfr   r   r   r   –   s6   ÿ€€r   c                 C   sÊ   g }t | dƒL}	 | d¡tdƒkrtdƒ‚t| d¡ƒ}|dv r;t| d¡ƒ}| |¡}t|ƒ|ks5J ‚| |¡ n|dkr@ntd	t|ƒ ƒ‚|rKnq	W d
  ƒ n1 sVw   Y  t	|ƒ}t
|ƒ |S )z'reads a PFB font file, returns raw datarS   Tr   é€   zcorrupt PFB filerO   r1   rQ   rT   N)rV   r   r   r	   r   ÚstringToLongr8   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w   Y  t|ƒ t|ƒ}g }|D ]\}}|r;t|dd… ƒr;| t|ƒ¡ q%| |¡ q%t|ƒS )z'reads any (font) file, returns raw datarS   Nr1   )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¡}zYt  |¡ d}t|ƒ}|D ]3\}}|r%d}nd}|rOt  t|ƒd |d td …  ¡}| d|d	¡ |td d … }|d }|s)qt  td
ƒd ¡}| d|d	¡ W t  	|¡ d S t  	|¡ w )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ƒ;}|D ]$\}}|rd}nd}| tdƒt|ƒ ¡ | tt|ƒƒ¡ | |¡ q| tdƒtdƒ ¡ W d   ƒ d S 1 sGw   Y  d S )NÚwbrP   r   r]   rQ   )r`   rV   r!   r   ÚlongToStringr8   )r   r   rc   r\   rd   r_   r[   r   r   r   rH   ñ   s   "÷rH   c           	   	   C   sª   t |ƒ}t| dƒB}td }|D ]2\}}|rd}nd}|dkr=|r=|r<| t |d |… ¡¡ | d¡ ||d … }|s#q| |¡ qW d   ƒ d S 1 sNw   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 ]v\}}|r]t|d d… ƒrt|ƒ}t |d¡\}}|dd … }|ttƒ d d… tkrF|ttƒ d d… tkrFtdƒ‚|d ttƒ d … d }|  t	| t
 ¡ q|ttƒ d d… tkry|  |d ttƒ d … ¡ q|  |¡ qt| ƒS )	Nr1   éqÙ  r   éÿÿÿÿrP   éþÿÿÿzinvalid end of eexec partrj   )r`   ra   rb   r   r6   r8   ÚEEXECINTERNALENDr	   rU   ÚEEXECBEGINMARKERÚEEXECENDMARKERÚ
EEXECBEGINr   )r   rc   rd   r_   Z	decryptedr9   r   r   r   ÚdecryptType1   s$   ÿrx   c           	      C   sø   g }	 |   t¡}|dk rnf|ttƒ d }t | |¡}|d u r#tdƒ‚| ¡ }| ||d … }t|d d… ƒr;t|ƒ}t	 
|d¡\}}|  t¡}|dk rPtdƒ‚| d| d |… f¡ | d|d |ttƒ d … f¡ | |d … } q| d| f¡ |S )NTr   r   zcan't find end of eexec partrP   r1   rq   )Úfindrw   r8   ÚEEXECENDÚsearchr	   Ústartra   rb   r   r6   rt   rU   )	r   rc   ZeBeginZendMatchZeEndZ
cypherTextZ	plainTextr9   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 nqtdƒ‚t | ¡stdƒ‚|  d¡dk r)tdƒ‚| S )N)s   %!PS-AdobeFonts   %!FontType1znot a PostScript fontznot a Type 1 fontrl   r   znot an encrypted Type 1 font)r8   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 )Nó    r1   éÿ   é   )r7   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 )Nr1   zstring must be 4 bytes longr   r‚   )r8   r   r7   r   )rƒ   Úlr:   r   r   r   r^   k  s   r^   r;   )r   F)0r<   r3   r   ZfontTools.misc.macCreatorTyper   ZfontTools.misc.textToolsr   r   r   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>   s\    ÿ€ÿ
A





