L iY dZddlmZddlmZddlmZddlmZddl m Z m Z ddl Z ddl mZddlZej eZGd d eZd Zd Zd ddddddddd ZefdZGddeZdZej6eZdZej6eZdZej6eZ dZ!ej6e!Z"dZ#ej6e#Z$Gdd eZ%Gd!d"e%Z&Gd#d$e%Z'Gd%d&Z(d'Z)d(Z*d)Z+ed*k(r4ddl,Z,ddl-Z-e,j\e-j^j`yy)+attLib/sfnt.py -- low-level module to deal with the sfnt file format. Defines two public classes: - SFNTReader - SFNTWriter (Normally you don't have to use these classes explicitly; they are used automatically by ttLib.TTFont.) The reading and writing of sfnt files is separated in two distinct classes, since whenever the number of tables changes or whenever a table's length changes you need to rewrite the whole file anyway. )BytesIO)SimpleNamespace)Tag)sstruct) TTLibErrorTTLibFileIsCollectionErrorN) OrderedDictcHeZdZdZd dZdZeZdZdZdZ dZ dZ d Z y ) SFNTReaderc|ri|tura|d}|jdt|jd}|jd|dk(rddlm}t j|St j|S)zmReturn an instance of the SFNTReader sub-class which is compatible with the input file type. rwOF2) WOFF2Reader)r seekrreadfontTools.ttLib.woff2robject__new__)clsargskwargsinfile sfntVersionrs Z/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/ttLib/sfnt.pyrzSFNTReader.__new__sh C:%!WF KKNfkk!n-K KKNf$=~~k22~~c""c||_||_d|_d|_t|_|jj d|jjd|_|jj d|jdk(rt|j}|j}d|cxkr|ksntd|dz z||_ |jj |j||jjt}t|tk7r tdt!j"t$||n|jdk(rjd|_t&|_|jjt(}t|t(k7r td t!j"t*||nW|jjt}t|tk7r td t!j"t$||t-|j|_|jd vr td i}t/|j0D]G}|j } | j3|jt-| j4} | || <It7t9|j;d |_|jdk(rt?||_yy)Nrr sttcfz2specify a font number between 0 and %d (inclusive)'Not a Font Collection (not enough data)wOFFwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))OTTOtruez1Not a TrueType or OpenType font (bad sfntVersion)c |djS)Nr)offset)is rz%SFNTReader.__init__..]sqt{{r)key) filecheckChecksumsflavor flavorDataSFNTDirectoryEntryDirectoryEntryrrr readTTCHeadernumFontsr offsetTablesfntDirectorySizelenrrunpacksfntDirectoryFormatWOFFDirectoryEntrywoffDirectorySizewoffDirectoryFormatrrange numTablesfromFiletagr sorteditemstablesWOFFFlavorData) selfr)r* fontNumberheaderr0datar?r&entryr<s r__init__zSFNTReader.__init__/s\ , 0 q99>>!, q   w &"499-FH -X-0H!|%%DM IINN6--j9 :99>>"34D4y-- !JKK NN.d ;    ( DK"4D 99>>"34D4y-- !DEE NN.d ;99>>"34D4y-- !TUU NN.d ;t//0   #G GPQ Qt~~& A'')E NN499 %eii.CF3K  "&=R"ST  ;;& ,T2DO !rc||jvSNr?rAr<s rhas_keyzSFNTReader.has_keycsdkk!!rc6|jjSrH)r?keysrAs rrMzSFNTReader.keyshs{{!!rcr|jt|}|j|j}|jrw|dk(rt |dddz|ddz}n t |}|jdkDr||j k(s Jd|z|S||j k7rtjd||S)zFetch the raw table data.headN rzbad checksum for '%s' table) r?rloadDatar)r* calcChecksumcheckSumlogwarning)rAr<rErDchecksums r __getitem__zSFNTReader.__getitem__ks CH%~~dii(   f}'Ra;(>bc(JK'-""Q&5>>1V3PSV3VV1 U^^+ 93? rc0|jt|=yrH)r?rrJs r __delitem__zSFNTReader.__delitem__}s KKC !rc8|jjyrH)r)closerNs rr^zSFNTReader.closes rct|jtr |jS|jj }|d=|jj |d<|jj |d<|S)Nr) _filename_filepos) isinstancer)r__dict__copynametellrAstates r __getstate__zSFNTReader.__getstate__sa dii )==  ""$ &M!YY^^k IINN,j rcd|vrJt|jdd|_|jj|jd|jj |y)Nr)r`rbra)openpopr)rrcupdatergs r __setstate__zSFNTReader.__setstate__sL  UYY{3T:DI IINN599Z0 1 U#rN)r) __name__ __module__ __qualname__rrFrK __contains__rMrZr\r^rirorrr r s7#"23h"L"$" $rr FrrQ 2d) rrwr rxrvrQ cd|cxkrdksntd|ztr|dk(rddlm}|||Sddlm}||t |S)aECompress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True, zopfli is used instead of the zlib module. The compression 'level' must be between 0 and 9. 1 gives best speed, 9 gives best compression (0 gives no compression at all). The default value is a compromise between speed and compression (6). rrzBad compression level: %s)compress) numiterations) ValueError USE_ZOPFLIzlibr zopfli.zlib ZOPFLI_LEVELS)rDlevelrs rrrsN O!O4u<== !!e$$(M%,@AArcJeZdZdZ d dZdZdZdZdZdZ d Z d Z y) SFNTWritercd}|r d|vr|d}n|rt|dkDr|d}|tur |dk(rddlm}tj |Stj |S)zpReturn an instance of the SFNTWriter sub-class which is compatible with the specified 'flavor'. Nr+rwwoff2r) WOFF2Writer)r3rrrrr)rrrr+rs rrzSFNTWriter.__new__sd h&(H%F c$i!m!WF *  =~~k22~~c""rNcX||_||_t||_||_||_|jdk(r>t |_t|_ t|_ d|_ t|tzz|_nc|jrJd|jzt |_t|_ t"|_ ddlm}||d\|_|_|_|jj/|_|j0|jz||jj2zz|_|jj7|j4|jj9d|j4|jj/z zt;|_y)Nr wOFFUnknown flavor '%s'rgetSearchRange)r)r:rrr+r,r8directoryFormatr7 directorySizer6r. signaturer2sfntDirectoryEntrySizeorigNextTableOffsetr5r-fontTools.ttLibr searchRange entrySelector rangeShiftrfdirectoryOffset formatSizenextTableOffsetrwriter r?)rAr)r:rr+r,rs rrFzSFNTWriter.__init__s` "{+ $ ;;& #6D !2D "4D #DN"I0F$FF  ${{ G$9DKK$G G?#6D !2D "4D  6DR2E AD d0$/ $yy~~/     !$--888 9  t++, !5!5 8H!HIJ!m rcZ||jvrtd|z||j|<y)Ncannot rewrite '%s' table)r?r)rAr<rEs rsetEntryzSFNTWriter.setEntry s- $++ 83>? ?  Crc||jvrtd|z|j}||_|j|_|dk(r+t |dddz|ddz|_||_d|_ nt ||_|j|j||jdk(r6|j|_|xj|jd zd zz c_ |j|j d zd zz|_|jj#d |j|jj%z z|j|jj%k(sJ|j'||y) zWrite raw table data to disk.rrPNrQrRrSTr rwr)r?rr.r<rr%rUrV headTable uncompressedsaveDatar)r+r origOffset origLengthlengthrrfr)rAr<rDrEs r __setitem__zSFNTWriter.__setitem__sM $++ 83>? ?##% ++ &=)$r([*@49*LMEN!DN!%E )$/EN tyy$' ;;& #77E   $ $)9)9A)=(C C $#33 q8HB7NO !5!5 8H!HIJ##tyy~~'7777 c5!rc |j|SrHrIrJs rrZzSFNTWriter.__getitem__.s{{3rcht|jj}t||jk7r#t d|jt|fz|j dk(rd|_d|_d|_ |xjdt|zz c_ |D]*\}}|xj|jdzdzz c_ ,|jr |jn t}|j/|j#|j|_ |j|_nKt|d r1t!j"d |j$d d \|_ |_ndx|_ |_|j&rt|j&|_|j*j-dd|j*j/|_t3|j&}t||_|j*j7|ndx|_x|_|_|j8r|j*j-dd|j*j/}|dzdz}|j*j7d||z z|j*j/|_t|j8|_|j*j7|j8ndx|_|_|j*j-dd|j*j/|_n!|j rJd|j z tAjB|jD|}|j*j-|jF|jHzd} |D]\}}|dk(rd} ||jKz}!| r|jM||j*j-|jF|j*j7|y )zTAll tables must have been written to disk. Now write the directory. z-wrong number of tables; expected %d, found %dr rrrSrrwrNrz>HHr rQr~rrrPr)'r=r?r>r3r:rr+rreserved totalSfntSizerr,r@ majorVersion minorVersionhasattrstructr4rmetaDatametaOrigLengthr)rrf metaOffsetr metaLengthrprivData privOffset privLengthrrpackrrrtoStringwriteMasterChecksum) rAr?r<rErDcompressedMetaDataoff paddedOff directoryseenHeads rr^zSFNTWriter.close1sM ))+, v;$.. (?>>3v;/0  ;;& $DNDM!#D    "s6{"2 2 $ B U""u'7'7!';r&AA" B'+oo4??>;KD  ,1B1B1N$($5$5!$($5$5!4-;A==t~~a2<8D%t'8=>=D%(9}}&)$--&8# q!$"&)).."2%-dmm%<""%&8"9  23JKKK$/D4G}} q!$iinn& 1WN  S 9:"&)).."2"%dmm"4  .455$/ IINN1a ))..*DK{{ G$9DKK$G G? LL!5!5t<  t++d.@.@@A  5JCf}!ENN$44I 5   $ $Y / t++,  "rc,g}|jjD]*}|j|j|j,|jt k7rddlm}||jd\|_ |_ |_ tjt|}t|jj!}|D]f\}}t }|j"|_|j|_|j$|_|j(|_||j-z}ht.t1|jt2zz}|t1|k(sJ|jt5|t7|dz} d| z dz} | S)Nrrrl/ac)r?rMappendrVr.r-rrr:rrrrrr5r=r>r<rr%rrrr2r3rrUsum) rAr checksumsr<rr?rE sfntEntry directory_endrYchecksumadjustments r_calcMasterChecksumzSFNTWriter._calcMasterChecksumxsf ;;##% 8C   T[[-66 7 8   "4 4 6DRE AD d0$/ %8$?IDKK--/0F$ = U.0 % %*^^ "#(#3#3  #(#3#3  % (:(:(<<  =*C ,J.(83zA!!rc|j|}|jj|jdjdz|jj t jd|y)NrPrQz>L)rr)rr?r%rrr)rArrs rrzSFNTWriter.writeMasterChecksumsS!55i@ t{{6*11A56  D*<=>rcyNFrurNs rreordersTableszSFNTWriter.reordersTablessr)r!NN) rqrrrsrrFrrrZr^rrrrurrrrs>#,' /$b! "< E#N"@? rra > # big endian TTCTag: 4s # "ttcf" Version: L # 0x00010000 or 0x00020000 numFonts: L # number of fonts # OffsetTable[numFonts]: L # array with offsets from beginning of file # ulDsigTag: L # version 2.0 only # ulDsigLength: L # version 2.0 only # ulDsigOffset: L # version 2.0 only z > # big endian sfntVersion: 4s numTables: H # number of tables searchRange: H # (max2 <= numTables)*16 entrySelector: H # log2(max2 <= numTables) rangeShift: H # numTables*16-searchRange zc > # big endian tag: 4s checkSum: L offset: L length: L ab > # big endian signature: 4s # "wOFF" sfntVersion: 4s length: L # total woff file size numTables: H # number of tables reserved: H # set to 0 totalSfntSize: L # uncompressed size majorVersion: H # major version of WOFF file minorVersion: H # minor version of WOFF file metaOffset: L # offset to metadata block metaLength: L # length of compressed metadata metaOrigLength: L # length of uncompressed metadata privOffset: L # offset to private data block privLength: L # length of private data block z > # big endian tag: 4s offset: L length: L # compressed length origLength: L # original length checkSum: L # original checksum cBeZdZdZdZdZdZdZdZdZ dZ d Z y ) r.cd|_yr)rrNs rrFzDirectoryEntry.__init__s !rcxtj|j|j|j|yrH)rr4formatrr)rAr)s rr;zDirectoryEntry.fromFiles#t{{DIIdoo$>ErcFtj|j||yrH)rr4r)rAstrs r fromStringzDirectoryEntry.fromStringst{{C.rcBtj|j|SrH)rrrrNs rrzDirectoryEntry.toStrings||DKK..rct|dr/d|jj|jt |fzSd|jjt |fzS)Nr<z<%s '%s' at %x>z <%s at %x>)r __class__rqr<idrNs r__repr__zDirectoryEntry.__repr__sN 4 $(?(?2d8'TT T4>>#:#:BtH"EE Erc|j|j|j|j}t ||jk(sJt |j dr|j|}|S)N decodeData)rr%rrr3rrrrAr)rDs rrTzDirectoryEntry.loadDatas[ $++yy%4yDKK''' 4>>< 0??4(D rct|jdr|j|}t||_|j |j |j|y)N encodeData)rrrr3rrr%rrs rrzDirectoryEntry.saveDatasE 4>>< 0??4(D$i  $++ 4rc|SrHru)rArawDatas rrzDirectoryEntry.decodeDatasrc|SrHru)rArDs rrzDirectoryEntry.encodeData s rN) rqrrrsrFr;rrrrTrrrrurrr.r.s1"F//F rr.ceZdZeZeZy)r-N)rqrrrssfntDirectoryEntryFormatrrrrurrr-r-s %F'Jrr-c2eZdZeZeZfdZdZdZ xZ S)r6cbtt| ttds t|_yy)NzlibCompressionLevel)superr6rFrZLIB_COMPRESSION_LEVELr)rArs rrFzWOFFDirectoryEntry.__init__s-  $02)+AB(>D %Crcddl}|j|jk(r|}|S|j|jksJ|j|}t ||jk(sJ|SNr)rrr decompressr3)rArrrDs rrzWOFFDirectoryEntry.decodeData"sb ;;$// )D  ;;0 00??7+Dt9/ // rct||_|jst||j}|jst|jk\r|}|j|_|S|}t||_|SrH)r3rrrrr)rArDcompressedDatars rrzWOFFDirectoryEntry.encodeData-sod)  %dD,E,EFN   N 3t FG//DK%Gg,DKr) rqrrrswoffDirectoryEntryFormatrwoffDirectoryEntrySizerrFrr __classcell__)rs@rr6r6s %F'J ?  rr6ceZdZdZddZdZy)r@r Ncd|_d|_d|_d|_|r=|j|_|j|_|jr|j j |j|j j|j}t||jk(sJ|j|}t||jk(sJ||_|jrl|j j |j|j j|j}t||jk(sJ||_yyyrH)rrrrrr)rrrr3 _decompressrrr)rAreaderrrDs rrFzWOFFFlavorData.__init__>s%     & 3 3D  & 3 3D      !2!23 ++**6+<+<=7|v'8'8888''04yF$9$9999 $      !2!23{{''(9(9:4yF$5$5555 $ ! rc,ddl}|j|Sr)rr)rArrs rrzWOFFFlavorData._decompressSsw''rrH)rqrrrsFlavorrFrrurrr@r@;s F%*(rr@c t|dz}|r |dd|z zz }d}d}|dzdk(sJtdt||D]@}||||z}tjdt|dzz|}|t |zdz}B|S)a,Calculate the checksum for an arbitrary block of data. If the data length is not a multiple of four, it assumes it is to be padded with null byte. >>> print(calcChecksum(b"abcd")) 1633837924 >>> print(calcChecksum(b"abcdxyz")) 3655064932 r rri>%dLr)r3r9rr4r)rD remaindervalue blockSizer&blocklongss rrUrUYsD A I Y'' EI q=A   1c$i +2QY' fE a8%@U#z12 Lrc|jd|jt}t|tk7r t dt }t jt|||jdk7r t d|jdk(s#|jdk(sJd|jztjd|jz|j|jd z|_ |jdk(r |S) NrrttcfzNot a Font Collectionizunrecognized TTC version 0x%08xrr )rr ttcHeaderSizer3rrrr4ttcHeaderFormatTTCTagVersionrr0r1)r)rDrAs rr/r/qsIIaL 99] #D 4yM!BCC  D NN?D$/ {{f011 <<: %)C)DLL8 C}} $--!*; <D ||z! KrcXt}d|_d|_||_|j d|j t jt||j}|j tjd|jzgdg|jz|S)Nrrrr) rrr r0rrrrrrfr)r)r0rAr%s rwriteTTCHeaderr s  DDKDLDMIIaLJJw||OT23 YY[FJJv{{6DMM1JaS4==5HJK Mr__main__)1__doc__iortypesrfontTools.misc.textToolsrfontTools.miscrrrrr collectionsr logging getLoggerrqrWrr rrrrrrcalcsizerr5r2rrr8r7rrr.r-r6r@rUr/r sysdoctestexittestmodfailedrurrrs !("B #g!|$|$@         0B&YY| !  1 %G$$%89*))*BC"%G$$%89*))*BC&V&R(( %%P((<0(  z CHH_W__  % %& r