B
    Jd                 @   s8  d Z ddlZddlmZ ddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZmZmZmZ dd	lmZmZ ddlZddlZeeZG d
d deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd de%Z&G dd de%Z'G d d! d!e%Z(G d"d# d#eZ)d$Z*G d%d& d&ed'Z+G d(d) d)eZ,G d*d+ d+eZ-G d,d- d-eZ.G d.d/ d/eZ/G d0d1 d1eZ0G d2d3 d3eZ1G d4d5 d5eZ2G d6d7 d7eZ3G d8d9 d9eZ4G d:d; d;eZ5G d<d= d=eZ6G d>d? d?eZ7G d@dA dAed'Z8G dBdC dCed'Z9G dDdE dEeZ:G dFdG dGeZ;G dHdI dIeZ<G dJdK dKed'Z=dLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[Z>d\d] Z?d^d_ Z@d`da ZAdbdc ZBddde ZCdfdg ZDe@eAeBdheCeDdidjZEdkdl ZFdmdn ZGeG  dodp ZHdS )qzfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)defaultdict
namedtuple)otRound)	bytesjoinpadsafeEval   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYc               @   s   e Zd Zdd ZdS )AATStateTablec             C   s   i | _ g | _g | _d S )N)ZGlyphClassesZStatesZPerGlyphLookups)self r   Q/var/www/html/venv/lib/python3.7/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 )N)Transitions)r   r   r   r   r   "   s    zAATState.__init__N)r   r   r   r   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f)r   r   r   
<listcomp>.   s    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 kstd| d| j|< d S )Nzunsupported flag %sT)r'   AssertionErrorr   )r   flagr   r   r   _setFlag8   s    zAATAction._setFlag)r   r   r   r'   staticmethodr   r-   r0   r   r   r   r   r   &   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	         r3               	   
                  c             C   s(   d| _ d| _d| _d| _d| _d| _d S )Nr   F)NewStateVerbr4   r5   r6   r&   )r   r   r   r   r   U   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   rC   i   i @  i    )r.   writeUShortrD   rE   r&   r4   r5   r6   )r   writerr   actionIndexr,   r   r   r   compile]   s       z RearrangementMorphAction.compilec             C   s`   |d kst | | _| }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )NrC   i   i @  i    i  )	r.   
readUShortrD   rE   boolr4   r5   r6   r&   )r   readerr   actionReaderr,   r   r   r   	decompileg   s    

z"RearrangementMorphAction.decompilec             C   s   |j |f| |  |jd| jd |  | | |jd| jd | j| j}|d k	rh|| |  |	| |  d S )NrD   )r%   rE   )
begintagr*   r(   rD   r-   rE   _VERBSgetcommentendtag)r   r+   r   attrsnameZverbCommentr   r   r   toXMLq   s    


zRearrangementMorphAction.toXMLc       	      C   s   d | _  | _| _d | _ | _| _dd |D }x|D ]\}}}|dkrZt|d | _ q8|dkrrt|d | _q8|dkrt|d | _q8|d	kr8x$|d d
D ]}| |	  qW q8W d S )Nr   Fc             S   s   g | ]}t |tr|qS r   )
isinstancetuple)r    tr   r   r   r"      s    z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rD   r%   rE   r&   r#   r$   )
rD   rE   r&   r4   r5   r6   r   splitr0   strip)	r   rU   rT   contentr   eltNameeltAttrs
eltContentr/   r   r   r   fromXML   s    z RearrangementMorphAction.fromXMLN)r   r   r   
staticSizeactionHeaderSizer'   rP   r   rI   rN   rV   r`   r   r   r   r   r2   =   s0   


r2   c               @   sD   e Zd ZdZdZddgZdd Zdd Zd	d
 Zdd Z	dd Z
dS )ContextualMorphActionr<   r   SetMarkr5   c             C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   )FF)i  i  )rD   rd   r5   r&   	MarkIndexCurrentIndex)r   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 )Ni   i @  )r.   rF   rD   r&   rd   r5   re   rf   )r   rG   r   rH   r,   r   r   r   rI      s      
zContextualMorphAction.compilec             C   s\   |d kst | | _| }t|d@ | _t|d@ | _|d@ | _| | _| | _d S )Ni   i @  i?  )	r.   rJ   rD   rK   rd   r5   r&   re   rf   )r   rL   r   rM   r,   r   r   r   rN      s    


zContextualMorphAction.decompilec             C   s~   |j |f| |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )NrD   )r%   re   rf   )rO   r*   r(   rD   r-   re   rf   rS   )r   r+   r   rT   rU   r   r   r   rV      s    


zContextualMorphAction.toXMLc       	      C   s   d | _ | _d | _| _d\| _| _dd |D }x|D ]\}}}|dkrZt|d | _ q8|dkrxl|d d	D ]}| |	  qrW q8|d
krt|d | _q8|dkrt|d | _q8|dkr8t|d | _q8W d S )Nr   F)i  i  c             S   s   g | ]}t |tr|qS r   )rW   rX   )r    rY   r   r   r   r"      s    z1ContextualMorphAction.fromXML.<locals>.<listcomp>rD   r%   r#   r$   r&   re   rf   )
rD   r&   rd   r5   re   rf   r   rZ   r0   r[   )	r   rU   rT   r\   r   r]   r^   r_   r/   r   r   r   r`      s     zContextualMorphAction.fromXMLN)r   r   r   ra   rb   r'   r   rI   rN   rV   r`   r   r   r   r   rc      s   

rc   c               @   s   e Zd Zdd ZdS )	LigActionc             C   s   d| _ d| _d S )NFr   )StoreGlyphIndexDelta)r   r   r   r   r      s    
zLigAction.__init__N)r   r   r   r   r   r   r   r   rg      s   rg   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:   r@   SetComponentr5   c             C   s"   d| _ d\| _| _d| _g | _d S )Nr   )FF)rD   rk   r5   r&   Actions)r   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 )Ni   i @  r   i    )	r.   rF   rD   r&   rk   r5   lenrl   compileLigActions)r   rG   r   rH   r,   actionsr   r   r   rI      s       
zLigatureMorphAction.compilec             C   sv   |d k	st | | _| }t|d@ | _t|d@ | _t|d@ }|d@ | _| }|rl| ||| _ng | _d S )Ni   i @  i    i  )	r.   rJ   rD   rK   rk   r5   r&   _decompileLigActionsrl   )r   rL   r   rM   r,   ZperformActionrH   r   r   r   rN      s    

zLigatureMorphAction.decompilec             C   s   dt  i   }}}x2|D ]*}x$|j D ]\}}||  q(W qW xjt|dd dD ]V}||krXx@tdt|dD ],}	||	d  }
t||	 d }||
| qvW ||7 }qXW t	|d}||fS )N    c             S   s   t |  | fS )N)rm   )xr   r   r   <lambda>  rq   z4LigatureMorphAction.compileActions.<locals>.<lambda>)keyr   r3   )
setr   itemsaddrn   sortedrangerm   
setdefaultr   )r   r   resultro   rH   state_glyphClasstransaisuffixZsuffixIndexr   r   r   r     s    

z"LigatureMorphAction.compileActionsc             C   st   g }xft | jD ]X\}}|t| jd k}|jd@ }||r>dndO }||jrPdndO }|td| qW t|S )Nr	   i?l        r   i   @z>L)		enumeraterl   rm   ri   rh   appendstructpackr   )r   r{   r   actionlastr%   r   r   r   rn   *  s    
z%LigatureMorphAction.compileLigActionsc       	      C   sz   g }d}| |j|d  }xX|st| }t|d@ }t }|| t|d@ |_|d@ }|dkrld| }||_qW |S )NFr3   l        i   @i?i    i   )getSubReaderposZ	readULongrK   rg   r   rh   ri   )	r   rM   rH   ro   r   rL   r%   r   deltar   r   r   rp   4  s    

z(LigatureMorphAction._decompileLigActionsc             C   s   d | _ | _d | _| _d| _g | _dd |D }x|D ]\}}}|dkrZt|d | _ q8|dkrx|d dD ]}| |  qrW q8|d	krt|d | _q8|d
kr8t	 }	|
ddd}
dd |
D }
d|
k|	_t|d |	_| j|	 q8W d S )Nr   Fc             S   s   g | ]}t |tr|qS r   )rW   rX   )r    rY   r   r   r   r"   J  s    z/LigatureMorphAction.fromXML.<locals>.<listcomp>rD   r%   r#   r$   r&   Action c             S   s   g | ]}|  qS r   )r[   )r    r!   r   r   r   r"   V  s    rh   ri   )rD   r&   rk   r5   rl   r   rZ   r0   r[   rg   rQ   rh   ri   r   )r   rU   rT   r\   r   r]   r^   r_   r/   r   r,   r   r   r   r`   E  s*    
zLigatureMorphAction.fromXMLc             C   s   |j |f| |  |jd| jd |  | | x>| jD ]4}d|jfg}|jr`|d |d| |  q@W |	| |  d S )NrD   )r%   ri   )r#   rh   r   )
rO   r*   r(   rD   r-   rl   ri   rh   r   rS   )r   r+   r   rT   rU   r   attribsr   r   r   rV   \  s    


zLigatureMorphAction.toXMLN)r   r   r   ra   rb   r'   r   rI   rN   r1   r   rn   rp   r`   rV   r   r   r   r   rj      s   
rj   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 )InsertionMorphActionr<   r3   rd   r5   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec             C   s:   d| _ x| jD ]}t| |d qW d| _g g  | _| _d S )Nr   F)rD   r'   setattrr&   CurrentInsertionActionMarkedInsertionAction)r   r/   r   r   r   r   s  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 )
Ni   i @  i    i   i   i   r9   r   i  )r.   rF   rD   r&   rd   r5   r   r   r   r   rm   r   r   rX   )r   rG   r   rH   r,   ZcurrentIndexZmarkedIndexr   r   r   rI   z  s8          

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 )Ni   i @  i    i   i   i   i  r9   )indexcount   )r.   rJ   rD   rK   rd   r5   r   r   r   r   _decompileInsertionActionr   r   )r   rL   r   rM   r,   r   r   r   rN     s"    
zInsertionMorphAction.decompilec             C   s8   |dks|dkrg S | |j|d  }|||S )Ni  r   r7   )r   r   getGlyphNameManyZreadUShortArray)r   rM   r   r   r   rL   r   r   r   r     s
    z.InsertionMorphAction._decompileInsertionActionc             C   s   |j |f| |  |jd| jd |  | | x$| jD ]}|jd|d |  q@W x$| jD ]}|jd|d |  qfW || |  d S )NrD   )r%   r   )glyphr   )rO   r*   r(   rD   r-   r   r   rS   )r   r+   r   rT   rU   gr   r   r   rV     s    

zInsertionMorphAction.toXMLc       	      C   s   |    dd |D }x|D ]\}}}|dkr>t|d | _q|dkrnxf|d dD ]}| |  qVW q|dkr| j|d  q|d	kr| j|d  qd
st	|qW d S )Nc             S   s   g | ]}t |tr|qS r   )rW   rX   )r    rY   r   r   r   r"     s    z0InsertionMorphAction.fromXML.<locals>.<listcomp>rD   r%   r#   r$   r   r   r   F)
r   r   rD   rZ   r0   r[   r   r   r   r.   )	r   rU   rT   r\   r   r]   r^   r_   r/   r   r   r   r`     s    zInsertionMorphAction.fromXMLc             C   s  t  i d  }}}xX|D ]P}xJ|j D ]<\}}|jd k	rJ|t|j |jd k	r(|t|j q(W qW xt|dd dD ]}||krq~xZtdt	|D ]H}	t	|d |	 }
x2t|	t	|D ] }||	|d  }|
||
 qW qW x&|D ]}| |}|td|7 }qW q~W ||fS )	Nrq   c             S   s   t |  | fS )N)rm   )rr   r   r   r   rs     rq   z5InsertionMorphAction.compileActions.<locals>.<lambda>)rt   r   r7   r	   z>H)ru   r   rv   r   rw   rX   r   rx   ry   rm   rz   
getGlyphIDr   r   )r   r   ro   rH   r{   r|   r}   r~   r   startZ
startIndexlimitglyphsr   glyphIDr   r   r   r     s&    




z#InsertionMorphAction.compileActionsN)r   r   r   ra   rb   r'   r   rI   rN   r   rV   r`   r1   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,td|d | jjf t| || d S )NZ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)featureParamTypesrQ   	__class__r.   r   r
   rI   )r   rG   r   r   r   r   rI     s    ,zFeatureParams.compileNc             C   s   t j| |||| jjd d S )N)rU   )r
   rV   r   r   )r   r+   r   rT   rU   r   r   r   rV     s    zFeatureParams.toXML)NN)r   r   r   rI   rV   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 )FeatureParamsStylisticSetN)r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )FeatureParamsCharacterVariantsN)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 )CoverageNc             C   s   t | dsg | _d S )Nr   )hasattrr   )r   
propagatorr   r   r   populateDefaults  s    
zCoverage.populateDefaultsc             C   s   | j dkr|d | _n| j dkrg  }| _|d }t|dd d}||krXtd |}~x\|D ]>}|j}|j}||}	||d }
||	t
|	|
 q`W ng | _td	| j  | ` d S )
Nr	   
GlyphArrayr7   RangeRecordc             S   s   | j S )N)StartCoverageIndex)r   r   r   r   rs     rq   z#Coverage.postRead.<locals>.<lambda>)rt   z.GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr   rx   logwarningStartEndr   extendr   ry   )r   rawTabler   r   rangesZsorted_rangesrr   endstartIDendIDr   r   r   postRead	  s&    





zCoverage.postReadc             C   sp  t | dd }|d krg  }| _d}d|i}|rf||}t||k}|d }|gg}x>|dd  D ].}	|	|d kr|d | ||	g |	}qdW |d | |st|d t|k rfd}
xbtt|D ]R}|| \}}t }||_|	||_
|	||_|
|_|||< |
| | d }
qW |rFtd |jdd	 d
 x|D ]
}|`qLW d}d|i}|| _|S )Nr   r	   r   r   r8   z.GSUB/GPOS Coverage is not sorted by glyph ids.c             S   s   | j S )N)StartID)r   r   r   r   rs   D  rq   z#Coverage.preWrite.<locals>.<lambda>)rt   r7   r   )getattrr   getGlyphIDManyrx   r   rm   ry   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   s0   x*t | dg D ]}|jd|d |  qW d S )Nr   Glyph)r%   )r   r(   r*   )r   r+   r   	glyphNamer   r   r   toXML2N  s    zCoverage.toXML2c             C   s0   t | dd }|d krg }|| _||d  d S )Nr   r%   )r   r   r   )r   rU   rT   r\   r   r   r   r   r   r`   S  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   r   b  s    
z!DeltaSetIndexMap.populateDefaultsc             C   s"   |d d@ dkst |d | _d S )NEntryFormati  r   r   )r.   r   )r   r   r   r   r   r   r   f  s    zDeltaSetIndexMap.postReadc             C   s   d}x| D ]}||O }q
W |d@ }d}x|r>|d7 }|dL }q(W t |d}|dksVt|d| ? |d|> d @ B }|dkrd}n |dkrd}n|dkrd}nd	}|d d	> |d B S )
Nr   i  r	         r7   i r8   r3   )maxr.   )r   ZoredidxinnerZ	innerBitsZ	entrySizer   r   r   getEntryFormatj  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   i  r	   r   MappingCountr   )r   r   rm   r   r   copyr   )r   r   r   r   r   r   r   r     s    

zDeltaSetIndexMap.preWritec             C   sx   | d |  x`tt| dg D ]L\}}d|fg}|tkr\|d|d? fd|d@ fg |d| |  q$W d S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr   r   i  Map)rR   r*   r   r   NO_VARIATION_INDEXr   r(   )r   r+   r   r   r%   rT   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   i  r   )r   r   r   rQ   r.   insert)	r   rU   rT   r\   r   r   r   r   r   r   r   r   r`     s    
zDeltaSetIndexMap.fromXML)N)
r   r   r   r   r   r1   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 )Nr   )r   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   i  r   r   r   )r.   getGlyphOrderr   rm   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  x&t dkr^ d  d kr^ d= q:W d i}t |d< t |d< |S )	Nr   c                s   g | ]} | qS r   r   )r    r   )r   r   r   r"     s    z&VarIdxMap.preWrite.<locals>.<listcomp>r	   r   r   r   )r   r   r   rm   r   r   )r   r   r   r   r   )r   r   r     s    

zVarIdxMap.preWritec             C   sX   xRt t| di  D ]:\}}d|fd|d? fd|d@ ff}|d| |  qW d S )Nr   r   r   r   r   i  r   )rx   r   rv   r(   r*   )r   r+   r   r   r%   rT   r   r   r   r     s    
zVarIdxMap.toXML2c       	      C   s   t | dd }|d kri }|| _y|d }W n   | |d  }Y nX t|d }t|d }|dkslt|d> |B ||< d S )Nr   r   r   r   r   i  r   )r   r   r   r   r.   )	r   rU   rT   r\   r   r   r   r   r   r   r   r   r`     s    zVarIdxMap.fromXML)N)r   r   r   r   r   r   r   r`   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)rQ   rm   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 )Nr   )r   r   )r   r   r   r   r   r     s    
zSingleSubst.populateDefaultsc                s   i }t |d }| jdkrj|d  ||} fdd|D }||}x~t||D ]\}}	|	||< qTW n^| jdkrt||d kstd|d	 }
x2t||
D ]\}}|||< qW nd
std| j || _| `d S )Nr   r	   DeltaGlyphIDc                s   g | ]}|  d  qS )i   r   )r    r   )r   r   r   r"     s    z(SingleSubst.postRead.<locals>.<listcomp>r7   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   zunknown format: %s)_getGlyphsFromCoverageTabler   r   r   r   rm   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 kri  }| _t| }|j  fdd|D }tt||}d}d }xH|D ].\}}	|d krz|	| d }|| d |	kr^P q^W |d krd}nd}i }
|| _t }dd |D }dd |D }||_	||
d	< |dkr|d k	st
||
d
< n||
d< |
S )Nr   c                s    g | ]\}} | |fqS r   r   )r    r   b)r   r   r   r"     s    z(SingleSubst.preWrite.<locals>.<listcomp>r7   i   r	   c             S   s   g | ]}|d  d qS )r	   r   r   )r    itemr   r   r   r"   )  s    c             S   s   g | ]}|d  d  qS )r	   r   )r    r   r   r   r   r"   *  s    r   r   r   )r   r   listrv   r   rx   r   r   r   r   r.   )r   r   r   rv   ZgidItemsZsortableItemsr   r   ZinIDZoutIDr   covr   r   r   )r   r   r     s:    

zSingleSubst.preWritec             C   sD   t | j }x0|D ](\}}|dd|fd|fg |  qW d S )NSubstitutioninr   )rx   r   rv   r(   r*   )r   r+   r   rv   inGlyphZoutGlyphr   r   r   r   4  s
    zSingleSubst.toXML2c             C   s2   t | dd }|d kri }|| _|d ||d < d S )Nr   r   r   )r   r   )r   rU   rT   r\   r   r   r   r   r   r`   ;  s
    zSingleSubst.fromXML)N)r   r   r   r   r   r   r   r`   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 )Nr   )r   r   )r   r   r   r   r   r   E  s    
zMultipleSubst.populateDefaultsc             C   s\   i }| j dkr<t|d }dd |d D }tt||}ndsNtd| j  || _| ` d S )Nr	   r   c             S   s   g | ]
}|j qS r   )r   )r    sr   r   r   r"   M  s    z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   zunknown format: %s)r   r   r   r   r.   r   )r   r   r   r   r   r   r   r   r   r   I  s    
zMultipleSubst.postReadc                sb   t dd   d kri   _t }tt  |jd|_d_| fdd|jD d}|S )Nr   )rt   r	   c                s   g | ]}  | qS r   )makeSequence_)r    r   )r   r   r   r   r"   ]  s   z*MultipleSubst.preWrite.<locals>.<listcomp>)r   r   )	r   r   r   rx   r   keysr   r   r   )r   r   r   r   r   )r   r   r   r   T  s    
zMultipleSubst.preWritec             C   sN   t | j }x:|D ]2\}}d|}|dd|fd|fg |  qW d S )Nr$   r   r   r   )rx   r   rv   r)   r(   r*   )r   r+   r   rv   r   	outGlyphsr   r   r   r   r   b  s    
zMultipleSubst.toXML2c             C   s  t | dd }|d kri }|| _|dkrlg | _x:|D ]2}t|tsBq2|\}}}	|dkr2| j|d  q2W d S |dkrt|dt|}
| j|
 }g  }||< x8|D ]0}t|tsq|\}}}	|dkr||d  qW 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"     s    z)MultipleSubst.fromXML.<locals>.<listcomp>r   )
r   r   Zold_coverage_rW   rX   r   intrQ   rm   rZ   )r   rU   rT   r\   r   r   elementZelement_nameZelement_attrs_r   r   Zglyph_mappingr   r   r   r   r`   j  s4    






zMultipleSubst.fromXMLc             C   s   t  }| |_|S )N)r   r   )r   seqr   r   r   r     s    zMultipleSubst.makeSequence_)N)
r   r   r   r   r   r   r   r`   r1   r   r   r   r   r   r   C  s   
 r   c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )ClassDefNc             C   s   t | dsi | _d S )N	classDefs)r   r   )r   r   r   r   r   r     s    
zClassDef.populateDefaultsc             C   s   i }| j dkrj|d }|d }||}|t| }|t||}xt||D ]\}	}
|
rP|
||	< qPW n| j dkr|d }xr|D ]Z}|j}
|
sq|j}|j}||}||d }|t||}x|D ]}	|
||	< qW qW nt	
d| j  || _| ` d S )Nr	   
StartGlyphClassValueArrayr7   ClassRangeRecordzUnknown ClassDef format: %s)r   r   rm   r   ry   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 kri | _d S |j}g }x.| D ]"\}}|s@q2|||||f q2W |r|  |d \}}}	|	||gg}
x\|dd  D ]L\}}}||d ks||	kr|
d ||g |
|||g |}|}|}	qW |
d ||g |
S d S )Nr   r   r	   r   )r   r   r   rv   r   r   r   )r   r   r   r   rv   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 rxFtt|D ]6}|| \}	}
}}}t }||_||_|	|_|||< qbW d}d|i}nd|d d }dg| }x>|D ]6\}	}
}}}x&t|
| || d D ]}|	||< qW qW d}||d}|| _|S )Nr7   r   r   r	   r   r8   )r   r   )r  rm   ry   r   r   r   r   r   )r   r   r   r   r   Z
startGlyphZendGlyphZ
glyphCountr   r   r   Z	startNamer   ZendNamer   ZstartGlyphNameclassesr   r   r   r   r     s4    



zClassDef.preWritec             C   sD   t | j }x0|D ](\}}|dd|fd|fg |  qW d S )Nr   r   class)rx   r   rv   r(   r*   )r   r+   r   rv   r   r   r   r   r   r     s    zClassDef.toXML2c             C   s6   t | dd }|d kri }|| _t|d ||d < d S )Nr   r  r   )r   r   r   )r   rU   rT   r\   r   r   r   r   r   r`     s
    zClassDef.fromXML)N)	r   r   r   r   r   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 )AlternateSubstNc             C   s   t | dsi | _d S )N
alternates)r   r  )r   r   r   r   r   r     s    
zAlternateSubst.populateDefaultsc             C   sz   i }| j dkrZt|d }|d }t|t|ks6tx4t||D ]\}}|j||< qBW ndsltd| j  || _| ` d S )Nr	   r   AlternateSetr   zunknown format: %s)r   r   rm   r.   r   	Alternater  )r   r   r   r  r   altsr   altr   r   r   r     s    
zAlternateSubst.postReadc       
      C   s   d| _ t| dd }|d kr$i  }| _t| }x4tt|D ]$}|| \}}||||f||< q>W |  t	 }dd |D |_
g }dd |D }x"|D ]}t }	||	_||	 qW d| _||dS )Nr	   r  c             S   s   g | ]}|d  qS )r	   r   )r    r   r   r   r   r"     s    z+AlternateSubst.preWrite.<locals>.<listcomp>c             S   s   g | ]}|d  qS )r   r   )r    r   r   r   r   r"     s    )r   r  )r   r   r  r   rv   ry   rm   r   r   r   r   r  r  r   sortCoverageLast)
r   r   r  rv   r   r   ru   r   setListr  r   r   r   r     s&    

zAlternateSubst.preWritec             C   sp   t | j }x\|D ]T\}}|jd|d |  x"|D ]}|jd|d |  q8W |d |  qW d S )Nr  )r   r  )rx   r  rv   rO   r*   r(   rS   )r   r+   r   rv   r   r  r	  r   r   r   r   )  s    

zAlternateSubst.toXML2c       	      C   sh   t | dd }|d kri }|| _|d }g }|||< x0|D ](}t|tsHq8|\}}}||d  q8W d S )Nr  r   )r   r  rW   rX   r   )	r   rU   rT   r\   r   r  r   ru   r   r   r   r   r`   4  s    


zAlternateSubst.fromXML)N)r   r   r   r   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 )LigatureSubstNc             C   s   t | dsi | _d S )N	ligatures)r   r  )r   r   r   r   r   r   E  s    
zLigatureSubst.populateDefaultsc             C   s   i }| j dkr`t|d }|d }t|t|ks6tx:tt|D ]}|| j||| < qDW ndsrtd| j  || _| ` d S )Nr	   r   LigatureSetr   zunknown format: %s)r   r   rm   r.   ry   Ligaturer  )r   r   r   r  r   ligSetsr   r   r   r   r   I  s    
zLigatureSubst.postReadc             C   sf  d| _ t| dd }|d kr$i  }| _|rttt|trt }xZt|	 dd dD ]B\}}t
 }|dd  |_t||_||_||d g | qVW |}t|	 }x4tt|D ]$}|| \}	}
||	|	|
f||< qW |  t }dd |D |_g }d	d |D }xB|D ]:}
t }g  }|_
x|
D ]}|| q2W || qW d| _||d
S )Nr	   r  c             S   s   t | d  | d fS )Nr   )rm   )r   r   r   r   rs   b  rq   z(LigatureSubst.preWrite.<locals>.<lambda>)rt   r   c             S   s   g | ]}|d  qS )r	   r   )r    r   r   r   r   r"   p  s    z*LigatureSubst.preWrite.<locals>.<listcomp>c             S   s   g | ]}|d  qS )r   r   )r    r   r   r   r   r"   s  s    )r   r  )r   r   r  rW   nextiterrX   r   rx   rv   r  	Componentrm   	CompCountLigGlyphrz   r   r   ry   r   r   r   r   r  r
  )r   r   r  ZnewLigaturescompsligZligaturerv   r   r   ru   r   r  r  ZligSetligsr   r   r   r   V  s<    




zLigatureSubst.preWritec             C   s|   t | j }xh|D ]`\}}|jd|d |  x.|D ]&}|jd|jd|jd |  q8W |	d |  qW d S )Nr  )r   r  r$   )r   
components)
rx   r  rv   rO   r*   r(   r  r)   r  rS   )r   r+   r   rv   r   r  r  r   r   r   r     s    


zLigatureSubst.toXML2c             C   s   t | dd }|d kri }|| _|d }g }|||< xd|D ]\}t|tsHq8|\}}}t }	|d |	_|d }
|
rx|
dng |	_t|	j|	_	|
|	 q8W d S )Nr  r   r  r$   )r   r  rW   rX   r  r  rZ   r  rm   r  r   )r   rU   rT   r\   r   r  r   r  r   r  r  r   r   r   r`     s"    



zLigatureSubst.fromXML)N)r   r   r   r   r   r   r   r`   r   r   r   r   r  C  s
   
*r  c               @   s   e Zd Zdd Zdd ZdS )COLRc             C   sd   |j dd}xH|  D ]4}|jdkr2||j q|j||i d||j< P qW tdt| ||S )Nr   )offsetLayerRecordCount)Z	tableDictz$LayerRecordCount converter not found)	r   getConvertersrU   advancera   readr.   r
   rN   )r   rL   r   Z	subReaderconvr   r   r   rN     s    
zCOLR.decompilec             C   s   d | _ | jdt| jdiS )Nr  )r  r   r   )r   r   r   r   r   r     s    zCOLR.preWriteN)r   r   r   rN   r   r   r   r   r   r    s   r  c                   s(   e Zd Zedd Z fddZ  ZS )
LookupListc             C   sP   xF| j D ]<}x6|jD ],}t|jdr,dS t|jdrdS qW qW td S )NZSubstGSUBPosGPOS)LookupSubTabletyper   endswith
ValueError)r   lstr   r   r   table  s    zLookupList.tablec          
      sV  |rd|kst |d jkr(t ||S |d jt  | j }x|  D ]}|jrt| |jg }xt	|D ]\}}t
||krt|t
|  }|j}	|jr|j d|	 }	|jr|j\}
}}|	 d| d|
 d| d}	||	 |  |||||jd|fg qnW qH|jr,t|jd t| s,qHt| |jd }|||||jg  qHW d S )NZDebgz: z in z (/)r   )r   datasuperr   r,  r  repeatr   rU   r   strr   locationfeaturerR   r*   ZxmlWriteZauxevalvars)r   r+   r   Z	debugDatar   r%   lookupIndexr   infotagscriptlanguager4  )r   r   r   r     s.    
zLookupList.toXML2)r   r   r   propertyr,  r   __classcell__r   r   )r   r   r!    s   
r!  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 )N)r   	BaseGlyph)r   )r   r   r   rs     rq   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>)rt   )rx   ZBaseGlyphRecordr   r   )r   r   r   )r   r   r     s    zBaseGlyphRecordArray.preWriteN)r   r   r   r   r   r   r   r   r>    s   r>  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 )N)r   r?  )r   )r   r   r   rs     rq   z(BaseGlyphList.preWrite.<locals>.<lambda>)rt   )rx   BaseGlyphPaintRecordr   r   )r   r   r   )r   r   r     s    zBaseGlyphList.preWriteN)r   r   r   r   r   r   r   r   r@    s   r@  c               @   s$   e Zd ZdZdZdd Zdd ZdS )ClipBoxFormatr	   r7   c             C   s
   | | j kS )N)Variable)r   r   r   r   is_variable  s    zClipBoxFormat.is_variablec             C   s   | j S )N)rC  )r   r   r   r   as_variable  s    zClipBoxFormat.as_variableN)r   r   r   ZStaticrC  rD  rE  r   r   r   r   rB    s   rB  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 )N)r   rU   )r    r   )r   r   r   	<genexpr>  s    z#ClipBox.as_tuple.<locals>.<genexpr>)rX   r  )r   r   )r   r   as_tuple  s    zClipBox.as_tuplec             C   s   | j j |   S )N)r   r   rH  )r   r   r   r   __repr__	  s    zClipBox.__repr__N)r   r   r   rB  
formatEnumrH  rI  r   r   r   r   rF    s   rF  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   rL  )r   r   r   r   r   r     s    
zClipList.populateDefaultsc          
   C   s   i }|  }xt|d D ]\}}|j|jkrDtd||j|j qg }g }xlt|j|jd D ]V}	y||	 }
W n  tk
r   ||	 w`Y nX |
|krt		|j
||
< q`||	 q`W |rtd|t|t| |rtd|t|t| qW || _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   ry   
IndexErrorr   r   rF  minr   rL  )r   r   r   rL  r   r   r   ZredefinedGlyphsZmissingGlyphsr   r   r   r   r   r     sD    

zClipList.postReadc                s`   t t}i  x<| j D ].\}}| }|| | | kr| |< qW  fdd| D S )Nc                s   i | ]\}} | t |qS r   )	frozenset)r    rt   r   )uniqueClipsr   r   
<dictcomp>G  s   z#ClipList.groups.<locals>.<dictcomp>)r   r   rL  rv   rH  r   )r   ZglyphsByClipr   clipBoxrt   r   )rS  r   groups?  s    
zClipList.groupsc                s4  t | dsi | _i }|  x|   D ]\}}t fdd|D }|sNq*|d }|gg}x>|dd  D ].}||d kr|d | ||g |}qlW |d | x,|D ]$\}	}
|	|
f|kst|||	|
f< qW q*W g }x>t| D ].\\}	}
}t }|	|_	|
|_
||_|| qW t||d}|S )NrL  c             3   s   | ]}| kr | V  qd S )Nr   )r    r   )glyphMapr   r   rG  S  s    z$ClipList.preWrite.<locals>.<genexpr>r   r	   r   )Z	ClipCountrM  )r   rL  ZgetReverseGlyphMaprV  rv   rx   r   r.   rM  rN  rO  rF  rm   )r   r   ZclipBoxRangesr   rU  r   r   r   r   r   r   ZclipRecordsrecordr   r   )rW  r   r   L  s<    
zClipList.preWritec       	      C   s  |r|n| j j}|d krg }t| dr6|d| jf ||| |  xt|  	 dd dD ]\}}|d |  x&t|D ]}|j
d|d |  qW |dd|jfg |  ||| |d |  |d |  qdW || |  d S )	Nr   c             S   s   t | d S )Nr   )rQ  )r   r   r   r   rs   {  rq   z ClipList.toXML.<locals>.<lambda>)rt   Clipr   )r%   rF  )r   r   r   r   r   rO   r*   rx   rV  rv   r(   r   rS   )	r   r+   r   rT   rU   	tableNamer   rU  r   r   r   r   rV   q  s.    




zClipList.toXMLc       
      C   s   t | dd }|d kri  | _}|dks*tg }d }x|D ]}t|tsHq8|\}}}|dkrj||d  q8|dkr8t }t|d |_x2|D ]*}t|tsq|\}}}|	|||| qW q8W |rx|D ]}	|||	< qW d S )NrL  rY  r   r%   rF  r   )
r   rL  r.   rW   rX   r   rF  r   r   r`   )
r   rU   rT   r\   r   rL  r   rU  elemr   r   r   r   r`     s.    







zClipList.fromXML)N)NN)	r   r   r   r   r   rV  r   rV   r`   r   r   r   r   rK    s   
,%
rK  c               @   s   e Zd ZdZdZdZdS )
ExtendModer   r	   r7   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	   r7   r8   r3   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   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	   r7   )r8   r3   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri           r       c             C   s   | j dS )NPaintVar)rU   
startswith)r   r   r   r   rD    s    zPaintFormat.is_variablec             C   s@   |   r| S ytjd| jdd    S  tk
r:   d S X d S )Nrq  r9   )rD  rl  __members__rU   KeyError)r   r   r   r   rE    s    zPaintFormat.as_variableN)%r   r   r   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradientZ
PaintGlyphPaintColrGlyphZPaintTransformZPaintVarTransformZPaintTranslateZPaintVarTranslateZ
PaintScaleZPaintVarScaleZPaintScaleAroundCenterZPaintVarScaleAroundCenterZPaintScaleUniformZPaintVarScaleUniformZPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterZPaintRotateZPaintVarRotateZPaintRotateAroundCenterZPaintVarRotateAroundCenterZ	PaintSkewZPaintVarSkewZPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositerD  rE  r   r   r   r   rl    sD   rl  c               @   s8   e Zd ZeZdd ZdddZdd Zedd	d
Z	dS )Paintc             C   s8   y|  | jjS  tk
r2   td| j Y nX d S )NzUnknown Paint format: )rJ  r   rU   r)  NotImplementedError)r   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   rO   rR   ry  r*   r   rS   )r   r+   r   rT   rU   rZ  r   r   r   rV     s    
zPaint.toXMLc             C   s   | j tjkr8g }|jd k	r"|jj}|| j| j| j  S | j tjkrzx4|jj	D ]}|j
| jkrN|jgS qNW t| jdg }x<|  D ]0}|jd k	rt|jt| r|t| |j qW |S )Nz not in colr.BaseGlyphList)r   rl  ru  Z	LayerListrw  ZFirstLayerIndexZ	NumLayersrv  r@  rA  r?  r   rt  r  Z
tableClass
issubclassr'  r   r   rU   )r   colrZlayersrX  childrenr   r   r   r   getChildren  s     
zPaint.getChildren)r{  c             C   sj   t |std| g}t }xH|rd| }t||kr8q|| |t| |t|| qW dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callableN)	callable	TypeErrorru   popidrw   r   reversedr}  )r   r{  callbackstackvisitedcurrentr   r   r   traverse(  s    zPaint.traverse)NN)
r   r   r   rl  rJ  ry  rV   r}  r  r  r   r   r   r   rw    s
   
rw  )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kr|d }|dk r(|S |jdkr8d}n|jdkrFd}| |j jjj}|| }x2|jd jj|kr|d }|dk r|S || }q`W xzt	|t
|D ]h}|| }|j|kr||_xJt	t
|jD ]8}|j| }t|j | }	|	 }
d|
_||
_|
|j|< qW qW 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	   r"  r;   r$  r=   )LookupListIndexSubTableIndex	tableTyper,  r!  r%  r&  r   
LookupTypery   rm   lookupTypesr   ExtSubTable)ttfoverflowRecordokr7  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 |_x8t||D ]*}|| }|d }	|d |j|	< | j|	= qTW |S )Nr	   )r   r   r7   r   r   )rx   r   rv   rm   itemName	itemIndexry   )
oldSubTablenewSubTabler  r  Z
oldMappingoldLennewLenr   r   rt   r   r   r   splitMultipleSubst  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 |_x8t||D ]*}|| }|d }	|d |j|	< | j|	= qfW |S )Nr	   r
  )r   r   r7   r  r   )	r   r
  rx   r  rv   rm   r  r  ry   )
r  r  r  r  ZoldAltsr  r  r   r   rt   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 |_x8t||D ]*}|| }|d }	|d |j|	< | j|	= qTW |S )Nr	   )r   r   r7   r  r   )rx   r  rv   rm   r  r  ry   )
r  r  r  r  ZoldLigsr  r  r   r   rt   r   r   r   splitLigatureSubst  s    



r  c       	         s   | }d}| j |_ | j dkrt| jdkrxdD ]}t||t| | q.W | j |_| jj}| j}t| jd |d  | j_|d  | _|d  |j_|d  |_t| j| _t|j|_d}nP| j dkrt| j	dkrt
| dst| j	d j| _x dD ]}t||t| | qW 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ValueFormat2r7   TClass2Countr   )r  r  r  r  c             3   s   | ]\}}| kr|V  qd S )Nr   )r    kv)oldCountr   r   rG    s    zsplitPairPos.<locals>.<genexpr>c                s   g | ]}| kr|qS r   r   )r    r   )	newGlyphsr   r   r"     s    z splitPairPos.<locals>.<listcomp>c                s   i | ]\}}| k r||qS r   r   )r    r  r  )r  r   r   rT    s    z splitPairPos.<locals>.<dictcomp>c                s   g | ]}| kr|qS r   r   )r    r   )r  r   r   r"     s    c                s"   i | ]\}}| kr|  |qS r   r   )r    r  r  )r  r   r   rT    s    )r   rm   ZPairSetr   r   r   r   r   ZPairSetCountZClass1Recordr   ZClass2Recordr  	DontSharer  r   ru   rv   ZClass1Count)	r  r  r  r+  r  rU   coverager   r   r   )r  r  r   splitPairPos  sP    

r  c             C   s  | j }|dk rdS |d }|| }g g  }}g g  }}	x`t| jj| jjD ]J\}
}|j|k rr||
 || qJ| j|8  _||
 |	| qJW g g  }}xV| jj	D ]J}|
 |
  }}|jd | |_|j|d  |_|| || qW | j|_|| j_| j
 |_||j_| j|_|| _ ||_ || j_| j
 |_|	|j_t|| j_t|	|j_|| j_	| j
 |_||j_	t|| j_t||j_dS )Nr7   FT)Z
ClassCountr   r  r   r  Z
MarkRecordr   r   Z	BaseArrayZ
BaseRecordr   r  r   r  rm   Z	MarkCountZ	BaseCount)r  r  r  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsr   Z
markRecordZoldBaseRecordsZnewBaseRecordsr   ZoldBaseRecordZnewBaseRecordr   r   r   splitMarkBasePos*  sR    






r  )r7   r8   r3   )r7   r3   )r"  r$  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 |_yt|j  | }W n& tk
r
   td|j | dS X ||||}|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,  r!  r%  r  r  r&  r   r  r  r   r  r  r   r  
splitTablert  r   errorr   )r  r  r,  r  ZsubIndexZsubtableZsubTableTyper  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr  Z	splitFuncr  r   r   r   fixSubTableOverFlows  sH    




r  c              C   s  dd l } ddlm} | d}t }xl|D ]d\}}t}||}|rb|d}|d d }t|}||kr*t||fi }	|dkrd|	_	|	||< q*W xZ|D ]R\}}
|
drt|dkr|dd  |kr|| }||dd   }||_||_qW x4t D ](\}}|| }x|D ]}|||< qW qW 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< x0t&' D ]$}x| D ]\}}	||	_(qW q~W dt)ia*x t+ddD ]}t,t*d| < qW x t+ddD ]}t-t*d| < qW ddl.m/} x|D ]\}}||}|r||0 \}}t1|}|| }	t2|	dsPi |	_3i |	_4||dd  |\}}||	j3|< ||	j4|< n|| }	|||\|	_3|	_4qW d S )Nr   r	   )otDataz([A-Za-z0-9]+)Format(\d+)$)r"  r$  TZVarr8   )r	   r7   r8   r3   r9   r:   r;   r<   )	r	   r7   r8   r3   r9   r:   r;   r<   r=   r3   )r   r	   r7   r3   r9   )r"  r$  ZmortZmorxr$  ZJSTFsizerc  zss%02dd   zcv%02d)buildConverters
converters)5rer  rI   globalsr
   matchgroupr   r'  r  rr  rm   Z	NoVarTypeZVarType_equivalentsrv   r   r   r  r  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphr  valuesr  r   r   ry   r   r   ZotConvertersr  rV  r   r   r  convertersByName)r  r  Z	formatPat	namespacerU   r,  Z	baseClassmZ
formatTyper   r   ZvarTypeZ	noVarTypebaser  r	  Z
lookupEnumenumr   r  r   r  r  r   r   r   _buildClasses  s    


&



r  c             C   s   | d krg S | j S d S )N)r   )r  r   r   r   r   (  s    r   )I__doc__r   r  r   	itertoolscollectionsr   r   ZfontTools.misc.roundToolsr   ZfontTools.misc.textToolsr   r   r   ZotBaser
   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r   loggingr   	getLoggerr   r   objectr   r   r   r2   rc   rg   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r>  r@  rB  rF  rK  r\  r^  rl  rw  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   <module>   s   
R@  	\J5QNkG]&


 .C:C?
8n