a
    ¥Q•h‚í  ã                   @   sl  d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	 ddl
mZ ddlmZ 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 ddlmZmZmZ ddlmZm Z m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, e -d¡Z.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: G dd„ de;ƒZ<G dd„ de<ƒZ=e= >ej?d¡dd„ ƒZ@dd„ ZAdgdd „ZBe= >ejC¡d!d„ ƒZ@e= >ejD¡d"d„ ƒZ@d#d$„ ZEd%d&„ ZFe= >ejG¡d'd„ ƒZ@e= >ejH¡d(d„ ƒZ@d)d*„ ZIdhd+d,„ZJdid-d.„ZKdjd0d1„ZLd2d3„ ZMe= >ejN¡d4d„ ƒZ@dkd7d8„ZOe= >ejP¡d9d„ ƒZ@e= >ejQ¡d:d„ ƒZ@d;d<„ ZRd=d>„ ZSd?d@„ ZTdAdB„ ZUdCdD„ ZVe= >ejW¡dEd„ ƒZ@e= >ejX¡dFd„ ƒZ@e= >ejY¡dGd„ ƒZ@G dHdI„ dIe=ƒZZeZ >ej[¡dJd„ ƒZ@eZ >ejD¡dKd„ ƒZ@eZ >ejC¡dLd„ ƒZ@G dMdN„ dNe=ƒZ\e\ >ej[¡dOd„ ƒZ@e\ >ejD¡dPd„ ƒZ@e\ >ejC¡dQd„ ƒZ@G dRdS„ dSe=ƒZ]dTdU„ Z^e] >ej_¡dVd„ ƒZ@e] >ej[¡dWd„ ƒZ@e] >ejD¡dXd„ ƒZ@e] >ejC¡dYd„ ƒZ@G dZd[„ d[e]ƒZ`e` >eja¡d\d„ ƒZ@e` >ejb¡d]d„ ƒZ@d^d_„ Zcd`da„ Zde` >ejeejff¡dbd„ ƒZ@e` >ejgejhf¡dcd„ ƒZ@e` >eji¡ddd„ ƒZ@e` >ejjde¡dfd„ ƒZ@dS )lz4
Merge OpenType Layout tables (GDEF / GPOS / GSUB).
é    N)Úior)ÚMAX_PAINT_COLR_LAYER_COUNTÚLayerReuseCache)ÚclassifyTools)ÚotRound)Úbuild_n_ary_tree)ÚotTables)ÚotBase)ÚBaseFixedValue)Údfs_base_table)ÚDefaultTable)ÚbuilderÚmodelsÚvarStore)ÚnonNoneÚallNoneÚallEqualÚ
allEqualToÚsubList)ÚVarStoreInstancer)Úreduce)ÚbuildSinglePos)Ú_compression_level_from_envÚcompact_pair_poszfontTools.varLib.mergeré   )ÚShouldBeConstantÚ
FoundANoneÚMismatchedTypesÚNotANoneÚLengthsDifferÚ
KeysDifferÚInconsistentGlyphOrderÚInconsistentExtensionsÚInconsistentFormatsÚUnsupportedFormatÚVarLibMergeErrorc                   @   sV   e Zd Zddd„Zeddd„ƒZei fdd„ƒZdd
d„Zdd„ Zdd„ Z	dd„ Z
dS )ÚMergerNc                 C   s   || _ d | _d S ©N)ÚfontÚttfs)Úselfr(   © r+   úP/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/varLib/merger.pyÚ__init__/   s    zMerger.__init__r'   c                    s^   ˆt ksJ dƒ‚dˆjvr i ˆ_tˆƒttjfv r8ˆf‰tˆ ƒtkrJˆ f‰ ‡ ‡‡fdd„}|S )NzSubclass Merger instead.Úmergersc                    sn   | j dksJ ‚g }ˆD ]R}||v r$q| |¡ ˆj |i ¡}ˆ D ]&}||vs^J d|j |f ƒ‚| ||< q@qd S )NÚmergez=Oops, class '%s' has merge function for '%s' defined already.)Ú__name__Úappendr.   Ú
setdefault)ÚmethodÚdoneÚclazzr.   Úattr©ÚattrsÚcelfÚclazzesr+   r,   Úwrapper>   s    

ÿÿzMerger.merger.<locals>.wrapper)r&   Ú__dict__r.   ÚtypeÚenumÚEnumMetaÚstr)r9   r:   r8   r;   r+   r7   r,   Úmerger4   s    
zMerger.mergerc                 C   sP   t |ƒ}|  ¡ D ]:} t| dd ƒ}|d u r, qL| j |d ¡}|d ur|  S q|S )Nr.   )r=   ÚmroÚgetattrr.   Úget)r9   ÚthingÚ_defaultÚtypr.   Úmr+   r+   r,   Ú
mergersForP   s    
zMerger.mergersForr+   c              
      s  t |dƒr|jdd� |D ]}t |dƒr|jdd� qtt|ƒ ¡ ƒ‰t‡fdd„|D ƒƒstt| ˆdd„ |D ƒd�‚|  |¡}| d	| j	j
¡}zLˆD ]B‰ ˆ |v r¢q”t|ˆ ƒ}‡ fd
d„|D ƒ}| ˆ |¡}	|	| ||ƒ q”W n8 t�y }
 z|
j dˆ  ¡ ‚ W Y d }
~
n
d }
~
0 0 d S )NÚensureDecompiledF)Úrecursec                 3   s"   | ]}ˆ t t|ƒ ¡ ƒkV  qd S r'   ©ÚsortedÚvarsÚkeys©Ú.0Úv©rO   r+   r,   Ú	<genexpr>f   ó    z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]}t t|ƒ ¡ ƒ‘qS r+   rL   rP   r+   r+   r,   Ú
<listcomp>h   rU   z'Merger.mergeObjects.<locals>.<listcomp>©ÚexpectedÚgotÚ*c                    s   g | ]}t |ˆ ƒ‘qS r+   ©rC   ©rQ   Útable©Úkeyr+   r,   rV   q   rU   Ú.)ÚhasattrrJ   rM   rN   rO   Úallr    rI   rD   Ú	__class__ÚmergeThingsrC   r%   Ústackr1   )r*   ÚoutÚlstÚexcludeÚitemr.   ZdefaultMergerÚvalueÚvaluesÚ
mergerFuncÚer+   )r_   rO   r,   ÚmergeObjects_   s.    

ÿ

zMerger.mergeObjectsc                 C   s”   t ||tƒs(t| t|ƒdd„ |D ƒd�‚tt|t|Ž ƒƒD ]T\}\}}z|  ||¡ W q: tyŒ } z|j d| ¡ ‚ W Y d }~q:d }~0 0 q:d S )Nc                 S   s   g | ]}t |ƒ‘qS r+   ©Úlen©rQ   Úxr+   r+   r,   rV   z   rU   z%Merger.mergeLists.<locals>.<listcomp>rW   z[%d])	r   rp   r   Ú	enumerateÚziprd   r%   re   r1   )r*   rf   rg   Úirj   rk   rm   r+   r+   r,   Ú
mergeListsx   s    zMerger.mergeListsc                 C   sÄ   t ||tƒs*t| t|ƒjdd„ |D ƒd�‚|  |¡ d d ¡}|d urR|| ||ƒ nnt|tjƒrxt ||ƒsÀt	| ||d�‚nHt
|dƒr�|  ||¡ n0t|tƒr¨|  ||¡ nt ||ƒsÀt	| ||d�‚d S )Nc                 S   s   g | ]}t |ƒj‘qS r+   )r=   r0   rq   r+   r+   r,   rV   …   rU   z&Merger.mergeThings.<locals>.<listcomp>rW   r<   )r   r=   r   r0   rI   rD   Ú
isinstancer>   ÚEnumr   ra   rn   Úlistrv   )r*   rf   rg   rl   r+   r+   r,   rd   ‚   s     ÿ



zMerger.mergeThingsc                    st   |D ]j‰ ˆ |vrqz(|| _ |  |ˆ  ‡ fdd„|D ƒ¡ W q tyl } z|j ˆ ¡ ‚ W Y d }~qd }~0 0 qd S )Nc                    s   g | ]}|  ˆ ¡‘qS r+   ©rD   ©rQ   rH   ©Útagr+   r,   rV   �   rU   z&Merger.mergeTables.<locals>.<listcomp>)r)   rd   r%   re   r1   )r*   r(   Úmaster_ttfsÚ	tableTagsrm   r+   r|   r,   ÚmergeTables—   s    "zMerger.mergeTables)N)r'   )r+   )r0   Ú
__module__Ú__qualname__r-   ÚclassmethodrA   rI   rn   rv   rd   r€   r+   r+   r+   r,   r&   .   s   


r&   c                   @   s   e Zd ZdS )ÚAligningMergerN)r0   r�   r‚   r+   r+   r+   r,   r„   ¦   s   r„   ÚGlyphClassDefc                    s¶   |d u r"t |ƒst| d |d�‚d S dd„ |D ƒ}i |_|j}tƒ }|jdd„ |D ƒŽ  |D ]V‰ t‡ fdd„|D ƒƒ}t|ƒs–t| |d |dˆ  gd	�‚|s¤d |ˆ < qZ|d |ˆ < qZd S )
NrW   c                 S   s   g | ]
}|j ‘qS r+   )Ú	classDefs©rQ   Úlr+   r+   r,   rV   ±   rU   úmerge.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r+   rS   r‡   r+   r+   r,   rV   ·   rU   c                 3   s   | ]}|  ˆ ¡V  qd S r'   rz   r‡   ©Úkr+   r,   rT   ¹   rU   úmerge.<locals>.<genexpr>r   r`   )rX   rY   re   )r   r   r†   ÚsetÚupdater   r   r   )rA   r*   rg   ZallKeysZ	allValuesr+   rŠ   r,   r/   ª   s$    ÿ
r/   c                    sT   ˆ j dkrˆ S t ¡ }d|_ ˆ j|_ˆ j|_‡ fdd„|jjD ƒ|_t|jƒ|_|S )Né   c                    s   g | ]
}ˆ j ‘qS r+   ©ÚValue©rQ   Ú_©r*   r+   r,   rV   Ì   rU   z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	ÚFormatÚotÚ	SinglePosÚCoverageÚValueFormatÚglyphsr‘   rp   Ú
ValueCount)r*   Úretr+   r”   r,   Ú_SinglePosUpgradeToFormat2Ä   s    
r�   c                    sÂ   |du rdd„ |D ƒ}ndd„ t ||ƒD ƒ}tƒ }|j|Ž  |  ¡ j‰t|ˆd�‰t‡fdd„|D ƒƒsntƒ ‚~d}|du r’‡ ‡fdd„|D ƒ}n(t|ƒt|ƒks¦J ‚‡ ‡fd	d„|D ƒ}ˆ|fS )
aT  Takes font and list of glyph lists (must be sorted by glyph id), and returns
    two things:
    - Combined glyph list,
    - If values_lst is None, return input glyph lists, but padded with None when a glyph
      was missing in a list.  Otherwise, return values_lst list-of-list, padded with None
      to match combined glyph lists.
    Nc                 S   s   g | ]}t |ƒ‘qS r+   )r�   r‡   r+   r+   r,   rV   Û   rU   z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d„ t ||ƒD ƒ‘qS )c                 S   s   i | ]\}}||“qS r+   r+   )rQ   ÚgrR   r+   r+   r,   Ú
<dictcomp>Ý   rU   z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rt   )rQ   rˆ   Úvsr+   r+   r,   rV   Ý   rU   r^   c                 3   s   | ]}t |ˆ d �|kV  qdS )r^   N)rM   ©rQ   r    )ÚsortKeyr+   r,   rT   ä   rU   z%_merge_GlyphOrders.<locals>.<genexpr>c                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s   g | ]}|ˆv r|nˆ ‘qS r+   r+   ©rQ   Úglyph©ÚdefaultÚdict_setr+   r,   rV   ë   rU   ú1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r+   ©rQ   ©r¦   Úorder©r§   r,   rV   ê   s   ÿc                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s    g | ]}|ˆv rˆ| nˆ ‘qS r+   r+   r£   r¥   r+   r,   rV   ñ   rU   r¨   r+   r©   rª   r¬   r,   rV   ð   s   ÿ)	rt   r�   rŽ   ÚgetReverseGlyphMapÚ__getitem__rM   rb   r!   rp   )r(   rg   Z
values_lstr¦   Z	dict_setsÚcombinedZpaddedValuesÚpaddedr+   )r¦   r«   r¢   r,   Ú_merge_GlyphOrdersÒ   s(    

þþr±   c                 C   s    |d j  ¡ |_ |  ||¡ d S ©Nr   ©r<   Úcopyrn   ©rA   r*   rg   r+   r+   r,   r/   ÷   s    c                 C   s    |d j  ¡ |_ |  ||¡ d S r²   r³   rµ   r+   r+   r,   r/   ÿ   s    c                 C   s~   |D ]t}|d u st |ƒtjks|jd u s||jjvr6q|jdkrJ|j  S |jdkrl|j|jj |¡   S t| dd�‚qd S )Nr   r�   úsingle positioning lookup©Úsubtable)	r=   r–   r—   r˜   rš   r•   r‘   Úindexr$   )rA   Ú	subtablesr¤   r*   r+   r+   r,   Ú%_Lookup_SinglePos_get_effective_value  s     ÿþý
ü


r»   c           
      C   sÎ   |D ]Ä}|d u st |ƒtjks|jd u s||jjvr6q|jdkr~|j|jj |¡ }|j}|D ]}|j	|kr^|    S q^qq|jdkr¼|j
j |d¡}|jj |d¡}	|j| j|	   S t| dd�‚qd S )Nr   r�   r   úpair positioning lookupr·   )r=   r–   ÚPairPosr˜   rš   r•   ÚPairSetr¹   ÚPairValueRecordÚSecondGlyphÚ	ClassDef1r†   rD   Ú	ClassDef2ÚClass1RecordÚClass2Recordr$   )
rA   rº   Ú
firstGlyphZsecondGlyphr*   ÚpsÚpvrÚrecZklass1Zklass2r+   r+   r,   Ú(_Lookup_PairPos_get_effective_value_pair  s.    ÿþý
ü


rÉ   c           
         sº  t tjdd„ |D ƒdƒ |_‰t|ƒdksBˆd@ dksBt| dd�‚|jj‰ tdd	„ |D ƒƒr²t‡ fd
d	„|D ƒƒr²t	 
ˆ|j¡|_ˆdkr¢|  |jdd„ |D ƒ¡ |j ¡ |_d S d|_dd„ |D ƒ}t| jdd„ |D ƒdd„ |D ƒƒ\}}||j_‡fdd„|D ƒ|_t|jƒ|_t|ƒD ]^\}}t|ƒD ]J\}}|| d u�rF�q,t| | j| |ƒ}	|	d u �rlt	 
ˆ¡}	|	||< �q,�q|  |j|¡ | j||dd� t tjdd„ |jD ƒdƒ|_d S )Nc                 S   s   g | ]
}|j ‘qS r+   ©r™   r‡   r+   r+   r,   rV   6  rU   r‰   r   r   iðÿÿÿr¶   r·   c                 s   s   | ]}|j d kV  qdS )r   N©r•   rP   r+   r+   r,   rT   <  rU   rŒ   c                 3   s   | ]}ˆ |j jkV  qd S r'   ©r˜   rš   rP   )ÚcoverageGlyphsr+   r,   rT   <  s   c                 S   s$   g | ]}|j d ur|j nt ¡ ‘qS r'   )r‘   r	   ÚValueRecordrP   r+   r+   r,   rV   F  rU   r�   c                 S   s   g | ]}t |ƒ‘qS r+   )r�   rP   r+   r+   r,   rV   M  rU   c                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   Q  rU   c                 S   s   g | ]
}|j ‘qS r+   r�   rP   r+   r+   r,   rV   Q  rU   c                    s   g | ]}t  ˆ ¡‘qS r+   )r	   rÎ   r’   )ÚvalueFormatr+   r,   rV   U  rU   )r•   r˜   r‘   r›   r™   ©rh   c                 S   s   g | ]}|  ¡ ‘qS r+   )ÚgetEffectiveFormatrP   r+   r+   r,   rV   n  rU   )r   ÚintÚ__or__r™   rp   r$   r˜   rš   rb   r	   rÎ   r‘   rd   Ú	getFormatr•   r±   r(   r›   rs   r»   Úlookup_subtablesrv   rn   )
rA   r*   rg   rš   r°   ru   rk   Újr¤   rR   r+   )rÍ   rÏ   r,   r/   4  sP    ÿþÿÿ

ÿÿc                 C   sp  t | jdd„ |D ƒdd„ |D ƒƒ\}}g  |_}|D ]L}t ¡ }||_| jrXt | j¡nd |_| j	rpt | j	¡nd |_
| |¡ q4t|jƒ|_t|ƒD ]Â\}}	t|ƒD ]°\}
}t ¡ }||_|	|
 d urÒ|	|
 }nt| | j| |j|ƒ}|d u rúd\}}nt|dd ƒ}t|dd ƒ}| j�r*tj| j|d�nd |_| j	�rHtj| j	|d�nd |_
||	|
< q¦q–|`|  |j|¡ d S )Nc                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   g | ]
}|j ‘qS r+   ©rÀ   rP   r+   r+   r,   rV   w  rU   z$merge.<locals>.<listcomp>.<listcomp>©r¿   r¡   r+   r+   r,   rV   w  rU   r‰   c                 S   s   g | ]
}|j ‘qS r+   rØ   r¡   r+   r+   r,   rV   x  rU   )NNÚValue1ÚValue2)Úsrc)r±   r(   r¿   r–   rÀ   ÚvalueFormat1r	   rÎ   rÙ   ÚvalueFormat2rÚ   r1   rp   ÚPairValueCountrs   rÉ   rÕ   Ú_firstGlyphrC   rv   )rA   r*   rg   rš   r°   Úpvrsr¤   rÇ   ru   rk   rÖ   rR   ZvpairÚv1Úv2r+   r+   r,   r/   r  sN    ý
ÿÿ
ÿ
ÿýÿýc                 C   sº   t dd„ |D ƒƒsJ dƒ‚|j| |dd� t ¡ }g |_d|_t|jdd„ |D ƒdd„ |D ƒ|d	�\}}|| j_	d
d„ |D ƒ| _t
| jƒ| _t|| jƒD ]\}}||_q˜| | j|¡ d S )Nc                 S   s   g | ]}|j r|jd k‘qS ©r   ©r¾   ÚValueFormat2r‡   r+   r+   r,   rV   ª  rU   z)_PairPosFormat1_merge.<locals>.<listcomp>úReport bug against fonttools.)r˜   r¾   ÚPairSetCountÚValueFormat1rå   rÐ   r   c                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   »  rU   c                 S   s   g | ]
}|j ‘qS r+   ©r¾   rP   r+   r+   r,   rV   ¼  rU   ©r¦   c                 S   s   g | ]}t  ¡ ‘qS r+   )r–   r¾   r’   r+   r+   r,   rV   Á  rU   )r   rn   r–   r¾   r¿   rÞ   r±   r(   r˜   rš   rp   rç   rt   rß   rv   )r*   rg   rA   Úemptyrš   r°   r¤   rÆ   r+   r+   r,   Ú_PairPosFormat1_merge¨  s2    ÿþýü
rì   c           
      C   sÆ   t | tƒr| }n| r | jr | jni }|r4t| ¡ ƒnd}g }t|d ƒD ]}| tƒ ¡ qH| ¡ D ]\}}||  	|¡ qb|d u rŒd |d< n6t|ƒ |d< }|dd … D ]}	|	 
|¡ | |	¡ q¨|S )Nr   r   )rw   Údictr†   Úmaxrk   Úranger1   r�   ÚitemsÚaddÚintersection_updateÚdifference_update)
r*   Ú	allGlyphsr†   rH   rœ   r“   r‹   rR   Zclass0Úsr+   r+   r,   Ú_ClassDef_invertÉ  s     


rö   c                 C   sÀ   t  ¡ }i  |_}|d u }|r,d gt| ƒ }t ¡ }t| |ƒD ]0\}}t||ƒ}|d u rd|dd … }| |¡ q>| 	¡ }	|rŠ|	 
dtƒ ¡ t|	ƒD ]$\}
}|
dkr¤q’|D ]}|
||< q¨q’||	fS )Nr   r   )r–   ÚClassDefr†   rp   r   Z
Classifierrt   rö   rŽ   Z
getClassesÚinsertr�   rs   )rg   ZallGlyphsesr*   r†   ZallGlyphsesWasNoneZ
classifierZclassDefrô   ZsetsÚclassesru   ÚclassSetrž   r+   r+   r,   Ú_ClassDef_merge_classifyå  s(    

rû   Fc                 C   s  dd„ |D ƒ}t dd„ |D ƒdd„ |D ƒƒ\| _}t|ƒ| _g }t||ƒD ]î\}}d }	t|jjƒ}
|jj}g }|D ]º}t	t
|ƒƒ}||
v�rd }	|	d u �rt ¡ }	g  }|	_t|jƒD ]P}|rÄd }n8t ¡ }| jrÞt | j¡nd |_| jröt | j¡nd |_| |¡ q¶|	}n| |d¡}|| }| |¡ qr| |¡ qJ|}~t dd„ |D ƒƒ\| _}t|ƒ| _g }t||ƒD ]š\}}|jj}g }|D ]t}|j}t ¡ }g  }|_|D ]F}|�s¼|d }n t	t
|ƒƒ}| |d¡}|| }| t |¡¡ �q¨| |¡ �qˆ| |¡ �qp|}~|S )Nc                 S   s   g | ]
}|j ‘qS r+   )rÃ   r‡   r+   r+   r,   rV     rU   z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   )rÁ   r‡   r+   r+   r,   rV     rU   c                 S   s   g | ]}|j j‘qS r+   rÌ   r‡   r+   r+   r,   rV     rU   r   c                 S   s   g | ]
}|j ‘qS r+   )rÂ   r‡   r+   r+   r,   rV   4  rU   )rû   rÁ   rp   ÚClass1Countrt   r�   r˜   rš   r†   ÚnextÚiterr–   rÃ   rÄ   rï   ÚClass2Countrè   r	   rÎ   rÙ   rå   rÚ   r1   rD   rÂ   r´   Údeepcopy)r*   rg   r(   ÚtransparentÚmatricesrù   Znew_matricesrˆ   ÚmatrixZnullRowÚcoverageZ	classDef1Zclass1Recordsrú   ZexemplarGlyphZclass2recordsr“   Zrec2Zrec1ÚklassZ	classDef2Zrec1oldZoldClass2RecordsZrec1newZclass2Recordsr+   r+   r,   Ú_PairPosFormat2_align_matrices   sx    ÿ




ÿýÿý


r  c                 C   s¬   t dd„ |D ƒƒsJ dƒ‚|j| |dd� t|jdd„ |D ƒƒ\}}|| j_t||jƒD ]$\}}|jj|krX||d ksXJ ‚qXt| ||jƒ}t	|d ƒ| _
| | j
|¡ d S )	Nc                 S   s   g | ]}|j r|jd k‘qS rã   ©rÃ   rå   r‡   r+   r+   r,   rV   P  rU   z)_PairPosFormat2_merge.<locals>.<listcomp>ræ   )r˜   rÁ   rü   rÂ   rÿ   rÃ   rè   rå   rÐ   c                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   c  rU   éÿÿÿÿr   )r   rn   r±   r(   r˜   rš   rt   rÕ   r  ry   rÃ   rv   )r*   rg   rA   rš   r“   rˆ   rº   r  r+   r+   r,   Ú_PairPosFormat2_mergeN  s$    ÿþý	r	  c                 C   sl  t tjdd„ |D ƒdƒ | _|_t tjdd„ |D ƒdƒ | _|_|jdkrXt||| ƒ n$|jdkrpt	||| ƒ nt
| dd�‚| `| `d}d}|jdkrð|jD ]P}|jD ]D}t|d	d ƒ}|d urÊ|| ¡ O }t|d
d ƒ}|d ur¦|| ¡ O }q¦qœnl|jdk�r\|jD ]X}	|	jD ]J}
t|
d	d ƒ}|d u�r2|| ¡ O }t|
d
d ƒ}|d u�r|| ¡ O }�q�q||_||_d S )Nc                 S   s   g | ]
}|j ‘qS r+   ©rè   r‡   r+   r+   r,   rV   z  rU   r‰   r   c                 S   s   g | ]
}|j ‘qS r+   ©rå   r‡   r+   r+   r,   rV   }  rU   r   r�   r¼   r·   rÙ   rÚ   )r   rÒ   rÓ   rÜ   rè   rÝ   rå   r•   rì   r	  r$   r¾   r¿   rC   rÔ   rÃ   rÄ   )rA   r*   rg   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr+   r+   r,   r/   w  sD    ÿÿ








ÚMarkÚBasec                    sx  t dd„ |D ƒƒ| _t|j‡fdd„|D ƒ‡fdd„|D ƒƒ\}}|t| ˆd ƒ_t|j‡ fdd„|D ƒ‡ fdd„|D ƒƒ\}}|t| ˆ d ƒ_g }	t|t|Ž ƒD ]Œ\}
}d	d„ |D ƒ}t|ƒsÔt||d
 |d�‚nPt	 
¡ }|d
 |_dd„ |D ƒ}t|ƒ�rd }nt	 ¡ }d|_| ||¡ ||_|	 |¡ q¢t	 ¡ }|	|_
t|	ƒ|_t| ˆd |ƒ g }	t|t|Ž ƒD ]Ä\}
}t|ƒ�r‚d }n tt	ˆ d ƒƒ }g }t|ˆ d |ƒ ‡ fdd„|D ƒ}|D ] }| d g| jt|ƒ  ¡ �q¼t|Ž D ]:}t|ƒ�rúd }nt	 ¡ }d|_| ||¡ | |¡ �qæ|	 |¡ �qjtt	ˆ d ƒƒ }t|ˆ d |	ƒ t|ˆ d t|	ƒƒ t| ˆ d |ƒ d S )Nc                 s   s   | ]}|j V  qd S r'   )Ú
ClassCountr‡   r+   r+   r,   rT   ¤  rU   z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                    s   g | ]}t |ˆ d  ƒj‘qS ©r˜   ©rC   rš   r‡   ©r  r+   r,   rV   ¨  rU   z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    s   g | ]}t |ˆ d  ƒj‘qS )ÚArray)rC   Ú
MarkRecordr‡   r  r+   r,   rV   ©  rU   r˜   c                    s   g | ]}t |ˆ d  ƒj‘qS r  r  r‡   ©r  r+   r,   rV   ¯  rU   c                    s$   g | ]}t t |ˆ d  ƒˆ d ƒ‘qS )r  ÚRecordr[   r‡   r  r+   r,   rV   °  rU   c                 S   s   g | ]}|d ur|j ‘qS r'   )ÚClass©rQ   Úrr+   r+   r,   rV   ·  rU   r   rW   c                 S   s   g | ]}|d u rd n|j ‘qS r'   )Ú
MarkAnchorr  r+   r+   r,   rV   Î  rU   r   r  r  ÚAnchorc                    s&   g | ]}|d u rg nt |ˆ d ƒ‘qS )Nr  r[   r  r  r+   r,   rV   å  s   ÚCount)rî   r  r±   r(   rC   rš   rt   r   r   r–   r  r  r   r  r•   rd   r  r1   Ú	MarkArrayrp   Ú	MarkCountÚsetattrÚextend)r*   rg   rA   r  r  ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsÚrecordsrž   ÚglyphRecordsZ
allClassesrÈ   Z
allAnchorsÚanchorÚarrayÚanchorsZglyphAnchorsrˆ   r+   )r  r  r,   Ú_MarkBasePosFormat1_merge£  sp    ýý




ÿ
r%  c                 C   sZ   t |jdd„ |D ƒƒs2t| d|jdd„ |D ƒd�‚|jdkrJt||| ƒ nt| dd�‚d S )	Nc                 s   s   | ]}|j V  qd S r'   rË   r‡   r+   r+   r,   rT   û  rU   rŒ   zmark-to-base positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rË   r‡   r+   r+   r,   rV      rU   r‰   ©r¸   rX   rY   r   r·   ©r   r•   r#   r%  r$   rµ   r+   r+   r,   r/   ù  s    ü
c                 C   s^   t |jdd„ |D ƒƒs2t| d|jdd„ |D ƒd�‚|jdkrNt||| dd	ƒ nt| dd
�‚d S )Nc                 s   s   | ]}|j V  qd S r'   rË   r‡   r+   r+   r,   rT   
  rU   rŒ   zmark-to-mark positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rË   r‡   r+   r+   r,   rV     rU   r‰   r&  r   ZMark1ZMark2r·   r'  rµ   r+   r+   r,   r/     s    ü
c                 C   sŽ   t  ¡ }t  ¡ |_t|dd„ | D ƒdd„ | D ƒƒ\}}||j_g  |_}t|Ž D ],}|D ]}|d urX| |¡  qPqXdsPJ ‚qPt|jƒ|_	|S )Nc                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   g | ]
}|j ‘qS r+   r×   rP   r+   r+   r,   rV     rU   z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>rØ   r¡   r+   r+   r,   rV     rU   z$_PairSet_flatten.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   rØ   r¡   r+   r+   r,   rV     rU   F)
r–   r¾   r˜   r±   rš   r¿   rt   r1   rp   rÞ   )rg   r(   r*   rš   r°   rà   rk   rR   r+   r+   r,   Ú_PairSet_flatten  s"    
ý


r(  c                    sº   t dd„ | D ƒƒsJ dƒ‚t ¡ }d|_t ¡ |_ttjdd„ | D ƒdƒ|_ttjdd„ | D ƒdƒ|_	t
ˆ dd„ | D ƒd	d„ | D ƒƒ\}}||j_‡ fd
d„t|Ž D ƒ|_t|jƒ|_|S )Nc                 S   s   g | ]}|j r|jd k‘qS rã   rä   r‡   r+   r+   r,   rV   2  rU   z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>ræ   r   c                 S   s   g | ]
}|j ‘qS r+   r
  r‡   r+   r+   r,   rV   8  rU   r   c                 S   s   g | ]
}|j ‘qS r+   r  r‡   r+   r+   r,   rV   9  rU   c                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   =  rU   c                 S   s   g | ]
}|j ‘qS r+   ré   rP   r+   r+   r,   rV   =  rU   c                    s    g | ]}t d d„ |D ƒˆ ƒ‘qS )c                 S   s   g | ]}|d ur|‘qS r'   r+   rP   r+   r+   r,   rV   B  rU   zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r(  )rQ   rk   ©r(   r+   r,   rV   A  s   ÿ)r   r–   r½   r•   r˜   r   rÒ   rÓ   rè   rå   r±   rš   rt   r¾   rp   rç   )rg   r(   r*   rš   r°   r+   r)  r,   Ú(_Lookup_PairPosFormat1_subtables_flatten0  s&    ÿþ
ÿ
þr*  c                 C   s  t dd„ | D ƒƒsJ dƒ‚t ¡ }d|_t ¡ |_ttjdd„ | D ƒdƒ|_ttjdd„ | D ƒdƒ|_	t
|dd„ | D ƒƒ\}}||j_t|| |d	d
�}g  }|_t|Ž D ]^}t ¡ }| |¡ g |_|j}ttdd„ |D ƒƒŽ D ]$}	ttdd„ |	D ƒƒƒ}
| |
¡ qàq¨|S )Nc                 S   s   g | ]}|j r|jd k‘qS rã   r  r‡   r+   r+   r,   rV   K  rU   z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>ræ   r�   c                 S   s   g | ]
}|j ‘qS r+   r
  r‡   r+   r+   r,   rV   Q  rU   r   c                 S   s   g | ]
}|j ‘qS r+   r  r‡   r+   r+   r,   rV   R  rU   c                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   U  rU   T)r  c                 s   s   | ]}|j V  qd S r'   )rÄ   r  r+   r+   r,   rT   `  rU   z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s   | ]}|d ur|V  qd S r'   r+   ©rQ   Úcr+   r+   r,   rT   a  rU   )r   r–   r½   r•   r˜   r   rÒ   rÓ   rè   rå   r±   rš   r  rÃ   rt   r1   rÄ   ry   rý   rþ   )rg   r(   r*   rš   r“   r  r  ÚrowsÚrowÚcolsÚcolr+   r+   r,   Ú(_Lookup_PairPosFormat2_subtables_flattenI  s.    ÿþ


r1  c                 C   s    t | ƒ} t| ƒ}d}||k r4| | jdkr4|d7 }qt| d|… |ƒg| d|…< t| ƒ}|}|dkr€| |d  jdkr€|d8 }q\t| |d… |ƒg| |d…< | S )zÍMerge multiple Format1 subtables at the beginning of lst,
    and merge multiple consecutive Format2 subtables that have the same
    Class2 (ie. were split because of offset overflows).  Returns new list.r   r   Nr�   )ry   rp   r•   r*  r1  )rg   r(   rˆ   ru   r+   r+   r,   Ú&_Lookup_PairPos_subtables_canonicalizeg  s    

r2  c                 C   sè   t |dd„ | D ƒd ƒ\}}t|ƒ}t ¡ }d|_||_t ¡ |_||j_||_d g| |_	| D ]‚}|jdkrœ|j	}|jjD ]}	| 
|	¡}
t |¡|j	|
< qzq^|jdkr^t|jjƒD ],\}}	|j	| }| 
|	¡}
t |¡|j	|
< q²q^|gS )Nc                 S   s   g | ]}|j j‘qS r+   rÌ   rP   r+   r+   r,   rV   }  rU   z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>r�   r   )r±   rp   r–   r—   r•   r™   r˜   rš   r›   r‘   r¹   r´   r   rs   )rg   r(   Zmin_inclusive_rec_formatrš   r“   Ú
num_glyphsÚnewZ	singlePosZval_recÚgnameru   rÖ   r+   r+   r,   Ú#_Lookup_SinglePos_subtables_flatten|  s*    





r6  c                 C   s¤   t | jdd„ |D ƒdd„ |D ƒƒ\}}d|_t ¡ |_||j_g |_|D ]<}t ¡ }t ¡ |_d|j_t ¡ |_	d|j	_|j 
|¡ qH|  |j|¡ t|jƒ|_d S )Nc                 S   s   g | ]}|j j‘qS r+   rÌ   r‡   r+   r+   r,   rV   ™  rU   r‰   c                 S   s   g | ]
}|j ‘qS r+   )ÚEntryExitRecordr‡   r+   r+   r,   rV   š  rU   r   )r±   r(   r•   r–   r˜   rš   r7  r  ÚEntryAnchorÚ
ExitAnchorr1   rv   rp   ÚEntryExitCount)rA   r*   rg   rš   r°   r“   rÈ   r+   r+   r,   r/   ”  s$    ý


c                 C   s@   t dd„ |D ƒƒrd |_t dd„ |D ƒƒr0d |_|  ||¡ d S )Nc                 s   s   | ]}|j d u V  qd S r'   )r8  ©rQ   Úmasterr+   r+   r,   rT   ®  rU   rŒ   c                 s   s   | ]}|j d u V  qd S r'   )r9  r;  r+   r+   r,   rT   °  rU   )rb   r8  r9  rn   rµ   r+   r+   r,   r/   ¬  s
    c                    s  dd„ |D ƒ }ˆ _ tt||ƒƒ||jfg D ]’\}}|s<q.|d jj d¡r.tdd„ |D ƒƒsxtˆ ddd„ |D ƒd�‚tdd„ |D ƒƒs’tˆ ƒ‚|d j	|_
d	d„ |D ƒ}|d d …= | |¡ q.|joØt|jd tjƒ}|�r
t|jˆ jƒ|_‡ fd
d„|D ƒ }ˆ _ n”|j�o"t|jd tjƒ}|�rždd„ |D ƒ‰t‡fdd„ˆD ƒƒ�sšdd„ |D ƒ}	tt|	ƒ‰t|jˆ jˆƒ|_‡ ‡fdd„|D ƒ }ˆ _ d}
nd}
ˆ  |j|¡ t|jƒ|_|�r¦t|jƒdk�rà|jd jdk�säJ ‚|jd jj�s|j d¡ | jd8  _t|jƒdk�r0|jd jdk�s4J ‚|jd jj�s^|j d¡ | jd8  _ˆ jjjdtƒ d�}|dk�rìt  !d¡ t"ˆ j||jƒ|_t|jƒ|_nF|�rì|
�rì|jd }|jj}dd„ t||j#ƒD ƒ}t$|ˆ j %¡ ƒ|_ˆ j&||ddgd� ˆ ` d S )Nc                 S   s   g | ]
}|j ‘qS r+   )ÚSubTabler‡   r+   r+   r,   rV   ·  rU   r‰   r   Ú	Extensionc                 S   s   g | ]
}|j ‘qS r+   ©rc   ©rQ   Ústr+   r+   r,   rV   ¾  rU   c                 S   s   g | ]}|j j‘qS r+   )rc   r0   r@  r+   r+   r,   rV   Â  rU   rW   c                 S   s   g | ]
}|j ‘qS r+   )ÚExtensionLookupTyper@  r+   r+   r,   rV   Ä  rU   c                 S   s   g | ]
}|j ‘qS r+   )ÚExtSubTabler@  r+   r+   r,   rV   Ç  rU   c                    s   g | ]}t |ˆ jƒ‘qS r+   )r2  r(   r@  ©rA   r+   r,   rV   Ô  s   c                 S   s   g | ]}t |ƒ‘qS r+   ro   r@  r+   r+   r,   rV   Ú  rU   c                    s   g | ]}|ˆ d  k‘qS rã   r+   )rQ   Únums)ÚnumSubtablesr+   r,   rV   Û  rU   c                 S   s   g | ]}|D ]
}|j ‘qqS r+   rÊ   )rQ   rA  Útr+   r+   r,   rV   ß  rU   c                    s   g | ]}t |ˆ jˆƒ‘qS r+   )r6  r(   r@  )rA   Úmirfr+   r,   rV   å  s   ÿTFr   r  r�   z0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELrê   zCompacting GPOS...c                 S   s   i | ]\}}||“qS r+   r+   )rQ   r5  Z	valRecordr+   r+   r,   rŸ     s   úmerge.<locals>.<dictcomp>r=  ÚSubTableCountrÐ   )'rÕ   ry   rt   r=  rc   r0   Ú
startswithr   r"   rB  Ú
LookupTyper  rw   r–   r½   r2  r(   r—   rb   r   r   r6  rv   rp   rJ  r•   r˜   rš   ÚpopÚcfgrD   r   ÚlogÚinfor   r‘   r   r­   rn   )rA   r*   rg   rº   rˆ   ÚstsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedÚlevelZsinglePosTablerš   ZsinglePosMappingr+   )rA   rH  rF  r,   r/   µ  sŠ    "ý
ÿ
ÿ

ÿþ&&þ



ÿ
ÿc                   @   s   e Zd ZdZdd„ ZdS )ÚInstancerMergerzLA merger that takes multiple master fonts, and instantiates
    an instance.c                 C   s(   t  | |¡ || _|| _| |¡| _d S r'   )r&   r-   ÚmodelÚlocationÚgetMasterScalarsÚmasterScalars)r*   r(   rT  rU  r+   r+   r,   r-   #  s    zInstancerMerger.__init__N©r0   r�   r‚   Ú__doc__r-   r+   r+   r+   r,   rS    s   rS  c                 C   s>   |j dksJ ‚dd„ |D ƒ}| j}| j}t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r+   ©Ú
Coordinate©rQ   Úar+   r+   r,   rV   -  rU   r‰   )r•   rT  rW  r   ÚinterpolateFromValuesAndScalarsr[  )rA   r*   rg   ÚCoordsrT  rW  r+   r+   r,   r/   *  s    
ÿc                 C   s^   |j dksJ ‚dd„ |D ƒ}dd„ |D ƒ}| j}| j}t| ||¡ƒ|_t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r+   ©ÚXCoordinater\  r+   r+   r,   rV   8  rU   r‰   c                 S   s   g | ]
}|j ‘qS r+   ©ÚYCoordinater\  r+   r+   r,   rV   9  rU   )r•   rT  rW  r   r^  ra  rc  )rA   r*   rg   ZXCoordsZYCoordsrT  rW  r+   r+   r,   r/   5  s    
ÿ
ÿc                    sd   | j }| j}dD ]N\‰ }t||ƒr&J ‚t|ˆ ƒr‡ fdd„|D ƒ}t| ||¡ƒ}t|ˆ |ƒ qd S )N©)ÚXAdvanceÚ
XAdvDevice)ÚYAdvanceÚ
YAdvDevice)Ú
XPlacementÚ
XPlaDevice)Ú
YPlacementÚ
YPlaDevicec                    s   g | ]}t |ˆ d ƒ‘qS rã   r[   r\  ©Únamer+   r,   rV   R  rU   r‰   )rT  rW  ra   r   r^  r  )rA   r*   rg   rT  rW  Ú	tableNamerk   rj   r+   rm  r,   r/   D  s    

ÿc                   @   s   e Zd ZdZddd„ZdS )ÚMutatorMergerzËA merger that takes a variable font, and instantiates
    an instance.  While there's no "merging" to be done per se,
    the operation can benefit from many operations that the
    aligning merger does.Tc                 C   s   t  | |¡ || _|| _d S r'   )r&   r-   Ú	instancerÚdeleteVariations)r*   r(   rq  rr  r+   r+   r,   r-   d  s    zMutatorMerger.__init__N)TrX  r+   r+   r+   r,   rp  ^  s   rp  c                 C   s€   |d j  ¡ |_ |jdkrd S | j}|j}| jr4|`|rp|jdksFJ ‚|jd> |j }t	|| ƒ}| j
|7  _
| jr|d|_d S )Nr   é   é €  é   r   )r<   r´   r•   rq  ÚDeviceTablerr  ÚDeltaFormatÚ	StartSizeÚEndSizer   r[  )rA   r*   rg   rq  ÚdevÚvaridxÚdeltar+   r+   r,   r/   j  s    
c           
      C   s¾   |d j  ¡ |_ |jdkrd S | j}dD ]„}|d }t||ƒs@q(t||ƒ}| jrZt||ƒ |d u rdq(|jdksrJ ‚|j	d> |j
 }t|| ƒ}|d }	t||	t||	ƒ| ƒ q(| jrºd|_d S )	Nr   rs  ZXYrv  rt  ru  r[  r   )r<   r´   r•   rq  ra   rC   rr  Údelattrrw  rx  ry  r   r  )
rA   r*   rg   rq  rR   ro  rz  r{  r|  r6   r+   r+   r,   r/   €  s(    



c           	      C   sš   |d j  ¡ |_ | j}dD ]z\}}t||ƒs.qt||ƒ}| jrHt||ƒ |d u rRq|jdks`J ‚|jd> |j	 }t
|| ƒ}t||t||dƒ| ƒ qd S )Nr   rd  rt  ru  )r<   r´   rq  ra   rC   rr  r}  rw  rx  ry  r   r  )	rA   r*   rg   rq  rn  ro  rz  r{  r|  r+   r+   r,   r/   ž  s    


c                       s0   e Zd ZdZdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚVariationMergerzJA merger that takes multiple master fonts, and builds a
    variable font.c                 C   s&   t  | |¡ t |¡| _|  |¡ d S r'   )r&   r-   r   ÚOnlineVarStoreBuilderÚstore_builderÚsetModel)r*   rT  ÚaxisTagsr(   r+   r+   r,   r-   Â  s    zVariationMerger.__init__c                 C   s   || _ | j |¡ d S r'   )rT  r€  r�  )r*   rT  r+   r+   r,   r�  Ç  s    zVariationMerger.setModelc                    s    d }d }d |v rrt |ƒr0|d ur,t| |d�‚d S | j}| jrTtdd„ |D ƒ| jƒ| _| j}| |¡\}}|  |¡ tt| ƒ 	||¡ |r’|  |¡ |rœ|| _d S )N)rY   c                 S   s   g | ]}|d u‘qS r'   r+   rP   r+   r+   r,   rV   Ø  rU   z/VariationMerger.mergeThings.<locals>.<listcomp>)
r   r   r)   r   rT  ÚgetSubModelr�  Úsuperr~  rd   )r*   rf   rg   ÚmasterModelZorigTTFsrT  r?  r+   r,   rd   Ë  s$    

zVariationMerger.mergeThings)r0   r�   r‚   rY  r-   r�  rd   Ú__classcell__r+   r+   r?  r,   r~  ¾  s   r~  c                 C   s0   t |ƒr|d d fS |  |¡\}}|t |¡fS r²   )r   ÚstoreMastersr   ÚbuildVarDevTable)r€  Úmaster_valuesÚbaseÚvarIdxr+   r+   r,   rˆ  æ  s    rˆ  c                 C   sF   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}|rBd|_ ||_d S )Nr   za baseline coordinater·   c                 S   s   g | ]
}|j ‘qS r+   rZ  r\  r+   r+   r,   rV   ò  rU   r‰   rs  ©r•   r$   rˆ  r€  r[  rv  ©rA   r*   rg   rv  r+   r+   r,   r/   í  s    
ÿ
c                 C   sF   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}|rBd|_ ||_d S )Nr   za caretr·   c                 S   s   g | ]
}|j ‘qS r+   rZ  r\  r+   r+   r,   rV   þ  rU   r‰   rs  rŒ  r�  r+   r+   r,   r/   ù  s    
ÿ
c                 C   sl   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}t| jdd„ |D ƒƒ\|_}|sV|rhd|_ ||_||_d S )Nr   z	an anchorr·   c                 S   s   g | ]
}|j ‘qS r+   r`  r\  r+   r+   r,   rV   
  rU   r‰   c                 S   s   g | ]
}|j ‘qS r+   rb  r\  r+   r+   r,   rV     rU   rs  )r•   r$   rˆ  r€  ra  rc  ÚXDeviceTableÚYDeviceTable)rA   r*   rg   rŽ  r�  r+   r+   r,   r/     s    
ÿ
ÿ
c                    sV   dD ]L\‰ }t |ˆ ƒrt| j‡ fdd„|D ƒƒ\}}t|ˆ |ƒ |rt|||ƒ qd S )Nrd  c                    s   g | ]}t |ˆ d ƒ‘qS rã   r[   r\  rm  r+   r,   rV     rU   r‰   )ra   rˆ  r€  r  )rA   r*   rg   ro  rj   ZdeviceTabler+   rm  r,   r/     s    
ÿc                   @   s€   e Zd ZdZddd„Zddd„Zdd	„ fd
d„Zdd„ Zdd„ Zdd„ Z	e
dœdd„Ze
dœdd„Zedd„ ƒZedd„ ƒZdS )ÚCOLRVariationMergera½  A specialized VariationMerger that takes multiple master fonts containing
    COLRv1 tables, and builds a variable COLR font.

    COLR tables are special in that variable subtables can be associated with
    multiple delta-set indices (via VarIndexBase).
    They also contain tables that must change their type (not simply the Format)
    as they become variable (e.g. Affine2x3 -> VarAffine2x3) so this merger takes
    care of that too.
    Tc                 C   sF   t  | |||¡ i | _g | _tƒ | _g | _d | _|r<tƒ | _d| _	d S )NF)
r~  r-   ÚvarIndexCacheÚvarIdxesr�   ÚvarTableIdsÚlayersÚlayerReuseCacher   Ú_doneBaseGlyphs)r*   rT  r‚  r(   ÚallowLayerReuser+   r+   r,   r-   1  s    zCOLRVariationMerger.__init__©ÚCOLRc                 C   s4   d|v r d|v r |   |d j¡ t | |||¡ d S )Nr™  )ÚexpandPaintColrLayersr]   r~  r€   )r*   r(   r~   r   r+   r+   r,   r€   C  s    	zCOLRVariationMerger.mergeTablesc                 C   s   dS )NTr+   )r“   r+   r+   r,   Ú<lambda>P  rU   zCOLRVariationMerger.<lambda>c           
   	   C   s¼   |j }|j}d}z||ƒ}W n ty.   Y n
0 ||ƒ}|sPt| t|ƒj|d�‚|}g }|D ]:}	t|	dd ƒ}z||ƒ}W n tyŠ   Y n0 | |¡ q\t||ƒs¸t	| t|ƒj||d�‚|S )NF)r¸   rj   r•   r&  )
r•   Ú
formatEnumÚ
ValueErrorr$   r=   r0   rC   r1   r   r#   )
r*   rf   rg   ÚvalidateÚfmtrœ  ÚokrX   rY   rR   r+   r+   r,   ÚcheckFormatEnumP  s6    
üz#COLRVariationMerger.checkFormatEnumc                    sp   |  ¡ D ]b‰ z"|  |ˆ  ‡ fdd„|D ƒ¡ W q tyh } z"|j dˆ ›d�¡ ‚ W Y d }~qd }~0 0 qd S )Nc                    s   g | ]}|  ˆ ¡‘qS r+   rz   rP   rŠ   r+   r,   rV   q  rU   z7COLRVariationMerger.mergeSparseDict.<locals>.<listcomp>ú[ú])rO   rd   r%   re   r1   )r*   rf   rg   rm   r+   rŠ   r,   ÚmergeSparseDictn  s    "z#COLRVariationMerger.mergeSparseDictc                    st   |D ]j‰ t |ˆ ƒ}‡ fdd„|D ƒ}z|  ||¡ W q tyl } z |j dˆ › �¡ ‚ W Y d }~qd }~0 0 qd S )Nc                    s   g | ]}t |ˆ ƒ‘qS r+   r[   ©rQ   ri   ©r6   r+   r,   rV   y  rU   z2COLRVariationMerger.mergeAttrs.<locals>.<listcomp>r`   )rC   rd   r%   re   r1   )r*   rf   rg   r8   rj   rk   rm   r+   r¦  r,   Ú
mergeAttrsv  s    
zCOLRVariationMerger.mergeAttrsc                    s|   ‡ fdd„|D ƒ}d}|  ˆ ¡‰tˆtƒr@d}‡fdd„|D ƒ}|d }tj}t|ƒsf| j |¡\}}|rtˆ |¡}||fS )Nc                    s   g | ]}t |ˆ ƒ‘qS r+   r[   r¥  r¦  r+   r,   rV   �  rU   z;COLRVariationMerger.storeMastersForAttr.<locals>.<listcomp>FTc                    s   g | ]}ˆ   |¡‘qS r+   )ÚtoIntrP   )Úconvr+   r,   rV   Š  rU   r   )	ÚgetConverterByNamerw   r
   r–   ÚNO_VARIATION_INDEXr   r€  r‡  ÚfromInt)r*   rf   rg   r6   r‰  Zis_fixed_size_floatÚ	baseValuer‹  r+   )r6   r©  r,   ÚstoreMastersForAttr€  s    


z'COLRVariationMerger.storeMastersForAttr)Úreturnc                 C   s  t |ƒ}| j |¡}|d u rhtt| jƒt|ƒ d ƒD ]0}| j||t|ƒ … |kr6| | j|< } qhq6|d u rÖtt|ƒd ddƒD ]P}| j| d … |d |… kr„t| jƒ| }|| j|< | j ||d … ¡  qÖq„|d u rþt| jƒ | j|< }| j |¡ |S )Nr   r   r  )Útupler‘  rD   rï   rp   r’  r  )r*   r’  r_   ÚvarIndexBaseru   Únr+   r+   r,   ÚstoreVariationIndices–  s$    
z)COLRVariationMerger.storeVariationIndicesc           	      C   s\   t j}g }|D ],}|  |||¡\}}t|||ƒ | |¡ qtdd„ |D ƒƒrX|  |¡}|S )Nc                 s   s   | ]}|t jkV  qd S r'   )r–   r«  rP   r+   r+   r,   rT   »  rU   z9COLRVariationMerger.mergeVariableAttrs.<locals>.<genexpr>)r–   r«  r®  r  r1   Úanyr³  )	r*   rf   rg   r8   r±  r’  r6   r­  r‹  r+   r+   r,   ÚmergeVariableAttrs³  s    
z&COLRVariationMerger.mergeVariableAttrsc                 C   s†   t |ddd„ d�D ]n}|d }|j}t|ƒj}|ƒ }|j |j¡ | ¡  |d j}|jd urr|t||j	ƒ|j< qt
||j	|ƒ qd S )NTc                 S   s   t t| d jƒdd ƒd uS )Nr  ÚVarType)rC   r=   rj   )Úpathr+   r+   r,   r›  Å  s    z?COLRVariationMerger.convertSubTablesToVarType.<locals>.<lambda>)Ú	skip_rootÚ	predicater  éþÿÿÿ)r   rj   r=   r¶  r<   rŽ   ÚpopulateDefaultsr¹   rC   rn  r  )Úclsr]   r·  rA  ÚsubTableÚvarTypeÚnewSubTableÚparentr+   r+   r,   ÚconvertSubTablesToVarTypeÀ  s    ý



z-COLRVariationMerger.convertSubTablesToVarTypec           	      C   s  | j s
dS tƒ }g }| jjD ]Â}|jg}|r| ¡ }|jtjj	krFq(nˆ|jtjj
krÄtt|| ƒƒ}t|ƒ}|D ]B}t|ƒ|v r˜t |¡}t|ƒ|vs˜J ‚| |¡ | t|ƒ¡ qn||_t|ƒ|_n
| | ¡}| t|ƒ¡ q(qt|ƒt|ƒksôJ ‚|| j _t|ƒ| j _dS )aû  Rebuild LayerList without PaintColrLayers reuse.

        Each base paint graph is fully DFS-traversed (with exception of PaintColrGlyph
        which are irrelevant for this); any layers referenced via PaintColrLayers are
        collected into a new LayerList and duplicated when reuse is detected, to ensure
        that all paints are distinct objects at the end of the process.
        PaintColrLayers's FirstLayerIndex/NumLayers are updated so that no overlap
        is left. Also, any consecutively nested PaintColrLayers are flattened.
        The COLR table's LayerList is replaced with the new unique layers.
        A side effect is also that any layer from the old LayerList which is not
        referenced by any PaintColrLayers is dropped.
        N)Ú	LayerListr�   ÚBaseGlyphListÚBaseGlyphPaintRecordÚPaintrM  r•   r–   ÚPaintFormatÚPaintColrGlyphÚPaintColrLayersry   Ú_flatten_layersrp   Úidr´   r   r1   rñ   ÚFirstLayerIndexÚ	NumLayersÚgetChildrenr  ÚreversedÚ
LayerCount)	ÚcolrZuniqueLayerIDsZnewLayerListrÈ   ÚfrontierÚpaintÚchildrenZfirst_layer_indexÚlayerr+   r+   r,   rš  Õ  s4    


z)COLRVariationMerger.expandPaintColrLayersN)T)r˜  )r0   r�   r‚   rY  r-   r€   r¡  r¤  r§  r®  rÒ   r³  rµ  rƒ   rÁ  Ústaticmethodrš  r+   r+   r+   r,   r�  &  s   




r�  c                    s¬   dd„ |j D ƒ}dd„ |D ƒ}t| ¡ ƒD ]v\}‰ z"|  |ˆ  ‡ fdd„|D ƒ¡ W q* tyž } z2|j d|› d�¡ dˆ ›�|jd	< ‚ W Y d }~q*d }~0 0 q*d
| _d S )Nc                 S   s   i | ]}|j |“qS r+   ©Ú	BaseGlyph©rQ   rÈ   r+   r+   r,   rŸ     rU   rI  c                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   i | ]}|j |“qS r+   rÖ  rØ  r+   r+   r,   rŸ   	  rU   z$merge.<locals>.<listcomp>.<dictcomp>)rÄ  r{   r+   r+   r,   rV   	  rU   r‰   c                    s   g | ]}|  ˆ ¡‘qS r+   rz   rP   ©rž   r+   r,   rV     rU   z.BaseGlyphPaintRecord[r£  zbase glyph rU  T)	rÄ  rs   rO   rd   r%   re   r1   Úcauser–  )rA   r*   rg   rf   Úmastersru   rm   r+   rÙ  r,   r/     s    "c                 C   s&   | j sJ dƒ‚t| jƒ|_| j|_d S )Nz-BaseGlyphList must be merged before LayerList)r–  rp   r”  rÏ  rÅ  rµ   r+   r+   r,   r/     s    c                 c   sL   | j tjjksJ ‚|  |¡D ]*}|j tjjkr@t||ƒE d H  q|V  qd S r'   )r•   r–   rÆ  rÈ  rÍ  rÉ  )ÚrootrÐ  rÒ  r+   r+   r,   rÉ  !  s
    rÉ  c              
      s^  t t|ˆjd jƒƒ}tˆjƒtˆƒks,J ‚‡‡fdd„ttˆƒƒD ƒ}zˆ ||¡ W n2 tyŠ } z|j	 
d¡ ‚ W Y d }~n
d }~0 0 ˆjd ur¢ˆj |¡}t|ƒtk}t|td�}‡ ‡fdd„‰ ‡ fdd„|D ƒ}t|ƒd	k�r|d
 jtjjk�r|d
 j|_|d
 j|_nDt|ƒ|_tˆjƒ|_ˆj |¡ ˆjd u�rZ|�sZˆj ||j¡ d S )Nr™  c                    s*   g | ]"}t tˆ | ˆj| d  jƒƒ‘qS r˜  )ry   rÉ  r)   r]   )rQ   ru   )rg   r*   r+   r,   rV   3  s   ÿz*_merge_PaintColrLayers.<locals>.<listcomp>z.Layers)r²  c                    sr   t | tƒrn‡ fdd„| D ƒ}t ¡ } ttjjƒ| _t|ƒ| _	tˆj
ƒ| _ˆj
 |¡ ˆjd urnˆj || j¡ | S )Nc                    s   g | ]}ˆ |ƒ‘qS r+   r+   r‡   ©ÚlistToColrLayersr+   r,   rV   O  rU   zD_merge_PaintColrLayers.<locals>.listToColrLayers.<locals>.<listcomp>)rw   ry   r–   rÅ  rÒ   rÆ  rÈ  r•   rp   rÌ  r”  rË  r  r•  rñ   )rÒ  r”  )rÞ  r*   r+   r,   rÞ  M  s    


z0_merge_PaintColrLayers.<locals>.listToColrLayersc                    s   g | ]}ˆ |ƒ‘qS r+   r+   r‡   rÝ  r+   r,   rV   Y  rU   r   r   )ry   rÉ  r(   r]   rp   r)   rï   rv   r%   re   r1   r•  Z	try_reuser   r   r•   r–   rÆ  rÈ  rÌ  rË  r”  r  rñ   )r*   rf   rg   Z
out_layersZmaster_layersesrm   Zis_treer+   )rÞ  rg   r*   r,   Ú_merge_PaintColrLayers*  s0    
þ
"
rß  c           	         sì   ˆ   ||dd„ ¡}|tjju r.tˆ ||ƒ d S | ¡ }d‰|d urRt t|ƒ|¡‰‡fdd„| 	¡ D ƒ}ˆ  
|||¡ ˆ  ||ˆ¡}dd„ | ¡ D ƒ}|tjkp´t‡ fdd„|D ƒƒ}|rèˆrÄ||_|rÒˆ  |¡ |d usÞJ ‚t|ƒ|_d S )	Nc                 S   s
   |   ¡  S r'   )Úis_variable)rŸ  r+   r+   r,   r›  p  rU   zmerge.<locals>.<lambda>r+   c                 3   s   | ]}|j ˆ vr|j V  qd S r'   rm  r+  ©ÚvarAttrsr+   r,   rT   {  rU   rŒ   c                 S   s   g | ]
}|j ‘qS r+   )rj   r@  r+   r+   r,   rV   �  rU   r‰   c                 3   s   | ]}t |ƒˆ jv V  qd S r'   ©rÊ  r“  r\   rD  r+   r,   rT   „  s   )r¡  r–   rÆ  rÈ  rß  Úas_variabler	   ÚgetVariableAttrsr=   ÚgetConvertersr§  rµ  ÚiterSubTablesr«  r´  ÚVarIndexBaserÁ  rÒ   r•   )	rA   r*   rg   rŸ  Z	varFormatÚstaticAttrsr±  Z	subTablesZ
isVariabler+   )rA   râ  r,   r/   n  s,    ÿ
c                    sj   t |ƒj}t |¡‰ ‡ fdd„| ¡ D ƒ}|  |||¡ |  ||ˆ ¡}|tjkrf||_	| j
 t|ƒ¡ d S )Nc                 3   s   | ]}|j ˆ vr|j V  qd S r'   rm  r+  rá  r+   r,   rT   œ  rU   rŒ   )r=   r¶  r	   rå  ræ  r§  rµ  r–   r«  rè  r“  rñ   rÊ  )rA   r*   rg   r¾  ré  r±  r+   rá  r,   r/   —  s    


c                    sR   ˆ   ||dd„ | ¡ D ƒ¡ t‡ fdd„|jD ƒƒrNˆ  |¡ ˆ j t|ƒ¡ d S )Nc                 s   s   | ]}|j V  qd S r'   rm  r+  r+   r+   r,   rT   ª  rU   rŒ   c                 3   s   | ]}t |ƒˆ jv V  qd S r'   rã  )rQ   ÚstoprD  r+   r,   rT   ¬  rU   )r§  ræ  r´  Ú	ColorStoprÁ  r“  rñ   rÊ  rµ   r+   rD  r,   r/   ¨  s    
Úclipsc                 C   s   |   ||¡ d S r'   )r¤  rµ   r+   r+   r,   r/   ±  s    )NN)N)N)F)r  r  )krY  Úosr´   r>   Úoperatorr   ÚloggingÚfontTools.colorLib.builderr   r   ÚfontTools.miscr   ÚfontTools.misc.roundToolsr   ZfontTools.misc.treeToolsr   ÚfontTools.ttLib.tablesr   r–   r	   Z#fontTools.ttLib.tables.otConvertersr
   Ú!fontTools.ttLib.tables.otTraverser   Z#fontTools.ttLib.tables.DefaultTabler   ÚfontTools.varLibr   r   r   ÚfontTools.varLib.modelsr   r   r   r   r   ÚfontTools.varLib.varStorer   Ú	functoolsr   ZfontTools.otlLib.builderr   ZfontTools.otlLib.optimize.gposr   r   Ú	getLoggerrO  Úerrorsr   r   r   r   r   r    r!   r"   r#   r$   r%   Úobjectr&   r„   rA   ÚGDEFr/   r�   r±   rÎ   r  r»   rÉ   r—   r¾   rì   rö   rû   r  r	  r½   r%  ÚMarkBasePosÚMarkMarkPosr(  r*  r1  r2  r6  Ú
CursivePosr7  ÚLookuprS  Ú
CaretValuerp  r~  rˆ  Ú	BaseCoordr�  rÃ  rÂ  rÉ  rß  rÅ  ÚClipBoxÚ	Affine2x3rë  Ú	ColorLineÚClipListr+   r+   r+   r,   Ú<module>   sÊ   
4x

%





=

5!


N)

+
V









i












(







 `



		D
(


