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

r   r   r   rp    )r   r   r   	tracebackr   	print_excgetvaluelogr   ZbegintagnewlinecommentstripZdumphexr   Zendtaglen_unindentREr   writeZindentwhite_pushCountPatintgroupr   joinappend	_indentRE)r   writerttFontr   r   tmpmsgr   indentZnInstrinstrr   nValueslinejr   r   r   r   toXML   sx    














zProgram.toXMLc                 C   sB   |dkr$|  t| |   | `n|dks0J | t| d S )Nr   r   )r   r   r   r   r   r   )r   r   attrscontentr   r   r   r   fromXML(  s    zProgram.fromXMLc                 C   s8  t | dg }t|tg r$d|}g }|j}t|}t|d}||k r t||}|d u rzt	d||d |d   |
 \}}}	}
}|jd d }|rt||}q@|	 }	|drt|dd  }|| n|d	vr6t| \}}}t|	|krt	d
||	f |	r*t|	}	|||	  n|| ng }t||}||k rt||}|d u r|t	d|||d   |
 \}}}	}
}|
d u r|d u rq|jd d }t||}|d ur̐qD|t|
 qDt|}|dkrd}|r||k r8|dk r8d||   kr*dks8n |d7 }qd}|| |k r|dk rd|||    krtdkrn n|d7 }q<|dk r|| dk r|| |kr||7 }q|r^|dkrtd \}}}|| d }|| ntd \}}}|| || |d | D ]H}d|  kr0dk s>n J d| ||d? d@  ||d@  q|r|dkrtd \}}}|| d }|| ntd \}}}|| || ||||  D ]}|| q|| }||d  }||8 }d}qn|d dk}t| \}}}|d dkrF|dks0J ||| d }|| n|dk sTJ || || |r|D ]H}d|  krdk sn J d| ||d? d@  ||d@  qnn:|D ]4}d|  krdk sn J d| || qt||}q@|r&t|dk r"t|dks&J td|| _d S )Nr   r   r   zSyntax error in TT program (%s)rH   rG   r   ZINSTR)PUSHr   r   r   r   z*Incorrect number of argument bits (%s[%s])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   pushZlenAssemblyr   r   dummyr   argnumberr   r   r   r   argsZ	_mnemonicZnArgsZnWordsZnBytesr   ZnTotalwordsr   r   r   r   1  s    











2<&

&



&& zProgram._assembleFc                 C   s
  g }d}t | dg }t|}||k r || }zt| \}}}	}
W nv ty   |tv rg }|| tv rV|| }t| \}}}	}
|d dk}|r||	 d }n|d }|| }|d }|dksJ |st|D ]"}|| }|t| |d }qnPt|D ]F}|| d> ||d  B }|dkr2|d }|t| |d	 }q|rbqVqb|s`d
}t|}|dkr|d|  n|d||f  || n|d|  |d }Y q0 |r||dt	||	 ||
f   n||d|
   |d }q|| _
d S )Nr   r   r	   r   r   r}   r   i   r   r   z%s[ ]	/* 1 value pushed */z%s[ ]	/* %s values pushed */z
INSTR%d[ ]z[%s]	/* %s */z[ ]	/* %s */)r   r   r   KeyErrorstreamOpcodeDictr   r   r   extendr   r   )r   r   r   r   r   ZnumBytecoder   r   r   r   r   valuesr   r   r   r   r   r   r   r     s`    



"
zProgram._disassemblec                 C   s0   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   r   r   r   __bool__  s    zProgram.__bool__c                 C   s    t | t |krtS | j|jkS r   )r   NotImplemented__dict__)r   otherr   r   r   __eq__  s    zProgram.__eq__c                 C   s   |  |}|tu r|S | S r   )r	  r  )r   r  resultr   r   r   __ne__
  s    
zProgram.__ne__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   
@	{
<r   c                  C   s>   d} t  }||  |jd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asmr   r   r   _test  s    

r  __main__),__doc__ZfontTools.misc.textToolsr   r   r   r   r   ior   relogging	getLoggerr   r   ZstreamInstructionsZinstructionsr   compiler   r   r  r   r   r   	Exceptionr   _commentZ_instructionZ_number_tokenr   r   r   r   r   r   objectr   r  sysdoctestexittestmodfailedr   r   r   r   <module>   s@   
~





  B
