o
    t#g0                     @  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   
PushNBytesr   )A   NPUSHWr   
PushNWordsr   r   )   PUSHB   	PushBytesr   r   )   PUSHWr   	PushWordsr   r   )w)   AAr   AdjustAngle   r   )d   ABSr   Absoluter   r   )`   ADDr   Add   r   )'   ALIGNPTSr   AlignPtsr!   r   )<   ALIGNRPr   AlignRelativePtr   r   )Z   ANDr   
LogicalAndr!   r   )+   CALLr   CallFunctionr   r   )g   CEILINGr   Ceilingr   r   )%   CINDEXr   CopyXToTopStackr   r   )"   CLEARr   
ClearStackr   r   )O   DEBUGr   	DebugCallr   r   )s   DELTAC1r   DeltaExceptionC1r   r   )t   DELTAC2r   DeltaExceptionC2r   r   )u   DELTAC3r   DeltaExceptionC3r   r   )]   DELTAP1r   DeltaExceptionP1r   r   )q   DELTAP2r   DeltaExceptionP2r   r   )r   DELTAP3r   DeltaExceptionP3r   r   )$   DEPTHr   GetDepthStackr   r   )b   DIVr   Divider!   r   )    DUPr   DuplicateTopStackr   r!   )Y   EIFr   EndIfr   r   )   ELSEr   Elser   r   )-   ENDFr   EndFunctionDefinitionr   r   )T   EQr   Equalr!   r   )W   EVENr   Evenr   r   ),   FDEFr   FunctionDefinitionr   r   )N   FLIPOFFr   SetAutoFlipOffr   r   )M   FLIPONr   SetAutoFlipOnr   r   )   FLIPPTr   	FlipPointr   r   )   	FLIPRGOFFr   FlipRangeOffr!   r   )   FLIPRGONr   FlipRangeOnr!   r   )f   FLOORr   Floorr   r   )F   GCr   GetCoordOnPVectorr   r   )   GETINFOr   GetInfor   r   )   GETVARIATIONr   GetVariationr   r   )   GFVr   
GetFVectorr   r!   )   GPVr   
GetPVectorr   r!   )R   GTr   GreaterThanr!   r   )S   GTEQr   GreaterThanOrEqualr!   r   )   IDEFr   InstructionDefinitionr   r   )X   IFr   Ifr   r   )   INSTCTRLr   SetInstrExecControlr!   r   )9   IPr   InterpolatePtsr   r   )   ISECTr   MovePtToIntersect   r   )0   IUPr   InterpolateUntPtsr   r   )   JMPRr   Jumpr   r   )y   JROFr   JumpRelativeOnFalser!   r   )x   JROTr   JumpRelativeOnTruer!   r   )*   LOOPCALLr   LoopAndCallFunctionr!   r   )P   LTr   LessThanr!   r   )Q   LTEQr   LessThenOrEqualr!   r   )   MAXr   Maximumr!   r   )I   MDr   MeasureDistancer!   r   ).   MDAPr   MoveDirectAbsPtr   r   )   MDRPr   MoveDirectRelPtr   r   )>   MIAPr   MoveIndirectAbsPtr!   r   )   MINr   Minimumr!   r   )&   MINDEXr   MoveXToTopStackr   r   )   MIRPr   MoveIndirectRelPtr!   r   )K   MPPEMr   MeasurePixelPerEmr   r   )L   MPSr   MeasurePointSizer   r   ):   MSIRPr   MoveStackIndirRelPtr!   r   )c   MULr   Multiplyr!   r   )e   NEGr   Negater   r   )U   NEQr   NotEqualr!   r   )\   NOTr   
LogicalNotr   r   )l   NROUNDr!   NoRoundr   r   )V   ODDr   Oddr   r   )[   ORr   	LogicalOrr!   r   )!   POPr   PopTopStackr   r   )E   RCVTr   ReadCVTr   r   )}   RDTGr   RoundDownToGridr   r   )z   ROFFr   RoundOffr   r   )   ROLLr   RollTopThreeStackr   r   )h   ROUNDr!   Roundr   r   )C   RSr   	ReadStorer   r   )=   RTDGr   RoundToDoubleGridr   r   )   RTGr   RoundToGridr   r   )   RTHGr   RoundToHalfGridr   r   )|   RUTGr   RoundUpToGridr   r   )w   S45ROUNDr   SuperRound45Degreesr   r   )~   SANGWr   SetAngleWeightr   r   )   SCANCTRLr   ScanConversionControlr   r   )   SCANTYPEr   ScanTyper   r   )H   SCFSr   SetCoordFromStackFPr!   r   )   SCVTCIr   SetCVTCutInr   r   )^   SDBr   SetDeltaBaseInGStater   r   )   SDPVTLr   SetDualPVectorToLiner!   r   )_   SDSr   SetDeltaShiftInGStater   r   )   SFVFSr   SetFVectorFromStackr!   r   )   SFVTCAr   SetFVectorToAxisr   r   )   SFVTLr   SetFVectorToLiner!   r   )   SFVTPVr   SetFVectorToPVectorr   r   )4   SHCr   ShiftContourByLastPtr   r   )2   SHPr   ShiftPointByLastPointr   r   )8   SHPIXr   ShiftZoneByPixelr   r   )6   SHZr   ShiftZoneByLastPointr   r   )   SLOOPr   SetLoopVariabler   r   )   SMDr   SetMinimumDistancer   r   )
   SPVFSr   SetPVectorFromStackr!   r   )r!   SPVTCAr   SetPVectorToAxisr   r   )   SPVTLr   SetPVectorToLiner!   r   )v   SROUNDr   
SuperRoundr   r   )   SRP0r   SetRefPoint0r   r   )   SRP1r   SetRefPoint1r   r   )   SRP2r   SetRefPoint2r   r   )   SSWr   SetSingleWidthr   r   )   SSWCIr   SetSingleWidthCutInr   r   )a   SUBr   Subtractr!   r   )r   SVTCAr   SetFPVectorToAxisr   r   )#   SWAPr   SwapTopStackr!   r!   )   SZP0r   SetZonePointer0r   r   )   SZP1r   SetZonePointer1r   r   )   SZP2r   SetZonePointer2r   r   )   SZPSr   SetZonePointerSr   r   ))   UTPr   	UnTouchPtr   r   )p   WCVTFr   WriteCVTInFUnitsr!   r   )D   WCVTPr   WriteCVTInPixelsr!   r   )B   WSr   
WriteStorer!   r   c                 C  s.   d}t |D ]}d| d@  | }| d? } q|S )N 01r   )range)valuebitssi r  /var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/env/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  )instructionList
opcodeDictmnemonicDictopmnemonicargBitsnamepops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m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   r   )r  r  r  	tracebackr   	print_excgetvaluelogr  begintagnewlinecommentstripdumphexr  endtaglen_unindentREr  writeindentwhite_pushCountPatintgroupr  joinappend	_indentRE)r  writerttFontr  r  tmpmsgr  indent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)r   r   r   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  pushlenAssemblyr  r  dummyr  argnumberr  r  r  r  args	_mnemonicnArgsnWordsnBytesr  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 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  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  __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   fontTools.misc.textToolsr   r   r   r   r  ior   typingr   relogging	getLoggerr  r  streamInstructionsinstructionsr  compiler  r  r   r  r  r  	Exceptionr  _comment_instruction_number_tokenr  r  r  r  r  r  objectr  r  sysdoctestexittestmodfailedr  r  r  r  <module>   sJ    
 





  f