o
    iz                    @   s"  d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z,m-Z.m/Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7ddl8Z8ddl9Z9ddlm:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@ e<rddlAmBZB e6CeDZEG dd de:ZFedg dZGeGeFjHdddeGeFjIdddeGeFjJdddeGeFjKdddeGeFjLdddeGeFjMdddeGeFjNdddeGeFjOdddeGeFjPdddd 	ZQd!d" d#d" d$d" d%d" d&ZRd'd" d(d" d)d" d*d" d&ZSd+d, ZTd-d. ZUG d/d0 d0ZVG d1d2 d2ZWG d3d4 d4eXZYG d5d6 d6eXZZG d7d8 d8eXZ[G d9d: d:e[Z\G d;d< d<e[Z]G d=d> d>eXZ^G d?d@ d@e[Z_G dAdB dBe[Z`G dCdD dDe%ZaG dEdF dFeaZbG dGdH dHeaZcG dIdJ dJeaZdG dKdL dLe&ZedMZfG dNdO dOe)dPZgG dQdR dRe%ZhG dSdT dTe%ZiG dUdV dVe&ZjG dWdX dXe&ZkG dYdZ dZe&ZlG d[d\ d\e&ZmG d]d^ d^e&ZnG d_d` d`e%ZoG dadb dbe%ZpG dcdd dde%ZqG dedf dfe%ZrG dgdh dheZsG didj dje)dPZtG dkdl dle)dPZuG dmdn dneZvG dodp dpeZwG dqdr dreZxG dsdt dte)dPZydudvdwdxdydzd{d|d}d~ddddddZzdd Z{dd Z|dd Z}dd Z~dd Zdd Ze|e}e~deeddZdd Zdd Ze  dd ZdS )zfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)reduce)radians)defaultdict
namedtuple)OPTIMIZE_FONT_SPEED)TupleVariation)dfs_base_table)quantizeRect)otRound)	TransformIdentityDecomposedTransform)	bytesjoinpadsafeEval)Vector)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)IntFlag)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )VarComponentFlagsr                   @         i                 @  l      N)__name__
__module____qualname__RESET_UNSPECIFIED_AXES	HAVE_AXESAXIS_VALUES_HAVE_VARIATIONTRANSFORM_HAS_VARIATIONHAVE_TRANSLATE_XHAVE_TRANSLATE_YHAVE_ROTATIONHAVE_CONDITIONHAVE_SCALE_XHAVE_SCALE_YHAVE_TCENTER_XHAVE_TCENTER_YGID_IS_24BITHAVE_SKEW_XHAVE_SKEW_YRESERVED_MASK rI   rI   n/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/ttLib/tables/otTables.pyr(   4   s"    r(   VarTransformMappingValues)flagfractionalBitsscaledefaultValue      
   iL)	Z
translateXZ
translateYZrotationscaleXscaleYZskewXZskewYZtCenterXZtCenterYc                 C      t d| S )N>BstructpackvrI   rI   rJ   <lambda>f       r\   c                 C   rU   )N>HrW   rZ   rI   rI   rJ   r\   g   r]   c                 C   s   t d| dd  S )N>Lr   rW   rZ   rI   rI   rJ   r\   h       c                 C   rU   )Nr_   rW   rZ   rI   rI   rJ   r\   i   r]   )r   r)      r*   c                 C      t d| d S )NrV   r   rX   unpackrZ   rI   rI   rJ   r\   l       c                 C   rb   )Nr^   r   rc   rZ   rI   rI   rJ   r\   m   re   c                 C   s   t dd|  d S )Nr_       r   rc   rZ   rI   rI   rJ   r\   n   r`   c                 C   rb   )Nr_   r   rc   rZ   rI   rI   rJ   r\   o   re   c                 C   s  | | }|dk r||d fS |dk r"|d d> | |d  B |d fS |dk r>|d d> | |d  d> B | |d  B |d fS |d	k rb|d d
> | |d  d> B | |d  d> B | |d  B |d fS |d	 d> | |d  d
> B | |d  d> B | |d  d> B | |d  B |d fS )zlRead a variable-length number from data starting at index i.

    Return the number and the next index.
    r/   r      r+   r)      r,   ra         r*   r-      rI   )dataiZb0rI   rI   rJ   _read_uint32vars   s,    0,,
rn   c                 C   s|   | dk r
t d| S | dk rt d| dB S | dk r&t d| dB d	d
 S | dk r2t d| dB S t ddt d|  S )z:Write a variable-length number.

    Return the data.
    r/   rV   r5   r^      i    r_   i   r   Ni   l      @ ri   rW   rZ   rI   rI   rJ   _write_uint32var   s   rp   c                   @   sV   e Zd Zdd ZdddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdS )VarComponentc                 C   s   |    d S N)populateDefaultsselfrI   rI   rJ   __init__      zVarComponent.__init__Nc                 C   s6   d| _ d | _d | _d | _d| _t| _t| _t | _	d S )Nr   rI   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformru   Z
propagatorrI   rI   rJ   rs      s   zVarComponent.populateDefaultsc                    s  dt  \| _| jtj@ rdnd}t|  |  }|7 |j| | _tj@ r9t  \| _tj	@ rGt  \| _
nd | _
| j
d u rRd}n|d j| j
 }t|}tj	@ rwt| \}tdd |D | _nd| _t| j|ksJ tj@ rt  \| _nt| _tj@ rt  \| _nt| _t | _ fdd	}	t D ]\}
}|	|}t| j|
| qtj@ s| jj| j_tj@ }|rt  \}||d
 M }|s׈ d  S )Nr   ra   r)   ZAxisIndicesListc                 s       | ]}t |d V  qdS    N)fi2fl.0r[   rI   rI   rJ   	<genexpr>       z)VarComponent.decompile.<locals>.<genexpr>rI   c                    sF   | j @ r ttd d  d | j| j }d7 |S | jS )N>hr)   r   )rL   r   rX   rd   rM   rN   rO   valuesr[   rl   rx   rm   rI   rJ   read_transform_component   s   
z8VarComponent.decompile.<locals>.read_transform_componentr   )rn   rx   r(   rE   	_unpacker
glyphOrderry   r@   rz   r:   r{   ZItemlenr   ZdecompileDeltas_tupler|   r;   r~   r}   r<   r   r   r   VAR_TRANSFORM_MAPPINGitemssetattrrB   rS   rT   rH   )ru   rl   font
localStateZgidSizeglyphIDnumAxesZaxisIndicesr|   r   	attr_namemapping_valuesvaluen_rI   r   rJ   	decompile   sP   







zVarComponent.decompilec           
         s  |j t }g }| j || j}|dkr# tjO  |td | n tj M  |td | | j	d urD tj
O  |t| j	 t| j}|rj tjO  |t| j |tjdd | jD | d n tj M  | jtkr tjO  |t| j n tj M  | jtkr tjO  |t| j n tj M   fdd}t D ]\}}t| j|}	|||	| qt t| S )	N  ra   r)   c                 S   s   g | ]}t |d qS r   )fl2fir   rI   rI   rJ   
<listcomp>	  s    z(VarComponent.compile.<locals>.<listcomp>)ZoptimizeSizec                    s(    |j @ rtdt| |j |jS dS )Nr       )rL   rX   rY   r   rN   rM   )r   r   rx   rI   rJ   write_transform_component  s
   
z7VarComponent.compile.<locals>.write_transform_component)cfgr   rx   
getGlyphIDry   r(   rE   append_packerrz   r@   rp   r   r|   r:   r{   r   ZcompileDeltaValues_r~   r}   r;   r   r<   r   r   getattrr   r   )
ru   r   ZoptimizeSpeedrl   r   r   r   r   r   r   rI   r   rJ   compile   sH   









zVarComponent.compilec                    s    d|    d fdd	}|d| j | jd ur"|d| j | jd ur-|d| j | jd us8| jtj@ rO| jtj@ rAd}nd}|d	d
d | jD | | j	t
krZ|d| j	 | jt
kre|d| j t D ]\}}| j|j@ stqit| j|}||t||j qi d    d S )Nrq   rI   c                    s.   |d ur  | d|ff|     d S d S )Nr   )	simpletagnewline)namer   attrswriterrI   rJ   write-  s   z!VarComponent.toXML.<locals>.writery   rz   r{   ))resetUnspecifiedAxesr   r|   c                 S   s   g | ]	}t t|d qS r   )floatfl2strr   rI   rI   rJ   r   @      z&VarComponent.toXML.<locals>.<listcomp>r~   r   )rI   )begintagr   ry   rz   r{   rx   r(   r9   r|   r~   r}   r   r   r   rL   r   r   r   rM   endtag)ru   r   ttFontr   r   r   mappingr[   rI   r   rJ   toXML)  s4   






zVarComponent.toXMLc                 C   s  dd |D }|    |D ]y\}}}|rJ |d }|dkr"|| _q|dkr,t|| _q|dkr6t|| _q|dkrWtdd	 t|D | _t|d
drV|  jt	j
O  _q|dkrat|| _q|dkrkt|| _q|tv rt| j|t| |  jt| jO  _qJ |d S )Nc                 S      g | ]	}t |tr|qS rI   
isinstancer   r   crI   rI   rJ   r   S  r   z(VarComponent.fromXML.<locals>.<listcomp>r   ry   rz   r{   r|   c                 s   r   r   )str2flr   rI   rI   rJ   r   b  r   z'VarComponent.fromXML.<locals>.<genexpr>r   0r~   r   )rs   ry   r   rz   r{   r   r|   getrx   r(   r9   r~   r   r   r   r   rL   )ru   r   r   contentr   r[   rI   rI   rJ   fromXMLR  s:   zVarComponent.fromXMLc                    s   d fdd}t  D ]\}}||}tj|tj||  qjtj@ s0jjj_	t
 ks>J t
 fd S )Nr   c                    s2   j | j@ rt  | j| j }d7 |S dS )Nr   r   )rx   rL   r   rM   rN   r   deltasrm   ru   rI   rJ   read_transform_component_deltav  s
   zIVarComponent.applyTransformDeltas.<locals>.read_transform_component_delta)r   r   r   r   r   rx   r(   rB   rS   rT   r   )ru   r   r   r   r   r   rI   r   rJ   applyTransformDeltass  s   	 z!VarComponent.applyTransformDeltasc                 C   s    t | t |kr
tS | j|jkS rr   )typeNotImplemented__dict__)ru   otherrI   rI   rJ   __eq__  s   zVarComponent.__eq__c                 C   s   |  |}|tu r|S | S rr   )r   r   )ru   r   resultrI   rI   rJ   __ne__  s   
zVarComponent.__ne__rr   )r6   r7   r8   rv   rs   r   r   r   r   r   r   r   rI   rI   rI   rJ   rq      s    

F:)!rq   c                   @   6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )VarCompositeGlyphNc                 C   s   |d ur	|| _ d S g | _ d S rr   
components)ru   r   rI   rI   rJ   rv        zVarCompositeGlyph.__init__c                 C   s6   g | _ |rt }||||}| j | |sd S d S rr   )r   rq   r   r   )ru   rl   r   r   	componentrI   rI   rJ   r     s   zVarCompositeGlyph.decompilec                 C   s(   g }| j D ]
}||| qt|S rr   )r   r   r   r   )ru   r   rl   r   rI   rI   rJ   r     s   
zVarCompositeGlyph.compilec                 C   sR   | d| |  t| jD ]\}}|||d|fg q|d |  d S )Nr   index)r   r   	enumerater   r   r   )ru   	xmlWriterr   r   r   rm   r   rI   rI   rJ   r     s   
zVarCompositeGlyph.toXMLc                 C   sP   dd |D }|D ]\}}}|dksJ t  }||||| | j| q	d S )Nc                 S   r   rI   r   r   rI   rI   rJ   r     r   z-VarCompositeGlyph.fromXML.<locals>.<listcomp>rq   )rq   r   r   r   )ru   r   r   r   r   r   rI   rI   rJ   r     s   zVarCompositeGlyph.fromXMLrr   )r6   r7   r8   rv   r   r   r   r   rI   rI   rI   rJ   r     s    
r   c                   @      e Zd Zdd ZdS )AATStateTablec                 C   s   i | _ g | _g | _d S rr   )ZGlyphClassesZStatesZPerGlyphLookupsrt   rI   rI   rJ   rv     s   
zAATStateTable.__init__Nr6   r7   r8   rv   rI   rI   rI   rJ   r         r   c                   @   r   )AATStatec                 C   s
   i | _ d S rr   )Transitionsrt   rI   rI   rJ   rv        
zAATState.__init__Nr   rI   rI   rI   rJ   r     r   r   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	AATActionNc                 C   s   dS )NNNrI   )r   statesrI   rI   rJ   compileActions  s   zAATAction.compileActionsc                    sb    fdd j D }|r|jdd|d |   jdkr/|jdd j d |  d S d S )	Nc                    s   g | ]	} j | r|qS rI   )r   r   frt   rI   rJ   r     r   z.AATAction._writeFlagsToXML.<locals>.<listcomp>Flags,r   r   ReservedFlagsz0x%04X)_FLAGSr   joinr   r   )ru   r   rx   rI   rt   rJ   _writeFlagsToXML  s   
zAATAction._writeFlagsToXMLc                 C   s$   || j v sJ d| d| j|< d S )Nzunsupported flag %sT)r   r   ru   rL   rI   rI   rJ   _setFlag  s   zAATAction._setFlag)r6   r7   r8   r   staticmethodr   r   r   rI   rI   rI   rJ   r     s    
	r   c                   @   s   e Zd ZdZdZg dZi 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!Zd"d# Zd$d% Zd&d' Z	d(d) Z
d*d+ Zd,S )-RearrangementMorphActionr*   r   )	MarkFirstDontAdvanceMarkLastz	no changer   u	   Ax ⇒ xAr)   u	   xD ⇒ Dxra   u   AxD ⇒ DxAu   ABx ⇒ xABrk   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCxr+   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxArR   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBArP   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBAr   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 C   s(   d| _ d| _d| _d| _d| _d| _d S Nr   F)NewStateVerbr   r   r   r   rt   rI   rI   rJ   rv     s   
z!RearrangementMorphAction.__init__c                 C   sz   |d u sJ | | j | jdkr| jdksJ | j| j| jB }| jr(|dO }| jr/|dO }| jr6|dO }| | d S )Nr   r   ro   r5   r4   )writeUShortr   r   r   r   r   r   ru   r   r   actionIndexrx   rI   rI   rJ   r     s   z RearrangementMorphAction.compilec                 C   s`   |d u sJ |  | _|  }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )Nr   ro   r5   r4   i  )
readUShortr   r   boolr   r   r   r   ru   readerr   actionReaderrx   rI   rI   rJ   r     s   

z"RearrangementMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd | j| j}|d ur6|| |  |	| |  d S )Nr   r   r   )
r   r   r   r   r   r   _VERBSr   commentr   )ru   r   r   r   r   ZverbCommentrI   rI   rJ   r     s   


zRearrangementMorphAction.toXMLc           	      C   s   d | _  | _| _d | _ | _| _dd |D }|D ]>\}}}|dkr,t|d | _ q|dkr8t|d | _q|dkrDt|d | _q|d	krY|d d
D ]	}| |	  qOqd S )Nr   Fc                 S   r   rI   r   r   trI   rI   rJ   r     r   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   r   )
r   r   r   r   r   r   r   splitr   strip	ru   r   r   r   r   eltNameeltAttrs
eltContentrL   rI   rI   rJ   r     s   z RearrangementMorphAction.fromXMLN)r6   r7   r8   
staticSizeactionHeaderSizer   r  rv   r   r   r   r   rI   rI   rI   rJ   r     sT    	

r   c                   @   sD   e Zd ZdZdZddgZdd Zdd Zd	d
 Zdd Z	dd Z
dS )ContextualMorphActionr+   r   SetMarkr   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FFr   r   )r   r  r   r   	MarkIndexCurrentIndexrt   rI   rI   rJ   rv   1  s   zContextualMorphAction.__init__c                 C   s`   |d u sJ | | j | j}| jr|dO }| jr|dO }| | | | j | | j d S )Nro   r5   )r   r   r   r  r   r  r  r   rI   rI   rJ   r   7  s   
zContextualMorphAction.compilec                 C   s\   |d u sJ |  | _|  }t|d@ | _t|d@ | _|d@ | _|  | _|  | _d S )Nro   r5   i?  )r  r   r  r  r   r   r  r  r  rI   rI   rJ   r   C  s   


zContextualMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )Nr   r   r  r  )r   r   r   r   r   r  r  r   ru   r   r   r   r   rI   rI   rJ   r   M  s   

zContextualMorphAction.toXMLc           	      C   s   d | _ | _d | _| _d\| _| _dd |D }|D ]J\}}}|dkr,t|d | _ q|dkrB|d d	D ]	}| |	  q7q|d
krNt|d | _q|dkrZt|d | _q|dkret|d | _qd S )Nr   Fr  c                 S   r   rI   r   r	  rI   rI   rJ   r   ^  r   z1ContextualMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   r  r  )
r   r   r  r   r  r  r   r  r   r  r  rI   rI   rJ   r   Z  s&   zContextualMorphAction.fromXMLN)r6   r7   r8   r  r  r   rv   r   r   r   r   rI   rI   rI   rJ   r  ,  s    
r  c                   @   r   )	LigActionc                 C   s   d| _ d| _d S )NFr   )StoreGlyphIndexDeltart   rI   rI   rJ   rv   n  s   

zLigAction.__init__Nr   rI   rI   rI   rJ   r  m  r   r  c                   @   s`   e Zd ZdZdZddgZdd Zdd Zd	d
 Ze	dd Z
dd Zdd Zdd Zdd ZdS )LigatureMorphActionr   rP   SetComponentr   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r  )r   r  r   r   Actionsrt   rI   rI   rJ   rv     s   
zLigatureMorphAction.__init__c                 C   s   |d usJ | | j | j}| jr|dO }| jr|dO }t| jdkr(|dO }| | t| jdkrA|  }| ||  d S | d d S )Nro   r5   r   r4   )r   r   r   r  r   r   r  compileLigActions)ru   r   r   r  rx   actionsrI   rI   rJ   r     s   
zLigatureMorphAction.compilec                 C   sx   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ }|d@ | _|  }|r7| ||| _d S g | _d S )Nro   r5   r4   i  )r  r   r  r  r   r   _decompileLigActionsr  )ru   r  r   r  rx   ZperformActionr  rI   rI   rJ   r     s   


zLigatureMorphAction.decompilec                 C   s   dt  i }}}|D ]}|j D ]\}}||  qqt|dd dD ])}||vrPtdt|dD ]}	||	d  }
t||	 d }||
| q5||7 }q't	|d}||fS )Nr   c                 S      t |  | fS rr   r   xrI   rI   rJ   r\         z4LigatureMorphAction.compileActions.<locals>.<lambda>keyr   r*   )
setr   r   addr   sortedranger   
setdefaultr   )r   r   r   r!  r  state_glyphClasstransarm   suffixZsuffixIndexrI   rI   rJ   r     s   
z"LigatureMorphAction.compileActionsc                 C   sp   g }t | jD ],\}}|t| jd k}|jd@ }||rdndO }||jr'dndO }|td| qt|S )Nr   ?        r      @r_   )	r   r  r   r  r  r   rX   rY   r   )ru   r   rm   actionlastr   rI   rI   rJ   r     s   
z%LigatureMorphAction.compileLigActionsc           	      C   sx   g }d}| |j|d  }|s:| }t|d@ }t }|| t|d@ |_|d@ }|dkr5d| }||_|r|S )NFr*   r5  r6  r4  i    i   )getSubReaderposZ	readULongr  r  r   r  r  )	ru   r  r  r!  r8  r  r   r7  deltarI   rI   rJ   r"    s   

z(LigatureMorphAction._decompileLigActionsc                 C   s   d | _ | _d | _| _d| _g | _dd |D }|D ]\\}}}|dkr,t|d | _ q|dkrB|d dD ]	}| |  q7q|d	krNt|d | _q|d
krwt	 }	|
ddd}
dd |
D }
d|
v |	_t|d |	_| j|	 qd S )Nr   Fc                 S   r   rI   r   r	  rI   rI   rJ   r     r   z/LigatureMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   r   Action c                 S      g | ]}|  qS rI   r  r   rI   rI   rJ   r     r`   r  r  )r   r   r  r   r  r   r  r   r  r  r   r  r  r   )ru   r   r   r   r   r  r  r  rL   r7  rx   rI   rI   rJ   r     s.   
zLigatureMorphAction.fromXMLc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]}d|jfg}|jr1|d |d| |  q!|	| |  d S )Nr   r   r  )r   r  r<  )
r   r   r   r   r   r  r  r  r   r   )ru   r   r   r   r   r7  attribsrI   rI   rJ   r     s   




zLigatureMorphAction.toXMLN)r6   r7   r8   r  r  r   rv   r   r   r   r   r   r"  r   r   rI   rI   rI   rJ   r  |  s    

r  c                   @   sX   e Zd ZdZdZg dZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zedd ZdS )InsertionMorphActionr+   r*   )r  r   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g | _| _d S r   )r   r   r   r   CurrentInsertionActionMarkedInsertionActionr   rI   rI   rJ   rv     s
   
zInsertionMorphAction.__init__c                 C   s   |d usJ | | j | j}| jr|dO }| jr|dO }| jr$|dO }| jr+|dO }| jr2|dO }| jr9|dO }|t	| j
d> O }|t	| jO }| | t	| j
dkr]|t| j
 }nd	}| | t	| jdkrs|t| j }nd	}| | d S )
Nro   r5   r4   r3   r2   r1   rk   r   r   )r   r   r   r  r   rB  rC  rD  rE  r   rF  rG  r   )ru   r   r   r  rx   ZcurrentIndexZmarkedIndexrI   rI   rJ   r     s4   

zInsertionMorphAction.compilec                 C   s   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _| j	|||  |d@ d? d	| _
| j	|||  |d
@ d	| _d S )Nro   r5   r4   r3   r2   r1   i  rk   )r   count   )r  r   r  r  r   rB  rC  rD  rE  _decompileInsertionActionrF  rG  r  rI   rI   rJ   r   :  s   
zInsertionMorphAction.decompilec                 C   s8   |dks|dkr
g S | |j|d  }|||S )Nr   r   r)   )r9  r:  getGlyphNameManyZreadUShortArray)ru   r  r   r   rH  r  rI   rI   rJ   rJ  K  s   z.InsertionMorphAction._decompileInsertionActionc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]}|jd|d |  q!| jD ]}|jd|d |  q2|| |  d S )Nr   r   rF  glyphrG  )r   r   r   r   r   rF  rG  r   )ru   r   r   r   r   grI   rI   rJ   r   Q  s   





zInsertionMorphAction.toXMLc           	      C   s   |    dd |D }|D ]D\}}}|dkrt|d | _q|dkr4|d dD ]	}| |  q)q|dkrA| j|d  q|d	krN| j|d  qJ |d S )
Nc                 S   r   rI   r   r	  rI   rI   rJ   r   b  r   z0InsertionMorphAction.fromXML.<locals>.<listcomp>r   r   r   r   rF  rM  rG  )	rv   r   r   r  r   r  rF  r   rG  r  rI   rI   rJ   r   `  s   zInsertionMorphAction.fromXMLc                 C   s  t  i d}}}|D ]&}|j D ]\}}|jd ur#|t|j |jd ur0|t|j qqt|dd dD ]C}||v rAq:tdt	|D ]"}	t	|d |	 }
t|	t	|D ]}||	|d  }|
||
 qYqH|D ]}| |}|td|7 }qmq:||fS )	Nr   c                 S   r#  rr   r$  r%  rI   rI   rJ   r\   |  r'  z5InsertionMorphAction.compileActions.<locals>.<lambda>r(  r   r)   r   r^   )r*  r   r   rF  r+  r   rG  r,  r-  r   r.  r   rX   rY   )r   r   r!  r  r   r/  r0  r1  r7  startZ
startIndexlimitglyphsrM  r   rI   rI   rJ   r   p  s.   


z#InsertionMorphAction.compileActionsN)r6   r7   r8   r  r  r   rv   r   r   rJ  r   r   r   r   rI   rI   rI   rJ   rA  	  s    	rA  c                   @   s   e Zd Zdd ZdddZdS )FeatureParamsc                 C   s>   t |d | jksJ d|d | jjf t| || d S )NZ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)featureParamTypesr   	__class__r6   r   r   )ru   r   r   rI   rI   rJ   r     s   zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)r   )r   r   rT  r6   r  rI   rI   rJ   r     r   zFeatureParams.toXMLr   )r6   r7   r8   r   r   rI   rI   rI   rJ   rR    s    	rR  c                   @      e Zd ZdS )FeatureParamsSizeNr6   r7   r8   rI   rI   rI   rJ   rV        rV  c                   @   rU  )FeatureParamsStylisticSetNrW  rI   rI   rI   rJ   rY    rX  rY  c                   @   rU  )FeatureParamsCharacterVariantsNrW  rI   rI   rI   rJ   rZ    rX  rZ  c                   @   r   )CoverageNc                 C      t | ds
g | _d S d S )NrQ  )hasattrrQ  r   rI   rI   rJ   rs        

zCoverage.populateDefaultsc                 C   s   | j dkr|d | _| ` d S | j dkrVg  }| _|d }t|dd d}||kr/td |}~|D ]}|j}|j}||}	||d }
||	t
|	|
 q2| ` d S g | _td	| j  | ` d S )
Nr   
GlyphArrayr)   RangeRecordc                 S      | j S rr   )StartCoverageIndexr2  rI   rI   rJ   r\         z#Coverage.postRead.<locals>.<lambda>r(  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)FormatrQ  r,  logwarningStartEndr   extendrK  r-  )ru   rawTabler   rQ  rangesZsorted_rangesrrO  endstartIDendIDrI   rI   rJ   postRead  s*   





zCoverage.postReadc                 C   sT  t | dd }|d u rg  }| _d}d|i}|r||}t||k}|d }|gg}|dd  D ]}	|	|d krE|d | ||	g |	}q0|d | |s[t|d t|k rd}
t|D ]'\}\}}t }||_|	||_
|	||_|
|_|||< |
| | d }
qa|rtd |jdd	 d
 |D ]}|`qd}d|i}|| _|S )NrQ  r   r_  r   ra   re  c                 S   ra  rr   )StartIDrc  rI   rI   rJ   r\     rd  z#Coverage.preWrite.<locals>.<lambda>r(  r)   r`  )r   rQ  getGlyphIDManyr,  r   r   r   r`  rt  ZgetGlyphNameri  rj  rb  rg  rh  sortrf  )ru   r   rQ  formatrl  glyphIDsZbrokenOrderr8  rm  r   r   rm   rO  ro  rn  rI   rI   rJ   preWrite  sF   


zCoverage.preWritec                 C   s,   t | dg D ]}|jd|d |  qd S )NrQ  Glyphr   )r   r   r   )ru   r   r   ry   rI   rI   rJ   toXML2  s   
zCoverage.toXML2c                 C   s0   t | dd }|d u rg }|| _||d  d S )NrQ  r   )r   rQ  r   )ru   r   r   r   r   rQ  rI   rI   rJ   r     s
   zCoverage.fromXMLrr   r6   r7   r8   rs   rr  ry  r{  r   rI   rI   rI   rJ   r[    s    
+r[  l    c                   @   sJ   e Zd ZdddZdd Zedd Zdd	 Zd
d Zdd Z	dd Z
dS )DeltaSetIndexMapNc                 C   r\  Nr   r]  r   r   rI   rI   rJ   rs     r^  z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dks
J |d | _ d S )NEntryFormat  r   r   r   )ru   rl  r   rI   rI   rJ   rr    s   zDeltaSetIndexMap.postReadc                 C   s   d}| D ]}||O }q|d@ }d}|r|d7 }|dL }|st |d}|dks(J |d| ? |d|> d @ B }|dkr=d}n|dkrDd}n	|dkrKd}nd	}|d d	> |d B S )
Nr   r   r   r,      r)   i ra   r*   )max)r   ZoredidxinnerZ	innerBitsZ	entrySizerI   rI   rJ   getEntryFormat  s(   

zDeltaSetIndexMap.getEntryFormatc                 C   s\   t | dd }|d u rg  }| _t|dkrdnd| _| j }t||d< | ||d< |S )Nr   r   r   r   MappingCountr  )r   r   r   rf  r   copyr  )ru   r   r   rl  rI   rI   rJ   ry  *  s   

zDeltaSetIndexMap.preWritec                 C   st   | d |  tt| dg D ]&\}}d|fg}|tkr-|d|d? fd|d@ fg |d| |  qd S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr,   r  r   Map)r  r   r   r   r}   rk  r   )ru   r   r   rm   r   r   rI   rI   rJ   r{  4  s   




zDeltaSetIndexMap.toXML2c           	      C   sn   t | dd }|d u rg  | _}t|d }t|dd}t|dd}|dks+J |||d> |B  d S )Nr   r   r  Z0xFFFFr  r   r,   )r   r   r   r   insert)	ru   r   r   r   r   r   r   r  r  rI   rI   rJ   r   E  s   
zDeltaSetIndexMap.fromXMLc                 C   s   |t | jk r| j| S tS rr   )r   r   r}   )ru   rm   rI   rI   rJ   __getitem__O  r   zDeltaSetIndexMap.__getitem__rr   )r6   r7   r8   rs   rr  r   r  ry  r{  r   r  rI   rI   rI   rJ   r}    s    



r}  Zuint8c                   @   >   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )	VarIdxMapNc                 C      t | ds
i | _d S d S r~  r  r   rI   rI   rJ   rs   T  r^  zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dks
J |  }|d }||d gt|t|   tt||| _d S )Nr  r  r   r   rs  )getGlyphOrderrk  r   dictzipr   )ru   rl  r   r   ZmapListrI   rI   rJ   rr  X  s
    zVarIdxMap.postReadc                    s   t | dd   d u ri   | _| } fdd|D  t dkr; d  d kr; d= t dkr; d  d ks*d i}t |d< t |d< |S )	Nr   c                    s   g | ]} | qS rI   rI   r   rN  r  rI   rJ   r   e  r`   z&VarIdxMap.preWrite.<locals>.<listcomp>r   rs  r  r  )r   r   r  r   r}  r  )ru   r   r   rl  rI   r  rJ   ry  _  s   
zVarIdxMap.preWritec                 C   sT   t t| di  D ]\}}d|fd|d? fd|d@ ff}|d| |  q
d S )Nr   rM  r  r,   r  r   r  )r,  r   r   r   r   )ru   r   r   rM  r   r   rI   rI   rJ   r{  n  s   


zVarIdxMap.toXML2c           	      C   s|   t | dd }|d u ri }|| _z|d }W n   | |d  }Y t|d }t|d }|dks4J |d> |B ||< d S )Nr   rM  r   r  r  r   r,   )r   r   r  r   )	ru   r   r   r   r   r   rM  r  r  rI   rI   rJ   r   x  s   zVarIdxMap.fromXMLc                 C   s   | j |tS rr   )r   r   r}   )ru   ry   rI   rI   rJ   r    s   zVarIdxMap.__getitem__rr   )	r6   r7   r8   rs   rr  ry  r{  r   r  rI   rI   rI   rJ   r  S  s    

r  c                   @   r   )VarRegionListc                 C   s4   | d}|rt|j| _i | jdt| jdiS )NZfvarRegionAxisCount)r   r   Zaxesr  r   r   )ru   r   Z	fvarTablerI   rI   rJ   ry    s   
zVarRegionList.preWriteNr6   r7   r8   ry  rI   rI   rI   rJ   r    r   r  c                   @   r   )SingleSubstNc                 C   r  r~  r  r   rI   rI   rJ   rs     r^  zSingleSubst.populateDefaultsc                    s   i }t |d }| jdkr3|d  ||} fdd|D }||}t||D ]\}}	|	||< q)n+| jdkrWt||d ksDJ d|d	 }
t||
D ]\}}|||< qMnJ d| j || _| `d S )Nr[  r   DeltaGlyphIDc                    s   g | ]}|  d  qS )   rI   )r   r   r;  rI   rJ   r         z(SingleSubst.postRead.<locals>.<listcomp>r)   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTablerf  ru  rK  r  r   r   )ru   rl  r   r   inputZ	inputGIDSZoutGIDSZoutNamesinpoutsubstsubrI   r  rJ   rr    s*   





zSingleSubst.postReadc                    s  t | dd }|d u ri  }| _t| }|j  fdd|D }tt||}d}d }|D ]\}}	|d u r<|	| d }|| d |	krF n
q.|d u rNd}nd}i }
|| _t }dd |D }dd |D }||_	||
d	< |dkr}|d uswJ ||
d
< |
S ||
d< |
S )Nr   c                    s    g | ]\}} | |fqS rI   rI   )r   r2  br   rI   rJ   r     s     z(SingleSubst.preWrite.<locals>.<listcomp>r)   r  r   c                 S   s   g | ]}|d  d qS )r   r   rI   r   itemrI   rI   rJ   r     r  c                 S   s   g | ]}|d  d  qS r   rI   r  rI   rI   rJ   r     r  r[  r  r  )
r   r   listr   r   r,  r  rf  r[  rQ  )ru   r   r   r   ZgidItemsZsortableItemsrw  r;  ZinIDZoutIDrl  covr  r  rI   r  rJ   ry    s>   
zSingleSubst.preWritec                 C   @   t | j }|D ]\}}|dd|fd|fg |  q	d S )NSubstitutioninr  )r,  r   r   r   r   )ru   r   r   r   inGlyphZoutGlyphrI   rI   rJ   r{    
   
zSingleSubst.toXML2c                 C   s2   t | dd }|d u ri }|| _|d ||d < d S )Nr   r  r  )r   r   )ru   r   r   r   r   r   rI   rI   rJ   r     s
   zSingleSubst.fromXMLrr   r|  rI   rI   rI   rJ   r    s    
'r  c                   @   sB   e Zd ZdddZdd Zdd Zdd	 Zd
d Zedd Z	dS )MultipleSubstNc                 C   r  r~  r  r   rI   rI   rJ   rs     r^  zMultipleSubst.populateDefaultsc                 C   sX   i }| j dkrt|d }dd |d D }tt||}nJ d| j  || _| ` d S )Nr   r[  c                 S      g | ]}|j qS rI   )r  )r   srI   rI   rJ   r         z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r  )rf  r  r  r  r   )ru   rl  r   r   rQ  r  rI   rI   rJ   rr    s   
zMultipleSubst.postReadc                    sb   t dd   d u ri   _t }tt  |jd|_d_| fdd|jD d}|S )Nr   r(  r   c                    s   g | ]	}  | qS rI   )makeSequence_)r   rM  r   ru   rI   rJ   r     r   z*MultipleSubst.preWrite.<locals>.<listcomp>)r[  r  )	r   r   r[  r,  r  keysr   rQ  rf  )ru   r   r  rl  rI   r  rJ   ry    s   
zMultipleSubst.preWritec                 C   sJ   t | j }|D ]\}}d|}|dd|fd|fg |  q	d S )Nr   r  r  r  )r,  r   r   r   r   r   )ru   r   r   r   r  	outGlyphsr  rI   rI   rJ   r{  	  s   

zMultipleSubst.toXML2c                 C   s  t | dd }|d u ri }|| _|dkr4g | _|D ]}t|ts q|\}}}	|dkr1| j|d  qd S |dkrjt|dt|}
| j|
 }g  }||< |D ]}t|tsWqO|\}}}	|dkrg||d  qOd S |d ru|d 	d	ng }d
d |D ||d < d S )Nr   r[  rz  r   r  r   r  r  r   c                 S   r>  rI   r?  r  rI   rI   rJ   r   .  r`   z)MultipleSubst.fromXML.<locals>.<listcomp>r  )
r   r   Zold_coverage_r   r   r   intr   r   r  )ru   r   r   r   r   r   elementZelement_nameZelement_attrsr   r   rM  Zglyph_mappingr  rI   rI   rJ   r     s8   




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S rr   )r  r  )rN  seqrI   rI   rJ   r  0  s   zMultipleSubst.makeSequence_rr   )
r6   r7   r8   rs   rr  ry  r{  r   r   r  rI   rI   rI   rJ   r    s    
 r  c                   @   r  )ClassDefNc                 C   r  )N	classDefs)r]  r  r   rI   rI   rJ   rs   8  r^  zClassDef.populateDefaultsc                 C   s   i }| j dkr3|d }|d }||}|t| }|t||}t||D ]
\}	}
|
r1|
||	< q'n?| j dkrk|d }|D ]+}|j}
|
sFq>|j}|j}||}||d }|t||}|D ]}	|
||	< qbq>nt	
d| j  || _| ` d S )Nr   
StartGlyphClassValueArrayr)   ClassRangeRecordzUnknown ClassDef format: %s)rf  r   r   rK  r-  r  Classri  rj  rg  rh  r  )ru   rl  r   r  rO  Z	classListrp  rq  Z
glyphNamesry   clsrecordsrecro  rI   rI   rJ   rr  <  s<   




zClassDef.postReadc                 C   s   t | dd }|d u ri | _d S |j}g }| D ]\}}|sq|||||f q|ru|  |d \}}}	|	||gg}
|dd  D ]&\}}}||d ksR||	krc|
d ||g |
|||g |}|}|}	qC|
d ||g |
S d S )Nr  r   r   rs  )r   r  r   r   r   rv  rk  )ru   r   r  r   r   ry   r  r8  ZlastNameZlastClsrm  r   rI   rI   rJ   _getClassRanges[  s0   zClassDef._getClassRangesc                 C   s  d}dg i}|  |}|r||d d }|d d }|| d }t|d |d k rNt|D ]\}\}	}
}}}t }||_||_|	|_|||< q-d}d|i}n.|d d }dg| }|D ]\}	}
}}}t|
| || d D ]}|	||< qmq[d}||d}|| _|S )Nr)   r  r   r   rs  ra   )r  r  )	r  r   r   r  ri  rj  r  r-  rf  )ru   r   rw  rl  rm  Z
startGlyphZendGlyphZ
glyphCountrm   r  rO  Z	startNamero  ZendNamer  ZstartGlyphNameclassesrN  rI   rI   rJ   ry  t  s4   





zClassDef.preWritec                 C   r  )Nr  rM  class)r,  r  r   r   r   )ru   r   r   r   ry   r  rI   rI   rJ   r{    r  zClassDef.toXML2c                 C   s6   t | dd }|d u ri }|| _t|d ||d < d S )Nr  r  rM  )r   r  r  )ru   r   r   r   r   r  rI   rI   rJ   r     s
   zClassDef.fromXMLrr   )	r6   r7   r8   rs   rr  r  ry  r{  r   rI   rI   rI   rJ   r  7  s    
r  c                   @   r   )AlternateSubstNc                 C   r  )N
alternates)r]  r  r   rI   rI   rJ   rs     r^  zAlternateSubst.populateDefaultsc                 C   sr   i }| j dkr+t|d }|d }t|t|ksJ t||D ]	\}}|j||< q nJ d| j  || _| ` d S )Nr   r[  AlternateSetr   r  )rf  r  r   r  	Alternater  )ru   rl  r   r  r  altsr  altrI   rI   rJ   rr    s   
zAlternateSubst.postReadc           
      C   s   d| _ t| dd }|d u ri  }| _t| }t|D ]\}\}}||||f||< q|  t }dd |D |_	g }dd |D }|D ]}t
 }	||	_||	 qGd| _||dS )Nr   r  c                 S      g | ]}|d  qS r  rI   r  rI   rI   rJ   r     r`   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   r  rs  rI   r  rI   rI   rJ   r     r`   )r[  r  )rf  r   r  r  r   r   r   rv  r[  rQ  r  r  r   sortCoverageLast)
ru   r   r  r   rm   ry   r*  r  setListr  rI   rI   rJ   ry    s$   

zAlternateSubst.preWritec                 C   sh   t | j }|D ](\}}|jd|d |  |D ]}|jd|d |  q|d |  q	d S )Nr  rL  r  )r,  r  r   r   r   r   r   )ru   r   r   r   ry   r  r  rI   rI   rJ   r{    s   


zAlternateSubst.toXML2c           	      C   sd   t | dd }|d u ri }|| _|d }g }|||< |D ]}t|ts#q|\}}}||d  qd S )Nr  rM  )r   r  r   r   r   )	ru   r   r   r   r   r  ry   r*  r  rI   rI   rJ   r     s   

zAlternateSubst.fromXMLrr   r|  rI   rI   rI   rJ   r    s    
r  c                   @   sB   e Zd ZdddZdd Zedd Zdd	 Zd
d Zdd Z	dS )LigatureSubstNc                 C   r  )N	ligatures)r]  r  r   rI   rI   rJ   rs     r^  zLigatureSubst.populateDefaultsc                 C   st   i }| j dkr,t|d }|d }t|t|ksJ t|D ]\}}|| j||< qnJ d| j  || _| ` d S )Nr   r[  LigatureSetr   r  )rf  r  r   r   Ligaturer  )ru   rl  r   r  r  ligSetsrm   r  rI   rI   rJ   rr    s   
zLigatureSubst.postReadc                 C   s
   t |  S rr   r$  r   rI   rI   rJ   _getLigatureSortKey  s   
z!LigatureSubst._getLigatureSortKeyc                 C   sH  d| _ t| dd }|d u ri  }| _|rMttt|trMt }t|	 | j
dD ]!}t }|dd  |_t||_|| |_||d g | q)|}t| }t|D ]\}\}}	||||	f||< qW|  t }
dd |D |
_g }dd |D }|D ]}	t }g  }|_|	D ]}|| q|| qd| _|
|dS )	Nr   r  r(  r   c                 S   r  r  rI   r  rI   rI   rJ   r   -  r`   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   r  r  rI   r  rI   rI   rJ   r   0  r`   )r[  r  )rf  r   r  r   nextiterr   r  r,  r  r  r  	Componentr   	CompCountLigGlyphr.  r   r  r   r   r   rv  r[  rQ  r  r  )ru   r   r  ZnewLigaturescompsZligaturer   rm   ry   r*  r  r  r  ZligSetligsligrI   rI   rJ   ry    s:   




zLigatureSubst.preWritec                 C   st   t | j }|D ].\}}|jd|d |  |D ]}|jd|jd|jd |  q|	d |  q	d S )Nr  rL  r  r   )rM  r   )
r,  r  r   r   r   r   r  r   r  r   )ru   r   r   r   ry   r  r  rI   rI   rJ   r{  =  s   


zLigatureSubst.toXML2c                 C   s   t | dd }|d u ri }|| _|d }g }|||< |D ].}t|ts#q|\}}}t }	|d |	_|d }
|
r;|
dng |	_t|	j|	_	|
|	 qd S )Nr  rM  r   r   )r   r  r   r   r  r  r  r  r   r  r   )ru   r   r   r   r   r  ry   r  r  r  r   rI   rI   rJ   r   J  s$   


zLigatureSubst.fromXMLrr   )
r6   r7   r8   rs   rr  r   r  ry  r{  r   rI   rI   rI   rJ   r    s    

)r  c                   @   s0   e Zd Zdd Zdd Zddddefd	d
ZdS )COLRc                 C   s`   |j dd}|  D ]}|jdkr||j q
|j||i d||j<  ntdt| ||S )Nr   )offsetLayerRecordCount)Z	tableDictz$LayerRecordCount converter not found)	r9  getConvertersr   advancer  readAssertionErrorr   r   )ru   r  r   Z	subReaderconvrI   rI   rJ   r   _  s   
zCOLR.decompilec                 C   s    d | _ i | jdt| jdiS )Nr  )r  r   r   ru   r   rI   rI   rJ   ry  p  s   zCOLR.preWriter   glyphSetr'   quantizationc           	      C   s   | j dkrd S i }| jjD ]1}z
|j| ||}W n ty4 } zddlm} |d|j|d }~ww |d ur>|||j< qt	| doH| j
d u}|sT|rRd | _
d S d S |s^t
 | _
d| j
_|| j
_d S )Nr   )
TTLibErrorz#Failed to compute COLR ClipBox for ClipListr   )VersionBaseGlyphListBaseGlyphPaintRecordPaintcomputeClipBox	ExceptionfontTools.ttLibr  	BaseGlyphr]  r  rf  clips)	ru   r  r  r  r  clipBoxer  ZhasClipListrI   rI   rJ   computeClipBoxesz  s6   



zCOLR.computeClipBoxesNr  )r6   r7   r8   r   ry  r  r  rI   rI   rI   rJ   r  ^  s    
r  c                       s(   e Zd Zedd Z fddZ  ZS )
LookupListc                 C   sL   | j D ] }|jD ]}t|jdr  dS t|jdr"  dS qqt)NZSubstGSUBPosGPOS)LookupSubTabler   r6   endswith
ValueError)ru   lstrI   rI   rJ   table  s   

zLookupList.tablec              
      sD  |rd|vst |d jvrt ||S |d jt  | j }|  D ]}}|jrt| |jg }t	|D ]M\}}t
||v rrt|t
|  }|j}	|jrR|j d|	 }	|jri|j\}
}}|	 d| d|
 d| d}	||	 |  |||||jd|fg q2q"|jrt|jd t| sq"t| |jd }|||||jg  q"d S )NZDebgz: z in z (/)r   )r    rl   superr{  r  r  repeatr   r   r   strr   locationfeaturer  r   ZxmlWriteZauxevalvars)ru   r   r   Z	debugDatar  r   lookupIndexr  infotagscriptlanguager  rT  rI   rJ   r{    s>   
zLookupList.toXML2)r6   r7   r8   propertyr  r{  __classcell__rI   rI   r  rJ   r    s    
	r  c                   @   r   )BaseGlyphRecordArrayc                    "   t | j fddd| _| j S )Nc                         | jS rr   r   r  r  r   rI   rJ   r\     r]   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r(  )r,  ZBaseGlyphRecordr   r  r  rI   r  rJ   ry       
zBaseGlyphRecordArray.preWriteNr  rI   rI   rI   rJ   r    r   r  c                   @   r   )r  c                    r  )Nc                    r  rr   r  r  r  rI   rJ   r\     r]   z(BaseGlyphList.preWrite.<locals>.<lambda>r(  )r,  r  r   r  r  rI   r  rJ   ry    r  zBaseGlyphList.preWriteNr  rI   rI   rI   rJ   r    r   r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )ClipBoxFormatr   r)   c                 C   s
   | | j u S rr   Variablert   rI   rI   rJ   is_variable  r   zClipBoxFormat.is_variablec                 C   ra  rr   r  rt   rI   rI   rJ   as_variable  s   zClipBoxFormat.as_variableN)r6   r7   r8   Staticr   r!  r"  rI   rI   rI   rJ   r    s
    r  c                   @   s    e Zd ZeZdd Zdd ZdS )ClipBoxc                    s   t  fdd  D S )Nc                 3   s    | ]	}t  |jV  qd S rr   )r   r   )r   r  rt   rI   rJ   r     s    z#ClipBox.as_tuple.<locals>.<genexpr>)r   r  rt   rI   rt   rJ   as_tuple  s   zClipBox.as_tuplec                 C   s   | j j |   S rr   )rT  r6   r%  rt   rI   rI   rJ   __repr__  s   zClipBox.__repr__N)r6   r7   r8   r  
formatEnumr%  r&  rI   rI   rI   rJ   r$    s    r$  c                   @   s@   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd ZdS )r  Nc                 C   r  )Nr  )r]  r  r   rI   rI   rJ   rs     r^  zClipList.populateDefaultsc              
   C   s   i }|  }t|d D ]h\}}|j|jkr!td||j|j qg }g }t|j|jd D ])}	z||	 }
W n tyD   ||	 Y q.w |
|vrRt		|j
||
< q.||	 q.|rftd|t|t| |rttd|t|t| q|| _d S )N
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])r  r   StartGlyphID
EndGlyphIDrg  rh  r-  
IndexErrorr   r  r$  minr  r  )ru   rl  r   r  r   rm   r  ZredefinedGlyphsZmissingGlyphsr   rM  rI   rI   rJ   rr    sN   

zClipList.postReadc                    s\   t t}i  | j D ]\}}| }|| | | vr"| |< q fdd| D S )Nc                    s   i | ]\}}t | | qS rI   )	frozenset)r   r)  rQ  ZuniqueClipsrI   rJ   
<dictcomp>"  s    z#ClipList.groups.<locals>.<dictcomp>)r   r  r  r   r%  r   )ru   ZglyphsByClipry   r  r)  rI   r.  rJ   groups  s   
zClipList.groupsc                    s$  t | dsi | _i }|  |   D ]T\}}t fdd|D }|s&q|d }|gg}|dd  D ]}||d krI|d | ||g |}q4|d | |D ]\}	}
|	|
f|vsaJ |||	|
f< qUqg }t| D ]\\}	}
}t }|	|_|
|_	||_
|| qqt||d}|S )Nr  c                 3   s     | ]}| v r | V  qd S rr   rI   )r   ry   ZglyphMaprI   rJ   r   ,  s    z$ClipList.preWrite.<locals>.<genexpr>r   r   rs  )Z	ClipCountr(  )r]  r  ZgetReverseGlyphMapr0  r   r,  r   r(  r)  r*  r$  r   )ru   r   ZclipBoxRangesrQ  r  rx  r8  rm  r   rO  ro  ZclipRecordsrecordrl  rI   r1  rJ   ry  &  sB   
zClipList.preWritec           	      C   s  |r|n| j j}|d u rg }t| dr|d| jf ||| |  t|  	 dd dD ]E\}}|d |  t|D ]}|j
d|d |  qB|dd|jfg |  ||| |d |  |d |  q1|| |  d S )	Nrf  c                 S   s   t | d S )Nr   )r,  )r  rI   rI   rJ   r\   T  r]   z ClipList.toXML.<locals>.<lambda>r(  Cliprz  r   r$  )rT  r6   r]  r   rf  r   r   r,  r0  r   r   r{  r   )	ru   r   r   r   r   	tableNamerQ  r  ry   rI   rI   rJ   r   J  s0   






zClipList.toXMLc           
      C   s   t | dd }|d u ri  | _}|dksJ g }d }|D ]?}t|ts#q|\}}}|dkr4||d  q|dkrZt }t|d |_|D ]}t|tsLqD|\}}}||||| qDq|rf|D ]}	|||	< q_d S d S )Nr  r3  rz  r   r$  rf  )	r   r  r   r   r   r$  r   rf  r   )
ru   r   r   r   r   r  rQ  r  elemry   rI   rI   rJ   r   e  s4   





zClipList.fromXMLrr   r   )	r6   r7   r8   rs   rr  r0  ry  r   r   rI   rI   rI   rJ   r    s    
+
$r  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r   r)   N)r6   r7   r8   ZPADREPEATZREFLECTrI   rI   rI   rJ   r6    s    r6  c                   @   s|   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )CompositeModer   r   r)   ra   r*   rk   r   r   r+   r   rR   r   rP   r   r   r   r,                        rj            N)r6   r7   r8   CLEARZSRCZDESTZSRC_OVERZ	DEST_OVERZSRC_INZDEST_INZSRC_OUTZDEST_OUTZSRC_ATOPZ	DEST_ATOPZXORPLUSZSCREENZOVERLAYZDARKENZLIGHTENZCOLOR_DODGEZ
COLOR_BURNZ
HARD_LIGHTZ
SOFT_LIGHTZ
DIFFERENCEZ	EXCLUSIONZMULTIPLYZHSL_HUEZHSL_SATURATIONZ	HSL_COLORZHSL_LUMINOSITYrI   rI   rI   rJ   r8    s:    r8  c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!d" Z#d#d$ Z$d%S )&PaintFormatr   r)   ra   r*   rk   r   r   r+   r   rR   r   rP   r   r   r   r,   r9  r:  r;  r<  r=  r>  r?  rj   r@  rA  rB           rI  r-   c                 C   s   | j dS )NPaintVar)r   
startswithrt   rI   rI   rJ   r!    rw   zPaintFormat.is_variablec                 C   s>   |   r| S ztjd| jdd    W S  ty   Y d S w )NrI  rk   )r!  rE  __members__r   KeyErrorrt   rI   rI   rJ   r"    s   zPaintFormat.as_variableN)%r6   r7   r8   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformZPaintVarTransformPaintTranslateZPaintVarTranslate
PaintScaleZPaintVarScalePaintScaleAroundCenterZPaintVarScaleAroundCenterPaintScaleUniformZPaintVarScaleUniformPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterPaintRotateZPaintVarRotatePaintRotateAroundCenterZPaintVarRotateAroundCenter	PaintSkewZPaintVarSkewPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer!  r"  rI   rI   rI   rJ   rE    sF    rE  c                
   @   s   e Zd ZeZdd ZdddZdedee	j
 fdd	Zded  fd
dZdefddZdefddZ	ddedddedee fddZdS )r  c                 C   s0   z|  | jjW S  ty   td| j w )NzUnknown Paint format: )r'  rf  r   r  NotImplementedErrorrt   rI   rI   rJ   getFormatName  s
   zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d u rg }|d| jf ||| ||   |  | || |	| |  d S )Nrf  )
rT  r6   r   rf  r   r  r[  r   r{  r   )ru   r   r   r   r   r4  rI   rI   rJ   r     s   
zPaint.toXMLcolrreturnc                 c   s    | j tjkr)g }|jd ur|jj}dd t|| j| j| j  D E d H  d S | j tjkrP|j	j
D ]}|j| jkrGtjd|jdV   d S q3t| jd|  D ]}|jd urrt|jt| rrt| |j}tj|j|dV  qTd S )Nc                 s   s$    | ]\}}t jd ||dV  qdS )ZLayers)r   r   r   N)r   SubTableEntry)r   rm   r[   rI   rI   rJ   r     s
    
z+Paint.iterPaintSubTables.<locals>.<genexpr>r  )r   r   z not in colr.BaseGlyphList)rf  rE  rM  Z	LayerListr  r   ZFirstLayerIndexZ	NumLayersrO  r  r  r  rz  r   r^  rL  r  Z
tableClass
issubclassr   r   r   )ru   r\  Zlayersr2  r  r   rI   rI   rJ   iterPaintSubTables  s0   
zPaint.iterPaintSubTablesc                 C   s   dd |  |D S )Nc                 S   r  rI   r   )r   prI   rI   rJ   r     r  z%Paint.getChildren.<locals>.<listcomp>r`  )ru   r\  rI   rI   rJ   getChildren  s   zPaint.getChildrenc                    s@   t |stdt|  fdddD ]}|d j}|| qdS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                    
   |   S rr   rb  paintr\  rI   rJ   r\        
 z Paint.traverse.<locals>.<lambda>Ziter_subtables_fnrs  N)callable	TypeErrorr	   r   )ru   r\  callbackpathrf  rI   rg  rJ   traverse  s   


zPaint.traversec                 C   s  | j tjkr| j}t|j|j|j|j|j|j	S | j tj
kr&t| j| j	S | j tjkr4t| j| jS | j tjkrPt| j| j| j| j| j | j S | j tjkr\t| jS | j tjkrvt| j| j| j| j | j S | j tjkrtt| jS | j tjkrt| j| jt| j| j | j S | j tjkrtt| j t| jS | j tjkrt| j| jt| j t| j| j | j S t| j   rt!d| j  tS )NzVariable Paints not supported: )"rf  rE  rP  r   xxZyxZxyyyZdxZdyrQ  r   	translaterR  rN   rS   rT   rS  ZcenterXZcenterYrT  rU  rV  rotater   ZanglerW  rX  ZskewZ
xSkewAngleZ
ySkewAnglerY  r!  rZ  )ru   r
  rI   rI   rJ   getTransform  sH   zPaint.getTransformr   r  r'   r  c           	         s   t |}t|  fdddD ]$}|d j}|jtjkr2ttjdd |D t	}||j
 t|| q|jd u r:d S t }ttj|_t|j|\|_|_|_|_|S )Nc                    rd  rr   rb  re  rg  rI   rJ   r\   C  rh  z&Paint.computeClipBox.<locals>.<lambda>ri  rs  c                 s   s    | ]}|j  V  qd S rr   )r   rs  )r   r  rI   rI   rJ   r   I  r   z'Paint.computeClipBox.<locals>.<genexpr>)r   r	   r   rf  rE  rN  r   r   r   r   rz  Zdrawr   Zboundsr$  r  r  r#  r
   ZxMinZyMinZxMaxZyMax)	ru   r\  r  r  penrm  rf  ZtransformationcbrI   rg  rJ   r  >  s&   


zPaint.computeClipBoxr   r  )r6   r7   r8   rE  r'  r[  r   r  r#   r   r^  r`  r$   rc  rn  r   rs  r  r%   r$  r  rI   rI   rI   rJ   r    s$    
,r  )Z
Mark1Array)ZDefaultLangSys)MarkCoverageBaseCoverageZLigatureCoverageZMark1CoverageZMark2CoverageZBacktrackCoverageZInputCoverageZLookAheadCoverageZVertGlyphCoverageZHorizGlyphCoverageZTopAccentCoverageZExtendedShapeCoverageZMathKernCoverage)	ClassDef1	ClassDef2ZBacktrackClassDefZInputClassDefZLookAheadClassDefZGlyphClassDefZMarkAttachClassDef)ZEntryAnchorZ
ExitAnchor
BaseAnchorZLigatureAnchorZMark2AnchorZ
MarkAnchor)Z
XPlaDeviceZ
YPlaDeviceZ
XAdvDeviceZ
YAdvDeviceZXDeviceTableZYDeviceTableZDeviceTable)Z	HorizAxisZVertAxis)ZDefaultMinMax)ZMinCoordZMaxCoord)ZDefJstfLangSys)ZShrinkageEnableGSUBZShrinkageDisableGSUBZExtensionEnableGSUBZExtensionDisableGSUB)ZShrinkageEnableGPOSZShrinkageDisableGPOSZExtensionEnableGPOSZExtensionDisableGPOS)ZShrinkageJstfMaxZExtensionJstfMax)ZTopRightMathKernZTopLeftMathKernZBottomRightMathKernZBottomLeftMathKern)ZVertGlyphConstructionZHorizGlyphConstruction)	MarkArrayZLangSysr[  r  ZAnchorZDeviceZAxisZMinMaxZ	BaseCoordZJstfLangSysZJstfGSUBModListZJstfGPOSModListZJstfMaxZMathKernZMathGlyphConstructionc                 C   s  d}|j }|jdu r|d }|dk r|S |jdkrd}n|jdkr#d}| |j jjj}|| }|jd jj|krO|d }|dk rB|S || }|jd jj|ks8t	|t
|D ]-}|| }|j|kr||_t|jD ]\}}t|j | }	|	 }
d|
_||
_|
|j|< qiqVd}|S )a#  Either the offset from the LookupList to a lookup overflowed, or
    an offset from a lookup to a subtable overflowed.

    The table layout is::

      GPSO/GUSB
              Script List
              Feature List
              LookUpList
                      Lookup[0] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents
                      ...
                      Lookup[n] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents

    If the offset to a lookup overflowed (SubTableIndex is None)
            we must promote the *previous* lookup to an Extension type.

    If the offset from a lookup to subtable overflowed, then we must promote it
            to an Extension Lookup type.
    r   Nr   r  r   r  r   )LookupListIndexSubTableIndex	tableTyper  r  r  r   rT  
LookupTyper-  r   r   lookupTypesrf  ExtSubTable)ttfoverflowRecordokr  ZextTypelookupslookupsiZsubTableZextSubTableClassextSubTablerI   rI   rJ   fixLookupOverFlows  s>   



r  c           
      C      d}t | j }t|}|jdv r|d }n
|jdkr!|jd }i |_t||D ]}|| }|d }	|d |j|	< | j|	= q)|S )Nr   r[  r`  r)   r  r   )r,  r   r   r   itemName	itemIndexr-  )
oldSubTablenewSubTabler  r  Z
oldMappingoldLennewLenrm   r  r)  rI   rI   rJ   splitMultipleSubst     




r  c           
      C   s   d}t | dr| j|_t| j }t|}|jdv r |d }n
|jdkr*|jd }i |_t||D ]}|| }|d }	|d |j|	< | j|	= q2|S )Nr   r  r  r)   r  r   )	r]  r  r,  r  r   r   r  r  r-  )
r  r  r  r  ZoldAltsr  r  rm   r  r)  rI   rI   rJ   splitAlternateSubst
	  s    





r  c           
      C   r  )Nr   r  r)   r  r   )r,  r  r   r   r  r  r-  )
r  r  r  r  ZoldLigsr  r  rm   r  r)  rI   rI   rJ   splitLigatureSubst'	  r  r  c           	         s  | }d}| j |_ | j dkrdt| jdkrddD ]}t||t| | q| j |_| jj}| j}t| jd |d  | j_|d  | _|d  |j_|d  |_t| j| _t|j|_d}|S | j dkrt| j	dkrt
| dst| j	d j| _dD ]}t||t| | qd| _| j |_| j |_| jj}| jj}| j	}t| j	d tfd	d
| D   fdd|D | j_fdd| D | j_|d  | _	 fdd|D |j_fdd| D |j_|d  |_	t| j	| _t|j	|_d}|S )NFr   )ValueFormat1ValueFormat2r)   TClass2Countr   )r  ry  r  r  c                 3   s     | ]\}}| kr|V  qd S rr   rI   r   kr[   oldCountrI   rJ   r   r	  s    zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}| vr|qS rI   rI   r  	newGlyphsrI   rJ   r   t	  r  z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}| k r||qS rI   rI   r  r  rI   rJ   r/  u	  s    z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}| v r|qS rI   rI   r  r  rI   rJ   r   z	  r  c                    s"   i | ]\}}| kr||  qS rI   rI   r  r  rI   rJ   r/  {	  s    )rf  r   ZPairSetr   r   r[  rT  rQ  ZPairSetCountZClass1Recordr]  ZClass2Recordr  	DontSharerx  r  r*  r   ZClass1Count)	r  r  r  r  r  r   coverager  r  rI   )r  r  rJ   splitPairPosA	  sZ   *




r  c                 C   s  | j }|dk r	dS |d }|| }g g }}g g }}	t| jj| jjD ]%\}
}|j|k r8||
 || q$| j|8  _||
 |	| q$g g }}| jj	D ]%}|
 |
 }}|jd | |_|j|d  |_|| || qS| j|_|| j_| j
 |_||j_| j|_|| _ ||_ || j_| j
 |_|	|j_t|| j_t|	|j_|| j_	| j
 |_||j_	t|| j_t||j_dS )Nr)   FT)Z
ClassCountr  rv  rQ  r{  Z
MarkRecordr  r   Z	BaseArrayZ
BaseRecordrT  rz  rf  rw  r   Z	MarkCountZ	BaseCount)r  r  r  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsry   Z
markRecordZoldBaseRecordsZnewBaseRecordsr  ZoldBaseRecordZnewBaseRecordrI   rI   rJ   splitMarkBasePos	  sR   






r  )r)   ra   r*   )r)   r*   r  r  c                 C   s0  | |j  j}|jj|j }|j}|j| }t|dsd|_dS t|drN|j	j
j}|}|j	}t|j  |j
j }| }	|j|	_|	}
t|j  | }| }||	_	n|j
j}t|j  | }| }|}
t|dri|jd |_z	t|j  | }W n ty   td|j | Y dS w ||||}|r|j|d |
 |S )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    r  Tr  SubTableCountr   z)Don't know how to split %s lookup type %sF)r~  r  r  r  r|  r}  r   r]  r  r  rT  r  r  rf  r  
splitTablerL  rg  errorr  )r  r  r  r  ZsubIndexZsubtableZsubTableTyper  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr  Z	splitFuncr  rI   rI   rJ   fixSubTableOverFlows	  sP   




r  c                  C   sp  dd l } ddlm} | d}t }|D ]2\}}t}||}|r0|d}|d d }t|}||vrFt||fi }	|dv rBd|	_	|	||< q|D ])\}}
|
drrt|dkrr|dd  |v rr|| }||dd   }||_||_qIt D ]\}}|| }|D ]}|||< qqwttttttttd	ttttttttt d
	dt!it"t#t$t!t%dda&t&d t&d< t&' D ]}| D ]\}}	||	_(qqdt)ia*t+ddD ]}t,t*d| < qt+ddD ]}t-t*d| < qddl.m/} |D ]I\}}||}|r(|0 \}}t1|}|| }	t2|	dsi |	_3i |	_4||dd  |\}}||	j3|< ||	j4|< q|| }	|||\|	_3|	_4qd S )Nr   r   )otDataz([A-Za-z0-9]+)Format(\d+)$r  TZVarra   )r   r)   ra   r*   rk   r   r   r+   )	r   r)   ra   r*   rk   r   r   r+   r   r*   )r   r   r)   r*   rk   )r  r  ZmortZmorxr  ZJSTFsizer=  zss%02dd   zcv%02d)buildConverters
converters)5rer  r   globalsr   matchgroupr   r   r  rJ  r   Z	NoVarTypeZVarType_equivalentsr   r  r  r  r  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphr  r   r  rV  rS  r-  rY  rZ  ZotConvertersr  r0  r  r]  r  convertersByName)r  r  Z	formatPat	namespacer   r  Z	baseClassmZ
formatTyper  r   ZvarTypeZ	noVarTypebaser  r  Z
lookupEnumenumrm   r  rw  r  r  rI   rI   rJ   _buildClasses
  s   


&
"

r  c                 C   s   | d u rg S | j S rr   )rQ  )r  rI   rI   rJ   r  
  s   r  )__doc__r  r  r   	functoolsr   mathr   	itertoolscollectionsr   r   r  r   Z%fontTools.ttLib.tables.TupleVariationr   Z!fontTools.ttLib.tables.otTraverser	   ZfontTools.misc.arrayToolsr
   ZfontTools.misc.roundToolsr   ZfontTools.misc.transformr   r   r   ZfontTools.misc.textToolsr   r   r   ZfontTools.misc.vectorr   ZfontTools.pens.boundsPenr   ZfontTools.pens.transformPenr   ZotBaser   r   r   r   r   ZfontTools.misc.fixedToolsr   r   r   r   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r    loggingrX   arraysysr!   typingr"   r#   r$   r%   r&   ZfontTools.ttLib.ttGlyphSetr'   	getLoggerr6   rg  r(   rK   r=   r>   r?   rA   rB   rF   rG   rC   rD   r   r   r   rn   rp   rq   r   objectr   r   r   r   r  r  r  rA  rR  rV  rY  rZ  r[  r}   r}  r  r  r  r  r  r  r  r  r  r  r  r  r$  r  r6  r8  rE  r  r  r  r  r  r  r  r  r  r  r  r  rI   rI   rI   rJ   <module>   s  


 z"UA  ZL7PKiEy9.
 . 		U>G?;o