o
    h7                     @   s  d Z ddlmZ ddlmZmZmZ dZeeZdZ	de	 dZ
de
 d	Zde d
Zde dZee
ZeeZeeZeeZdZg dZg dZg 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!G dd de"Z#G dd dZ$e%dkrddl&Z&e$e&j'd Z(e)d*dd de(j+ de(j, de(j- de(j. d e(j/ d!e(j0 d"e(j1 d#e(j2 d$e(j3 d%e(j4 d&e(j5 d'e(j6 d(e(j7 d)e(j8 fD  e)e( dS dS )*u1  Module for reading TFM (TeX Font Metrics) files.

The TFM format is described in the TFtoPL WEB source code, whose typeset form
can be found on `CTAN <http://mirrors.ctan.org/info/knuth-pdf/texware/tftopl.pdf>`_.

	>>> from fontTools.tfmLib import TFM
	>>> tfm = TFM("Tests/tfmLib/data/cmr10.tfm")
	>>>
	>>> # Accessing an attribute gets you metadata.
	>>> tfm.checksum
	1274110073
	>>> tfm.designsize
	10.0
	>>> tfm.codingscheme
	'TeX text'
	>>> tfm.family
	'CMR'
	>>> tfm.seven_bit_safe_flag
	False
	>>> tfm.face
	234
	>>> tfm.extraheader
	{}
	>>> tfm.fontdimens
	{'SLANT': 0.0, 'SPACE': 0.33333396911621094, 'STRETCH': 0.16666698455810547, 'SHRINK': 0.11111164093017578, 'XHEIGHT': 0.4305553436279297, 'QUAD': 1.0000028610229492, 'EXTRASPACE': 0.11111164093017578}
	>>> # Accessing a character gets you its metrics.
	>>> # “width” is always available, other metrics are available only when
	>>> # applicable. All values are relative to “designsize”.
	>>> tfm.chars[ord("g")]
	{'width': 0.5000019073486328, 'height': 0.4305553436279297, 'depth': 0.1944446563720703, 'italic': 0.013888359069824219}
	>>> # Kerning and ligature can be accessed as well.
	>>> tfm.kerning[ord("c")]
	{104: -0.02777862548828125, 107: -0.02777862548828125}
	>>> tfm.ligatures[ord("f")]
	{105: ('LIG', 12), 102: ('LIG', 11), 108: ('LIG', 13)}
    )SimpleNamespace)calcsizeunpackunpack2a  
    >
    lf: h    # length of the entire file, in words
    lh: h    # length of the header data, in words
    bc: h    # smallest character code in the font
    ec: h    # largest character code in the font
    nw: h    # number of words in the width table
    nh: h    # number of words in the height table
    nd: h    # number of words in the depth table
    ni: h    # number of words in the italic correction table
    nl: h    # number of words in the ligature/kern table
    nk: h    # number of words in the kern table
    ne: h    # number of words in the extensible character table
    np: h    # number of font parameter words
z12.20Fz;
    >
    checksum:            L
    designsize:          
z
    z
    codingscheme:        40p
z
    family:              20p
zm
    seven_bit_safe_flag: ?
    ignored:             x
    ignored:             x
    face:                B
zI
    >
    skip_byte: B
    next_char: B
    op_byte: B
    remainder: B
)SLANTSPACESTRETCHSHRINKXHEIGHTQUAD
EXTRASPACE)NUM1NUM2NUM3DENOM1DENOM2SUP1SUP2SUP3SUB1SUB2SUPDROPSUBDROPDELIM1DELIM2
AXISHEIGHT)DEFAULTRULETHICKNESSBIGOPSPACING1BIGOPSPACING2BIGOPSPACING3BIGOPSPACING4BIGOPSPACING5            c                       s   e Zd Z fddZ  ZS )TFMExceptionc                    s   t  | d S N)super__init__)selfmessage	__class__ d/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/tfmLib.pyr*         zTFMException.__init__)__name__
__module____qualname__r*   __classcell__r/   r/   r-   r0   r'      s    r'   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TFMc                 C   s   |  | d S r(   )_read)r+   filer/   r/   r0   r*      s   zTFM.__init__c                 C   s    d| j  d| j d| jddS )Nz	<TFM for z in z at gzpt>)familycodingscheme
designsize)r+   r/   r/   r0   __repr__   s   zTFM.__repr__c                    sl  t |dr
| nt|d}| W d    n1 sw   Y  | _ttk r0tdt tt	 j
dk rBtdtj
d k rOtdt D ]\}}|dk ratdqUjd	k rptd
j djjd ks}jdkrtdj dj djdksjdksjdksjdkrtdjdkrtdt dj
dj jj d  j j j j j j j j krtddj j   j d j j j j j 

j j  fddfddfdd}fddfdd fd!d"	fd#d$}fd%d&fd'd(}fd)d*}fd+d,}		fd-d.}
fd/d0}fd1d2}fd3d4}
fd5d6}fd7d8}dXfd9d:	ttdgt |  d;}jd }i | _|tkrtt|d  | d }| jd<k r| jd	 }| jd	 }d=|d>  d?|  d@|d>   | _tjtd  D ]}tdA|d<  dB|| jd }qn/|tkrtt|d  |  n|t krtt!|d  |  n|t"krtt#|d  |  t$| _%| j&' }|(dCr.t)| _%n	|(dDr7t*| _%i | _+tjD ]@}dE|d  }|dkrRt,| }n#| j%t)krd|dFkrdt-|dG  }n| j%t*kru|dHkrut.|dG  }|||| j+ q?i }d | _/d | _0jdkr||d}|j1dkr|j2| _/||jd }|j1dkrd| _0d|j3 |j4 }||| j0< i | _5tjjd D ]}|dkrxi  | j5|< }|||dI< |dkr|||dJ< |dkr|	||dK< 	|dkr|
||dL< ||}|t6krq|t7kr|||< q|t8kr+||dM< q|t9krxi  |dN< }tdD ]=}|||  }|d>ksN|dkrvdO}|dkrXdP}n|dkr`dQ}n|d	krgdR}||rr|||< q:|||< q:qi | _:i | _;t<| D ]\}}|||}|j1t=krd|j3 |j4 }|jk r2|||}|j1t=krnm|j3t>krd|j3t>  |j4 }||| j;?|i |j2< nP|j3}|dks|dGkr|dSkr|}n.dT}|d dkr|dU7 }|dV7 }|d	 dkr|dU7 }|d>kr|dW7 }|d8 }|d>ks||j4f| j:?|i |j2< |j1t=kr%n||j1d 7 }|jk sqd S )YNreadrbzToo short input filer   z0The file claims to have negative or zero length!   z(The file has fewer bytes than it claims!z'The subfile size: '{name}' is negative!r$   zThe header length is only !r#      zThe character code range z..z is illegal!z-Incomplete subfiles for character dimensions!   z
There are z extensible recipes!   u0   Subfile sizes don’t add up to the stated totalc                       d |   S Nr@   r/   c)	char_baser/   r0   	char_info      zTFM._read.<locals>.char_infoc                    s    |  S r(   r/   rG   rJ   datar/   r0   width_index   rK   zTFM._read.<locals>.width_indexc                    s    |  j k p|  jkp| dkS )Nr   )bcecrG   )sizesrN   r/   r0   noneexistent   s    zTFM._read.<locals>.noneexistentc                        | d  d S Nr#      r/   rG   rL   r/   r0   height_index      zTFM._read.<locals>.height_indexc                        | d  d S rT   r/   rG   rL   r/   r0   depth_index   rW   zTFM._read.<locals>.depth_indexc                    rS   Nr$   r@   r/   rG   rL   r/   r0   italic_index  rW   zTFM._read.<locals>.italic_indexc                    rX   rZ   r/   rG   rL   r/   r0   tag  rW   zTFM._read.<locals>.tagc                    s    | d  S )Nr%   r/   rG   rL   r/   r0   	remainder	  r1   zTFM._read.<locals>.remainderc                    s   d|   } |dd S Nr@   vr/   rH   r)
read_fixed
width_baserN   r/   r0   width     zTFM._read.<locals>.widthc                       d |   }|dd S r^   r/   r`   )height_baserV   rb   r/   r0   height  re   zTFM._read.<locals>.heightc                    rf   r^   r/   r`   )
depth_baserY   rb   r/   r0   depth  re   zTFM._read.<locals>.depthc                    rf   r^   r/   r`   )italic_baser[   rb   r/   r0   italic  re   zTFM._read.<locals>.italicc                    s   d |   S rF   r/   rG   )
exten_baser]   r/   r0   exten  r1   zTFM._read.<locals>.extenc                    rE   rF   r/   i)lig_kern_baser/   r0   lig_step  rK   zTFM._read.<locals>.lig_stepc                    s   t  }tt | d  | |S r(   )r   r   LIG_KERN_COMMAND)rp   commandrM   r/   r0   lig_kern_command"  s   z#TFM._read.<locals>.lig_kern_commandc                    s   d |   }|dd S r^   r/   )rp   ra   )	kern_baserb   r/   r0   kern'  s   zTFM._read.<locals>.kernc                    rE   rF   r/   ro   )
param_baser/   r0   param+  rK   zTFM._read.<locals>.paramc                    s(   t d| dt  | d  |}|d S )Nz>;:r   )r   FIXED_FORMAT)indexkeyobjretru   r/   r0   rb   .  s    zTFM._read.<locals>.read_fixed      MBLr%   RIRCEz>;HEADERz:lzTEX MATH SYzTEX MATH EX	PARAMETER         rd   rh   rj   rl   
nextlargervarcharreptopmidbot    /LIG>r(   )@hasattrr>   open_datalen
SIZES_SIZEr'   r   r   SIZES_FORMATlfvarsitemslhrO   rP   nwnhndninenlnknpr   HEADER_FORMAT4HEADER_SIZE4extraheaderfacerangeHEADER_SIZE3HEADER_FORMAT3HEADER_SIZE2HEADER_FORMAT2HEADER_SIZE1HEADER_FORMAT1VANILLAfonttyper;   upper
startswithMATHSYMATHEX
fontdimensBASE_PARAMSMATHSY_PARAMSMATHEX_PARAMSright_boundary_charleft_boundary_char	skip_byte	next_charop_byter]   charsNO_TAGLIG_TAGLIST_TAGEXT_TAG	ligatureskerningsorted	STOP_FLAG	KERN_FLAG
setdefault)r+   r8   fpnamelengthrR   r\   rd   rh   rj   rl   rn   rr   rv   rx   rz   offsetrestsbrp   schemelig_kern_mapcmdra   rH   infochar_tagr   partligr/   )rI   rJ   rM   ri   rY   rm   rg   rV   rk   r[   rw   rq   ry   rb   r]   rQ   rc   rN   r0   r7      s  




(
	











""
















z	TFM._readN)r2   r3   r4   r*   r=   r7   r/   r/   r/   r0   r6      s    r6   __main__Nc                 c   s    | ]}|V  qd S r(   r/   ).0xr/   r/   r0   	<genexpr>  s
    
r   ztfm.checksum=ztfm.designsize=ztfm.codingscheme=ztfm.fonttype=ztfm.family=ztfm.seven_bit_safe_flag=z	tfm.face=ztfm.extraheader=ztfm.fontdimens=ztfm.right_boundary_char=ztfm.left_boundary_char=ztfm.kerning=ztfm.ligatures=z
tfm.chars=)9__doc__typesr   fontTools.misc.sstructr   r   r   r   r   r|   r   r   r   r   r   r   r   r   rs   r   r   r   r   r   r   UNREACHABLEPASSTHROUGH
ACCESSABLEr   r   r   r   r   r   	Exceptionr'   r6   r2   sysargvtfmprintjoinchecksumr<   r;   r   r:   seven_bit_safe_flagr   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s    %
	  














