
    Mcg0                    n   d Z ddlmZ ddlmZmZmZmZ ddlZddl	m
Z
 ddlmZ ddlZddlZ ej                  e      Zg dZg dZd	 Z ej*                  d
      Zd Z ee      \  ZZ ee      \  ZZ G d de      ZdZdZdZ dede dedZ! ej*                  e!      Z" ej*                  d      Z# ej*                  d      Z$ ej*                  d      Z% ej*                  d      Z&d Z' G d de(      Z)d Z*edk(  r4ddl+Z+ddl,Z, e+jZ                   e,j\                         j^                         yy)zSttLib.tables.ttProgram.py -- Assembler/disassembler for TrueType bytecode programs.    )annotations)
num2binary
binary2numreadHexstrjoinN)StringIO)List))@   NPUSHBr   
PushNBytesr   )A   NPUSHWr   
PushNWordsr   r   )   PUSHB   	PushBytesr   r   )   PUSHWr   	PushWordsr   r   )w)   AAr   AdjustAngle   r   )d   ABSr   Absoluter   r   )`   ADDr   Add   r   )'   ALIGNPTSr   AlignPtsr"   r   )<   ALIGNRPr   AlignRelativePtr   r   )Z   ANDr   
LogicalAndr"   r   )+   CALLr   CallFunctionr   r   )g   CEILINGr   Ceilingr   r   )%   CINDEXr   CopyXToTopStackr   r   )"   CLEARr   
ClearStackr   r   )O   DEBUGr   	DebugCallr   r   )s   DELTAC1r   DeltaExceptionC1r   r   )t   DELTAC2r   DeltaExceptionC2r   r   )u   DELTAC3r   DeltaExceptionC3r   r   )]   DELTAP1r   DeltaExceptionP1r   r   )q   DELTAP2r   DeltaExceptionP2r   r   )r   DELTAP3r   DeltaExceptionP3r   r   )$   DEPTHr   GetDepthStackr   r   )b   DIVr   Divider"   r   )    DUPr   DuplicateTopStackr   r"   )Y   EIFr   EndIfr   r   )   ELSEr   Elser   r   )-   ENDFr   EndFunctionDefinitionr   r   )T   EQr   Equalr"   r   )W   EVENr   Evenr   r   ),   FDEFr   FunctionDefinitionr   r   )N   FLIPOFFr   SetAutoFlipOffr   r   )M   FLIPONr   SetAutoFlipOnr   r   )   FLIPPTr   	FlipPointr   r   )   	FLIPRGOFFr   FlipRangeOffr"   r   )   FLIPRGONr   FlipRangeOnr"   r   )f   FLOORr   Floorr   r   )F   GCr   GetCoordOnPVectorr   r   )   GETINFOr   GetInfor   r   )   GETVARIATIONr   GetVariationr   r   )   GFVr   
GetFVectorr   r"   )   GPVr   
GetPVectorr   r"   )R   GTr   GreaterThanr"   r   )S   GTEQr   GreaterThanOrEqualr"   r   )   IDEFr   InstructionDefinitionr   r   )X   IFr   Ifr   r   )   INSTCTRLr   SetInstrExecControlr"   r   )9   IPr   InterpolatePtsr   r   )   ISECTr   MovePtToIntersect   r   )0   IUPr   InterpolateUntPtsr   r   )   JMPRr   Jumpr   r   )y   JROFr   JumpRelativeOnFalser"   r   )x   JROTr   JumpRelativeOnTruer"   r   )*   LOOPCALLr   LoopAndCallFunctionr"   r   )P   LTr   LessThanr"   r   )Q   LTEQr   LessThenOrEqualr"   r   )   MAXr   Maximumr"   r   )I   MDr   MeasureDistancer"   r   ).   MDAPr   MoveDirectAbsPtr   r   )   MDRPr   MoveDirectRelPtr   r   )>   MIAPr   MoveIndirectAbsPtr"   r   )   MINr   Minimumr"   r   )&   MINDEXr   MoveXToTopStackr   r   )   MIRPr   MoveIndirectRelPtr"   r   )K   MPPEMr   MeasurePixelPerEmr   r   )L   MPSr   MeasurePointSizer   r   ):   MSIRPr   MoveStackIndirRelPtr"   r   )c   MULr   Multiplyr"   r   )e   NEGr   Negater   r   )U   NEQr   NotEqualr"   r   )\   NOTr   
LogicalNotr   r   )l   NROUNDr"   NoRoundr   r   )V   ODDr   Oddr   r   )[   ORr   	LogicalOrr"   r   )!   POPr   PopTopStackr   r   )E   RCVTr   ReadCVTr   r   )}   RDTGr   RoundDownToGridr   r   )z   ROFFr   RoundOffr   r   )   ROLLr   RollTopThreeStackr   r   )h   ROUNDr"   Roundr   r   )C   RSr   	ReadStorer   r   )=   RTDGr   RoundToDoubleGridr   r   )   RTGr   RoundToGridr   r   )   RTHGr   RoundToHalfGridr   r   )|   RUTGr   RoundUpToGridr   r   )w   S45ROUNDr   SuperRound45Degreesr   r   )~   SANGWr   SetAngleWeightr   r   )   SCANCTRLr   ScanConversionControlr   r   )   SCANTYPEr   ScanTyper   r   )H   SCFSr   SetCoordFromStackFPr"   r   )   SCVTCIr   SetCVTCutInr   r   )^   SDBr   SetDeltaBaseInGStater   r   )   SDPVTLr   SetDualPVectorToLiner"   r   )_   SDSr   SetDeltaShiftInGStater   r   )   SFVFSr   SetFVectorFromStackr"   r   )   SFVTCAr   SetFVectorToAxisr   r   )   SFVTLr   SetFVectorToLiner"   r   )   SFVTPVr   SetFVectorToPVectorr   r   )4   SHCr   ShiftContourByLastPtr   r   )2   SHPr   ShiftPointByLastPointr   r   )8   SHPIXr   ShiftZoneByPixelr   r   )6   SHZr   ShiftZoneByLastPointr   r   )   SLOOPr   SetLoopVariabler   r   )   SMDr   SetMinimumDistancer   r   )
   SPVFSr   SetPVectorFromStackr"   r   )r"   SPVTCAr   SetPVectorToAxisr   r   )   SPVTLr   SetPVectorToLiner"   r   )v   SROUNDr   
SuperRoundr   r   )   SRP0r   SetRefPoint0r   r   )   SRP1r   SetRefPoint1r   r   )   SRP2r   SetRefPoint2r   r   )   SSWr   SetSingleWidthr   r   )   SSWCIr   SetSingleWidthCutInr   r   )a   SUBr   Subtractr"   r   )r   SVTCAr   SetFPVectorToAxisr   r   )#   SWAPr   SwapTopStackr"   r"   )   SZP0r   SetZonePointer0r   r   )   SZP1r   SetZonePointer1r   r   )   SZP2r   SetZonePointer2r   r   )   SZPSr   SetZonePointerSr   r   ))   UTPr   	UnTouchPtr   r   )p   WCVTFr   WriteCVTInFUnitsr"   r   )D   WCVTPr   WriteCVTInPixelsr"   r   )B   WSr   
WriteStorer"   r   c                J    d}t        |      D ]  }d| dz     |z   }| dz	  }  |S )N 01r   )range)valuebitssis       [/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/ttProgram.pybitReprr     s8    
A4[!
  H    z[A-Z][A-Z0-9]*$c                    i }i }| D ]U  \  }}}}}}t         j                  |      sJ |||f||<   |r"|}	t        d|z        D ]  }
|||	|f|||
z   <    M|dd|f||<   W ||fS )Nr   r   )_mnemonicPatmatchr  )instructionList
opcodeDictmnemonicDictopmnemonicargBitsnamepopspushes	argoffsetr  s              r  	_makeDictr     s    JL5D1HgtT6!!(+++!#Wd!2XI1<(%-w	4%G
26" ) &q!T1JrN 6E |##r  c                      e Zd Zd Zd Zy)tt_instructions_errorc                    || _         y N)error)selfr  s     r  __init__ztt_instructions_error.__init__   s	    
r  c                2    dt        | j                        z  S )NzTT instructions error: %s)reprr  r  s    r  __str__ztt_instructions_error.__str__   s    *T$**-===r  N)__name__
__module____qualname__r  r   r  r  r  r     s    >r  r  z	/\*.*?\*/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.+c                d    t         j                  | |      }|j                  d   d   }||k\  sJ |S )Nr   r   )_whiteREr  regs)dataposmnewPoss       r  
_skipWhiter     s4    tS!AVVAYq\FS==Mr  c                  t    e Zd ZddZddZddZddZdddZddZddZ	ddZ
ddd	Zdd
ZeZddZddZy)Programc                     y r  r  r  s    r  r  zProgram.__init__   s    r  c                X    t        j                   d|      | _        t        | d      r| `y y )NBassembly)arraybytecodehasattrr  )r  r  s     r  fromBytecodezProgram.fromBytecode   s(    C24$ %r  c                    t        |t              r|| _        nGt        |t              r|j	                         | _        n!t        dt        |      j                         t        | d      r| `	y y )Nzexpected str or List[str], got r  )

isinstancelistr  str
splitlines	TypeErrortyper  r  r  )r  r  s     r  fromAssemblyzProgram.fromAssembly   s_    h%$DM#&$//1DM=d8n>U>U=VWXX4$ %r  c                n    t        | d      s| j                          | j                  j                         S )Nr  )r  	_assembler  tobytesr  s    r  getBytecodezProgram.getBytecode   s)    tZ(NN}}$$&&r  c                V    t        | d      s| j                  |       | j                  S )Nr  preserve)r  _disassembler  )r  r  s     r  getAssemblyzProgram.getAssembly   s'    tZ(x0}}r  c                   t        |d      r|j                  r	 | j                         }|sy |j                  d       |j	                          d}d}t        |      }||k  r||   }t        j                  |      r|dz  }|j                  |j                  |z         |j                  |       |j	                          t        j                  |      }|dz   }|rt        |j                  d            }	g }
d}t        |	      D ]p  }|rU|dz  sP|j                  |j                  |z         |j                  dj                  |
             |j	                          g }
|
j                  |||z             r |j                  |j                  |z         |j                  dj                  |
             |j	                          ||z   dz   }t         j                  |      r|dz  }||k  r|j#                  d       |j	                          y | j7                         }|sy |j                  d	       |j	                          |j5                  |       |j#                  d	       |j	                          y #  dd l}t'               }|j)                  |       d}||j+                         z  }t,        j/                  |       |j                  d	       |j	                          |j1                  |j3                                |j	                          |j5                  | j7                                |j#                  d	       |j	                          Y y xY w)
NdisassembleInstructionsr  r   r   r   )filezBAn exception occurred during the decompilation of glyph program:

r  )r  r  r  begintagnewlinelen_unindentREr  writeindentwhite_pushCountPatintgroupr  joinappend	_indentREendtag	tracebackr   	print_excgetvaluelogr  commentstripdumphexr  )r  writerttFontr  r  indentnInstrinstrr  nValueslinejr  tmpmsgr  s                   r  toXMLzProgram.toXML   s    9:--4!++-"  
+ X&j$QKE"((/!LL!3!3f!<=LL'NN$%++E2AAA"%aggaj/*,!&wA !b& &V-?-?&-H I &SXXd^ < & 0') KKQ8 "0 V%7%7&%@ASXXd^4(EAI u-!3 &j4 j) '')HOOJ'NNNN8$MM*%NNw! j###-\s||~%		#
+ syy{+ t//12j) s   I: :CMc                    |dk(  r-| j                  t        |             | j                          | `y |dk(  sJ | j	                  t        |             y )Nr  r  )r  r   r  r  r  r   )r  r  attrscontentr  s        r  fromXMLzProgram.fromXML<  sM    :gg./NN:%%%gg./r  c                   dj                  t        | dg             }g }|j                  }t        |      }t	        |d      }||k  rt
        j                  ||      }|t        d||dz
  |dz    z        |j                         \  }}}	}
}|j                  d   d   }|rt	        ||      }l|	j                         }	|j                  d      rt        |dd        } ||       n@|d	vrQt        |   \  }}}t        |	      |k7  rt        d
|d|	d      |	rt        |	      }	 |||	z          n ||       ng }t	        ||      }||k  rt
        j                  ||      }|t        d|||dz    z        |j                         \  }}}	}
}|
|nA|j                  d   d   }t	        ||      }|m|j                  t        |
             ||k  rt        |      }|dk(  rd}|r:||k  r6|dk  r1d||   cxk  rdk  s#n |dz  }||k  r|dk  rd||   cxk  rdk  sn !d}||z   |k  r?|dk  r:d|||z      cxk  rdk  r)n n&|dz  }||z   |k  r|dk  rd|||z      cxk  rdk  r$n |dk  r||z   dk  r||z   |k7  r||z  }|rz|dk  rt        d   \  }}}||z   dz
  } ||       nt        d   \  }}} ||        ||       |d | D ]2  }d|cxk  rdk  sn J d|z          ||dz	  dz          ||dz         4 |rV	 |dk  rt        d   \  }}}||z   dz
  } ||       nt        d   \  }}} ||        ||       ||||z    D ]
  } ||        ||z   }||d  }||z  }d}|rn|d   dk(  }t        |   \  }}}|d   dk7  r|dk  sJ |       ||z   dz
  } ||       n|dk  sJ  ||        ||       |r8|D ]2  }d|cxk  rdk  sn J d|z          ||dz	  dz          ||dz         4 n&|D ]!  }d|cxk  rdk  sn J d|z          ||       # t	        ||      }||k  r|rt!        |      dk  rt#        |      dk\  sJ t%        j$                  d|      | _        y )Nr  r  r   zSyntax error in TT program (%s)r   r   r   INSTR)PUSHr   r   r   r   z#Incorrect number of argument bits ([z])r     r"   r,  r   r   i    zPUSH value out of range %dr   r   r   WN   zPUSHW value out of range %dzPUSHB value out of range %dr  )r  getattrr  r  r  _tokenREr  r  groupsr  r  
startswithr  r  r   streamMnemonicDictmaxminr  r  )r  r  r  pushlenAssemblyr  r  dummyr  argnumberr  r  r  r  args	_mnemonicnArgsnWordsnBytesr  nTotalwordss                          r  r  zProgram._assembleE  sk   88GD*b9: (m1%Kx-Ay+5q3QS88TT  56HHJ1E8S&'&&)A,C 3/))+C""7+!"&R!OO$0$:!GTs8w&/HPRUV  $S/CcNH 3/K' x5Ay3=sUWx@XX  >?XXZ:E9c67~'/&&)A,C$Xs3C* KKF, K' D	v%F"UN &%&$v,%=#%="aKF	 #UN &%&$v,%=#%= "#"VOe3 & !T&6/%: Ac A"aKF	 #VOe3 & !T&6/%: Ac A #QJ &# 5 &5 8 #f,F$ "%{4Fw4O 1GT%'&[1_ $R4Fx4P 1GT $R $V)-gv'-'>'> !"$@5$H!"'> !%eqjD%8 9 $UT\ 2 *7 " %{4Fw4O 1GT%'&[1_ $R4Fx4P 1GT $R $V)-fv)G $U *H "(&#FG}!"s  x %RLC/E(:8(D%B{c)$z050z%Z!^R$s{*{RU%)E#)U#:U#:  = E#: !%1*!45 . &* &*E#$#3#3  = E#3 !K	 &* Xs+CK KN x=3&3x=A+===C2r  c                   g }d}t        | dg       }t        |      }||k  ra||   }	 t        |   \  }}}	}
|r)|j                  |dt	        ||	z
  |      d|
dz          n|j                  |d|
z  z          |dz   }||k  ra|| _
        y # t
        $ rQ |t        v r+g }||   t        v r||   }t        |   \  }}}	}
|d   d	k(  }|r	||	z
  dz   }n
|dz   }||   }|dz   }|dkD  sJ |s5t        |      D ]&  }||   }|j                  t        |             |dz   }( nJt        |      D ]<  }||   d
z  ||dz      z  }|dk\  r|dz
  }|j                  t        |             |dz   }> |rn||   t        v r|sd}t        |      }|dk(  r|j                  dz         n|j                  d|d       |j                  |       n|j                  d|z         |dz   }Y hw xY w)Nr   r  r  z]	/* z */z[ ]	/* %s */r   r   r  r,  r  i   r"   r  z%s[ ]	/* 1 value pushed */z[ ]	/* z values pushed */z
INSTR%d[ ])r  r  r  r  r   KeyErrorstreamOpcodeDictr  r  extendr  )r  r  r  r  r  numBytecoder  r  r  r  r  valuesr  r  r  r  s                   r  r  zProgram._disassemble  sG   4R0(m+o!B75?^2'9d^ OO -7Y-PRVWX
 OOH~/D$DEEs +ot !m  ,))F #1+)99%a[=Mb=Q:'9d ( 3"&(9nq&8G !AA&.qkGE&{*{$%*7^(0 &d5k :$%E &4
 &+7^)1!)9Xa!e_(L#(F?,1GOE &d5k :$%E &4 $!3 #1+)996 $#)!&kG!| (Dx(OP >FP OOF+OOL2$56AAY,s   B C+G&7A+G&%G&c                    t        | d      xr t        | j                        dkD  xs& t        | d      xr t        | j                        dkD  S )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
        r  r   r  )r  r  r  r  r  s    r  __bool__zProgram.__bool__  sH    0 j)Dc$--.@1.D 
D*%@#dmm*<q*@	
r  c                n    t        |       t        |      k7  rt        S | j                  |j                  k(  S r  )r  NotImplemented__dict__)r  others     r  __eq__zProgram.__eq__5  s+    :e$!!}}..r  c                >    | j                  |      }|t        u r|S | S r  )r  r  )r  r  results      r  __ne__zProgram.__ne__:  s$    U#>1vA6zAr  N)returnNone)r  bytesr  r  )r  zList[str] | strr  r  )r  r   )T)r  z	List[str])F)r  bool)r  r  r  r  r  r  r  r  r  r  r  r  r  __nonzero__r  r  r  r  r  r  r     sK    
'

BH0O3b?!B
8 K/
Br  r  c                     d} t               }|j                  |        |j                  d      }|j                  |       t	        | |j                         k(         y)z
    >>> _test()
    True
    s  @;:9876543210/.-,+*)('&%$#"! 
	 ,CXEjC`F#D# FNM/ !#3Y-,CX+ KPX @8Y+!#3Y-,CXN%! M E%%#Jad(RX!#%! YY-,CX!!%%I%%Ja dPX!!!%%I PX PX8!8!Y RX8!8!YYYY-,CX+ KPX  8Y+!#3Y-,NFCD  F   8  <(+% <-, /M -,CX+   8+!#3Y-,CXEdj#EdiCd``F#D# F/ !!  RX3!!YY-,
C#Ce
-, 
C#C-, F#pF>F#pFE: -,+%E%Ej@`%#D!!!-,+%E%Ej`%#D!!!-, +!!!-, +!!!-,CCe
-, i@a  , b`+d#da\XaY-, %EhTKPZX%E%E`h %#D%#D% Eh #D%Eh`%#DY-,% Eh #D%Edhe`%`#D-,	CX!CXE+G#DGzEi G#D QX+G#DGz!GzYYY-, E#Eh`D-,EjB-,/-,CX%%Id#Edi@a bj%%aC`F#D!F!!!!!Y-,CX%E%Ed`j%Eja %Ej e%#D%#D!! EjD EjDY-, E UCZXEh#Ei@a bj #a %e%#D%#D!!!!+Y-,Ed#EdadB-,%%+CX%%%+%C@T%C TZX% E@aDY%C T%C@TZX% E@`DYY!!!!-,KRXC%E#aD!!Y-,KRXC%E#`D!!Y-,KRXED!!Y-, %#I@` c  RX#%8#%e8 c8!!!!!Y-,KPXED!!Y-,%#  `#-,%#  a#-,% -,F#F`F# F`ab# #KKpE`  PXaFY`h:-, E%FRX%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-, CC-,-,CX! F RX88YY-,  UX c%Ed%Eda SX@aY%EiSXED!!Y!%E%Ead(QXED!!YY-,!!d#d@ b-,!QXd#d  b @/+Y`-,!QXd#dUb /+Y`-,d#d@ b`#!-,KSX%%Id#Edi@a bj%%aF#D!F!!# 9/Y-,%%IdTX88!!Y-,CXY-,CXY-,
+# <+-,%8(+# #+CX<Y  -,KS#KQZX8!!Y-,%# <-, %I8-,KS#KQZX E`D!!Y-, 9/-Tr  N)r  r  r  r  printr  )bcpasms      r  _testr(  ?  sL     
K>B	ANN2
---
&CNN3	"
 r  __main__)0__doc__
__future__r   fontTools.misc.textToolsr   r   r   r   r  ior   typingr	   relogging	getLoggerr  r  streamInstructionsinstructionsr  compiler  r  r  r  r  r  	Exceptionr  _comment_instruction_number_tokenr  r  r  r  r  r  objectr  r(  sysdoctestexittestmodfailedr  r  r  <module>r@     sN   Y " M M    	  g! {@ rzz,-$ (11C'D $ $$\2 
L>I > .
)7H	=2::f2::f

KLBJJ01	bjj34aBf aBH! zCHH_W__%%&	 r  