o
    l^Uf0Œ  ã                   @  sP  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 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r¦ddl+Z+ddl,Z,e+ -e, .¡ j/¡ dS dS )zSttLib.tables.ttProgram.py -- Assembler/disassembler for TrueType bytecode programs.é    )Úannotations)Ú
num2binaryÚ
binary2numÚreadHexÚstrjoinN)ÚStringIO)ÚList))é@   Ú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   ZAddé   r   )é'   ZALIGNPTSr   ZAlignPtsr   r   )é<   ZALIGNRPr   ZAlignRelativePtr   r   )éZ   ZANDr   Z
LogicalAndr   r   )é+   ÚCALLr   ZCallFunctionr   r   )ég   ZCEILINGr   ZCeilingr   r   )é%   ZCINDEXr   ZCopyXToTopStackr   r   )é"   Z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   )é    Z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   ZGTr   ZGreaterThanr   r   )éS   ZGTEQr   ZGreaterThanOrEqualr   r   )é‰   ZIDEFr   ZInstructionDefinitionr   r   )éX   ZIFr   Z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   Z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MDRPrD   ZMoveDirectRelPtr   r   )é>   ZMIAPr   ZMoveIndirectAbsPtr   r   )éŒ   ZMINr   ZMinimumr   r   )é&   ZMINDEXr   ZMoveXToTopStackr   r   )éà   ZMIRPrD   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   )é\   ZNOTr   Z
LogicalNotr   r   )él   ZNROUNDr   ZNoRoundr   r   )éV   ZODDr   ZOddr   r   )é[   ÚORr   Z	LogicalOrr   r   )é!   Z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–   ú@lib/python3.10/site-packages/fontTools/ttLib/tables/ttProgram.pyÚbitRepr    s
   
r˜   z[A-Z][A-Z0-9]*$c                 C  s‚   i }i }| D ]6\}}}}}}t  |¡sJ ‚|||f||< |r4|}	td|> ƒD ]}
|||	|f|||
 < q&q|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                   @  sŒ   e Zd Zd$dd„Zd%dd„Zd&dd„Zd'dd„Zd(d)dd„Zd$dd„Zd$dd„Z	d$dd„Z
d*d$dd„Zd+dd„ZeZd+dd „Zd+d!d"„Zd#S ),ÚProgramÚreturnÚNonec                 C  s   d S r¤   r–   r©   r–   r–   r—   r§   Ü   s   zProgram.__init__ÚbytecodeÚbytesc                 C  s$   t   d|¡| _t| dƒr| `d S d S )NÚBÚassembly)Úarrayr·   Úhasattrrº   )r¦   r·   r–   r–   r—   ÚfromBytecodeß   s   
ÿzProgram.fromBytecoderº   úList[str] | strc                 C  sR   t |tƒr	|| _nt |tƒr| ¡ | _n
tdt|ƒj› ƒ‚t| dƒr'| `	d S d S )Nzexpected str or List[str], got r·   )
Ú
isinstanceÚlistrº   ÚstrÚ
splitlinesÚ	TypeErrorÚtyper«   r¼   r·   )r¦   rº   r–   r–   r—   ÚfromAssemblyä   s   


ÿzProgram.fromAssemblyc                 C  s   t | dƒs	|  ¡  | j ¡ S )Nr·   )r¼   Ú	_assembler·   Útobytesr©   r–   r–   r—   ÚgetBytecodeî   s   

zProgram.getBytecodeTú	List[str]c                 C  s   t | dƒs| j|d | jS )Nrº   ©Úpreserve)r¼   Ú_disassemblerº   )r¦   rË   r–   r–   r—   ÚgetAssemblyó   s   
zProgram.getAssemblyc                 C  s@  t |dƒr|jrþz|  ¡ }W nD   dd l}tƒ }|j|d d}|| ¡ 7 }t |¡ | 	d¡ | 
¡  | | ¡ ¡ | 
¡  | |  ¡ ¡ | d¡ | 
¡  Y d S |sWd S | 	d¡ | 
¡  d}d}t|ƒ}	||	k ró|| }
t |
¡ry|d8 }| |j| ¡ | |
¡ | 
¡  t |
¡}|d }|ræt| d¡ƒ}g }d}t|ƒD ]'}|rÂ|d sÂ| |j| ¡ | d	 |¡¡ | 
¡  g }| |||  ¡ q¤| |j| ¡ | d	 |¡¡ | 
¡  || d }t |
¡rï|d7 }||	k sl| d¡ | 
¡  d S |  ¡ }|sd S | 	d¡ | 
¡  | |¡ | d¡ | 
¡  d S )
NÚdisassembleInstructionsr   )ÚfilezBAn exception occurred during the decompilation of glyph program:

r·   rº   r   ri   ú )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nInstrZinstrr²   ÚnValuesÚlineÚjr·   r–   r–   r—   ÚtoXMLø   s€   ÿþ







ç



zProgram.toXMLc                 C  sD   |dkr|   t|ƒ¡ |  ¡  | `d S |dksJ ‚|  t|ƒ¡ d S )Nrº   r·   )rÅ   r   rÆ   rº   r½   r   )r¦   r    ÚattrsZcontentrâ   r–   r–   r—   ÚfromXML<  s   zProgram.fromXMLc                 C  s†  d  t| dg ƒ¡}g }|j}t|ƒ}t|dƒ}||k r§t ||¡}|d u r4td||d |d …  ƒ‚| ¡ \}}}	}
}|j	d d }|rLt||ƒ}q|	 
¡ }	| d¡rct|dd … ƒ}||ƒ n;|d	vrt| \}}}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Ãn|j	d d }t||ƒ}|d urÔq—| t|
ƒ¡ ||k s›t|ƒ}|dkrd}|r||k r%|dk r%d||   krdks%n |d7 }||k r%|dk r%d||   kr"dkrn qd}|| |k rf|dk rfd|||    krCdkrfn n!|d7 }|| |k rf|dk rfd|||    kredksEn |dk r~|| dk r~|| |kr~||7 }qê|rÒ|dkr˜td \}}}|| d }||ƒ ntd \}}}||ƒ ||ƒ |d |… D ]$}d|  kr»dk sÂn J d| ƒ‚||d? d@ ƒ ||d@ ƒ q­|r	 |dkrítd \}}}|| d }||ƒ ntd \}}}||ƒ ||ƒ |||| … D ]}||ƒ q|| }||d … }||8 }d}|sín|d dk}t| \}}}|d dkrG|dks<J |ƒ‚|| d }||ƒ n|dk sNJ ‚||ƒ ||ƒ |r|D ]$}d|  kridk spn J d| ƒ‚||d? d@ ƒ ||d@ ƒ q[n|D ]}d|  kr‘dk s˜n J d| ƒ‚||ƒ qƒt||ƒ}||k s|rºt|ƒdk r¸t|ƒdksºJ ‚t d|¡| _d S )NrÐ   rº   r   zSyntax error in TT program (%s)rD   rC   r   ZINSTR)ÚPUSHr
   r   r   r   z*Incorrect number of argument bits (%s[%s])rì   éÿ   r   rv   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·   ÚpushZlenAssemblyr±   r²   Zdummyrž   ÚargZnumberrÖ   r   rŸ   r    ÚargsZ	_mnemonicZnArgsZnWordsZnBytesr’   ZnTotalÚwordsr–   r–   r—   rÆ   E  s  

ÿ


ÿ
ÿ
ó



ü
"
$ü
"


ÿ

Ç€<
ÿûÿ
 ú  zProgram._assembleFc                 C  s  g }d}t | dg ƒ}t|ƒ}||k rý|| }z
t| \}}}	}
W n¸ tyØ   |tv rËg }|| tv r¨|| }t| \}}}	}
|d dk}|rN||	 d }n|d }|| }|d }|dks`J ‚|syt|ƒD ]}|| }| t|ƒ¡ |d }qfn&t|ƒD ]!}|| d> ||d  B }|dkr“|d }| t|ƒ¡ |d	 }q}|r¢n|| tv s3|s¬d
}t|ƒ}|dkr¼| d| ¡ n	| d||f ¡ | |¡ n| d| ¡ |d }Y n!w |rì| |dt	||	 |ƒ|
f  ¡ n	| |d|
  ¡ |d }||k s|| _
d S )Nr   r·   r   rï   r   rv   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Ì   Ö  sv   
ý
ç
ÿ€Ô.ÿÿÇ
:zProgram._disassembleÚboolc                 C  s0   t | dƒrt| jƒdkpt | dƒot| jƒdk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©   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__5  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)rµ   r¶   )r·   r¸   rµ   r¶   )rº   r¾   rµ   r¶   )rµ   r¸   )T)rµ   rÉ   )F)rµ   r  )r«   r¬   r­   r§   r½   rÅ   rÈ   rÍ   ré   rë   rÆ   rÌ   r  Z__nonzero__r  r  r–   r–   r–   r—   r´   Û   s    






D
	 
A
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È   )ZbcÚpZasmr–   r–   r—   Ú_test?  s   

r  Ú__main__)0Ú__doc__Z
__future__r   ZfontTools.misc.textToolsr   r   r   r   r»   Úior   Útypingr   ÚreZloggingZ	getLoggerr«   rÔ   ZstreamInstructionsZinstructionsr˜   Úcompiler™   r¢   rþ   rö   r›   rœ   Ú	Exceptionr£   Z_commentZ_instructionZ_numberZ_tokenró   r®   rÛ   rà   rÙ   r³   Úobjectr´   r  ÚsysZdoctestÚexitZtestmodZfailedr–   r–   r–   r—   Ú<module>   sJ    
 





  fü