o
    te                     @  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rd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   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MDRPrJ   ZMoveDirectRelPtr   r   )>   ZMIAPr   ZMoveIndirectAbsPtr   r   )   ZMINr   ZMinimumr   r   )&   ZMINDEXr   ZMoveXToTopStackr   r   )   ZMIRPrJ   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   PD:\Projects\ConvertPro\env\Lib\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rz|  }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 }|rt|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   rr    )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  sD   |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   r   r   r   fromXML;  s   zProgram.fromXMLc                 C  s  d t| dg }g }|j}t|}t|d}||k rt||}|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 |	rt|	}	|||	  n|| ng }t||}||k rt||}|d u rtd|||d   | \}}}	}
}|
d u r|d u rn|j	d d }t||}|d urq|t|
 ||k st|}|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rtd \}}}|| d }|| ntd \}}}|| || |d | D ]$}d|  krdk sn J d| ||d? d@  ||d@  q|r	 |dkrtd \}}}|| d }|| ntd \}}}|| || ||||  D ]}|| q|| }||d  }||8 }d}|sn|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rdk sn J d| || qt||}||k s|rt|dk rt|dksJ td|| _d S )Nr   r   r   zSyntax error in TT program (%s)rJ   rI   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   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   D  s  











"
$
"




<

   zProgram._assembleFc                 C  s  g }d}t | dg }t|}||k r|| }z
t| \}}}	}
W n ty   |tv rg }|| 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}|rn|| tv s3|sd
}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   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     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__4  s   zProgram.__eq__c                 C  s   |  |}|tu r|S | S r   )r  r  )r   r  resultr   r   r   __ne__9  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  __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   )bcp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>   sJ    
 





  f