a
    w=ic                     @   s8  d Z ddl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mZmZ ddlmZmZmZmZmZ dd	lmZmZ ddlZddlZeeZG d
d deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd de%Z&G dd de%Z'G d d! d!e%Z(G d"d# d#eZ)d$Z*G d%d& d&ed'Z+G d(d) d)eZ,G d*d+ d+eZ-G d,d- d-eZ.G d.d/ d/eZ/G d0d1 d1eZ0G d2d3 d3eZ1G d4d5 d5eZ2G d6d7 d7eZ3G d8d9 d9eZ4G d:d; d;eZ5G d<d= d=eZ6G d>d? d?eZ7G d@dA dAed'Z8G dBdC dCed'Z9G dDdE dEeZ:G dFdG dGeZ;G dHdI dIeZ<G dJdK dKed'Z=dLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[Z>d\d] Z?d^d_ Z@d`da ZAdbdc ZBddde ZCdfdg ZDe@eAeBdheCeDdidjZEdkdl ZFdmdn ZGeG  dodp ZHdS )qzfontTools.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)defaultdict
namedtuple)otRound)	bytesjoinpadsafeEval   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYc                   @   s   e Zd Zdd ZdS )AATStateTablec                 C   s   i | _ g | _g | _d S N)ZGlyphClassesZStatesZPerGlyphLookupsself r   p/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/ttLib/tables/otTables.py__init__   s    zAATStateTable.__init__N__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )AATStatec                 C   s
   i | _ d S r   )Transitionsr   r   r   r   r   "   s    zAATState.__init__Nr   r   r   r   r   r   !   s   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)NNr   )fontstatesr   r   r   compileActions)   s    zAATAction.compileActionsc                    s^    fdd j D }|r4|jdd|d |   jdkrZ|jdd j d |  d S )	Nc                    s   g | ]} j | r|qS r   )__dict__.0fr   r   r   
<listcomp>.       z.AATAction._writeFlagsToXML.<locals>.<listcomp>Flags,valuer   ReservedFlagsz0x%04X)_FLAGS	simpletagjoinnewliner,   )r   	xmlWriterflagsr   r   r   _writeFlagsToXML-   s    
zAATAction._writeFlagsToXMLc                 C   s$   || j v sJ d| d| j|< d S )Nzunsupported flag %sT)r-   r"   r   flagr   r   r   _setFlag8   s    zAATAction._setFlag)r   r   r   r-   staticmethodr!   r3   r6   r   r   r   r   r   &   s
   
r   c                   @   sj   e Zd ZdZdZg dZ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 ) RearrangementMorphAction   r   )	MarkFirstDontAdvanceMarkLastz	no changeu	   Ax ⇒ xAu	   xD ⇒ Dxu   AxD ⇒ DxAu   ABx ⇒ xABu   ABx ⇒ xBAu   xCD ⇒ CDxu   xCD ⇒ DCxu   AxCD ⇒ CDxAu   AxCD ⇒ DCxAu   ABxD ⇒ DxABu   ABxD ⇒ DxBAu   ABxCD ⇒ CDxABu   ABxCD ⇒ CDxBAu   ABxCD ⇒ DCxABu   ABxCD ⇒ DCxBA)r   r	         r9               	   
                  c                 C   s(   d| _ d| _d| _d| _d| _d| _d S Nr   F)NewStateVerbr:   r;   r<   r,   r   r   r   r   r   U   s    z!RearrangementMorphAction.__init__c                 C   sz   |d u sJ | | j | jdkr,| jdks6J | j| j| jB }| jrP|dO }| jr^|dO }| jrl|dO }| | d S )Nr   rI       @      )writeUShortrK   rL   r,   r:   r;   r<   r   writerr   actionIndexr2   r   r   r   compile]   s    z RearrangementMorphAction.compilec                 C   s`   |d u sJ |  | _|  }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )NrI   rM   rN   rO   i  )
readUShortrK   rL   boolr:   r;   r<   r,   r   readerr   actionReaderr2   r   r   r   	decompileg   s    

z"RearrangementMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd | j| j}|d url|| |  |	| |  d S )NrK   r*   rL   )
begintagr0   r.   rK   r3   rL   _VERBSgetcommentendtag)r   r1   r   attrsnameZverbCommentr   r   r   toXMLq   s    


zRearrangementMorphAction.toXMLc           	      C   s   d | _  | _| _d | _ | _| _dd |D }|D ]|\}}}|dkrXt|d | _ q6|dkrpt|d | _q6|dkrt|d | _q6|d	kr6|d d
D ]}| |	  qq6d S )Nr   Fc                 S   s   g | ]}t |tr|qS r   
isinstancetupler$   tr   r   r   r&      r'   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rK   r+   rL   r,   r(   r)   )
rK   rL   r,   r:   r;   r<   r   splitr6   strip	r   ra   r`   contentr   eltNameeltAttrs
eltContentr5   r   r   r   fromXML   s    z RearrangementMorphAction.fromXMLN)r   r   r   
staticSizeactionHeaderSizer-   r\   r   rT   rZ   rb   ro   r   r   r   r   r8   =   s2   

r8   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 )ContextualMorphActionrB   r   SetMarkr;   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FF  rv   )rK   rs   r;   r,   	MarkIndexCurrentIndexr   r   r   r   r      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 )NrM   rN   )rP   rK   r,   rs   r;   rw   rx   rQ   r   r   r   rT      s    
zContextualMorphAction.compilec                 C   s\   |d u sJ |  | _|  }t|d@ | _t|d@ | _|d@ | _|  | _|  | _d S )NrM   rN   i?  )rU   rK   rV   rs   r;   r,   rw   rx   rW   r   r   r   rZ      s    


zContextualMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )NrK   r*   rw   rx   )r[   r0   r.   rK   r3   rw   rx   r_   r   r1   r   r`   ra   r   r   r   rb      s    

zContextualMorphAction.toXMLc           	      C   s   d | _ | _d | _| _d\| _| _dd |D }|D ]\}}}|dkrXt|d | _ q6|dkr|d d	D ]}| |	  qnq6|d
krt|d | _q6|dkrt|d | _q6|dkr6t|d | _q6d S )Nr   Fru   c                 S   s   g | ]}t |tr|qS r   rc   rf   r   r   r   r&      r'   z1ContextualMorphAction.fromXML.<locals>.<listcomp>rK   r+   r(   r)   r,   rw   rx   )
rK   r,   rs   r;   rw   rx   r   rh   r6   ri   rj   r   r   r   ro      s     zContextualMorphAction.fromXMLN)r   r   r   rp   rq   r-   r   rT   rZ   rb   ro   r   r   r   r   rr      s   

rr   c                   @   s   e Zd Zdd ZdS )	LigActionc                 C   s   d| _ d| _d S )NFr   )StoreGlyphIndexDeltar   r   r   r   r      s    
zLigAction.__init__Nr   r   r   r   r   rz      s   rz   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@   rF   SetComponentr;   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   rt   )rK   r~   r;   r,   Actionsr   r   r   r   r      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rP|dO }| | t| jdkr|  }| ||  n
| d d S )NrM   rN   r   rO   )rP   rK   r,   r~   r;   lenr   compileLigActions)r   rR   r   rS   r2   actionsr   r   r   rT      s    
zLigatureMorphAction.compilec                 C   sv   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ }|d@ | _|  }|rl| ||| _ng | _d S )NrM   rN   rO   i  )rU   rK   rV   r~   r;   r,   _decompileLigActionsr   )r   rX   r   rY   r2   ZperformActionrS   r   r   r   rZ      s    

zLigatureMorphAction.decompilec                 C   s   dt  i   }}}|D ]&}|j D ]\}}||  q$qt|dd dD ]R}||vrNtdt|dD ],}	||	d  }
t||	 d }||
| qj||7 }qNt	|d}||fS )Nr'   c                 S   s   t |  | fS r   r   xr   r   r   <lambda>  r'   z4LigatureMorphAction.compileActions.<locals>.<lambda>keyr   r9   )
setr   itemsaddr   sortedranger   
setdefaultr   )r   r    resultr   rS   state_glyphClasstransaisuffixZsuffixIndexr   r   r   r!     s    

z"LigatureMorphAction.compileActionsc                 C   sp   g }t | jD ]X\}}|t| jd k}|jd@ }||r<dndO }||jrNdndO }|td| qt|S )Nr	   ?        r      @z>L)		enumerater   r   r|   r{   appendstructpackr   )r   r   r   actionlastr+   r   r   r   r   *  s    
z%LigatureMorphAction.compileLigActionsc           	      C   sv   g }d}| |j|d  }|sr| }t|d@ }t }|| t|d@ |_|d@ }|dkrjd| }||_q|S )NFr9   r   r   r   i    i   )getSubReaderposZ	readULongrV   rz   r   r{   r|   )	r   rY   rS   r   r   rX   r+   r   deltar   r   r   r   4  s     
z(LigatureMorphAction._decompileLigActionsc                 C   s   d | _ | _d | _| _d| _g | _dd |D }|D ]\}}}|dkrXt|d | _ q6|dkr|d dD ]}| |  qnq6|d	krt|d | _q6|d
kr6t	 }	|
ddd}
dd |
D }
d|
v |	_t|d |	_| j|	 q6d S )Nr   Fc                 S   s   g | ]}t |tr|qS r   rc   rf   r   r   r   r&   J  r'   z/LigatureMorphAction.fromXML.<locals>.<listcomp>rK   r+   r(   r)   r,   Action c                 S   s   g | ]}|  qS r   ri   r#   r   r   r   r&   V  r'   r{   r|   )rK   r,   r~   r;   r   r   rh   r6   ri   rz   r]   r{   r|   r   )r   ra   r`   rk   r   rl   rm   rn   r5   r   r2   r   r   r   ro   E  s,    
zLigatureMorphAction.fromXMLc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]4}d|jfg}|jrb|d |d| |  qB|	| |  d S )NrK   r*   r|   )r(   r{   r   )
r[   r0   r.   rK   r3   r   r|   r{   r   r_   )r   r1   r   r`   ra   r   attribsr   r   r   rb   \  s    




zLigatureMorphAction.toXMLN)r   r   r   rp   rq   r-   r   rT   rZ   r7   r!   r   r   ro   rb   r   r   r   r   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 )InsertionMorphActionrB   r9   )rs   r;   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g  | _| _d S rJ   )rK   r-   setattrr,   CurrentInsertionActionMarkedInsertionActionr4   r   r   r   r   s  s
    
zInsertionMorphAction.__init__c                 C   s   |d usJ | | j | j}| jr,|dO }| jr:|dO }| jrH|dO }| jrV|dO }| jrd|dO }| jrr|dO }|t	| j
d> O }|t	| jO }| | t	| j
dkr|t| j
 }nd	}| | t	| jdkr|t| j }nd	}| | d S )
NrM   rN   rO            r?   r   rv   )rP   rK   r,   rs   r;   r   r   r   r   r   r   r   re   )r   rR   r   rS   r2   ZcurrentIndexZmarkedIndexr   r   r   rT   z  s0    

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 )NrM   rN   rO   r   r   r   i  r?   )indexcount   )rU   rK   rV   rs   r;   r   r   r   r   _decompileInsertionActionr   r   rW   r   r   r   rZ     s&    

zInsertionMorphAction.decompilec                 C   s8   |dks|dkrg S | |j|d  }|||S )Nrv   r   r=   )r   r   getGlyphNameManyZreadUShortArray)r   rY   r   r   r   rX   r   r   r   r     s    z.InsertionMorphAction._decompileInsertionActionc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]}|jd|d |  qB| jD ]}|jd|d |  qd|| |  d S )NrK   r*   r   glyphr   )r[   r0   r.   rK   r3   r   r   r_   )r   r1   r   r`   ra   gr   r   r   rb     s    





zInsertionMorphAction.toXMLc           	      C   s   |    dd |D }|D ]\}}}|dkr<t|d | _q|dkrh|d dD ]}| |  qRq|dkr| j|d  q|d	kr| j|d  qd
sJ |qd S )Nc                 S   s   g | ]}t |tr|qS r   rc   rf   r   r   r   r&     r'   z0InsertionMorphAction.fromXML.<locals>.<listcomp>rK   r+   r(   r)   r   r   r   F)	r   r   rK   rh   r6   ri   r   r   r   rj   r   r   r   ro     s"    zInsertionMorphAction.fromXMLc                 C   s  t  i d  }}}|D ]L}|j D ]<\}}|jd urF|t|j |jd ur$|t|j q$qt|dd dD ]}||v rqttdt	|D ]D}	t	|d |	 }
t|	t	|D ] }||	|d  }|
||
 qq|D ]}| |}|td|7 }qqt||fS )	Nr'   c                 S   s   t |  | fS r   r   r   r   r   r   r     r'   z5InsertionMorphAction.compileActions.<locals>.<lambda>r   r   r=   r	   z>H)r   r   r   r   r   re   r   r   r   r   r   
getGlyphIDr   r   )r   r    r   rS   r   r   r   r   r   startZ
startIndexlimitglyphsr   glyphIDr   r   r   r!     s&    


z#InsertionMorphAction.compileActionsN)r   r   r   rp   rq   r-   r   rT   rZ   r   rb   ro   r7   r!   r   r   r   r   r   l  s   r   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__r   r
   rT   )r   rR   r   r   r   r   rT     s    ,zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)ra   )r
   rb   r   r   ry   r   r   r   rb     s    zFeatureParams.toXML)NN)r   r   r   rT   rb   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )FeatureParamsSizeNr   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )FeatureParamsStylisticSetNr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )FeatureParamsCharacterVariantsNr   r   r   r   r   r     s   r   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )CoverageNc                 C   s   t | dsg | _d S )Nr   )hasattrr   r   Z
propagatorr   r   r   populateDefaults  s    
zCoverage.populateDefaultsc                 C   s   | j dkr|d | _n| j dkrg  }| _|d }t|dd d}||krXtd |}~|D ]>}|j}|j}||}	||d }
||	t
|	|
 q^ng | _td	| j  | ` d S )
Nr	   
GlyphArrayr=   RangeRecordc                 S   s   | j S r   )StartCoverageIndexr   r   r   r   r     r'   z#Coverage.postRead.<locals>.<lambda>r   .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr   r   logwarningStartEndr   extendr   r   )r   rawTabler   r   rangesZsorted_rangesrr   endstartIDendIDr   r   r   postRead	  s&    




zCoverage.postReadc                 C   sd  t | dd }|d u rg  }| _d}d|i}|rZ||}t||k}|d }|gg}|dd  D ].}	|	|d kr|d | ||	g |	}qb|d | |st|d t|k rZd}
tt|D ]R}|| \}}t }||_|	||_
|	||_|
|_|||< |
| | d }
q|r>td |jdd	 d
 |D ]
}|`qBd}d|i}|| _|S )Nr   r	   r   r   r>   r   c                 S   s   | j S r   )StartIDr   r   r   r   r   D  r'   z#Coverage.preWrite.<locals>.<lambda>r   r=   r   )getattrr   getGlyphIDManyr   r   r   r   r   r   ZgetGlyphNamer   r   r   r   r   sortr   )r   r   r   formatr   glyphIDsZbrokenOrderr   r   r   r   r   r   r   r   r   r   r   preWrite"  sH    


zCoverage.preWritec                 C   s,   t | dg D ]}|jd|d |  qd S )Nr   Glyphr*   )r   r.   r0   )r   r1   r   	glyphNamer   r   r   toXML2N  s    zCoverage.toXML2c                 C   s0   t | dd }|d u rg }|| _||d  d S )Nr   r+   )r   r   r   )r   ra   r`   rk   r   r   r   r   r   ro   S  s
    zCoverage.fromXML)Nr   r   r   r   r   r   r   ro   r   r   r   r   r     s
   
,r   l    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 )DeltaSetIndexMapNc                 C   s   t | dsg | _d S Nmappingr   r   r   r   r   r   r   b  s    
z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dksJ |d | _ d S )NEntryFormat  r   r   r   )r   r   r   r   r   r   r   f  s    zDeltaSetIndexMap.postReadc                 C   s   d}| D ]}||O }q|d@ }d}|r8|d7 }|dL }q"t |d}|dksNJ |d| ? |d|> d @ B }|dkrxd}n |dkrd}n|dkrd}nd	}|d d	> |d B S )
Nr   rv   r	         r=   i r>   r9   )max)r   ZoredidxinnerZ	innerBitsZ	entrySizer   r   r   getEntryFormatj  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   rv   r	   r   MappingCountr   )r   r   r   r   r"   copyr   )r   r   r   r   r   r   r   r     s    

zDeltaSetIndexMap.preWritec                 C   st   | d |  tt| dg D ]L\}}d|fg}|tkrZ|d|d? fd|d@ fg |d| |  q"d S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr   r   rv   Map)r^   r0   r   r   NO_VARIATION_INDEXr   r.   )r   r1   r   r   r+   r`   r   r   r   r     s    


zDeltaSetIndexMap.toXML2c           	      C   sn   t | dd }|d u rg  | _}t|d }t|dd}t|dd}|dksVJ |||d> |B  d S )Nr   r   r   Z0xFFFFr   rv   r   )r   r   r   r]   insert)	r   ra   r`   rk   r   r   r   r   r   r   r   r   ro     s    
zDeltaSetIndexMap.fromXML)N)
r   r   r   r   r   r7   r   r   r   ro   r   r   r   r   r   `  s   


r   Zuint8c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )	VarIdxMapNc                 C   s   t | dsi | _d S r   r   r   r   r   r   r     s    
zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dksJ |  }|d }||d gt|t|   tt||| _d S )Nr   r   r   r   r   )getGlyphOrderr   r   dictzipr   )r   r   r   
glyphOrderZmapListr   r   r   r     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= q8d i}t |d< t |d< |S )	Nr   c                    s   g | ]} | qS r   r   r$   r   r   r   r   r&     r'   z&VarIdxMap.preWrite.<locals>.<listcomp>r	   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r     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   r   r   r   r   rv   r   )r   r   r   r.   r0   )r   r1   r   r   r+   r`   r   r   r   r     s    

zVarIdxMap.toXML2c           	      C   s   t | dd }|d u ri }|| _z|d }W n   | |d  }Y n0 t|d }t|d }|dkslJ |d> |B ||< d S )Nr   r   r   r   r   rv   r   )r   r   r   r   )	r   ra   r`   rk   r   r   r   r   r   r   r   r   ro     s    zVarIdxMap.fromXML)Nr   r   r   r   r   r     s
   

r   c                   @   s   e Zd Zdd ZdS )VarRegionListc                 C   s4   | d}|rt|j| _i | jdt| jdiS )NZfvarRegionAxisCount)r]   r   Zaxesr  r"   r   )r   r   Z	fvarTabler   r   r   r     s    
zVarRegionList.preWriteNr   r   r   r   r   r   r   r   r    s   r  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )SingleSubstNc                 C   s   t | dsi | _d S r   r   r   r   r   r   r     s    
zSingleSubst.populateDefaultsc                    s   i }t |d }| jdkrf|d  ||} fdd|D }||}t||D ]\}}	|	||< qRnZ| jdkrt||d ksJ d|d	 }
t||
D ]\}}|||< qnd
sJ d| j || _| `d S )Nr   r	   DeltaGlyphIDc                    s   g | ]}|  d  qS )   r   )r$   r   r   r   r   r&     r'   z(SingleSubst.postRead.<locals>.<listcomp>r=   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler   r   r   r   r   r   )r   r   r   r   inputZ	inputGIDSZoutGIDSZoutNamesinpoutsubstsubr   r  r   r     s&    



zSingleSubst.postReadc                    s  t | dd }|d u ri  }| _t| }|j  fdd|D }tt||}d}d }|D ]0\}}	|d u rx|	| d }|| d |	kr\ qq\|d u rd}nd}i }
|| _t }dd |D }dd |D }||_	||
d	< |dkr|d usJ ||
d
< n||
d< |
S )Nr   c                    s    g | ]\}} | |fqS r   r   )r$   r   br   r   r   r&     r'   z(SingleSubst.preWrite.<locals>.<listcomp>r=   r  r	   c                 S   s   g | ]}|d  d qS )r	   r   r   r$   itemr   r   r   r&   )  r'   c                 S   s   g | ]}|d  d  qS r	   r   r  r   r   r   r&   *  r'   r   r  r	  )
r   r   listr   r   r   r   r   r   r   )r   r   r   r   ZgidItemsZsortableItemsr   r   ZinIDZoutIDr   covr  r  r   r  r   r     s:    

zSingleSubst.preWritec                 C   s@   t | j }|D ](\}}|dd|fd|fg |  qd S )NSubstitutioninr  )r   r   r   r.   r0   )r   r1   r   r   inGlyphZoutGlyphr   r   r   r   4  s    zSingleSubst.toXML2c                 C   s2   t | dd }|d u ri }|| _|d ||d < d S )Nr   r  r  )r   r   )r   ra   r`   rk   r   r   r   r   r   ro   ;  s
    zSingleSubst.fromXML)Nr   r   r   r   r   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   s   t | dsi | _d S r   r   r   r   r   r   r   E  s    
zMultipleSubst.populateDefaultsc                 C   s\   i }| j dkr<t|d }dd |d D }tt||}ndsNJ d| j  || _| ` d S )Nr	   r   c                 S   s   g | ]
}|j qS r   )r	  )r$   sr   r   r   r&   M  r'   z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r
  )r   r  r   r   r   )r   r   r   r   r   r  r   r   r   r   I  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 r   )makeSequence_)r$   r   r   r   r   r   r&   ]  s   z*MultipleSubst.preWrite.<locals>.<listcomp>)r   r  )	r   r   r   r   r  keysr   r   r   )r   r   r  r   r   r  r   r   T  s    
zMultipleSubst.preWritec                 C   sJ   t | j }|D ]2\}}d|}|dd|fd|fg |  qd S )Nr)   r  r  r  )r   r   r   r/   r.   r0   )r   r1   r   r   r  	outGlyphsr  r   r   r   r   b  s    
zMultipleSubst.toXML2c                 C   s  t | dd }|d u ri }|| _|dkrhg | _|D ]2}t|ts@q0|\}}}	|dkr0| j|d  q0d S |dkrt|dt|}
| j|
 }g  }||< |D ]0}t|tsq|\}}}	|dkr||d  qd S |d r|d 	d	ng }d
d |D ||d < d S )Nr   r   r   r+   r  r   r	  r  r)   c                 S   s   g | ]}|  qS r   r   r   r   r   r   r&     r'   z)MultipleSubst.fromXML.<locals>.<listcomp>r  )
r   r   Zold_coverage_rd   re   r   intr]   r   rh   )r   ra   r`   rk   r   r   elementZelement_nameZelement_attrs_r   r   Zglyph_mappingr!  r   r   r   ro   j  s4    




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S r   )r  r	  )r   seqr   r   r   r    s    zMultipleSubst.makeSequence_)N)
r   r   r   r   r   r   r   ro   r7   r  r   r   r   r   r  C  s   
 r  c                   @   s>   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 )ClassDefNc                 C   s   t | dsi | _d S )N	classDefs)r   r'  r   r   r   r   r     s    
zClassDef.populateDefaultsc                 C   s   i }| j dkrf|d }|d }||}|t| }|t||}t||D ]\}	}
|
rN|
||	< qNn~| j dkr|d }|D ]V}|j}
|
sq||j}|j}||}||d }|t||}|D ]}	|
||	< qq|nt	
d| j  || _| ` d S )Nr	   
StartGlyphClassValueArrayr=   ClassRangeRecordzUnknown ClassDef format: %s)r   r   r   r   r   r   Classr   r   r   r   r'  )r   r   r   r'  r   Z	classListr   r   Z
glyphNamesr   clsrecordsrecr   r   r   r   r     s4    



zClassDef.postReadc                 C   s   t | dd }|d u ri | _d S |j}g }| D ]"\}}|s>q0|||||f q0|r|  |d \}}}	|	||gg}
|dd  D ]L\}}}||d ks||	kr|
d ||g |
|||g |}|}|}	q|
d ||g |
S d S )Nr'  r   r	   r   )r   r'  r   r   r   r   r   )r   r   r'  r   r   r   r,  r   ZlastNameZlastClsr   r   r   r   r   _getClassRanges  s.    zClassDef._getClassRangesc                 C   s  d}dg i}|  |}|r|d d }|d d }|| d }t|d |d k rtt|D ]6}|| \}	}
}}}t }||_||_|	|_|||< q`d}d|i}n\|d d }dg| }|D ]2\}	}
}}}t|
| || d D ]}|	||< qqd}||d}|| _|S )Nr=   r*  r   r	   r   r>   )r(  r)  )r/  r   r   r*  r   r   r+  r   )r   r   r   r   r   Z
startGlyphZendGlyphZ
glyphCountr   r,  r   Z	startNamer   ZendNamer.  ZstartGlyphNameclassesr   r   r   r   r     s4    




zClassDef.preWritec                 C   s@   t | j }|D ](\}}|dd|fd|fg |  qd S )Nr&  r   class)r   r'  r   r.   r0   )r   r1   r   r   r   r,  r   r   r   r     s    zClassDef.toXML2c                 C   s6   t | dd }|d u ri }|| _t|d ||d < d S )Nr'  r1  r   )r   r'  r"  )r   ra   r`   rk   r   r'  r   r   r   ro     s
    zClassDef.fromXML)N)	r   r   r   r   r   r/  r   r   ro   r   r   r   r   r&    s   
r&  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )AlternateSubstNc                 C   s   t | dsi | _d S )N
alternates)r   r3  r   r   r   r   r     s    
zAlternateSubst.populateDefaultsc                 C   sv   i }| j dkrVt|d }|d }t|t|ks6J t||D ]\}}|j||< q@ndshJ d| j  || _| ` d S )Nr	   r   AlternateSetr   r
  )r   r  r   r   	Alternater3  )r   r   r   r3  r  altsr  altr   r   r   r     s    
zAlternateSubst.postReadc           
      C   s   d| _ t| dd }|d u r$i  }| _t| }tt|D ]$}|| \}}||||f||< q<|  t	 }dd |D |_
g }dd |D }|D ]}t }	||	_||	 qd| _||dS )Nr	   r3  c                 S   s   g | ]}|d  qS r  r   r  r   r   r   r&     r'   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r   r   r  r   r   r   r&     r'   )r   r4  )r   r   r3  r  r   r   r   r   r   r   r   r4  r5  r   sortCoverageLast)
r   r   r3  r   r   r   r   r  setListr6  r   r   r   r     s&    
zAlternateSubst.preWritec                 C   sh   t | j }|D ]P\}}|jd|d |  |D ]}|jd|d |  q4|d |  qd S )Nr4  r   r5  )r   r3  r   r[   r0   r.   r_   )r   r1   r   r   r   r3  r7  r   r   r   r   )  s    

zAlternateSubst.toXML2c           	      C   sd   t | dd }|d u ri }|| _|d }g }|||< |D ](}t|tsFq6|\}}}||d  q6d S )Nr3  r   )r   r3  rd   re   r   )	r   ra   r`   rk   r   r3  r   r   r#  r   r   r   ro   4  s    

zAlternateSubst.fromXML)Nr   r   r   r   r   r2    s
   
r2  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )LigatureSubstNc                 C   s   t | dsi | _d S )N	ligatures)r   r<  r   r   r   r   r   E  s    
zLigatureSubst.populateDefaultsc                 C   s|   i }| j dkr\t|d }|d }t|t|ks6J tt|D ]}|| j||| < qBndsnJ d| j  || _| ` d S )Nr	   r   LigatureSetr   r
  )r   r  r   r   Ligaturer<  )r   r   r   r<  r  ligSetsr   r   r   r   r   I  s    
zLigatureSubst.postReadc                 C   sV  d| _ t| dd }|d u r$i  }| _|rttt|trt }t|	 dd dD ]B\}}t
 }|dd  |_t||_||_||d g | qT|}t|	 }tt|D ]$}|| \}	}
||	|	|
f||< q|  t }dd |D |_g }d	d |D }|D ]6}
t }g  }|_
|
D ]}|| q&|| qd| _||d
S )Nr	   r<  c                 S   s   t | d  | d fS Nr   r   r  r   r   r   r   b  r'   z(LigatureSubst.preWrite.<locals>.<lambda>r   r   c                 S   s   g | ]}|d  qS r  r   r  r   r   r   r&   p  r'   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r8  r   r  r   r   r   r&   s  r'   )r   r=  )r   r   r<  rd   nextiterre   r   r   r   r>  	Componentr   	CompCountLigGlyphr   r   r  r   r   r   r   r   r=  r9  )r   r   r<  ZnewLigaturescompsligZligaturer   r   r   r   r  r?  r:  ZligSetligsr   r   r   r   V  s<    


zLigatureSubst.preWritec                 C   st   t | j }|D ]\\}}|jd|d |  |D ]&}|jd|jd|jd |  q4|	d |  qd S )Nr=  r   r>  r)   )r   
components)
r   r<  r   r[   r0   r.   rF  r/   rD  r_   )r   r1   r   r   r   r?  rH  r   r   r   r     s    



zLigatureSubst.toXML2c                 C   s   t | dd }|d u ri }|| _|d }g }|||< |D ]\}t|tsFq6|\}}}t }	|d |	_|d }
|
rv|
dng |	_t|	j|	_	|
|	 q6d S )Nr<  r   rJ  r)   )r   r<  rd   re   r>  rF  rh   rD  r   rE  r   )r   ra   r`   rk   r   r<  r   rI  r#  rH  rJ  r   r   r   ro     s"    


zLigatureSubst.fromXML)Nr   r   r   r   r   r;  C  s
   
*r;  c                   @   s   e Zd Zdd Zdd ZdS )COLRc                 C   sb   |j dd}|  D ]6}|jdkr0||j q|j||i d||j<  qTqtdt| ||S )Nr   )offsetLayerRecordCount)Z	tableDictz$LayerRecordCount converter not found)	r   getConvertersra   advancerp   readAssertionErrorr
   rZ   )r   rX   r   Z	subReaderconvr   r   r   rZ     s    
zCOLR.decompilec                 C   s    d | _ i | jdt| jdiS )NrM  )rM  r"   r   r   r   r   r   r   r     s    zCOLR.preWriteN)r   r   r   rZ   r   r   r   r   r   rK    s   rK  c                       s(   e Zd Zedd Z fddZ  ZS )
LookupListc                 C   sP   | j D ]@}|jD ]4}t|jdr,  dS t|jdr  dS qqtd S )NZSubstGSUBPosGPOS)LookupSubTabletyper   endswith
ValueError)r   lstr   r   r   table  s    

zLookupList.tablec              
      sL  |rd|vst |d jvr(t ||S |d jt  | j }|  D ] }|jrt| |jg }t	|D ]\}}t
||v rt|t
|  }|j}	|jr|j d|	 }	|jr|j\}
}}|	 d| d|
 d| d}	||	 |  |||||jd|fg qhqD|jr$t|jd t| s$qDt| |jd }|||||jg  qDd S )NZDebgz: z in z (/)r   )r   datasuperr   r_  rN  repeatr   ra   r   strr   locationfeaturer^   r0   ZxmlWriteZauxevalvars)r   r1   r   Z	debugDatarR  r+   lookupIndexr  infotagscriptlanguagerg  r   r   r   r     s0    
zLookupList.toXML2)r   r   r   propertyr_  r   __classcell__r   r   ro  r   rT    s   
	rT  c                   @   s   e Zd Zdd ZdS )BaseGlyphRecordArrayc                    s"   t | j fddd| _| j S )Nc                    s     | jS r   r   	BaseGlyphr.  r   r   r   r     r'   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r   )r   ZBaseGlyphRecordr"   r   rS  r   rv  r   r     s
    
zBaseGlyphRecordArray.preWriteNr  r   r   r   r   rr    s   rr  c                   @   s   e Zd Zdd ZdS )BaseGlyphListc                    s"   t | j fddd| _| j S )Nc                    s     | jS r   rs  ru  rv  r   r   r     r'   z(BaseGlyphList.preWrite.<locals>.<lambda>r   )r   BaseGlyphPaintRecordr"   r   rS  r   rv  r   r     s
    
zBaseGlyphList.preWriteNr  r   r   r   r   rw    s   rw  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 r   Variabler   r   r   r   is_variable  s    zClipBoxFormat.is_variablec                 C   s   | j S r   rz  r   r   r   r   as_variable  s    zClipBoxFormat.as_variableN)r   r   r   ZStaticr{  r|  r}  r   r   r   r   ry    s   ry  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 r   )r   ra   )r$   rR  r   r   r   	<genexpr>  r'   z#ClipBox.as_tuple.<locals>.<genexpr>)re   rN  r   r   r   r   as_tuple  s    zClipBox.as_tuplec                 C   s   | j j |   S r   )r   r   r  r   r   r   r   __repr__	  s    zClipBox.__repr__N)r   r   r   ry  
formatEnumr  r  r   r   r   r   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 )ClipListNc                 C   s   t | dsi | _d S )Nclips)r   r  r   r   r   r   r     s    
zClipList.populateDefaultsc              
   C   s   i }|  }t|d D ]\}}|j|jkrBtd||j|j qg }g }t|j|jd D ]V}	z||	 }
W n  ty   ||	 Y q\Y n0 |
|vrt		|j
||
< q\||	 q\|rtd|t|t| |rt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
EndGlyphIDr   r   r   
IndexErrorr   r   r~  minr   r  )r   r   r   r  r   r   r.  ZredefinedGlyphsZmissingGlyphsr   r   r   r   r   r     sJ    

zClipList.postReadc                    s\   t t}i  | j D ].\}}| }|| | | vr| |< q fdd| D S )Nc                    s   i | ]\}}t | | qS r   )	frozenset)r$   r   r   ZuniqueClipsr   r   
<dictcomp>G  s   z#ClipList.groups.<locals>.<dictcomp>)r   r  r  r   r  r   )r   ZglyphsByClipr   clipBoxr   r   r  r   groups?  s    

zClipList.groupsc                    s$  t | dsi | _i }|  |   D ]\}}t fdd|D }|sLq(|d }|gg}|dd  D ].}||d kr|d | ||g |}qh|d | |D ]$\}	}
|	|
f|vsJ |||	|
f< qq(g }t| D ].\\}	}
}t }|	|_|
|_	||_
|| qt||d}|S )Nr  c                 3   s   | ]}| v r | V  qd S r   r   )r$   r   ZglyphMapr   r   r  R  s   z$ClipList.preWrite.<locals>.<genexpr>r   r	   r   )Z	ClipCountr  )r   r  ZgetReverseGlyphMapr  r   r   r   r  r  r  r~  r   )r   r   ZclipBoxRangesr   r  r   r   r   r   r   r   ZclipRecordsrecordr   r   r  r   r   L  s@    
zClipList.preWritec           	      C   s  |r|n| j j}|d u rg }t| dr6|d| jf ||| |  t|  	 dd dD ]\}}|d |  t|D ]}|j
d|d |  q|dd|jfg |  ||| |d |  |d |  qb|| |  d S )	Nr   c                 S   s   t | d S r@  )r  rA  r   r   r   r   {  r'   z ClipList.toXML.<locals>.<lambda>r   Clipr   r*   r~  )r   r   r   r   r   r[   r0   r   r  r   r.   r   r_   )	r   r1   r   r`   ra   	tableNamer   r  r   r   r   r   rb   q  s0    






zClipList.toXMLc           
      C   s   t | dd }|d u ri  | _}|dks*J g }d }|D ]~}t|tsFq6|\}}}|dkrh||d  q6|dkr6t }t|d |_|D ]*}t|tsq|\}}}||||| qq6|r|D ]}	|||	< qd S )Nr  r  r   r+   r~  r   )	r   r  rd   re   r   r~  r   r   ro   )
r   ra   r`   rk   r   r  r   r  elemr   r   r   r   ro     s.    




zClipList.fromXML)N)NN)	r   r   r   r   r   r  r   rb   ro   r   r   r   r   r    s   
,%
r  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r	   r=   N)r   r   r   ZPADREPEATZREFLECTr   r   r   r   r    s   r  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=   r>   r9   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   r                                    N)r   r   r   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_LUMINOSITYr   r   r   r   r    s8   r  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=   )r>   r9   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   r  r  r  r  r  r  r  r  r  r  r           r       c                 C   s   | j dS )NPaintVar)ra   
startswithr   r   r   r   r|    s    zPaintFormat.is_variablec                 C   sB   |   r| S ztjd| jdd    W S  ty<   Y d S 0 d S )Nr  r?   )r|  r  __members__ra   KeyErrorr   r   r   r   r}    s    zPaintFormat.as_variableN)%r   r   r   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradientZ
PaintGlyphPaintColrGlyphZPaintTransformZPaintVarTransformZPaintTranslateZPaintVarTranslateZ
PaintScaleZPaintVarScaleZPaintScaleAroundCenterZPaintVarScaleAroundCenterZPaintScaleUniformZPaintVarScaleUniformZPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterZPaintRotateZPaintVarRotateZPaintRotateAroundCenterZPaintVarRotateAroundCenterZ	PaintSkewZPaintVarSkewZPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer|  r}  r   r   r   r   r    sD   r  c                   @   s8   e Zd ZeZdd ZdddZdd Zedd	d
Z	dS )Paintc                 C   s8   z|  | jjW S  ty2   td| j Y n0 d S )NzUnknown Paint format: )r  r   ra   r\  NotImplementedErrorr   r   r   r   getFormatName  s    zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d u rg }|d| jf ||| ||   |  | || |	| |  d S )Nr   )
r   r   r   r   r[   r^   r  r0   r   r_   )r   r1   r   r`   ra   r  r   r   r   rb     s    
zPaint.toXMLc                 C   s   | j tjkr8g }|jd ur"|jj}|| j| j| j  S | j tjkrz|jj	D ]}|j
| jkrL|jg  S qLt| jdg }|  D ]0}|jd urt|jt| r|t| |j q|S )Nz not in colr.BaseGlyphList)r   r  r  Z	LayerListr  ZFirstLayerIndexZ	NumLayersr  rw  rx  rt  r   r  rN  Z
tableClass
issubclassrZ  r   r   ra   )r   colrZlayersr  childrenrR  r   r   r   getChildren  s"    
zPaint.getChildren)r  c                 C   sf   t |std| g}t }|rb| }t||v r6q|| |t| |t|| qdS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callableN)	callable	TypeErrorr   popidr   r   reversedr  )r   r  callbackstackvisitedcurrentr   r   r   traverse(  s    zPaint.traverse)NN)
r   r   r   r  r  r  rb   r  rK  r  r   r   r   r   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r8d}n|jdkrFd}| |j jjj}|| }|jd jj|kr|d }|dk r|S || }q^t	|t
|D ]d}|| }|j|kr||_t	t
|jD ]8}|j| }t|j | }	|	 }
d|
_||
_|
|j|< qqd}|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	   rU  rA   rW  rC   )LookupListIndexSubTableIndex	tableTyper_  rT  rX  rY  r   
LookupTyper   r   lookupTypesr   ExtSubTable)ttfoverflowRecordokrj  ZextTypelookupslookupsiZsubTableZextSubTableClassextSubTabler   r   r   fixLookupOverFlows]  s<    





r  c           
      C   s   d}t | j }t|}|jdv r.|d }n|jdkrB|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr	   r   r   r=   r  r   )r   r   r   r   itemName	itemIndexr   )
oldSubTablenewSubTabler  r  Z
oldMappingoldLennewLenr   r  r   r   r   r   splitMultipleSubst  s    




r  c           
      C   s   d}t | dr| j|_t| j }t|}|jdv r@|d }n|jdkrT|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qd|S )Nr	   r9  r  r=   r4  r   )	r   r9  r   r3  r   r   r  r  r   )
r  r  r  r  ZoldAltsr  r  r   r  r   r   r   r   splitAlternateSubst  s     





r  c           
      C   s   d}t | j }t|}|jdv r.|d }n|jdkrB|jd }i |_t||D ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr	   r  r=   r=  r   )r   r<  r   r   r  r  r   )
r  r  r  r  ZoldLigsr  r  r   r  r   r   r   r   splitLigatureSubst  s    




r  c           	         s  | }d}| j |_ | j dkrt| jdkrdD ]}t||t| | q,| j |_| jj}| j}t| jd |d  | j_|d  | _|d  |j_|d  |_t| j| _t|j|_d}nL| j dkrt| j	dkrt
| dst| j	d j| _dD ]}t||t| | qd| _| 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  r  r  r  c                 3   s   | ]\}}| kr|V  qd S r   r   r$   kvoldCountr   r   r    r'   zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}| vr|qS r   r   r   	newGlyphsr   r   r&     r'   z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}| k r||qS r   r   r  r  r   r   r    r'   z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}| v r|qS r   r   r   r  r   r   r&     r'   c                    s"   i | ]\}}| kr||  qS r   r   r  r  r   r   r    r'   )r   r   ZPairSetr   r   r   r   r   ZPairSetCountZClass1Recordr   ZClass2Recordr  	DontSharer  r'  r   r   ZClass1Count)	r  r  r  r^  r  ra   coverager-  r'  r   )r  r  r   splitPairPos  sP    r  c                 C   s  | j }|dk rdS |d }|| }g g  }}g g  }}	t| jj| jjD ]J\}
}|j|k rp||
 || qH| j|8  _||
 |	| qHg g  }}| jj	D ]J}|
 |
  }}|jd | |_|j|d  |_|| || q| 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   r  r   r  Z
MarkRecordr+  r   Z	BaseArrayZ
BaseRecordr   r  r   r  r   Z	MarkCountZ	BaseCount)r  r  r  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsr   Z
markRecordZoldBaseRecordsZnewBaseRecordsr.  ZoldBaseRecordZnewBaseRecordr   r   r   splitMarkBasePos*  sT    






r  )r=   r>   r9   )r=   r9   rU  rW  c                 C   s4  | |j  j}|jj|j }|j}|j| }t|ds>d|_dS t|dr|j	j
j}|}|j	}t|j  |j
j }| }	|j|	_|	}
t|j  | }| }||	_	n |j
j}t|j  | }| }|}
t|dr|jd |_zt|j  | }W n& ty
   td|j | Y dS 0 ||||}|r0|j|d |
 |S )zd
	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_  rT  rX  r  r  rY  r   r  r  r   r  r  r   r  
splitTabler  r   errorr   )r  r  r_  r  ZsubIndexZsubtableZsubTableTyper  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr  Z	splitFuncr  r   r   r   fixSubTableOverFlows  sJ    




r  c                  C   s|  dd l } ddlm} | d}t }|D ]d\}}t}||}|r`|d}|d d }t|}||vr(t||fi }	|dv rd|	_	|	||< q(|D ]R\}}
|
drt|dkr|dd  |v r|| }||dd   }||_||_qt D ]$\}}|| }|D ]}|||< qqt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 ]\}}	||	_(qxqldt)ia*t+ddD ]}t,t*d| < qt+ddD ]}t-t*d| < qddl.m/} |D ]\}}||}|rZ|0 \}}t1|}|| }	t2|	ds.i |	_3i |	_4||dd  |\}}||	j3|< ||	j4|< n|| }	|||\|	_3|	_4qd S )Nr   r	   )otDataz([A-Za-z0-9]+)Format(\d+)$r  TZVarr>   )r	   r=   r>   r9   r?   r@   rA   rB   )	r	   r=   r>   r9   r?   r@   rA   rB   rC   r9   )r   r	   r=   r9   r?   )rU  rW  ZmortZmorxrW  ZJSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)5rer  rT   globalsr
   matchgroupr   rZ  r  r  r   Z	NoVarTypeZVarType_equivalentsr   r  r  r2  r;  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphr  valuesr  r   r   r   r   r   ZotConvertersr  r  r"  r   r  convertersByName)r  r  Z	formatPat	namespacera   r_  Z	baseClassmZ
formatTyper,  r$  ZvarTypeZ	noVarTypebaser6  r7  Z
lookupEnumenumr   r  r   r  r  r   r   r   _buildClasses  s    



&"

r  c                 C   s   | d u rg S | j S d S r   )r   )r  r   r   r   r  (  s    r  )I__doc__r   r   r   	itertoolscollectionsr   r   ZfontTools.misc.roundToolsr   ZfontTools.misc.textToolsr   r   r   ZotBaser
   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r   loggingr   	getLoggerr   r   objectr   r   r   r8   rr   rz   r}   r   r   r   r   r   r   r   r   r   r  r  r  r&  r2  r;  rK  rT  rr  rw  ry  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s   
R@  	\J5QNkG]&


 .C :C?8n