U
    »mœd&@ ã                   @   s¾  d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&Z&ddl'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z- e)�rddl.m/Z/ e& 0e1¡Z2G dd„ de3ƒZ4G dd„ de3ƒZ5G dd„ de3ƒZ6G dd„ de6ƒZ7G dd„ de6ƒZ8G dd„ de3ƒZ9G dd „ d e6ƒZ:G d!d"„ d"e6ƒ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-ZAG d.d/„ d/e"d0ƒƒZBG d1d2„ d2eƒZCG d3d4„ d4eƒZDG d5d6„ d6eƒZEG d7d8„ d8eƒZFG d9d:„ d:eƒZGG d;d<„ d<eƒZHG d=d>„ d>eƒZIG d?d@„ d@eƒZJG dAdB„ dBeƒZKG dCdD„ dDeƒZLG dEdF„ dFeƒZMG dGdH„ dHeƒZNG dIdJ„ dJe"d0ƒƒZOG dKdL„ dLe"d0ƒƒZPG dMdN„ dNeƒZQG dOdP„ dPeƒZRG dQdR„ dReƒZSG dSdT„ dTe"d0ƒƒZTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddœZUdedf„ ZVdgdh„ ZWdidj„ ZXdkdl„ ZYdmdn„ ZZdodp„ Z[eWeXeYdqœeZe[drœdsœZ\dtdu„ Z]dvdw„ Z^e^ƒ  dxdy„ Z_dS )zzá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)Úreduce)Úradians)ÚdefaultdictÚ
namedtuple)Údfs_base_table)ÚquantizeRect)ÚotRound)Ú	TransformÚIdentity)Ú	bytesjoinÚpadÚsafeEval)ÚControlBoundsPen)ÚTransformPené   )Ú	BaseTableÚFormatSwitchingBaseTableÚValueRecordÚCountReferenceÚ getFormatSwitchingBaseTableClass)ÚLookupDebugInfoÚLOOKUP_DEBUG_INFO_KEY)ÚTYPE_CHECKINGÚIteratorÚListÚOptionalÚSet)Ú_TTGlyphSetc                   @   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#   úX/home/sam/Atlas/atlas_env/lib/python3.8/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%   0   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$   ÚcompileActions7   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><   s     
 z.AATAction._writeFlagsToXML.<locals>.<listcomp>ÚFlagsú,©Úvaluer   ÚReservedFlagsz0x%04X)Ú_FLAGSÚ	simpletagÚjoinÚnewliner9   )r"   Ú	xmlWriterÚflagsr#   r!   r$   Ú_writeFlagsToXML;   s    
zAATAction._writeFlagsToXMLc                 C   s$   || j kstd| ƒ‚d| j|< d S )Nzunsupported flag %sT)r:   ÚAssertionErrorr0   ©r"   Úflagr#   r#   r$   Ú_setFlagD   s    zAATAction._setFlag)r'   r(   r)   r:   Ústaticmethodr/   r@   rD   r#   r#   r#   r$   r,   4   s
   
	r,   c                   @   sl   e Zd ZdZdZdddg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   é   é   rG   é   é   é   é   é	   é
   é   é   é   é   é   c                 C   s(   d| _ d| _d| _d| _d| _d| _d S ©Nr   F)ÚNewStateÚVerbrH   rI   rJ   r9   r!   r#   r#   r$   r%   a   s    z!RearrangementMorphAction.__init__c                 C   sz   |d kst ‚| | j¡ | jdkr,| jdks6t | jƒ‚| j| jB }| jrP|dO }| jr^|dO }| jrl|dO }| |¡ d S )Nr   rW   é €  é @  é    )rA   ÚwriteUShortrY   rZ   r9   rH   rI   rJ   ©r"   Úwriterr-   ÚactionIndexr?   r#   r#   r$   Úcompilei   s    z RearrangementMorphAction.compilec                 C   s`   |d kst ‚| ¡ | _| ¡ }|d@ | _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _|d@ | _d S )NrW   r[   r\   r]   ið  )	rA   Ú
readUShortrY   rZ   ÚboolrH   rI   rJ   r9   ©r"   Úreaderr-   ÚactionReaderr?   r#   r#   r$   Ú	decompilev   s    

z"RearrangementMorphAction.decompilec                 C   s†   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ |jd| jd� | j | j¡}|d k	rh| |¡ | ¡  | 	|¡ | ¡  d S )NrY   r7   rZ   )
Úbegintagr=   r;   rY   r@   rZ   Ú_VERBSÚgetÚcommentÚendtag)r"   r>   r-   ÚattrsÚnameZverbCommentr#   r#   r$   ÚtoXML€   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©r2   Útr#   r#   r$   r4   ‘   s     
 z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rY   r8   rZ   r9   r5   r6   )
rY   rZ   r9   rH   rI   rJ   r   ÚsplitrD   Ústrip©	r"   ro   rn   Úcontentr-   ÚeltNameÚeltAttrsÚ
eltContentrC   r#   r#   r$   ÚfromXMLŽ   s    z RearrangementMorphAction.fromXMLN)r'   r(   r)   Ú
staticSizeÚactionHeaderSizer:   rj   r%   rb   rh   rp   r}   r#   r#   r#   r$   rF   I   s2   
ð
rF   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 )ÚContextualMorphActionrP   r   ÚSetMarkrI   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   ©FF©éÿÿ  r„   )rY   r�   rI   r9   Ú	MarkIndexÚCurrentIndexr!   r#   r#   r$   r%   £   s    zContextualMorphAction.__init__c                 C   s`   |d kst ‚| | j¡ | j}| jr,|dO }| jr:|dO }| |¡ | | j¡ | | j¡ d S )Nr[   r\   )rA   r^   rY   r9   r�   rI   r…   r†   r_   r#   r#   r$   rb   ©   s    
zContextualMorphAction.compilec                 C   s\   |d kst ‚| ¡ | _| ¡ }t|d@ ƒ| _t|d@ ƒ| _|d@ | _| ¡ | _| ¡ | _d S )Nr[   r\   iÿ?  )	rA   rc   rY   rd   r�   rI   r9   r…   r†   re   r#   r#   r$   rh   µ   s    


zContextualMorphAction.decompilec                 C   s~   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ |jd| jd� | ¡  |jd| jd� | ¡  | |¡ | ¡  d S )NrY   r7   r…   r†   )ri   r=   r;   rY   r@   r…   r†   rm   ©r"   r>   r-   rn   ro   r#   r#   r$   rp   ¿   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   Frƒ   c                 S   s   g | ]}t |tƒr|‘qS r#   rq   rt   r#   r#   r$   r4   Ð   s     
 z1ContextualMorphAction.fromXML.<locals>.<listcomp>rY   r8   r5   r6   r9   r…   r†   )
rY   r9   r�   rI   r…   r†   r   rv   rD   rw   rx   r#   r#   r$   r}   Ì   s     zContextualMorphAction.fromXMLN)r'   r(   r)   r~   r   r:   r%   rb   rh   rp   r}   r#   r#   r#   r$   r€   ž   s   
r€   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$   rˆ   ß   s   rˆ   c                   @   s`   e Zd ZdZdZddgZdd„ Zdd„ Zd	d
„ Ze	dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚLigatureMorphActionrN   rT   ÚSetComponentrI   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r‚   )rY   rŒ   rI   r9   ÚActionsr!   r#   r#   r$   r%   ö   s    zLigatureMorphAction.__init__c                 C   sŽ   |d k	st ‚| | 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 )Nr[   r\   r   r]   )	rA   r^   rY   r9   rŒ   rI   Úlenr�   ÚcompileLigActions)r"   r`   r-   ra   r?   Úactionsr#   r#   r$   rb   ü   s    
zLigatureMorphAction.compilec                 C   sv   |d k	st ‚| ¡ | _| ¡ }t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ}|d@ | _| ¡ }|rl|  ||¡| _ng | _d S )Nr[   r\   r]   iÿ  )	rA   rc   rY   rd   rŒ   rI   r9   Ú_decompileLigActionsr�   )r"   rf   r-   rg   r?   ZperformActionra   r#   r#   r$   rh     s    

zLigatureMorphAction.decompilec                 C   s´   dt ƒ i   }}}|D ]&}|j ¡ D ]\}}| | ¡ ¡ q$qt|dd„ d�D ]R}||krNtdt|ƒdƒD ],}	||	d … }
t|ƒ|	 d }| |
|¡ qj||7 }qNt	|dƒ}||fS )Nó    c                 S   s   t | ƒ | fS r    ©rŽ   ©Úxr#   r#   r$   Ú<lambda>1  r’   z4LigatureMorphAction.compileActions.<locals>.<lambda>©Úkeyr   rG   )
Úsetr+   ÚitemsÚaddr�   ÚsortedÚrangerŽ   Ú
setdefaultr   )r-   r.   Úresultr�   ra   Ú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Úlastr8   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 )NFrG   r§   r¨   r¦   i    i   À)ÚgetSubReaderÚposZ	readULongrd   rˆ   rª   r‰   rŠ   )	r"   rg   ra   r�   r®   rf   r8   r­   Údeltar#   r#   r$   r‘   E  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|
k|	_t|d ƒ|	_| j |	¡ q6d S )Nr   Fc                 S   s   g | ]}t |tƒr|‘qS r#   rq   rt   r#   r#   r$   r4   Z  s     
 z/LigatureMorphAction.fromXML.<locals>.<listcomp>rY   r8   r5   r6   r9   ÚActionÚ c                 S   s   g | ]}|  ¡ ‘qS r#   ©rw   r1   r#   r#   r$   r4   f  s     r‰   rŠ   )rY   r9   rŒ   rI   r�   r   rv   rD   rw   rˆ   rk   r‰   rŠ   rª   )r"   ro   rn   ry   r-   rz   r{   r|   rC   r­   r?   r#   r#   r$   r}   U  s(    
zLigatureMorphAction.fromXMLc                 C   sŠ   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ | jD ]4}d|jfg}|jr^| d¡ | d|¡ | ¡  q>| 	|¡ | ¡  d S )NrY   r7   rŠ   )r5   r‰   r²   )
ri   r=   r;   rY   r@   r�   rŠ   r‰   rª   rm   )r"   r>   r-   rn   ro   r­   Úattribsr#   r#   r$   rp   k  s    




zLigatureMorphAction.toXMLN)r'   r(   r)   r~   r   r:   r%   rb   rh   rE   r/   r�   r‘   r}   rp   r#   r#   r#   r$   r‹   î   s   

r‹   c                   @   s`   e Zd ZdZdZddddddg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 )ÚInsertionMorphActionrP   rG   r�   rI   ÚCurrentIsKashidaLikeÚMarkedIsKashidaLikeÚCurrentInsertBeforeÚMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |dƒ qd| _g g  | _| _d S rX   )rY   r:   Úsetattrr9   ÚCurrentInsertionActionÚMarkedInsertionActionrB   r#   r#   r$   r%   ‡  s
    
zInsertionMorphAction.__init__c                 C   sø   |d k	st ‚| | 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 )
Nr[   r\   r]   é   é   é   rM   r   r„   )rA   r^   rY   r9   r�   rI   r·   r¸   r¹   rº   rŽ   r¼   r½   rs   )r"   r`   r-   ra   r?   ZcurrentIndexZmarkedIndexr#   r#   r$   rb   Ž  s4    

zInsertionMorphAction.compilec                 C   s²   |d k	st ‚| ¡ | _| ¡ }t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _	| j
||| ¡ |d@ d? d	�| _| j
||| ¡ |d
@ d	�| _d S )Nr[   r\   r]   r¾   r¿   rÀ   ià  rM   )ÚindexÚcounté   )rA   rc   rY   rd   r�   rI   r·   r¸   r¹   rº   Ú_decompileInsertionActionr¼   r½   re   r#   r#   r$   rh   ¬  s*    
   
ÿ   ÿzInsertionMorphAction.decompilec                 C   s8   |dks|dkrg S |  |j|d  ¡}| | |¡¡S )Nr„   r   rK   )r¯   r°   ÚgetGlyphNameManyZreadUShortArray)r"   rg   r-   rÁ   rÂ   rf   r#   r#   r$   rÄ   ½  s    z.InsertionMorphAction._decompileInsertionActionc                 C   s’   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ | jD ]}|jd|d� | ¡  q>| jD ]}|jd|d� | ¡  q`| |¡ | ¡  d S )NrY   r7   r¼   ©Úglyphr½   )ri   r=   r;   rY   r@   r¼   r½   rm   )r"   r>   r-   rn   ro   Úgr#   r#   r$   rp   Ã  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t	|ƒ‚qd S )Nc                 S   s   g | ]}t |tƒr|‘qS r#   rq   rt   r#   r#   r$   r4   Ô  s     
 z0InsertionMorphAction.fromXML.<locals>.<listcomp>rY   r8   r5   r6   r¼   rÇ   r½   F)
r%   r   rY   rv   rD   rw   r¼   rª   r½   rA   rx   r#   r#   r$   r}   Ò  s    zInsertionMorphAction.fromXMLc                 C   s  t ƒ i d  }}}|D ]L}|j ¡ D ]<\}}|jd k	rF| t|jƒ¡ |jd k	r$| t|jƒ¡ q$qt|dd„ d�D ]†}||k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   rK   r   z>H)r™   r+   rš   r¼   r›   rs   r½   rœ   r�   rŽ   rž   Ú
getGlyphIDr«   r¬   )r-   r.   r�   ra   rŸ   r    r¡   r¢   r­   ÚstartZ
startIndexÚlimitÚglyphsrÇ   ÚglyphIDr#   r#   r$   r/   â  s&    


z#InsertionMorphAction.compileActionsN)r'   r(   r)   r~   r   r:   r%   rb   rh   rÄ   rp   r}   rE   r/   r#   r#   r#   r$   r¶   {  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,td|d | jjf ƒ‚t | ||¡ d S )NZ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)ÚfeatureParamTypesrk   Ú	__class__rA   r'   r   rb   )r"   r`   r-   r#   r#   r$   rb     s    ÿþþzFeatureParams.compileNc                 C   s   t j| |||| jjd� d S )N)ro   )r   rp   rÐ   r'   r‡   r#   r#   r$   rp     s    zFeatureParams.toXML)NN)r'   r(   r)   rb   rp   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   Ú
GlyphArrayrK   Ú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 k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   éÿÿÿÿrL   rÝ   c                 S   s   | j S r    )ÚStartIDrÜ   r#   r#   r$   r–   _  r’   z#Coverage.preWrite.<locals>.<lambda>r—   rK   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Ì   ÚGlyphr7   )rí   r;   r=   )r"   r>   r-   Ú	glyphNamer#   r#   r$   ÚtoXML2i  s    zCoverage.toXML2c                 C   s0   t | dd ƒ}|d krg }|| _| |d ¡ d S )NrÌ   r8   )rí   rÌ   rª   )r"   ro   rn   ry   r-   rÌ   r#   r#   r$   r}   n  s
    zCoverage.fromXML)N©r'   r(   r)   rØ   rê   rò   rõ   r}   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Ø   |  s    
z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dkst ‚|d | _d S )NÚEntryFormatéÀÿ  r   rù   )rA   rù   )r"   rä   r-   r#   r#   r$   rê   €  s    zDeltaSetIndexMap.postReadc                 C   s¬   d}| D ]}||O }q|d@ }d}|r8|d7 }|dL }q"t |dƒ}|dksNt‚|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   r„   r   é   éÿ   rK   iÿÿÿ rL   rG   )ÚmaxrA   )rù   ZoredÚidxÚinnerZ	innerBitsZ	entrySizer#   r#   r$   ÚgetEntryFormat„  s&    


zDeltaSetIndexMap.getEntryFormatc                 C   s\   t | dd ƒ}|d krg  }| _t|ƒdkr.dnd| _| j ¡ }t|ƒ|d< |  |¡|d< |S )Nrù   r„   r   r   ÚMappingCountrû   )rí   rù   rŽ   rÞ   r0   Ú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  r„   ÚMap)rl   r=   r©   rí   ÚNO_VARIATION_INDEXrã   r;   )r"   r>   r-   r¤   r8   rn   r#   r#   r$   rõ   ¨  s    



þÿzDeltaSetIndexMap.toXML2c           	      C   sn   t | dd ƒ}|d krg  | _}t|d ƒ}t| dd¡ƒ}t| dd¡ƒ}|dksVt‚| ||d> |B ¡ d S )Nrù   rÁ   r  Z0xFFFFr  r„   rý   )rí   rù   r   rk   rA   Úinsert)	r"   ro   rn   ry   r-   rù   rÁ   r  r  r#   r#   r$   r}   ¹  s    
zDeltaSetIndexMap.fromXML)N)
r'   r(   r)   rØ   rê   rE   r  rò   rõ   r}   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t ‚| ¡ }|d }| |d gt|ƒt|ƒ  ¡ tt||ƒƒ| _d S )Nrû   rü   r   rù   rë   )rA   ÚgetGlyphOrderrã   rŽ   ÚdictÚziprù   )r"   rä   r-   Ú
glyphOrderZmapListr#   r#   r$   rê   É  s
     zVarIdxMap.postReadc                    s‚   t | dd ƒ‰ ˆ d k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#   ©r2   rÈ   ©rù   r#   r$   r4   Ö  s     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  r„   r  )rœ   rí   rš   r;   r=   )r"   r>   r-   rÇ   r8   rn   r#   r#   r$   rõ   ß  s    

ýzVarIdxMap.toXML2c           	      C   s€   t | dd ƒ}|d kri }|| _z|d }W n   | ¡ |d  }Y nX t|d ƒ}t|d ƒ}|dkslt‚|d> |B ||< d S )Nrù   rÇ   rÁ   r  r  r„   rý   )rí   rù   r
  r   rA   )	r"   ro   rn   ry   r-   rù   rÇ   r  r  r#   r#   r$   r}   é  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   s0   |  d¡}|rt|jƒ| _| jdt| jdƒi–S )NZfvarÚRegionAxisCount)rk   rŽ   Zaxesr  r0   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ˆtdƒ‚|d	 }
t||
ƒD ]\}}|||< qšnd
sÀtd| j ƒ‚|| _| `d S )NrÕ   r   ÚDeltaGlyphIDc                    s   g | ]}|ˆ  d  ‘qS )é   r#   )r2   rÍ   ©r±   r#   r$   r4     s     z(SingleSubst.postRead.<locals>.<listcomp>rK   Z
GlyphCountz invalid SingleSubstFormat2 tableÚ
Substituter   úunknown format: %s)Ú_getGlyphsFromCoverageTablerÞ   rî   rÅ   r  rŽ   rA   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 kri  }| _t| ¡ ƒ}|j‰ ‡ fdd„|D ƒ}tt||ƒƒ}d}d }|D ]0\}}	|d krx|	| d }|| d |	kr\ q q\|d krœd}nd}i }
|| _tƒ }dd„ |D ƒ}dd„ |D ƒ}||_	||
d	< |dkrø|d k	sît
‚||
d
< n||
d< |
S )Nrù   c                    s    g | ]\}}ˆ |ƒˆ |ƒf‘qS r#   r#   )r2   r£   Úb©rÉ   r#   r$   r4   +  s     z(SingleSubst.preWrite.<locals>.<listcomp>rK   r  r   c                 S   s   g | ]}|d  d ‘qS )r   r   r#   ©r2   Úitemr#   r#   r$   r4   A  s     c                 S   s   g | ]}|d  d  ‘qS ©r   r#   r"  r#   r#   r$   r4   B  s     rÕ   r  r  )rí   rù   Úlistrš   rÉ   rœ   r  rÞ   rÕ   rÌ   rA   )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;   r=   )r"   r>   r-   rš   ÚinGlyphZoutGlyphr#   r#   r$   rõ   L  s    zSingleSubst.toXML2c                 C   s2   t | dd ƒ}|d kri }|| _|d ||d < d S )Nrù   r  r(  )rí   rù   )r"   ro   rn   ry   r-   rù   r#   r#   r$   r}   R  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Ø   [  s    
zMultipleSubst.populateDefaultsc                 C   s\   i }| j dkr<t|d ƒ}dd„ |d D ƒ}tt||ƒƒ}ndsNtd| j  ƒ‚|| _| ` d S )Nr   rÕ   c                 S   s   g | ]
}|j ‘qS r#   )r  )r2   Úsr#   r#   r$   r4   c  s     z*MultipleSubst.postRead.<locals>.<listcomp>ÚSequencer   r  )rÞ   r  r  r  rA   rù   )r"   rä   r-   rù   rÌ   r  r#   r#   r$   rê   _  s    
zMultipleSubst.postReadc                    sb   t ˆdd ƒ‰ ˆ d k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_)r2   rÇ   ©rù   r"   r#   r$   r4   s  s     z*MultipleSubst.preWrite.<locals>.<listcomp>)rÕ   r,  )	rí   rù   rÕ   rœ   r%  ÚkeysrÉ   rÌ   rÞ   )r"   r-   r&  rä   r#   r.  r$   rò   j  s    
þzMultipleSubst.preWritec                 C   sJ   t | j ¡ ƒ}|D ]2\}}d |¡}| dd|fd|fg¡ | ¡  qd S )Nr6   r'  r(  r  )rœ   rù   rš   r<   r;   r=   )r"   r>   r-   rš   r)  Ú	outGlyphsr  r#   r#   r$   rõ   w  s
    
zMultipleSubst.toXML2c                 C   s  t | dd ƒ}|d k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ó   r8   r,  rÁ   r  r  r6   c                 S   s   g | ]}|  ¡ ‘qS r#   r´   r  r#   r#   r$   r4   œ  s     z)MultipleSubst.fromXML.<locals>.<listcomp>r(  )
rí   rù   Zold_coverage_rr   rs   rª   Úintrk   rŽ   rv   )r"   ro   rn   ry   r-   rù   ÚelementZelement_nameZelement_attrsÚ_rÁ   rÇ   Zglyph_mappingr0  r#   r#   r$   r}   ~  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õ   r}   rE   r-  r#   r#   r#   r$   r*  Z  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Ö   r6  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ÚClassValueArrayrK   ÚClassRangeRecordzUnknown ClassDef format: %s)rÞ   rÉ   rŽ   rÅ   r�   r  ÚClassrá   râ   rß   rà   r6  )r"   rä   r-   r6  rÊ   Z	classListrè   ré   Z
glyphNamesrô   ÚclsÚrecordsÚrecrç   r#   r#   r$   rê   ª  s4    



zClassDef.postReadc                 C   sî   t | dd ƒ}|d k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 )Nr6  r   r   rë   )rí   r6  rÉ   rš   rª   rï   rã   )r"   r-   r6  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 )NrK   r9  r   r   rë   rL   )r7  r8  )r>  rŽ   r�   r9  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 )Nr5  rÇ   Úclass)rœ   r6  rš   r;   r=   )r"   r>   r-   rš   rô   r;  r#   r#   r$   rõ     s    zClassDef.toXML2c                 C   s6   t | dd ƒ}|d kri }|| _t|d ƒ||d < d S )Nr6  r@  rÇ   )rí   r6  r1  )r"   ro   rn   ry   r-   r6  r#   r#   r$   r}     s
    zClassDef.fromXML)N)	r'   r(   r)   rØ   rê   r>  rò   rõ   r}   r#   r#   r#   r$   r5  ¥  s   
r5  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Ö   rB  r×   r#   r#   r$   rØ     s    
zAlternateSubst.populateDefaultsc                 C   sv   i }| j dkrVt|d ƒ}|d }t|ƒt|ƒks6t‚t||ƒD ]\}}|j||< q@ndshtd| j  ƒ‚|| _| ` d S )Nr   rÕ   ÚAlternateSetr   r  )rÞ   r  rŽ   rA   r  Ú	AlternaterB  )r"   rä   r-   rB  r  Úaltsr  Úaltr#   r#   r$   rê     s    
zAlternateSubst.postReadc           
      C   sÂ   d| _ t| dd ƒ}|d kr$i  }| _t| ¡ ƒ}tt|ƒƒD ]$}|| \}}| |¡||f||< q<| ¡  t	ƒ }dd„ |D ƒ|_
g }dd„ |D ƒ}|D ]}tƒ }	||	_| |	¡ q–d| _||dœS )Nr   rB  c                 S   s   g | ]}|d  ‘qS r$  r#   r"  r#   r#   r$   r4   ,  s     z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS ©rë   r#   r"  r#   r#   r$   r4   .  s     )rÕ   rC  )rÞ   rí   rB  r%  rš   r�   rŽ   rÉ   rï   rÕ   rÌ   rC  rD  rª   ÚsortCoverageLast)
r"   r-   rB  rš   r¤   rô   r™   r&  ÚsetListrE  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 )NrC  rÆ   rD  )rœ   rB  rš   ri   r=   r;   rm   )r"   r>   r-   rš   rô   rB  rF  r#   r#   r$   rõ   ;  s    

zAlternateSubst.toXML2c           	      C   sd   t | dd ƒ}|d kri }|| _|d }g }|||< |D ](}t|tƒsFq6|\}}}| |d ¡ q6d S )NrB  rÇ   )rí   rB  rr   rs   rª   )	r"   ro   rn   ry   r-   rB  rô   r™   r2  r#   r#   r$   r}   F  s    

zAlternateSubst.fromXML)Nrö   r#   r#   r#   r$   rA    s
   
rA  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Ö   rK  r×   r#   r#   r$   rØ   V  s    
zLigatureSubst.populateDefaultsc                 C   s|   i }| j dkr\t|d ƒ}|d }t|ƒt|ƒks6t‚tt|ƒƒD ]}|| j||| < qBndsntd| j  ƒ‚|| _| ` d S )Nr   rÕ   ÚLigatureSetr   r  )rÞ   r  rŽ   rA   r�   ÚLigaturerK  )r"   rä   r-   rK  r  ÚligSetsr¤   r#   r#   r$   rê   Z  s    
zLigatureSubst.postReadc                 C   sV  d| _ t| dd ƒ}|d k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   rK  c                 S   s   t | d ƒ | d fS ©Nr   r“   ©r#  r#   r#   r$   r–   t  r’   z(LigatureSubst.preWrite.<locals>.<lambda>r—   r   c                 S   s   g | ]}|d  ‘qS r$  r#   r"  r#   r#   r$   r4   ƒ  s     z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS rG  r#   r"  r#   r#   r$   r4   †  s     )rÕ   rL  )rÞ   rí   rK  rr   ÚnextÚiterrs   r  rœ   rš   rM  Ú	ComponentrŽ   Ú	CompCountÚLigGlyphrž   rª   r%  r�   rÉ   rï   rÕ   rÌ   rL  rH  )r"   r-   rK  ZnewLigaturesÚcompsÚligZligaturerš   r¤   rô   r™   r&  rN  rI  ZligSetÚligsr#   r#   r$   rò   g  sB    
 ÿ

zLigatureSubst.preWritec                 C   st   t | j ¡ ƒ}|D ]\\}}|jd|d� | ¡  |D ]&}|jd|jd |j¡d� | ¡  q4| 	d¡ | ¡  qd S )NrL  rÆ   rM  r6   )rÇ   Ú
components)
rœ   rK  rš   ri   r=   r;   rU  r<   rS  rm   )r"   r>   r-   rš   rô   rN  rW  r#   r#   r$   rõ   “  s      
ÿ

zLigatureSubst.toXML2c                 C   s˜   t | dd ƒ}|d kri }|| _|d }g }|||< |D ]\}t|tƒsFq6|\}}}tƒ }	|d |	_|d }
|
rv|
 d¡ng |	_t|	jƒ|	_	| 
|	¡ q6d S )NrK  rÇ   rY  r6   )rí   rK  rr   rs   rM  rU  rv   rS  rŽ   rT  rª   )r"   ro   rn   ry   r-   rK  rô   rX  r2  rW  rY  r#   r#   r$   r}      s"    


zLigatureSubst.fromXML)Nrö   r#   r#   r#   r$   rJ  U  s
   
,rJ  c                   @   s.   e Zd Zdd„ Zdd„ Zddedœ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¯   ÚgetConvertersro   Úadvancer~   ÚreadrA   r   rh   )r"   rf   r-   Z	subReaderÚconvr#   r#   r$   rh   µ  s    
zCOLR.decompilec                 C   s   d | _ | jdt| jdƒi–S )Nr\  )r\  r0   r   ©r"   r-   r#   r#   r$   rò   Æ  s
     
þzCOLR.preWriter   r   )ÚglyphSetÚquantizationc           	      C   sÌ   | j dkrd S i }| jjD ]l}z|j | ||¡}W n@ tk
rr } z"ddlm} |d|j›�ƒ|‚W 5 d }~X Y nX |d k	r|||j< qt	| dƒoš| j
d k	}|s¬|rÈd | _
n|sÀt
ƒ | _
d| j
_|| j
_d S )Nr   )Ú
TTLibErrorz#Failed to compute COLR ClipBox for ÚClipListr   )ÚVersionÚBaseGlyphListÚBaseGlyphPaintRecordÚPaintÚcomputeClipBoxÚ	ExceptionZfontTools.ttLibrd  Ú	BaseGlyphrÖ   re  rÞ   Úclips)	r"   rb  rc  rm  r=  ÚclipBoxÚerd  ZhasClipListr#   r#   r$   ÚcomputeClipBoxesÐ  s.    

ÿþzCOLR.computeClipBoxesN)r   )r'   r(   r)   rh   rò   r1  rp  r#   r#   r#   r$   rZ  ´  s   
rZ  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|kst |d jkr(tƒ  ||¡S |d jt  | j }|  ¡ D �] }|j�rt| |jg ƒ}t	|ƒD ]š\}}t
|ƒ|k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|  r]  Úrepeatrí   ro   r©   Ústrr   ÚlocationÚfeaturerl   r=   ZxmlWriteZauxÚevalÚvars)r"   r>   r-   Z	debugDatar`  r8   ÚlookupIndexr#  ÚinfoÚtagÚscriptÚlanguager„  ©rÐ   r#   r$   rõ   ø  sJ    ÿþý
    ÿ  ÿzLookupList.toXML2)r'   r(   r)   Úpropertyr|  rõ   Ú__classcell__r#   r#   rŒ  r$   rq  í  s   
	rq  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É   rl  ©r=  ©r-   r#   r$   r–     r’   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r—   )rœ   ZBaseGlyphRecordr0   r  ra  r#   r’  r$   rò     s
     
ÿzBaseGlyphRecordArray.preWriteNr  r#   r#   r#   r$   r�    s   r�  c                   @   s   e Zd Zdd„ ZdS )rg  c                    s"   t | j‡ fdd„d�| _| j ¡ S )Nc                    s   ˆ   | j¡S r    r�  r‘  r’  r#   r$   r–   &  r’   z(BaseGlyphList.preWrite.<locals>.<lambda>r—   )rœ   rh  r0   r  ra  r#   r’  r$   rò   $  s
     
ÿzBaseGlyphList.preWriteNr  r#   r#   r#   r$   rg  #  s   rg  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚClipBoxFormatr   rK   c                 C   s
   | | j kS r    ©ÚVariabler!   r#   r#   r$   Úis_variable/  s    zClipBoxFormat.is_variablec                 C   s   | j S r    r”  r!   r#   r#   r$   Úas_variable2  s    zClipBoxFormat.as_variableN)r'   r(   r)   ÚStaticr•  r–  r—  r#   r#   r#   r$   r“  +  s   r“  c                   @   s    e Zd ZeZdd„ Zdd„ ZdS )ÚClipBoxc                    s   t ‡ fdd„ˆ  ¡ D ƒƒS )Nc                 3   s   | ]}t ˆ |jƒV  qd S r    )rí   ro   )r2   r`  r!   r#   r$   Ú	<genexpr>:  s     z#ClipBox.as_tuple.<locals>.<genexpr>)rs   r]  r!   r#   r!   r$   Úas_tuple9  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“  Ú
formatEnumr›  rœ  r#   r#   r#   r$   r™  6  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 )re  Nc                 C   s   t | dƒsi | _d S )Nrm  )rÖ   rm  r×   r#   r#   r$   rØ   A  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 ]X}	z||	 }
W n" tk
rŽ   | |	¡ Y q\Y nX |
|k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  r™  Úminrÿ   rm  )r"   rä   r-   rm  r  r¤   r=  ZredefinedGlyphsZmissingGlyphsrÍ   rÇ   r#   r#   r$   rê   E  sJ    û

úüzClipList.postReadc                    s\   t tƒ}i ‰ | j ¡ D ].\}}| ¡ }||  |¡ |ˆ kr|ˆ |< q‡ fdd„| ¡ D ƒS )Nc                    s   i | ]\}}t |ƒˆ | “qS r#   )Ú	frozenset)r2   r˜   rÌ   ©ZuniqueClipsr#   r$   Ú
<dictcomp>x  s     z#ClipList.groups.<locals>.<dictcomp>)r   r%  rm  rš   r›  rª   )r"   ZglyphsByCliprô   rn  r˜   r#   r¤  r$   Úgroupsp  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|ksÂt‚|||	|
f< qªq(g }t| ¡ ƒD ].\\}	}
}tƒ }|	|_	|
|_
||_| |¡ qât|ƒ|dœ}|S )Nrm  c                 3   s   | ]}|ˆ krˆ | V  qd S r    r#   )r2   rô   ©ZglyphMapr#   r$   rš  ‚  s     z$ClipList.preWrite.<locals>.<genexpr>r   r   rë   )Z	ClipCountrž  )rÖ   rm  ZgetReverseGlyphMapr¦  rš   rœ   rª   rA   rž  rŸ  r   r™  rŽ   )r"   r-   ZclipBoxRangesrÌ   rn  rñ   r®   rå   rÍ   rÊ   rç   ZclipRecordsÚrecordrä   r#   r§  r$   rò   |  s@    
ÿþzClipList.preWritec           	      C   s  |r|n| j j}|d k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 rO  )r¢  rP  r#   r#   r$   r–   ª  r’   z ClipList.toXML.<locals>.<lambda>r—   ÚClipró   r7   r™  )rÐ   r'   rÖ   rª   rÞ   ri   r=   rœ   r¦  rš   r;   rõ   rm   )	r"   r>   r-   rn   ro   Ú	tableNamerÌ   rn  rô   r#   r#   r$   rp      s2    

 ÿ





zClipList.toXMLc           
      C   sÐ   t | dd ƒ}|d kri  | _}|dks*t‚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 )Nrm  r©  ró   r8   r™  rÞ   )
rí   rm  rA   rr   rs   rª   r™  r   rÞ   r}   )
r"   ro   rn   ry   r-   rm  rÌ   rn  Úelemrô   r#   r#   r$   r}   »  s.    




zClipList.fromXML)N)NN)	r'   r(   r)   rØ   rê   r¦  rò   rp   r}   r#   r#   r#   r$   re  @  s   
+$
re  c                   @   s   e Zd ZdZdZdZdS )Ú
ExtendModer   r   rK   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   rK   rL   rG   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   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   rK   )rL   rG   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rý   r¯  r°  r±  r²  r³  r´  rµ  r¶  r·  r¸  r¹  é   é   é   rÃ   é    c                 C   s   | j  d¡S )NÚPaintVar)ro   Ú
startswithr!   r#   r#   r$   r–    s    zPaintFormat.is_variablec                 C   sD   |   ¡ r| S ztjd| jdd … › � W S  tk
r>   Y d S X d S )NrÁ  rM   )r–  r¼  Ú__members__ro   ÚKeyErrorr!   r#   r#   r$   r—  !  s    zPaintFormat.as_variableN)%r'   r(   r)   ÚPaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradientÚ
PaintGlyphÚPaintColrGlyphÚPaintTransformZPaintVarTransformÚPaintTranslateZPaintVarTranslateÚ
PaintScaleZPaintVarScaleÚPaintScaleAroundCenterZPaintVarScaleAroundCenterÚPaintScaleUniformZPaintVarScaleUniformÚPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterÚPaintRotateZPaintVarRotateÚPaintRotateAroundCenterZPaintVarRotateAroundCenterÚ	PaintSkewZPaintVarSkewÚPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer–  r—  r#   r#   r#   r$   r¼  ü  sD   r¼  c                   @   s€   e Zd ZeZdd„ Zddd„Zeee	j
 dœdd„Zed  d	œd
d„Zedœdd„Zed	œdd„Zdedeee dœdd„ZdS )ri  c                 C   s:   z|   | j¡jW S  tk
r4   td| j› �ƒ‚Y nX d S )NzUnknown Paint format: )r�  rÞ   ro   ry  ÚNotImplementedErrorr!   r#   r#   r$   ÚgetFormatName-  s    zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d krg }| d| jf¡ | ||¡ | |  ¡ ¡ | ¡  |  ||¡ | 	|¡ | ¡  d S )NrÞ   )
rÐ   r'   rª   rÞ   ri   rl   rÓ  r=   rõ   rm   )r"   r>   r-   rn   ro   rª  r#   r#   r$   rp   3  s    
zPaint.toXML)ÚcolrÚreturnc                 c   sè   | j tjkrPg }|jd k	r"|jj}dd„ t|| j| j| j … ƒD ƒE d H  d S | j tjkrž|j	j
D ](}|j| jkrdtjd|jd�V   d S qdt| j›d�ƒ‚|  ¡ D ]<}|jd k	r¦t|jt| ƒƒr¦t| |jƒ}tj|j|d�V  q¦d S )Nc                 s   s"   | ]\}}t jd ||d�V  qdS )ZLayers)ro   r8   rÁ   N)r   ÚSubTableEntry)r2   r¤   Úvr#   r#   r$   rš  E  s   ÿz+Paint.iterPaintSubTables.<locals>.<genexpr>rl  )ro   r8   z not in colr.BaseGlyphList)rÞ   r¼  rÅ  Z	LayerListri  r©   ZFirstLayerIndexZ	NumLayersrÇ  rg  rh  rl  ró   r   rÖ  rÄ  r]  Z
tableClassÚ
issubclassrw  rí   ro   )r"   rÔ  Zlayersr¨  r`  r8   r#   r#   r$   ÚiterPaintSubTables?  s(    
ÿþzPaint.iterPaintSubTables)rÕ  c                 C   s   dd„ |   |¡D ƒS )Nc                 S   s   g | ]
}|j ‘qS r#   r7   )r2   Úpr#   r#   r$   r4   \  s     z%Paint.getChildren.<locals>.<listcomp>©rÙ  )r"   rÔ  r#   r#   r$   ÚgetChildrenZ  s    zPaint.getChildren©rÔ  c                    s@   t |ƒstdƒ‚t| ‡ fdd„d�D ]}|d j}||ƒ q$dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                    s
   |   ˆ ¡S r    rÛ  ©ÚpaintrÝ  r#   r$   r–   d  r’   z Paint.traverse.<locals>.<lambda>©Ziter_subtables_fnrë   N)ÚcallableÚ	TypeErrorr   r8   )r"   rÔ  ÚcallbackÚpathrß  r#   rÝ  r$   Útraverse^  s     
ÿ

zPaint.traversec                 C   sÖ  | j tjkr0| j}t|j|j|j|j|j|j	ƒS | j tj
krLt | j| j	¡S | j tjkrht | j| j¡S | j tjkr t | j| j¡ | j| j¡ | j | j ¡S | j tjkr¸t | j¡S | j tjk� rît | j| j¡ | j¡ | j | j ¡S | j tjk�rt t| jƒ¡S | j tjk�rFt | j| j¡ t| jƒ¡ | j | j ¡S | j tjk�rnt t| j ƒt| jƒ¡S | j tjk�r²t | j| j¡ t| j ƒt| jƒ¡ | j | j ¡S t| j ƒ  ¡ �rÒt!d| j › �ƒ‚tS )NzVariable Paints not supported: )"rÞ   r¼  rÈ  r
   ZxxZyxZxyÚyyZdxZdyrÉ  r   Ú	translaterÊ  ÚscaleZscaleXZscaleYrË  ZcenterXZcenterYrÌ  rÍ  rÎ  Úrotater   ZanglerÏ  rÐ  ZskewZ
xSkewAngleZ
ySkewAnglerÑ  r–  rÒ  )r"   ru   r#   r#   r$   ÚgetTransformi  sd     ÿ þÿÿ þÿÿ þÿ
 ÿ þÿzPaint.getTransformr   r   )rÔ  rb  rc  rÕ  c           	         s¦   t |ƒ}t| ‡ fdd„d�D ]H}|d j}|jtjkrttjdd„ |D ƒt	ƒ}||j
  t||ƒ¡ q|jd krtd S tƒ }ttjƒ|_t|j|ƒ\|_|_|_|_|S )Nc                    s
   |   ˆ ¡S r    rÛ  rÞ  rÝ  r#   r$   r–   ™  r’   z&Paint.computeClipBox.<locals>.<lambda>rà  rë   c                 s   s   | ]}|j  ¡ V  qd S r    )r8   rê  )r2   r{  r#   r#   r$   rš  Ÿ  s     z'Paint.computeClipBox.<locals>.<genexpr>)r   r   r8   rÞ   r¼  rÆ  r   r
   Z	transformr   ró   Zdrawr   Zboundsr™  r1  r“  r˜  r   ZxMinZyMinZxMaxZyMax)	r"   rÔ  rb  rc  Úpenrä  rß  ZtransformationÚcbr#   rÝ  r$   rj  ”  s&     
ÿ

ý
zPaint.computeClipBox)NN)r   )r'   r(   r)   r¼  r�  rÓ  rp   rZ  r   r   rÖ  rÙ  r   rÜ  rå  r
   rê  r1  r   r™  rj  r#   r#   r#   r$   ri  *  s   
, ÿ  þri  )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Õ   r5  ZAnchorZDeviceZAxisZMinMaxZ	BaseCoordZJstfLangSysZJstfGSUBModListZJstfGPOSModListZJstfMaxZMathKernZMathGlyphConstructionc                 C   s
  d}|j }|jdk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   rr  rO   rt  rQ   )ÚLookupListIndexÚSubTableIndexÚ	tableTyper|  rq  ru  rv  rÐ   Ú
LookupTyper�   rŽ   ÚlookupTypesrÞ   ÚExtSubTable)ÚttfÚoverflowRecordÚokr‡  ZextTypeÚlookupsÚlookupÚsiZsubTableZextSubTableClassÚextSubTabler#   r#   r$   ÚfixLookupOverFlows  s<    





r   c           
      C   s‚   d}t | j ¡ ƒ}t|ƒ}|jdkr.|d }n|jdkrB|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   ©rÕ   rÚ   rK   r,  r   )rœ   rù   rš   rŽ   ÚitemNameÚ	itemIndexr�   )
ÚoldSubTableÚnewSubTablerú  rû  Z
oldMappingÚoldLenÚnewLenr¤   r#  r˜   r#   r#   r$   ÚsplitMultipleSubstC  s    




r  c           
      C   s”   d}t | dƒr| j|_t| j ¡ ƒ}t|ƒ}|jdkr@|d }n|jdkrT|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qd|S )Nr   rH  r  rK   rC  r   )	rÖ   rH  rœ   rB  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kr.|d }n|jdkrB|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   r  rK   rL  r   )rœ   rK  rš   rŽ   r  r  r�   )
r  r  rú  rû  ZoldLigsr  r  r¤   r#  r˜   r#   r#   r$   ÚsplitLigatureSubstz  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ÚValueFormat2rK   TÚClass2Countr   )r  rð  r  r  c                 3   s   | ]\}}|ˆ kr|V  qd S r    r#   ©r2   Úkr×  ©ÚoldCountr#   r$   rš  Å  s      zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}|ˆ kr|‘qS r#   r#   r  ©Ú	newGlyphsr#   r$   r4   Ç  s      z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}|ˆ k r||“qS r#   r#   r  r  r#   r$   r¥  È  s      z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}|ˆ kr|‘qS r#   r#   r  r  r#   r$   r4   Í  s      c                    s"   i | ]\}}|ˆ kr||ˆ  “qS r#   r#   r  r  r#   r$   r¥  Î  s      )rÞ   rŽ   ZPairSetr»   rí   rÕ   rÐ   rÌ   ZPairSetCountZClass1RecordrÖ   ZClass2Recordr  Ú	DontSharerï  r6  r™   rš   ZClass1Count)	r  r  rú  r{  rû  ro   Úcoverager<  r6  r#   )r  r  r$   ÚsplitPairPos”  sX    
ÿ

ÿ
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 )NrK   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  )rK   rL   rG   )rK   rG   ©rr  rt  c                 C   s6  | |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k
�r   t d|j |¡ Y dS X ||||ƒ}|�r2|j |d |
¡ |S )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    r  Trø  ÚSubTableCountr   z)Don't know how to split %s lookup type %sF)rõ  r|  rq  ru  ró  rô  rv  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$   ÚfixSubTableOverFlows0  sN    



ÿ
ýr  c                  C   s|  dd l } ddlm} |  d¡}tƒ }|D ]d\}}t}| |¡}|r`| d¡}|d d }t|ƒ}||kr(t||fi ƒ}	|dkr„d|	_	|	||< q(|D ]R\}}
| 
d¡r’t|ƒdkr’|dd … |kr’|| }||d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 ]\}}	||	_(�qx�qldt)ia*t+ddƒD ]}t,t*d| < �q t+ddƒD ]}t-t*d| < �q¾ddl.m/} |D ]”\}}| |¡}|�rZ| 0¡ \}}t1|ƒ}|| }	t2|	dƒ�s.i |	_3i |	_4||dd … |ƒ\}}||	j3|< ||	j4|< n|| }	|||ƒ\|	_3|	_4�qâd S )Nr   r   )ÚotDataz([A-Za-z0-9]+)Format(\d+)$r  TZVarrL   )r   rK   rL   rG   rM   rN   rO   rP   )	r   rK   rL   rG   rM   rN   rO   rP   rQ   rG   )r   r   rK   rG   rM   )rr  rt  ZmortZmorxrt  ZJSTFÚsizer³  zss%02déd   zcv%02d)ÚbuildConvertersÚ
converters)5Úrer  rb   Úglobalsr   ÚmatchÚgroupr   rw  r  rÂ  rŽ   Z	NoVarTypeZVarTypeÚ_equivalentsrš   r  r*  rA  rJ  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¦  r1  rÖ   r!  ÚconvertersByName)r"  r  Z	formatPatÚ	namespacero   r|  Z	baseClassÚmZ
formatTyper;  r3  ZvarTypeZ	noVarTypeÚbaserE  rF  Z
lookupEnumÚenumr¤   r   rð   r!  r(  r#   r#   r$   Ú_buildClassesk  s¢    



&ø÷ ÿúç" ÿ

r-  c                 C   s   | d krg S | j S d S r    )rÌ   )r  r#   r#   r$   r  Ý  s    r  )`Ú__doc__r  r,  r   Ú	functoolsr   Úmathr   Ú	itertoolsÚcollectionsr   r   Z!fontTools.ttLib.tables.otTraverser   ZfontTools.misc.arrayToolsr   ZfontTools.misc.roundToolsr	   ZfontTools.misc.transformr
   r   ZfontTools.misc.textToolsr   r   r   ZfontTools.pens.boundsPenr   ZfontTools.pens.transformPenr   ZotBaser   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r   Úloggingr«   Útypingr   r   r   r   r   ZfontTools.ttLib.ttGlyphSetr   Ú	getLoggerr'   rß   Úobjectr   r*   r,   rF   r€   rˆ   r‹   r¶   rÎ   rÑ   rÓ   rÔ   rÕ   r  r÷   r	  r  r  r*  r5  rA  rJ  rZ  rq  r�  rg  r“  r™  re  r¬  r®  r¼  ri  r&  r   r  r	  r
  r  r  r  r  r-  r  r#   r#   r#   r$   Ú<module>   s¸   
UA  \I4PKjF_9.
 . 		´U;G?üüõ;o