L i7:dZddlmZddlmZmZmZdZeeZdZ de dZ de d Z de d Z de d Z ee Zee Zee Zee Zd Zgd ZgdZgdZdZdZdZdZdZdZdZdZdZdZdZ dZ!Gdde"Z#GddZ$e%dk(rddl&Z&e$e&jNdZ(e)djUdde(jVde(jXde(jZde(j\de(j^d e(j`d!e(jbd"e(jdd#e(jfd$e(jhd%e(jjd&e(jld'e(jnd(e(jpfDe)e(yy))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) TFMExceptionc$t||yN)super__init__)selfmessage __class__s V/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/tfmLib.pyr-zTFMException.__init__s !)__name__ __module__ __qualname__r- __classcell__)r0s@r1r)r)s ""r2r)ceZdZdZdZdZy)TFMc&|j|yr+)_read)r.files r1r-z TFM.__init__s 4r2cXd|jd|jd|jddS)Nz )family codingscheme designsize)r.s r1__repr__z TFM.__repr__s8KK=4$$%4??1%S * r2c !"#$%&'()*+,-./0t|dr|j!n%t|d5}|j!ddd!|_t !t kr t dt.tt!..jdkr t dt !.jdzkr t dt.jD]\}}|dks t d.jd krt d .jd .j.jd zkDs.jd kDr&t d.jd.jd.j dk(s-.j"dk(s.j$dk(s.j&dk(r t d.j(dkDrt dt(d.jd.jz.j.jz d zz.j z.j"z.j$z.j&z.j*z.j,z.j(z.j.zk7r t dd.jz.jz .jzd z//.j z%%.j"z"".j$z''.j&z**.j*z)).j,z$$.j(z+fd !fd0.0fd} !fd& !fd# !fd( !fd} !fd-,/0fd}%&,fd }"#,fd!} '(,fd"} $-fd#} *fd$} !fd%} ),fd&}+fd'}dF!fd( ,t1t2dgt4z|d)}.jdz}i|_|t4k\rtt2!|d|d }|j8d*kr:|j8d z}|j8d z}d+|d,zd-|zd.|d,zz|_t;.jt4dzz D]#}td/|d*zd0||j6d }%nY|t<k\rtt>!|d|n;|t@k\rttB!|d|n|tDk\rttF!|d|tH|_%|jLjO}|jQd1r tR|_%n|jQd2r tT|_%i|_+t;.j.D]|}d3|d z}|dkr tX|}nI|jJtRk(r|d4kr tZ|d5z }n$|jJtTk(r|d6kr t\|d5z },||||jV~i}d|_/d|_0.j*dkDr| | d}|jbd k(r|jd|_/| | .j*d z }|jbd k(r2d|_0d|jfz|jhz}|||j`<i|_5t;.j.jd zD]}0|dkDsix|jj|<}|||d7<&|dkDr |||d8<#|dkDr | ||d9<(|dkDr | ||d:<||}|tlk(r|tnk(r -|||<|tpk(r -||d;<|trk(six|d<<}t;dD]G}!| ||z}|d,k(s|dkDsd=}|dk(rd>}n|d k(rd?}n|d k(rd@}||r|||<C|||<Ii|_:i|_;ty|jD]\}}| | |}|jbtzkDrd|jfz|jhz}|.j*ksT| | |}|jbtzkDrn|jft|k\rSd|jft|z z|jhz}|||jvj|i|jd<n|jf}|dk(s |d5kDr|dAk7r|}n6dB}|dzd kDr|dCz }|dDz }|d zdk7r|dCz }|d,kDr|dEz }|dz}|d,kDr||jhf|jtj|i|jd<|jbtzk\rz||jbd zz }|.j*krIy#1swY +xYw)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 ! % %r2c^|jkxs|jkDxs |dk(S)Nr)bcec)rMsizesrSs r1 noneexistentzTFM._read..noneexistents,uxx<F1uxx<F;q>Q3F Fr2c&|dzdzSNr$rLrQs r1 height_indexzTFM._read..height_indexs ! q()R/ /r2c&|dzdzSrZrLrQs r1 depth_indexzTFM._read..depth_indexs ! q()B. .r2c&|dzdzSNr%rErLrQs r1 italic_indexzTFM._read..italic_indexs ! q()Q. .r2c&|dzdzSr`rLrQs r1tagzTFM._read..tags ! q()A- -r2c |dzS)Nr&rLrQs r1 remainderzTFM._read..remainder s ! q() )r2c8d|zz}|ddSNrEvrL)rMr read_fixed width_baserSs r1widthzTFM._read..width (Z+a.01Aa%c* *r2c8d|zz}|ddSrgrL)rMri height_baser\rjs r1heightzTFM._read..height([<?23Aa%c* *r2c8d|zz}|ddSrgrL)rMri depth_baser^rjs r1depthzTFM._read..depthrmr2c8d|zz}|ddSrgrL)rMri italic_baserarjs r1italiczTFM._read..italicrqr2c d|zzSrKrL)rM exten_baseres r1extenzTFM._read..extens Yq\12 2r2cd|zzSrKrL)i lig_kern_bases r1lig_stepzTFM._read..lig_steps )* *r2cDt}tt|d||Sr+)rrLIG_KERN_COMMAND)r|commandrRs r1lig_kern_commandz#TFM._read..lig_kern_command"s#%'G $d12h 8Nr2c,d|zz}|ddSrgrL)r|ri kern_baserjs r1kernzTFM._read..kern's#Y]#Aa%c* *r2cd|zzSrKrL)r| param_bases r1paramzTFM._read..param+s Q' 'r2cBtd|dt|d|}|dS)Nz>;:r)r FIXED_FORMAT)indexkeyobjretrRs r1rjzTFM._read..read_fixed.s-Bse1\N3T%&\3GCq6Mr2MBLr&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._reads 4 99;DdD! !Rwwy ! t9z !56 6! dE* 88a<QR R t9uxx!| #IJ J K--/ NLD&z"#LMM N 88a<!;EHH:QGH H 88ehhl "ehhn+EHH:RzN  88q=EHHMUXX]ehh!mNO O 88c>B4/CDE E 88 hh xx%(("Q& (hh hh   hh   hh  hh hh hh hh  QR RL588+ )A-  588+  588+  588+ #ehh. !EHH, ) %((*  ' & G 0 / / . * + + + + 3 +   + (  ~s\148A \ !>4=$?BDyy2~IIMIIN!!a%L472U16]B 588la&778 Q!b&4dDA%$)!HDM?Q&%+AYDNq6v%(&/lLO))21D&(022DOg"1X 5#E!HqL16TAX#(D Av',!"a',!"a',+D101 04  5' 5D <--/0$ 'DAq"8A;/C}}y(#++% 5ehh,&x{3==9,{{i/3;;#:;cmmKHLQ //26s}}EKK6a!eR#$C"$C 1uqy #s 5LC 1uz #s "#a% #s  !Q#$a% MMK11!R8G ==I-S]]Q&&?ehh, $ '} ! !s e66fN)r3r4r5r-rAr:rLr2r1r8r8s F'r2r8__main__Nc# K|]}|ywr+rL).0xs r1 rs   s z 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_flagrrrrrrrrrLr2r1rsN#J"<< l #  '(   ' ' ' '   $             "9" R'R'j z chhqk C     ~.!#..!12#C$4$4#56 ~.cjj\**3+B+B*CDCHH:&"3??"34!#..!12*3+B+B*CD)#*@*@)ABs{{m, 0SYYK(  * #J3r2