)Ej9dZddlmZddlmZmZmZdZeeZdZ de dZ de d Z de d Z de d Z ee Zee Zee Zee Zd Zgd ZgdZgdZdZdZdZdZdZdZdZdZdZdZdZ dZ!Gdde"Z#GddZ$e%dkrddl&Z&e$e&j'dZ(e)d*dde(j+de(j,de(j-de(j.de(j/d e(j0d!e(j1d"e(j2d#e(j3d$e(j4d%e(j5d&e(j6d'e(j7d(e(j8fDe)e(dSdS))u1Module 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 `_. >>> 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)calcsizeunpackunpack2a > 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 z12.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 )SLANTSPACESTRETCHSHRINKXHEIGHTQUAD EXTRASPACE)NUM1NUM2NUM3DENOM1DENOM2SUP1SUP2SUP3SUB1SUB2SUPDROPSUBDROPDELIM1DELIM2 AXISHEIGHT)DEFAULTRULETHICKNESS BIGOPSPACING1 BIGOPSPACING2 BIGOPSPACING3 BIGOPSPACING4 BIGOPSPACING5ceZdZfdZxZS) TFMExceptioncJt|dSN)super__init__)selfmessage __class__s BC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/tfmLib.pyr-zTFMException.__init__s! !!!!!)__name__ __module__ __qualname__r- __classcell__)r0s@r1r)r)s8"""""""""r2r)c eZdZdZdZdZdS)TFMc0||dSr+)_read)r.files r1r-z TFM.__init__s 4r2c:d|jd|jd|jddS)Nz )family codingscheme designsize)r.s r1__repr__z TFM.__repr__sD *K * *$ * *? ) * * * r2c !"#$%&'()*+,-./0t|dr|!n!|d|nS|t@krttB!|d|n)|tDkrttF!|d|tH|_%|j&'}|(d1r tR|_%n!|(d2r tT|_%i|_+t;.jD]}d3|d z}|dkrtX|}nM|j%tRkr|d4krtZ|d5z }n&|j%tTkr|d6krt\|d5z },||||j+i}d|_/d|_0.jdkru| | d}|j1d kr |j2|_/| | .jd z }|j1d kr#d|_0d|j3z|j4z}|||j0<i|_5t;.j.jd zD]E}0|dkr2ix|j5|<}|||d7<&|dkr|||d8<#|dkr| ||d9<(|dkr| ||d:<||}|tlkr|tnkr-|||<|tpkr-||d;<|trkrkix|d<<}t;dD]T}!| ||z}|d,ks|dkr2d=}|dkrd>}n|d krd?}n|d krd@}||r|||<O|||<UGi|_:i|_;ty| D]m\}}| | |}|j1tzkrd|j3z|j4z}|.jkr%| | |}|j1tzkrn|j3t|krGd|j3t|z z|j4z}|||j;?|i|j2<n|j3}|dks |d5kr |dAkr|}n9dB}|dzd kr|dCz }|dDz }|d zdkr|dCz }|d,kr|dEz }|dz}|d,k||j4f|j:?|i|j2<|j1tzkrn||j1d zz }|.jk%odS)GNreadrbzToo short input filerz0The 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%zThe header length is only !r$zThe character code range z..z is illegal!z-Incomplete subfiles for character dimensions!z There are z extensible recipes!u0Subfile sizes don’t add up to the stated totalcd|zzSNrE)c char_bases r1 char_infozTFM._read..char_infos A & &r2c&|Sr+rLrMrOdatas r1 width_indexzTFM._read..width_indexs ! % %r2cN|jkp|jkp|dkS)Nr)bcec)rMsizesrSs r1 noneexistentzTFM._read..noneexistents,ux<F1ux<F;;q>>Q3F Fr2c2|dzdzSNr$rLrQs r1 height_indexzTFM._read..height_indexs  ! q()R/ /r2c2|dzdzSrZrLrQs r1 depth_indexzTFM._read..depth_indexs  ! q()B. .r2c2|dzdzSNr%rErLrQs r1 italic_indexzTFM._read..italic_indexs  ! q()Q. .r2c2|dzdzSr`rLrQs r1tagzTFM._read..tags  ! q()A- -r2c,|dzS)Nr&rLrQs r1 remainderzTFM._read..remainder s ! q() )r2cJd|zz}|ddSNrEvrL)rMr read_fixed width_baserSs r1widthzTFM._read..width 1Z++a..01A:a%%c* *r2cJd|zz}|ddSrgrL)rMri height_baser\rjs r1heightzTFM._read..height1[<<??23A:a%%c* *r2cJd|zz}|ddSrgrL)rMri depth_baser^rjs r1depthzTFM._read..depthrmr2cJd|zz}|ddSrgrL)rMri italic_baserarjs r1italiczTFM._read..italicrqr2c&d|zzSrKrL)rM exten_baseres r1extenzTFM._read..extens YYq\\12 2r2cd|zzSrKrL)i lig_kern_bases r1lig_stepzTFM._read..lig_steps )* *r2c`t}tt|d||Sr+)rrLIG_KERN_COMMAND)r|commandrRs r1lig_kern_commandz#TFM._read..lig_kern_command"s.%''G $d122h 8 8 8Nr2c8d|zz}|ddSrgrL)r|ri kern_baserjs r1kernzTFM._read..kern's(Y]#A:a%%c* *r2cd|zzSrKrL)r| param_bases r1paramzTFM._read..param+s Q' 'r2c\td|dt|d|}|dS)Nz>;:r)r FIXED_FORMAT)indexkeyobjretrRs r1rjzTFM._read..read_fixed.s63s33\33T%&&\3GGCq6Mr2MBLr&RIRCEz>;HEADERz:lz TEX MATH SYz TEX MATH EX PARAMETER rlrprtrw nextlargervarcharreptopmidbot /LIG>r+)@hasattrrCopen_datalen SIZES_SIZEr)rr SIZES_FORMATlfvarsitemslhrUrVnwnhndninenlnknprHEADER_FORMAT4 HEADER_SIZE4 extraheaderfacerange HEADER_SIZE3HEADER_FORMAT3 HEADER_SIZE2HEADER_FORMAT2 HEADER_SIZE1HEADER_FORMAT1VANILLAfonttyper?upper startswithMATHSYMATHEX fontdimens BASE_PARAMS MATHSY_PARAMS MATHEX_PARAMSright_boundary_charleft_boundary_char skip_byte next_charop_byterecharsNO_TAGLIG_TAGLIST_TAGEXT_TAG ligatureskerningsorted STOP_FLAG KERN_FLAG setdefault)1r.r;fpnamelengthrXrcrlrprtrwrzr~rrroffsetrestsbr|scheme lig_kern_mapcmdrirMinfochar_tagrpartligrNrOrRrsr^ryror\rvrarr}rrjrerWrkrSs1 @@@@@@@@@@@@@@@@@@r1r:z TFM._readsA 4  !99;;DDdD!! !Rwwyy ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! t99z ! !566 6!! dE*** 8a<<QRR R t99ux!| # #IJJ J KK--// N NLD&zz"#LMMM 8a<<GEHGGGHH H 8ehl " "ehnnNEHNNNNN  8q==EHMMUX]]eh!mmNOO O 8c>>DBDDDEE E 8 h x%("Q& (h h   h   h  h h h h  QRR RL58+ )A-  58+  58+  58+ #eh. !EH, ) %(*  ' ' ' ' ' & & & & & & G G G G G G 0 0 0 0 0 0 / / / / / / / / / / / / . . . . . . * * * * * * + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 3 3 3 3 3 + + + + +       + + + + + + ( ( ( ( (       ~s\14888A \ ! !>4=$??BDy2~~IMIN!!a%L472U16]B 58la&7788 Q Q4!b&444dD>A%%$)E!HHDM<??Q&&%+VAYYDN3q66v%%((&/illLOO)))21D&&((022DOg"1XX 5 5#EE!HHqL166TAXX#(D Avv',!"a',!"a',+|D11501 04  <--//00$ '$ 'DAq""88A;;//C}y((#+% 5eh,,&&xx{{33=9,,{i//3;#:;cmKHLQ //266s}EEK66a!eeR#$CC"$C 1uqyy #s 5LC 1uzz #s "#a%% #s  !Q#$a%% MK11!R88G =I--S]Q&&?eh,, $ '$ 'sA))A-0A-N)r3r4r5r-rAr:rLr2r1r8r8sF   F'F'F'F'F'r2r8__main__Nc#K|]}|VdSr+rL).0xs r1 rs6         r2z tfm.checksum=ztfm.designsize=ztfm.codingscheme=z tfm.fonttype=z tfm.family=ztfm.seven_bit_safe_flag=z tfm.face=ztfm.extraheader=ztfm.fontdimens=ztfm.right_boundary_char=ztfm.left_boundary_char=z tfm.kerning=ztfm.ligatures=z tfm.chars=)9__doc__typesrfontTools.misc.sstructrrrrrrrrrrrrrrrrrrrrr UNREACHABLE PASSTHROUGH ACCESSABLErrrrrr Exceptionr)r8r3sysargvtfmprintjoinchecksumr@r?rr>seven_bit_safe_flagrrrrrrrrrLr2r1rs##J"!!!!!<<<<<<<<<< Xl # #  '   x'' x'' x'' x''   $             """""9""" R'R'R'R'R'R'R'R'j zJJJ #chqk  C E   / ..2#.226C$466. ..*cj**D3+BDD&CH&&43?442#.22D3+BDDB#*@BB,s{,,000(SY((     * E#JJJJJ3r2