a
    èÝEb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   ZWSr   Z
WriteStorer   r   c                 C   s.   d}t |ƒD ]}d| d@  | }| d? } q|S )NÚ Z01r   )Úrange)ÚvalueÚbitsÚsÚi© r�   ú`/home/ja/django-apps/lartica_env/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 |s²d S | 	d¡ | 
¡  d}d}t|ƒ}	||	k �rî|| }
t |
¡rø|d8 }| |j| ¡ | |
¡ | 
¡  t |
¡}|d }|�rÚt| 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 }|rªt||ƒ}q@|	 ¡ }	| d¡rØt|dd … ƒ}||ƒ �n|d	v�r6t| \}}}t|	ƒ|k�rt	d
||	f ƒ‚|	�r*t|	ƒ}	|||	 ƒ n||ƒ �n¾g }t||ƒ}||k �rÞt ||¡}|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�röd}|�rô||k �r8|dk �r8d||   k�r*dk�s8n |d7 }�qúd}|| |k �r„|dk �r„d|||    k�rtdk�r„n n|d7 }�q<|dk �r¶|| dk �r¶|| |k�r¶||7 }�qô|�r^|dk�rêtd \}}}|| d }||ƒ ntd \}}}||ƒ ||ƒ |d |… D ]H}d|  k�r0dk �s>n J d| ƒ‚||d? d@ ƒ ||d@ ƒ �q|�rÐ|dk�r’td \}}}|| d }||ƒ ntd \}}}||ƒ ||ƒ |||| … D ]}||ƒ �qÀ|| }||d … }||8 }d}�qônþ|d dk}t| \}}}|d dk�rF|dk�s0J |ƒ‚|| d }||ƒ n|dk �sTJ ‚||ƒ ||ƒ |�rº|D ]H}d|  k�rŠdk �s˜n J d| ƒ‚||d? d@ ƒ ||d@ ƒ �qnn:|D ]4}d|  k�rÚdk �sèn J d| ƒ‚||ƒ �q¾t||ƒ}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 �r g }|| tv �rV|| }t| \}}}	}
|d dk}|r¦||	 d }n|d }|| }|d }|dksÊJ ‚|süt|ƒD ]"}|| }| t|ƒ¡ |d }qÖnPt|ƒ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# °FNðM/° !#3Y-,°CX°+° K°PX± @8Y°+!#3Y-,°CXN°%ò!° M E°%°%#Jad°(RX!#Ö°%ò!° YY-,°CX!!°%°%I°%°%Ja d°PX!!!°%°%I° PX° PX¸ÿâ8!°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‡!À°CX‡E°+°G#D°GzäŠEi °G#DŠŠ‡ ° QX°+°G#D°Gzä!°GzäYYY-, Š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Š`Ša¸ÿ€b# #Š±KKŠpE` ° PX°a¸ÿº‹°FŒY°`h:-, E°%FRX°%F ha°%°%?#!8!Y-, E°%FPX°%F ha°%°%?#!8!Y-, °C°C-,Šì-,°CX! F° RX¸ÿð8°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°%°%aŒ°F#D!Š°Fö!!Š# 9/Y-,°%°%Id°ÀTX¸ÿø8°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
