a
    ¥Q•hÌz ã                   @   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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-Z.m/Z0 ddl1m2Z2m3Z3 ddl4Z4ddl5Z5ddl6Z6ddl7Z7ddlm8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> e:�rbddl?m@Z@ e4 AeB¡ZCG dd„ de8ƒZDedg d¢ƒZEeEeDjFdddƒeEeDjGdddƒeEeDjHdddƒeEeDjIdddƒeEeDjJdddƒeEeDjKdddƒeEeDjLdddƒeEeDjMdddƒeEeDjNdddƒdœ	ZOd d!„ d"d!„ d#d!„ d$d!„ d%œZPd&d!„ d'd!„ d(d!„ d)d!„ d%œZQd*d+„ ZRd,d-„ ZSG d.d/„ d/ƒZTG d0d1„ d1ƒZUG d2d3„ d3eVƒZWG d4d5„ d5eVƒZXG d6d7„ d7eVƒZYG d8d9„ d9eYƒZZG d:d;„ d;eYƒZ[G d<d=„ d=eVƒZ\G d>d?„ d?eYƒZ]G d@dA„ dAeYƒZ^G dBdC„ dCe#ƒZ_G dDdE„ dEe_ƒZ`G dFdG„ dGe_ƒZaG dHdI„ dIe_ƒZbG dJdK„ dKe$ƒZcdLZdG dMdN„ dNe'dOƒƒZeG dPdQ„ dQe#ƒZfG dRdS„ dSe#ƒ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'dOƒƒZrG djdk„ dke'dOƒƒZsG dldm„ dmeƒZtG dndo„ doeƒZuG dpdq„ dqeƒZvG drds„ dse'dOƒƒZwdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒœZxd„d…„ Zyd†d‡„ Zzdˆd‰„ Z{dŠd‹„ Z|dŒd�„ Z}dŽd�„ Z~eze{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)Ú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© rH   rH   úX/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/ttLib/tables/otTables.pyr'   3   s    r'   ÚVarTransformMappingValues)ÚflagÚfractionalBitsÚscaleÚdefaultValueé   é´   é
   iLÿÿÿ)	Ú
translateXÚ
translateYÚrotationÚscaleXÚscaleYÚskewXÚskewYÚtCenterXÚtCenterYc                 C   s   t  d| ¡S )Nú>B©ÚstructÚpack©ÚvrH   rH   rI   Ú<lambda>e   ó    ra   c                 C   s   t  d| ¡S )Nú>Hr\   r_   rH   rH   rI   ra   f   rb   c                 C   s   t  d| ¡dd … S )Nú>Lr   r\   r_   rH   rH   rI   ra   g   rb   c                 C   s   t  d| ¡S )Nrd   r\   r_   rH   rH   rI   ra   h   rb   )r   r(   é   r)   c                 C   s   t  d| ¡d S )Nr[   r   ©r]   Úunpackr_   rH   rH   rI   ra   k   rb   c                 C   s   t  d| ¡d S )Nrc   r   rf   r_   rH   rH   rI   ra   l   rb   c                 C   s   t  dd|  ¡d S )Nrd   ó    r   rf   r_   rH   rH   rI   ra   m   rb   c                 C   s   t  d| ¡d S )Nrd   r   rf   r_   rH   rH   rI   ra   n   rb   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+   re   éð   é   r)   r,   é   NrH   )ÚdataÚiÚb0rH   rH   rI   Ú_read_uint32varr   s,     0,ÿþ,ÿþ
þþrq   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.   r[   r4   rc   é €  i    rd   i  À r   Ni   l      @ rk   r\   r_   rH   rH   rI   Ú_write_uint32var‰   s    rs   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©ÚselfrH   rH   rI   Ú__init__›   s    zVarComponent.__init__Nc                 C   s6   d| _ d | _d | _d | _d| _t| _t| _tƒ | _	d S )Nr   rH   )
ÚflagsÚ	glyphNameÚconditionIndexÚaxisIndicesIndexÚ
axisValuesÚNO_VARIATION_INDEXÚaxisValuesVarIndexÚtransformVarIndexr   Ú	transform©rx   Z
propagatorrH   rH   rI   rv   ž   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 u r¤d}n|d j| j
 }t|ƒ}ˆtj	@ rît |ˆ ˆ¡\}‰tdd„ |D ƒƒ| _nd| _t| jƒ|k�sJ ‚ˆ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   re   r(   ÚAxisIndicesListc                 s   s   | ]}t |d ƒV  qdS ©é   N)Úfi2fl©Ú.0r`   rH   rH   rI   Ú	<genexpr>Â   rb   z)VarComponent.decompile.<locals>.<genexpr>rH   c                    sJ   ˆ| j @ r@tt dˆ ˆˆd … ¡d | jƒ| j }ˆd7 ‰|S | jS d S )Nú>hr(   r   )rK   r‡   r]   rg   rL   rM   rN   ©Úvaluesr`   ©rn   rz   ro   rH   rI   Úread_transform_componentÒ   s    
ÿýÿz8VarComponent.decompile.<locals>.read_transform_componentr   )rq   rz   r'   rD   Ú	_unpackerÚ
glyphOrderr{   r?   r|   r9   r}   ÚItemÚlenr   ZdecompileDeltas_Útupler~   r:   r€   r   r;   r�   r   r‚   ÚVAR_TRANSFORM_MAPPINGÚitemsÚsetattrrA   rU   rV   rG   )rx   rn   ÚfontÚ
localStateZgidSizeÚglyphIDÚnumAxesÚaxisIndicesr~   r�   Ú	attr_nameÚmapping_valuesÚvalueÚnÚ_rH   rŽ   rI   Ú	decompile¨   sN    




zVarComponent.decompilec           	         s‚  g }| j ‰ | | j¡}|dkr<ˆ tjO ‰ | td |ƒ¡ nˆ tj M ‰ | td |ƒ¡ | jd ur~ˆ tjO ‰ | t	| jƒ¡ t
| jƒ}|rÄˆ tjO ‰ | t	| jƒ¡ | t dd„ | j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|ƒ}| |||ƒ¡ �qJt	ˆ ƒt|ƒ S )Néÿÿ  re   r(   c                 S   s   g | ]}t |d ƒ‘qS ©r†   )Úfl2firˆ   rH   rH   rI   Ú
<listcomp>  rb   z(VarComponent.compile.<locals>.<listcomp>c                    s,   ˆ |j @ r$t dt| |j |jƒ¡S dS d S )Nr‹   rb   )rK   r]   r^   r¥   rM   rL   )rŸ   r�   ©rz   rH   rI   Úwrite_transform_component  s
    
ÿz7VarComponent.compile.<locals>.write_transform_component)rz   Ú
getGlyphIDr{   r'   rD   ÚappendÚ_packerr|   r?   rs   r“   r~   r9   r}   r   ZcompileDeltaValues_r€   r   r:   r�   r;   r•   r–   Úgetattrr‚   r   )	rx   r˜   rn   rš   r›   r¨   r�   rž   rŸ   rH   r§   rI   Úcompileî   sD    




ÿÿ


zVarComponent.compilec                    s  ˆ   d|¡ ˆ  ¡  d‡ fdd„	}|d| jƒ | jd urD|d| jƒ | jd urZ|d| jƒ | jd u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 )Nrt   rH   c                    s*   |d ur&ˆ   | d|ff| ¡ ˆ  ¡  d S )NrŸ   )Ú	simpletagÚnewline)ÚnamerŸ   Úattrs©ÚwriterrH   rI   Úwrite)  s    z!VarComponent.toXML.<locals>.writer{   r|   r}   ))ÚresetUnspecifiedAxesr   r~   c                 S   s   g | ]}t t|d ƒƒ‘qS r¤   )ÚfloatÚfl2strrˆ   rH   rH   rI   r¦   <  rb   z&VarComponent.toXML.<locals>.<listcomp>r€   r�   )rH   )Úbegintagr¯   r{   r|   r}   rz   r'   r8   r~   r€   r   r�   r•   r–   rK   r¬   r‚   r·   rL   Úendtag)rx   r³   ÚttFontr±   r´   r�   Úmappingr`   rH   r²   rI   ÚtoXML%  s6    

ÿ
þ


zVarComponent.toXMLc                 C   s  dd„ |D ƒ}|   ¡  |D ]ú\}}}|r,J ‚|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v �rt| j|t|ƒƒ |  jt| jO  _qdsJ |ƒ‚qd S )Nc                 S   s   g | ]}t |tƒr|‘qS rH   ©Ú
isinstancer”   ©r‰   ÚcrH   rH   rI   r¦   O  rb   z(VarComponent.fromXML.<locals>.<listcomp>rŸ   r{   r|   r}   r~   c                 s   s   | ]}t |d ƒV  qdS r…   )Ústr2flrˆ   rH   rH   rI   rŠ   ^  rb   z'VarComponent.fromXML.<locals>.<genexpr>rµ   Ú0r€   r�   F)rv   r{   r   r|   r}   r”   r~   Úgetrz   r'   r8   r€   r�   r•   r—   r‚   rK   )rx   r°   r±   Úcontentrº   r`   rH   rH   rI   ÚfromXMLN  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|J ˆt
ˆ ƒfƒ‚d S )Nr   c                    s6   ˆj | j@ r.tˆ ˆ | jƒ| j }ˆd7 ‰|S dS d S )Nr   r   )rz   rK   r‡   rL   rM   rŒ   ©Údeltasro   rx   rH   rI   Úread_transform_component_deltar  s
    zIVarComponent.applyTransformDeltas.<locals>.read_transform_component_delta)r•   r–   r—   r‚   r¬   rz   r'   rA   rU   rV   r“   )rx   rÇ   rÈ   r�   rž   rŸ   rH   rÆ   rI   ÚapplyTransformDeltaso  s    	ÿz!VarComponent.applyTransformDeltasc                 C   s    t | ƒt |ƒkrtS | j|jkS ru   )ÚtypeÚNotImplementedÚ__dict__)rx   ÚotherrH   rH   rI   Ú__eq__†  s    zVarComponent.__eq__c                 C   s   |   |¡}|tu r|S | S ru   )rÎ   rË   )rx   rÍ   ÚresultrH   rH   rI   Ú__ne__‹  s    
zVarComponent.__ne__)N)r5   r6   r7   ry   rv   r¢   r­   r¼   rÅ   rÉ   rÎ   rÐ   rH   rH   rH   rI   rt   š   s   

F7)!rt   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 ur|ng | _ d S ru   ©Ú
components)rx   rÓ   rH   rH   rI   ry   ‘  s    zVarCompositeGlyph.__init__c                 C   s0   g | _ |r,tƒ }| |||¡}| j  |¡ qd S ru   )rÓ   rt   r¢   rª   )rx   rn   r˜   r™   Ú	componentrH   rH   rI   r¢   ”  s
    zVarCompositeGlyph.decompilec                 C   s(   g }| j D ]}| | |¡¡ q
t|ƒS ru   )rÓ   rª   r­   r   )rx   r˜   rn   rÔ   rH   rH   rI   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¹   )rx   Ú	xmlWriterr˜   r±   r°   ro   rÔ   rH   rH   rI   r¼   ¡  s    
zVarCompositeGlyph.toXMLc                 C   sP   dd„ |D ƒ}|D ]8\}}}|dks(J ‚t ƒ }| ||||¡ | j |¡ qd S )Nc                 S   s   g | ]}t |tƒr|‘qS rH   r½   r¿   rH   rH   rI   r¦   ª  rb   z-VarCompositeGlyph.fromXML.<locals>.<listcomp>rt   )rt   rÅ   rÓ   rª   )rx   r°   r±   rÄ   r˜   rÔ   rH   rH   rI   rÅ   ©  s    zVarCompositeGlyph.fromXML)N)r5   r6   r7   ry   r¢   r­   r¼   rÅ   rH   rH   rH   rI   rÑ   �  s
   
rÑ   c                   @   s   e Zd Zdd„ ZdS )ÚAATStateTablec                 C   s   i | _ g | _g | _d S ru   )ZGlyphClassesZStatesZPerGlyphLookupsrw   rH   rH   rI   ry   ³  s    zAATStateTable.__init__N©r5   r6   r7   ry   rH   rH   rH   rI   rØ   ²  s   rØ   c                   @   s   e Zd Zdd„ ZdS )ÚAATStatec                 C   s
   i | _ d S ru   )ÚTransitionsrw   rH   rH   rI   ry   º  s    zAATState.__init__NrÙ   rH   rH   rH   rI   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)NNrH   )r˜   ÚstatesrH   rH   rI   Ú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 rH   )rÌ   ©r‰   Úfrw   rH   rI   r¦   Æ  rb   z.AATAction._writeFlagsToXML.<locals>.<listcomp>ÚFlagsú,©rŸ   r   ÚReservedFlagsz0x%04X)Ú_FLAGSr®   Újoinr¯   rä   )rx   r×   rz   rH   rw   rI   Ú_writeFlagsToXMLÅ  s    
zAATAction._writeFlagsToXMLc                 C   s$   || j v sJ d| ƒ‚d| j|< d S )Nzunsupported flag %sT)rå   rÌ   ©rx   rK   rH   rH   rI   Ú_setFlagÎ  s    zAATAction._setFlag)r5   r6   r7   rå   ÚstaticmethodrÞ   rç   ré   rH   rH   rH   rI   rÜ   ¾  s
   
	rÜ   c                   @   sj   e Zd ZdZdZg d¢Zdddddd	d
ddddddddddœZdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS ) Ú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(   re   r)   rm   é   é   r*   é	   rQ   é   rO   é   r†   é   c                 C   s(   d| _ d| _d| _d| _d| _d| _d S ©Nr   F)ÚNewStateÚVerbrì   rí   rî   rä   rw   rH   rH   rI   ry   ë  s    z!RearrangementMorphAction.__init__c                 C   sz   |d u sJ ‚|  | j¡ | jdkr,| jdks6J | jƒ‚| j| jB }| jrP|dO }| jr^|dO }| jrl|dO }|  |¡ d S )Nr   rô   rr   r4   r3   )ÚwriteUShortrö   r÷   rä   rì   rí   rî   ©rx   r³   r˜   ÚactionIndexrz   rH   rH   rI   r­   ó  s    z RearrangementMorphAction.compilec                 C   s`   |d u sJ ‚|  ¡ | _|  ¡ }|d@ | _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _|d@ | _d S )Nrô   rr   r4   r3   ið  )Ú
readUShortrö   r÷   Úboolrì   rí   rî   rä   ©rx   Úreaderr˜   ÚactionReaderrz   rH   rH   rI   r¢      s    

z"RearrangementMorphAction.decompilec                 C   sŠ   |j |fi |¤Ž | ¡  |jd| jd� | ¡  |  |¡ |jd| jd� | j | j¡}|d url| |¡ | ¡  | 	|¡ | ¡  d S )Nrö   rã   r÷   )
r¸   r¯   r®   rö   rç   r÷   Ú_VERBSrÃ   Úcommentr¹   )rx   r×   r˜   r±   r°   ZverbCommentrH   rH   rI   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 rH   r½   ©r‰   ÚtrH   rH   rI   r¦     rb   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rö   rŸ   r÷   rä   rá   râ   )
rö   r÷   rä   rì   rí   rî   r   Úsplitré   Ústrip©	rx   r°   r±   rÄ   r˜   ÚeltNameÚeltAttrsÚ
eltContentrK   rH   rH   rI   rÅ     s    z RearrangementMorphAction.fromXMLN)r5   r6   r7   Ú
staticSizeÚactionHeaderSizerå   r   ry   r­   r¢   r¼   rÅ   rH   rH   rH   rI   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ÚCurrentIndexrw   rH   rH   rI   ry   -  s    zContextualMorphAction.__init__c                 C   s`   |d u sJ ‚|  | j¡ | j}| jr,|dO }| jr:|dO }|  |¡ |  | j¡ |  | j¡ d S )Nrr   r4   )rø   rö   rä   r  rí   r  r  rù   rH   rH   rI   r­   3  s    
zContextualMorphAction.compilec                 C   s\   |d u sJ ‚|  ¡ | _|  ¡ }t|d@ ƒ| _t|d@ ƒ| _|d@ | _|  ¡ | _|  ¡ | _d S )Nrr   r4   iÿ?  )rû   rö   rü   r  rí   rä   r  r  rý   rH   rH   rI   r¢   ?  s    


zContextualMorphAction.decompilec                 C   s‚   |j |fi |¤Ž | ¡  |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¹   ©rx   r×   r˜   r±   r°   rH   rH   rI   r¼   I  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 rH   r½   r  rH   rH   rI   r¦   Z  rb   z1ContextualMorphAction.fromXML.<locals>.<listcomp>rö   rŸ   rá   râ   rä   r  r  )
rö   rä   r  rí   r  r  r   r  ré   r  r  rH   rH   rI   rÅ   V  s     zContextualMorphAction.fromXMLN)r5   r6   r7   r
  r  rå   ry   r­   r¢   r¼   rÅ   rH   rH   rH   rI   r  (  s   
r  c                   @   s   e Zd Zdd„ ZdS )Ú	LigActionc                 C   s   d| _ d| _d S )NFr   )ÚStoreÚGlyphIndexDeltarw   rH   rH   rI   ry   j  s    
zLigAction.__init__NrÙ   rH   rH   rH   rI   r  i  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ï   rO   ÚSetComponentrí   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r  )rö   r  rí   rä   ÚActionsrw   rH   rH   rI   ry   €  s    zLigatureMorphAction.__init__c                 C   sŽ   |d usJ ‚|  | j¡ | j}| jr,|dO }| jr:|dO }t| jƒdkrP|dO }|  |¡ t| jƒdkr€|  ¡ }|  || ¡ n
|  d¡ d S )Nrr   r4   r   r3   )rø   rö   rä   r  rí   r“   r  ÚcompileLigActions)rx   r³   r˜   rú   rz   ÚactionsrH   rH   rI   r­   †  s    
zLigatureMorphAction.compilec                 C   sv   |d usJ ‚|  ¡ | _|  ¡ }t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ}|d@ | _|  ¡ }|rl|  ||¡| _ng | _d S )Nrr   r4   r3   iÿ  )rû   rö   rü   r  rí   rä   Ú_decompileLigActionsr  )rx   rþ   r˜   rÿ   rz   ZperformActionrú   rH   rH   rI   r¢   —  s    

zLigatureMorphAction.decompilec                 C   s´   dt ƒ i   }}}|D ]&}|j ¡ D ]\}}| | ¡ ¡ q$qt|dd„ d�D ]R}||vrNtdt|ƒdƒD ],}	||	d … }
t|ƒ|	 d }| |
|¡ qj||7 }qNt	|dƒ}||fS )Nrb   c                 S   s   t | ƒ | fS ru   ©r“   ©ÚxrH   rH   rI   ra   »  rb   z4LigatureMorphAction.compileActions.<locals>.<lambda>©Úkeyr   r)   )
ÚsetrÛ   r–   Úaddr  ÚsortedÚranger“   Ú
setdefaultr   )r˜   rÝ   rÏ   r  rú   ÚstateÚ_glyphClassÚtransÚaro   ÚsuffixZsuffixIndexrH   rH   rI   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   é   @rd   )	rÖ   r  r“   r  r  rª   r]   r^   r   )rx   rÏ   ro   ÚactionÚlastrŸ   rH   rH   rI   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  )	rx   rÿ   rú   r  r/  rþ   rŸ   r.  ÚdeltarH   rH   rI   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|
v |	_t|d ƒ|	_| j |	¡ q6d S )Nr   Fc                 S   s   g | ]}t |tƒr|‘qS rH   r½   r  rH   rH   rI   r¦   ä  rb   z/LigatureMorphAction.fromXML.<locals>.<listcomp>rö   rŸ   rá   râ   rä   ÚActionÚ c                 S   s   g | ]}|  ¡ ‘qS rH   ©r  rß   rH   rH   rI   r¦   ð  rb   r  r  )rö   rä   r  rí   r  r   r  ré   r  r  rÃ   r  r  rª   )rx   r°   r±   rÄ   r˜   r  r  r	  rK   r.  rz   rH   rH   rI   rÅ   ß  s(    
zLigatureMorphAction.fromXMLc                 C   sŽ   |j |fi |¤Ž | ¡  |jd| jd� | ¡  |  |¡ | jD ]4}d|jfg}|jrb| d¡ | d|¡ | ¡  qB| 	|¡ | ¡  d S )Nrö   rã   r  )rá   r  r3  )
r¸   r¯   r®   rö   rç   r  r  r  rª   r¹   )rx   r×   r˜   r±   r°   r.  ZattribsrH   rH   rI   r¼   õ  s    




zLigatureMorphAction.toXMLN)r5   r6   r7   r
  r  rå   ry   r­   r¢   rê   rÞ   r  r  rÅ   r¼   rH   rH   rH   rI   r  x  s   

r  c                   @   sX   e Zd ZdZdZg d¢Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zedd„ ƒZdS )Ú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è   rH   rH   rI   ry     s
    
zInsertionMorphAction.__init__c                 C   sø   |d usJ ‚|  | j¡ | j}| jr,|dO }| jr:|dO }| jrH|dO }| jrV|dO }| jrd|dO }| jrr|dO }|t	| j
ƒd> O }|t	| jƒO }|  |¡ t	| j
ƒdkrº|t| j
ƒ }nd	}|  |¡ t	| jƒdkræ|t| jƒ }nd	}|  |¡ d S )
Nrr   r4   r3   r2   r1   r0   rm   r   r£   )rø   rö   rä   r  rí   r7  r8  r9  r:  r“   r;  r<  r”   )rx   r³   r˜   rú   rz   ZcurrentIndexZmarkedIndexrH   rH   rI   r­     s4    

zInsertionMorphAction.compilec                 C   s²   |d usJ ‚|  ¡ | _|  ¡ }t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _t|d@ ƒ| _| j	|||  ¡ |d@ d? d	�| _
| j	|||  ¡ |d
@ d	�| _d S )Nrr   r4   r3   r2   r1   r0   ià  rm   )rÕ   Úcounté   )rû   rö   rü   r  rí   r7  r8  r9  r:  Ú_decompileInsertionActionr;  r<  rý   rH   rH   rI   r¢   6  s    
ÿÿzInsertionMorphAction.decompilec                 C   s8   |dks|dkrg S |  |j|d  ¡}| | |¡¡S )Nr£   r   r(   )r0  r1  ÚgetGlyphNameManyZreadUShortArray)rx   rÿ   r˜   rÕ   r=  rþ   rH   rH   rI   r?  G  s    z.InsertionMorphAction._decompileInsertionActionc                 C   s–   |j |fi |¤Ž | ¡  |jd| jd� | ¡  |  |¡ | jD ]}|jd|d� | ¡  qB| jD ]}|jd|d� | ¡  qd| |¡ | ¡  d S )Nrö   rã   r;  ©Úglyphr<  )r¸   r¯   r®   rö   rç   r;  r<  r¹   )rx   r×   r˜   r±   r°   ÚgrH   rH   rI   r¼   M  s    





zInsertionMorphAction.toXMLc           	      C   s®   |   ¡  dd„ |D ƒ}|D ]Ž\}}}|dkr<t|d ƒ| _q|dkrh|d  d¡D ]}|  | ¡ ¡ qRq|dkr‚| j |d ¡ q|d	krœ| j |d ¡ qd
sJ |ƒ‚qd S )Nc                 S   s   g | ]}t |tƒr|‘qS rH   r½   r  rH   rH   rI   r¦   ^  rb   z0InsertionMorphAction.fromXML.<locals>.<listcomp>rö   rŸ   rá   râ   r;  rB  r<  F)	ry   r   rö   r  ré   r  r;  rª   r<  r  rH   rH   rI   rÅ   \  s    zInsertionMorphAction.fromXMLc                 C   s  t ƒ i d  }}}|D ]L}|j ¡ D ]<\}}|jd urF| t|jƒ¡ |jd ur$| t|jƒ¡ q$qt|dd„ d�D ]†}||v r‚qttdt	|ƒƒD ]D}	t	|ƒd |	 }
t|	t	|ƒƒD ] }||	|d … }| 
||
¡ q²q�|D ]}|  |¡}|t d|¡7 }qÚqt||fS )	Nrb   c                 S   s   t | ƒ | fS ru   r  r  rH   rH   rI   ra   x  rb   z5InsertionMorphAction.compileActions.<locals>.<lambda>r  r   r(   r   rc   )r!  rÛ   r–   r;  r"  r”   r<  r#  r$  r“   r%  r©   r]   r^   )r˜   rÝ   r  rú   rÏ   r&  r'  r(  r.  ÚstartZ
startIndexÚlimitÚglyphsrB  rš   rH   rH   rI   rÞ   l  s&    


z#InsertionMorphAction.compileActionsN)r5   r6   r7   r
  r  rå   ry   r­   r¢   r?  r¼   rÅ   rê   rÞ   rH   rH   rH   rI   r6    s   	r6  c                   @   s   e Zd Zdd„ Zddd„ZdS )ÚFeatureParamsc                 C   s>   t  |d ¡| jks,J d|d | jjf ƒ‚t | ||¡ d S )NÚ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)ÚfeatureParamTypesrÃ   Ú	__class__r5   r   r­   )rx   r³   r˜   rH   rH   rI   r­   �  s    ÿþþzFeatureParams.compileNc                 C   s   t j| |||| jjd� d S )N)r°   )r   r¼   rJ  r5   r  rH   rH   rI   r¼   –  s    zFeatureParams.toXML)NN)r5   r6   r7   r­   r¼   rH   rH   rH   rI   rG  Œ  s   	rG  c                   @   s   e Zd ZdS )ÚFeatureParamsSizeN©r5   r6   r7   rH   rH   rH   rI   rK  š  s   rK  c                   @   s   e Zd ZdS )ÚFeatureParamsStylisticSetNrL  rH   rH   rH   rI   rM  ž  s   rM  c                   @   s   e Zd ZdS )ÚFeatureParamsCharacterVariantsNrL  rH   rH   rH   rI   rN  ¢  s   rN  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 )NrF  )ÚhasattrrF  rƒ   rH   rH   rI   rv   ©  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 ru   )ÚStartCoverageIndex©r)  rH   rH   rI   ra   ¶  rb   z#Coverage.postRead.<locals>.<lambda>r  ú.GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)ÚFormatrF  r#  ÚlogÚwarningÚStartÚEndr©   Úextendr@  r$  )rx   ÚrawTabler˜   rF  ÚrangesZsorted_rangesÚrrD  ÚendÚstartIDÚendIDrH   rH   rI   ÚpostRead­  s&    




zCoverage.postReadc                 C   sd  t | dd ƒ}|d u rg  }| _d}d|i}|�rZ| |¡}t|ƒ|k}|d }|gg}|dd … D ].}	|	|d krŒ|d  |¡ | |	g¡ |	}qb|d  |¡ |sºt|ƒd t|ƒk �rZd}
tt|ƒƒD ]R}|| \}}tƒ }||_| 	|¡|_
| 	|¡|_|
|_|||< |
| | d }
qÊ|�r>t d¡ |jdd	„ d
� |D ]
}|`�qBd}d|i}|| _|S )NrF  r   rQ  r   éÿÿÿÿre   rU  c                 S   s   | j S ru   )ÚStartIDrT  rH   rH   rI   ra   è  rb   z#Coverage.preWrite.<locals>.<lambda>r  r(   rR  )r¬   rF  ÚgetGlyphIDManyr#  rª   r“   r$  rR  rd  ÚgetGlyphNamerY  rZ  rS  rW  rX  ÚsortrV  )rx   r˜   rF  Úformatr\  ÚglyphIDsZbrokenOrderr/  r]  rš   rÕ   ro   rD  r_  r^  rH   rH   rI   ÚpreWriteÆ  sH    


zCoverage.preWritec                 C   s,   t | dg ƒD ]}|jd|d� | ¡  qd S )NrF  ÚGlyphrã   )r¬   r®   r¯   )rx   r×   r˜   r{   rH   rH   rI   ÚtoXML2ò  s    zCoverage.toXML2c                 C   s0   t | dd ƒ}|d u rg }|| _| |d ¡ d S )NrF  rŸ   )r¬   rF  rª   )rx   r°   r±   rÄ   r˜   rF  rH   rH   rI   rÅ   ÷  s
    zCoverage.fromXML)N©r5   r6   r7   rv   rb  rj  rl  rÅ   rH   rH   rH   rI   rO  ¦  s
   
,rO  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»   ©rP  r»   rƒ   rH   rH   rI   rv     s    
z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dksJ ‚|d | _ d S )NÚEntryFormatéÀÿ  r   r»   ©r»   )rx   r\  r˜   rH   rH   rI   rb  	  s    zDeltaSetIndexMap.postReadc                 C   s¬   d}| D ]}||O }q|d@ }d}|r8|d7 }|dL }q"t |dƒ}|dksNJ ‚|d| ? |d|> d @ B }|dkrxd}n |dkr†d}n|dkr”d}nd	}|d d	> |d B S )
Nr   r£   r   r+   éÿ   r(   iÿÿÿ re   r)   )Úmax)r»   ZoredÚidxÚinnerZ	innerBitsZ	entrySizerH   rH   rI   ÚgetEntryFormat  s&    


zDeltaSetIndexMap.getEntryFormatc                 C   s\   t | dd ƒ}|d u rg  }| _t|ƒdkr.dnd| _| j ¡ }t|ƒ|d< |  |¡|d< |S )Nr»   r£   r   r   ÚMappingCountrq  )r¬   r»   r“   rV  rÌ   Úcopyrx  )rx   r˜   r»   r\  rH   rH   rI   rj  '  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+   rw  r£   ÚMap)r  r¯   rÖ   r¬   r   r[  r®   )rx   r×   r˜   ro   rŸ   r±   rH   rH   rI   rl  1  s    



þÿzDeltaSetIndexMap.toXML2c           	      C   sn   t | dd ƒ}|d u rg  | _}t|d ƒ}t| dd¡ƒ}t| dd¡ƒ}|dksVJ ‚| ||d> |B ¡ d S )Nr»   rÕ   r{  Z0xFFFFrw  r£   r+   )r¬   r»   r   rÃ   Úinsert)	rx   r°   r±   rÄ   r˜   r»   rÕ   r{  rw  rH   rH   rI   rÅ   B  s    
zDeltaSetIndexMap.fromXMLc                 C   s   |t | jƒk r| j| S tS ru   )r“   r»   r   )rx   ro   rH   rH   rI   Ú__getitem__L  s    zDeltaSetIndexMap.__getitem__)N)r5   r6   r7   rv   rb  rê   rx  rj  rl  rÅ   r~  rH   rH   rH   rI   rn    s   



rn  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 ro  rp  rƒ   rH   rH   rI   rv   Q  s    
zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dksJ ‚|  ¡ }|d }| |d gt|ƒt|ƒ  ¡ tt||ƒƒ| _d S )Nrq  rr  r   r»   rc  )ÚgetGlyphOrderr[  r“   ÚdictÚzipr»   )rx   r\  r˜   r‘   ZmapListrH   rH   rI   rb  U  s
     zVarIdxMap.postReadc                    s‚   t | dd ƒ‰ ˆ d u ri  ‰ | _| ¡ }‡ fdd„|D ƒ‰ tˆ ƒdkr\ˆ d ˆ d kr\ˆ d= q8dˆ i}tˆ ƒ|d< t ˆ ¡|d< |S )	Nr»   c                    s   g | ]}ˆ | ‘qS rH   rH   ©r‰   rC  rs  rH   rI   r¦   b  rb   z&VarIdxMap.preWrite.<locals>.<listcomp>r   éþÿÿÿrc  ry  rq  )r¬   r»   r€  r“   rn  rx  )rx   r˜   r‘   r\  rH   rs  rI   rj  \  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»   rB  r{  r+   rw  r£   r|  )r#  r¬   r–   r®   r¯   )rx   r×   r˜   rB  rŸ   r±   rH   rH   rI   rl  k  s    

ýzVarIdxMap.toXML2c           	      C   s€   t | dd ƒ}|d u ri }|| _z|d }W n   | ¡ |d  }Y n0 t|d ƒ}t|d ƒ}|dkslJ ‚|d> |B ||< d S )Nr»   rB  rÕ   r{  rw  r£   r+   )r¬   r»   r€  r   )	rx   r°   r±   rÄ   r˜   r»   rB  r{  rw  rH   rH   rI   rÅ   u  s    zVarIdxMap.fromXMLc                 C   s   | j  |t¡S ru   )r»   rÃ   r   )rx   r{   rH   rH   rI   r~  ƒ  s    zVarIdxMap.__getitem__)N)	r5   r6   r7   rv   rb  rj  rl  rÅ   r~  rH   rH   rH   rI   r  P  s   

r  c                   @   s   e Zd Zdd„ ZdS )ÚVarRegionListc                 C   s4   |  d¡}|rt|jƒ| _i | j¥dt| jdƒi¥S )NÚfvarÚRegionAxisCount)rÃ   r“   Úaxesr‡  rÌ   r   )rx   r˜   Z	fvarTablerH   rH   rI   rj  ˆ  s    
ÿþzVarRegionList.preWriteN©r5   r6   r7   rj  rH   rH   rH   rI   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 ro  rp  rƒ   rH   rH   rI   rv   š  s    
zSingleSubst.populateDefaultsc                    sÎ   i }t |d ƒ}| jdkrf|d ‰ | |¡}‡ fdd„|D ƒ}| |¡}t||ƒD ]\}}	|	||< qRnZ| jdkr®t|ƒ|d ksˆJ dƒ‚|d	 }
t||
ƒD ]\}}|||< qšnd
sÀJ d| j ƒ‚|| _| `d S )NrO  r   ÚDeltaGlyphIDc                    s   g | ]}|ˆ  d  ‘qS )é   rH   )r‰   rš   ©r2  rH   rI   r¦   ¤  rb   z(SingleSubst.postRead.<locals>.<listcomp>r(   Ú
GlyphCountz invalid SingleSubstFormat2 tableÚ
Substituter   úunknown format: %s)Ú_getGlyphsFromCoverageTablerV  re  r@  r‚  r“   r»   )rx   r\  r˜   r»   ÚinputZ	inputGIDSZoutGIDSZoutNamesÚinpÚoutÚsubstÚsubrH   r�  rI   rb  ž  s(    



ÿþzSingleSubst.postReadc                    s  t | dd ƒ}|d u ri  }| _t| ¡ ƒ}|j‰ ‡ fdd„|D ƒ}tt||ƒƒ}d}d }|D ]0\}}	|d u rx|	| d }|| d |	kr\ q q\|d u rœd}nd}i }
|| _tƒ }dd„ |D ƒ}dd„ |D ƒ}||_	||
d	< |dkrø|d usîJ ‚||
d
< n||
d< |
S )Nr»   c                    s    g | ]\}}ˆ |ƒˆ |ƒf‘qS rH   rH   )r‰   r)  Úb©r©   rH   rI   r¦   º  rb   z(SingleSubst.preWrite.<locals>.<listcomp>r(   rŒ  r   c                 S   s   g | ]}|d  d ‘qS )r   r   rH   ©r‰   ÚitemrH   rH   rI   r¦   Ð  rb   c                 S   s   g | ]}|d  d  ‘qS ©r   rH   r™  rH   rH   rI   r¦   Ñ  rb   rO  r‹  r�  )
r¬   r»   Úlistr–   r©   r#  r‚  rV  rO  rF  )rx   r˜   r»   r–   ZgidItemsZsortableItemsrh  r2  ZinIDZoutIDr\  Úcovr’  r•  rH   r˜  rI   rj  ´  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¯   )rx   r×   r˜   r–   ÚinGlyphZoutGlyphrH   rH   rI   rl  Û  s    zSingleSubst.toXML2c                 C   s2   t | dd ƒ}|d u ri }|| _|d ||d < d S )Nr»   r”  rŸ  )r¬   r»   )rx   r°   r±   rÄ   r˜   r»   rH   rH   rI   rÅ   á  s
    zSingleSubst.fromXML)Nrm  rH   rH   rH   rI   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 ro  rp  rƒ   rH   rH   rI   rv   ê  s    
zMultipleSubst.populateDefaultsc                 C   s\   i }| j dkr<t|d ƒ}dd„ |d D ƒ}tt||ƒƒ}ndsNJ d| j  ƒ‚|| _| ` d S )Nr   rO  c                 S   s   g | ]
}|j ‘qS rH   )r�  )r‰   ÚsrH   rH   rI   r¦   ò  rb   z*MultipleSubst.postRead.<locals>.<listcomp>ÚSequencer   r�  )rV  r‘  r�  r‚  r»   )rx   r\  r˜   r»   rF  r•  rH   rH   rI   rb  î  s    
zMultipleSubst.postReadc                    sb   t ˆdd ƒ‰ ˆ d u ri  ‰ ˆ_tƒ }ttˆ  ¡ ƒ|jd�|_dˆ_|‡ ‡fdd„|jD ƒdœ}|S )Nr»   r  r   c                    s   g | ]}ˆ  ˆ | ¡‘qS rH   )ÚmakeSequence_)r‰   rB  ©r»   rx   rH   rI   r¦     rb   z*MultipleSubst.preWrite.<locals>.<listcomp>)rO  r£  )	r¬   r»   rO  r#  rœ  Úkeysr©   rF  rV  )rx   r˜   r�  r\  rH   r¥  rI   rj  ù  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¯   )rx   r×   r˜   r–   r   Ú	outGlyphsr”  rH   rH   rI   rl    s
    
zMultipleSubst.toXML2c                 C   s  t | dd ƒ}|d u ri }|| _|dkrhg | _|D ]2}t|tƒs@q0|\}}}	|dkr0| j |d ¡ q0d S |dkrÔt| dt|ƒ¡ƒ}
| j|
 }g  }||< |D ]0}t|tƒs®qž|\}}}	|dkrž| |d ¡ qžd S |d rê|d  	d	¡ng }d
d„ |D ƒ||d < d S )Nr»   rO  rk  rŸ   r£  rÕ   r�  r”  râ   c                 S   s   g | ]}|  ¡ ‘qS rH   r5  rƒ  rH   rH   rI   r¦   +  rb   z)MultipleSubst.fromXML.<locals>.<listcomp>rŸ  )
r¬   r»   Zold_coverage_r¾   r”   rª   ÚintrÃ   r“   r  )rx   r°   r±   rÄ   r˜   r»   ÚelementZelement_nameZelement_attrsr¡   rÕ   rB  Zglyph_mappingr§  rH   rH   rI   rÅ     s4    




zMultipleSubst.fromXMLc                 C   s   t ƒ }| |_|S ru   )r£  r�  )rC  ÚseqrH   rH   rI   r¤  -  s    zMultipleSubst.makeSequence_)N)
r5   r6   r7   rv   rb  rj  rl  rÅ   rê   r¤  rH   rH   rH   rI   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)rP  r¬  rƒ   rH   rH   rI   rv   5  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)rV  r©   r“   r@  r$  r‚  ÚClassrY  rZ  rW  rX  r¬  )rx   r\  r˜   r¬  rD  Z	classListr`  ra  Ú
glyphNamesr{   ÚclsÚrecordsÚrecr_  rH   rH   rI   rb  9  s4    



zClassDef.postReadc                 C   sî   t | dd ƒ}|d u ri | _d S |j}g }| ¡ D ]"\}}|s>q0| ||ƒ||f¡ q0|rê| ¡  |d \}}}	|	||gg}
|dd … D ]L\}}}||d ks¤||	krÆ|
d  ||g¡ |
 |||g¡ |}|}|}	q†|
d  ||g¡ |
S d S )Nr¬  r   r   rc  )r¬   r¬  r©   r–   rª   rg  r[  )rx   r˜   r¬  r©   r–   r{   r²  r/  ZlastNameZlastClsr]  rš   rH   rH   rI   Ú_getClassRangesX  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   rc  re   )r­  r®  )rµ  r“   r$  r¯  rY  rZ  r°  rV  )rx   r˜   rh  r\  r]  Z
startGlyphZendGlyphÚ
glyphCountro   r²  rD  Ú	startNamer_  ÚendNamer´  ZstartGlyphNameÚclassesrC  rH   rH   rI   rj  q  s4    




zClassDef.preWritec                 C   s@   t | j ¡ ƒ}|D ](\}}| dd|fd|fg¡ | ¡  qd S )Nr«  rB  Úclass)r#  r¬  r–   r®   r¯   )rx   r×   r˜   r–   r{   r²  rH   rH   rI   rl  �  s    zClassDef.toXML2c                 C   s6   t | dd ƒ}|d u ri }|| _t|d ƒ||d < d S )Nr¬  rº  rB  )r¬   r¬  r¨  )rx   r°   r±   rÄ   r˜   r¬  rH   rH   rI   rÅ   –  s
    zClassDef.fromXML)N)	r5   r6   r7   rv   rb  rµ  rj  rl  rÅ   rH   rH   rH   rI   r«  4  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)rP  r¼  rƒ   rH   rH   rI   rv   Ÿ  s    
zAlternateSubst.populateDefaultsc                 C   sv   i }| j dkrVt|d ƒ}|d }t|ƒt|ƒks6J ‚t||ƒD ]\}}|j||< q@ndshJ d| j  ƒ‚|| _| ` d S )Nr   rO  ÚAlternateSetr   r�  )rV  r‘  r“   r‚  Ú	Alternater¼  )rx   r\  r˜   r¼  r’  Úaltsr“  ÚaltrH   rH   rI   rb  £  s    
zAlternateSubst.postReadc           
      C   sÂ   d| _ t| dd ƒ}|d u r$i  }| _t| ¡ ƒ}tt|ƒƒD ]$}|| \}}| |¡||f||< q<| ¡  t	ƒ }dd„ |D ƒ|_
g }dd„ |D ƒ}|D ]}tƒ }	||	_| |	¡ q–d| _||dœS )Nr   r¼  c                 S   s   g | ]}|d  ‘qS r›  rH   r™  rH   rH   rI   r¦   »  rb   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS ©rc  rH   r™  rH   rH   rI   r¦   ½  rb   )rO  r½  )rV  r¬   r¼  rœ  r–   r$  r“   r©   rg  rO  rF  r½  r¾  rª   ÚsortCoverageLast)
rx   r˜   r¼  r–   ro   r{   r!  r�  ÚsetListr¿  rH   rH   rI   rj  °  s&    
zAlternateSubst.preWritec                 C   sh   t | j ¡ ƒ}|D ]P\}}|jd|d� | ¡  |D ]}|jd|d� | ¡  q4| d¡ | ¡  qd S )Nr½  rA  r¾  )r#  r¼  r–   r¸   r¯   r®   r¹   )rx   r×   r˜   r–   r{   r¼  rÀ  rH   rH   rI   rl  Ê  s    

zAlternateSubst.toXML2c           	      C   sd   t | dd ƒ}|d u ri }|| _|d }g }|||< |D ](}t|tƒsFq6|\}}}| |d ¡ q6d S )Nr¼  rB  )r¬   r¼  r¾   r”   rª   )	rx   r°   r±   rÄ   r˜   r¼  r{   r!  r©  rH   rH   rI   rÅ   Õ  s    

zAlternateSubst.fromXML)Nrm  rH   rH   rH   rI   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)rP  rÅ  rƒ   rH   rH   rI   rv   å  s    
zLigatureSubst.populateDefaultsc                 C   s|   i }| j dkr\t|d ƒ}|d }t|ƒt|ƒks6J ‚tt|ƒƒD ]}|| j||| < qBndsnJ d| j  ƒ‚|| _| ` d S )Nr   rO  ÚLigatureSetr   r�  )rV  r‘  r“   r$  ÚLigaturerÅ  )rx   r\  r˜   rÅ  r’  ÚligSetsro   rH   rH   rI   rb  é  s    
zLigatureSubst.postReadc                 C   s
   t | ƒ S ru   r  rÒ   rH   rH   rI   Ú_getLigatureSortKeyö  s    z!LigatureSubst._getLigatureSortKeyc                 C   sT  d| _ t| dd ƒ}|d u 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›  rH   r™  rH   rH   rI   r¦   -  rb   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS rÁ  rH   r™  rH   rH   rI   r¦   0  rb   )rO  rÆ  )rV  r¬   rÅ  r¾   ÚnextÚiterr”   r�  r#  r¦  rÉ  rÇ  Ú	Componentr“   Ú	CompCountÚLigGlyphr%  rª   rœ  r–   r$  r©   rg  rO  rF  rÆ  rÂ  )rx   r˜   rÅ  ZnewLigaturesÚcompsZligaturer–   ro   r{   r!  r�  rÈ  rÃ  ZligSetÚligsÚligrH   rH   rI   rj    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Æ  rA  rÇ  râ   )rB  rÓ   )
r#  rÅ  r–   r¸   r¯   r®   rÎ  ræ   rÌ  r¹   )rx   r×   r˜   r–   r{   rÈ  rÑ  rH   rH   rI   rl  =  s    ÿ

zLigatureSubst.toXML2c                 C   s˜   t | dd ƒ}|d u ri }|| _|d }g }|||< |D ]\}t|tƒsFq6|\}}}tƒ }	|d |	_|d }
|
rv|
 d¡ng |	_t|	jƒ|	_	| 
|	¡ q6d S )NrÅ  rB  rÓ   râ   )r¬   rÅ  r¾   r”   rÇ  rÎ  r  rÌ  r“   rÍ  rª   )rx   r°   r±   rÄ   r˜   rÅ  r{   rÐ  r©  rÑ  rÓ   rH   rH   rI   rÅ   J  s"    


zLigatureSubst.fromXML)N)
r5   r6   r7   rv   rb  rê   rÉ  rj  rl  rÅ   rH   rH   rH   rI   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)	r0  ÚgetConvertersr°   Úadvancer
  ÚreadÚAssertionErrorr   r¢   )rx   rþ   r˜   Z	subReaderÚconvrH   rH   rI   r¢   _  s    
zCOLR.decompilec                 C   s    d | _ i | j¥dt| jdƒi¥S )NrÔ  )rÔ  rÌ   r   ©rx   r˜   rH   rH   rI   rj  p  s    ÿþzCOLR.preWriter   r&   )ÚglyphSetÚquantizationc           	      C   sÎ   | j dkrd S i }| jjD ]n}z|j | ||¡}W nB tyt } z*ddlm} |d|j›�ƒ|‚W Y d }~n
d }~0 0 |d ur|||j< qt	| dƒoœ| j
d u}|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Ý  Ú	BaseGlyphrP  rÞ  rV  Úclips)	rx   rÛ  rÜ  rç  r´  ÚclipBoxÚerÝ  ZhasClipListrH   rH   rI   ÚcomputeClipBoxesz  s.    

ÿþzCOLR.computeClipBoxesN)r   )r5   r6   r7   r¢   rj  r¨  rê  rH   rH   rH   rI   rÒ  ^  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 )NÚSubstÚGSUBÚPosÚGPOS)ÚLookupÚSubTablerÊ   r5   ÚendswithÚ
ValueError)rx   ÚlÚstrH   rH   rI   Útable˜  s    

zLookupList.tablec              
      sL  |rd|vst |d jvr(tƒ  ||¡S |d jt  | j }|  ¡ D �] }|j�rt| |jg ƒ}t	|ƒD ]š\}}t
|ƒ|v rèt|t
|ƒ Ž }|j}	|jr¨|j› d|	› �}	|jrÖ|j\}
}}|	› d|› d|
› d|› d�}	| |	¡ | ¡  | ||||jd|fg¡ qhqD|j�r$t|jd t| ƒƒ�s$qDt| |jd ƒ}| ||||jg ¡ qDd S )NZDebgz: z in z (ú/ú)rÕ   )r   rn   Úsuperrl  rö  rÕ  Úrepeatr¬   r°   rÖ   Ústrr   ÚlocationÚfeaturer  r¯   ZxmlWriteZauxÚevalÚvars)rx   r×   r˜   Z	debugDatarÙ  rŸ   ÚlookupIndexrš  ÚinfoÚtagÚscriptÚlanguagerý  ©rJ  rH   rI   rl  ¢  s>    ÿþý
ÿÿzLookupList.toXML2)r5   r6   r7   Úpropertyrö  rl  Ú__classcell__rH   rH   r  rI   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 ru   ©r©   ræ  ©r´  ©r˜   rH   rI   ra   È  rb   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r  )r#  ZBaseGlyphRecordrÌ   rz  rÚ  rH   r  rI   rj  Æ  s    ÿzBaseGlyphRecordArray.preWriteNr‰  rH   rH   rH   rI   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 ru   r	  r
  r  rH   rI   ra   Ð  rb   z(BaseGlyphList.preWrite.<locals>.<lambda>r  )r#  rá  rÌ   rz  rÚ  rH   r  rI   rj  Î  s    ÿzBaseGlyphList.preWriteNr‰  rH   rH   rH   rI   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 u S ru   ©ÚVariablerw   rH   rH   rI   Úis_variableÙ  s    zClipBoxFormat.is_variablec                 C   s   | j S ru   r  rw   rH   rH   rI   Úas_variableÜ  s    zClipBoxFormat.as_variableN)r5   r6   r7   ÚStaticr  r  r  rH   rH   rH   rI   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 ru   )r¬   r°   )r‰   rÙ  rw   rH   rI   rŠ   ä  rb   z#ClipBox.as_tuple.<locals>.<genexpr>)r”   rÕ  rw   rH   rw   rI   Úas_tupleã  s    zClipBox.as_tuplec                 C   s   | j j› |  ¡ › �S ru   )rJ  r5   r  rw   rH   rH   rI   Ú__repr__æ  s    zClipBox.__repr__N)r5   r6   r7   r  Ú
formatEnumr  r  rH   rH   rH   rI   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ç  )rP  rç  rƒ   rH   rH   rI   rv   ë  s    
zClipList.populateDefaultsc              
   C   sø   i }|  ¡ }t|d ƒD ]Ô\}}|j|jkrBt d||j|j¡ qg }g }t|j|jd ƒD ]V}	z||	 }
W n  tyŒ   | |	¡ Y q\Y n0 |
|vr¨t	 	|j
¡||
< q\| |	¡ q\|rÐt d|t|ƒt|ƒ¡ |rt d|t|ƒt|ƒ¡ q|| _d S )NÚ
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])r€  rÖ   ÚStartGlyphIDÚ
EndGlyphIDrW  rX  r$  Ú
IndexErrorrª   rz  r  Úminru  rç  )rx   r\  r˜   rç  r‘   ro   r´  ZredefinedGlyphsZmissingGlyphsrš   rB  rH   rH   rI   rb  ï  sJ    û

úüzClipList.postReadc                    s\   t tƒ}i ‰ | j ¡ D ].\}}| ¡ }||  |¡ |ˆ vr|ˆ |< q‡ fdd„| ¡ D ƒS )Nc                    s   i | ]\}}t |ƒˆ | “qS rH   )Ú	frozenset)r‰   r   rF  ©ZuniqueClipsrH   rI   Ú
<dictcomp>"  s   z#ClipList.groups.<locals>.<dictcomp>)r   rœ  rç  r–   r  rª   )rx   ZglyphsByClipr{   rè  r   rH   r  rI   Úgroups  s    

ÿzClipList.groupsc                    s$  t | dƒsi | _i }| ¡ ‰ |  ¡  ¡ D ]¨\}}t‡ fdd„|D ƒƒ}|sLq(|d }|gg}|dd … D ].}||d kr’|d  |¡ | |g¡ |}qh|d  |¡ |D ]$\}	}
|	|
f|vsÂJ ‚|||	|
f< qªq(g }t| ¡ ƒD ].\\}	}
}tƒ }|	|_|
|_	||_
| |¡ qât|ƒ|dœ}|S )Nrç  c                 3   s   | ]}|ˆ v rˆ | V  qd S ru   rH   )r‰   r{   ©ÚglyphMaprH   rI   rŠ   ,  s   z$ClipList.preWrite.<locals>.<genexpr>r   r   rc  )Z	ClipCountr  )rP  rç  ÚgetReverseGlyphMapr  r–   r#  rª   r  r  r  r  r“   )rx   r˜   ZclipBoxRangesrF  rè  ri  r/  r]  rš   rD  r_  ZclipRecordsÚrecordr\  rH   r  rI   rj  &  s@    
ÿþzClipList.preWritec           	      C   s  |r|n| j j}|d u rg }t| dƒr6| d| jf¡ | ||¡ | ¡  t|  ¡  	¡ dd„ d�D ]Š\}}| d¡ | ¡  t|ƒD ]}|j
d|d� | ¡  q„| dd|jfg¡ | ¡  | ||¡ | d¡ | ¡  | d¡ | ¡  qb| |¡ | ¡  d S )	NrV  c                 S   s   t | d ƒS )Nr   )r  )rš  rH   rH   rI   ra   T  rb   z ClipList.toXML.<locals>.<lambda>r  ÚCliprk  rã   r  )rJ  r5   rP  rª   rV  r¸   r¯   r#  r  r–   r®   rl  r¹   )	rx   r×   r˜   r±   r°   Ú	tableNamerF  rè  r{   rH   rH   rI   r¼   J  s0    
ÿ





zClipList.toXMLc           
      C   sÐ   t | dd ƒ}|d u ri  | _}|dks*J ‚g }d }|D ]~}t|tƒsFq6|\}}}|dkrh| |d ¡ q6|dkr6tƒ }t|d ƒ|_|D ]*}t|tƒs˜qˆ|\}}}| ||||¡ qˆq6|rÌ|D ]}	|||	< q¾d S )Nrç  r#  rk  rŸ   r  rV  )	r¬   rç  r¾   r”   rª   r  r   rV  rÅ   )
rx   r°   r±   rÄ   r˜   rç  rF  rè  Úelemr{   rH   rH   rI   rÅ   e  s.    




zClipList.fromXML)N)NN)	r5   r6   r7   rv   rb  r  rj  r¼   rÅ   rH   rH   rH   rI   rÞ  ê  s   
+$
rÞ  c                   @   s   e Zd ZdZdZdZdS )Ú
ExtendModer   r   r(   N)r5   r6   r7   ÚPADÚREPEATZREFLECTrH   rH   rH   rI   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(   re   r)   rm   rï   rð   r*   rñ   rQ   rò   rO   ró   r†   rô   r+   é   é   é   é   é   é   é   rl   é   é   é   N)r5   r6   r7   ÚCLEARZSRCZDESTZSRC_OVERZ	DEST_OVERZSRC_INZDEST_INZSRC_OUTZDEST_OUTZSRC_ATOPZ	DEST_ATOPÚXORÚPLUSZSCREENÚOVERLAYZDARKENZLIGHTENZCOLOR_DODGEZ
COLOR_BURNZ
HARD_LIGHTZ
SOFT_LIGHTZ
DIFFERENCEZ	EXCLUSIONZMULTIPLYZHSL_HUEZHSL_SATURATIONZ	HSL_COLORZHSL_LUMINOSITYrH   rH   rH   rI   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(   re   r)   rm   rï   rð   r*   rñ   rQ   rò   rO   ró   r†   rô   r+   r*  r+  r,  r-  r.  r/  r0  rl   r1  r2  r3  é   é   é   r>  r,   c                 C   s   | j  d¡S )NÚPaintVar)r°   Ú
startswithrw   rH   rH   rI   r  È  s    zPaintFormat.is_variablec                 C   sB   |   ¡ r| S ztjd| jdd … › � W S  ty<   Y d S 0 d S )Nr<  rm   )r  r8  Ú__members__r°   ÚKeyErrorrw   rH   rH   rI   r  Ë  s    zPaintFormat.as_variableN)%r5   r6   r7   Ú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  rH   rH   rH   rI   r8  ¦  sD   r8  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   s8   z|   | j¡jW S  ty2   td| j› �ƒ‚Y n0 d S )NzUnknown Paint format: )r  rV  r°   ró  ÚNotImplementedErrorrw   rH   rH   rI   ÚgetFormatName×  s    zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d u rg }| d| jf¡ | ||¡ | |  ¡ ¡ | ¡  |  ||¡ | 	|¡ | ¡  d S )NrV  )
rJ  r5   rª   rV  r¸   r  rN  r¯   rl  r¹   )rx   r×   r˜   r±   r°   r$  rH   rH   rI   r¼   Ý  s    
zPaint.toXML)ÚcolrÚreturnc                 c   sè   | j tjkrPg }|jd u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 u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‰   ro   r`   rH   rH   rI   rŠ   ï  s   ÿz+Paint.iterPaintSubTables.<locals>.<genexpr>ræ  )r°   rŸ   z not in colr.BaseGlyphList)rV  r8  r@  Ú	LayerListrâ  rÖ   ZFirstLayerIndexZ	NumLayersrB  rà  rá  ræ  rk  r   rQ  r?  rÕ  Ú
tableClassÚ
issubclassrÊ   r¬   r°   )rx   rO  Úlayersr"  rÙ  rŸ   rH   rH   rI   ÚiterPaintSubTablesé  s(    
ÿþzPaint.iterPaintSubTables)rP  c                 C   s   dd„ |   |¡D ƒS )Nc                 S   s   g | ]
}|j ‘qS rH   rã   )r‰   ÚprH   rH   rI   r¦     rb   z%Paint.getChildren.<locals>.<listcomp>©rV  )rx   rO  rH   rH   rI   ÚgetChildren  s    zPaint.getChildren©rO  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 ru   rX  ©ÚpaintrZ  rH   rI   ra     rb   z Paint.traverse.<locals>.<lambda>©Ziter_subtables_fnrc  N)ÚcallableÚ	TypeErrorr   rŸ   )rx   rO  ÚcallbackÚpathr\  rH   rZ  rI   Ú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: )"rV  r8  rC  r   ÚxxÚyxÚxyÚyyÚdxÚdyrD  r   Ú	translaterE  rM   rU   rV   rF  ZcenterXZcenterYrG  rH  rI  Úrotater   ÚanglerJ  rK  ÚskewZ
xSkewAngleZ
ySkewAnglerL  r  rM  )rx   r  rH   rH   rI   ÚgetTransform  sX    ÿþÿÿþÿÿþÿÿþÿzPaint.getTransformr   r&   )rO  rÛ  rÜ  rP  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 u rtd S tƒ }ttjƒ|_t|j|ƒ\|_|_|_|_|S )Nc                    s
   |   ˆ ¡S ru   rX  r[  rZ  rH   rI   ra   C  rb   z&Paint.computeClipBox.<locals>.<lambda>r]  rc  c                 s   s   | ]}|j  ¡ V  qd S ru   )rŸ   rm  )r‰   rõ  rH   rH   rI   rŠ   I  rb   z'Paint.computeClipBox.<locals>.<genexpr>)r   r   rŸ   rV  r8  rA  r   r   r‚   r   rk  Údrawr   Úboundsr  r¨  r  r  r	   ÚxMinÚyMinÚxMaxÚyMax)	rx   rO  rÛ  rÜ  Úpenra  r\  ÚtransformationÚcbrH   rZ  rI   rã  >  s$    ÿ

ý
zPaint.computeClipBox)NN)r   )r5   r6   r7   r8  r  rN  r¼   rÒ  r"   r   rQ  rV  r#   rY  rb  r   rm  r¨  r$   r  rã  rH   rH   rH   rI   râ  Ô  s   
, ÿþrâ  )Ú
Mark1Array)ÚDefaultLangSys)ÚMarkCoverageÚBaseCoverageÚLigatureCoverageÚMark1CoverageÚMark2CoverageÚBacktrackCoverageÚInputCoverageÚLookAheadCoverageÚVertGlyphCoverageÚHorizGlyphCoverageÚTopAccentCoverageÚExtendedShapeCoverageÚMathKernCoverage)Ú	ClassDef1Ú	ClassDef2ÚBacktrackClassDefÚInputClassDefÚLookAheadClassDefÚGlyphClassDefÚMarkAttachClassDef)ÚEntryAnchorÚ
ExitAnchorÚ
BaseAnchorÚLigatureAnchorÚMark2AnchorÚ
MarkAnchor)Ú
XPlaDeviceÚ
YPlaDeviceÚ
XAdvDeviceÚ
YAdvDeviceÚXDeviceTableÚ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)ÚVertGlyphConstructionÚHorizGlyphConstruction)Ú	MarkArrayÚLangSysrO  r«  ÚAnchorÚDeviceZAxisZMinMaxZ	BaseCoordZJstfLangSysZJstfGSUBModListZJstfGPOSModListZJstfMaxZMathKernÚMathGlyphConstructionc                 C   s
  d}|j }|jdu r|d }|dk r(|S |jdkr8d}n|jdkrFd}| |j jjj}|| }|jd jj|krŽ|d }|dk r„|S || }q^t	|t
|ƒƒD ]d}|| }|j|krœ||_t	t
|jƒƒD ]8}|j| }t|j | }	|	ƒ }
d|
_||
_|
|j|< qÆqœd}|S )a#  Either the offset from the LookupList to a lookup overflowed, or
    an offset from a lookup to a subtable overflowed.

    The table layout is::

      GPSO/GUSB
              Script List
              Feature List
              LookUpList
                      Lookup[0] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents
                      ...
                      Lookup[n] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents

    If the offset to a lookup overflowed (SubTableIndex is None)
            we must promote the *previous* lookup to an Extension type.

    If the offset from a lookup to subtable overflowed, then we must promote it
            to an Extension Lookup type.
    r   Nr   rí  rð   rï  rñ   )ÚLookupListIndexÚSubTableIndexÚ	tableTyperö  rë  rð  rñ  rJ  Ú
LookupTyper$  r“   ÚlookupTypesrV  ÚExtSubTable)ÚttfÚoverflowRecordÚokr   ZextTypeÚlookupsÚlookupÚsiZsubTableZextSubTableClassÚextSubTablerH   rH   rI   ÚfixLookupOverFlows²  s<    





r­  c           
      C   s‚   d}t | j ¡ ƒ}t|ƒ}|jdv r.|d }n|jdkrB|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   ©rO  rR  r(   r£  r   )r#  r»   r–   r“   ÚitemNameÚ	itemIndexr$  )
ÚoldSubTableÚnewSubTabler§  r¨  Z
oldMappingÚoldLenÚnewLenro   rš  r   rH   rH   rI   ÚsplitMultipleSubstñ  s    




rµ  c           
      C   s”   d}t | dƒr| j|_t| j ¡ ƒ}t|ƒ}|jdv r@|d }n|jdkrT|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qd|S )Nr   rÂ  r®  r(   r½  r   )	rP  rÂ  r#  r¼  r–   r“   r¯  r°  r$  )
r±  r²  r§  r¨  ZoldAltsr³  r´  ro   rš  r   rH   rH   rI   ÚsplitAlternateSubst	  s     





r¶  c           
      C   s‚   d}t | j ¡ ƒ}t|ƒ}|jdv r.|d }n|jdkrB|jd }i |_t||ƒD ]*}|| }|d }	|d |j|	< | j|	= qR|S )Nr   r®  r(   rÆ  r   )r#  rÅ  r–   r“   r¯  r°  r$  )
r±  r²  r§  r¨  ZoldLigsr³  r´  ro   rš  r   rH   rH   rI   ÚsplitLigatureSubst(	  s    




r·  c           	         s  | }d}| j |_ | j dkrÈt| jƒdkrÈdD ]}t||t| |ƒƒ q,| j ¡ |_| jj}| j}t| jƒd ‰|d ˆ… | j_|d ˆ… | _|ˆd … |j_|ˆd … |_t| jƒ| _t|jƒ|_d}�nL| j dk�rt| j	ƒdk�rt
| dƒ�st| j	d jƒ| _dD ]}t||t| |ƒƒ �qd| _| j ¡ |_| j ¡ |_| jj}| jj}| j	}t| j	ƒd ‰t‡fd	d
„| ¡ D ƒƒ‰ ‡ fdd„|D ƒ| j_‡fdd„| ¡ D ƒ| j_|d ˆ… | _	‡ fdd„|D ƒ|j_‡fdd„| ¡ D ƒ|j_|ˆd … |_	t| j	ƒ| _t|j	ƒ|_d}|S )NFr   )ÚValueFormat1ÚValueFormat2r(   TÚClass2Countr   )rº  r‡  r¸  r¹  c                 3   s   | ]\}}|ˆ kr|V  qd S ru   rH   ©r‰   Úkr`   ©ÚoldCountrH   rI   rŠ   s	  rb   zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}|ˆ vr|‘qS rH   rH   rƒ  ©Ú	newGlyphsrH   rI   r¦   u	  rb   z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}|ˆ k r||“qS rH   rH   r»  r½  rH   rI   r  v	  s   z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}|ˆ v r|‘qS rH   rH   rƒ  r¿  rH   rI   r¦   {	  rb   c                    s"   i | ]\}}|ˆ kr||ˆ  “qS rH   rH   r»  r½  rH   rI   r  |	  s   )rV  r“   ÚPairSetr—   r¬   rO  rJ  rF  ÚPairSetCountÚClass1RecordrP  ÚClass2Recordrº  Ú	DontSharer†  r¬  r!  r–   ÚClass1Count)	r±  r²  r§  rõ  r¨  r°   Úcoverager³  r¬  rH   )rÀ  r¾  rI   ÚsplitPairPosB	  sX    
ÿ

ÿ
rÈ  c                 C   s–  | j }|dk rdS |d }|| }g g  }}g g  }}	t| jj| jjƒD ]J\}
}|j|k rp| |
¡ | |¡ qH| j|8  _| |
¡ |	 |¡ qHg g  }}| jj	D ]J}| 
¡ | 
¡  }}|jd |… |_|j|d … |_| |¡ | |¡ q¦| j|_|| j_| j 
¡ |_||j_| j|_|| _ ||_ || j_| j 
¡ |_|	|j_t|ƒ| j_t|	ƒ|j_|| j_	| j 
¡ |_||j_	t|ƒ| j_t|ƒ|j_dS )Nr(   FT)Ú
ClassCountr‚  ry  rF  r›  Ú
MarkRecordr°  rª   Ú	BaseArrayÚ
BaseRecordrJ  r�  rV  rz  r“   Ú	MarkCountÚ	BaseCount)r±  r²  r§  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsr{   Z
markRecordZoldBaseRecordsZnewBaseRecordsr´  ZoldBaseRecordZnewBaseRecordrH   rH   rI   ÚsplitMarkBasePos‰	  sR    

ÿ




rÏ  )r(   re   r)   )r(   r)   ©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 |_zt|j  | }W n& t�y
   t d|j |¡ Y dS 0 ||||ƒ}|�r0|j |d |
¡ |S )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    rÅ  Tr¥  ÚSubTableCountr   z)Don't know how to split %s lookup type %sF)r¢  rö  rë  rð  r   r¡  rñ  rP  rÅ  r¥  rJ  r£  r¤  rV  rÑ  Ú
splitTabler?  rW  Úerrorr}  )r¦  r§  rö  rª  ZsubIndexÚsubtableZsubTableTyper¬  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr²  Ú	splitFuncr¨  rH   rH   rI   ÚfixSubTableOverFlowsÞ	  sN    



ÿ
ýrÖ  c                  C   s|  dd l } ddlm} |  d¡}tƒ }|D ]d\}}t}| |¡}|r`| d¡}|d d }t|ƒ}||vr(t||fi ƒ}	|dv r„d|	_	|	||< q(|D ]R\}}
| 
d¡r’t|ƒdkr’|dd … |v r’|| }||dd …  }||_||_q’t ¡ D ]$\}}|| }|D ]}|||< �qqîttttttttd	œttttttttt d
œ	dt!it"t#t$t!t%dœdœa&t&d t&d< t& '¡ D ] }| ¡ D ]\}}	||	_(�qx�qldt)ia*t+ddƒD ]}t,t*d| < �q t+ddƒD ]}t-t*d| < �q¾ddl.m/} |D ]”\}}| |¡}|�rZ| 0¡ \}}t1|ƒ}|| }	t2|	dƒ�s.i |	_3i |	_4||dd … |ƒ\}}||	j3|< ||	j4|< n|| }	|||ƒ\|	_3|	_4�qâd S )Nr   r   )ÚotDataz([A-Za-z0-9]+)Format(\d+)$rÐ  TZVarre   )r   r(   re   r)   rm   rï   rð   r*   )	r   r(   re   r)   rm   rï   rð   r*   rñ   r)   )r   r   r(   r)   rm   )rí  rï  ÚmortÚmorxrï  ÚJSTFÚsizer.  zss%02déd   zcv%02d)ÚbuildConvertersÚ
converters)5Úrer×  r­   Úglobalsr   ÚmatchÚgroupr   rÊ   rÅ  r=  r“   Z	NoVarTypeZVarTypeÚ_equivalentsr–   rŠ  r¡  r»  rÄ  ÚContextSubstÚChainContextSubstÚExtensionSubstÚReverseChainSingleSubstÚ	SinglePosÚPairPosÚ
CursivePosÚMarkBasePosÚ
MarkLigPosÚMarkMarkPosÚ
ContextPosÚChainContextPosÚExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphr¤  r�   r£  rK  rI  r$  rM  rN  ZotConvertersrÝ  r  r¨  rP  rÞ  ÚconvertersByName)rß  r×  Z	formatPatÚ	namespacer°   rö  Z	baseClassÚmÚ
formatTyper²  r¡   ZvarTypeZ	noVarTypeÚbaser¿  rÀ  Z
lookupEnumÚenumro   rÝ  rh  rÞ  rñ  rH   rH   rI   Ú_buildClasses
  sž    



&ø÷ÿúç"ÿ

r÷  c                 C   s   | d u rg S | j S d S ru   )rF  )rÇ  rH   rH   rI   r‘  ‹
  s    r‘  )ƒÚ__doc__rz  rö  r   Ú	functoolsr   Úmathr   Ú	itertoolsÚcollectionsr   r   Z%fontTools.ttLib.tables.TupleVariationr   Z!fontTools.ttLib.tables.otTraverser   ÚfontTools.misc.arrayToolsr	   ÚfontTools.misc.roundToolsr
   ÚfontTools.misc.transformr   r   r   ÚfontTools.misc.textToolsr   r   r   ÚfontTools.misc.vectorr   ZfontTools.pens.boundsPenr   ÚfontTools.pens.transformPenr   ZotBaser   r   r   r   r   ÚfontTools.misc.fixedToolsr   r‡   r   r¥   r   r·   r   rÁ   Z fontTools.feaLib.lookupDebugInfor   r   Úloggingr]   ÚarrayÚsysr    Útypingr!   r"   r#   r$   r%   ÚfontTools.ttLib.ttGlyphSetr&   Ú	getLoggerr5   rW  r'   rJ   r<   r=   r>   r@   rA   rE   rF   rB   rC   r•   r«   r�   rq   rs   rt   rÑ   ÚobjectrØ   rÚ   rÜ   rë   r  r  r  r6  rG  rK  rM  rN  rO  r   rn  r  r…  rŠ  r¡  r«  r»  rÄ  rÒ  rë  r  rà  r  r  rÞ  r&  r)  r8  râ  rã  r­  rµ  r¶  r·  rÈ  rÏ  rÒ  rÖ  r÷  r‘  rH   rH   rH   rI   Ú<module>   s  
þ
ÿ
ÿóüü w"UA  [L7PKjFz9.
 . 		´U?G?üüõ;o