a
    èÝEbõ  ã                   @   s$  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)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 d/d0„ d0eƒZ/G d1d2„ d2eƒZ0G d3d4„ d4eƒZ1G d5d6„ d6eƒZ2G d7d8„ d8eƒZ3G d9d:„ d:eƒZ4G d;d<„ d<eƒZ5G d=d>„ d>ed&ƒƒZ6G d?d@„ d@ed&ƒƒZ7G dAdB„ dBeƒZ8G dCdD„ dDeƒZ9G dEdF„ dFeƒZ:G dGdH„ dHed&ƒƒZ;dIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXœZ<dYdZ„ Z=d[d\„ Z>d]d^„ Z?d_d`„ Z@dadb„ ZAdcdd„ ZBe>e?e@deœeAeBdfœdgœZCdhdi„ ZDdjdk„ ZEeEƒ  dldm„ ZFdS )nzáfontTools.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   ú_/home/ja/django-apps/lartica_env/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rˆt|d ƒ| _q6|d	kr6|d  d
¡D ]}|  | 	¡ ¡ qžq6d 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rœt|d ƒ| _q6|dkr´t|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rœt|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ž   Z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 r‚qttdt	|ƒƒD ]D}	t	|ƒd |	 }
t|	t	|ƒƒD ] }||	|d … }| 
||
¡ q²q�|D ]}|  |¡}|t d|¡7 }qÚqt||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r g  }| _|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  |¡ |sºt|ƒ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Å   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È   ]  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Ú   a  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r†d}n|dkr”d}nd	}|d d	> |d B S )
Nr   rv   r	   é   éÿ   r=   iÿÿÿ r>   r9   )Úmax)ré   ZoredÚidxÚinnerZ	innerBitsZ	entrySizer   r   r   ÚgetEntryFormate  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   sP   t t| dg ƒƒD ]:\}}d|fd|d? fd|d@ ff}| d|¡ | ¡  qd S )Nré   r±   Úouterrî   rò   rv   ÚMap)rš   rÝ   r.   r0   )r   r1   r   r•   r+   r`   r   r   r   rå   ‰  s    

ýzDeltaSetIndexMap.toXML2c           	      C   sf   t | dd ƒ}|d u rg  | _}t|d ƒ}t|d ƒ}t|d ƒ}|dksNJ ‚| ||d> |B ¡ d S )Nré   r±   rö   rò   rv   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r®t|ƒ|d ksˆJ dƒ‚|d	 }
t||
ƒD ]\}}|||< qšnd
sÀJ 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\ q q\|d u rœd}nd}i }
|| _tƒ }dd„ |D ƒ}dd„ |D ƒ}||_	||
d	< |dkrø|d usîJ ‚||
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å   (  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È   9  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&   A  r'   z*MultipleSubst.postRead.<locals>.<listcomp>ÚSequencer   r  )rÎ   r	  rû   rü   ré   )r   rÔ   r   ré   r¼   r  r   r   r   rÚ   =  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&   Q  s   ÿz*MultipleSubst.preWrite.<locals>.<listcomp>)rÅ   r  )	rÝ   ré   rÅ   r�   r  Úkeysr¹   r¼   rÎ   )r   r   r  rÔ   r   r  r   râ   H  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å   V  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rÔt| dt|ƒ¡ƒ}
| j|
 }g  }||< |D ]0}t|tƒs®qž|\}}}	|dkrž| |d ¡ qžd 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   ^  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  7  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}
|
sŒq||j}|j}| |¡}| |¡d }| t||ƒ¡}|D ]}	|
||	< qÄq|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 r¦tt|ƒƒD ]6}|| \}	}
}}}tƒ }||_||_|	|_|||< q`d}d|i}n\|d d }dg| }|D ]2\}	}
}}}t|
| || d ƒD ]}|	||< qäqÀd}||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º   Ú	startNamer×   Ú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ƒ }	||	_| |	¡ q–d| _||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   (  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È   9  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Ú   =  s    
zLigatureSubst.postReadc                 C   sV  d| _ t| dd ƒ}|d u r$i  }| _|rœttt|ƒƒtƒrœtƒ }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‡   V  r'   z(LigatureSubst.preWrite.<locals>.<lambda>rˆ   r   c                 S   s   g | ]}|d  ‘qS r  r   r  r   r   r   r&   d  r'   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS r8  r   r  r   r   r   r&   g  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â   J  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å   t  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;  7  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 rèt|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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   r{  r|  r   r   r   r   ry  ì  s   ry  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r¨t	 	|j
¡||
< q\| |	¡ q\|rÐt 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õ   ry  Ú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>/  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sÂJ ‚|||	|
f< qªq(g }t| ¡ ƒD ].\\}	}
}tƒ }|	|_|
|_	||_
| |¡ qât|ƒ|dœ}|S )Nr~  c                 3   s   | ]}|ˆ v rˆ | V  qd S r   r   )r$   rä   ©ZglyphMapr   r   rz  :  s   ÿz$ClipList.preWrite.<locals>.<genexpr>r   r	   rÛ   )Z	ClipCountr  )rÆ   r~  ZgetReverseGlyphMaprˆ  r‹   r�   r›   r  r€  r�  ry  r€   )r   r   ZclipBoxRangesr¼   r‡  rá   rŸ   rÕ   r½   rº   r×   ZclipRecordsÚrecordrÔ   r   r‰  r   râ   4  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‡   c  r'   z ClipList.toXML.<locals>.<lambda>rˆ   ÚCliprã   r*   ry  )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   Y  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ƒs˜qˆ|\}}}| ||||¡ qˆq6|rÌ|D ]}	|||	< q¾d S )Nr~  r‹  rã   r+   ry  rÎ   )	rÝ   r~  rd   re   r›   ry  r   rÎ   ro   )
r   ra   r`   rk   r   r~  r¼   r‡  Úelemrä   r   r   r   ro   t  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!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³   é    N)#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ž  µ  s@   rž  c                   @   s4   e Zd Zdd„ Zddd„Zdd„ Zedœd	d
„ZdS )ÚPaintc                 C   s6   zt | jƒjW S  ty0   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r†t|jt| ƒƒr†| t| |jƒ¡ q†|S )Nz not in colr.BaseGlyphList)rÎ   rž  r£  Z	LayerListr¥  ZFirstLayerIndexZ	NumLayersr¤  rw  rx  rt  rã   ÚKeyErrorrN  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§  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|< qÆqœd}|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   ÚfixLookupOverFlows9  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   ÚsplitMultipleSubsts  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rÈt| jƒdkrÈd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   rz  ô  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 r„d|	_	|	||< q(t
 ¡ D ]"\}
}||
 }
|D ]}|
||< qªq–t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 ]\}}	||	_$�q�qdt%ia&t'ddƒD ]}t(t&d| < �qFt'ddƒD ]}t)t&d| < �qdddl*m+} |D ]”\}}| |¡}|�r | ,¡ \}}t-|ƒ}|| }	t.|	dƒ�sÔi |	_/i |	_0||dd … |ƒ\}}||	j/|< ||	j0|< n|| }	|||ƒ\|	_/|	_0�qˆd S )Nr   r	   )ÚotDataz([A-Za-z0-9]+)Format(\d+)$rã  T)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%02déd   zcv%02d)ÚbuildConvertersÚ
converters)1Úrerè  rT   Úglobalsr
   ÚmatchÚgroupr   rZ  rß  Ú_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*  Ú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	  )GÚ__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$  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   Ú<module>   sž   
R@  	ZC5QNkG]&

	 #Bè :C?üüö8f