
    <`9j                     N   d Z ddlmZ ddlmZmZmZ ddl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    r,ddl(Z(ddl)Z) e(j*         e)j+                    j,                   dS dS )zSttLib.tables.ttProgram.py -- Assembler/disassembler for TrueType bytecode programs.    )strjoin)
num2binary
binary2numreadHexN)StringIO))@   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                 T    d}t          |          D ]}d| dz           |z   }| dz	  } |S )N 01r   )range)valuebitssis       @lib/python3.11/site-packages/fontTools/ttLib/tables/ttProgram.pybitReprr     s?    
++  Q
53;!!
1*%%	    z[A-Z][A-Z0-9]*$c                     i }i }| D ]\\  }}}}}}t                               |          sJ |||f||<   |r$|}	t          d|z            D ]}
|||	|f|||
z   <   S|dd|f||<   ]||fS )Nr   r   )_mnemonicPatmatchr  )instructionList
opcodeDictmnemonicDictopmnemonicargBitsnamepopspushes	argoffsetr  s              r  	_makeDictr     s    2A * *.R7D$			H	%	%%%%w,,x *9!w, : :q)T9Jr!t: q!T)JrNNL  r  c                       e Zd Zd Zd ZdS )tt_instructions_errorc                     || _         d S N)error)selfr  s     r  __init__ztt_instructions_error.__init__   s    $***r  c                 0    dt          | j                  z  S )NzTT instructions error: %s)reprr  r  s    r  __str__ztt_instructions_error.__str__   s    	$tDJ'7'7	77r  N)__name__
__module____qualname__r  r   r  r  r  r     s2          8 8 8 8 8r  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                 r    t                               | |          }|j        d         d         }||k    sJ |S )Nr   r   )_whiteREr  regs)dataposmnewPoss       r  
_skipWhiter     s6    ^^D#
&)A,#r  c                   ^    e Zd Zd Zd Zd Zd ZddZd Zd Z	d	 Z
ddZd ZeZd Zd ZdS )Programc                     d S r  r  r  s    r  r  zProgram.__init__   s    $r  c                 b    t          j         d|          | _        t          | d          r| `d S d S )NBassembly)arraybytecodehasattrr  )r  r  s     r  fromBytecodezProgram.fromBytecode   s:    +c8,,$-T: }}} r  c                 <    || _         t          | d          r| `d S d S Nr  )r  r  r  )r  r  s     r  fromAssemblyzProgram.fromAssembly   s.    $-T: }}} r  c                 |    t          | d          s|                                  | j                                        S r  )r  	_assembler  tobytesr  s    r  getBytecodezProgram.getBytecode   s8    	z	"	" >>				 	  r  Tc                 \    t          | d          s|                     |           | j        S )Nr  preserve)r  _disassembler  )r  r  s     r  getAssemblyzProgram.getAssembly   s3    	z	"	" (h'''	r  c                    t          |d          r|j        rl	 |                                 }|sd S |                    d           |                                 d}d}t          |          }||k     r||         }t                              |          r|dz  }|                    |j	        |z             |                    |           |                                 t                              |          }|dz   }|rt          |                    d                    }	g }
d}t          |	          D ]}|r`|dz  s[|                    |j	        |z             |                    d                    |
                     |                                 g }
|
                    |||z                       |                    |j	        |z             |                    d                    |
                     |                                 ||z   dz   }t                               |          r|dz  }||k     |                    d           |                                 d S #  dd l}t'                      }|                    |           d}||                                z  }t,                              |           |                    d	           |                                 |                    |                                           |                                 |                    |                                            |                    d	           |                                 Y d S xY w|                                 }|sd S |                    d	           |                                 |                    |           |                    d	           |                                 d S )
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   	&3	4	4 =8V =3!!H   V
OOJ
NN	AF]]F
f**a[U%   kf\\&$v-...\\%^^			U	#	#Q	
QQ	 AGGAJJgd
aW~~ " "!
 QV V'&0111SXXd^^$$${{8AaC=!!!!ll6%.///ll388D>>"""nn
a%!)a kf3 f**4 MM*
NNc
**CS!!!
PC3<<>>CIIcNNN
OOJ
NN
NN399;;
NN
NN4##%%&&&
MM*
NNL   8
 
F	??:	>>	>>(	==	>>s   I. .DNc                     |dk    r:|                      t          |                     |                                  | `d S |dk    sJ |                     t          |                     d S )Nr  r  )r  r   r  r  r  r   )r  r  attrscontentr  s        r  fromXMLzProgram.fromXML)  su    	ZWW%%&&&>>}}}
*



WW%%&&&&&r  c                 8   t          | dg           }t          |t          g                     rd                    |          }g }|j        }t          |          }t          |d          }||k     rt                              ||          }| t          d||dz
  |dz            z            |
                                \  }}}	}
}|j        d         d         }|rt          ||          }|	                                }	|                    d          r$t          |dd                    } ||           n|d	vrht          |         \  }}}t          |	          |k    rt          d
|d|	d          |	rt!          |	          }	 |||	z              n ||           ng }t          ||          }||k     rt                              ||          }|t          d|||dz            z            |
                                \  }}}	}
}|
|nN|j        d         d         }t          ||          }||                    t          |
                     ||k     t          |          }|dk    rd}|r||k     rB|dk     r<d||         cxk    rdk    s)n |dz  }||k     r|dk     rd||         cxk    rdk    $n 'd}||z   |k     rK|dk     rEd|||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    *n |dk     r||z   dk     r||z   |k    r||z  }|r|dk    r%t"          d         \  }}}||z   dz
  } ||           n't"          d         \  }}} ||            ||           |d |         D ]=}d|cxk    rdk     sn J d|z               ||dz	  dz              ||dz             >|rn	 |dk    r%t"          d         \  }}}||z   dz
  } ||           n't"          d         \  }}} ||            ||           ||||z            D ]} ||           ||z   }||d          }||z  }d}|n|d         dk    }t"          |         \  }}}|d         dk    r$|dk    s
J |            ||z   dz
  } ||           n|dk     sJ  ||            ||           |rA|D ]=}d|cxk    rdk     sn J d|z               ||dz	  dz              ||dz             >n,|D ])}d|cxk    rdk     sn J d|z               ||           *t          ||          }||k     |r(t%          |          dk     rt'          |          dk    sJ t)          j        d|          | _        d S )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  )getattr
isinstancetyper  r  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._assemble2  sS   T:r**($r((## !hhx  8(	$H+8Q#k~~h$$1i
 AHSQRUSVWYSY\DZ Z
[
[[+,88::(5(C	
13 
Xs
#
#C	3'"" `	Xabb\		BDHHHHFFF$X.B
3xx7  QYQYQY[^[^[^!_```
 c??S	T"s(^^^^	T"XXXXD
Xs
#
#C


	#	&	&Q		!"ChsSVWYSYzFZ"Z[[[./hhjj+UIsFG7?6!9Q<Sh$$S	[[V 

 IIE6V +UNNv||Q$v,5M5M5M5M#5M5M5M5M{v UNNv||Q$v,5M5M5M5M#5M5M5M5M5Mf6ME!!fsllqD<O7V7V7V7VSV7V7V7V7V7V{v 6ME!!fsllqD<O7V7V7V7VSV7V7V7V7V	!#--&6/U2J2Jv 
 
A++.w7GT&[1_R.x8GTRV&M  5&&&&&&&&&(Du(L&&&eqjD !!!UT\ 
 
A++.w7GT&[1_R.x8GTRVv-.  5Uf&'']dvoefW  +\ b\S U+H5R$saZZZZZZ:>b
d2hhhhS[[[[
d2hhh
d5kkk   %%%%%%%%%%'Du'L%%%tUaZ4   tEDL
   %53 = EtE{{{{	Hc	"	"3[ 	k^  5
h--#

#h--1"4"4"4"4+c8,,$---r  Fc                    g }d}t          | dg           }t          |          }||k     r||         }	 t          |         \  }}}	}
|r1|                    |dt	          ||	z
  |          d|
dz              n|                    |d|
z  z              |dz   }n# t
          $ r |t          v rpg }||         t          v r||         }t          |         \  }}}	}
|d         d	k    }|r	||	z
  dz   }n|dz   }||         }|dz   }|dk    sJ |sBt          |          D ]1}||         }|                    t          |                     |dz   }2n[t          |          D ]K}||         d
z  ||dz            z  }|dk    r|dz
  }|                    t          |                     |dz   }L|rn||         t          v |sd}t          |          }|dk    r|                    d|z             n|                    |d|d           |	                    |           n|                    d|z             |dz   }Y nw xY w||k     || _
        d S )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  s   (!T:r**(H+	K22)3B&Hgy$Z  7__XX:b9ng3V3V3V3VX\X\X\ ]]^^^^__X 55666	AAAa  * * *	V A;***A;b+;B+?(hDrlc!e	 i!#wwq5q!w
a%aq[[[[ g  1d5kk"""E
 g  1!!Xac]2F??d5kk"""E	 3 A;***6  h6{{W1oo2X=>>>>oo'''JKKK__V__\B&'''	
QQU*	 	
Kj $---s   B F"I Ic                     t          | d          rt          | j                  dk    p't          | d          ot          | j                  dk    S )aD  
		>>> 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__  sP    0 4$$?T]););a)? ;T:93t}#5#5#9<r  c                 p    t          |           t          |          k    rt          S | j        |j        k    S r  )r  NotImplemented__dict__)r  others     r  __eq__zProgram.__eq__  s.    	$ZZ4;;
	%.	((r  c                 H    |                      |          }|t          u r|n| S r  )r  r  )r  r  results      r  __ne__zProgram.__ne__  s)    ;;u&^++V;r  N)T)F)r  r  r  r  r  r  r  r  r  r  r  r  r  __nonzero__r  r  r  r  r  r  r     s            
  
! ! !
   
> > >@' ' 'y- y- y-v: : : :x< < <6 ) ) )
< < < < <r  r  c                      d} t                      }|                    |            |                    d          }|                    |           t	          | |                                k               dS )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    sk     H>YY}}d}##rQ]]__r  __main__)-__doc__fontTools.misc.py23r   fontTools.misc.textToolsr   r   r   r  ior   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>r6     sL   Y Y ' ' ' ' ' ' D D D D D D D D D D        				  g!!   { { {|
 
 
 rz,--! ! ! (1y1C'D'D $ $$9\22 
L8 8 8 8 8I 8 8 8 .
)\\777HHH	=2:f2:f
KLLBJ011	bj344  }< }< }< }< }<f }< }< }<@
   z	/'/


"##### r  