B
    Jd7                 @   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dddddddgZddddddddddddd d!d"gZd#d$d%d&d'd(g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/d0 d0Z$e%d1krdd2l&Z&e$e&j'd) Z(e)d*d3d4 d5e(j+ d6e(j, d7e(j- d8e(j. d9e(j/ d:e(j0 d;e(j1 d<e(j2 d=e(j3 d>e(j4 d?e(j5 d@e(j6 dAe(j7 dBe(j8 gD  e)e( d2S )Cu1  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
ZSLANTSPACEZSTRETCHZSHRINKZXHEIGHTZQUADZ
EXTRASPACEZNUM1ZNUM2ZNUM3ZDENOM1ZDENOM2ZSUP1ZSUP2ZSUP3ZSUB1ZSUB2ZSUPDROPZSUBDROPZDELIM1ZDELIM2Z
AXISHEIGHTZDEFAULTRULETHICKNESSZBIGOPSPACING1ZBIGOPSPACING2ZBIGOPSPACING3ZBIGOPSPACING4ZBIGOPSPACING5            c                   s   e Zd Z fddZ  ZS )TFMExceptionc                s   t  | d S )N)super__init__)selfmessage)	__class__ B/var/www/html/venv/lib/python3.7/site-packages/fontTools/tfmLib.pyr      s    zTFMException.__init__)__name__
__module____qualname__r   __classcell__r   r   )r   r   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 )N)_read)r   filer   r   r   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   r   __repr__   s    zTFM.__repr__c          	      sz  t |dr| nt|d}| W d Q R X | _ttk rLtdt tt	 j
dk rptdtj
d k rtdx(t D ]\}}|dk rtdqW jd	k rtd
j djjd ksjdkrtdj dj djdks6jdks6jdks6jdkr>tdjdkrZt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>   | _xtjtd  D ]$}tdA|d<  dB|| jd }qW n^|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rpt*| _%i | _+xtjD ]}dE|d  }|dkrt,| }nF| j%t)kr|dFkrt-|dG  }n"| j%t*kr|dHkrt.|dG  }|||| j+ qW i }d | _/d | _0jdkr||d}|j1dkrB|j2| _/||jd }|j1dkrd| _0d|j3 |j4 }||| j0< i | _5xttjjd D ]\}|dkri  | j5|< }|||dI< |dkr|||dJ< |dkr|	||dK< 	|dkr|
||dL< ||}|t6kr,n|t7krD|||< n|t8kr\||dM< n|t9kri  |dN< }xtdD ]x}|||  }|d>ks|dkr|dO}|dkrdP}n|dkrdQ}n|d	krdR}||r|||< n|||< q|W qW i | _:i | _;xht<| D ]V\}}|||}|j1t=krLd|j3 |j4 }x |jk rn|||}|j1t=krvn|j3t>krd|j3t>  |j4 }||| j;?|i |j2< n|j3}|dks|dGkr|dSkr|}nZdT}|d dkr|dU7 }|dV7 }|d	 dkr|dU7 }x |d>kr2|dW7 }|d8 }qW ||j4f| j:?|i |j2< |j1t=kr\P ||j1d 7 }qPW qW d 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                s   d |   S )Nr"   r   )c)	char_baser   r   	char_info   s    zTFM._read.<locals>.char_infoc                s    |  S )Nr   )r'   )r)   datar   r   width_index   s    zTFM._read.<locals>.width_indexc                s    |  j k p|  jkp| dkS )Nr   )bcec)r'   )sizesr+   r   r   noneexistent   s    zTFM._read.<locals>.noneexistentc                s    | d  d S )Nr      r   )r'   )r)   r*   r   r   height_index   s    zTFM._read.<locals>.height_indexc                s    | d  d S )Nr   r0   r   )r'   )r)   r*   r   r   depth_index   s    zTFM._read.<locals>.depth_indexc                s    | d  d S )Nr	   r"   r   )r'   )r)   r*   r   r   italic_index  s    zTFM._read.<locals>.italic_indexc                s    | d  d S )Nr	   r"   r   )r'   )r)   r*   r   r   tag  s    zTFM._read.<locals>.tagc                s    | d  S )Nr
   r   )r'   )r)   r*   r   r   	remainder	  s    zTFM._read.<locals>.remainderc                s   d|   } |dd S )Nr"   vr   )r'   r)
read_fixed
width_baser+   r   r   width  s    zTFM._read.<locals>.widthc                s   d |   }|dd S )Nr"   r6   r   )r'   r7   )height_baser1   r8   r   r   height  s    zTFM._read.<locals>.heightc                s   d |   }|dd S )Nr"   r6   r   )r'   r7   )
depth_baser2   r8   r   r   depth  s    zTFM._read.<locals>.depthc                s   d |   }|dd S )Nr"   r6   r   )r'   r7   )italic_baser3   r8   r   r   italic  s    zTFM._read.<locals>.italicc                s   d |   S )Nr"   r   )r'   )
exten_baser5   r   r   exten  s    zTFM._read.<locals>.extenc                s   d |   S )Nr"   r   )i)lig_kern_baser   r   lig_step  s    zTFM._read.<locals>.lig_stepc                s   t  }tt | d  | |S )N)r   r   LIG_KERN_COMMAND)rC   command)r*   r   r   lig_kern_command"  s    z#TFM._read.<locals>.lig_kern_commandc                s   d |   }|dd S )Nr"   r6   r   )rC   r7   )	kern_baser8   r   r   kern'  s    zTFM._read.<locals>.kernc                s   d |   S )Nr"   r   )rC   )
param_baser   r   param+  s    zTFM._read.<locals>.paramc                s(   t d| dt  | d  |}|d S )Nz>;:r   )r   FIXED_FORMAT)indexkeyobjret)r*   r   r   r8   .  s     zTFM._read.<locals>.read_fixed      ZMBLr
   ZRIZRCEz>;HEADERz:lzTEX MATH SYzTEX MATH EXZ	PARAMETER         r:   r<   r>   r@   Z
nextlargervarcharreptopmidZbot    /ZLIG>)N)@hasattrr    open_datalen
SIZES_SIZEr   r   r   SIZES_FORMATlfvarsitemsZlhr,   r-   nwZnhndninenlZ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_charZ	skip_byteZ	next_charZop_byter5   charsNO_TAGLIG_TAGLIST_TAGEXT_TAG	ligatureskerningsorted	STOP_FLAG	KERN_FLAG
setdefault)r   r   fpnamelengthr/   r4   r:   r<   r>   r@   rB   rE   rH   rJ   rL   offsetrestsbrC   schemeZlig_kern_mapcmdr7   r'   infoZchar_tagrX   partZligr   )r(   r)   r*   r=   r2   rA   r;   r1   r?   r3   rI   rD   rK   r8   r5   r.   r9   r+   r   r      sH   



0N










"&















z	TFM._readN)r   r   r   r   r   r   r   r   r   r   r      s   r   __main__Nc             c   s   | ]
}|V  qd S )Nr   ).0xr   r   r   	<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   ZfontTools.misc.sstructr   r   r   re   rd   rN   ry   rw   ru   ro   rx   rv   rt   rp   rF   r   r   r   rz   r~   r   ZUNREACHABLEZPASSTHROUGHZ
ACCESSABLEr   r   r   r   r   r   	Exceptionr   r   r   sysargvZtfmprintjoinZchecksumr   r   r{   r   Zseven_bit_safe_flagrr   rq   r   r   r   r   r   r   r   r   r   r   <module>$   s     













