U
    i2e/                  w   @  s<  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ddd	d
gZdddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddgwZdd ZedZdd Zee\ZZee\ZZG dd deZdZdZdZ dee ef Z!ee!Z"edZ#edZ$edZ%edZ&dd Z'G dd de(Z)dd Z*edkr8ddl+Z+ddl,Z,e+-e,. j/ 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   )   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   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   )    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   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   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MDRPrG   ZMoveDirectRelPtr   r   )>   ZMIAPr   ZMoveIndirectAbsPtr   r   )   ZMINr   ZMinimumr   r   )&   ZMINDEXr   ZMoveXToTopStackr   r   )   ZMIRPrG   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   )!   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   D/tmp/pip-unpacked-wheel-txsm8jh_/fontTools/ttLib/tables/ttProgram.pybitRepr   s
    
r   z[A-Z][A-Z0-9]*$c                 C  s   i }i }| D ]l\}}}}}}t |s*t|||f||< |rh|}	td|> D ]}
|||	|f|||
 < qLq|dd|f||< q||fS )Nr   r   )_mnemonicPatmatchAssertionErrorr   )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&t|S )Nr   r   )_whiteREr   regsr   )dataposmZnewPosr   r   r   
_skipWhite   s    r   c                   @  s   e Zd ZddddZdddddZd	dd
ddZddddZd$ddddZddddZddddZ	ddddZ
d%ddddZddddZeZdddd Zddd!d"Zd#S )&ProgramNone)returnc                 C  s   d S r   r   r   r   r   r   r      s    zProgram.__init__bytes)bytecoder   c                 C  s    t  d|| _t| dr| `d S )NBassembly)arrayr   hasattrr   )r   r   r   r   r   fromBytecode   s    
zProgram.fromBytecodezList[str] | str)r   r   c                 C  sN   t |tr|| _n*t |tr(| | _ntdt|j t| drJ| `	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.getBytecodeTz	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  sF  t |dr|jrz|  }W n   dd l}t }|j|d d}|| 7 }t| |	d |
  ||  |
  ||   |d |
  Y qBX |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   rn    )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   s~    














zProgram.toXMLc                 C  sB   |dkr$|  t| |   | `n|dks0t| t| d S )Nr   r   )r   r   r   r   r   r   r   )r   r   attrscontentr   r   r   r   fromXML;  s    zProgram.fromXMLc                 C  s$  d t| dg }g }|j}t|}t|d}||k rt||}|d krhtd||d |d   | \}}}	}
}|j	d d }|rt||}q.|	
 }	|drt|dd  }|| n|d	kr"t| \}}}t|	|krtd
||	f |	rt|	}	|||	  n|| ng }t||}||k rt||}|d krhtd|||d   | \}}}	}
}|
d kr|d krq|j	d d }t||}|d k	rq0|t|
 q0t|}|dkrd}|r||k r$|dk r$d||   krdks$n |d7 }qd}|| |k rp|dk rpd|||    kr`dkrpn n|d7 }q(|dk r|| dk r|| |kr||7 }q|rJ|dkrtd \}}}|| d }|| ntd \}}}|| || |d | D ]H}d|  krdk s*n td| ||d? d@  ||d@  q |r|dkr~td \}}}|| d }|| ntd \}}}|| || ||||  D ]}|| q|| }||d  }||8 }d}qn|d dk}t| \}}}|d dkr2|dkst||| d }|| n|dk s@t|| || |r|D ]H}d|  krvdk sn td| ||d? d@  ||d@  qZn:|D ]4}d|  krdk sn td| || qt||}q.|rt|dk rt|dksttd|| _d S )Nr   r   r   zSyntax error in TT program (%s)rG   rF   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   )r   getattrr   r   r   _tokenREr   r   groupsr   r   
startswithr   r   r   streamMnemonicDictr   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   D  s   











 


 









 zProgram._assembleFc                 C  s  g }d}t | dg }t|}||k r|| }zt| \}}}	}
W nx tk
r   |tkrg }|| tkrX|| }t| \}}}	}
|d dk}|r||	 d }n|d }|| }|d }|dkst|st|D ]"}|| }|t| |d }qnPt|D ]F}|| d> ||d  B }|dkr4|d }|t| |d	 }q|rdqXqd|sbd
}t|}|dkr|d|  n|d||f  |	| n|d|  |d }Y qX |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   r   extendr   r   )r   r   r   r   r   ZnumBytecoder   r   r   r   r   valuesr  r   r   r   r   r   r   r     sl    





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__4  s    zProgram.__eq__c                 C  s   |  |}|tkr|S | S r   )r  r  )r   r  resultr   r   r   __ne__9  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   
D	 A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   )ZbcpZasmr   r   r   _test>  s    

r  __main__)0__doc__
__future__r   ZfontTools.misc.textToolsr   r   r   r   r   ior   typingr   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<  

 





  f
