L i0ndZddlmZddlmZmZmZmZddlZddl m Z ddl m Z ddl Z ddlZejeZgdZgdZd Ze j*d Zd Zee\ZZee\ZZGd d eZdZdZdZ dede dedZ!e j*e!Z"e j*dZ#e j*dZ$e j*dZ%e j*dZ&dZ'Gdde(Z)dZ*edk(r4ddl+Z+ddl,Z,e+jZe,j\j^yy)zSttLib.tables.ttProgram.py -- Assembler/disassembler for TrueType bytecode programs.) annotations) num2binary binary2numreadHexstrjoinN)StringIO)List))@NPUSHBr PushNBytesr)ANPUSHWr PushNWordsrr )PUSHB PushBytesrr )PUSHWr PushWordsrr )w)AAr AdjustAngler)dABSrAbsoluterr)`ADDrAddr)'ALIGNPTSrAlignPtsr"r)<ALIGNRPrAlignRelativePtr r)ZANDr LogicalAndr"r)+CALLr CallFunctionrr)gCEILINGrCeilingrr)%CINDEXrCopyXToTopStackrr)"CLEARr ClearStackr r)ODEBUGr DebugCallrr)sDELTAC1rDeltaExceptionC1r r)tDELTAC2rDeltaExceptionC2r r)uDELTAC3rDeltaExceptionC3r r)]DELTAP1rDeltaExceptionP1r r)qDELTAP2rDeltaExceptionP2r r)rDELTAP3rDeltaExceptionP3r r)$DEPTHr GetDepthStackrr)bDIVrDivider"r) DUPrDuplicateTopStackrr")YEIFrEndIfrr)ELSErElserr)-ENDFrEndFunctionDefinitionrr)TEQrEqualr"r)WEVENrEvenrr),FDEFrFunctionDefinitionrr)NFLIPOFFrSetAutoFlipOffrr)MFLIPONr SetAutoFlipOnrr)FLIPPTr FlipPointr r) FLIPRGOFFr FlipRangeOffr"r)FLIPRGONr FlipRangeOnr"r)fFLOORrFloorrr)FGCrGetCoordOnPVectorrr)GETINFOrGetInforr) GETVARIATIONr GetVariationrr ) GFVr GetFVectorrr") GPVr GetPVectorrr")RGTr GreaterThanr"r)SGTEQrGreaterThanOrEqualr"r)IDEFrInstructionDefinitionrr)XIFrIfrr)INSTCTRLrSetInstrExecControlr"r)9IPrInterpolatePtsr r)ISECTrMovePtToIntersectr)0IUPrInterpolateUntPtsrr)JMPRrJumprr)yJROFrJumpRelativeOnFalser"r)xJROTrJumpRelativeOnTruer"r)*LOOPCALLrLoopAndCallFunctionr"r)PLTrLessThanr"r)QLTEQrLessThenOrEqualr"r)MAXrMaximumr"r)IMDrMeasureDistancer"r).MDAPrMoveDirectAbsPtrr)MDRPrMoveDirectRelPtrr)>MIAPrMoveIndirectAbsPtr"r)MINrMinimumr"r)&MINDEXrMoveXToTopStackrr)MIRPrMoveIndirectRelPtr"r)KMPPEMrMeasurePixelPerEmrr)LMPSrMeasurePointSizerr):MSIRPrMoveStackIndirRelPtr"r)cMULrMultiplyr"r)eNEGrNegaterr)UNEQrNotEqualr"r)\NOTr LogicalNotrr)lNROUNDr"NoRoundrr)VODDrOddrr)[ORr LogicalOrr"r)!POPr PopTopStackrr)ERCVTrReadCVTrr)}RDTGrRoundDownToGridrr)zROFFrRoundOffrr)ROLLrRollTopThreeStackrr)hROUNDr"Roundrr)CRSr ReadStorerr)=RTDGrRoundToDoubleGridrr)RTGr RoundToGridrr)RTHGrRoundToHalfGridrr)|RUTGr RoundUpToGridrr)wS45ROUNDrSuperRound45Degreesrr)~SANGWrSetAngleWeightrr)SCANCTRLrScanConversionControlrr)SCANTYPErScanTyperr)HSCFSrSetCoordFromStackFPr"r)SCVTCIr SetCVTCutInrr)^SDBrSetDeltaBaseInGStaterr)SDPVTLrSetDualPVectorToLiner"r)_SDSrSetDeltaShiftInGStaterr) SFVFSrSetFVectorFromStackr"r)SFVTCArSetFVectorToAxisrr)SFVTLrSetFVectorToLiner"r)SFVTPVrSetFVectorToPVectorrr)4SHCrShiftContourByLastPtrr)2SHPrShiftPointByLastPointr r)8SHPIXrShiftZoneByPixelr r)6SHZrShiftZoneByLastPointrr)SLOOPrSetLoopVariablerr)SMDrSetMinimumDistancerr) SPVFSrSetPVectorFromStackr"r)r"SPVTCArSetPVectorToAxisrr)SPVTLrSetPVectorToLiner"r)vSROUNDr SuperRoundrr)SRP0r SetRefPoint0rr)SRP1r SetRefPoint1rr)SRP2r SetRefPoint2rr)SSWrSetSingleWidthrr)SSWCIrSetSingleWidthCutInrr)aSUBrSubtractr"r)rSVTCArSetFPVectorToAxisrr)#SWAPr SwapTopStackr"r")SZP0rSetZonePointer0rr)SZP1rSetZonePointer1rr)SZP2rSetZonePointer2rr)SZPSrSetZonePointerSrr))UTPr UnTouchPtrr)pWCVTFrWriteCVTInFUnitsr"r)DWCVTPrWriteCVTInPixelsr"r)BWSr WriteStorer"rcJd}t|D]}d|dz|z}|dz }|S)N01r)range)valuebitssis f/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/ttProgram.pybitReprrs= A 4[   !  Hz[A-Z][A-Z0-9]*$ci}i}|D]U\}}}}}}tj|sJ|||f||<|r"|} td|zD]} ||| |f||| z<M|dd|f||<W||fS)Nrr) _mnemonicPatmatchr) instructionList opcodeDict mnemonicDictopmnemonicargBitsnamepopspushes argoffsetrs r _makeDictrsJL5D21HgtT6!!(+++!#Wd!2 X I1<( H%-w 4%G 26" H&q!T1JrN2 | ##rceZdZdZdZy)tt_instructions_errorc||_yN)error)selfrs r__init__ztt_instructions_error.__init__s  rc2dt|jzS)NzTT instructions error: %s)reprrrs r__str__ztt_instructions_error.__str__s*T$**-===rN)__name__ __module__ __qualname__rrrrrrs >rrz /\*.*?\*/z([A-Z][A-Z0-9]*)\s*\[(.*?)\]z-?[0-9]+(z)|()z\s*z-[A-Z][A-Z0-9]*\s*\[.*?\]\s*/\* ([0-9]+).*?\*/z^FDEF|IF|ELSE\[ \]\t.+z^ELSE|ENDF|EIF\[ \]\t.+cdtj||}|jdd}||k\sJ|S)Nrr)_whiteRErregs)dataposmnewPoss r _skipWhiters4tS!A VVAYq\F S== MrcteZdZddZddZddZddZdddZddZddZ ddZ ddd Z dd Z e Z dd Zdd Zy )Programcyrrrs rrzProgram.__init__s rcXtjd||_t|dr|`yy)NBassembly)arraybytecodehasattrr)rrs r fromBytecodezProgram.fromBytecodes( C2 4 $  %rct|tr||_nGt|tr|j |_n!t dt |jt|dr|` yy)Nzexpected str or List[str], got r) isinstancelistrstr splitlines TypeErrortyperrr)rrs r fromAssemblyzProgram.fromAssemblys_ h %$DM # &$//1DM=d8n>U>U=VWX X 4 $  %rcnt|ds|j|jjS)Nr)r _assemblertobytesrs r getBytecodezProgram.getBytecodes)tZ( NN }}$$&&rcVt|ds|j||jS)Nrpreserve)r _disassembler)rrs r getAssemblyzProgram.getAssemblys'tZ(   x  0}}rct|dr |jr |j}|sy|jd|j d}d}t |}||kr||}t j|r|dz}|j|j|z|j||j tj|}|dz}|rt|jd} g} d} t| D]p} | rU| dzsP|j|j|z|jdj| |j g} | j||| zr|j|j|z|jdj| |j || zdz}t j|r|dz }||kr|j#d|j y|j7}|sy|jd |j |j5||j#d |j y#ddl} t'} | j)| d}|| j+z }t,j/||jd |j |j1|j3|j |j5|j7|j#d |j YyxYw) NdisassembleInstructionsrrrr )filezBAn exception occurred during the decompilation of glyph program: r)rrrbegintagnewlinelen _unindentRErwrite indentwhite _pushCountPatintgrouprjoinappend _indentREendtag tracebackr print_excgetvaluelogrcommentstripdumphexr)rwriterttFontrrindentnInstrinstrrnValueslinejrtmpmsgrs rtoXMLz Program.toXMLs 9:--4 !++-"  + X&j$QKE"((/! LL!3!3f!<=LL'NN$%++E2AAA"%aggaj/*,!&w9A !b& & V-?-?&-H I & SXXd^ < & 0') KKQ8 9 V%7%7&%@A SXXd^4(EAI u-! 3&j4 j) '')H OOJ ' NN  NN8 $ MM* % NN w ! j###-\s||~% # + syy{+ t//12 j) s I::CMc|dk(r-|jt||j|`y|dk(sJ|j t |y)Nrr)rrrrrr)rrattrscontentrs rfromXMLzProgram.fromXML<sM :    gg. / NN  :% %%   gg. /rcdjt|dg}g}|j}t|}t |d}||krt j ||}|td||dz |dzz|j\}}} } } |jdd}| r t ||}l| j} |jdrt|dd} || n@|d vrQt|\} } }t| | k7rtd |d | d | rt| } || | zn|| ng}t ||}||krt j ||}|td|||dzz|j\}}} } } | | nA|jdd}t ||}| m|jt| ||krt|}|d k(rd}|r:||kr6|dkr1d||cxkrdks#n|dz }||kr|dkrd||cxkrdksn!d}||z|kr?|dkr:d|||zcxkrdkr)nn&|dz }||z|kr|dkrd|||zcxkrdkr$n|dkr||zdkr||z|k7r||z }|rz|dkrtd\} } }| |zdz } || ntd\} } }|| |||d|D]2}d|cxkrdks nJd|z||dz dz||dz4|rV |dkrtd\} } }| |zdz } || ntd\} } }|| ||||||zD] }|| ||z}||d}||z}d}|rn|ddk(}t|\} } }|ddk7r|dksJ|| |zdz } || n|dksJ|| |||r8|D]2}d|cxkrdks nJd|z||dz dz||dz4n&|D]!}d|cxkrdks nJd|z||#t ||}||kr|rt!|dkrt#|dk\sJt%j$d||_y)NrrrzSyntax error in TT program (%s)rrrINSTR)PUSHr rrrz#Incorrect number of argument bits ([z])rr"r,rrizPUSH value out of range %drr r WNzPUSHW value out of range %dzPUSHB value out of range %dr)rgetattrrrr_tokenRErrgroupsrr startswithrrrstreamMnemonicDictmaxminrr)rrrpush lenAssemblyrrdummyrargnumberrrrrargs _mnemonicnArgsnWordsnBytesrnTotalwordss rrzProgram._assembleEs~88GD*b9: (m 1%Kx-Ay+5q3QS88TT56HHJ 1E8S&'&&)A,C 3/))+C""7+!"&R!OO$0$:!GTs8w&/HPRUV$S/CcNH 3/K' x5Ay3=sUWx@XX>?XXZ:E9c67~'/&&)A,C$Xs3C* KKF ,K'D v%F"UN & %&$v,%=#%="aKF #UN & %&$v,%=#%="#"VOe3 & !T&6/%: Ac A"aKF #VOe3 & !T&6/%: Ac A#QJ &# 5 &5 8#f,F$"%{4Fw4O 1GT%'&[1_ $R4Fx4P 1GT $R $V )-gv3'-'>'>!"$@5$H!"'>!%eqjD%8 9 $UT\ 2 3" %{4Fw4O 1GT%'&[1_ $R4Fx4P 1GT $R $V )-fv)G, $U ,"(&#FG}!"s x%RLC/E(:8(D%B{c)$z050z%Z!^R$s{*{RU %)/E#)U#:U#: = E#:!%1*!45 . /&*(E#$#3#3 = E#3!K ( Xs+CKKN x=3&3x=A+= == C2 rcg}d}t|dg}t|}||kra||} t|\}}} } |r)|j|dt || z |d| dzn|j|d| zz|dz}||kra||_ y#t $rQ|t vr+g} ||t vr||}t |\}}} } |dd k(} |r || z dz} n |dz}||} |dz}| dkDsJ| s5t| D]&}||}| jt||dz}(nJt| D]<}||d z||dzz}|d k\r|d z }| jt||d z}>|rn ||t vr|sd}t| } | dk(r|jdzn|jd| d|j| n|jd|z|dz}YhwxYw)Nrrrz] /* z */z [ ] /* %s */rr rr,rir"rz%s[ ] /* 1 value pushed */z[ ] /* z values pushed */z INSTR%d[ ]) rrrrrKeyErrorstreamOpcodeDictrrextendr)rrrrr numBytecoderrrrrvaluesr rrrs rrzProgram._disassemblesQ 4R0(m +o!B7 5?^2'9d^OO -7Y-PRVWX OOH~/D$DEEs+ot! m, ))F#1+)99%a[=Mb=Q:'9d (  3"&(9nq&8G !AA&.qkGE&{*{$%*7^*(0  & d5k :$%E* &+7^*)1!)9Xa!e_(L#(F?,1GOE & d5k :$%E *$!3#1+)996$#)!&kG!| (Dx(OP >FPOOF+OOL2$56AAY, sB C+G&7A+G&%G&ct|dxrt|jdkDxs&t|dxrt|jdkDS)a >>> p = Program() >>> bool(p) False >>> bc = array.array("B", [0]) >>> p.fromBytecode(bc) >>> bool(p) True >>> p.bytecode.pop() 0 >>> bool(p) False >>> p = Program() >>> asm = ['SVTCA[0]'] >>> p.fromAssembly(asm) >>> bool(p) True >>> p.assembly.pop() 'SVTCA[0]' >>> bool(p) False rrr)rrrrrs r__bool__zProgram.__bool__sH0j)Dc$--.@1.D D* % @#dmm*|j|}|tur|S| Sr)rr)rrresults r__ne__zProgram.__ne__:s$U#>1vA6zArN)returnNone)rbytesrr)rzList[str] | strrr)rr )T)rz List[str])F)rbool)rrrrrrrrrrrrr __nonzero__rrrrrrrsK  '  BH0O3b?!B 8K/ Brrcd}t}|j||jd}|j|t ||j k(y)z >>> _test() True s@;:9876543210/.-,+*)('&%$#"!  ,CXEjC`F#D# FNM/!#3Y-,CX+KPX@8Y+!#3Y-,CXN%!M E%%#Jad(RX!#%!YY-,CX!!%%I%%Ja dPX!!!%%IPXPX8!8!YRX8!8!YYYY-,CX+KPX8Y+!#3Y-,NFCDF8<(+%<-,/M-,CX+8+!#3Y-,CXEdj#EdiCd``F#D# F/!! RX3!!YY-, C#Ce -, C#C -,F#pF>F#pFE: -,+%E%Ej@`%#D!!!-,+%E%Ej`%#D!!!-,+!!!-,+!!!-,CCe -, i@a ,b`+ d#da\XaY-,%EhTKPZX%E%E`h %#D%#D% Eh #D%Eh`%#DY-,% Eh #D%Edhe`%`#D-, CX!CXE+G#DGzEi G#D QX+G#DGz!GzYYY-, E#Eh`D-,EjB-,/-,CX%%Id#Edi@a bj%%aC`F#D!F!!!!!Y-,CX%E%Ed`j%Eja %Ej e%#D%#D!! EjD EjDY-, EUCZXEh#Ei@a bj #a %e%#D%#D!!!!+Y-,Ed#EdadB-,%%+CX%%%+%C@T%CTZX% E@aDY%CT%C@TZX% E@`DYY!!!!-,KRXC%E#aD!!Y-,KRXC%E#`D!!Y-,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KPXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# #KKpE` PXaFY`h:-, E%FRX%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,-, CX! FRX88YY-, UXc%Ed%EdaSX@aY%EiSXED!!Y!%E%Ead(QXED!!YY-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%%Id#Edi@a bj%%aF#D!F!!# 9/Y-,%%IdTX88!!Y-,CXY-,CXY-, +# <+-,%8(+# #+CXB ANN2 --- &CNN3 "   r__main__)0__doc__ __future__rfontTools.misc.textToolsrrrrriortypingr relogging getLoggerrrstreamInstructions instructionsrcompilerrrrrr Exceptionr_comment _instruction_number_tokenrrrrrrobjectrr(sysdoctestexittestmodfailedrrrr@sNY"MM  g! { @ rzz,-  $(11C'D$$$\2 L>I> . )7H = 2::f  2::f  KL BJJ0 1 bjj34 aBfaBH ! z CHH_W__  % %& r