U
    Q»{jh{ ã                   @   s(  d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z,m-Z.m/Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7ddl8Z8ddl9Z9ddlm:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@ e<�rnddlAmBZB e6 CeD¡ZEG dd„ de:ƒZFedddddgƒZGeGeFjHdddƒeGeFjIdddƒeGeFjJdd dƒeGeFjKd!ddƒeGeFjLd!ddƒeGeFjMdd"dƒeGeFjNdd dƒeGeFjOdddƒeGeFjPdddƒd#œ	ZQd$d%„ d&d%„ d'd%„ d(d%„ d)œZRd*d%„ d+d%„ d,d%„ d-d%„ d)œZSd.d/„ ZTd0d1„ ZUG d2d3„ d3ƒZVG d4d5„ d5ƒZWG d6d7„ d7eXƒZYG d8d9„ d9eXƒZZG d:d;„ d;eXƒZ[G d<d=„ d=e[ƒZ\G d>d?„ d?e[ƒZ]G d@dA„ dAeXƒZ^G dBdC„ dCe[ƒZ_G dDdE„ dEe[ƒZ`G dFdG„ dGe%ƒZaG dHdI„ dIeaƒZbG dJdK„ dKeaƒZcG dLdM„ dMeaƒZdG dNdO„ dOe&ƒZedPZfG dQdR„ dRe)dSƒƒZgG dTdU„ dUe%ƒZhG dVdW„ dWe%ƒZiG dXdY„ dYe&ƒZjG dZd[„ d[e&ƒZkG d\d]„ d]e&ƒZlG d^d_„ d_e&ƒZmG d`da„ dae&ƒZnG dbdc„ dce%ƒZoG ddde„ dee%ƒZpG dfdg„ dge%ƒZqG dhdi„ die%ƒZrG djdk„ dkeƒZsG dldm„ dme)dSƒƒZtG dndo„ doe)dSƒƒZuG dpdq„ dqeƒZvG drds„ dseƒZwG dtdu„ dueƒZxG dvdw„ dwe)dSƒƒZydxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡œZzdˆd‰„ Z{dŠd‹„ Z|dŒd�„ Z}dŽd�„ Z~d�d‘„ Zd’d“„ Z€e|e}e~d”œee€d•œd–œZ�d—d˜„ Z‚d™dš„ Zƒeƒƒ  d›dœ„ Z„dS )�zá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)ÚOPTIMIZE_FONT_SPEED)ÚTupleVariation)Údfs_base_table)ÚquantizeRect)ÚotRound)Ú	TransformÚIdentityÚDecomposedTransform)Ú	bytesjoinÚpadÚsafeEval)ÚVector)ÚControlBoundsPen)ÚTransformPené   )Ú	BaseTableÚFormatSwitchingBaseTableÚValueRecordÚCountReferenceÚ getFormatSwitchingBaseTableClass)ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloat)ÚLookupDebugInfoÚLOOKUP_DEBUG_INFO_KEY)ÚIntFlag)ÚTYPE_CHECKINGÚIteratorÚListÚOptionalÚSet)Ú_TTGlyphSetc                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )ÚVarComponentFlagsr   é   é   é   é   é    é@   é€   é   i   é   é   é   é    é @  l     ÿ N)Ú__name__Ú
__module__Ú__qualname__ÚRESET_UNSPECIFIED_AXESÚ	HAVE_AXESÚAXIS_VALUES_HAVE_VARIATIONÚTRANSFORM_HAS_VARIATIONÚHAVE_TRANSLATE_XÚHAVE_TRANSLATE_YÚHAVE_ROTATIONÚHAVE_CONDITIONÚHAVE_SCALE_XÚHAVE_SCALE_YÚHAVE_TCENTER_XÚHAVE_TCENTER_YÚGID_IS_24BITÚHAVE_SKEW_XÚHAVE_SKEW_YÚRESERVED_MASK© rI   rI   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/ttLib/tables/otTables.pyr(   4   s    r(   ÚVarTransformMappingValuesÚflagÚfractionalBitsÚscaleÚdefaultValueé   é´   é
   iLÿÿÿ)	Z
translateXZ
translateYZrotationÚscaleXÚscaleYZskewXZskewYZtCenterXZtCenterYc                 C   s   t  d| ¡S )Nú>B©ÚstructÚpack©ÚvrI   rI   rJ   Ú<lambda>f   ó    r[   c                 C   s   t  d| ¡S )Nú>HrV   rY   rI   rI   rJ   r[   g   r\   c                 C   s   t  d| ¡dd … S )Nú>Lr   rV   rY   rI   rI   rJ   r[   h   r\   c                 C   s   t  d| ¡S )Nr^   rV   rY   rI   rI   rJ   r[   i   r\   )r   r)   é   r*   c                 C   s   t  d| ¡d S )NrU   r   ©rW   ÚunpackrY   rI   rI   rJ   r[   l   r\   c                 C   s   t  d| ¡d S )Nr]   r   r`   rY   rI   rI   rJ   r[   m   r\   c                 C   s   t  dd|  ¡d S )Nr^   ó    r   r`   rY   rI   rI   rJ   r[   n   r\   c                 C   s   t  d| ¡d S )Nr^   r   r`   rY   rI   rI   rJ   r[   o   r\   c                 C   s  | | }|dk r||d fS |dk rD|d d> | |d  B |d fS |dk r||d d> | |d  d> B | |d  B |d fS |d	k rÄ|d d
> | |d  d> B | |d  d> B | |d  B |d fS |d	 d> | |d  d
> B | |d  d> B | |d  d> B | |d  B |d fS dS )zlRead a variable-length number from data starting at index i.

    Return the number and the next index.
    r/   r   éÀ   r+   r)   éà   r,   r_   éð   é   r*   r-   é   NrI   )ÚdataÚiZb0rI   rI   rJ   Ú_read_uint32vars   s,     0,ÿþ,ÿþ
þþrj   c                 C   s€   | dk rt  d| ¡S | dk r,t  d| dB ¡S | dk rLt  d| dB ¡d	d
… S | dk rdt  d| dB ¡S t  dd¡t  d| ¡ S d
S )z:Write a variable-length number.

    Return the data.
    r/   rU   r5   r]   é €  i    r^   i  À r   Ni   l      @ re   rV   rY   rI   rI   rJ   Ú_write_uint32varŠ   s    rl   c                   @   sV   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚVarComponentc                 C   s   |   ¡  d S ©N)ÚpopulateDefaults©ÚselfrI   rI   rJ   Ú__init__œ   s    zVarComponent.__init__Nc                 C   s6   d| _ d | _d | _d | _d| _t| _t| _tƒ | _	d S )Nr   rI   )
ÚflagsÚ	glyphNameÚconditionIndexÚaxisIndicesIndexÚ
axisValuesÚNO_VARIATION_INDEXÚaxisValuesVarIndexÚtransformVarIndexr   Ú	transform©rq   Z
propagatorrI   rI   rJ   ro   Ÿ   s    zVarComponent.populateDefaultsc                    sä  d‰t ˆ ˆƒ\| _‰| j‰ˆtj@ r(dnd}t| ˆ ˆˆ| … ƒ}ˆ|7 ‰|j| | _ˆtj@ rrt ˆ ˆƒ\| _‰ˆtj	@ rŽt ˆ ˆƒ\| _
‰nd | _
| j
d kr¤d}n|d j| j
 }t|ƒ}ˆtj	@ rît |ˆ ˆ¡\}‰tdd„ |D ƒƒ| _nd| _t| jƒ|k�st‚ˆtj@ �r&t ˆ ˆƒ\| _‰nt| _ˆtj@ �rJt ˆ ˆƒ\| _‰nt| _tƒ | _‡ ‡‡fdd	„}	t ¡ D ] \}
}|	|ƒ}t| j|
|ƒ �qpˆtj@ �sª| jj| j_ˆtj@ }|�rØt ˆ ˆƒ\}‰||d
 M }�q´ˆ ˆd … S )Nr   r_   r)   ZAxisIndicesListc                 s   s   | ]}t |d ƒV  qdS ©é   N)Úfi2fl©Ú.0rZ   rI   rI   rJ   Ú	<genexpr>Ã   s     z)VarComponent.decompile.<locals>.<genexpr>rI   c                    sJ   ˆ| j @ r@tt dˆ ˆˆd … ¡d | jƒ| j }ˆd7 ‰|S | jS d S )Nú>hr)   r   )rL   r   rW   ra   rM   rN   rO   ©ÚvaluesrZ   ©rh   rs   ri   rI   rJ   Úread_transform_componentÓ   s    
 ÿýÿz8VarComponent.decompile.<locals>.read_transform_componentr   ) rj   rs   r(   rE   Ú	_unpackerÚ
glyphOrderrt   r@   ru   r:   rv   ZItemÚlenr   ZdecompileDeltas_Útuplerw   ÚAssertionErrorr;   ry   rx   r<   rz   r   r{   ÚVAR_TRANSFORM_MAPPINGÚitemsÚsetattrrB   rS   rT   rH   )rq   rh   ÚfontÚ
localStateZgidSizeÚglyphIDÚnumAxesZaxisIndicesrw   r‡   Ú	attr_nameÚmapping_valuesÚvalueÚnÚ_rI   r†   rJ   Ú	decompile©   sN    




zVarComponent.decompilec           
         s”  |j t }g }| j‰ | | j¡}|dkrFˆ tjO ‰ | td |ƒ¡ nˆ tj M ‰ | td |ƒ¡ | j	d k	rˆˆ tj
O ‰ | t| j	ƒ¡ t| jƒ}|rÔˆ tjO ‰ | t| jƒ¡ | tjdd„ | jD ƒ| d�¡ nˆ tj M ‰ | jtk�rˆ tjO ‰ | t| jƒ¡ nˆ tj M ‰ | jtk�r<ˆ tjO ‰ | t| jƒ¡ nˆ tj M ‰ ‡ fdd„}t ¡ D ]&\}}t| j|ƒ}	| ||	|ƒ¡ �q\tˆ ƒt|ƒ S )	Néÿÿ  r_   r)   c                 S   s   g | ]}t |d ƒ‘qS ©r~   )Úfl2fir€   rI   rI   rJ   Ú
<listcomp>	  s     z(VarComponent.compile.<locals>.<listcomp>)ZoptimizeSizec                    s,   ˆ |j @ r$t dt| |j |jƒ¡S dS d S )Nrƒ   r\   )rL   rW   rX   rœ   rN   rM   )r–   r…   ©rs   rI   rJ   Úwrite_transform_component  s    
 ÿz7VarComponent.compile.<locals>.write_transform_component)Úcfgr   rs   Ú
getGlyphIDrt   r(   rE   ÚappendÚ_packerru   r@   rl   rŠ   rw   r:   rv   r   ZcompileDeltaValues_ry   rx   r;   rz   r<   r�   rŽ   Úgetattrr{   r   )
rq   r�   ZoptimizeSpeedrh   r’   r“   rŸ   r”   r•   r–   rI   rž   rJ   Úcompileï   sH    





þÿ

zVarComponent.compilec                    s  ˆ   d|¡ ˆ  ¡  d‡ fdd„	}|d| jƒ | jd k	rD|d| jƒ | jd k	rZ|d| jƒ | jd k	sp| jtj@ rž| jtj@ r‚d}nd}|d	d
d„ | jD ƒ|ƒ | j	t
kr´|d| j	ƒ | jt
krÊ|d| jƒ t ¡ D ]4\}}| j|j@ sèqÒt| j|ƒ}||t||jƒƒ qÒˆ  d¡ ˆ  ¡  d S )Nrm   rI   c                    s*   |d k	r&ˆ   | d|ff| ¡ ˆ  ¡  d S )Nr–   )Ú	simpletagÚnewline)Únamer–   Úattrs©ÚwriterrI   rJ   Úwrite-  s    z!VarComponent.toXML.<locals>.writert   ru   rv   ))ÚresetUnspecifiedAxesr   rw   c                 S   s   g | ]}t t|d ƒƒ‘qS r›   )ÚfloatÚfl2strr€   rI   rI   rJ   r�   @  s     z&VarComponent.toXML.<locals>.<listcomp>ry   rz   )rI   )Úbegintagr§   rt   ru   rv   rs   r(   r9   rw   ry   rx   rz   r�   rŽ   rL   r¤   r{   r¯   rM   Úendtag)rq   r«   ÚttFontr©   r¬   r”   ÚmappingrZ   rI   rª   rJ   ÚtoXML)  s6    

ÿ
þ


zVarComponent.toXMLc                 C   s  dd„ |D ƒ}|   ¡  |D ]ú\}}}|r,t‚|d }|dkrD|| _q|dkrXt|ƒ| _q|dkrlt|ƒ| _q|dkr®tdd	„ t|ƒD ƒƒ| _t| d
d¡ƒr¬|  j	t
jO  _	q|dkrÂt|ƒ| _q|dkrÖt|ƒ| _q|tk�rt| j|t|ƒƒ |  j	t| jO  _	qdst|ƒ‚qd S )Nc                 S   s   g | ]}t |tƒr|‘qS rI   ©Ú
isinstancer‹   ©r�   ÚcrI   rI   rJ   r�   S  s     
 z(VarComponent.fromXML.<locals>.<listcomp>r–   rt   ru   rv   rw   c                 s   s   | ]}t |d ƒV  qdS r}   )Ústr2flr€   rI   rI   rJ   r‚   b  s     z'VarComponent.fromXML.<locals>.<genexpr>r­   Ú0ry   rz   F)ro   rŒ   rt   r   ru   rv   r‹   rw   Úgetrs   r(   r9   ry   rz   r�   r�   r{   rL   )rq   r¨   r©   Úcontentr²   rZ   rI   rI   rJ   ÚfromXMLR  s6    
ýzVarComponent.fromXMLc                    s€   d‰‡ ‡‡fdd„}t  ¡ D ]*\}}||ƒ}tˆj|tˆj|ƒ| ƒ qˆjtj@ s`ˆjjˆj_	ˆt
ˆ ƒks|tˆt
ˆ ƒfƒ‚d S )Nr   c                    s6   ˆj | j@ r.tˆ ˆ | jƒ| j }ˆd7 ‰|S dS d S )Nr   r   )rs   rL   r   rM   rN   r„   ©Údeltasri   rq   rI   rJ   Úread_transform_component_deltav  s
    zIVarComponent.applyTransformDeltas.<locals>.read_transform_component_delta)r�   rŽ   r�   r{   r¤   rs   r(   rB   rS   rT   rŠ   rŒ   )rq   r¿   rÀ   r”   r•   r–   rI   r¾   rJ   ÚapplyTransformDeltass  s    	  ÿz!VarComponent.applyTransformDeltasc                 C   s    t | ƒt |ƒkrtS | j|jkS rn   )ÚtypeÚNotImplementedÚ__dict__)rq   ÚotherrI   rI   rJ   Ú__eq__Š  s    zVarComponent.__eq__c                 C   s   |   |¡}|tkr|S | S rn   )rÆ   rÃ   )rq   rÅ   ÚresultrI   rI   rJ   Ú__ne__�  s    
zVarComponent.__ne__)N)r6   r7   r8   rr   ro   r™   r¥   r´   r½   rÁ   rÆ   rÈ   rI   rI   rI   rJ   rm   ›   s   

F:)!rm   c                   @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚVarCompositeGlyphNc                 C   s   |d k	r|ng | _ d S rn   ©Ú
components)rq   rË   rI   rI   rJ   rr   •  s    zVarCompositeGlyph.__init__c                 C   s0   g | _ |r,tƒ }| |||¡}| j  |¡ qd S rn   )rË   rm   r™   r¢   )rq   rh   r�   r‘   Ú	componentrI   rI   rJ   r™   ˜  s
    zVarCompositeGlyph.decompilec                 C   s(   g }| j D ]}| | |¡¡ q
t|ƒS rn   )rË   r¢   r¥   r   )rq   r�   rh   rÌ   rI   rI   rJ   r¥   Ÿ  s    
zVarCompositeGlyph.compilec                 C   sR   |  d|¡ | ¡  t| jƒD ]\}}| ||d|fg¡ q| d¡ | ¡  d S )NrÉ   Úindex)r°   r§   Ú	enumeraterË   r´   r±   )rq   Ú	xmlWriterr�   r©   r¨   ri   rÌ   rI   rI   rJ   r´   ¥  s    
zVarCompositeGlyph.toXMLc                 C   sP   dd„ |D ƒ}|D ]8\}}}|dks(t ‚tƒ }| ||||¡ | j |¡ qd S )Nc                 S   s   g | ]}t |tƒr|‘qS rI   rµ   r·   rI   rI   rJ   r�   ®  s     
 z-VarCompositeGlyph.fromXML.<locals>.<listcomp>rm   )rŒ   rm   r½   rË   r¢   )rq   r¨   r©   r¼   r�   rÌ   rI   rI   rJ   r½   ­  s    zVarCompositeGlyph.fromXML)N)r6   r7   r8   rr   r™   r¥   r´   r½   rI   rI   rI   rJ   rÉ   ”  s
   
rÉ   c                   @   s   e Zd Zdd„ ZdS )ÚAATStateTablec                 C   s   i | _ g | _g | _d S rn   )ZGlyphClassesZStatesZPerGlyphLookupsrp   rI   rI   rJ   rr   ·  s    zAATStateTable.__init__N©r6   r7   r8   rr   rI   rI   rI   rJ   rÐ   ¶  s   rÐ   c                   @   s   e Zd Zdd„ ZdS )ÚAATStatec                 C   s
   i | _ d S rn   )ÚTransitionsrp   rI   rI   rJ   rr   ¾  s    zAATState.__init__NrÑ   rI   rI   rI   rJ   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)NNrI   )r�   ÚstatesrI   rI   rJ   Ú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 rI   )rÄ   ©r�   Úfrp   rI   rJ   r�   Ê  s     
 z.AATAction._writeFlagsToXML.<locals>.<listcomp>ÚFlagsú,©r–   r   ÚReservedFlagsz0x%04X)Ú_FLAGSr¦   Újoinr§   rÜ   )rq   rÏ   rs   rI   rp   rJ   Ú_writeFlagsToXMLÉ  s    
zAATAction._writeFlagsToXMLc                 C   s$   || j kstd| ƒ‚d| j|< d S )Nzunsupported flag %sT)rÝ   rŒ   rÄ   ©rq   rL   rI   rI   rJ   Ú_setFlagÒ  s    zAATAction._setFlag)r6   r7   r8   rÝ   ÚstaticmethodrÖ   rß   rá   rI   rI   rI   rJ   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 )"ÚRearrangementMorphActionr*   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   r)   r_   r*   rg   é   é   r+   é	   rR   é   rP   é   r~   é   c                 C   s(   d| _ d| _d| _d| _d| _d| _d S ©Nr   F)ÚNewStateÚVerbrä   rå   ræ   rÜ   rp   rI   rI   rJ   rr   ï  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   rì   rk   r5   r4   )rŒ   ÚwriteUShortrî   rï   rÜ   rä   rå   ræ   ©rq   r«   r�   ÚactionIndexrs   rI   rI   rJ   r¥   ÷  s    z RearrangementMorphAction.compilec                 C   s`   |d kst ‚| ¡ | _| ¡ }|d@ | _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _|d@ | _d S )Nrì   rk   r5   r4   ið  )	rŒ   Ú
readUShortrî   rï   Úboolrä   rå   ræ   rÜ   ©rq   Úreaderr�   ÚactionReaderrs   rI   rI   rJ   r™     s    

z"RearrangementMorphAction.decompilec                 C   s†   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ |jd| jd� | j | j¡}|d k	rh| |¡ | ¡  | 	|¡ | ¡  d S )Nrî   rÛ   rï   )
r°   r§   r¦   rî   rß   rï   Ú_VERBSr»   Úcommentr±   )rq   rÏ   r�   r©   r¨   ZverbCommentrI   rI   rJ   r´     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 rI   rµ   ©r�   ÚtrI   rI   rJ   r�     s     
 z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rî   r–   rï   rÜ   rÙ   rÚ   )
rî   rï   rÜ   rä   rå   ræ   r   Úsplitrá   Ústrip©	rq   r¨   r©   r¼   r�   ÚeltNameÚeltAttrsÚ
eltContentrL   rI   rI   rJ   r½     s    z RearrangementMorphAction.fromXMLN)r6   r7   r8   Ú
staticSizeÚactionHeaderSizerÝ   rø   rr   r¥   r™   r´   r½   rI   rI   rI   rJ   rã   ×  s2   
ð
rã   c                   @   sD   e Zd ZdZdZddgZdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚContextualMorphActionr+   r   ÚSetMarkrå   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   ©FF©rš   rš   )rî   r  rå   rÜ   Ú	MarkIndexÚCurrentIndexrp   rI   rI   rJ   rr   1  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 )Nrk   r5   )rŒ   rð   rî   rÜ   r  rå   r  r	  rñ   rI   rI   rJ   r¥   7  s    
zContextualMorphAction.compilec                 C   s\   |d kst ‚| ¡ | _| ¡ }t|d@ ƒ| _t|d@ ƒ| _|d@ | _| ¡ | _| ¡ | _d S )Nrk   r5   iÿ?  )	rŒ   ró   rî   rô   r  rå   rÜ   r  r	  rõ   rI   rI   rJ   r™   C  s    


zContextualMorphAction.decompilec                 C   s~   |j |f|Ž | ¡  |jd| jd� | ¡  |  |¡ |jd| jd� | ¡  |jd| jd� | ¡  | |¡ | ¡  d S )Nrî   rÛ   r  r	  )r°   r§   r¦   rî   rß   r  r	  r±   ©rq   rÏ   r�   r©   r¨   rI   rI   rJ   r´   M  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 rI   rµ   rú   rI   rI   rJ   r�   ^  s     
 z1ContextualMorphAction.fromXML.<locals>.<listcomp>rî   r–   rÙ   rÚ   rÜ   r  r	  )
rî   rÜ   r  rå   r  r	  r   rü   rá   rý   rþ   rI   rI   rJ   r½   Z  s     zContextualMorphAction.fromXMLN)r6   r7   r8   r  r  rÝ   rr   r¥   r™   r´   r½   rI   rI   rI   rJ   r  ,  s   
r  c                   @   s   e Zd Zdd„ ZdS )Ú	LigActionc                 C   s   d| _ d| _d S )NFr   )ÚStoreÚGlyphIndexDeltarp   rI   rI   rJ   rr   n  s    
zLigAction.__init__NrÑ   rI   rI   rI   rJ   r  m  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 )ÚLigatureMorphActionrç   rP   ÚSetComponentrå   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r  )rî   r  rå   rÜ   ÚActionsrp   rI   rI   rJ   rr   „  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 )Nrk   r5   r   r4   )	rŒ   rð   rî   rÜ   r  rå   rŠ   r  ÚcompileLigActions)rq   r«   r�   rò   rs   ÚactionsrI   rI   rJ   r¥   Š  s    
zLigatureMorphAction.compilec                 C   sv   |d k	st ‚| ¡ | _| ¡ }t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ}|d@ | _| ¡ }|rl|  ||¡| _ng | _d S )Nrk   r5   r4   iÿ  )	rŒ   ró   rî   rô   r  rå   rÜ   Ú_decompileLigActionsr  )rq   rö   r�   r÷   rs   ZperformActionrò   rI   rI   rJ   r™   ›  s    

zLigatureMorphAction.decompilec                 C   s´   dt ƒ i   }}}|D ]&}|j ¡ D ]\}}| | ¡ ¡ q$qt|dd„ d�D ]R}||krNtdt|ƒdƒD ],}	||	d … }
t|ƒ|	 d }| |
|¡ qj||7 }qNt	|dƒ}||fS )Nr\   c                 S   s   t | ƒ | fS rn   ©rŠ   ©ÚxrI   rI   rJ   r[   ¿  r\   z4LigatureMorphAction.compileActions.<locals>.<lambda>©Úkeyr   r*   )
ÚsetrÓ   rŽ   Úaddr  ÚsortedÚrangerŠ   Ú
setdefaultr   )r�   rÕ   rÇ   r  rò   ÚstateÚ_glyphClassÚtransÚari   ÚsuffixZsuffixIndexrI   rI   rJ   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   é   @r^   )	rÎ   r  rŠ   r  r  r¢   rW   rX   r   )rq   rÇ   ri   ÚactionÚlastr–   rI   rI   rJ   r  É  s    
z%LigatureMorphAction.compileLigActionsc           	      C   sv   g }d}|  |j|d  ¡}|sr| ¡ }t|d@ ƒ}tƒ }| |¡ t|d@ ƒ|_|d@ }|dkrjd| }||_q|S )NFr*   r$  r%  r#  i    i   À)ÚgetSubReaderÚposZ	readULongrô   r  r¢   r  r  )	rq   r÷   rò   r  r'  rö   r–   r&  ÚdeltarI   rI   rJ   r  Ó  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 rI   rµ   rú   rI   rI   rJ   r�   è  s     
 z/LigatureMorphAction.fromXML.<locals>.<listcomp>rî   r–   rÙ   rÚ   rÜ   ÚActionÚ c                 S   s   g | ]}|  ¡ ‘qS rI   ©rý   r×   rI   rI   rJ   r�   ô  s     r  r  )rî   rÜ   r  rå   r  r   rü   rá   rý   r  r»   r  r  r¢   )rq   r¨   r©   r¼   r�   rÿ   r   r  rL   r&  rs   rI   rI   rJ   r½   ã  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 )Nrî   rÛ   r  )rÙ   r  r+  )
r°   r§   r¦   rî   rß   r  r  r  r¢   r±   )rq   rÏ   r�   r©   r¨   r&  ÚattribsrI   rI   rJ   r´   ù  s    




zLigatureMorphAction.toXMLN)r6   r7   r8   r  r  rÝ   rr   r¥   r™   râ   rÖ   r  r  r½   r´   rI   rI   rI   rJ   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 )ÚInsertionMorphActionr+   r*   r  rå   ÚCurrentIsKashidaLikeÚMarkedIsKashidaLikeÚCurrentInsertBeforeÚMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |dƒ qd| _g g  | _| _d S rí   )rî   rÝ   r�   rÜ   ÚCurrentInsertionActionÚMarkedInsertionActionrà   rI   rI   rJ   rr     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 )
Nrk   r5   r4   r3   r2   r1   rg   r   rš   )rŒ   rð   rî   rÜ   r  rå   r0  r1  r2  r3  rŠ   r4  r5  r‹   )rq   r«   r�   rò   rs   ZcurrentIndexZmarkedIndexrI   rI   rJ   r¥     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 )Nrk   r5   r4   r3   r2   r1   ià  rg   )rÍ   Úcounté   )rŒ   ró   rî   rô   r  rå   r0  r1  r2  r3  Ú_decompileInsertionActionr4  r5  rõ   rI   rI   rJ   r™   :  s*    
   
ÿ   ÿzInsertionMorphAction.decompilec                 C   s8   |dks|dkrg S |  |j|d  ¡}| | |¡¡S )Nrš   r   r)   )r(  r)  ÚgetGlyphNameManyZreadUShortArray)rq   r÷   r�   rÍ   r6  rö   rI   rI   rJ   r8  K  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 )Nrî   rÛ   r4  ©Úglyphr5  )r°   r§   r¦   rî   rß   r4  r5  r±   )rq   rÏ   r�   r©   r¨   ÚgrI   rI   rJ   r´   Q  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 rI   rµ   rú   rI   rI   rJ   r�   b  s     
 z0InsertionMorphAction.fromXML.<locals>.<listcomp>rî   r–   rÙ   rÚ   r4  r;  r5  F)
rr   r   rî   rü   rá   rý   r4  r¢   r5  rŒ   rþ   rI   rI   rJ   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 rn   r  r  rI   rI   rJ   r[   |  r\   z5InsertionMorphAction.compileActions.<locals>.<lambda>r  r   r)   r   r]   )r  rÓ   rŽ   r4  r  r‹   r5  r  r  rŠ   r  r¡   rW   rX   )r�   rÕ   r  rò   rÇ   r  r  r   r&  ÚstartZ
startIndexÚlimitÚglyphsr;  r’   rI   rI   rJ   rÖ   p  s&    


z#InsertionMorphAction.compileActionsN)r6   r7   r8   r  r  rÝ   rr   r¥   r™   r8  r´   r½   râ   rÖ   rI   rI   rI   rJ   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)ÚfeatureParamTypesr»   Ú	__class__rŒ   r6   r   r¥   )rq   r«   r�   rI   rI   rJ   r¥   ‘  s    ÿþþzFeatureParams.compileNc                 C   s   t j| |||| jjd� d S )N)r¨   )r   r´   rB  r6   r
  rI   rI   rJ   r´   š  s    zFeatureParams.toXML)NN)r6   r7   r8   r¥   r´   rI   rI   rI   rJ   r@  �  s   	r@  c                   @   s   e Zd ZdS )ÚFeatureParamsSizeN©r6   r7   r8   rI   rI   rI   rJ   rC  ž  s   rC  c                   @   s   e Zd ZdS )ÚFeatureParamsStylisticSetNrD  rI   rI   rI   rJ   rE  ¢  s   rE  c                   @   s   e Zd ZdS )ÚFeatureParamsCharacterVariantsNrD  rI   rI   rI   rJ   rF  ¦  s   rF  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|   rI   rI   rJ   ro   ­  s    
zCoverage.populateDefaultsc                 C   s¼   | j dkr|d | _nž| j dkr g  }| _|d }t|dd„ d�}||krXt d¡ |}~|D ]>}|j}|j}| |¡}	| |¡d }
| | 	t
|	|
ƒ¡¡ q^ng | _t d	| j ¡ | ` d S )
Nr   Ú
GlyphArrayr)   ÚRangeRecordc                 S   s   | j S rn   )ÚStartCoverageIndex©r!  rI   rI   rJ   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¡   Úextendr9  r  )rq   ÚrawTabler�   r?  ÚrangesZsorted_rangesÚrr=  ÚendÚstartIDÚendIDrI   rI   rJ   Ú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   rI  r   éÿÿÿÿr_   rM  c                 S   s   | j S rn   )ÚStartIDrL  rI   rI   rJ   r[   ì  r\   z#Coverage.preWrite.<locals>.<lambda>r  r)   rJ  )r¤   r?  ÚgetGlyphIDManyr  r¢   rŠ   r  rJ  r\  ZgetGlyphNamerQ  rR  rK  rO  rP  ÚsortrN  )rq   r�   r?  ÚformatrT  ÚglyphIDsZbrokenOrderr'  rU  r’   rÍ   ri   r=  rW  rV  rI   rI   rJ   ÚpreWriteÊ  sH    


zCoverage.preWritec                 C   s,   t | dg ƒD ]}|jd|d� | ¡  qd S )Nr?  ÚGlyphrÛ   )r¤   r¦   r§   )rq   rÏ   r�   rt   rI   rI   rJ   ÚtoXML2ö  s    zCoverage.toXML2c                 C   s0   t | dd ƒ}|d krg }|| _| |d ¡ d S )Nr?  r–   )r¤   r?  r¢   )rq   r¨   r©   r¼   r�   r?  rI   rI   rJ   r½   û  s
    zCoverage.fromXML)N©r6   r7   r8   ro   rZ  ra  rc  r½   rI   rI   rI   rJ   rG  ª  s
   
,rG  l   ÿÿ c                   @   sJ   e Zd Zddd„Zdd„ Zedd„ ƒZdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚDeltaSetIndexMapNc                 C   s   t | dƒsg | _d S ©Nr³   ©rH  r³   r|   rI   rI   rJ   ro   	  s    
z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dkst ‚|d | _d S )NÚEntryFormatéÀÿ  r   r³   )rŒ   r³   )rq   rT  r�   rI   rI   rJ   rZ    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   r,   éÿ   r)   iÿÿÿ r_   r*   )ÚmaxrŒ   )r³   ZoredÚidxÚinnerZ	innerBitsZ	entrySizerI   rI   rJ   Ú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   ÚMappingCountrh  )r¤   r³   rŠ   rN  rÄ   Úcopyrn  )rq   r�   r³   rT  rI   rI   rJ   ra  +  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,   rm  rš   ÚMap)rù   r§   rÎ   r¤   rx   rS  r¦   )rq   rÏ   r�   ri   r–   r©   rI   rI   rJ   rc  5  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Í   rq  Z0xFFFFrm  rš   r,   )r¤   r³   r   r»   rŒ   Úinsert)	rq   r¨   r©   r¼   r�   r³   rÍ   rq  rm  rI   rI   rJ   r½   F  s    
zDeltaSetIndexMap.fromXMLc                 C   s   |t | jƒk r| j| S tS rn   )rŠ   r³   rx   )rq   ri   rI   rI   rJ   Ú__getitem__P  s    zDeltaSetIndexMap.__getitem__)N)r6   r7   r8   ro   rZ  râ   rn  ra  rc  r½   rt  rI   rI   rI   rJ   re    s   



re  Zuint8c                   @   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 )Ú	VarIdxMapNc                 C   s   t | dƒsi | _d S rf  rg  r|   rI   rI   rJ   ro   U  s    
zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dkst ‚| ¡ }|d }| |d gt|ƒt|ƒ  ¡ tt||ƒƒ| _d S )Nrh  ri  r   r³   r[  )rŒ   ÚgetGlyphOrderrS  rŠ   ÚdictÚzipr³   )rq   rT  r�   r‰   ZmapListrI   rI   rJ   rZ  Y  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 rI   rI   ©r�   r<  ©r³   rI   rJ   r�   f  s     z&VarIdxMap.preWrite.<locals>.<listcomp>r   éþÿÿÿr[  ro  rh  )r¤   r³   rv  rŠ   re  rn  )rq   r�   r‰   rT  rI   rz  rJ   ra  `  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;  rq  r,   rm  rš   rr  )r  r¤   rŽ   r¦   r§   )rq   rÏ   r�   r;  r–   r©   rI   rI   rJ   rc  o  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Í   rq  rm  rš   r,   )r¤   r³   rv  r   rŒ   )	rq   r¨   r©   r¼   r�   r³   r;  rq  rm  rI   rI   rJ   r½   y  s    zVarIdxMap.fromXMLc                 C   s   | j  |t¡S rn   )r³   r»   rx   )rq   rt   rI   rI   rJ   rt  ‡  s    zVarIdxMap.__getitem__)N)	r6   r7   r8   ro   rZ  ra  rc  r½   rt  rI   rI   rI   rJ   ru  T  s   

ru  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)r»   rŠ   Zaxesr}  rÄ   r   )rq   r�   Z	fvarTablerI   rI   rJ   ra  Œ  s    
 
þzVarRegionList.preWriteN©r6   r7   r8   ra  rI   rI   rI   rJ   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 rf  rg  r|   rI   rI   rJ   ro   ž  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 )NrG  r   ÚDeltaGlyphIDc                    s   g | ]}|ˆ  d  ‘qS )é   rI   )r�   r’   ©r*  rI   rJ   r�   ¨  s     z(SingleSubst.postRead.<locals>.<listcomp>r)   Z
GlyphCountz invalid SingleSubstFormat2 tableÚ
Substituter   úunknown format: %s)Ú_getGlyphsFromCoverageTablerN  r]  r9  rx  rŠ   rŒ   r³   )rq   rT  r�   r³   ÚinputZ	inputGIDSZoutGIDSZoutNamesÚinpÚoutÚsubstÚsubrI   r‚  rJ   rZ  ¢  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 rI   rI   )r�   r!  Úb©r¡   rI   rJ   r�   ¾  s     z(SingleSubst.preWrite.<locals>.<listcomp>r)   r�  r   c                 S   s   g | ]}|d  d ‘qS )r   r   rI   ©r�   ÚitemrI   rI   rJ   r�   Ô  s     c                 S   s   g | ]}|d  d  ‘qS ©r   rI   r�  rI   rI   rJ   r�   Õ  s     rG  r€  rƒ  )r¤   r³   ÚlistrŽ   r¡   r  rx  rN  rG  r?  rŒ   )rq   r�   r³   rŽ   ZgidItemsZsortableItemsr_  r*  ZinIDZoutIDrT  Úcovr†  r‰  rI   rŒ  rJ   ra  ¸  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§   )rq   rÏ   r�   rŽ   ÚinGlyphZoutGlyphrI   rI   rJ   rc  ß  s    zSingleSubst.toXML2c                 C   s2   t | dd ƒ}|d kri }|| _|d ||d < d S )Nr³   rˆ  r“  )r¤   r³   )rq   r¨   r©   r¼   r�   r³   rI   rI   rJ   r½   å  s
    zSingleSubst.fromXML)Nrd  rI   rI   rI   rJ   r  �  s
   
'r  c                   @   sB   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zedd„ ƒZ	dS )ÚMultipleSubstNc                 C   s   t | dƒsi | _d S rf  rg  r|   rI   rI   rJ   ro   î  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   rG  c                 S   s   g | ]
}|j ‘qS rI   )rƒ  )r�   ÚsrI   rI   rJ   r�   ö  s     z*MultipleSubst.postRead.<locals>.<listcomp>ÚSequencer   r„  )rN  r…  rw  rx  rŒ   r³   )rq   rT  r�   r³   r?  r‰  rI   rI   rJ   rZ  ò  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 rI   )ÚmakeSequence_)r�   r;  ©r³   rq   rI   rJ   r�     s     z*MultipleSubst.preWrite.<locals>.<listcomp>)rG  r—  )	r¤   r³   rG  r  r�  Úkeysr¡   r?  rN  )rq   r�   r‘  rT  rI   r™  rJ   ra  ý  s    
þzMultipleSubst.preWritec                 C   sJ   t | j ¡ ƒ}|D ]2\}}d |¡}| dd|fd|fg¡ | ¡  qd S )NrÚ   r’  r“  rˆ  )r  r³   rŽ   rÞ   r¦   r§   )rq   rÏ   r�   rŽ   r”  Ú	outGlyphsrˆ  rI   rI   rJ   rc  
  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³   rG  rb  r–   r—  rÍ   rƒ  rˆ  rÚ   c                 S   s   g | ]}|  ¡ ‘qS rI   r-  ry  rI   rI   rJ   r�   /  s     z)MultipleSubst.fromXML.<locals>.<listcomp>r“  )
r¤   r³   Zold_coverage_r¶   r‹   r¢   Úintr»   rŠ   rü   )rq   r¨   r©   r¼   r�   r³   ÚelementZelement_nameZelement_attrsr˜   rÍ   r;  Zglyph_mappingr›  rI   rI   rJ   r½     s4    




zMultipleSubst.fromXMLc                 C   s   t ƒ }| |_|S rn   )r—  rƒ  )r<  ÚseqrI   rI   rJ   r˜  1  s    zMultipleSubst.makeSequence_)N)
r6   r7   r8   ro   rZ  ra  rc  r½   râ   r˜  rI   rI   rI   rJ   r•  í  s   
 r•  c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚClassDefNc                 C   s   t | dƒsi | _d S )NÚ	classDefs)rH  r   r|   rI   rI   rJ   ro   9  s    
zClassDef.populateDefaultsc                 C   sò   i }| j dkrf|d }|d }| |¡}|t|ƒ }| t||ƒ¡}t||ƒD ]\}	}
|
rN|
||	< qNn~| j dkrÖ|d }|D ]V}|j}
|
sŒq||j}|j}| |¡}| |¡d }| t||ƒ¡}|D ]}	|
||	< qÄq|nt	 
d| j ¡ || _| ` d S )Nr   Ú
StartGlyphÚClassValueArrayr)   ÚClassRangeRecordzUnknown ClassDef format: %s)rN  r¡   rŠ   r9  r  rx  ÚClassrQ  rR  rO  rP  r   )rq   rT  r�   r   r=  Z	classListrX  rY  Z
glyphNamesrt   ÚclsÚrecordsÚrecrW  rI   rI   rJ   rZ  =  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 )Nr   r   r   r[  )r¤   r   r¡   rŽ   r¢   r^  rS  )rq   r�   r   r¡   rŽ   rt   r¥  r'  ZlastNameZlastClsrU  r’   rI   rI   rJ   Ú_getClassRanges\  s.    zClassDef._getClassRangesc                 C   s  d}dg i}|   |¡}|�r|d d }|d d }|| d }t|ƒd |d k r¦tt|ƒƒD ]6}|| \}	}
}}}tƒ }||_||_|	|_|||< q`d}d|i}n\|d d }dg| }|D ]2\}	}
}}}t|
| || d ƒD ]}|	||< qäqÀd}||dœ}|| _|S )Nr)   r£  r   r   r[  r_   )r¡  r¢  )r¨  rŠ   r  r£  rQ  rR  r¤  rN  )rq   r�   r_  rT  rU  Z
startGlyphZendGlyphZ
glyphCountri   r¥  r=  Z	startNamerW  ZendNamer§  ZstartGlyphNameÚclassesr<  rI   rI   rJ   ra  u  s4    




zClassDef.preWritec                 C   s@   t | j ¡ ƒ}|D ](\}}| dd|fd|fg¡ | ¡  qd S )NrŸ  r;  Úclass)r  r   rŽ   r¦   r§   )rq   rÏ   r�   rŽ   rt   r¥  rI   rI   rJ   rc  ”  s    zClassDef.toXML2c                 C   s6   t | dd ƒ}|d kri }|| _t|d ƒ||d < d S )Nr   rª  r;  )r¤   r   rœ  )rq   r¨   r©   r¼   r�   r   rI   rI   rJ   r½   š  s
    zClassDef.fromXML)N)	r6   r7   r8   ro   rZ  r¨  ra  rc  r½   rI   rI   rI   rJ   rŸ  8  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)rH  r¬  r|   rI   rI   rJ   ro   £  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   rG  ÚAlternateSetr   r„  )rN  r…  rŠ   rŒ   rx  Ú	Alternater¬  )rq   rT  r�   r¬  r†  Úaltsr‡  ÚaltrI   rI   rJ   rZ  §  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   r¬  c                 S   s   g | ]}|d  ‘qS r�  rI   r�  rI   rI   rJ   r�   ¿  s     z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS ©r[  rI   r�  rI   rI   rJ   r�   Á  s     )rG  r­  )rN  r¤   r¬  r�  rŽ   r  rŠ   r¡   r^  rG  r?  r­  r®  r¢   ÚsortCoverageLast)
rq   r�   r¬  rŽ   ri   rt   r  r‘  ÚsetListr¯  rI   rI   rJ   ra  ´  s&    
zAlternateSubst.preWritec                 C   sh   t | j ¡ ƒ}|D ]P\}}|jd|d� | ¡  |D ]}|jd|d� | ¡  q4| d¡ | ¡  qd S )Nr­  r:  r®  )r  r¬  rŽ   r°   r§   r¦   r±   )rq   rÏ   r�   rŽ   rt   r¬  r°  rI   rI   rJ   rc  Î  s    

zAlternateSubst.toXML2c           	      C   sd   t | dd ƒ}|d kri }|| _|d }g }|||< |D ](}t|tƒsFq6|\}}}| |d ¡ q6d S )Nr¬  r;  )r¤   r¬  r¶   r‹   r¢   )	rq   r¨   r©   r¼   r�   r¬  rt   r  r�  rI   rI   rJ   r½   Ù  s    

zAlternateSubst.fromXML)Nrd  rI   rI   rI   rJ   r«  ¢  s
   
r«  c                   @   sB   e Zd Zddd„Zdd„ Zedd„ ƒZdd	„ Zd
d„ Zdd„ Z	dS )ÚLigatureSubstNc                 C   s   t | dƒsi | _d S )NÚ	ligatures)rH  rµ  r|   rI   rI   rJ   ro   é  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   rG  ÚLigatureSetr   r„  )rN  r…  rŠ   rŒ   r  ÚLigaturerµ  )rq   rT  r�   rµ  r†  ÚligSetsri   rI   rI   rJ   rZ  í  s    
zLigatureSubst.postReadc                 C   s
   t | ƒ S rn   r  rÊ   rI   rI   rJ   Ú_getLigatureSortKeyú  s    z!LigatureSubst._getLigatureSortKeyc                 C   sT  d| _ t| dd ƒ}|d kr$i  }| _|ršttt|ƒƒtƒrštƒ }t| 	¡ | j
d�D ]B}tƒ }|dd … |_t|ƒ|_|| |_| |d g ¡ |¡ qR|}t| ¡ ƒ}tt|ƒƒD ]$}|| \}}	| |¡||	f||< q²| ¡  tƒ }
dd„ |D ƒ|
_g }dd„ |D ƒ}|D ]6}	tƒ }g  }|_|	D ]}| |¡ �q$| |¡ �qd| _|
|dœS )	Nr   rµ  r  r   c                 S   s   g | ]}|d  ‘qS r�  rI   r�  rI   rI   rJ   r�   1  s     z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS r±  rI   r�  rI   rI   rJ   r�   4  s     )rG  r¶  )rN  r¤   rµ  r¶   ÚnextÚiterr‹   rw  r  rš  r¹  r·  Ú	ComponentrŠ   Ú	CompCountÚLigGlyphr  r¢   r�  rŽ   r  r¡   r^  rG  r?  r¶  r²  )rq   r�   rµ  ZnewLigaturesÚcompsZligaturerŽ   ri   rt   r  r‘  r¸  r³  ZligSetÚligsÚligrI   rI   rJ   ra    s<    



zLigatureSubst.preWritec                 C   st   t | j ¡ ƒ}|D ]\\}}|jd|d� | ¡  |D ]&}|jd|jd |j¡d� | ¡  q4| 	d¡ | ¡  qd S )Nr¶  r:  r·  rÚ   )r;  rË   )
r  rµ  rŽ   r°   r§   r¦   r¾  rÞ   r¼  r±   )rq   rÏ   r�   rŽ   rt   r¸  rÁ  rI   rI   rJ   rc  A  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 )Nrµ  r;  rË   rÚ   )r¤   rµ  r¶   r‹   r·  r¾  rü   r¼  rŠ   r½  r¢   )rq   r¨   r©   r¼   r�   rµ  rt   rÀ  r�  rÁ  rË   rI   rI   rJ   r½   N  s"    


zLigatureSubst.fromXML)N)
r6   r7   r8   ro   rZ  râ   r¹  ra  rc  r½   rI   rI   rI   rJ   r´  è  s   

*r´  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(  ÚgetConvertersr¨   Úadvancer  ÚreadrŒ   r   r™   )rq   rö   r�   Z	subReaderÚconvrI   rI   rJ   r™   c  s    
zCOLR.decompilec                 C   s   d | _ | jdt| jdƒi–S )NrÄ  )rÄ  rÄ   r   ©rq   r�   rI   rI   rJ   ra  t  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Ú	ExceptionÚfontTools.ttLibrÌ  Ú	BaseGlyphrH  rÍ  rN  Úclips)	rq   rÊ  rË  rÖ  r§  ÚclipBoxÚerÌ  ZhasClipListrI   rI   rJ   ÚcomputeClipBoxes~  s.    

ÿþzCOLR.computeClipBoxesN)r   )r6   r7   r8   r™   ra  rœ  rÙ  rI   rI   rI   rJ   rÂ  b  s   
rÂ  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ÚSubTablerÂ   r6   ÚendswithÚ
ValueError)rq   ÚlÚstrI   rI   rJ   Ú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    rh   Úsuperrc  rä  rÅ  Úrepeatr¤   r¨   rÎ   Ústrr   ÚlocationÚfeaturerù   r§   ZxmlWriteZauxÚevalÚvars)rq   rÏ   r�   Z	debugDatarÈ  r–   ÚlookupIndexrŽ  ÚinfoÚtagÚscriptÚlanguagerë  ©rB  rI   rJ   rc  ¦  sJ    ÿþý
    ÿ  ÿzLookupList.toXML2)r6   r7   r8   Úpropertyrä  rc  Ú__classcell__rI   rI   ró  rJ   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 rn   ©r¡   rÕ  ©r§  ©r�   rI   rJ   r[   Ì  r\   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r  )r  ZBaseGlyphRecordrÄ   rp  rÉ  rI   rù  rJ   ra  Ê  s
     
ÿzBaseGlyphRecordArray.preWriteNr~  rI   rI   rI   rJ   rö  É  s   rö  c                   @   s   e Zd Zdd„ ZdS )rÏ  c                    s"   t | j‡ fdd„d�| _| j ¡ S )Nc                    s   ˆ   | j¡S rn   r÷  rø  rù  rI   rJ   r[   Ô  r\   z(BaseGlyphList.preWrite.<locals>.<lambda>r  )r  rÐ  rÄ   rp  rÉ  rI   rù  rJ   ra  Ò  s
     
ÿzBaseGlyphList.preWriteNr~  rI   rI   rI   rJ   rÏ  Ñ  s   rÏ  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚClipBoxFormatr   r)   c                 C   s
   | | j kS rn   ©ÚVariablerp   rI   rI   rJ   Úis_variableÝ  s    zClipBoxFormat.is_variablec                 C   s   | j S rn   rû  rp   rI   rI   rJ   Úas_variableà  s    zClipBoxFormat.as_variableN)r6   r7   r8   ÚStaticrü  rý  rþ  rI   rI   rI   rJ   rú  Ù  s   rú  c                   @   s    e Zd ZeZdd„ Zdd„ ZdS )ÚClipBoxc                    s   t ‡ fdd„ˆ  ¡ D ƒƒS )Nc                 3   s   | ]}t ˆ |jƒV  qd S rn   )r¤   r¨   )r�   rÈ  rp   rI   rJ   r‚   è  s     z#ClipBox.as_tuple.<locals>.<genexpr>)r‹   rÅ  rp   rI   rp   rJ   Úas_tupleç  s    zClipBox.as_tuplec                 C   s   | j j› |  ¡ › �S rn   )rB  r6   r  rp   rI   rI   rJ   Ú__repr__ê  s    zClipBox.__repr__N)r6   r7   r8   rú  Ú
formatEnumr  r  rI   rI   rI   rJ   r   ä  s   r   c                   @   s@   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zdd
d„Zdd„ ZdS )rÍ  Nc                 C   s   t | dƒsi | _d S )NrÖ  )rH  rÖ  r|   rI   rI   rJ   ro   ï  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])rv  rÎ   ÚStartGlyphIDÚ
EndGlyphIDrO  rP  r  Ú
IndexErrorr¢   rp  r   Úminrk  rÖ  )rq   rT  r�   rÖ  r‰   ri   r§  ZredefinedGlyphsZmissingGlyphsr’   r;  rI   rI   rJ   rZ  ó  sJ    û

úüzClipList.postReadc                    s\   t tƒ}i ‰ | j ¡ D ].\}}| ¡ }||  |¡ |ˆ kr|ˆ |< q‡ fdd„| ¡ D ƒS )Nc                    s   i | ]\}}t |ƒˆ | “qS rI   )Ú	frozenset)r�   r  r?  ©ZuniqueClipsrI   rJ   Ú
<dictcomp>&  s     z#ClipList.groups.<locals>.<dictcomp>)r   r�  rÖ  rŽ   r  r¢   )rq   ZglyphsByCliprt   r×  r  rI   r
  rJ   Úgroups  s    

ÿzClipList.groupsc                    s$  t | dƒsi | _i }| ¡ ‰ |  ¡  ¡ D ]¨\}}t‡ fdd„|D ƒƒ}|sLq(|d }|gg}|dd … D ].}||d kr’|d  |¡ | |g¡ |}qh|d  |¡ |D ]$\}	}
|	|
f|ksÂt‚|||	|
f< qªq(g }t| ¡ ƒD ].\\}	}
}tƒ }|	|_	|
|_
||_| |¡ qât|ƒ|dœ}|S )NrÖ  c                 3   s   | ]}|ˆ krˆ | V  qd S rn   rI   )r�   rt   ©ZglyphMaprI   rJ   r‚   0  s     z$ClipList.preWrite.<locals>.<genexpr>r   r   r[  )Z	ClipCountr  )rH  rÖ  ZgetReverseGlyphMapr  rŽ   r  r¢   rŒ   r  r  r  r   rŠ   )rq   r�   ZclipBoxRangesr?  r×  r`  r'  rU  r’   r=  rW  ZclipRecordsÚrecordrT  rI   r  rJ   ra  *  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 )	NrN  c                 S   s   t | d ƒS )Nr   )r  )rŽ  rI   rI   rJ   r[   X  r\   z ClipList.toXML.<locals>.<lambda>r  ÚCliprb  rÛ   r   )rB  r6   rH  r¢   rN  r°   r§   r  r  rŽ   r¦   rc  r±   )	rq   rÏ   r�   r©   r¨   Ú	tableNamer?  r×  rt   rI   rI   rJ   r´   N  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 )NrÖ  r  rb  r–   r   rN  )
r¤   rÖ  rŒ   r¶   r‹   r¢   r   r   rN  r½   )
rq   r¨   r©   r¼   r�   rÖ  r?  r×  Úelemrt   rI   rI   rJ   r½   i  s.    




zClipList.fromXML)N)NN)	r6   r7   r8   ro   rZ  r  ra  r´   r½   rI   rI   rI   rJ   rÍ  î  s   
+$
rÍ  c                   @   s   e Zd ZdZdZdZdS )Ú
ExtendModer   r   r)   N)r6   r7   r8   ZPADÚREPEATZREFLECTrI   rI   rI   rJ   r  ƒ  s   r  c                   @   s|   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )ÚCompositeModer   r   r)   r_   r*   rg   rç   rè   r+   ré   rR   rê   rP   rë   r~   rì   r,   é   é   é   é   é   é   é   rf   é   é   é   N)r6   r7   r8   ÚCLEARZSRCZDESTZSRC_OVERZ	DEST_OVERZSRC_INZDEST_INZSRC_OUTZDEST_OUTZSRC_ATOPZ	DEST_ATOPZXORÚPLUSZSCREENZOVERLAYZDARKENZLIGHTENZCOLOR_DODGEZ
COLOR_BURNZ
HARD_LIGHTZ
SOFT_LIGHTZ
DIFFERENCEZ	EXCLUSIONZMULTIPLYZHSL_HUEZHSL_SATURATIONZ	HSL_COLORZHSL_LUMINOSITYrI   rI   rI   rJ   r  ‹  s8   r  c                   @   sœ   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!d"„ Z#d#d$„ Z$d%S )&ÚPaintFormatr   r)   r_   r*   rg   rç   rè   r+   ré   rR   rê   rP   rë   r~   rì   r,   r  r  r  r  r  r  r  rf   r  r  r  é   é   é   r7  r-   c                 C   s   | j  d¡S )NÚPaintVar)r¨   Ú
startswithrp   rI   rI   rJ   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%  rg   )rý  r!  Ú__members__r¨   ÚKeyErrorrp   rI   rI   rJ   rþ  Ï  s    zPaintFormat.as_variableN)%r6   r7   r8   ÚPaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradientÚ
PaintGlyphÚPaintColrGlyphÚPaintTransformZPaintVarTransformÚPaintTranslateZPaintVarTranslateÚ
PaintScaleZPaintVarScaleÚPaintScaleAroundCenterZPaintVarScaleAroundCenterÚPaintScaleUniformZPaintVarScaleUniformÚPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterÚPaintRotateZPaintVarRotateÚPaintRotateAroundCenterZPaintVarRotateAroundCenterÚ	PaintSkewZPaintVarSkewÚPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositerý  rþ  rI   rI   rI   rJ   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 )rÑ  c                 C   s:   z|   | j¡jW S  tk
r4   td| j› �ƒ‚Y nX d S )NzUnknown Paint format: )r  rN  r¨   rá  ÚNotImplementedErrorrp   rI   rI   rJ   ÚgetFormatNameÛ  s    zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d krg }| d| jf¡ | ||¡ | |  ¡ ¡ | ¡  |  ||¡ | 	|¡ | ¡  d S )NrN  )
rB  r6   r¢   rN  r°   rù   r7  r§   rc  r±   )rq   rÏ   r�   r©   r¨   r  rI   rI   rJ   r´   á  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)r¨   r–   rÍ   N)r   ÚSubTableEntry)r�   ri   rZ   rI   rI   rJ   r‚   ó  s   ÿz+Paint.iterPaintSubTables.<locals>.<genexpr>rÕ  )r¨   r–   z not in colr.BaseGlyphList)rN  r!  r)  Z	LayerListrÑ  rÎ   ZFirstLayerIndexZ	NumLayersr+  rÏ  rÐ  rÕ  rb  r   r:  r(  rÅ  Z
tableClassÚ
issubclassrÂ   r¤   r¨   )rq   r8  Zlayersr  rÈ  r–   rI   rI   rJ   ÚiterPaintSubTablesí  s(    
ÿþzPaint.iterPaintSubTables)r9  c                 C   s   dd„ |   |¡D ƒS )Nc                 S   s   g | ]
}|j ‘qS rI   rÛ   )r�   ÚprI   rI   rJ   r�   
  s     z%Paint.getChildren.<locals>.<listcomp>©r<  )rq   r8  rI   rI   rJ   ÚgetChildren  s    zPaint.getChildren©r8  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 rn   r>  ©Úpaintr@  rI   rJ   r[     r\   z Paint.traverse.<locals>.<lambda>©Ziter_subtables_fnr[  N)ÚcallableÚ	TypeErrorr	   r–   )rq   r8  ÚcallbackÚpathrB  rI   r@  rJ   Ú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: )"rN  r!  r,  r   ZxxZyxZxyÚyyZdxZdyr-  r   Ú	translater.  rN   rS   rT   r/  ZcenterXZcenterYr0  r1  r2  Úrotater   Zangler3  r4  ZskewZ
xSkewAngleZ
ySkewAngler5  rý  r6  )rq   rû   rI   rI   rJ   ÚgetTransform  sd     ÿ þÿÿ þÿÿ þÿ
 ÿ þÿzPaint.getTransformr   r'   )r8  rÊ  rË  r9  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 rn   r>  rA  r@  rI   rJ   r[   G  r\   z&Paint.computeClipBox.<locals>.<lambda>rC  r[  c                 s   s   | ]}|j  ¡ V  qd S rn   )r–   rL  )r�   rã  rI   rI   rJ   r‚   M  s     z'Paint.computeClipBox.<locals>.<genexpr>)r   r	   r–   rN  r!  r*  r   r   r{   r   rb  Zdrawr   Zboundsr   rœ  rú  rÿ  r
   ZxMinZyMinZxMaxZyMax)	rq   r8  rÊ  rË  ÚpenrG  rB  ZtransformationÚcbrI   r@  rJ   rÒ  B  s&     
ÿ

ý
zPaint.computeClipBox)NN)r   )r6   r7   r8   r!  r  r7  r´   rÂ  r#   r   r:  r<  r$   r?  rH  r   rL  rœ  r%   r   rÒ  rI   rI   rI   rJ   rÑ  Ø  s   
, ÿ  þrÑ  )Z
Mark1Array)ZDefaultLangSys)ÚMarkCoverageÚBaseCoverageZLigatureCoverageZMark1CoverageZMark2CoverageZBacktrackCoverageZInputCoverageZLookAheadCoverageZVertGlyphCoverageZHorizGlyphCoverageZTopAccentCoverageZExtendedShapeCoverageZMathKernCoverage)Ú	ClassDef1Ú	ClassDef2ZBacktrackClassDefZInputClassDefZLookAheadClassDefZGlyphClassDefZMarkAttachClassDef)ZEntryAnchorZ
ExitAnchorÚ
BaseAnchorZLigatureAnchorZMark2AnchorZ
MarkAnchor)Z
XPlaDeviceZ
YPlaDeviceZ
XAdvDeviceZ
YAdvDeviceZXDeviceTableZYDeviceTableZDeviceTable)Z	HorizAxisZVertAxis)ZDefaultMinMax)ZMinCoordZMaxCoord)ZDefJstfLangSys)ZShrinkageEnableGSUBZShrinkageDisableGSUBZExtensionEnableGSUBZExtensionDisableGSUB)ZShrinkageEnableGPOSZShrinkageDisableGPOSZExtensionEnableGPOSZExtensionDisableGPOS)ZShrinkageJstfMaxZExtensionJstfMax)ZTopRightMathKernZTopLeftMathKernZBottomRightMathKernZBottomLeftMathKern)ZVertGlyphConstructionZHorizGlyphConstruction)Ú	MarkArrayZLangSysrG  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}|| }|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   rÛ  rè   rÝ  ré   )ÚLookupListIndexÚSubTableIndexÚ	tableTyperä  rÚ  rÞ  rß  rB  Ú
LookupTyper  rŠ   ÚlookupTypesrN  ÚExtSubTable)ÚttfÚoverflowRecordÚokrî  ZextTypeÚlookupsÚlookupÚsiZsubTableZextSubTableClassÚextSubTablerI   rI   rJ   ÚfixLookupOverFlows¶  s<    





rb  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   ©rG  rJ  r)   r—  r   )r  r³   rŽ   rŠ   ÚitemNameÚ	itemIndexr  )
ÚoldSubTableÚnewSubTabler\  r]  Z
oldMappingÚoldLenÚnewLenri   rŽ  r  rI   rI   rJ   ÚsplitMultipleSubstõ  s    




rj  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   r²  rc  r)   r­  r   )	rH  r²  r  r¬  rŽ   rŠ   rd  re  r  )
rf  rg  r\  r]  ZoldAltsrh  ri  ri   rŽ  r  rI   rI   rJ   ÚsplitAlternateSubst	  s     





rk  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   rc  r)   r¶  r   )r  rµ  rŽ   rŠ   rd  re  r  )
rf  rg  r\  r]  ZoldLigsrh  ri  ri   rŽ  r  rI   rI   rJ   ÚsplitLigatureSubst,	  s    




rl  c           	         s  | }d}| j |_ | j dkrÈt| jƒdkrÈdD ]}t||t| |ƒƒ q,| j ¡ |_| jj}| j}t| jƒd ‰|d ˆ… | j_|d ˆ… | _|ˆd … |j_|ˆd … |_t| jƒ| _t|jƒ|_d}�nL| j dk�rt| j	ƒdk�rt
| dƒ�st| j	d jƒ| _dD ]}t||t| |ƒƒ �qd| _| j ¡ |_| j ¡ |_| jj}| jj}| j	}t| j	ƒd ‰t‡fd	d
„| ¡ D ƒƒ‰ ‡ fdd„|D ƒ| j_‡fdd„| ¡ D ƒ| j_|d ˆ… | _	‡ fdd„|D ƒ|j_‡fdd„| ¡ D ƒ|j_|ˆd … |_	t| j	ƒ| _t|j	ƒ|_d}|S )NFr   )ÚValueFormat1ÚValueFormat2r)   TÚClass2Countr   )ro  rR  rm  rn  c                 3   s   | ]\}}|ˆ kr|V  qd S rn   rI   ©r�   ÚkrZ   ©ÚoldCountrI   rJ   r‚   w	  s      zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}|ˆ kr|‘qS rI   rI   ry  ©Ú	newGlyphsrI   rJ   r�   y	  s      z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}|ˆ k r||“qS rI   rI   rp  rr  rI   rJ   r  z	  s      z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}|ˆ kr|‘qS rI   rI   ry  rt  rI   rJ   r�   	  s      c                    s"   i | ]\}}|ˆ kr||ˆ  “qS rI   rI   rp  rr  rI   rJ   r  €	  s      )rN  rŠ   ZPairSetr�   r¤   rG  rB  r?  ZPairSetCountZClass1RecordrH  ZClass2Recordro  Ú	DontSharerQ  r   r  rŽ   ZClass1Count)	rf  rg  r\  rã  r]  r¨   Úcoverager¦  r   rI   )ru  rs  rJ   ÚsplitPairPosF	  sX    
ÿ

ÿ
rx  c                 C   s–  | j }|dk rdS |d }|| }g g  }}g g  }}	t| jj| jjƒD ]J\}
}|j|k rp| |
¡ | |¡ qH| j|8  _| |
¡ |	 |¡ qHg g  }}| jj	D ]J}| 
¡ | 
¡  }}|jd |… |_|j|d … |_| |¡ | |¡ q¦| j|_|| j_| j 
¡ |_||j_| j|_|| _ ||_ || j_| j 
¡ |_|	|j_t|ƒ| j_t|	ƒ|j_|| j_	| j 
¡ |_||j_	t|ƒ| j_t|ƒ|j_dS )Nr)   FT)Z
ClassCountrx  rO  r?  rT  Z
MarkRecordr¤  r¢   Z	BaseArrayZ
BaseRecordrB  rS  rN  rP  rŠ   Z	MarkCountZ	BaseCount)rf  rg  r\  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsrt   Z
markRecordZoldBaseRecordsZnewBaseRecordsr§  ZoldBaseRecordZnewBaseRecordrI   rI   rJ   ÚsplitMarkBasePos�	  sT    

 ÿ




ry  )r)   r_   r*   )r)   r*   ©rÛ  rÝ  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.
    rv  TrZ  ÚSubTableCountr   z)Don't know how to split %s lookup type %sF)rW  rä  rÚ  rÞ  rU  rV  rß  rH  rv  rZ  rB  rX  rY  rN  r{  Ú
splitTabler(  rO  Úerrorrs  )r[  r\  rä  r_  ZsubIndexZsubtableZsubTableTypera  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassrg  Z	splitFuncr]  rI   rI   rJ   ÚfixSubTableOverFlowsâ	  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+)$rz  TZVarr_   )r   r)   r_   r*   rg   rç   rè   r+   )	r   r)   r_   r*   rg   rç   rè   r+   ré   r*   )r   r   r)   r*   rg   )rÛ  rÝ  ZmortZmorxrÝ  ZJSTFÚsizer  zss%02déd   zcv%02d)ÚbuildConvertersÚ
converters)5Úrer  r¥   Úglobalsr   ÚmatchÚgroupr   rÂ   rv  r&  rŠ   Z	NoVarTypeZVarTypeÚ_equivalentsrŽ   r  r•  r«  r´  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphrY  r…   rX  rC  rA  r  rE  rF  ZotConvertersr‚  r  rœ  rH  rƒ  ÚconvertersByName)r„  r  Z	formatPatÚ	namespacer¨   rä  Z	baseClassÚmZ
formatTyper¥  r˜   ZvarTypeZ	noVarTypeÚbaser¯  r°  Z
lookupEnumÚenumri   r‚  r_  rƒ  r‰  rI   rI   rJ   Ú_buildClasses
  s¢    



&ø÷ ÿúç" ÿ

rŽ  c                 C   s   | d krg S | j S d S rn   )r?  )rw  rI   rI   rJ   r…  �
  s    r…  )…Ú__doc__rp  r�  r   Ú	functoolsr   Úmathr   Ú	itertoolsÚcollectionsr   r   rÔ  r   Z%fontTools.ttLib.tables.TupleVariationr   Z!fontTools.ttLib.tables.otTraverser	   ZfontTools.misc.arrayToolsr
   ZfontTools.misc.roundToolsr   ZfontTools.misc.transformr   r   r   ZfontTools.misc.textToolsr   r   r   ZfontTools.misc.vectorr   ZfontTools.pens.boundsPenr   ZfontTools.pens.transformPenr   ZotBaser   r   r   r   r   ZfontTools.misc.fixedToolsr   r   r   rœ   r   r¯   r   r¹   Z fontTools.feaLib.lookupDebugInfor   r    ÚloggingrW   ÚarrayÚsysr!   Útypingr"   r#   r$   r%   r&   ZfontTools.ttLib.ttGlyphSetr'   Ú	getLoggerr6   rO  r(   rK   r=   r>   r?   rA   rB   rF   rG   rC   rD   r�   r£   rˆ   rj   rl   rm   rÉ   ÚobjectrÐ   rÒ   rÔ   rã   r  r  r  r/  r@  rC  rE  rF  rG  rx   re  ru  r|  r  r•  rŸ  r«  r´  rÂ  rÚ  rö  rÏ  rú  r   rÍ  r  r  r!  rÑ  rˆ  rb  rj  rk  rl  rx  ry  r|  r~  rŽ  r…  rI   rI   rI   rJ   Ú<module>   s  

þ   ÿ   ÿóüü z"UA  [L7PKjFz9.
 . 		´U?G?üüõ;o