L i8ddlmZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZmZddlmZmZmZmZmZddlmZmZmZmZmZmZmZmZm Z dd l!m"Z"m#Z#ddl$Z$e$jJd Z&d Z' ddl(Z)d Z'Gd deZ+GddeZ,dZ-ej\e-Z/dZ0dZ1ej\e1Z2dZ3ej\e3Z4dZ5dZ6e2e4zde6zzZ7dZ8dZ9ej\e9Z:dZ;dZGdd ed!Z?Gd"d#ed$Z@Gd%d&ed'ZAGd(d)eZBd*ZCd+ZDd,ZEd-ZFd.ZGd3d/ZHd0ZId3d1ZJeKd2k(rejeJyy#e*$rddl)Z)YwxYw#e*$rYwxYw)4)BytesION) OrderedDict)sstruct) calcIntBounds)Tagbytechrbyteord bytesjoinpad)TTFont TTLibErrorgetTableModule getTableClassgetSearchRange) SFNTReader SFNTWriterDirectoryEntryWOFFFlavorDatasfntDirectoryFormatsfntDirectorySizeSFNTDirectoryEntrysfntDirectoryEntrySize calcChecksum) ttProgram_g_l_y_fzfontTools.ttLib.woff2FTc>eZdZdZd dZdZdZd dZdZdZ d Z y) WOFF2Readerwoff2cts tjdtd||_t |jj d}|dk7r td|jjdt|_ |jj t}t|tk7r tdtjt||t!|_d}t%|j&D]g}|j}|j)|jt |j*} ||j"| <||_||j.z }i|} |jj |j0} t3j4| } t| | k7rtd| t| fzt7| |_|jjdd |j.|jj;k7r td t=||_tAd d |_!y) NzfThe WOFF2 decoder requires the Brotli Python extension, available at: https://github.com/google/brotliNo module named brotliswOF2z Not a WOFF2 font (bad signature)rz"Not a WOFF2 font (not enough data)zAunexpected size for decompressed font data: expected %d, found %dz4reported 'length' doesn't match the actual file sizeF recalcBBoxesrecalcTimestamp)" haveBrotlilogerror ImportErrorfilerreadr seekWOFF2DirectoryEntryrwoff2DirectorySizelenrunpackwoff2DirectoryFormatrtablesrange numTablesfromFiletagoffsetlengthtotalCompressedSizebrotli decompressrtransformBuffertellWOFF2FlavorData flavorDatar ttFont) selfr*checkChecksums fontNumber signaturedatar7ientryr6totalUncompressedSizecompressedDatadecompressedDatas [/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/ttLib/woff2.py__init__zWOFF2Reader.__init__/s II3 67 7  q)*  ?@ @ q1yy~~01 t9* *AB B+T48!m t~~& #A'')E NN499 %eii.C$DKK !EL ell "F  #!'(@(@A!,,^<  $9 9S(#.>*?@A  ''78 q! ;;$))..* *ST T)$/%G c|jt|}t|dsN|jr"|j ||_|j S|j |j|_|j S)z9Fetch the raw table data. Reconstruct transformed tables.rE)r2rhasattr transformedreconstructTablerEloadDatar<)rAr6rGs rK __getitem__zWOFF2Reader.__getitem__asg CH%uf%  !2237 zz#^^D,@,@A zzrMcH|jt|}|j|j}|dk(r.t |dr |j nd}|j ||}|S|dk(r|j}|S|dk(r|j|}|Std|z)z4Reconstruct table named 'tag' from transformed data.glyfpaddingNlocahmtxz#transform for table '%s' is unknown) r2rrRr<rOrV_reconstructGlyf_reconstructLoca_reconstructHmtxr )rAr6rGrawDatarVrEs rKrQzWOFF2Reader.reconstructTableks CH%..!5!56 &=&-dI&>dllDG((':D F]((*D  F]((1D BSHI IrMNct|jd<tx}|jd<|j||j|r||_|j |j}|S)zReturn recostructed glyf table data, and set the corresponding loca's locations. Optionally pad glyph offsets to the specified number of bytes. rWrU)WOFF2LocaTabler@WOFF2GlyfTable reconstructrVcompile)rArErV glyfTables rKrYzWOFF2Reader._reconstructGlyf{sc-. F*8*:: DKK'dDKK0  'I   - rMcfd|jvr#|jd|jd_|jd}|j |j}t ||jdj k7r0td|jdj t |fz|S)z%Return reconstructed loca table data.rWrUzMreconstructed 'loca' table doesn't match original size: expected %d, found %d)r@rQr2rErar/ origLengthr )rA locaTablerEs rKrZzWOFF2Reader._reconstructLocas  $'+'<'+I+I3t9*UV  rMcd|jjvrd}nd}|D]}|j|tx}|jd<|j ||j|j |j}|S)z%Return reconstructed hmtx table data.rU)maxphhearU)rgheadrhrWrUrX)r?transformedTables_decompileTableWOFF2HmtxTabler@r`ra)rArEtableDependenciesr6 hmtxTables rKr[zWOFF2Reader._reconstructHmtxs T__66 6 8 !I $ &C   % &*8*:: DKK'dDKK0  - rMc||}|jj|r|j|St|}||}||jj|<|j ||jy)z5Decompile table data and store it inside self.ttFont.N)r@isLoadedrr2 decompilerAr6rE tableClasstables rKrkzWOFF2Reader._decompileTableseCy ;;   $;;s# #"3' 3"' 3 dkk*rM)rN) __name__ __module__ __qualname__flavorrLrSrQrYrZr[rkrMrKrr,s, F0Hd  $+rMrceZdZdZ ddZdZdZddZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZy) WOFF2WriterrNc~ts tjdtd||_||_t ||_t||_ t|_ t|_ t|_t d|_d|_t%|_t)|_t-dd|_y)NzfThe WOFF2 encoder requires the Brotli Python extension, available at: https://github.com/google/brotlir )rEwOF2rFr#)r&r'r(r)r*r4r sfntVersionr>r?r1directoryFormatr. directorySizer-rrDnextTableOffsetrr<rr2r r@)rAr*r4rrzr?s rKrLzWOFF2Writer.__init__s II3 67 7 "{+)z:3/1V &y!m %G rMc||jvrtd|z|dk(r|xjdzc_y|j}t ||_t |j |_||_||j|<y)z4Associate new entry named 'tag' with raw table data.zcannot rewrite '%s' tableDSIGN) r2r r4rrr6getKnownTagIndexflagsrE)rAr6rErGs rK __setitem__zWOFF2Writer.__setitem__sw $++ 83>? ? &= NNa N ##%H &uyy1    CrMct|j|jk7r-td|jt|jfz|jdvrd}n|jdk(rd}n td|r8d|j j vr d|jvr|jd |jtt|jj|_|j|_ |j}tj |tj" }t||_|j'|_|j+\|_|_d |_|j3}|j4j7d |j4j9t;||zd |j=y )zJAll tags must have been specified. Now write the table data and directory.z-wrong number of tables; expected %d, found %d)trueTOTTOFz1Not a TrueType or OpenType font (bad sfntVersion)rUr!)rVmodersizeN)r/r2r4r rr?rj_normaliseGlyfAndLoca_setHeadTransformFlagrsorteditems#_calcSFNTChecksumsLengthsAndOffsets totalSfntSize_transformTablesr:compress MODE_FONTr9_calcTotalSizer8 _getVersion majorVersion minorVersionreserved_packTableDirectoryr*r,writer _writeFlavorData)rA isTrueTypefontDatacompressedFont directorys rKclosezWOFF2Writer.closes t{{ t~~ -?>>3t{{#345    ; ;J    'JPQ Q $//;;;$++%  & &q & 1 ""$"&):):)<"=> !EEG((*8H8HI#&~#6 ))+ /3/?/?/A,4, ,,.  q I6Q?@ rMc|jdk(rydD]"}||jvs|j|$||jd_dD]}|j |y)zRecompile glyf and loca tables, aligning glyph offsets to multiples of 'padding' size. Update the head table's 'indexToLocFormat' accordingly while compiling loca. rN)rgrirWrUfvarrUrUrW)rr2rkr@rV _compileTable)rArVr6s rKrz!WOFF2Writer._normaliseGlyfAndLocasn   v % ; *Cdkk!$$S) *'. F## $C   s # $rMc|jd|jdxjdzc_|jdy)zSet bit 11 of 'head' table flags to indicate that the font has undergone a lossless modifying transform. Re-compile head table data.riiN)rkr@rrrAs rKrz!WOFF2Writer._setHeadTransformFlag.s: V$ F!!W,! 6"rMct|}||jvrtd|z|jj |ry|j|j }|dk(rt }n#|dk(rt}n|dk(rt}n t|}||}||jj|<|j||jy)z@Fetch table data, decompile it, and store it inside self.ttFont.zmissing required table: %sNrWrUrX) rr2r r@rprEr^r_rlrrqrrs rKrkzWOFF2Writer._decompileTable5s#h dkk !9C?@ @ ;;   $ {{3$$ &='J F]'J F]'J&s+J3"' 3 dkk*rMcx|j|j|j|j|_y)z3Compile table and store it in its 'data' attribute.N)r@rar2rErAr6s rKrzWOFF2Writer._compileTableIs+ $ C 0 8 8 E CrMcdttt|jzz}|jj D]o\}}|j }||_t||_|dk(rt|dddz|ddz|_ nt||_ ||jdzdzz }q|S)zCompute the 'original' SFNT checksums, lengths and offsets for checksum adjustment calculation. Return the total size of the uncompressed font. riNs ) rrr/r2rrE origOffsetrdrcheckSum)rAr7r6rGrEs rKrz/WOFF2Writer._calcSFNTChecksumsLengthsAndOffsetsMs#%;c$++>N%NN++++- 2JC::D%E "4yE f}!-d2Ah.DtBCy.P!Q!-d!3 u''!+r1 1F 2 rMc|jj}|jjD]\}}d}||vr|j |}|d|_|)|dk(r|j d|j}d|_|j|_ |j|j||xj|jz c_|j|jj}|S)zReturn transformed font data.NTrUrWF)r?rjr2rtransformTablerPdiscardrErr7saveDatar<r8writeMasterChecksumgetvalue)rArjr6rGrErs rKrzWOFF2Writer._transformTables]s OO==++++- 1JCD''**3/#(,E%|&=&--f5zz$)!//EL NN4// 6  ELL 0 ! 1"   "''002rMcr|dk(rd}|S|dk(rDdD]}|j||jd}|j|j}|S|dk(rSd|jvrydD]}|j||jd}|j|j}|St d|z) zReturn transformed table data, or None if some pre-conditions aren't met -- in which case, the non-transformed table data will be used. rWrMrU)rgrirWrUrXN)rgrirhrWrUrXz#Transform for table '%s' is unknown)rkr@ transformr2r )rAr6rErbrns rKrzWOFF2Writer.transformTableus &=D F]7 *$$S) * F+I&&t{{3D F]T[[(G *$$S) * F+I&&t{{3D BSHI IrMcg}|jjD]*}|j|j|j,t |j d\|_|_|_tjt|}t|jj}|D]f\}}t}|j|_|j|_|j |_|j$|_||j)z}ht*t-|jt.zz}|t-|k(sJ|jt1|t3|dz}d|z dz} | S)zCalculate checkSumAdjustment.ll/ac)r2keysappendrrr4 searchRange entrySelector rangeShiftrpackrrrrr6rr7rdr8toStringrr/rrsum) rA checksumsr6rr2rG sfntEntry directory_endchecksumchecksumadjustments rK_calcMasterChecksumzWOFF2Writer._calcMasterChecksumsV ;;##% 8C   T[[-66 7 8AO NNBA =$,doLL!4d;  ))+,  9JC*,I!IIIM!&I $//I $//I !I$6$6$88I  9*C ,J.(83zA!!rMc|j}|jj|jdjdz|jj t jd|y)z0Write checkSumAdjustment to the transformBuffer.rirz>LN)rr<r,r2r7rstructr)rArs rKrzWOFF2Writer.writeMasterChecksumsY!557 !!$++f"5"<"HHr!r)rr)r?rrr2rr0rErArEs rKrzWOFF2Writer._getVersionsq    (T->->-J$$d&7&77 7$}}UDKK,?,D,DQq,IJJrMctj|j|}|jj D]}||j z}|S)z"Return WOFF2 table directory data.)rrrr2rr)rArrGs rKrzWOFF2Writer._packTableDirectorysKLL!5!5t< [['') 5E!ENN$44I 5rMc|j}|jj}|r|r t|d}|ri|jj |j |jj|j k(sJ|jj||rj|jj |j|jj|jk(sJ|jj|yy)z>#t6 66 IIOO. /  IINN4?? +99>>#t6 66 IIOOH % rMcy)NTr{rs rKreordersTableszWOFF2Writer.reordersTablessrM)rNN)r!)rwrxryrzrLrrrrrkrrrrrrrrrrrrr{rMrKr}r}sq F ' HD!$4 l $#+(F 0,":J 2  &rMr}a > # big endian signature: 4s # "wOF2" sfntVersion: 4s length: L # total woff2 file size numTables: H # number of tables reserved: H # set to 0 totalSfntSize: L # uncompressed size totalCompressedSize: L # compressed 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 )?cmaprirhrXrgnamezOS/2postzcvt fpgmrUrWprepzCFF VORGEBDTEBLCgasphdmxkernLTSHPCLTVDMXvheavmtxBASEGDEFGPOSGSUBEBSCJSTFMATHCBDTCBLCCOLRCPALzSVG sbixacntavarbdatblocbslncvarfdscfeatfmtxrgvarhstyjustlcarmortmorxopbdproptrakZapfSilfGlatGlocFeatSillz5 > # big endian flags: B # table type and flags z5 > # big endian tag: 4s # 4-byte tag (optional) ?r"ra > # big endian version: H # = 0x0000 optionFlags: H # Bit 0: we have overlapSimpleBitmap[], Bits 1-15: reserved numGlyphs: H # Number of glyphs indexFormat: H # Offset format for loca table nContourStreamSize: L # Size of nContour stream nPointsStreamSize: L # Size of nPoints stream flagStreamSize: L # Size of flag stream glyphStreamSize: L # Size of glyph stream compositeStreamSize: L # Size of composite stream bboxStreamSize: L # Comnined size of bboxBitmap and bboxStream instructionStreamSize: L # Size of instruction stream zF > # big endian xMin: h yMin: h xMax: h yMax: h rcX tj|S#t$r tcYSwxYw)zEReturn index of 'tag' in woff2KnownTags list. Return 63 if not found.)woff2KnownTagsindex ValueErrorwoff2UnknownTagIndex)r6s rKrrs-$##C(( $##$s ))ceZdZdZdZdZedZejdZedZ e jdZ y) r-c|j}|jt}|j|}t |t |z }|j ||zyrv)r=r+woff2DirectoryEntryMaxSize fromStringr/r,)rAr*posrEleftconsumeds rKr5zWOFF2DirectoryEntry.fromFilesLiikyy34t$t9s4y( #.!rMcRt|dkr tdtjt||\}}|j dzdk(r4s) rrrrr6tobytes packBase128rdrPr8rs rKrzWOFF2DirectoryEntry.toStringswtzz" JJ $ & FKKtxx'7'7'9: :D DOO,,    K , ,D rMc |jdz S)zReturn bits 6-7 of table entry's flags, which indicate the preprocessing transformation version number (between 0 and 3). rrs rKtransformVersionz$WOFF2DirectoryEntry.transformVersions zzQrMcTd|cxkrdksJJ|xj|dzzc_y)Nrrr3r4)rAvalues rKr5z$WOFF2DirectoryEntry.transformVersions)EQ eqj rMcZ|jdvr|jdk7S|jdk7S)zCReturn True if the table has any transformation, else return False.>rUrWrr)r6r5rs rKrPzWOFF2DirectoryEntry.transformeds3 88' '((A- -((A- -rMcd|jdvr|sd|_yd|_yt||_y)N>rUrWrr)r6r5int)rA booleanValues rKrPzWOFF2DirectoryEntry.transformeds/ 88' '-9AD !qD !$' $5D !rMN) rwrxryr5r$rpropertyr5setterrPr{rMrKr-r-sm", !! . .66rMr-c*eZdZdZddZfdZxZS)r^zSame as parent class. The only difference is that it attempts to preserve the 'indexFormat' as encoded in the WOFF2 glyf table. c,t|xsd|_y)NrWrtableTagrs rKrLzWOFF2LocaTable.__init__CM6* rMc| t|j}d|vrt |ddr|dj }|dk(rr|dk\r t dtd|jDs t dtjd}|jD]}|j|d zn tjd |j}tjd k7r|j|j}|Stt|C|}|S#t$r|jgd}Y"wxYw) NrrU indexFormatiz,indexFormat is 0 but local offsets > 0x20000c3,K|] }|dzdk(yw)r"rNr{).0ls rK z)WOFF2LocaTable.compile..s>!1q5A:>sz5indexFormat is 0 but local offsets not multiples of 2Hr"Ibig)max locationsAttributeErrorsetrOrDr allarrayrsys byteorderbyteswapr0superr^ra)rAr@ max_locationrDrMlocationrE __class__s rKrazWOFF2LocaTable.compiles+ t~~.L V v F .44Ka7*$%STT>t~~>>$O"KK, $4H$$X]34"KKT^^< }}%""$$$&D 6v>D 1  HHRLL sDD;:D;rv)rwrxry__doc__rLra __classcell__rXs@rKr^r^s+rMr^rWc|eZdZdZdZddZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZy)r_z1Decoder/Encoder for WOFF2 'glyf' table transform.)nContourStream nPointsStream flagStream glyphStreamcompositeStream bboxStreaminstructionStreamNc,t|xsd|_y)NrUr@rs rKrLzWOFF2GlyfTable.__init__rBrMct|}|tkr tdtjt ||\}}t}|j D]+}t||dz}t|||d|||d}||z }-|jtz}d|_ |r5|jdzdz } tjd|d| |_ || z }||k7rtd||fz|jdzd z d z} |jd| } tjd| |_|j| d|_tjd |j |_t"j$d k7r|j j't|j |jk(sJd |vr|j(|d _ |j-|_|j.Idg|_|j.j1t3d|jD cgc]} d| z c} nOt|j.|jk7r-tdt|j.|jfzix} |_t7|j.D]\}}|j9|}|| |<y#d|_YxYwcc} w)z"Decompile transformed 'glyf' data.znot enough 'glyf' dataSizeNrBzJincorrect size of transformed 'glyf' table: expected %d, received %d bytesrr"hrKriz.notdefrz glyph%.5dz2incorrect glyphOrder: expected %d glyphs, found %d)r/woff2GlyfTableFormatSizer rr)woff2GlyfTableFormat subStreamsgetattrsetattr optionFlagswoff2OverlapSimpleBitmapFlagoverlapSimpleBitmap numGlyphsrQrb bboxBitmapr]rRrSrTrDindexToLocFormat getGlyphOrder glyphOrderextendr3glyphs enumerate _decodeGlyph)rArEr@ inputDataSizer.r7streamrhasOverlapSimpleBitmapoverlapSimpleBitmapSizebboxBitmapSizertrFryglyphID glyphNameglyphs rKr`zWOFF2GlyfTable.reconstruct sD 3 356 6oo&:D$G t)oo F4&1D D&$u+ .;D dNF   "&!1!14P!P#' !'+~~'9a&? #',{{3=U>U8V'WD $ - -F ] "\=)*   >>B.14:___n5 ++c:6//./:#kk#t/B/BC ==E !    ( ( *4&&'4>>999 V .2.>.>F6N + #$224DO ?? "(kDO OO " "U1dnn=U#VK!O#V W4??#t~~5 H4??+T^^<= "!"+DOO"< & GY%%g.E %F9  & #"DO$WsJ< K < Kc lt|j|_t|j|jk(sJd|vr|j|d_|dj|_|j D]}t||d|jdzdz dz}tjddg|z|_ tjddg|jd zd z z|_ t|jD]} |j|t|j}|jj|j z|_|j D]%}t||d ztt#||'d|_d|_|r|xj&t(zc_t+j,t.|}|t1|j Dcgc]}t#||c}z }|r||jjz }|S#t$rYy wxYwcc}w) zReturn transformed 'glyf' datargrirMrirr"rhrrgrNrf)r/ryrsrwrurDrmrorQrtrrr3 _encodeGlyphNotImplementedErroranyr0rbrnversionrprqrrrlr )rAr@r}rrr~rEss rKrzWOFF2GlyfTable.transformEsT[[)4??#t~~555 V '+~~F6N $!&>::oo 'F D&# & '>>B.14:++cA3+?@#(;;sQCDNNQ//113dooEoo GF D&6/3wtV/D+E F G  !    < < ||0$7 T__E74+EFF ! D,,446 6D '  FsH!$H1 ! H.-H.c0tdj}|j||_|jdk(r|S|j r|j |n#|j ||j|||j|||S)NrUr) rGlyphr]numberOfContours isComposite_decodeComponents_decodeCoordinates_decodeOverlapSimpleFlag _decodeBBox)rArrs rKr{zWOFF2GlyfTable._decodeGlyphgsv&,,.!%!4!4W!=  ! !Q &L     " "5 )  # #E *  ) )% 9 %( rMc|j}g|_d}d}|rRtdj}|j ||\}}}||z}|jj ||rR||_|r|j |yy)NrrrU)ra componentsrGlyphComponentrqr_decodeInstructions)rArrEmorehaveInstructions component haveInstrs rKrz WOFF2GlyfTable._decodeComponentsts##&v.==?I$-$7$7d$C !D)T/);     # #I .  $   $ $U + rMc|j}g}d}t|jD]&}t|\}}||z }|j |(||_||_|j ||j|yNru)r^r3runpack255UShortrendPtsOfContours_decodeTripletsr)rArrErendPointrF ptsOfContours rKrz!WOFF2GlyfTable._decodeCoordinatess!!u--. .A!0!6 L$  $H  # #H - ."2! U#   'rMc|j|jdkry|dz }|dz}|j|d|z zr&|jdxxtjzcc<yyNrrrg)rrrrrflagOverlapSimplerArrbytebits rKrz'WOFF2GlyfTable._decodeOverlapSimpleFlagsd  # # +u/E/E/J !|k  # #D )TS[ 9 KKNh88 8N :rMc|j}|j}t|\}}tj|_|j j |d|||_||d|_yrv)r`rcrrProgramprogram fromBytecode)rArr`rcinstructionLengths rKrz"WOFF2GlyfTable._decodeInstructionssn&&  22)8)E&;!))+  ""#45G6G#HI&!23D3E!FrMct|j|dz d|dzz z}|jr|std|z|r.t j t |j|\}|_y|j|y)Nrrrgz%no bbox values for composite glyph %d) boolrtrr rr) bboxFormatrb recalcBounds)rArrhaveBBoxr.s rKrzWOFF2GlyfTable._decodeBBoxsu1 5'A+9NOP    xDwNO O %,__ZRW%X "E4?   t $rMcd}|jddz}|}|t|jkDr td|jd|}|j|d|_t jd|}t jd|j }t|}||ksJd} d} t djj||_ t jd|_ d} t|D]} || } t| dz  }| d z} | d krd}n| d krd }n | d krd}nd}| |z|ksJ| dkrd}|| | dzdz|| z}n| dkr|| | dz dzdz|| z}d}n| d kr;| dz }|| }|| d|dzz|dz z}|| dz d|dzd zz|dzz}n| d kr?| d z }|| d|dzdzz|| z}|| dz d|dzd z dzz|| dzz}nt| d kr9|| dz}|| || dz|dz z}|| dz |dzdz|| d zz}n6|| || dz|| dzz}|| dz || d zdz|| dzz}| |z } | |z } | |z } | | f|j| <|jjt|| }|j |d|_y)Nc8d|kr|dksJd|dzr|S| S)Nrizinteger overflowrr{)flagbasevals rKwithSignz0WOFF2GlyfTable._decodeTriplets..withSigns.)?29)MNBYdA"(q$9H\hr) getGlyphNamer]rrrr_encodeComponents_encodeCoordinates_encodeOverlapSimpleFlag _encodeBBox)rArrrs rKrzWOFF2GlyfTable._encodeGlyphs%%g. Y v{{41G1GHH  ! !Q &      " "5 )  # #E *  ) )% 9 %(rMct|jdz }d}d}t|jD]>\}}||k(rt|d}d}|xj|j |||z c_@|r|j |yy)Nrrr)r/rrzrOrara_encodeInstructions)rAr lastcomponentrrrFrs rKrz WOFF2GlyfTable._encodeComponentssE,,-1 %e&6&67 TLAyM!#*5)#<   I$5$5dH66 6a>% 7<< E::rMct|jt|jk(sJ|jj}|j t j d}t j d}t |D]p\}\}}|j|tjz}t|} t|} |rdnd} |dkrdnd} |dkrdnd} | d| zz}|dk(r7| dkr2|j| | dzdz z| z|j| d z|dk(r:| dkr5|j| d z| dzdz z| z|j| d z| d krV| d krQ|j| d z| dz d zz| dz d zdz z|z|j| dz dzdz| dz dzz6| dkrg| dkrb|j| dzd| dz dzdz zz| dz dzdz z|z|j| dz d z|j| dz d z| dkrc| dkr^|j| dz|z|j| dz |j| dzdz| dz z|j| d z |j| dz|z|j| dz |j| d z|j| dz |j| d zs|xj|jz c_ |xj|jz c_ y)Nrhrrrr"iirgrArrrr!irrirr3irr)r/rrcopyabsoluteToRelativerQrzr flagOnCurveabsrr_r0r`)rArrrrrFrrrabsXabsY onCurveBitxSignBitySignBit xySignBitss rKrzWOFF2GlyfTable._encodeTriplets0sJ5$$%U[[)9999'',,. &&( C ;;s#";/, -IAv1kk!nx';';;Gq6Dq6D%3JUqHUqH!AL0JAv$+ ZD5LQ+>?(JKt ,aD4K Z"_!0CDxOPt ,tby qD(*T)a/1! !4!8s"2q!8dQh#=M NOs  dQh%/A567U*q02! !T 12T 12 Z#- :; *$*!2tqy ABt , Z#- :; *t , *t ,Y, -\ 5==?* H,,..rMrv)rwrxryrYrmrLr`rr{rrrrrrrrrrrrrr{rMrKr_r_sf;J+9&v D  , (9G%HBrrz#Bits 2-7 of '%s' flags are reservedr"z?either bits 0 or 1 (or both) must set in transformed '%s' flagsrUrhrIrKrjrztoo much '%s' table dataru)rr0r rArwr/minr:numberOfHMetricsrQrRrSrTrzrnrmetricsr3)rArEr@r hasLsbArrayhasLeftSideBearingArrayrb headerTablerwrsradvanceWidthArraylsbArrayrFrrrnumberOfSideBearingsleftSideBearingArray advanceWidthlsb lastAdvances rKr`zWOFF2HmtxTable.reconstructmsb==tBQx0ABx :  "BT]]RS Sai1n "'!)q. 2Q--   6N Vn ))  O s;#?#?@)L4yA 00000!KKT2HA8H4H-IJ ==E !  & & (A((*+ t9$4 44 44{{3-Cq3C/C(DEH}}%!!#,,./D{{3'H )* 5 & 9((!),ufa0%  & )+;; "t9$8 88 88#(;;sD9S1?S;S4T#U }}%$--/0023D$);;s#3 )* 5 2 9''!),ufa0$++D1  2 7$--GH H '( :A"1 I 1! 4hqk#L'3S&9DLL # :(+ +, MA"1'7#78I'24H4K&LDLL # MrMc |j}|d}|d}|j}d}t|D]0}||}|j|d} | t ||ddk7s.d}nd} t|t |D]0}||}|j|d} | t ||ddk7s.d} n|r| ryd} |s| dz} | s| dz} t jd | } tjd t|Dcgc]\}}||kr|j|dc}}} tjd k7r| j| | jz } |r}tjd t|Dcgc]\}}||kr|j|dc}}}tjd k7r|j| |jz } | rtjd t|t |Dcgc]}|j||dc}}tjd k7r|j| |jz } | Scc}}wcc}}wcc}w) NrUrhFrrrTr"rrIrKrj)rvrr3rrnr/rrrQrzrRrSrTr0)rAr@rwrUrhrrrFrr rrrErrrs rKrzWOFF2HmtxTable.transforms))+ f~f~00 '( A"1 I,,y)!,Cgd9ovq99"   #('Z9 A"1 I,,y)!,Cgd9ovq99*.'   2  VOE& VOE{{4'!KK %.j$9  Ay'' Y'*   ==E !  & & ( !))++ {{)2*(=$9++LL+A.H}}%!!# H$$& &D "#(;;##3S_ELLA/2$ }}%$--/ (002 2D G s:!I 9!I" I( rv)rwrxryrLr`rr{rMrKrlrlis+HMTLrMrlrXc*eZdZdZdfd ZdZxZS)r>rc6ts td|| td| td|d|vrd|vsd|vrd|vr tdtt |||r:|jjDcgc]\}}|js|}}}n`|r^|j|_ |j|_ |j|_ |j|_ |t|d r |j}|t }t#||_ycc}}w) a Data class that holds the WOFF2 header major/minor version, any metadata or private data (as bytes strings), and the set of table tags that have transformations applied (if reader is not None), or will have once the WOFF2 font is compiled. Args: reader: an SFNTReader (or subclass) object to read flavor data from. data: another WOFFFlavorData object to initialise data from. transformedTables: set of strings containing table tags to be transformed. Raises: ImportError if the brotli module is not installed. NOTE: The 'reader' argument, on the one hand, and the 'data' and 'transformedTables' arguments, on the other hand, are mutually exclusive. r Nz4'reader' and 'data' arguments are mutually exclusivezA'reader' and 'transformedTables' arguments are mutually exclusiverUrWz7'glyf' and 'loca' must be transformed (or not) together)readerrj)r&r) TypeErrorrrUr>rLr2rrPrrrrrOrjwoff2TransformedTableTagsrO)rArrErjr6rGrXs rKrLzWOFF2FlavorData.__init__ s5"67 7   VWW ,W  ( ' '//**//VW W ot-V-< &,mm&9&9&;!"Uu?P?P! ! $ 1 1D  $ 1 1D  MMDM MMDM (WT;N-O$($:$:!  $ 9 !$%6!7!s ?DDc,tj|Srv)r:r;)rAr\s rK _decompresszWOFF2FlavorData._decompress>s  ))rM)NNN)rwrxryFlavorrLrrZr[s@rKr>r>s F38j*rMr>cXt|dk(r tdd}t|ddk(r tdttD]W}t|dk(r tdt|d}|dd}|dzr td|d z|d zz}|dzdk(sS||fcStd ) aRead one to five bytes from UIntBase128-encoded input string, and return a tuple containing the decoded integer plus any leftover data. >>> unpackBase128(b'\x3f\x00\x00') == (63, b"\x00\x00") True >>> unpackBase128(b'\x8f\xff\xff\xff\x7f')[0] == 4294967295 True >>> unpackBase128(b'\x80\x80\x3f') # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): File "", line 1, in ? TTLibError: UIntBase128 value must not start with leading zeros >>> unpackBase128(b'\x8f\xff\xff\xff\xff\x7f')[0] # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): File "", line 1, in ? TTLibError: UIntBase128-encoded sequence is longer than 5 bytes >>> unpackBase128(b'\x90\x80\x80\x80\x00')[0] # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): File "", line 1, in ? TTLibError: UIntBase128 value exceeds 2**32-1 rz%not enough data to unpack UIntBase128rz3UIntBase128 value must not start with leading zerosrNl|z!UIntBase128 value exceeds 2**32-1rgrz3UIntBase128-encoded sequence is longer than 5 bytes)r/r r r3woff2Base128MaxSize)rEresultrFcodes rKr-r-Bs* 4yA~@AA FtAw4NOO & '   t9>DE EtAwABx J @A AA+$+. 4KA 4<    J KKrMcB|dk\sJd}|dk\r|dz }|dz}|dk\r|S)zReturn the length in bytes of a UIntBase128-encoded sequence with value n. >>> base128Size(0) 1 >>> base128Size(24567) 3 >>> base128Size(2**32-1) 5 rrrrgr{)nrs rK base128Sizeros= 6M6 D s(   a s( KrMc|dks|dk\r tdd}t|}t|D]9}|d||z dz zz dz}||dz kr|dz}|tjd |z };|S) aEncode unsigned integer in range 0 to 2**32-1 (inclusive) to a string of bytes using UIntBase128 variable-length encoding. Produce the shortest possible encoding. >>> packBase128(63) == b"\x3f" True >>> packBase128(2**32-1) == b'\x8f\xff\xff\xff\x7f' True rlz3UIntBase128 format requires 0 <= integer <= 2**32-1rMrgrrrrh)r rr3rr)rrErrFbs rKr1r1s 1uU NOO D q>D 4[$ 1q1 % &$ . tax< IA  C## $ KrMct|dd}|dd}|dk(r=t|dkr tdtjd|dd\}|dd}||fS|dk(r5t|dk(r tdt|dd}|d z }|dd}||fS|d k(r5t|dk(r tdt|dd}|dz }|dd}||fS|}||fS) aRead one to three bytes from 255UInt16-encoded input string, and return a tuple containing the decoded integer plus any leftover data. >>> unpack255UShort(bytechr(252))[0] 252 Note that some numbers (e.g. 506) can have multiple encodings: >>> unpack255UShort(struct.pack("BB", 254, 0))[0] 506 >>> unpack255UShort(struct.pack("BB", 255, 253))[0] 506 >>> unpack255UShort(struct.pack("BBB", 253, 1, 250))[0] 506 Nrr"z#not enough data to unpack 255UInt16z>Hrr)r r/r rr0)rErrs rKrrs 48 D 8D s{ t9q=BC CMM$Ra1 ABx& 4<%  t9>BC Cbq"# ABx 4<  t9>BC Cbq"# ABx 4< 4<rMc |dks|dkDr td|dkrtjd|S|dkrtjdd|dz S|d krtjdd |dz Stjd d|S) aEncode unsigned integer in range 0 to 65535 (inclusive) to a bytestring using 255UInt16 variable-length encoding. >>> pack255UShort(252) == b'\xfc' True >>> pack255UShort(506) == b'\xfe\x00' True >>> pack255UShort(762) == b'\xfd\x02\xfa' True riz/255UInt16 format requires 0 <= integer <= 65535rrr!z>BBrir z>BH)r rr)r7s rKrrs qyEFNJKK s{{{4'' {{5#us{33 {{5#us{33{{5#u--rMctjd|d|t|dd}d|_|t |j ||_|j |dy) ayCompress OpenType font to WOFF2. Args: input_file: a file path, file or file-like object (open in binary mode) containing an OpenType font (either CFF- or TrueType-flavored). output_file: a file path, file or file-like object where to save the compressed WOFF2 font. transform_tables: Optional[Iterable[str]]: a set of table tags for which to enable preprocessing transformations. By default, only 'glyf' and 'loca' tables are transformed. An empty set means disable all transformations. Processing  => Fr#rN)rErj reorderTables)r'infor rzr>r?save) input_file output_filetransform_tablesfonts rKrrsXHHj+ >? *5% HDDK#)4D  IIkI/rMctjd|d|t|dd}d|_d|_|j |dy)aDDecompress WOFF2 font to OpenType font. Args: input_file: a file path, file or file-like object (open in binary mode) containing a compressed WOFF2 font. output_file: a file path, file or file-like object where to save the decompressed OpenType font. r$r%Fr#NTr&)r'r(r rzr?r))r*r+r-s rKr;r;sAHHj+ >? *5% HDDKDOIIkI.rMcddlddlm}ddlm}Gfddj }Gddj }Gd d j }jd tjd }|jdd|d|jd}|jdd}|jdd} || fD]>} | jd } | jdddd| jdddd @|jd!d"d#$| jd!d"d%$|jd&d'd(d)$| jd&d'd(d*$|j} | jd+d,d|d-.| jd/d,d|d0.|jt d1d2h3| jt"4t%|j'|} | j)d5d}|s|j+y| j)d6}| j)d7}||rd8n|rd9nd:;| d<s|t urd=}nl|t"urYt-| d!d>5}|j/d?|j1d?}dddt3d?k(sJd@|dAk(rdBndC}n t5||| d!d|D| d<< |dEi| y#1swYNxYw#t6$r}|j9|Yd}~yd}~wwxYw)Fz#Compress and decompress WOFF2 fontsrN) configLogger)makeOutputFileNameceZdZdfd Zy)main.._HelpActionNc|jDcgc]}t| jr|}}|D]=}|jj D]\}} t | j  ?|jycc}wrv)_actions isinstance_SubParsersActionchoicesrprint format_helpexit) rAparser namespacer option_stringactionsubparsers_actionssubparsers_actionchoice subparserargparses rK__call__z"main.._HelpAction.__call__ s%oo"fh&@&@A" " &8 3!):)B)B)H)H)J3%FI)//123 3 KKM"sBrvrwrxryrE)rDsrK _HelpActionr3 s rMrGceZdZddZy)$main.._NoGlyfTransformActionNc>|jjddhy)NrUrW)r,difference_updaterAr<r=rr>s rKrEz-main.._NoGlyfTransformAction.__call__s  & & 8 8&&9I JrMrvrFr{rMrK_NoGlyfTransformActionrIs KrMrMceZdZddZy)"main.._HmtxTransformActionNc:|jjdyr)r,addrLs rKrEz+main.._HmtxTransformAction.__call__s  & & * *6 2rMrvrFr{rMrK_HmtxTransformActionrOs 3rMrRzfonttools ttLib.woff2F)prog descriptionadd_helpz-hz--helpzshow this help message and exit)r?helpz sub-commands)titlerz#Compress a TTF or OTF font to WOFF2)rTr;zDecompress a WOFF2 font to OTF)requiredz-vz --verbose store_truezprint more messages to consolez-qz--quietz do not print messages to consoler*INPUTz&the input OpenType font (.ttf or .otf))metavarrVzthe input WOFF2 fontz-oz --output-fileOUTPUTzthe output WOFF2 fontzthe output OpenType fontz--no-glyf-transformr,z'Do not transform glyf (and loca) tables)destnargsr?rVz--hmtx-transformz/Enable optional transformation for 'hmtx' tablerUrW) subcommandr,)r_r_quietverboseERRORDEBUGINFO)levelr+z.woff2rbr!znot enough datasOTTOz.otfz.ttf) outputDir extensionr{)rD fontToolsr0 fontTools.ttxr1rGActionArgumentParsermainrY add_argumentadd_subparsers add_parseradd_mutually_exclusive_groupadd_argument_group set_defaultsrr;vars parse_argspop print_helpopenr,r+r/AssertionErrorr r()argsr0r1rGrMrRr< parser_groupparser_compressparser_decompressrCgrouptransform_groupoptionsr_r`rarhfrerDs @rKrmrms&0 h** KK3x3 $ $ $$,,%F  h{1R((~(>L"-- E.O%//"B0&'89  666F   1    3       5! "" ##     $ ! ""  ' #&88:O   % 6 !   # > !   &)!""j"96$$T*+G\40J  KK Ekk)$GwWV = !  ! I : %gl+T2 (aq ffQi  ({#q( ;*; ;("-"8fI , ,!3 L !TY"  W ( (  Qs$#K K K K="K88K=__main__rv)MiorrRrQr collectionsrfontTools.miscrfontTools.misc.arrayToolsrfontTools.misc.textToolsrrr r r fontTools.ttLibr r rrrfontTools.ttLib.sfntrrrrrrrrrfontTools.ttLib.tablesrrlogging getLoggerr'r& brotlicffir:r)rr}r1calcsizer.rr*woff2FlagsSizer,r+r rr#rrlrkrrqrr-r^r_rlr>r-rr1rrrr;rmrwr;r{rMrKrs #"3JJ   7g/0   #J C+*C+LB*BN $&W%%&:;@D "!!"23 'g&&'<=((1/B+BB- ,7++,@A  &$G6.G6T#]6*#Ll/]6*l/^ Z]6*Zz9*n9*x*LZ$,)X..04/"GT z CHHTVU3   s09F=F F  F F  FFF