
    jke7                     :   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e"      Z# G d d      Z$e%dk(  rddl&Z& e$e&jN                  d         Z( e)djU                  d de(jV                   de(jX                   de(jZ                   de(j\                   de(j^                   d e(j`                   d!e(jb                   d"e(jd                   d#e(jf                   d$e(jh                   d%e(jj                   d&e(jl                   d'e(jn                   d(e(jp                   fD                      e)e(       yy))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                        e Zd Z fdZ xZS )TFMExceptionc                 $    t         |   |       y N)super__init__)selfmessage	__class__s     2/usr/lib/python3/dist-packages/fontTools/tfmLib.pyr-   zTFMException.__init__   s    !    )__name__
__module____qualname__r-   __classcell__)r0   s   @r1   r)   r)      s    " "r2   r)   c                       e Zd Zd Zd Zd Zy)TFMc                 &    | j                  |       y r+   )_read)r.   files     r1   r-   zTFM.__init__   s    

4r2   c                 X    d| j                    d| j                   d| j                  ddS )Nz	<TFM for z in z at gzpt>)familycodingscheme
designsize)r.   s    r1   __repr__zTFM.__repr__   s8    KK=4$$%4??1%S*	
r2   c                    !"#$%&'()*+,-./0 t        |d      r|j                         !n%t        |d      5 }|j                         !d d d        !| _        t	        !      t
        k  rt        d      t               .t        t        !.       .j                  dk  rt        d      t	        !      .j                  dz  k  rt        d      t        .      j                         D ]  \  }}|dk  st        d       .j                  d	k  rt        d
.j                   d      .j                  .j                  dz   kD  s.j                  dkD  r&t        d.j                   d.j                   d      .j                   dk(  s-.j"                  dk(  s.j$                  dk(  s.j&                  dk(  rt        d      .j(                  dkD  rt        dt(         d      .j                  d.j                  z   .j                  .j                  z
  dz   z   .j                   z   .j"                  z   .j$                  z   .j&                  z   .j*                  z   .j,                  z   .j(                  z   .j.                  z   k7  rt        d      d.j                  z   .j                  z
  .j                  z   dz   //.j                   z   %%.j"                  z   "".j$                  z   ''.j&                  z   **.j*                  z   )).j,                  z   $$.j(                  z   +fd  !fd0.0fd} !fd& !fd# !fd( !fd} !fd-,/0fd}%&,fd }"#,fd!}	'(,fd"}
$-fd#}*fd$}!fd%}),fd&}+fd'}dF!fd(	,t1        t2        dgt4        z  |        d)}.j                  dz  }i | _        |t4        k\  rt        t2        !|d  |       d   }| j8                  d*k  r:| j8                  d	z  }| j8                  d	z  }d+|d,z     d-|   z   d.|d,z     z   | _        t;        .j                  t4        dz  z
        D ]#  }t        d/|d*z    d0|| j6                        d   }% nY|t<        k\  rt        t>        !|d  |        n;|t@        k\  rt        tB        !|d  |        n|tD        k\  rt        tF        !|d  |        tH        | _%        | jL                  jO                         }|jQ                  d1      rtR        | _%        n|jQ                  d2      rtT        | _%        i | _+        t;        .j.                        D ]|  }d3|dz    }|dk  r
tX        |   }nI| jJ                  tR        k(  r|d4k  rtZ        |d5z
     }n$| jJ                  tT        k(  r|d6k  rt\        |d5z
     } , ||      || jV                         ~ i }d | _/        d | _0        .j*                  dkD  r | |d            }|jb                  dk(  r|jd                  | _/         | |.j*                  dz
              }|jb                  dk(  r2d| _0        d|jf                  z  |jh                  z   }||| j`                  <   i | _5        t;        .j                  .j                  dz         D ]  } 0|      dkD  si x| jj                  |<   } ||      |d7<    &|      dkD  r ||      |d8<    #|      dkD  r |	|      |d9<    (|      dkD  r |
|      |d:<    ||      }|tl        k(  r|tn        k(  r -|      ||<   |tp        k(  r -|      |d;<   |tr        k(  si x|d<<   }t;        d      D ]G  }! ||      |z      }|d,k(  s|dkD  sd=}|dk(  rd>}n|dk(  rd?}n|d	k(  rd@} ||      r|||<   C|||<   I  i | _:        i | _;        ty        |j                               D ]  \  }} | ||            }|jb                  tz        kD  rd|jf                  z  |jh                  z   }|.j*                  k  sT | ||            }|jb                  tz        kD  rn|jf                  t|        k\  rSd|jf                  t|        z
  z  |jh                  z   } ||      | jv                  j                  |i       |jd                  <   n|jf                  }|dk(  s
|d5kD  r|dAk7  r|}n6dB}|dz  dkD  r|dCz  }|dDz  }|d	z  dk7  r|dCz  }|d,kD  r|dEz  }|dz  }|d,kD  r||jh                  f| jt                  j                  |i       |jd                  <   |jb                  tz        k\  rz||jb                  dz   z  }|.j*                  k  rI y # 1 sw Y   	+xY w)GN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| z   z  S NrE    )c	char_bases    r1   	char_infozTFM._read.<locals>.char_info   s    	A&&r2   c                      |          S r+   rL   rM   rO   datas    r1   width_indexzTFM._read.<locals>.width_index   s    	!%%r2   c                 ^    | j                   k  xs | j                  kD  xs  |       dk(  S )Nr   )bcec)rM   sizesrS   s    r1   noneexistentzTFM._read.<locals>.noneexistent   s,    uxx<F1uxx<F;q>Q3FFr2   c                 &     |       dz      dz  S Nr$      rL   rQ   s    r1   height_indexzTFM._read.<locals>.height_index   s    	!q()R//r2   c                 &     |       dz      dz  S rZ   rL   rQ   s    r1   depth_indexzTFM._read.<locals>.depth_index   s    	!q()B..r2   c                 &     |       dz      dz  S Nr%   rE   rL   rQ   s    r1   italic_indexzTFM._read.<locals>.italic_index  s    	!q()Q..r2   c                 &     |       dz      dz  S r`   rL   rQ   s    r1   tagzTFM._read.<locals>.tag  s    	!q()A--r2   c                       |       dz      S )Nr&   rL   rQ   s    r1   	remainderzTFM._read.<locals>.remainder	  s    	!q())r2   c                 8    d |       z   z  } |d      d   S NrE   vrL   )rM   r
read_fixed
width_baserS   s     r1   widthzTFM._read.<locals>.width  (    Z+a.01Aa%c**r2   c                 8    d |       z   z  } |d      d   S rg   rL   )rM   ri   height_baser\   rj   s     r1   heightzTFM._read.<locals>.height  (    [<?23Aa%c**r2   c                 8    d |       z   z  } |d      d   S rg   rL   )rM   ri   
depth_baser^   rj   s     r1   depthzTFM._read.<locals>.depth  rm   r2   c                 8    d |       z   z  } |d      d   S rg   rL   )rM   ri   italic_basera   rj   s     r1   italiczTFM._read.<locals>.italic  rq   r2   c                      d |       z   z  S rK   rL   )rM   
exten_basere   s    r1   extenzTFM._read.<locals>.exten  s    
Yq\122r2   c                     d| z   z  S rK   rL   )ilig_kern_bases    r1   lig_stepzTFM._read.<locals>.lig_step  s    )**r2   c                 D    t               }t        t        | d  |       |S r+   )r   r   LIG_KERN_COMMAND)r|   commandrR   s     r1   lig_kern_commandz#TFM._read.<locals>.lig_kern_command"  s#    %'G$d12h8Nr2   c                 ,    d| z   z  } |d      d   S rg   rL   )r|   ri   	kern_baserj   s     r1   kernzTFM._read.<locals>.kern'  s#    Y]#Aa%c**r2   c                     d| z   z  S rK   rL   )r|   
param_bases    r1   paramzTFM._read.<locals>.param+  s    
Q''r2   c                 B    t        d| dt         | d  |      }|d   S )Nz>;:r   )r   FIXED_FORMAT)indexkeyobjretrR   s       r1   rj   zTFM._read.<locals>.read_fixed.  s-    Bse1\N3T%&\3GCq6Mr2         MBLr&   RIRCEz>;HEADERz:lzTEX MATH SYzTEX MATH EX	PARAMETER         rl   rp   rt   rw   
nextlargervarcharreptopmidbot    /LIG>r+   )@hasattrrC   open_datalen
SIZES_SIZEr)   r   r   SIZES_FORMATlfvarsitemslhrU   rV   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_bytere   charsNO_TAGLIG_TAGLIST_TAGEXT_TAG	ligatureskerningsorted	STOP_FLAG	KERN_FLAG
setdefault)1r.   r;   fpnamelengthrX   rc   rl   rp   rt   rw   rz   r~   r   r   r   offsetrestsbr|   schemelig_kern_mapcmdri   rM   infochar_tagr   partligrN   rO   rR   rs   r^   ry   ro   r\   rv   ra   r   r}   r   rj   re   rW   rk   rS   s1                                  @@@@@@@@@@@@@@@@@@r1   r:   z	TFM._read   s	   4 99;DdD! !Rwwy! 
t9z!566!dE* 88a<QRRt9uxx!|#IJJ K--/ 	NLD&z"#LMM	N 88a<!;EHH:QGHH88ehhl"ehhn+EHH:RzN  88q=EHHMUXX]ehh!mNOO88c>B4/CDEE88hhxx%(("Q&( hh hh	
 hh hh hh hh hh	 hh

 QRR L588+	)A-
 588+ 588+
 588+#ehh.!EHH,	)
%((*

	'	&	G	0	/	/	.	*	+	+	+	+	3	+	
	+	(	
 	~s\148A\!>4=$?BDyy2~IIMIIN!!a%L472U16]B	588la&778 Q!b&4dD<L<LMaPQ|#NDM48|#NDM48|#NDM48""((*]+"DM}-"DMuxx 	8Aqse$DAv"1~&(Q"W$QU+&(Q"W$QU+uQxt7	8 #' "&88a<"8A;/C}}#+.==("8UXX\#;<C}}#*-'#++%589T445
uxxA.  	5A1~!'))

1 %aW?Q&%+AYDNq>A%$)!HDM?Q&%+AYDNq6v%(&/lLO))21D&(022DOg"1X 5#E!HqL16TAX#(D Av',!"a',!"a',+D101045' 	5D <--/0 $	'DAq"8A;/C}}y(#++%5ehh,&x{3==9,{{i/3;;#:;cmmKHLQ//26s}}EKK6a!eR #$C"$C 1uqy #s
5LC 1uz #s
"#a% #s
 !Q #$a%  MMK11!R8G
 ==I-S]]Q&&? ehh,$	'}! !s   e66f N)r3   r4   r5   r-   rA   r:   rL   r2   r1   r8   r8      s    
F'r2   r8   __main__Nc              #       K   | ]  }|  y wr+   rL   ).0xs     r1   	<genexpr>r     s      
 
s   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   r   r   r   r   r   r   r   UNREACHABLEPASSTHROUGH
ACCESSABLEr   r   r   r   r   r   	Exceptionr)   r8   r3   sysargvtfmprintjoinchecksumr@   r?   r   r>   seven_bit_safe_flagr   r   r   r   r   r   r   r   rL   r2   r1   <module>r      sN  #J " < <  l#
 ' ( 
 
  '''' $ 	
	

	


		"9 "
R' R'j z
chhqk
C			 
  ~.!#..!12#C$4$4#56~.cjj\**3+B+B*CDCHH:&"3??"34!#..!12*3+B+B*CD)#*@*@)ABs{{m, 0SYYK(
 	
* 
#J3 r2   