o
    hQ                     @   s  d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ ddl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yR   ddlZY nw W n ey_   dZY nw dZG dd deZG dd deZdGddZdHddZdZ dZ!dGddZ"dGddZ#dd Z$dd Z%d d! Z&dGd"d#Z'd$Z(ej)d%ej*d&Z+d'Z,d(Z-d)Z.e)d*Z/d+d, Z0d-d. Z1d/d0 Z2d1d2 Z3e)d3Z4d4d5 Z5d6d7 Z6d8d9 Z7e8eZ9e9:d: e8eZ;e;<d;d<g g d=Z=d>Z>g d?Z?d@Z@dAZAdBZBdCdDgZCdEdFgZDdS )Ia  fontTools.t1Lib.py -- Tools for PostScript Type 1 fonts.

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'.
    N)eexec)getMacCreatorAndType)bytechrbyteord	bytesjointobytes)_type1_pre_eexec_order_type1_fontinfo_order_type1_post_eexec_order)StandardEncodingjvrz1.0b3)Res   c                   @   s   e Zd ZdS )T1ErrorN)__name__
__module____qualname__ r   r   l/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/t1Lib/__init__.pyr   0   s    r   c                   @   sf   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d Z
dd Zdd ZdddZdS )T1FontztType 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__;   s   
zT1Font.__init__Fc                 C   s   t ||  || d S N)writegetData)r!   r"   typedohexr   r   r   saveAsH   s   zT1Font.saveAsc                 C   s   t | ds
|  | _| jS )Nr   )hasattr
createDatar   r!   r   r   r   r(   K   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   getGlyphSetP   s   	zT1Font.getGlyphSetc                 C   s   t | ds	|   | j| S )Nfont)r,   parser1   )r!   keyr   r   r   __getitem__[   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/   PrivatelenIV   Subrs  )subrs)fontTools.miscr5   r6   suckfontr   r    r1   getitemsr   decryptT1CharStringrangelen)
r!   r5   r6   charStringsr8   r<   	glyphName
charStringRir   r   r   r2   `   s    
zT1Font.parsec              	   C   s  | j }d}i }g }|| d|d  | dtj d| d|d  g d}|d7 }|d	7 }tD ]
}|t||v 7 }q5|| | d
 | D ]Z\}}|rZ|||< qO|dkr|d }d}t	D ]
}	|t|	|v 7 }qf|| d| d
 | D ]\}	}
|| 
|	|
 q|d qO|tv r|||< d}qO|| 
|| qO|d | |}|td|g tdD ]
}|| d q|g d t|d}|S )NFz%!FontType1-1.1: FontNamez
%t1Font: ()z%%BeginResource: font    r       dict dup beginFontInfoz
/FontInfo s   end defT   ends   currentfile eexec    @0000000000000000000000000000000000000000000000000000000000000000)s   cleartomarks   %%EndResources   %%EOF
)r1   extend_tobytes	fontToolsversionfont_dictionary_keysintappendr@   FontInfo_dictionary_keys_make_linesr
   encode_eexecr   rC   )r!   sfeexec_began
eexec_dictlinessizer3   valuefisubkeysubvalueeexec_portionr$   r   r   r   r   r-   s   sR   


zT1Font.createDatac                 C   s  g }d\}}}d}t }t| dd d}|D ]8\}	}
|	dkr|d }d}tD ]
}|t||v 7 }q(|d || | d	 | D ]\}}|sT|tkrT|}n|s]|tv r]|}n|se|t	v re|}|d
krk|}|dkrx|| t
 qG|dkr|D ]}|  q~dd |D }|dt| dd t|D ]3\}}tttd | |gd\}}|t| d| dt| d| d|| d| g q|d |d qG|| || qGq|	dkrG|d || t|d  d	 |d  D ]9\}}|  tttd | |jgd\}}|t| d| dt| d| d|| d| g q|d q|| |	|
 q|g d t|d}ttt|gd\}}|S )N)NNNr9   c                 S   s   | d dkS )Nr   r7   r   )itemr   r   r   <lambda>   s    z%T1Font.encode_eexec.<locals>.<lambda>)r3   r7   rL   s   dup /PrivaterN   r8   
OtherSubrsr:   c                 S   s   g | ]}|j qS r   )bytecode).0subr_binr   r   r   
<listcomp>   s    z'T1Font.encode_eexec.<locals>.<listcomp>z/Subrs z arrayr   r;   dup     defs   putr/   s   dup /CharStrings/s   end put)rP   s%   dup /FontName get exch definefont pops   marks   currentfile closefile
rS   q  )	std_subrssortedr@   Private_dictionary_keysrY   rZ   rU   RD_value	ND_values	PD_values
hintotherscompilerD   encode	enumerater   encryptr   char_IVrT   r\   rk   eexec_IV)r!   r`   ra   RD_keyND_keyNP_keyr8   r<   sortedItemsr3   rc   prrb   re   rf   rm   rI   encrypted_subrrH   
glyph_namechar_binencrypted_charrg   encrypted_eexecr   r   r   r]      s   




'

	zT1Font.encode_eexecc              
   C   s  |dkr|  d| d| dgS |dv r&|  d| d|rdnd dgS |d	kri|tkr8|  d| d
gS g }|d |d tdD ]}|| }|dkra||  d| d| d qH|d |S t|tr{|  d| d| dgS t|tr|  d| d|rdnd dgS t|tr|  d| dddd |D  dgS t|t	r|  d| dddd |D  dgS |  d| d| dgS )NrJ   rr   z /z def)isFixedPitch	ForceBold	RndStemUprp   truefalseEncodingz StandardEncoding defs   /Encoding 256 arrays'   0 1 255 {1 index exch /.notdef put} for   z.notdefro   z putrq   z (z) defz [c                 s       | ]}t |V  qd S r&   strrl   vr   r   r   	<genexpr>"      z%T1Font._make_lines.<locals>.<genexpr>z] defz {c                 s   r   r&   r   r   r   r   r   r   $  r   z} def)
rU   r   rZ   rC   
isinstancer   boollistjointuple)r!   r3   rc   ra   rI   namer   r   r   r\   
  s4   "




"
*
*zT1Font._make_linesstrictc                 C   s   t || j|S r&   )r   r    )r!   serrorsr   r   r   rU   (     zT1Font._tobytes)r   NF)r   )r   r   r   __doc__r%   r+   r(   r0   r4   r2   r-   r]   r\   rU   r   r   r   r   r   4   s    

5b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$   extcreatortypr   r   r   r   /  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'   <  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   rM   rM   N)rL      r9   rbbad chunk code: )fontTools.misc.macResr   r?   r   r   r   rZ   openr   reprcloser   r   )r"   r   r   readerr   rescodefr   r   r   r   Z  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 datar   Tr      zcorrupt PFB filer   r9   rL   r   N)r   r   r   r   r   stringToLongrD   rZ   r   r   r   )r"   r   r   r   r   chunklenchunkr   r   r   r   y  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 datar   Nr9   )r   r   r   findEncryptedChunksisHexrZ   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 )Njustr   r   rM   i  r    r    r   )
r   FSpCreateResFileFSOpenResFile
UseResFiler   Resourcer   LWFNCHUNKSIZEAddResourceCloseResFile)	r"   r   resRefresIDr   r   r   r   r   r   r   r   r     s(   
"r   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wbrM   r   r   rL   )r   r   r'   r   longToStringrD   )r"   r   r   r   r   r   r   r   r   r   r     s   "r   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 )Nr   rM   r      )r   r   HEXLINELENGTHr'   r   	hexString)	r"   r   r*   r   r   
hexlinelenr   r   r   r   r   r   r     s"   
"r      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   r     r   r   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 )	Nr9   rs   r   rM   zinvalid end of eexec partr   )r   r   r   r   rA   rD   EEXECINTERNALENDr   rZ   EEXECBEGINMARKEREEXECENDMARKER
EEXECBEGINr   )r   r   r   r   	decryptedrH   r   r   r   decryptType1  s"   r   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 partrM   r9   rs   )findr   rD   EEXECENDsearchr   startr   r   r   rA   r   rZ   )	r   r   eBeginendMatcheEnd
cypherText	plainTextrH   	eEndLocalr   r   r   r     s.   

"r   c                 C   s   t t|  S r&   )r   r   r   split)	hexstringr   r   r   r     s   r   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 fontr   r   znot an encrypted Type 1 font)rD   r   _fontType1REr   r   )r   headr   r   r   r   &  s   
r   c                 C   s6   d}t dD ]}|t| d|d > @ |d ? 7 }q|S )N    r9      rQ   )rC   r   )longr   rI   r   r   r   r   7  s   "r   c                 C   sB   t | dkr
tdd}tdD ]}|t| | |d > 7 }q|S )Nr9   zstring must be 4 bytes longr   rQ   )rD   r   rC   r   )r   lrI   r   r   r   r   >  s   r   
FontMatrixFSType	Copyright)r:   rj   UniqueID
BlueValues
OtherBluesFamilyBluesFamilyOtherBlues	BlueScale	BlueShiftBlueFuzzStdHWStdVW	StemSnapH	StemSnapVr   LanguageGrouppasswordr8   
MinFeaturer   z/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869
systemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup
/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def)s   !s   s      s	   
s   ccccs   )stringcurrentfileexch
readstringpop)def)noaccessr  )put)r  r  r   )r   F)Er   rV   r=   r   fontTools.misc.macCreatorTyper   fontTools.misc.textToolsr   r   r   r   fontTools.misc.psOperatorsr   r	   r
   $fontTools.encodings.StandardEncodingr   r   re
__author____version__r   Carbonr   ImportErrorhaveMacSupport	Exceptionr   objectr   r   r'   r   r   r   r   r   r   r   r   r   r{   Mr   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r   r[   rT   rv   rz   rt   r   r   rw   rx   ry   r   r   r   r   <module>   s     
|






